From 4425e54468d8db77ff8fb2d364f5513abda86f15 Mon Sep 17 00:00:00 2001 From: "Brayan.Gonzalez" Date: Tue, 28 Jan 2025 13:09:32 -0700 Subject: [PATCH] first commit --- .gitignore | 6 + apc-controller-mobile/nb-configuration.xml | 18 + apc-controller-mobile/pom.xml | 80 + .../admin/ClosingDayController.java | 91 + .../admin/StableGeneralBoxController.java | 46 + .../admin/StableSmallBoxController.java | 95 + .../bitacora/BitacoraController.java | 59 + .../CashRegisterCurdateByUserController.java | 107 + .../customer/CustomerController.java | 63 + .../ExchangeEnebledUsersController.java | 165 + .../gasoline/GasolineController.java | 41 + .../controller/loan/LoanController.java | 1398 +++ .../controller/login/LoginWSController.java | 80 + .../otherexpense/OtherExpenseController.java | 58 + .../controller/person/PersonController.java | 54 + .../SystemPreferenceController.java | 243 + .../controller/reports/ReportsController.java | 54 + .../controller/route/RouteController.java | 44 + .../search/PersonSearchController.java | 175 + .../tracking/PaymentTrackingController.java | 69 + .../controller/user/UserController.java | 95 + .../json/loan/AuthorizeTransferList.java | 96 + .../loan/AuthorizeTransferPaymentsDto.java | 117 + .../json/loan/DeleteLoanDetailsJaxb.java | 117 + .../json/loan/GenericAPCResponserJaxb.java | 97 + .../mobile/json/loan/LoanTypeJaxb.java | 73 + .../mobile/json/loan/LoanTypeListJaxb.java | 48 + .../json/loan/TransferListToUpdateStatus.java | 71 + .../loan/UpdateLoanToDeliveryStatusDTO.java | 102 + .../loan/UpdateLoanToDeliveryStatusList.java | 67 + .../apc/controller/mobile/moxy/PersonMxy.java | 122 + .../controller/mobile/moxy/login/UserMxy.java | 121 + .../mobile/moxy/login/UserPreferenceMxy.java | 53 + .../mobile/moxy/views/ContainerRoutes.java | 43 + .../LoanByUserOrderPreferenceViewJaxb.java | 116 + ...LoanByUserOrderPreferenceViewListJaxb.java | 39 + .../moxy/views/PaymentTrackingViewJaxb.java | 60 + .../mobile/moxy/views/RouteJaxb.java | 49 + .../repository/ArrebolTestRepository.java | 39 + .../mobile/repository/GenericRepository.java | 671 ++ .../admin/ClosingDayRepository.java | 78 + .../admin/OtherExpenseRepository.java | 41 + .../admin/StableGeneralBoxRepository.java | 40 + .../admin/StableSmallBoxRepository.java | 78 + .../repository/admin/TransferRepository.java | 94 + .../bitacora/BitacoraRepository.java | 40 + .../gasoline/GasolineRepository.java | 48 + .../jaas/AuthenticationRepository.java | 89 + .../repository/loan/AddAmountRepository.java | 93 + .../loan/LoanByRenovationRepository.java | 219 + .../repository/loan/LoanByUserRepository.java | 40 + .../loan/LoanDetailsRepository.java | 199 + .../loan/LoanFeeNotificationRepository.java | 62 + .../repository/loan/LoanRepository.java | 630 ++ .../LoanToDeliveryByCertifierRepository.java | 45 + .../repository/loan/LoanTypeRepository.java | 114 + .../repository/people/PeopleRepository.java | 99 + .../UserMobilePreferenceRepository.java | 98 + .../repository/reports/ReportsRepository.java | 47 + .../repository/route/RouteRepository.java | 55 + .../tracking/PaymentTrackingRepository.java | 49 + .../repository/user/UserRepository.java | 114 + ...shRegisterCurdateByUserViewRepository.java | 44 + .../ExchangeEnebledUsersViewRepository.java | 43 + .../LoanApprovedDetailViewRepository.java | 124 + ...anByUserOrderPreferenceViewRepository.java | 62 + .../views/LoanByUserViewRepository.java | 54 + ...PendingStatusToDeliveryViewRepository.java | 42 + ...SearchHistoricalDetailsViewRepository.java | 48 + .../views/PersonSearchViewRepository.java | 121 + .../SearchPersonAvailableRepository.java | 63 + .../TotalCashByCurdateViewRepository.java | 40 + ...TransferInPendingStatusViewRepository.java | 42 + .../controller/mobile/util/HibernateUtil.java | 69 + ...shRegisterCurdateByUserControllerTest.java | 46 + .../customer/CustomerControllerTest.java | 49 + .../ExchangeEnebledUsersControllerTest.java | 62 + .../controller/loan/LoanControllerTest.java | 205 + .../login/LoginWSControllerTest.java | 46 + .../SystemPreferenceControllerTest.java | 58 + .../search/PersonSearchControllerTest.java | 74 + .../controller/user/UserControllerTest.java | 66 + .../repository/ArrebolTestRepositoryTest.java | 39 + .../loan/LoanTypeRepositoryTest.java | 75 + .../people/PeopleRepositoryTest.java | 68 + .../src/test/resources/apc.cfg.xml | 224 + .../src/test/resources/log4j2.xml | 20 + apc-controller/nb-configuration.xml | 18 + apc-controller/pom.xml | 91 + .../apc/controller/BitacoraController.java | 75 + .../apc/controller/GenericController.java | 191 + .../GenericValidationController.java | 202 + ...inistrationPersonSearchViewController.java | 148 + .../controller/admin/AdvanceController.java | 91 + .../admin/AjustarInventariosController.java | 93 + .../apc/controller/admin/BonusController.java | 102 + .../admin/ChangeOwnerController.java | 140 + .../admin/ClosingDayController.java | 439 + .../controller/admin/CustomerController.java | 141 + .../admin/EndorsementController.java | 67 + .../admin/ExpenseCompanyController.java | 147 + .../apc/controller/admin/FeesController.java | 113 + .../apc/controller/admin/GoalController.java | 100 + .../apc/controller/admin/LoanController.java | 563 ++ .../admin/LoanEmployeeController.java | 180 + ...oanRenovationDeliveryWeeklyController.java | 61 + .../admin/MoneyDailyController.java | 124 + .../admin/OtherExpenseController.java | 99 + .../controller/admin/PayRollController.java | 343 + .../controller/admin/PeopleController.java | 133 + .../admin/StableGeneralBoxController.java | 364 + .../admin/StableSmallBoxController.java | 250 + .../admin/StatsAdvancesController.java | 100 + .../admin/StatsClosingDayController.java | 102 + .../admin/StatsDepositsController.java | 105 + .../admin/StatsEmployeeSavingController.java | 155 + .../admin/StatsGasolineController.java | 81 + .../admin/StatsOpeningFeesController.java | 107 + .../admin/StatsPaymentController.java | 117 + .../StatsPaymentRenovationController.java | 86 + .../admin/StatsPaymentRouteController.java | 120 + .../admin/StatsPayrollController.java | 99 + .../admin/StatsSummaryController.java | 233 + .../admin/StatsVehicleController.java | 53 + .../admin/StatsZeroPaymentsController.java | 113 + .../controller/admin/TransferController.java | 110 + .../controller/admin/VehicleController.java | 170 + .../catalog/LoanTypeController.java | 85 + .../controller/catalog/RoleController.java | 93 + .../controller/catalog/RouteController.java | 96 + .../CustomerWithoutRenovationViewService.java | 41 + ...tomerWithoutRenovationViewServiceImpl.java | 154 + .../dashboard/DashboardController.java | 150 + .../controller/drive/DriverController.java | 1434 +++ .../drive/FaltanteInDatesController.java | 222 + .../apc/controller/login/LoginController.java | 56 + .../apc/controller/login/LoginService.java | 32 + .../controller/login/LoginServiceImpl.java | 47 + .../system/employee/EmployeeController.java | 177 + .../system/office/OfficeController.java | 91 + .../system/user/UserAccessController.java | 185 + .../system/user/UserAdminController.java | 111 + .../system/user/UserCreateController.java | 419 + .../system/user/UserUpdateController.java | 294 + .../controller/topbar/PrivacyController.java | 56 + .../controller/topbar/TopBarController.java | 51 + .../controller/util/ConnectionManager.java | 40 + .../apc/controller/util/DateWrapper.java | 199 + .../apc/controller/util/FilterMap.java | 79 + .../apc/controller/util/HibernateUtil.java | 69 + .../util/logger/LogConnectionFactory.java | 34 + .../apc/repository/AbstractRepository.java | 763 ++ .../repository/AutoCompleteDAORepository.java | 56 + .../repository/GenericEntityRepository.java | 111 + .../LazyDataModelDAORepository.java | 94 + .../core/HumanResourceRepository.java | 97 + .../apc/repository/core/OfficeRepository.java | 110 + .../repository/core/PermissionRepository.java | 93 + .../core/UserByOfficeRepository.java | 373 + .../apc/repository/core/UserRepository.java | 186 + .../apc/service/AutoCompleteService.java | 25 + .../arrebol/apc/service/BitacoraService.java | 24 + .../apc/service/BitacoraServiceImpl.java | 30 + .../apc/service/GenericValidationService.java | 32 + .../service/GenericValidationServiceImpl.java | 93 + .../LazyDataModelBetweenDatesService.java | 46 + .../apc/service/LazyDataModelService.java | 38 + .../apc/service/admin/CustomerService.java | 58 + .../service/admin/CustomerServiceImpl.java | 137 + .../apc/service/admin/PeopleService.java | 31 + .../apc/service/admin/PeopleServiceImpl.java | 36 + .../apc/service/admin/TransferService.java | 36 + .../service/admin/TransferServiceImpl.java | 131 + .../apc/service/catalog/LoanService.java | 47 + .../apc/service/catalog/LoanServiceImpl.java | 51 + .../apc/service/catalog/LoanTypeService.java | 32 + .../service/catalog/LoanTypeServiceImpl.java | 47 + .../catalog/PeopleAutoCompleteService.java | 23 + .../PeopleAutoCompleteServiceImpl.java | 83 + .../apc/service/catalog/RouteService.java | 25 + .../apc/service/catalog/RouteServiceImpl.java | 42 + .../arrebol/apc/service/core/UserService.java | 25 + .../apc/service/core/UserServiceImpl.java | 39 + .../views/EnabledUserDetailsViewService.java | 25 + .../EnabledUserDetailsViewServiceImpl.java | 43 + ...trationPersonSearchViewControllerTest.java | 47 + .../admin/ClosingDayControllerTest.java | 46 + .../admin/StableGeneralBoxControllerTest.java | 40 + .../admin/StableSmallBoxControllerTest.java | 45 + .../controller/login/LoginControllerTest.java | 62 + .../employee/EmployeeControllerTest.java | 122 + .../system/user/UserAccessControllerTest.java | 66 + .../system/user/UserCreateControllerTest.java | 99 + .../system/user/UserUpdateControllerTest.java | 64 + .../topbar/TopBarControllerTest.java | 46 + apc-controller/src/test/resources/apc.cfg.xml | 224 + apc-controller/src/test/resources/log4j2.xml | 51 + apc-db/build.xml | 73 + apc-db/manifest.mf | 3 + apc-db/nbproject/build-impl.xml | 1771 ++++ apc-db/nbproject/genfiles.properties | 8 + apc-db/nbproject/project.properties | 86 + apc-db/nbproject/project.xml | 15 + apc-db/src/XXXXXXXX.sql | 303 + apc-db/src/apc-config-db-aws.sql | 133 + apc-db/src/apc-config-db-localhost.sql | 133 + apc-db/src/apc-db-populate-empty.sql | 27 + apc-db/src/apc-db-populate.sql | 515 ++ apc-db/src/apc-db.sql | 3430 ++++++++ apc-db/src/apc-drop-tables-prod.sql | 46 + apc-db/src/cambio_de_anio.sql | 794 ++ apc-db/src/cocina-lore-db.sql | 412 + .../create/from/scratch/apc-config-db-aws.sql | 134 + .../from/scratch/apc-config-db-localhost.sql | 136 + .../from/scratch/apc-db-init-populate.sql | 293 + .../src/create/from/scratch/apc-db-tables.sql | 1016 +++ .../src/create/from/scratch/apc-db-views.sql | 3847 +++++++++ .../scratch/mora/f1_isMobileEnabledUser.sql | 45 + apc-db/src/janitzio.sql | 2 + apc-db/src/notes.txt | 175 + apc-db/src/oscar.sql | 493 ++ apc-db/src/respaldo_xxxxxxxx.sql | 3 + apc-db/src/to_execute.sql | 11 + apc-db/src/to_update.sql | 44 + apc-layout/nb-configuration.xml | 18 + apc-layout/pom.xml | 124 + .../serenity/component/SerenityMenu.java | 130 + .../component/SerenityMenuRenderer.java | 295 + .../filter/CharacterEncodingFilter.java | 44 + .../serenity/view/GuestPreferences.java | 77 + apc-model/nb-configuration.xml | 18 + apc-model/pom.xml | 160 + .../arrebol/apc/model/DateFormatModel.java | 24 + .../com/arrebol/apc/model/ModelParameter.java | 43 + .../com/arrebol/apc/model/admin/Advance.java | 201 + .../com/arrebol/apc/model/admin/Bonus.java | 209 + .../arrebol/apc/model/admin/ClosingDay.java | 250 + .../apc/model/admin/ClosingDayDetail.java | 154 + .../apc/model/admin/EmployeeSaving.java | 102 + .../apc/model/admin/ExpenseCompany.java | 242 + .../com/arrebol/apc/model/admin/Goal.java | 170 + .../arrebol/apc/model/admin/LoanEmployee.java | 159 + .../apc/model/admin/LoanEmployeeDetails.java | 137 + .../arrebol/apc/model/admin/MoneyDaily.java | 164 + .../arrebol/apc/model/admin/OtherExpense.java | 256 + .../apc/model/admin/StableGeneralBox.java | 241 + .../apc/model/admin/StableSmallBox.java | 262 + .../com/arrebol/apc/model/admin/Transfer.java | 297 + .../apc/model/admin/constance/AdvanceCfg.java | 24 + .../model/admin/constance/BitacoraCfg.java | 22 + .../apc/model/admin/constance/BonusCfg.java | 25 + .../model/admin/constance/ClosingDayCfg.java | 35 + .../admin/constance/ClosingDayDetailCfg.java | 22 + .../admin/constance/ExpenseCompanyCfg.java | 26 + .../apc/model/admin/constance/GoalCfg.java | 24 + .../model/admin/constance/MoneyDailyCfg.java | 25 + .../admin/constance/OtherExpenseCfg.java | 25 + .../admin/constance/StableGeneralBoxCfg.java | 34 + .../admin/constance/StableSmallBoxCfg.java | 32 + .../model/admin/constance/TransferCfg.java | 31 + .../model/catalog/HumanResourceHasRoute.java | 172 + .../catalog/HumanResourceHasRouteId.java | 88 + .../model/catalog/MovimientosInventario.java | 188 + .../com/arrebol/apc/model/catalog/People.java | 1212 +++ .../arrebol/apc/model/catalog/RoleCtlg.java | 180 + .../arrebol/apc/model/catalog/RouteCtlg.java | 262 + .../arrebol/apc/model/catalog/Vehicle.java | 323 + .../model/catalog/constance/PeopleCfg.java | 33 + .../apc/model/catalog/constance/RoleCfg.java | 24 + .../apc/model/catalog/constance/RouteCfg.java | 29 + .../arrebol/apc/model/core/HumanResource.java | 428 + .../apc/model/core/HumanResourceByOffice.java | 179 + .../com/arrebol/apc/model/core/Office.java | 421 + .../arrebol/apc/model/core/Permission.java | 257 + .../java/com/arrebol/apc/model/core/User.java | 435 + .../arrebol/apc/model/core/UserByOffice.java | 268 + .../model/core/UserByOfficeHasPermission.java | 177 + .../core/UserByOfficeHasPermissionId.java | 82 + .../constance/AvailableCustomersViewCfg.java | 18 + .../AvailableEndorsementsViewCfg.java | 18 + .../CashRegisterCurdateByUserViewCfg.java | 18 + .../ExchangeEnebledUsersViewCfg.java | 19 + .../apc/model/core/constance/GenericCfg.java | 26 + .../constance/HumanResourceByOfficeCfg.java | 17 + .../core/constance/HumanResourceCfg.java | 37 + .../constance/HumanResourceHasRouteCfg.java | 19 + .../constance/LoanApprovedDetailViewCfg.java | 16 + .../core/constance/LoanByRenovationCfg.java | 23 + .../model/core/constance/LoanByUserCfg.java | 29 + .../LoanByUserOrderPreferenceViewCfg.java | 25 + .../core/constance/LoanByUserViewCfg.java | 45 + .../apc/model/core/constance/LoanCfg.java | 63 + .../model/core/constance/LoanDetailsCfg.java | 34 + .../constance/LoanFeeNotificationCfg.java | 19 + .../LoanToDeliveryByCertifierViewCfg.java | 17 + .../apc/model/core/constance/LoanTypeCfg.java | 26 + .../model/core/constance/MobileUserCfg.java | 20 + .../apc/model/core/constance/OfficeCfg.java | 41 + .../model/core/constance/PermissionCfg.java | 32 + .../constance/PersonSearchDetailViewCfg.java | 17 + .../PersonSearchHistoricalDetailsViewCfg.java | 18 + .../core/constance/PersonSearchViewCfg.java | 20 + .../model/core/constance/UserByOfficeCfg.java | 25 + .../UserByOfficeHasPermissionCfg.java | 20 + .../apc/model/core/constance/UserCfg.java | 40 + .../constance/UserMobilePreferenceCfg.java | 23 + .../arrebol/apc/model/enums/ActionStatus.java | 26 + .../arrebol/apc/model/enums/ActiveStatus.java | 26 + .../apc/model/enums/ApplicationOwner.java | 19 + .../apc/model/enums/ComissionType.java | 37 + .../model/enums/CustomerClassification.java | 26 + .../apc/model/enums/DaysInWeekend.java | 16 + .../apc/model/enums/EmployeeSavingType.java | 16 + .../apc/model/enums/ExpenseCompanyType.java | 37 + .../arrebol/apc/model/enums/FeeStatus.java | 16 + .../arrebol/apc/model/enums/FormaPago.java | 13 + .../apc/model/enums/GenericEnumType.java | 13 + .../apc/model/enums/GenericStatus.java | 16 + .../apc/model/enums/HumanResourceStatus.java | 41 + .../apc/model/enums/LoanDetailsType.java | 31 + .../apc/model/enums/LoanRenovationStatus.java | 16 + .../arrebol/apc/model/enums/LoanStatus.java | 26 + .../arrebol/apc/model/enums/LugarDeCobro.java | 13 + .../arrebol/apc/model/enums/OfficeStatus.java | 42 + .../arrebol/apc/model/enums/OwnerLoan.java | 16 + .../arrebol/apc/model/enums/PeopleType.java | 26 + .../apc/model/enums/PermissionStatus.java | 36 + .../apc/model/enums/PermissionType.java | 41 + .../apc/model/enums/PreferenceName.java | 16 + .../apc/model/enums/PreferenceValue.java | 16 + .../apc/model/enums/TipoMovimiento.java | 13 + .../apc/model/enums/TransferStatus.java | 27 + .../apc/model/enums/UserByOfficeStatus.java | 42 + .../arrebol/apc/model/enums/UserStatus.java | 41 + .../com/arrebol/apc/model/enums/UserType.java | 46 + .../arrebol/apc/model/gasoline/Gasoline.java | 264 + .../model/gasoline/constance/GasolineCfg.java | 23 + .../com/arrebol/apc/model/loan/Delivery.java | 176 + .../java/com/arrebol/apc/model/loan/Loan.java | 524 ++ .../apc/model/loan/LoanByRenovation.java | 168 + .../apc/model/loan/LoanByRenovationId.java | 88 + .../arrebol/apc/model/loan/LoanByUser.java | 179 + .../arrebol/apc/model/loan/LoanByUserId.java | 88 + .../arrebol/apc/model/loan/LoanDetails.java | 345 + .../apc/model/loan/LoanFeeNotification.java | 139 + .../com/arrebol/apc/model/loan/LoanType.java | 357 + .../apc/model/mobile/access/MobileUser.java | 134 + .../preference/UserMobilePreference.java | 186 + .../arrebol/apc/model/payroll/Payroll.java | 371 + .../TotalExpectedPaymentDailyByUser.java | 169 + .../model/payroll/constance/PayRollCfg.java | 40 + .../TotalExpectedPaymentDailyByUserCfg.java | 25 + .../apc/model/reports/UserWeekReport.java | 129 + .../reports/constance/UserWeekReportCfg.java | 19 + .../apc/model/system/logs/Bitacora.java | 155 + .../apc/model/system/logs/ErrorAppLog.java | 122 + .../views/AdministrationPersonSerchView.java | 198 + .../model/views/AdvanceUserDailyDetail.java | 188 + .../apc/model/views/AdvanceUserDailyView.java | 229 + .../model/views/AvailableCustomersView.java | 70 + .../views/AvailableEndorsementsView.java | 70 + .../apc/model/views/AvailablesOwnersView.java | 96 + .../views/CashRegisterCurdateByUserView.java | 89 + ...osingDailyDetailFromUserByCurdateView.java | 134 + .../views/CobranzaLastWeekByUserView.java | 150 + .../model/views/CobranzaWeekByUserView.java | 150 + .../views/ColocationLastWeekByUserView.java | 149 + .../model/views/ColocationWeekByUserView.java | 149 + .../views/CurrentCustomerByLoanView.java | 168 + .../arrebol/apc/model/views/CustomerView.java | 230 + .../views/CustomerWithoutRenovationView.java | 226 + .../model/views/EnabledUserDetailsView.java | 89 + .../model/views/ExchangeEnebledUsersView.java | 70 + .../apc/model/views/FaltanteInDates.java | 170 + .../com/arrebol/apc/model/views/FeesView.java | 137 + .../apc/model/views/GeneralBoxView.java | 97 + .../apc/model/views/HistoryLoanView.java | 183 + .../views/InformationLoanLastWeekView.java | 751 ++ .../model/views/InformationLoanWeekView.java | 1150 +++ .../model/views/LoanApprovedDetailView.java | 82 + .../views/LoanByUserOrderPreferenceView.java | 108 + .../views/LoanByUserPaymentZeroView.java | 90 + .../apc/model/views/LoanByUserView.java | 322 + .../apc/model/views/LoanDetailZeroView.java | 127 + .../LoanDiferencesByUserLastWeekView.java | 63 + .../model/views/LoanEmployeeAllDataView.java | 143 + .../views/LoanEmployeeDetailAllDataView.java | 114 + .../apc/model/views/LoanEmployeeView.java | 217 + .../apc/model/views/LoanFinishedView.java | 168 + .../LoanInPendingStatusToDeliveryView.java | 162 + .../LoanRenovationDeliveryWeeklyView.java | 221 + .../views/LoanToDeliveryByCertifierView.java | 197 + .../views/MoneyDailyByUserCertifier.java | 88 + .../PaymentDetailFromUserByCurdateView.java | 97 + .../model/views/PersonSearchDetailView.java | 81 + .../PersonSearchHistoricalDetailsView.java | 147 + .../apc/model/views/PersonSearchView.java | 64 + .../views/ResumeNewCustomerLastWeekView.java | 73 + .../views/ResumeNewCustomerWeekView.java | 73 + .../views/ResumenInOutLastWeekByUserView.java | 285 + .../views/ResumenInOutWeekByUserView.java | 284 + .../model/views/ResumenTotalLastWeekView.java | 162 + .../apc/model/views/ResumenTotalWeekView.java | 162 + .../apc/model/views/StatsAdvancesView.java | 90 + .../apc/model/views/StatsClosingDayView.java | 101 + .../apc/model/views/StatsDepositsView.java | 145 + .../model/views/StatsEmployeeSavingView.java | 126 + .../apc/model/views/StatsGasolineView.java | 158 + .../apc/model/views/StatsOpeningFeesView.java | 101 + .../views/StatsPaymentRenovationView.java | 112 + .../model/views/StatsPaymentRouteView.java | 123 + .../apc/model/views/StatsPaymentView.java | 123 + .../apc/model/views/StatsPayrollView.java | 90 + .../apc/model/views/StatsSummaryView.java | 168 + .../model/views/StatsZeroPaymentsView.java | 101 + .../views/SubtotalLastWeekByUserView.java | 252 + .../model/views/SubtotalWeekByUserView.java | 227 + .../TotalCashByCurdateDashboardView.java | 173 + .../model/views/TotalCashByCurdateView.java | 172 + .../views/TotalClosingDayByCurdateView.java | 71 + .../views/TotalLoansApprovedByOfficeView.java | 64 + .../model/views/TotalLoansByOfficeView.java | 114 + .../views/TransferInPendingStatusView.java | 175 + .../arrebol/apc/model/views/TransferView.java | 219 + .../apc/model/views/UserByRouteView.java | 81 + .../AdministrationPersonSerchViewCfg.java | 24 + .../AdvanceUserDailyDetailViewCfg.java | 22 + .../constance/AdvanceUserDailyViewCfg.java | 23 + .../constance/AvailablesOwnersViewCfg.java | 22 + ...losingDailyDetailFromUserByCurdateCfg.java | 23 + .../CurrentCustomerByLoanViewCfg.java | 21 + .../CustomerWithoutRenovationViewCfg.java | 21 + .../constance/EnabledUserDetailsViewCfg.java | 20 + .../model/views/constance/FeesViewCfg.java | 24 + .../views/constance/GeneralBoxViewCfg.java | 22 + .../constance/InformationLoanWeekViewCfg.java | 36 + .../LoanByUserPaymentZeroViewCfg.java | 22 + .../constance/LoanEmployeeAllDataCfg.java | 22 + .../LoanEmployeeDetailAllDataViewCfg.java | 29 + .../views/constance/LoanEmployeeViewCfg.java | 22 + .../LoanInPendingStatusToDeliveryViewCfg.java | 17 + .../LoanRenovationDeliveryWeeklyViewCfg.java | 21 + .../MoneyDailyByUserCertifierViewCfg.java | 22 + .../ResumenNewCustomerLastWeekViewCfg.java | 22 + .../ResumenNewCustomerWeekViewCfg.java | 22 + .../ResumenTotalLastWeekViewCfg.java | 22 + .../constance/ResumenTotalWeekViewCfg.java | 22 + .../views/constance/StatsAdvancesViewCfg.java | 22 + .../constance/StatsClosingDayViewCfg.java | 22 + .../views/constance/StatsDepositsViewCfg.java | 21 + .../constance/StatsEmployeeSavingViewCfg.java | 22 + .../views/constance/StatsGasolineViewCfg.java | 19 + .../constance/StatsOpeningFeesViewCfg.java | 21 + .../StatsPaymentRenovationViewCfg.java | 21 + .../constance/StatsPaymentRouteViewCfg.java | 22 + .../views/constance/StatsPaymentViewCfg.java | 22 + .../views/constance/StatsPayrollViewCfg.java | 22 + .../views/constance/StatsVehicleCfg.java | 19 + .../constance/StatsZeroPaymentsViewCfg.java | 21 + .../TotalLoansApprovedByOfficeViewCfg.java | 22 + .../constance/TotalLoansByOfficeViewCfg.java | 25 + .../TransferInPendingStatusViewCfg.java | 17 + .../apc/model/ws/parsed/AmountJaxb.java | 54 + .../apc/model/ws/parsed/CashRegisterJaxb.java | 55 + .../model/ws/parsed/ConfigurationJaxb.java | 39 + .../arrebol/apc/model/ws/parsed/Exchange.java | 65 + .../apc/model/ws/parsed/ExchangeJaxb.java | 65 + .../model/ws/parsed/FeeToPayRequestJaxb.java | 44 + .../ws/parsed/FeesToPayByLoanRequestJaxb.java | 55 + .../apc/model/ws/parsed/LoanDetailJaxb.java | 122 + .../arrebol/apc/model/ws/parsed/LoanJaxb.java | 44 + .../model/ws/parsed/LoanRequestedJaxb.java | 112 + .../apc/model/ws/parsed/NewAmountJaxb.java | 118 + .../ws/parsed/NewTransferAccountJaxb.java | 98 + .../apc/model/ws/parsed/PersonJaxb.java | 144 + .../parsed/RenovationWithEndorsementJaxb.java | 104 + .../apc/model/ws/parsed/ThumbnailJaxb.java | 48 + .../com/arrebol/apc/test/ArrebolTest.java | 82 + apc-model/src/main/resources/apc.cfg.xml | 227 + .../catalog/queries/people.queries.hbm.xml | 101 + .../catalog/queries/roles.queries.hbm.xml | 28 + .../catalog/queries/routes.queries.hbm.xml | 106 + .../queries/admin/advance.queries.hbm.xml | 41 + .../queries/admin/bitacora.queries.hbm.xml | 28 + .../model/queries/admin/bonus.queries.hbm.xml | 57 + .../admin/closing.day.detail.queries.hbm.xml | 16 + .../queries/admin/closing_day.queries.hbm.xml | 88 + .../admin/expense.company.queries.hbm.xml | 43 + .../model/queries/admin/goal.queries.hbm.xml | 42 + .../queries/admin/money.daily.queries.hbm.xml | 43 + .../admin/other.expense.queries.hbm.xml | 43 + .../admin/stable.general.box.queries.hbm.xml | 92 + .../admin/stable.small.box.queries.hbm.xml | 80 + .../queries/admin/transfer.queries.hbm.xml | 100 + .../core/human.resource.queries.hbm.xml | 91 + .../queries/core/mobile.user.queries.hbm.xml | 17 + .../model/queries/core/office.queries.hbm.xml | 42 + .../queries/core/permission.queries.hbm.xml | 120 + ...r.by.office.has.permission.queries.hbm.xml | 29 + .../core/user.by.office.queries.hbm.xml | 88 + .../model/queries/core/user.queries.hbm.xml | 142 + .../queries/loan/delivery.queries.hbm.xml | 6 + .../loan/loan.by.renovation.queries.hbm.xml | 47 + .../queries/loan/loan.by.user.queries.hbm.xml | 73 + .../queries/loan/loan.details.queries.hbm.xml | 221 + .../model/queries/loan/loan.employee.hbm.xml | 27 + .../loan.fee.notification.queries.hbm.xml | 16 + .../model/queries/loan/loan.queries.hbm.xml | 495 ++ .../queries/loan/loan.type.queries.hbm.xml | 83 + .../queries/mobile/gasoline/gasoline.hbm.xml | 23 + .../user.mobile.preference.queries.hbm.xml | 40 + .../mobile/reports/user.week.report.hbm.xml | 20 + .../available.customers.view.queries.hbm.xml | 16 + ...vailable.endorsements.view.queries.hbm.xml | 16 + .../views/availables.owners.view.hbm.xml | 31 + ...ister.curdate.by.user.view.queries.hbm.xml | 16 + .../current.customer.by.loan.view.hbm.xml | 19 + ...xchange.enebled.users.view.queries.hbm.xml | 18 + .../views/loan.approved.detail.view.hbm.xml | 6 + ...user.order.preference.view.queries.hbm.xml | 18 + .../views/loan.by.user.view.queries.hbm.xml | 48 + ...in.pending.status.to.delivery.view.hbm.xml | 20 + ...elivery.by.ciertifier.view.queries.hbm.xml | 17 + .../views/person.search.detail.view.hbm.xml | 6 + ...son.search.historical.details.view.hbm.xml | 16 + .../mobile/views/person.search.view.hbm.xml | 22 + .../views/total.cash.by.curdate.view.hbm.xml | 38 + .../queries/payroll/payroll.queries.hbm.xml | 201 + ...cted.payment.daily.by.user.queries.hbm.xml | 41 + .../view/administration.person.serch.view.xml | 56 + .../advance.user.daily.detail.view.hbm.xml | 15 + .../view/advance.user.daily.view.hbm.xml | 35 + .../customer.without.renovation.view.hbm.xml | 15 + .../view/enabled.user.details.view.hbm.xml | 24 + .../queries/view/general.box.view.hbm.xml | 15 + .../information.loan.last.week.view.hbm.xml | 43 + .../view/information.loan.week.view.hbm.xml | 61 + .../loan.by.user.payment.zero.view.hbm.xml | 15 + ...loan.employee.detail.all.data.view.hbm.xml | 34 + .../queries/view/loan.employee.view.hbm.xml | 25 + ...an.renovation.devilery.weekly.view.hbm.xml | 35 + ...money.daily.by.user.certifier.view.hbm.xml | 15 + ...t.detail.from.user.by.curdate.view.hbm.xml | 6 + ...esumen.new.customer.last.week.view.hbm.xml | 14 + .../resumen.new.customer.week.view.hbm.xml | 14 + .../view/resumen.total.last.week.view.hbm.xml | 15 + .../view/resumen.total.week.view.hbm.xml | 15 + .../queries/view/stats.advances.view.hbm.xml | 31 + .../view/stats.closing.day.view.hbm.xml | 31 + .../queries/view/stats.deposits.view.hbm.xml | 31 + .../view/stats.employee.saving.view.hbm.xml | 31 + .../queries/view/stats.fees.view.hbm.xml | 44 + .../queries/view/stats.gasoline.view.hbm.xml | 18 + .../view/stats.opening.fees.view.hbm.xml | 31 + .../stats.payment.renovation.view.hbm.xml | 31 + .../view/stats.payment.route.view.hbm.xml | 31 + .../queries/view/stats.payment.view.hbm.xml | 31 + .../queries/view/stats.payroll.view.hbm.xml | 31 + .../queries/view/stats.vehicle.view.hbm.xml | 15 + .../view/stats.zero.payments.view.hbm.xml | 31 + ...y.detail.from.user.by.curdate.view.hbm.xml | 26 + .../total.closing.day.by.curdate.view.hbm.xml | 15 + ...otal.loans.approved.by.office.view.hbm.xml | 15 + .../view/total.loans.by.office.view.hbm.xml | 15 + .../transfer.in.pending.status.view.hbm.xml | 20 + .../queries/view/user.by.route.view.hbm.xml | 15 + apc-security/nb-configuration.xml | 18 + apc-security/pom.xml | 57 + .../com/arrebol/apc/security/APCSecure.java | 68 + apc-security/src/main/resources/log4j2.xml | 19 + .../arrebol/apc/security/APCSecureTest.java | 40 + apc-web/faces-config.NavData | 6 + apc-web/faces-config_old.NavData | 0 apc-web/nb-configuration.xml | 28 + apc-web/pom.xml | 204 + .../com/arrebol/apc/web/beans/Datatable.java | 30 + .../arrebol/apc/web/beans/GenericBean.java | 209 + .../com/arrebol/apc/web/beans/SendMSN.java | 49 + .../apc/web/beans/admin/AdvanceBean.java | 252 + .../beans/admin/AjustarInventariosBean.java | 66 + .../apc/web/beans/admin/BonusBean.java | 158 + .../apc/web/beans/admin/ChangeOwnerBean.java | 241 + .../apc/web/beans/admin/ClosingDayBean.java | 1281 +++ .../web/beans/admin/ClosingDayDetailBean.java | 100 + .../apc/web/beans/admin/CustomerBean.java | 169 + .../web/beans/admin/CustomerDetailBean.java | 175 + .../apc/web/beans/admin/EmployeeListBean.java | 100 + .../apc/web/beans/admin/EndorsementBean.java | 178 + .../beans/admin/EndorsementDetailBean.java | 143 + .../web/beans/admin/ExpenseCompanyInBean.java | 239 + .../beans/admin/ExpenseCompanyOutBean.java | 248 + .../arrebol/apc/web/beans/admin/FeesBean.java | 212 + .../beans/admin/GenericPersonSearchBean.java | 193 + .../arrebol/apc/web/beans/admin/GoalBean.java | 155 + .../beans/admin/LoanDetailTransferBean.java | 331 + .../web/beans/admin/LoanEmployeeListBean.java | 411 + .../apc/web/beans/admin/LoanHistoryBean.java | 546 ++ .../beans/admin/LoanHistoryDetailBean.java | 220 + .../beans/admin/LoanHistoryJuridicalBean.java | 546 ++ .../apc/web/beans/admin/LoanPendingBean.java | 482 ++ .../beans/admin/LoanPendingDetailBean.java | 333 + .../LoanRenovationDeliveryWeeklyBean.java | 138 + .../apc/web/beans/admin/MoneyDailyBean.java | 327 + .../apc/web/beans/admin/OtherExpenseBean.java | 294 + .../apc/web/beans/admin/PayRollBean.java | 953 ++ .../apc/web/beans/admin/PeopleBean.java | 231 + .../web/beans/admin/StableGeneralBoxBean.java | 851 ++ .../web/beans/admin/StableSmallBoxBean.java | 679 ++ .../web/beans/admin/StatsAdvancesBean.java | 180 + .../web/beans/admin/StatsClosingDayBean.java | 169 + .../web/beans/admin/StatsDepositsBean.java | 169 + .../beans/admin/StatsEmployeeSavingBean.java | 264 + .../web/beans/admin/StatsGasolineBean.java | 144 + .../web/beans/admin/StatsOpeningFeesBean.java | 168 + .../apc/web/beans/admin/StatsPaymentBean.java | 169 + .../admin/StatsPaymentRenovationBean.java | 168 + .../beans/admin/StatsPaymentRouteBean.java | 180 + .../apc/web/beans/admin/StatsPayrollBean.java | 169 + .../apc/web/beans/admin/StatsSummaryBean.java | 145 + .../apc/web/beans/admin/StatsVehicleBean.java | 117 + .../beans/admin/StatsZeroPaymentsBean.java | 168 + .../apc/web/beans/admin/TransferBean.java | 263 + .../web/beans/admin/TransferUpgradeBean.java | 268 + .../apc/web/beans/admin/VehicleBean.java | 613 ++ .../admin/people/PersonCustomerBean.java | 795 ++ .../apc/web/beans/catalog/LoanTypeBean.java | 384 + .../apc/web/beans/catalog/RoleBean.java | 132 + .../apc/web/beans/catalog/RouteBean.java | 135 + .../CustomerWithoutLoanDetailBean.java | 172 + .../web/beans/dashboard/DashboardBean.java | 37 + .../web/beans/dashboard/LoanDetailBean.java | 245 + .../dashboard/LoanDetailEndorsementBean.java | 218 + .../apc/web/beans/login/LoginBean.java | 220 + .../beans/system/bitacora/BitacoraBean.java | 127 + .../beans/system/employee/EmployeeBean.java | 622 ++ .../web/beans/system/office/OfficeBean.java | 142 + .../web/beans/system/user/UserAccessBean.java | 195 + .../web/beans/system/user/UserAdminBean.java | 567 ++ .../web/beans/system/user/UserCreateBean.java | 428 + .../web/beans/system/user/UserUpdateBean.java | 663 ++ .../apc/web/beans/topbar/PrivacyBean.java | 119 + .../apc/web/beans/topbar/TopBarBean.java | 64 + .../apc/web/converters/GenericConverter.java | 41 + .../apc/web/converters/PeopleConverter.java | 44 + .../converters/PerseonSearchConverter.java | 42 + .../web/converters/UserByOfficeConverter.java | 82 + .../com/arrebol/apc/web/drive/DriverBean.java | 589 ++ .../arrebol/apc/web/drive/DriverDateBean.java | 871 ++ .../arrebol/apc/web/drive/DriverLastBean.java | 593 ++ .../apc/web/validators/GenericValidator.java | 42 + .../validators/SelectOneMenuValidator.java | 27 + .../com/arrebol/apc/i18n/app.properties | 601 ++ .../apc/i18n/app_background.properties | 45 + .../apc/i18n/app_permission.properties | 357 + apc-web/src/main/resources/log4j2.xml | 42 + apc-web/src/main/webapp/META-INF/context.xml | 38 + .../webapp/WEB-INF/error-pages/access.xhtml | 37 + .../webapp/WEB-INF/error-pages/error.xhtml | 38 + .../webapp/WEB-INF/error-pages/notfound.xhtml | 37 + .../src/main/webapp/WEB-INF/faces-config.xml | 46 + apc-web/src/main/webapp/WEB-INF/footer.xhtml | 15 + .../WEB-INF/primefaces-serenity.taglib.xml | 66 + apc-web/src/main/webapp/WEB-INF/sidebar.xhtml | 419 + .../src/main/webapp/WEB-INF/template.xhtml | 71 + apc-web/src/main/webapp/WEB-INF/topbar.xhtml | 109 + apc-web/src/main/webapp/WEB-INF/web.xml | 241 + .../webapp/app/admin/closingDay/detail.xhtml | 145 + .../webapp/app/admin/closingDay/history.xhtml | 170 + .../webapp/app/admin/closingDay/index.xhtml | 372 + .../main/webapp/app/admin/customer/add.xhtml | 1208 +++ .../webapp/app/admin/customer/detail.xhtml | 315 + .../webapp/app/admin/customer/index.xhtml | 1467 ++++ .../webapp/app/admin/customer/index_old.xhtml | 431 + .../webapp/app/admin/endorsement/detail.xhtml | 258 + .../webapp/app/admin/endorsement/index.xhtml | 162 + .../webapp/app/admin/inventarios/index.xhtml | 93 + .../webapp/app/admin/loan/changeOwner.xhtml | 212 + .../main/webapp/app/admin/loan/detail.xhtml | 641 ++ .../main/webapp/app/admin/loan/drive.xhtml | 902 ++ .../webapp/app/admin/loan/driveDate.xhtml | 1035 +++ .../webapp/app/admin/loan/driveLast.xhtml | 898 ++ .../main/webapp/app/admin/loan/history.xhtml | 299 + .../webapp/app/admin/loan/historyDetail.xhtml | 523 ++ .../app/admin/loan/historyJuridical.xhtml | 144 + .../main/webapp/app/admin/loan/index.xhtml | 219 + .../app/admin/loan/loanDetailTransfer.xhtml | 112 + .../app/admin/loan/loanRenovationWeekly.xhtml | 118 + .../webapp/app/admin/moneyDaily/index.xhtml | 243 + .../webapp/app/admin/otherExpense/index.xhtml | 214 + .../app/admin/stableSmallBox/history.xhtml | 189 + .../app/admin/stableSmallBox/index.xhtml | 141 + .../webapp/app/admin/transfer/index.xhtml | 213 + .../app/admin/transfer/index_backup.xhtml | 208 + .../main/webapp/app/admin/vehicles/main.xhtml | 278 + .../webapp/app/catalog/loanType/add.xhtml | 203 + .../webapp/app/catalog/loanType/index.xhtml | 180 + .../main/webapp/app/catalog/role/index.xhtml | 90 + .../main/webapp/app/catalog/route/index.xhtml | 90 + .../generalBox/expenseCompanyIn/index.xhtml | 179 + .../generalBox/expenseCompanyOut/index.xhtml | 189 + .../generalBox/stableGeneralBox/history.xhtml | 188 + .../generalBox/stableGeneralBox/index.xhtml | 142 + .../webapp/app/payroll/advance/index.xhtml | 184 + .../main/webapp/app/payroll/bonus/index.xhtml | 168 + .../app/payroll/createPayroll/index.xhtml | 432 + .../main/webapp/app/payroll/goal/index.xhtml | 164 + .../src/main/webapp/app/payroll/history.xhtml | 232 + .../app/payroll/loanEmployee/index.xhtml | 262 + .../webapp/app/stats/advances/index.xhtml | 109 + .../webapp/app/stats/closingDay/index.xhtml | 114 + .../webapp/app/stats/deposits/index.xhtml | 138 + .../app/stats/employeeSaving/index.xhtml | 184 + .../main/webapp/app/stats/fees/index.xhtml | 116 + .../webapp/app/stats/feesByRoute/index.xhtml | 111 + .../webapp/app/stats/gasoline/index.xhtml | 119 + .../webapp/app/stats/openingFee/index.xhtml | 113 + .../main/webapp/app/stats/payment/index.xhtml | 113 + .../app/stats/paymentRenovation/index.xhtml | 112 + .../webapp/app/stats/paymentRoute/index.xhtml | 114 + .../main/webapp/app/stats/payroll/index.xhtml | 110 + .../main/webapp/app/stats/summary/index.xhtml | 145 + .../webapp/app/stats/vehicles/index.xhtml | 93 + .../webapp/app/stats/zeroPayments/index.xhtml | 112 + .../webapp/app/system/bitacora/index.xhtml | 104 + .../app/system/employee/employeeList.xhtml | 95 + .../webapp/app/system/employee/main.xhtml | 621 ++ .../src/main/webapp/app/system/log/main.xhtml | 25 + .../main/webapp/app/system/office/index.xhtml | 104 + .../webapp/app/system/user/access/main.xhtml | 172 + .../webapp/app/system/user/add/main.xhtml | 275 + .../webapp/app/system/user/setting/main.xhtml | 450 + .../app/system/user/setting/main_1.xhtml | 663 ++ .../src/main/webapp/app/topbar/privacy.xhtml | 87 + .../webapp/customerWithoutLoanDetail.xhtml | 311 + apc-web/src/main/webapp/dashboard.xhtml | 31 + apc-web/src/main/webapp/loanDetail.xhtml | 530 ++ .../main/webapp/loanDetailEndorsement.xhtml | 524 ++ apc-web/src/main/webapp/login.xhtml | 85 + .../resources/js/scriptGeneric/bitacora.js | 7 + .../js/scriptGeneric/dialogGeneric.js | 96 + .../primefaces-serenity-green/theme.css | 7653 +++++++++++++++++ .../primefaces-serenity-green/theme.scss | 11 + .../main/webapp/resources/sass/_fonts.scss | 51 + .../webapp/resources/sass/_layout_styles.scss | 1 + .../main/webapp/resources/sass/_mixins.scss | 225 + .../webapp/resources/sass/_theme_styles.scss | 1 + .../resources/sass/layout/_dashboard.scss | 768 ++ .../resources/sass/layout/_exception.scss | 168 + .../resources/sass/layout/_horizontal.scss | 453 + .../resources/sass/layout/_landing.scss | 551 ++ .../webapp/resources/sass/layout/_layout.scss | 11 + .../webapp/resources/sass/layout/_login.scss | 82 + .../webapp/resources/sass/layout/_main.scss | 1399 +++ .../webapp/resources/sass/layout/_utils.scss | 169 + .../webapp/resources/sass/theme/_common.scss | 138 + .../webapp/resources/sass/theme/_data.scss | 779 ++ .../webapp/resources/sass/theme/_forms.scss | 1419 +++ .../webapp/resources/sass/theme/_icons.scss | 977 +++ .../webapp/resources/sass/theme/_media.scss | 80 + .../webapp/resources/sass/theme/_menus.scss | 367 + .../resources/sass/theme/_messages.scss | 245 + .../webapp/resources/sass/theme/_misc.scss | 91 + .../resources/sass/theme/_overlays.scss | 193 + .../webapp/resources/sass/theme/_panels.scss | 432 + .../webapp/resources/sass/theme/_theme.scss | 14 + .../resources/sass/variables/_common.scss | 29 + .../resources/sass/variables/_layout.scss | 11 + .../resources/sass/variables/_theme.scss | 40 + .../resources/serenity-layout/css/grid.css | 347 + .../serenity-layout/css/layout-green.css | 2938 +++++++ .../serenity-layout/css/layout-green.scss | 67 + .../serenity-layout/css/nanoscroller.css | 58 + .../resources/serenity-layout/css/ripple.css | 50 + .../fonts/MaterialIcons-Regular.eot | Bin 0 -> 143258 bytes .../fonts/MaterialIcons-Regular.ttf | Bin 0 -> 128180 bytes .../fonts/MaterialIcons-Regular.woff | Bin 0 -> 57620 bytes .../fonts/MaterialIcons-Regular.woff2 | Bin 0 -> 44300 bytes .../fonts/roboto-v15-latin-300.eot | Bin 0 -> 16205 bytes .../fonts/roboto-v15-latin-300.svg | 314 + .../fonts/roboto-v15-latin-300.ttf | Bin 0 -> 32664 bytes .../fonts/roboto-v15-latin-300.woff | Bin 0 -> 18520 bytes .../fonts/roboto-v15-latin-300.woff2 | Bin 0 -> 14524 bytes .../fonts/roboto-v15-latin-700.eot | Bin 0 -> 16208 bytes .../fonts/roboto-v15-latin-700.svg | 310 + .../fonts/roboto-v15-latin-700.ttf | Bin 0 -> 32500 bytes .../fonts/roboto-v15-latin-700.woff | Bin 0 -> 18568 bytes .../fonts/roboto-v15-latin-700.woff2 | Bin 0 -> 14552 bytes .../fonts/roboto-v15-latin-regular.eot | Bin 0 -> 16227 bytes .../fonts/roboto-v15-latin-regular.svg | 308 + .../fonts/roboto-v15-latin-regular.ttf | Bin 0 -> 32652 bytes .../fonts/roboto-v15-latin-regular.woff | Bin 0 -> 18520 bytes .../fonts/roboto-v15-latin-regular.woff2 | Bin 0 -> 14584 bytes .../serenity-layout/images/apc_card.png | Bin 0 -> 264302 bytes .../serenity-layout/images/arrebol.png | Bin 0 -> 125802 bytes .../serenity-layout/images/avatar.png | Bin 0 -> 13113 bytes .../serenity-layout/images/avatar1.png | Bin 0 -> 10633 bytes .../serenity-layout/images/avatar2.png | Bin 0 -> 11191 bytes .../serenity-layout/images/avatar3.png | Bin 0 -> 12403 bytes .../serenity-layout/images/avatar4.png | Bin 0 -> 8581 bytes .../images/dashboard/bridge.png | Bin 0 -> 356583 bytes .../images/dashboard/flag-belgium.png | Bin 0 -> 2141 bytes .../images/dashboard/flag-brazil.png | Bin 0 -> 4813 bytes .../images/dashboard/flag-china.png | Bin 0 -> 4043 bytes .../images/dashboard/flag-france.png | Bin 0 -> 2153 bytes .../images/dashboard/flag-uk.png | Bin 0 -> 2448 bytes .../images/dashboard/gradient-waters.png | Bin 0 -> 263850 bytes .../serenity-layout/images/dashboard/map.jpg | Bin 0 -> 60875 bytes .../images/dashboard/sidebar-image.jpg | Bin 0 -> 39355 bytes .../images/dashboard/usercard.png | Bin 0 -> 8003 bytes .../images/dashboard/weather-icon-1.svg | 5 + .../images/dashboard/weather-icon-2.svg | 3 + .../images/dashboard/weather-icon-3.svg | 6 + .../images/dashboard/weather-icon-4.svg | 6 + .../serenity-layout/images/excel-xls-icon.png | Bin 0 -> 5203 bytes .../serenity-layout/images/exception/401.svg | 16 + .../serenity-layout/images/exception/404.svg | 3 + .../images/exception/500(1).svg | 3 + .../serenity-layout/images/exception/500.svg | 3 + .../images/exception/access-bg.jpg | Bin 0 -> 81183 bytes .../images/exception/error-bg(1).jpg | Bin 0 -> 67960 bytes .../images/exception/error-bg.jpg | Bin 0 -> 67960 bytes .../images/exception/icon-apple-green.svg | 3 + .../images/exception/icon-apple-purple.svg | 3 + .../images/exception/icon-donut-red.svg | 3 + .../images/exception/icon-donut-yellow.svg | 3 + .../images/exception/icon-shop-purple.svg | 3 + .../images/exception/icon-shop-yellow.svg | 3 + .../images/exception/icon-taxi-yellow.svg | 3 + .../images/exception/notfound-bg.jpg | Bin 0 -> 84627 bytes .../images/landing/icon-cleancode.svg | 29 + .../images/landing/icon-coffee.svg | 3 + .../images/landing/icon-facebook.svg | 16 + .../images/landing/icon-hours.svg | 3 + .../images/landing/icon-linkedin.svg | 16 + .../images/landing/icon-moderndesign.svg | 31 + .../images/landing/icon-responsive.svg | 29 + .../images/landing/icon-twitter.svg | 16 + .../images/landing/icon-ui.svg | 3 + .../images/landing/icon-welldocumented.svg | 32 + .../images/landing/landing-header.png | Bin 0 -> 945443 bytes .../images/landing/map-contact.png | Bin 0 -> 218591 bytes .../serenity-layout/images/login/login-bg.jpg | Bin 0 -> 118782 bytes .../serenity-layout/images/logo-colored.png | Bin 0 -> 23908 bytes .../serenity-layout/images/logo-slim.png | Bin 0 -> 5533 bytes .../resources/serenity-layout/images/mapa.png | Bin 0 -> 7913 bytes .../serenity-layout/images/rightmenu-icon.png | Bin 0 -> 323 bytes .../serenity-layout/js/calendar_es.js | 26 + .../resources/serenity-layout/js/layout.js | 750 ++ .../serenity-layout/js/nanoscroller.js | 1040 +++ .../resources/serenity-layout/js/ripple.js | 34 + .../resources/serenity-layout/js/swipe.js | 1973 +++++ apc-ws-rest/hs_err_pid15652.log | 322 + apc-ws-rest/nb-configuration.xml | 21 + apc-ws-rest/pom.xml | 264 + apc-ws-rest/replay_pid15652.log | 2597 ++++++ .../apc/ws/administration/ClosingDayWS.java | 124 + .../apc/ws/administration/SmallBoxWS.java | 122 + .../arrebol/apc/ws/cash/CashRegisterWS.java | 82 + .../arrebol/apc/ws/cfg/ApplicationCfg.java | 51 + .../JsonMoxyConfigurationContextResolver.java | 45 + .../arrebol/apc/ws/customer/CustomerWS.java | 59 + .../arrebol/apc/ws/employee/EmployeeWS.java | 49 + .../arrebol/apc/ws/exchange/ExchangeWS.java | 143 + .../arrebol/apc/ws/gasoline/GasolineWS.java | 76 + .../java/com/arrebol/apc/ws/loan/LoanWS.java | 830 ++ .../com/arrebol/apc/ws/login/LoginWS.java | 58 + .../apc/ws/otherexpense/OtherExpenseWS.java | 70 + .../com/arrebol/apc/ws/person/PersonWS.java | 53 + .../ws/preferences/SystemPreferenceWS.java | 125 + .../com/arrebol/apc/ws/reports/ReportsWS.java | 47 + .../com/arrebol/apc/ws/route/RouteWS.java | 44 + .../com/arrebol/apc/ws/search/SearchWS.java | 130 + .../java/com/arrebol/apc/ws/user/UserWS.java | 55 + apc-ws-rest/src/main/resources/log4j2.xml | 29 + .../src/main/webapp/META-INF/context.xml | 2 + apc-ws-rest/src/main/webapp/WEB-INF/beans.xml | 7 + apc-ws-rest/src/main/webapp/index.html | 10 + .../apc/ws/cash/CashRegisterWSTest.java | 47 + .../apc/ws/customer/CustomerWSTest.java | 58 + .../ws/customer/employee/EmployeeWSTest.java | 54 + .../apc/ws/exchange/ExchangeWSTest.java | 93 + .../com/arrebol/apc/ws/loan/LoanWSTest.java | 221 + .../apc/ws/loan/LoanWithImageWSTest.java | 137 + .../com/arrebol/apc/ws/login/LoginWSTest.java | 58 + .../preferences/SystemPreferenceWSTest.java | 103 + .../com/arrebol/apc/ws/user/UserWSTest.java | 48 + apc-ws-rest/src/test/resources/apc.cfg.xml | 224 + apc-ws-rest/src/test/resources/log4j2.xml | 28 + apc/nb-configuration.xml | 18 + apc/pom.xml | 108 + 890 files changed, 144670 insertions(+) create mode 100644 .gitignore create mode 100644 apc-controller-mobile/nb-configuration.xml create mode 100644 apc-controller-mobile/pom.xml create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/admin/ClosingDayController.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/admin/StableGeneralBoxController.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/admin/StableSmallBoxController.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/bitacora/BitacoraController.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/cash/CashRegisterCurdateByUserController.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/customer/CustomerController.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/exchange/ExchangeEnebledUsersController.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/gasoline/GasolineController.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/loan/LoanController.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/login/LoginWSController.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/otherexpense/OtherExpenseController.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/person/PersonController.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/preference/SystemPreferenceController.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/reports/ReportsController.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/route/RouteController.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/search/PersonSearchController.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/tracking/PaymentTrackingController.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/user/UserController.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/AuthorizeTransferList.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/AuthorizeTransferPaymentsDto.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/DeleteLoanDetailsJaxb.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/GenericAPCResponserJaxb.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/LoanTypeJaxb.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/LoanTypeListJaxb.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/TransferListToUpdateStatus.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/UpdateLoanToDeliveryStatusDTO.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/UpdateLoanToDeliveryStatusList.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/PersonMxy.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/login/UserMxy.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/login/UserPreferenceMxy.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/views/ContainerRoutes.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/views/LoanByUserOrderPreferenceViewJaxb.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/views/LoanByUserOrderPreferenceViewListJaxb.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/views/PaymentTrackingViewJaxb.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/views/RouteJaxb.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/ArrebolTestRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/GenericRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/admin/ClosingDayRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/admin/OtherExpenseRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/admin/StableGeneralBoxRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/admin/StableSmallBoxRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/admin/TransferRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/bitacora/BitacoraRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/gasoline/GasolineRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/jaas/AuthenticationRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/AddAmountRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanByRenovationRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanByUserRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanDetailsRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanFeeNotificationRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanToDeliveryByCertifierRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanTypeRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/people/PeopleRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/preference/UserMobilePreferenceRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/reports/ReportsRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/route/RouteRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/tracking/PaymentTrackingRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/user/UserRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/CashRegisterCurdateByUserViewRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/ExchangeEnebledUsersViewRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/LoanApprovedDetailViewRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/LoanByUserOrderPreferenceViewRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/LoanByUserViewRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/LoanInPendingStatusToDeliveryViewRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/PersonSearchHistoricalDetailsViewRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/PersonSearchViewRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/SearchPersonAvailableRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/TotalCashByCurdateViewRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/TransferInPendingStatusViewRepository.java create mode 100644 apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/util/HibernateUtil.java create mode 100644 apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/cash/CashRegisterCurdateByUserControllerTest.java create mode 100644 apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/customer/CustomerControllerTest.java create mode 100644 apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/exchange/ExchangeEnebledUsersControllerTest.java create mode 100644 apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/loan/LoanControllerTest.java create mode 100644 apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/login/LoginWSControllerTest.java create mode 100644 apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/preference/SystemPreferenceControllerTest.java create mode 100644 apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/search/PersonSearchControllerTest.java create mode 100644 apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/user/UserControllerTest.java create mode 100644 apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/repository/ArrebolTestRepositoryTest.java create mode 100644 apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/repository/loan/LoanTypeRepositoryTest.java create mode 100644 apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/repository/people/PeopleRepositoryTest.java create mode 100644 apc-controller-mobile/src/test/resources/apc.cfg.xml create mode 100644 apc-controller-mobile/src/test/resources/log4j2.xml create mode 100644 apc-controller/nb-configuration.xml create mode 100644 apc-controller/pom.xml create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/BitacoraController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/GenericController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/GenericValidationController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/AdministrationPersonSearchViewController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/AdvanceController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/AjustarInventariosController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/BonusController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/ChangeOwnerController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/ClosingDayController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/CustomerController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/EndorsementController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/ExpenseCompanyController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/FeesController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/GoalController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/LoanController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/LoanEmployeeController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/LoanRenovationDeliveryWeeklyController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/MoneyDailyController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/OtherExpenseController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/PayRollController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/PeopleController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/StableGeneralBoxController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/StableSmallBoxController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsAdvancesController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsClosingDayController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsDepositsController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsEmployeeSavingController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsGasolineController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsOpeningFeesController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsPaymentController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsPaymentRenovationController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsPaymentRouteController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsPayrollController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsSummaryController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsVehicleController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsZeroPaymentsController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/TransferController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/admin/VehicleController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/catalog/LoanTypeController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/catalog/RoleController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/catalog/RouteController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/dashboard/CustomerWithoutRenovationViewService.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/dashboard/CustomerWithoutRenovationViewServiceImpl.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/dashboard/DashboardController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/drive/DriverController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/drive/FaltanteInDatesController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/login/LoginController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/login/LoginService.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/login/LoginServiceImpl.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/system/employee/EmployeeController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/system/office/OfficeController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/system/user/UserAccessController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/system/user/UserAdminController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/system/user/UserCreateController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/system/user/UserUpdateController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/topbar/PrivacyController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/topbar/TopBarController.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/util/ConnectionManager.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/util/DateWrapper.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/util/FilterMap.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/util/HibernateUtil.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/controller/util/logger/LogConnectionFactory.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/repository/AbstractRepository.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/repository/AutoCompleteDAORepository.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/repository/GenericEntityRepository.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/repository/LazyDataModelDAORepository.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/repository/core/HumanResourceRepository.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/repository/core/OfficeRepository.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/repository/core/PermissionRepository.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/repository/core/UserByOfficeRepository.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/repository/core/UserRepository.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/AutoCompleteService.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/BitacoraService.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/BitacoraServiceImpl.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/GenericValidationService.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/GenericValidationServiceImpl.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/LazyDataModelBetweenDatesService.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/LazyDataModelService.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/admin/CustomerService.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/admin/CustomerServiceImpl.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/admin/PeopleService.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/admin/PeopleServiceImpl.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/admin/TransferService.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/admin/TransferServiceImpl.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/catalog/LoanService.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/catalog/LoanServiceImpl.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/catalog/LoanTypeService.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/catalog/LoanTypeServiceImpl.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/catalog/PeopleAutoCompleteService.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/catalog/PeopleAutoCompleteServiceImpl.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/catalog/RouteService.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/catalog/RouteServiceImpl.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/core/UserService.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/core/UserServiceImpl.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/views/EnabledUserDetailsViewService.java create mode 100644 apc-controller/src/main/java/com/arrebol/apc/service/views/EnabledUserDetailsViewServiceImpl.java create mode 100644 apc-controller/src/test/java/com/arrebol/apc/controller/admin/AdministrationPersonSearchViewControllerTest.java create mode 100644 apc-controller/src/test/java/com/arrebol/apc/controller/admin/ClosingDayControllerTest.java create mode 100644 apc-controller/src/test/java/com/arrebol/apc/controller/admin/StableGeneralBoxControllerTest.java create mode 100644 apc-controller/src/test/java/com/arrebol/apc/controller/admin/StableSmallBoxControllerTest.java create mode 100644 apc-controller/src/test/java/com/arrebol/apc/controller/login/LoginControllerTest.java create mode 100644 apc-controller/src/test/java/com/arrebol/apc/controller/system/employee/EmployeeControllerTest.java create mode 100644 apc-controller/src/test/java/com/arrebol/apc/controller/system/user/UserAccessControllerTest.java create mode 100644 apc-controller/src/test/java/com/arrebol/apc/controller/system/user/UserCreateControllerTest.java create mode 100644 apc-controller/src/test/java/com/arrebol/apc/controller/system/user/UserUpdateControllerTest.java create mode 100644 apc-controller/src/test/java/com/arrebol/apc/controller/topbar/TopBarControllerTest.java create mode 100644 apc-controller/src/test/resources/apc.cfg.xml create mode 100644 apc-controller/src/test/resources/log4j2.xml create mode 100644 apc-db/build.xml create mode 100644 apc-db/manifest.mf create mode 100644 apc-db/nbproject/build-impl.xml create mode 100644 apc-db/nbproject/genfiles.properties create mode 100644 apc-db/nbproject/project.properties create mode 100644 apc-db/nbproject/project.xml create mode 100644 apc-db/src/XXXXXXXX.sql create mode 100644 apc-db/src/apc-config-db-aws.sql create mode 100644 apc-db/src/apc-config-db-localhost.sql create mode 100644 apc-db/src/apc-db-populate-empty.sql create mode 100644 apc-db/src/apc-db-populate.sql create mode 100644 apc-db/src/apc-db.sql create mode 100644 apc-db/src/apc-drop-tables-prod.sql create mode 100644 apc-db/src/cambio_de_anio.sql create mode 100644 apc-db/src/cocina-lore-db.sql create mode 100644 apc-db/src/create/from/scratch/apc-config-db-aws.sql create mode 100644 apc-db/src/create/from/scratch/apc-config-db-localhost.sql create mode 100644 apc-db/src/create/from/scratch/apc-db-init-populate.sql create mode 100644 apc-db/src/create/from/scratch/apc-db-tables.sql create mode 100644 apc-db/src/create/from/scratch/apc-db-views.sql create mode 100644 apc-db/src/create/from/scratch/mora/f1_isMobileEnabledUser.sql create mode 100644 apc-db/src/janitzio.sql create mode 100644 apc-db/src/notes.txt create mode 100644 apc-db/src/oscar.sql create mode 100644 apc-db/src/respaldo_xxxxxxxx.sql create mode 100644 apc-db/src/to_execute.sql create mode 100644 apc-db/src/to_update.sql create mode 100644 apc-layout/nb-configuration.xml create mode 100644 apc-layout/pom.xml create mode 100644 apc-layout/src/main/java/org/primefaces/serenity/component/SerenityMenu.java create mode 100644 apc-layout/src/main/java/org/primefaces/serenity/component/SerenityMenuRenderer.java create mode 100644 apc-layout/src/main/java/org/primefaces/serenity/filter/CharacterEncodingFilter.java create mode 100644 apc-layout/src/main/java/org/primefaces/serenity/view/GuestPreferences.java create mode 100644 apc-model/nb-configuration.xml create mode 100644 apc-model/pom.xml create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/DateFormatModel.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/ModelParameter.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/Advance.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/Bonus.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/ClosingDay.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/ClosingDayDetail.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/EmployeeSaving.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/ExpenseCompany.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/Goal.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/LoanEmployee.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/LoanEmployeeDetails.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/MoneyDaily.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/OtherExpense.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/StableGeneralBox.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/StableSmallBox.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/Transfer.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/constance/AdvanceCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/constance/BitacoraCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/constance/BonusCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/constance/ClosingDayCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/constance/ClosingDayDetailCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/constance/ExpenseCompanyCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/constance/GoalCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/constance/MoneyDailyCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/constance/OtherExpenseCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/constance/StableGeneralBoxCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/constance/StableSmallBoxCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/admin/constance/TransferCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/catalog/HumanResourceHasRoute.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/catalog/HumanResourceHasRouteId.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/catalog/MovimientosInventario.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/catalog/People.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/catalog/RoleCtlg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/catalog/RouteCtlg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/catalog/Vehicle.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/catalog/constance/PeopleCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/catalog/constance/RoleCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/catalog/constance/RouteCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/HumanResource.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/HumanResourceByOffice.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/Office.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/Permission.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/User.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/UserByOffice.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/UserByOfficeHasPermission.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/UserByOfficeHasPermissionId.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/AvailableCustomersViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/AvailableEndorsementsViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/CashRegisterCurdateByUserViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/ExchangeEnebledUsersViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/GenericCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/HumanResourceByOfficeCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/HumanResourceCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/HumanResourceHasRouteCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanApprovedDetailViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanByRenovationCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanByUserCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanByUserOrderPreferenceViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanByUserViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanDetailsCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanFeeNotificationCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanToDeliveryByCertifierViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanTypeCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/MobileUserCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/OfficeCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/PermissionCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/PersonSearchDetailViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/PersonSearchHistoricalDetailsViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/PersonSearchViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/UserByOfficeCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/UserByOfficeHasPermissionCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/UserCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/core/constance/UserMobilePreferenceCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/ActionStatus.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/ActiveStatus.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/ApplicationOwner.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/ComissionType.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/CustomerClassification.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/DaysInWeekend.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/EmployeeSavingType.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/ExpenseCompanyType.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/FeeStatus.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/FormaPago.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/GenericEnumType.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/GenericStatus.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/HumanResourceStatus.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/LoanDetailsType.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/LoanRenovationStatus.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/LoanStatus.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/LugarDeCobro.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/OfficeStatus.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/OwnerLoan.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/PeopleType.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/PermissionStatus.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/PermissionType.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/PreferenceName.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/PreferenceValue.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/TipoMovimiento.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/TransferStatus.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/UserByOfficeStatus.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/UserStatus.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/enums/UserType.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/gasoline/Gasoline.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/gasoline/constance/GasolineCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/loan/Delivery.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/loan/Loan.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/loan/LoanByRenovation.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/loan/LoanByRenovationId.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/loan/LoanByUser.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/loan/LoanByUserId.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/loan/LoanDetails.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/loan/LoanFeeNotification.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/loan/LoanType.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/mobile/access/MobileUser.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/mobile/preference/UserMobilePreference.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/payroll/Payroll.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/payroll/TotalExpectedPaymentDailyByUser.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/payroll/constance/PayRollCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/payroll/constance/TotalExpectedPaymentDailyByUserCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/reports/UserWeekReport.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/reports/constance/UserWeekReportCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/system/logs/Bitacora.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/system/logs/ErrorAppLog.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/AdministrationPersonSerchView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/AdvanceUserDailyDetail.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/AdvanceUserDailyView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/AvailableCustomersView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/AvailableEndorsementsView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/AvailablesOwnersView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/CashRegisterCurdateByUserView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/ClosingDailyDetailFromUserByCurdateView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/CobranzaLastWeekByUserView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/CobranzaWeekByUserView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/ColocationLastWeekByUserView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/ColocationWeekByUserView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/CurrentCustomerByLoanView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/CustomerView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/CustomerWithoutRenovationView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/EnabledUserDetailsView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/ExchangeEnebledUsersView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/FaltanteInDates.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/FeesView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/GeneralBoxView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/HistoryLoanView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/InformationLoanLastWeekView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/InformationLoanWeekView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/LoanApprovedDetailView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/LoanByUserOrderPreferenceView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/LoanByUserPaymentZeroView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/LoanByUserView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/LoanDetailZeroView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/LoanDiferencesByUserLastWeekView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/LoanEmployeeAllDataView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/LoanEmployeeDetailAllDataView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/LoanEmployeeView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/LoanFinishedView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/LoanInPendingStatusToDeliveryView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/LoanRenovationDeliveryWeeklyView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/LoanToDeliveryByCertifierView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/MoneyDailyByUserCertifier.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/PaymentDetailFromUserByCurdateView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/PersonSearchDetailView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/PersonSearchHistoricalDetailsView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/PersonSearchView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/ResumeNewCustomerLastWeekView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/ResumeNewCustomerWeekView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/ResumenInOutLastWeekByUserView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/ResumenInOutWeekByUserView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/ResumenTotalLastWeekView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/ResumenTotalWeekView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/StatsAdvancesView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/StatsClosingDayView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/StatsDepositsView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/StatsEmployeeSavingView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/StatsGasolineView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/StatsOpeningFeesView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/StatsPaymentRenovationView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/StatsPaymentRouteView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/StatsPaymentView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/StatsPayrollView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/StatsSummaryView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/StatsZeroPaymentsView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/SubtotalLastWeekByUserView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/SubtotalWeekByUserView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/TotalCashByCurdateDashboardView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/TotalCashByCurdateView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/TotalClosingDayByCurdateView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/TotalLoansApprovedByOfficeView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/TotalLoansByOfficeView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/TransferInPendingStatusView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/TransferView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/UserByRouteView.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/AdministrationPersonSerchViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/AdvanceUserDailyDetailViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/AdvanceUserDailyViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/AvailablesOwnersViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/ClosingDailyDetailFromUserByCurdateCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/CurrentCustomerByLoanViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/CustomerWithoutRenovationViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/EnabledUserDetailsViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/FeesViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/GeneralBoxViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/InformationLoanWeekViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanByUserPaymentZeroViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanEmployeeAllDataCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanEmployeeDetailAllDataViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanEmployeeViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanInPendingStatusToDeliveryViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanRenovationDeliveryWeeklyViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/MoneyDailyByUserCertifierViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/ResumenNewCustomerLastWeekViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/ResumenNewCustomerWeekViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/ResumenTotalLastWeekViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/ResumenTotalWeekViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsAdvancesViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsClosingDayViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsDepositsViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsEmployeeSavingViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsGasolineViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsOpeningFeesViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsPaymentRenovationViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsPaymentRouteViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsPaymentViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsPayrollViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsVehicleCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsZeroPaymentsViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/TotalLoansApprovedByOfficeViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/TotalLoansByOfficeViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/views/constance/TransferInPendingStatusViewCfg.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/AmountJaxb.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/CashRegisterJaxb.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/ConfigurationJaxb.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/Exchange.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/ExchangeJaxb.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/FeeToPayRequestJaxb.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/FeesToPayByLoanRequestJaxb.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/LoanDetailJaxb.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/LoanJaxb.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/LoanRequestedJaxb.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/NewAmountJaxb.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/NewTransferAccountJaxb.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/PersonJaxb.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/RenovationWithEndorsementJaxb.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/ThumbnailJaxb.java create mode 100644 apc-model/src/main/java/com/arrebol/apc/test/ArrebolTest.java create mode 100644 apc-model/src/main/resources/apc.cfg.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/catalog/queries/people.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/catalog/queries/roles.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/catalog/queries/routes.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/advance.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/bitacora.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/bonus.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/closing.day.detail.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/closing_day.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/expense.company.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/goal.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/money.daily.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/other.expense.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/stable.general.box.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/stable.small.box.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/transfer.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/core/human.resource.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/core/mobile.user.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/core/office.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/core/permission.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/core/user.by.office.has.permission.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/core/user.by.office.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/core/user.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/delivery.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.by.renovation.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.by.user.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.details.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.employee.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.fee.notification.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.type.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/gasoline/gasoline.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/preference/user.mobile.preference.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/reports/user.week.report.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/available.customers.view.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/available.endorsements.view.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/availables.owners.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/cash.register.curdate.by.user.view.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/current.customer.by.loan.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/exchange.enebled.users.view.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/loan.approved.detail.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/loan.by.user.order.preference.view.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/loan.by.user.view.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/loan.in.pending.status.to.delivery.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/loan.to.delivery.by.ciertifier.view.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/person.search.detail.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/person.search.historical.details.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/person.search.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/total.cash.by.curdate.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/payroll/payroll.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/payroll/total.expected.payment.daily.by.user.queries.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/administration.person.serch.view.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/advance.user.daily.detail.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/advance.user.daily.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/customer.without.renovation.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/enabled.user.details.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/general.box.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/information.loan.last.week.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/information.loan.week.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/loan.by.user.payment.zero.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/loan.employee.detail.all.data.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/loan.employee.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/loan.renovation.devilery.weekly.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/money.daily.by.user.certifier.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/payment.detail.from.user.by.curdate.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/resumen.new.customer.last.week.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/resumen.new.customer.week.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/resumen.total.last.week.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/resumen.total.week.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.advances.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.closing.day.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.deposits.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.employee.saving.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.fees.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.gasoline.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.opening.fees.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.payment.renovation.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.payment.route.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.payment.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.payroll.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.vehicle.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.zero.payments.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/total.closing.daily.detail.from.user.by.curdate.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/total.closing.day.by.curdate.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/total.loans.approved.by.office.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/total.loans.by.office.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/transfer.in.pending.status.view.hbm.xml create mode 100644 apc-model/src/main/resources/com/arrebol/apc/model/queries/view/user.by.route.view.hbm.xml create mode 100644 apc-security/nb-configuration.xml create mode 100644 apc-security/pom.xml create mode 100644 apc-security/src/main/java/com/arrebol/apc/security/APCSecure.java create mode 100644 apc-security/src/main/resources/log4j2.xml create mode 100644 apc-security/src/test/java/com/arrebol/apc/security/APCSecureTest.java create mode 100644 apc-web/faces-config.NavData create mode 100644 apc-web/faces-config_old.NavData create mode 100644 apc-web/nb-configuration.xml create mode 100644 apc-web/pom.xml create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/Datatable.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/GenericBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/SendMSN.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/AdvanceBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/AjustarInventariosBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/BonusBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/ChangeOwnerBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/ClosingDayBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/ClosingDayDetailBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/CustomerBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/CustomerDetailBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/EmployeeListBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/EndorsementBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/EndorsementDetailBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/ExpenseCompanyInBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/ExpenseCompanyOutBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/FeesBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/GenericPersonSearchBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/GoalBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanDetailTransferBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanEmployeeListBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanHistoryBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanHistoryDetailBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanHistoryJuridicalBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanPendingBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanPendingDetailBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanRenovationDeliveryWeeklyBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/MoneyDailyBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/OtherExpenseBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/PayRollBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/PeopleBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StableGeneralBoxBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StableSmallBoxBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsAdvancesBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsClosingDayBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsDepositsBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsEmployeeSavingBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsGasolineBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsOpeningFeesBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsPaymentBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsPaymentRenovationBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsPaymentRouteBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsPayrollBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsSummaryBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsVehicleBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsZeroPaymentsBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/TransferBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/TransferUpgradeBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/VehicleBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/admin/people/PersonCustomerBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/catalog/LoanTypeBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/catalog/RoleBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/catalog/RouteBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/dashboard/CustomerWithoutLoanDetailBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/dashboard/DashboardBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/dashboard/LoanDetailBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/dashboard/LoanDetailEndorsementBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/login/LoginBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/system/bitacora/BitacoraBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/system/employee/EmployeeBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/system/office/OfficeBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/system/user/UserAccessBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/system/user/UserAdminBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/system/user/UserCreateBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/system/user/UserUpdateBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/topbar/PrivacyBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/beans/topbar/TopBarBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/converters/GenericConverter.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/converters/PeopleConverter.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/converters/PerseonSearchConverter.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/converters/UserByOfficeConverter.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/drive/DriverBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/drive/DriverDateBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/drive/DriverLastBean.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/validators/GenericValidator.java create mode 100644 apc-web/src/main/java/com/arrebol/apc/web/validators/SelectOneMenuValidator.java create mode 100644 apc-web/src/main/resources/com/arrebol/apc/i18n/app.properties create mode 100644 apc-web/src/main/resources/com/arrebol/apc/i18n/app_background.properties create mode 100644 apc-web/src/main/resources/com/arrebol/apc/i18n/app_permission.properties create mode 100644 apc-web/src/main/resources/log4j2.xml create mode 100644 apc-web/src/main/webapp/META-INF/context.xml create mode 100644 apc-web/src/main/webapp/WEB-INF/error-pages/access.xhtml create mode 100644 apc-web/src/main/webapp/WEB-INF/error-pages/error.xhtml create mode 100644 apc-web/src/main/webapp/WEB-INF/error-pages/notfound.xhtml create mode 100644 apc-web/src/main/webapp/WEB-INF/faces-config.xml create mode 100644 apc-web/src/main/webapp/WEB-INF/footer.xhtml create mode 100644 apc-web/src/main/webapp/WEB-INF/primefaces-serenity.taglib.xml create mode 100644 apc-web/src/main/webapp/WEB-INF/sidebar.xhtml create mode 100644 apc-web/src/main/webapp/WEB-INF/template.xhtml create mode 100644 apc-web/src/main/webapp/WEB-INF/topbar.xhtml create mode 100644 apc-web/src/main/webapp/WEB-INF/web.xml create mode 100644 apc-web/src/main/webapp/app/admin/closingDay/detail.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/closingDay/history.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/closingDay/index.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/customer/add.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/customer/detail.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/customer/index.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/customer/index_old.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/endorsement/detail.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/endorsement/index.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/inventarios/index.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/loan/changeOwner.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/loan/detail.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/loan/drive.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/loan/driveDate.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/loan/driveLast.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/loan/history.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/loan/historyDetail.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/loan/historyJuridical.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/loan/index.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/loan/loanDetailTransfer.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/loan/loanRenovationWeekly.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/moneyDaily/index.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/otherExpense/index.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/stableSmallBox/history.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/stableSmallBox/index.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/transfer/index.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/transfer/index_backup.xhtml create mode 100644 apc-web/src/main/webapp/app/admin/vehicles/main.xhtml create mode 100644 apc-web/src/main/webapp/app/catalog/loanType/add.xhtml create mode 100644 apc-web/src/main/webapp/app/catalog/loanType/index.xhtml create mode 100644 apc-web/src/main/webapp/app/catalog/role/index.xhtml create mode 100644 apc-web/src/main/webapp/app/catalog/route/index.xhtml create mode 100644 apc-web/src/main/webapp/app/generalBox/expenseCompanyIn/index.xhtml create mode 100644 apc-web/src/main/webapp/app/generalBox/expenseCompanyOut/index.xhtml create mode 100644 apc-web/src/main/webapp/app/generalBox/stableGeneralBox/history.xhtml create mode 100644 apc-web/src/main/webapp/app/generalBox/stableGeneralBox/index.xhtml create mode 100644 apc-web/src/main/webapp/app/payroll/advance/index.xhtml create mode 100644 apc-web/src/main/webapp/app/payroll/bonus/index.xhtml create mode 100644 apc-web/src/main/webapp/app/payroll/createPayroll/index.xhtml create mode 100644 apc-web/src/main/webapp/app/payroll/goal/index.xhtml create mode 100644 apc-web/src/main/webapp/app/payroll/history.xhtml create mode 100644 apc-web/src/main/webapp/app/payroll/loanEmployee/index.xhtml create mode 100644 apc-web/src/main/webapp/app/stats/advances/index.xhtml create mode 100644 apc-web/src/main/webapp/app/stats/closingDay/index.xhtml create mode 100644 apc-web/src/main/webapp/app/stats/deposits/index.xhtml create mode 100644 apc-web/src/main/webapp/app/stats/employeeSaving/index.xhtml create mode 100644 apc-web/src/main/webapp/app/stats/fees/index.xhtml create mode 100644 apc-web/src/main/webapp/app/stats/feesByRoute/index.xhtml create mode 100644 apc-web/src/main/webapp/app/stats/gasoline/index.xhtml create mode 100644 apc-web/src/main/webapp/app/stats/openingFee/index.xhtml create mode 100644 apc-web/src/main/webapp/app/stats/payment/index.xhtml create mode 100644 apc-web/src/main/webapp/app/stats/paymentRenovation/index.xhtml create mode 100644 apc-web/src/main/webapp/app/stats/paymentRoute/index.xhtml create mode 100644 apc-web/src/main/webapp/app/stats/payroll/index.xhtml create mode 100644 apc-web/src/main/webapp/app/stats/summary/index.xhtml create mode 100644 apc-web/src/main/webapp/app/stats/vehicles/index.xhtml create mode 100644 apc-web/src/main/webapp/app/stats/zeroPayments/index.xhtml create mode 100644 apc-web/src/main/webapp/app/system/bitacora/index.xhtml create mode 100644 apc-web/src/main/webapp/app/system/employee/employeeList.xhtml create mode 100644 apc-web/src/main/webapp/app/system/employee/main.xhtml create mode 100644 apc-web/src/main/webapp/app/system/log/main.xhtml create mode 100644 apc-web/src/main/webapp/app/system/office/index.xhtml create mode 100644 apc-web/src/main/webapp/app/system/user/access/main.xhtml create mode 100644 apc-web/src/main/webapp/app/system/user/add/main.xhtml create mode 100644 apc-web/src/main/webapp/app/system/user/setting/main.xhtml create mode 100644 apc-web/src/main/webapp/app/system/user/setting/main_1.xhtml create mode 100644 apc-web/src/main/webapp/app/topbar/privacy.xhtml create mode 100644 apc-web/src/main/webapp/customerWithoutLoanDetail.xhtml create mode 100644 apc-web/src/main/webapp/dashboard.xhtml create mode 100644 apc-web/src/main/webapp/loanDetail.xhtml create mode 100644 apc-web/src/main/webapp/loanDetailEndorsement.xhtml create mode 100644 apc-web/src/main/webapp/login.xhtml create mode 100644 apc-web/src/main/webapp/resources/js/scriptGeneric/bitacora.js create mode 100644 apc-web/src/main/webapp/resources/js/scriptGeneric/dialogGeneric.js create mode 100644 apc-web/src/main/webapp/resources/primefaces-serenity-green/theme.css create mode 100644 apc-web/src/main/webapp/resources/primefaces-serenity-green/theme.scss create mode 100644 apc-web/src/main/webapp/resources/sass/_fonts.scss create mode 100644 apc-web/src/main/webapp/resources/sass/_layout_styles.scss create mode 100644 apc-web/src/main/webapp/resources/sass/_mixins.scss create mode 100644 apc-web/src/main/webapp/resources/sass/_theme_styles.scss create mode 100644 apc-web/src/main/webapp/resources/sass/layout/_dashboard.scss create mode 100644 apc-web/src/main/webapp/resources/sass/layout/_exception.scss create mode 100644 apc-web/src/main/webapp/resources/sass/layout/_horizontal.scss create mode 100644 apc-web/src/main/webapp/resources/sass/layout/_landing.scss create mode 100644 apc-web/src/main/webapp/resources/sass/layout/_layout.scss create mode 100644 apc-web/src/main/webapp/resources/sass/layout/_login.scss create mode 100644 apc-web/src/main/webapp/resources/sass/layout/_main.scss create mode 100644 apc-web/src/main/webapp/resources/sass/layout/_utils.scss create mode 100644 apc-web/src/main/webapp/resources/sass/theme/_common.scss create mode 100644 apc-web/src/main/webapp/resources/sass/theme/_data.scss create mode 100644 apc-web/src/main/webapp/resources/sass/theme/_forms.scss create mode 100644 apc-web/src/main/webapp/resources/sass/theme/_icons.scss create mode 100644 apc-web/src/main/webapp/resources/sass/theme/_media.scss create mode 100644 apc-web/src/main/webapp/resources/sass/theme/_menus.scss create mode 100644 apc-web/src/main/webapp/resources/sass/theme/_messages.scss create mode 100644 apc-web/src/main/webapp/resources/sass/theme/_misc.scss create mode 100644 apc-web/src/main/webapp/resources/sass/theme/_overlays.scss create mode 100644 apc-web/src/main/webapp/resources/sass/theme/_panels.scss create mode 100644 apc-web/src/main/webapp/resources/sass/theme/_theme.scss create mode 100644 apc-web/src/main/webapp/resources/sass/variables/_common.scss create mode 100644 apc-web/src/main/webapp/resources/sass/variables/_layout.scss create mode 100644 apc-web/src/main/webapp/resources/sass/variables/_theme.scss create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/css/grid.css create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/css/layout-green.css create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/css/layout-green.scss create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/css/nanoscroller.css create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/css/ripple.css create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/fonts/MaterialIcons-Regular.eot create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/fonts/MaterialIcons-Regular.ttf create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/fonts/MaterialIcons-Regular.woff create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/fonts/MaterialIcons-Regular.woff2 create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-300.eot create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-300.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-300.ttf create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-300.woff create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-300.woff2 create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-700.eot create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-700.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-700.ttf create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-700.woff create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-700.woff2 create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-regular.eot create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-regular.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-regular.ttf create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-regular.woff create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-regular.woff2 create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/apc_card.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/arrebol.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/avatar.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/avatar1.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/avatar2.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/avatar3.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/avatar4.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/bridge.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/flag-belgium.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/flag-brazil.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/flag-china.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/flag-france.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/flag-uk.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/gradient-waters.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/map.jpg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/sidebar-image.jpg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/usercard.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/weather-icon-1.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/weather-icon-2.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/weather-icon-3.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/weather-icon-4.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/excel-xls-icon.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/exception/401.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/exception/404.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/exception/500(1).svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/exception/500.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/exception/access-bg.jpg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/exception/error-bg(1).jpg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/exception/error-bg.jpg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-apple-green.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-apple-purple.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-donut-red.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-donut-yellow.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-shop-purple.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-shop-yellow.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-taxi-yellow.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/exception/notfound-bg.jpg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-cleancode.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-coffee.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-facebook.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-hours.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-linkedin.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-moderndesign.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-responsive.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-twitter.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-ui.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-welldocumented.svg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/landing/landing-header.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/landing/map-contact.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/login/login-bg.jpg create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/logo-colored.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/logo-slim.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/mapa.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/images/rightmenu-icon.png create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/js/calendar_es.js create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/js/layout.js create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/js/nanoscroller.js create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/js/ripple.js create mode 100644 apc-web/src/main/webapp/resources/serenity-layout/js/swipe.js create mode 100644 apc-ws-rest/hs_err_pid15652.log create mode 100644 apc-ws-rest/nb-configuration.xml create mode 100644 apc-ws-rest/pom.xml create mode 100644 apc-ws-rest/replay_pid15652.log create mode 100644 apc-ws-rest/src/main/java/com/arrebol/apc/ws/administration/ClosingDayWS.java create mode 100644 apc-ws-rest/src/main/java/com/arrebol/apc/ws/administration/SmallBoxWS.java create mode 100644 apc-ws-rest/src/main/java/com/arrebol/apc/ws/cash/CashRegisterWS.java create mode 100644 apc-ws-rest/src/main/java/com/arrebol/apc/ws/cfg/ApplicationCfg.java create mode 100644 apc-ws-rest/src/main/java/com/arrebol/apc/ws/cfg/JsonMoxyConfigurationContextResolver.java create mode 100644 apc-ws-rest/src/main/java/com/arrebol/apc/ws/customer/CustomerWS.java create mode 100644 apc-ws-rest/src/main/java/com/arrebol/apc/ws/employee/EmployeeWS.java create mode 100644 apc-ws-rest/src/main/java/com/arrebol/apc/ws/exchange/ExchangeWS.java create mode 100644 apc-ws-rest/src/main/java/com/arrebol/apc/ws/gasoline/GasolineWS.java create mode 100644 apc-ws-rest/src/main/java/com/arrebol/apc/ws/loan/LoanWS.java create mode 100644 apc-ws-rest/src/main/java/com/arrebol/apc/ws/login/LoginWS.java create mode 100644 apc-ws-rest/src/main/java/com/arrebol/apc/ws/otherexpense/OtherExpenseWS.java create mode 100644 apc-ws-rest/src/main/java/com/arrebol/apc/ws/person/PersonWS.java create mode 100644 apc-ws-rest/src/main/java/com/arrebol/apc/ws/preferences/SystemPreferenceWS.java create mode 100644 apc-ws-rest/src/main/java/com/arrebol/apc/ws/reports/ReportsWS.java create mode 100644 apc-ws-rest/src/main/java/com/arrebol/apc/ws/route/RouteWS.java create mode 100644 apc-ws-rest/src/main/java/com/arrebol/apc/ws/search/SearchWS.java create mode 100644 apc-ws-rest/src/main/java/com/arrebol/apc/ws/user/UserWS.java create mode 100644 apc-ws-rest/src/main/resources/log4j2.xml create mode 100644 apc-ws-rest/src/main/webapp/META-INF/context.xml create mode 100644 apc-ws-rest/src/main/webapp/WEB-INF/beans.xml create mode 100644 apc-ws-rest/src/main/webapp/index.html create mode 100644 apc-ws-rest/src/test/java/com/arrebol/apc/ws/cash/CashRegisterWSTest.java create mode 100644 apc-ws-rest/src/test/java/com/arrebol/apc/ws/customer/CustomerWSTest.java create mode 100644 apc-ws-rest/src/test/java/com/arrebol/apc/ws/customer/employee/EmployeeWSTest.java create mode 100644 apc-ws-rest/src/test/java/com/arrebol/apc/ws/exchange/ExchangeWSTest.java create mode 100644 apc-ws-rest/src/test/java/com/arrebol/apc/ws/loan/LoanWSTest.java create mode 100644 apc-ws-rest/src/test/java/com/arrebol/apc/ws/loan/LoanWithImageWSTest.java create mode 100644 apc-ws-rest/src/test/java/com/arrebol/apc/ws/login/LoginWSTest.java create mode 100644 apc-ws-rest/src/test/java/com/arrebol/apc/ws/preferences/SystemPreferenceWSTest.java create mode 100644 apc-ws-rest/src/test/java/com/arrebol/apc/ws/user/UserWSTest.java create mode 100644 apc-ws-rest/src/test/resources/apc.cfg.xml create mode 100644 apc-ws-rest/src/test/resources/log4j2.xml create mode 100644 apc/nb-configuration.xml create mode 100644 apc/pom.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..43801be --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +/apc-db/nbproject/private/ +/apc-model/target/ +/apc-web/target/ +/apc-layout/target/ +/apc-security/target/ +/apc-controller/target/ diff --git a/apc-controller-mobile/nb-configuration.xml b/apc-controller-mobile/nb-configuration.xml new file mode 100644 index 0000000..a65c451 --- /dev/null +++ b/apc-controller-mobile/nb-configuration.xml @@ -0,0 +1,18 @@ + + + + + + JDK_1.8 + + diff --git a/apc-controller-mobile/pom.xml b/apc-controller-mobile/pom.xml new file mode 100644 index 0000000..764c68a --- /dev/null +++ b/apc-controller-mobile/pom.xml @@ -0,0 +1,80 @@ + + + 4.0.0 + com.arrebol + apc-controller-mobile + 1.0.0 + jar + + UTF-8 + 1.8 + 1.8 + 2.17.0 + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12.4 + + true + + + + + + + + mysql + mysql-connector-java + 8.0.12 + + + + org.apache.logging.log4j + log4j-api + ${log4j.version} + + + org.apache.logging.log4j + log4j-core + ${log4j.version} + + + org.apache.logging.log4j + log4j-slf4j-impl + ${log4j.version} + + + + com.arrebol + apc-model + 1.0.0 + + + + junit + junit + 4.12 + test + + + \ No newline at end of file diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/admin/ClosingDayController.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/admin/ClosingDayController.java new file mode 100644 index 0000000..a983418 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/admin/ClosingDayController.java @@ -0,0 +1,91 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.admin; + +import com.arrebol.apc.controller.mobile.repository.admin.ClosingDayRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.ClosingDayCfg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class ClosingDayController implements Serializable { + + /** + * + * @param idEmployee + * @param idOffice + * @return + * @throws Exception + */ + public String findIdClosingDayByEmployee(String idEmployee, String idOffice) throws Exception { + try { + ClosingDayRepository repository = new ClosingDayRepository(); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(ClosingDayCfg.FIELD_USER, new User(idEmployee))); + parameters.add(new ModelParameter(ClosingDayCfg.FIELD_OFFICE, new Office(idOffice))); + + return repository.findIdEntity(ClosingDayCfg.QUERY_FIND_ID_BY_EMPLOYEE_AND_OFFICE_EQUALS_CURRDATE, parameters); + } catch (Exception e) { + logger.error("findIdClosingDayByEmployee", e); + throw e; + } + } + + /** + * + * @param id + * @param updatedBy + * @return + * @throws Exception + */ + public boolean disableClosingDayById(String id, String updatedBy) throws Exception { + try { + ClosingDayRepository repository = new ClosingDayRepository(); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(ClosingDayCfg.FIELD_ID, id)); + parameters.add(new ModelParameter(ClosingDayCfg.FIELD_ACTIVE_STATUS, ActiveStatus.DISABLED)); + parameters.add(new ModelParameter(ClosingDayCfg.FIELD_LAST_UPDATED_BY, updatedBy)); + parameters.add(new ModelParameter(ClosingDayCfg.FIELD_LAST_UPDATED_ON, new Date())); + + return repository.updateClosingDay(ClosingDayCfg.QUERY_UPDATE_CLOSING_DAY_BY_STATUS, parameters); + } catch (Exception e) { + logger.error("disableClosingDayById", e); + throw e; + } + } + + public Long countIdClosingDayByEmployee(String idEmployee, String idOffice) throws Exception { + try { + ClosingDayRepository repository = new ClosingDayRepository(); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(ClosingDayCfg.FIELD_USER, new User(idEmployee))); + parameters.add(new ModelParameter(ClosingDayCfg.FIELD_OFFICE, new Office(idOffice))); + + return repository.countIdClosingDayByEmployee(ClosingDayCfg.QUERY_FIND_ID_BY_EMPLOYEE_AND_OFFICE_EQUALS_CURRDATE, parameters); + } catch (Exception e) { + logger.error("findIdClosingDayByEmployee", e); + throw e; + } + } + + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/admin/StableGeneralBoxController.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/admin/StableGeneralBoxController.java new file mode 100644 index 0000000..fa17a49 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/admin/StableGeneralBoxController.java @@ -0,0 +1,46 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.admin; + +import com.arrebol.apc.controller.mobile.repository.admin.StableGeneralBoxRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.StableGeneralBoxCfg; +import com.arrebol.apc.model.core.Office; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class StableGeneralBoxController implements Serializable { + + /** + * + * @param idOffice + * @return + * @throws Exception + */ + public boolean existStableGeneralBoxByCreatedOn(String idOffice) throws Exception { + try { + StableGeneralBoxRepository repository = new StableGeneralBoxRepository(); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(StableGeneralBoxCfg.FIELD_OFFICE, new Office(idOffice))); + + return new Long(1).compareTo(repository.countStableGeneralBoxByOfficeEqualsToCurrentDate(StableGeneralBoxCfg.QUERY_COUNT_STABLE_GENERAL_BOX_BY_OFFICE_EQUALS_TO_CURRENT_DATE, parameters)) == 0; + } catch (Exception e) { + logger.error("existStableSmallBoxByCreatedOn", e); + throw e; + } + } + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/admin/StableSmallBoxController.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/admin/StableSmallBoxController.java new file mode 100644 index 0000000..be3c449 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/admin/StableSmallBoxController.java @@ -0,0 +1,95 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.admin; + +import com.arrebol.apc.controller.mobile.repository.admin.ClosingDayRepository; +import com.arrebol.apc.controller.mobile.repository.admin.StableSmallBoxRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.StableSmallBoxCfg; +import com.arrebol.apc.model.admin.constance.StableSmallBoxCfg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class StableSmallBoxController implements Serializable { + + /** + * + * @param id + * @param updatedBy + * @return + * @throws Exception + */ + public boolean disableIdSmallBoxById(String id, String updatedBy) throws Exception { + try { + ClosingDayRepository repository = new ClosingDayRepository(); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(StableSmallBoxCfg.FIELD_ID, id)); + parameters.add(new ModelParameter(StableSmallBoxCfg.FIELD_ACTIVE_STATUS, ActiveStatus.DISABLED)); + parameters.add(new ModelParameter(StableSmallBoxCfg.FIELD_LAST_UPDATED_BY, updatedBy)); + parameters.add(new ModelParameter(StableSmallBoxCfg.FIELD_LAST_UPDATED_ON, new Date())); + + return repository.updateClosingDay(StableSmallBoxCfg.QUERY_UPDATE_STABLE_SMALL_BOX_BY_STATUS, parameters); + } catch (Exception e) { + logger.error("disableIdSmallBoxById", e); + throw e; + } + } + + /** + * + * @param idOffice + * @return + * @throws Exception + */ + public boolean existStableSmallBoxByCreatedOn(String idOffice) throws Exception { + try { + StableSmallBoxRepository repository = new StableSmallBoxRepository(); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(StableSmallBoxCfg.FIELD_OFFICE, new Office(idOffice))); + + return new Long(1).compareTo(repository.countStableSmallBoxByOfficeEqualsToCurrentDate(StableSmallBoxCfg.QUERY_COUNT_STABLE_SMALL_BOX_BY_OFFICE_EQUALS_TO_CURDATE, parameters)) == 0; + } catch (Exception e) { + logger.error("existStableSmallBoxByCreatedOn", e); + throw e; + } + } + + /** + * + * @param idOffice + * @return + * @throws Exception + */ + public String findIdStableSmallBoxByOfficeInCurrentDate(String idOffice) throws Exception { + try { + ClosingDayRepository repository = new ClosingDayRepository(); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(StableSmallBoxCfg.FIELD_OFFICE, new Office(idOffice))); + + return repository.findIdEntity(StableSmallBoxCfg.QUERY_FIND_STABLE_SMALL_BOX_BY_OFFICE_EQUALS_TO_CURRENT_DATE, parameters); + } catch (Exception e) { + logger.error("findIdStableSmallBoxByOfficeInCurrentDate", e); + throw e; + } + } + + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/bitacora/BitacoraController.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/bitacora/BitacoraController.java new file mode 100644 index 0000000..d1c0334 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/bitacora/BitacoraController.java @@ -0,0 +1,59 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.bitacora; + +import com.arrebol.apc.controller.mobile.repository.bitacora.BitacoraRepository; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.system.logs.Bitacora; +import java.io.Serializable; +import java.util.Date; +import java.util.UUID; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class BitacoraController implements Serializable { + + /** + * + * @param action + * @param userName + * @param comments + * @param createdBy + * @param office + * @param description + * @return + */ + public boolean insertBitacoraRecord(String action, String userName, String comments, String createdBy, String office, String description) { + boolean success; + try { + BitacoraRepository repository = new BitacoraRepository(); + Bitacora bitacora = new Bitacora(); + + bitacora.setId(UUID.randomUUID().toString()); + bitacora.setNameUser(userName); + bitacora.setAction(action); + bitacora.setCommentsUser(comments); + bitacora.setCreatedBy(createdBy); + bitacora.setCreatedOn(new Date()); + bitacora.setOffice(new Office(office)); + bitacora.setDescription(description); + + success = repository.saveBitacora(bitacora); + } catch (Exception e) { + success = false; + logger.error("insertBitacoraRecord", e); + } + return success; + } + + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/cash/CashRegisterCurdateByUserController.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/cash/CashRegisterCurdateByUserController.java new file mode 100644 index 0000000..4747225 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/cash/CashRegisterCurdateByUserController.java @@ -0,0 +1,107 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.cash; + +import com.arrebol.apc.controller.mobile.repository.views.CashRegisterCurdateByUserViewRepository; +import com.arrebol.apc.controller.mobile.repository.views.TotalCashByCurdateViewRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.core.constance.CashRegisterCurdateByUserViewCfg; +import com.arrebol.apc.model.views.CashRegisterCurdateByUserView; +import com.arrebol.apc.model.views.TotalCashByCurdateView; +import com.arrebol.apc.model.ws.parsed.AmountJaxb; +import com.arrebol.apc.model.ws.parsed.CashRegisterJaxb; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class CashRegisterCurdateByUserController implements Serializable { + + /** + * + * @param userId + * @return + * @throws Exception + */ + public CashRegisterJaxb findAllCashRegisterCurdateByUserId(String userId) throws Exception { + logger.debug("findAllCashRegisterCurdateByUserId"); + try { + List parameters = new ArrayList<>(); + + parameters.add( + new ModelParameter( + CashRegisterCurdateByUserViewCfg.FIELD_USER_ID, + userId + ) + ); + + Double totalCash = 0d; + List amounts = new ArrayList<>(); + + List results = cashRegisterCurdateByUserViewRepository.findAllCashRegisterCurdateByUserId( + CashRegisterCurdateByUserView.class, + CashRegisterCurdateByUserViewCfg.QUERY_FIND_CASH_REGISTER, + parameters); + + for (CashRegisterCurdateByUserView result : results) { + totalCash += result.getPayment().doubleValue(); + + amounts.add( + new AmountJaxb( + result.getCustomerName(), + result.getPayment().doubleValue() + ) + ); + } + + return new CashRegisterJaxb(totalCash, amounts); + } catch (Exception e) { + logger.error("findAllCashRegisterCurdateByUserId", e); + throw e; + } + } + + /** + * + * @param userId + * @return + * @throws Exception + */ + public TotalCashByCurdateView findDailyTotalsByUserId(String userId) throws Exception { + logger.debug("findById"); + try { + TotalCashByCurdateView result = totalCashByCurdateViewRepository.findById(userId); + + if (null == result) { + throw new NullPointerException("userId: " + userId + " NOT found"); + } else { + return result; + } + } catch (Exception e) { + logger.error("findById", e); + throw e; + } + } + + private static final long serialVersionUID = -3434981661467291172L; + final Logger logger = LogManager.getLogger(CashRegisterCurdateByUserController.class); + + private final CashRegisterCurdateByUserViewRepository cashRegisterCurdateByUserViewRepository; + private final TotalCashByCurdateViewRepository totalCashByCurdateViewRepository; + + public CashRegisterCurdateByUserController() { + this.cashRegisterCurdateByUserViewRepository = new CashRegisterCurdateByUserViewRepository(); + this.totalCashByCurdateViewRepository = new TotalCashByCurdateViewRepository(); + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/customer/CustomerController.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/customer/CustomerController.java new file mode 100644 index 0000000..74734ae --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/customer/CustomerController.java @@ -0,0 +1,63 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.customer; + +import com.arrebol.apc.controller.mobile.repository.views.LoanByUserViewRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.core.constance.LoanByUserViewCfg; +import com.arrebol.apc.model.enums.PreferenceValue; +import com.arrebol.apc.model.views.LoanByUserView; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class CustomerController implements Serializable { + + /** + * + * @param orderList + * @param userId + * @return + * @throws Exception + */ + public List findAllLoansByUserId(String orderList, String userId) throws Exception { + try { + List parameters = new ArrayList<>(); + + boolean isByOrderInList = PreferenceValue.ORDER_IN_LIST.toString().equals(orderList); + + parameters.add(new ModelParameter(LoanByUserViewCfg.FIELD_USER_ID, userId)); + + return loanByUserViewRepository + .findAllLoansByUserId( + isByOrderInList + ? LoanByUserViewCfg.QUERY_FIND_ALL_LOAN_BY_USER_ID_BY_ORDER_LIST + : LoanByUserViewCfg.QUERY_FIND_ALL_LOAN_BY_USER_ID_BY_CUSTOMER_NAME, + parameters + ); + } catch (Exception e) { + logger.error("findAllLoansByUserId", e); + throw e; + } + } + + private static final long serialVersionUID = -6689182942800786108L; + final Logger logger = LogManager.getLogger(CustomerController.class); + + private final LoanByUserViewRepository loanByUserViewRepository; + + public CustomerController() { + this.loanByUserViewRepository = new LoanByUserViewRepository(); + } +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/exchange/ExchangeEnebledUsersController.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/exchange/ExchangeEnebledUsersController.java new file mode 100644 index 0000000..abdf1aa --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/exchange/ExchangeEnebledUsersController.java @@ -0,0 +1,165 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.exchange; + +import com.arrebol.apc.controller.mobile.repository.admin.TransferRepository; +import com.arrebol.apc.controller.mobile.repository.views.ExchangeEnebledUsersViewRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.Transfer; +import com.arrebol.apc.model.admin.constance.TransferCfg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.core.constance.ExchangeEnebledUsersViewCfg; +import com.arrebol.apc.model.enums.ActionStatus; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.views.ExchangeEnebledUsersView; +import com.arrebol.apc.model.ws.parsed.Exchange; +import com.arrebol.apc.model.ws.parsed.ExchangeJaxb; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class ExchangeEnebledUsersController implements Serializable { + + /** + * + * @param userId + * @param officeId + * @return + * @throws Exception + */ + public List findEnebledUsersToUserId(String userId, String officeId) throws Exception { + logger.debug("exchangeEnebledUsersViewRepository"); + try { + List parameters = new ArrayList<>(); + + parameters.add( + new ModelParameter( + ExchangeEnebledUsersViewCfg.PARAM_OFFICE_ID, + officeId + ) + ); + + parameters.add( + new ModelParameter( + ExchangeEnebledUsersViewCfg.FIELD_VIEW_ID, + userId + ) + ); + + return exchangeEnebledUsersViewRepository.findEnebledUsersToUserId( + ExchangeEnebledUsersViewCfg.QUERY_FIND_ENEBLED_USERS_TO_USER_ID, + parameters + ); + } catch (Exception e) { + logger.error("findEnebledUsersToUserId", e); + throw e; + } + } + + /** + * + * @param jaxb + * @return + * @throws Exception + */ + public boolean newExchange(ExchangeJaxb jaxb) throws Exception { + logger.debug("newExchange"); + try { + Transfer transfer = new Transfer( + new User(jaxb.getSenderId()), + new User(jaxb.getReceiverId()), + ActiveStatus.ENEBLED, + ActionStatus.PENDING, + jaxb.getAmount(), + new Office(jaxb.getOfficeId()), + jaxb.getSenderId()); + + return transferRepository.addTransfer(transfer); + } catch (Exception e) { + logger.error("newExchange", e); + throw e; + } + } + + /** + * + * @param transerId + * @param userId + * @param isApproved + * @return + * @throws Exception + */ + public boolean updateExchange(String transerId, String userId, boolean isApproved) throws Exception { + logger.debug("updateExchange"); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(TransferCfg.FIELD_ACTION_STATUS, isApproved ? ActionStatus.APPROVED : ActionStatus.REJECTED)); + parameters.add(new ModelParameter(TransferCfg.FIELD_LAST_UPDATED_BY, userId)); + parameters.add(new ModelParameter(TransferCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(TransferCfg.FIELD_ID, transerId)); + + return transferRepository.updateTransfer(TransferCfg.QUERY_UPDATE_TRANSFER_BY_ACTION, parameters); + } catch (Exception e) { + logger.error("updateExchange", e); + throw e; + } + } + + /** + * + * @param userId + * @return + * @throws Exception + */ + public List exchangesByUsers(String userId) throws Exception { + logger.debug("exchangesByUsers"); + try { + List parameters = new ArrayList<>(); + + parameters.add( + new ModelParameter( + TransferCfg.FIELD_USER_TRANSMITTER, + new User(userId) + ) + ); + + parameters.add( + new ModelParameter( + TransferCfg.FIELD_USER_RECEIVER, + new User(userId) + ) + ); + + return transferRepository.findAllTransferByUserIdAndCurdate(TransferCfg.QUERY_FIND_ALL_TRANSFER_BY_USER_ID_AND_CURDATE, parameters); + } catch (Exception e) { + logger.error("exchangesByUsers", e); + throw e; + } + } + + private static final long serialVersionUID = 2625775904919860613L; + final Logger logger = LogManager.getLogger(ExchangeEnebledUsersController.class); + + private final ExchangeEnebledUsersViewRepository exchangeEnebledUsersViewRepository; + private final TransferRepository transferRepository; + + public ExchangeEnebledUsersController() { + this.exchangeEnebledUsersViewRepository = new ExchangeEnebledUsersViewRepository(); + this.transferRepository = new TransferRepository(); + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/gasoline/GasolineController.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/gasoline/GasolineController.java new file mode 100644 index 0000000..282ac51 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/gasoline/GasolineController.java @@ -0,0 +1,41 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.gasoline; + +import com.arrebol.apc.controller.mobile.repository.gasoline.GasolineRepository; +import com.arrebol.apc.model.gasoline.Gasoline; +import java.io.Serializable; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class GasolineController implements Serializable { + + /** + * + * @param gasoline + * @return + * @throws Exception + */ + public boolean saveNewGasolinePayment(Gasoline gasoline) throws Exception { + try { + GasolineRepository gasolineRepository = new GasolineRepository(); + + return gasolineRepository.saveNewGasolinePayment(gasoline); + } catch (Exception e) { + logger.error("addNewGasolineEntry", e); + throw e; + } + } + + private static final long serialVersionUID = -5280895557294295000L; + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/loan/LoanController.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/loan/LoanController.java new file mode 100644 index 0000000..fcbceab --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/loan/LoanController.java @@ -0,0 +1,1398 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.loan; + +import com.arrebol.apc.controller.mobile.json.loan.AuthorizeTransferList; +import com.arrebol.apc.controller.mobile.json.loan.AuthorizeTransferPaymentsDto; +import com.arrebol.apc.controller.mobile.json.loan.DeleteLoanDetailsJaxb; +import com.arrebol.apc.model.ws.parsed.LoanRequestedJaxb; +import com.arrebol.apc.controller.mobile.json.loan.LoanTypeJaxb; +import com.arrebol.apc.controller.mobile.json.loan.LoanTypeListJaxb; +import com.arrebol.apc.controller.mobile.json.loan.UpdateLoanToDeliveryStatusDTO; +import com.arrebol.apc.controller.mobile.json.loan.UpdateLoanToDeliveryStatusList; +import com.arrebol.apc.controller.mobile.repository.loan.AddAmountRepository; +import com.arrebol.apc.controller.mobile.repository.loan.LoanByRenovationRepository; +import com.arrebol.apc.controller.mobile.repository.loan.LoanDetailsRepository; +import com.arrebol.apc.controller.mobile.repository.loan.LoanFeeNotificationRepository; +import com.arrebol.apc.controller.mobile.repository.loan.LoanRepository; +import com.arrebol.apc.controller.mobile.repository.loan.LoanToDeliveryByCertifierRepository; +import com.arrebol.apc.controller.mobile.repository.loan.LoanTypeRepository; +import com.arrebol.apc.controller.mobile.repository.user.UserRepository; +import com.arrebol.apc.controller.mobile.repository.views.LoanApprovedDetailViewRepository; +import com.arrebol.apc.controller.mobile.repository.views.LoanInPendingStatusToDeliveryViewRepository; +import com.arrebol.apc.controller.mobile.repository.views.SearchPersonAvailableRepository; +import com.arrebol.apc.controller.mobile.repository.views.TransferInPendingStatusViewRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.core.constance.AvailableCustomersViewCfg; +import com.arrebol.apc.model.core.constance.AvailableEndorsementsViewCfg; +import com.arrebol.apc.model.core.constance.LoanByUserCfg; +import com.arrebol.apc.model.core.constance.LoanCfg; +import com.arrebol.apc.model.core.constance.LoanDetailsCfg; +import com.arrebol.apc.model.core.constance.LoanFeeNotificationCfg; +import com.arrebol.apc.model.core.constance.LoanToDeliveryByCertifierViewCfg; +import com.arrebol.apc.model.core.constance.LoanTypeCfg; +import com.arrebol.apc.model.core.constance.UserCfg; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.ComissionType; +import com.arrebol.apc.model.enums.LoanDetailsType; +import com.arrebol.apc.model.enums.LoanStatus; +import com.arrebol.apc.model.enums.OwnerLoan; +import com.arrebol.apc.model.enums.PeopleType; +import com.arrebol.apc.model.enums.TransferStatus; +import com.arrebol.apc.model.loan.Delivery; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.loan.LoanByRenovation; +import com.arrebol.apc.model.loan.LoanByUser; +import com.arrebol.apc.model.loan.LoanByUserId; +import com.arrebol.apc.model.loan.LoanDetails; +import com.arrebol.apc.model.loan.LoanFeeNotification; +import com.arrebol.apc.model.loan.LoanType; +import com.arrebol.apc.model.views.AvailableCustomersView; +import com.arrebol.apc.model.views.AvailableEndorsementsView; +import com.arrebol.apc.model.views.LoanInPendingStatusToDeliveryView; +import com.arrebol.apc.model.views.LoanToDeliveryByCertifierView; +import com.arrebol.apc.model.views.TransferInPendingStatusView; +import com.arrebol.apc.model.views.constance.LoanInPendingStatusToDeliveryViewCfg; +import com.arrebol.apc.model.views.constance.TransferInPendingStatusViewCfg; +import com.arrebol.apc.model.ws.parsed.FeesToPayByLoanRequestJaxb; +import com.arrebol.apc.model.ws.parsed.LoanDetailJaxb; +import com.arrebol.apc.model.ws.parsed.NewAmountJaxb; +import com.arrebol.apc.model.ws.parsed.NewTransferAccountJaxb; +import com.arrebol.apc.model.ws.parsed.PersonJaxb; +import java.io.Serializable; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.NumberFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.UUID; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class LoanController implements Serializable { + + /** + * + * @param loanIdToUpdate + * @return + */ + public boolean deleteLoanDetailsFeeByLoanCurdate(String loanIdToUpdate) { + logger.debug("deleteLoanDetailsFeeByLoanCurdate"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanCfg.FIELD_DETAILS_LOAN, new Loan(loanIdToUpdate))); + return loanRepository.deleteLoanDetailsByLoanCurdate(LoanCfg.QUERY_DELETE_LOAN_DETAILS_FEE_CURDATE_BY_LOAN, parameters); + } + + /** + * + * @param loanIdToUpdate + * @return + */ + public boolean deleteLoanFeeNotificationByLoanCurdate(String loanIdToUpdate) { + logger.debug("deleteLoanFeeNotificationByLoanCurdate"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanCfg.FIELD_DETAILS_LOAN, new Loan(loanIdToUpdate))); + + return loanRepository.deleteLoanDetailsByLoanCurdate(LoanCfg.QUERY_DELETE_LOAN_FEE_NOTIFICATION_CURDATE_BY_LOAN, parameters); + } + + /** + * + * @param loan + * @return + * @throws Exception + */ + public boolean updateLoan(Loan loan) throws Exception { + logger.debug("updateLoan"); + try { + return loanRepository.updateLoan(loan); + } catch (Exception e) { + logger.error("updateLoan", e); + throw e; + } + } + + /** + * + * @param loanIdToUpdate + * @return + */ + public boolean deleteLoanDetailsByLoanCurdate(Loan loanIdToUpdate) { + logger.debug("updateLoandByUserByUserId"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanCfg.FIELD_DETAILS_LOAN, loanIdToUpdate)); + + return loanRepository.deleteLoanDetailsByLoanCurdate(LoanCfg.QUERY_DELETE_LOAN_DETAILS_CURDATE_BY_LOAN, parameters); + } + + /** + * + * @param customerId + * @param userId + * @return + * @throws Exception + */ + public DeleteLoanDetailsJaxb enebleToDeleteTodayDetails(String customerId, String userId) throws Exception { + DeleteLoanDetailsJaxb result; + try { + List parameters = new ArrayList<>(); + List statuses = new ArrayList<>(); + + parameters.add(new ModelParameter(UserCfg.FIELD_ID, userId)); + UserRepository userRepository = new UserRepository(); + + if (userRepository.containtsUserManagementProperty(UserCfg.QUERY_IS_USER_MANAGMENT, parameters)) { + statuses.add(LoanStatus.APPROVED); + statuses.add(LoanStatus.PENDING_RENOVATION); + + parameters.clear(); + parameters.add(new ModelParameter(LoanCfg.FIELD_CUSTOMER, new People(customerId))); + parameters.add(new ModelParameter(LoanCfg.FIELD_LOAN_STATUS, statuses)); + + if (1 == loanRepository.countLoan(LoanCfg.QUERY_COUNT_LOAN_BY_CUSTOMER_IN_STATUSES, parameters)) { + String loanId = loanRepository.findLoanId(LoanCfg.QUERY_SELECT_LOAN_ID_BY_CUSTOMER_IN_STATUSES, parameters); + + result = new DeleteLoanDetailsJaxb(Boolean.FALSE, Boolean.FALSE, loanId); + List types = new ArrayList<>(); + + parameters.clear(); + parameters.add(new ModelParameter(LoanCfg.FIELD_ID, loanId)); + parameters.add(new ModelParameter(LoanCfg.FIELD_LOAN_STATUS, statuses)); + + result.setApprovedOrPendingRenovation(0 < loanRepository.countLoan(LoanCfg.QUERY_COUNT_LOAN_IN_STATUSES, parameters)); + + if (result.getApprovedOrPendingRenovation()) { + types.add(LoanDetailsType.PAYMENT); + types.add(LoanDetailsType.TRANSFER); + + parameters.clear(); + parameters.add(new ModelParameter(LoanDetailsCfg.FIELD_ID_LOAN, new Loan(loanId))); + parameters.add(new ModelParameter(LoanDetailsCfg.FIELD_LOAN_DETAILS_TYPE, types)); + + result.setTodayPayment(0 < loanDetailsRepository.countLoandDetails(LoanDetailsCfg.QUERY_COUNT_LOAN_DETAILS_IN_CURRDATE, parameters)); + + types.clear(); + types.add(LoanDetailsType.FEE); + + parameters.clear(); + parameters.add(new ModelParameter(LoanDetailsCfg.FIELD_ID_LOAN, new Loan(loanId))); + parameters.add(new ModelParameter(LoanDetailsCfg.FIELD_LOAN_DETAILS_TYPE, types)); + + result.setTodayFee(0 < loanDetailsRepository.countLoandDetails(LoanDetailsCfg.QUERY_COUNT_LOAN_DETAILS_IN_CURRDATE, parameters)); + } + } else { + result = new DeleteLoanDetailsJaxb(Boolean.FALSE, Boolean.FALSE, Boolean.FALSE, ""); + } + } else { + result = new DeleteLoanDetailsJaxb(Boolean.FALSE, Boolean.FALSE, Boolean.FALSE, ""); + } + + return result; + } catch (Exception e) { + logger.error("enebleToDeleteTodayDetails", e); + throw e; + } + } + + /** + * + * @param idLoan + * @return + * @throws Exception + */ + public List findFeesToPayByLoanId(String idLoan) throws Exception { + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanDetailsCfg.FIELD_ID_LOAN, new Loan(idLoan))); + return loanDetailsRepository.findFeesToPayByLoanId(LoanDetailsCfg.QUERY_FIND_ALL_FEES_BY_LOAN_ID, parameters); + } catch (Exception e) { + logger.error("findFeesToPayByLoanId", e); + throw e; + } + } + + /** + * + * @param feesToPayByLoanRequestJaxb + * @return + * @throws Exception + */ + public boolean updatePaidFeesStatusInLoanDetailIds(FeesToPayByLoanRequestJaxb feesToPayByLoanRequestJaxb) throws Exception { + try { + List parameters = new ArrayList<>(); + + List ids = new ArrayList<>(); + + feesToPayByLoanRequestJaxb.getFeeToPayList().forEach(fee -> { + ids.add(fee.getId()); + }); + + int cantidad = feesToPayByLoanRequestJaxb.getFeeToPayList().size(); + String texto; + String precio; + + Locale canada = new Locale("en", "CA"); + NumberFormat dollarFormat = NumberFormat.getCurrencyInstance(canada); + BigDecimal feePayment; + + if (1 == cantidad) { + precio = dollarFormat.format(50); + feePayment = new BigDecimal("50"); + + texto = " de la multa del " + feesToPayByLoanRequestJaxb.getFeeToPayList().get(0).getStrDateToPay(); + } else { + feePayment = new BigDecimal(50 * cantidad); + precio = dollarFormat.format(50 * cantidad); + String fechas = ""; + + for (int i = 0; i < feesToPayByLoanRequestJaxb.getFeeToPayList().size(); i++) { + fechas = fechas + feesToPayByLoanRequestJaxb.getFeeToPayList().get(i).getStrDateToPay(); + if (feesToPayByLoanRequestJaxb.getFeeToPayList().size() > 1) { + fechas = fechas + ","; + } + } + + if (feesToPayByLoanRequestJaxb.getFeeToPayList().size() > 1) { + fechas = fechas.substring(0, fechas.length() - 1); + } + + texto = " de las multas " + fechas; + } + + String comments = "Se pago " + precio + texto; + + LoanDetails details = new LoanDetails( + UUID.randomUUID().toString(), + new Loan(feesToPayByLoanRequestJaxb.getIdLoan()), + new User(feesToPayByLoanRequestJaxb.getIdUser()), + PeopleType.CUSTOMER, + 0, + feePayment, + LoanDetailsType.PAYMENT, + comments, + feesToPayByLoanRequestJaxb.getIdUser(), + new Date()); + + parameters.add(new ModelParameter(LoanDetailsCfg.FIELD_ID, ids)); + + return loanDetailsRepository.updatePaidFeesStatusInLoanDetailIds(LoanDetailsCfg.QUERY_UPDATE_PAID_FEES_STATUS_IN_LOAN_DETAILS_IDS, parameters, details); + } catch (Exception e) { + logger.error("updatePaidFeesStatusInLoanDetailIds", e); + throw e; + } + } + + /** + * + * @param officeId + * @return + * @throws Exception + */ + public LoanTypeListJaxb findAllLoanTypeByOffice(String officeId) throws Exception { + logger.debug("findAllLoanTypeByOffice"); + LoanTypeListJaxb loanTypeListJaxb = new LoanTypeListJaxb(); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanTypeCfg.FIELD_OFFICE, new Office(officeId))); + + List results = loanTypeRepository.findAllLoanTypeByOffice(LoanTypeCfg.QUERY_FIND_ALL_LOAN_TYPE_WITH_DESCRIPTION_BY_OFFICE, parameters); + List loanTypeJaxbs = new ArrayList<>(); + + results.forEach((result) -> { + loanTypeJaxbs.add(new LoanTypeJaxb(result.getId(), result.getPayment(), result.getLoanTypeName())); + }); + + loanTypeListJaxb.setLoans(loanTypeJaxbs); + + return loanTypeListJaxb; + } catch (Exception e) { + logger.error("findAllLoanTypeByOffice", e); + throw e; + } + } + + /** + * + * @param name + * @return + * @throws Exception + */ + public List findAllAvailableCustomersByType(String name) throws Exception { + logger.debug("findAllAvailableCustomersByType"); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(AvailableCustomersViewCfg.FIELD_AVAILABLE_PERSON, name)); + + return searchPersonAvailableRepository.findAvailablePersonLike( + AvailableCustomersView.class, + AvailableCustomersViewCfg.QUERY_FIND_AVAILABLE_CUSTOMERS, + parameters); + } catch (Exception e) { + logger.error("findAllAvailableCustomersByType", e); + throw e; + } + } + + /** + * + * @param name + * @return + * @throws Exception + */ + public List findAllAvailableEndorsementsByType(String name) throws Exception { + logger.debug("findAllAvailableEndorsementsByType"); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(AvailableEndorsementsViewCfg.FIELD_AVAILABLE_PERSON, name)); + + return searchPersonAvailableRepository.findAvailablePersonLike( + AvailableEndorsementsView.class, + AvailableEndorsementsViewCfg.QUERY_FIND_AVAILABLE_ENDORSEMENTS, + parameters); + } catch (Exception e) { + logger.error("findAllAvailableEndorsementsByType", e); + throw e; + } + } + + /** + * + * @param jaxb + * @return + * @throws Exception + */ + synchronized public boolean createLoan(LoanRequestedJaxb jaxb) throws Exception { + logger.debug("createLoan"); + + try { + + if (!jaxb.getCustomer().isCreatePerson() + && !verifyPersonAvailability( + AvailableCustomersView.class, + jaxb.getCustomer().getId() + )) { + throw new Exception(user_unavailable); + } + + if (!jaxb.getEndorsement().isCreatePerson() + && !verifyPersonAvailability( + AvailableEndorsementsView.class, + jaxb.getEndorsement().getId() + )) { + throw new Exception(user_unavailable); + } + +//DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date();//dateFormat.parse(jaxb.getStrDate()); + + LoanByUser loanByUser = new LoanByUser( + new LoanByUserId(null, jaxb.getUserId()), + LoanStatus.PENDING, + OwnerLoan.CURRENT_OWNER, + jaxb.getUserId()); + + LoanType loanType = loanTypeRepository.findLoanType(jaxb.getLoanTypeId()); + RouteCtlg routeCtlg = new RouteCtlg(jaxb.getRouteId()); + + Loan loan = new Loan( + new LoanType(loanType.getId()), + null, + null, + routeCtlg, + LoanStatus.PENDING, + BigDecimal.ZERO, + loanType.getPaymentTotal(), + 0, + jaxb.getUserId(), + date, + jaxb.getCustomer().isCreatePerson() ? ActiveStatus.ENEBLED : ActiveStatus.DISABLED, + ActiveStatus.DISABLED // FROZEN funcationality + ); + return loanRepository.createLoan( + loan, + loanByUser, + jaxb); + } catch (Exception e) { + logger.error("createLoan", e); + throw e; + } + } + + /** + * + * @param newAmountJaxb + * @return + * @throws Exception + */ + public boolean saveNewAmount(NewAmountJaxb newAmountJaxb) throws Exception { + logger.debug("saveNewAmount"); + + LoanFeeNotification notification = null; + try { + //DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date();//dateFormat.parse(newAmountJaxb.getStrDate()); + List parameters = new ArrayList<>(); + + if (newAmountJaxb.isFee()) { + parameters.add( + new ModelParameter( + LoanFeeNotificationCfg.FIELD_LOAN, + new Loan(newAmountJaxb.getLoanId()) + ) + ); + + Long total = loanFeeNotificationRepository.countNotificationByLoanId( + Long.class, + LoanFeeNotificationCfg.QUERY_COUNT_NOTIFICATION_BY_LOAN_ID, + parameters); + + notification = new LoanFeeNotification( + new Loan(newAmountJaxb.getLoanId()), + new User(newAmountJaxb.getUserId()), + (total.intValue() + 1), + newAmountJaxb.getUserId(), + date + ); + } + + if (newAmountJaxb.isFee() && null == notification) { + throw new Exception("Could not create the notification for the loan " + newAmountJaxb.getLoanId()); + } + + Loan loan = loanRepository.findLoanById(newAmountJaxb.getLoanId()); + int referenceNumber = loan.getLastReferenceNumber() + 1; + + LoanDetails loanDetails = new LoanDetails( + new Loan(newAmountJaxb.getLoanId()), + new User(newAmountJaxb.getUserId()), + newAmountJaxb.isCustomer() ? PeopleType.CUSTOMER : PeopleType.ENDORSEMENT, + newAmountJaxb.getAmount(), + referenceNumber, + newAmountJaxb.isFee() ? LoanDetailsType.FEE : LoanDetailsType.PAYMENT, + newAmountJaxb.getUserId(), + date, + newAmountJaxb.getComments() + ); + + BigDecimal newAmountPaid, newAmountToPay; + + if (newAmountJaxb.isFee()) { + newAmountPaid = loan.getAmountPaid(); + newAmountToPay = loan.getAmountToPay().add(newAmountJaxb.getAmount()); + } else { + newAmountPaid = loan.getAmountPaid().add(newAmountJaxb.getAmount()); + newAmountToPay = loan.getAmountToPay(); + } + + parameters.clear(); + + String query = LoanCfg.QUERY_UPDATE_LOAN_BY_ID; + + if (!newAmountJaxb.isFee() && 0 == loan.getAmountToPay().compareTo(newAmountPaid)) { + parameters.add(new ModelParameter(LoanCfg.FIELD_LOAN_STATUS, LoanStatus.FINISH)); + + query = LoanCfg.QUERY_UPDATE_AND_FINISH_LOAN_BY_ID; + } + + parameters.add(new ModelParameter(LoanCfg.FIELD_AMOUNT_PAID, newAmountPaid)); + parameters.add(new ModelParameter(LoanCfg.FIELD_AMOUNT_TO_PAY, newAmountToPay)); + parameters.add(new ModelParameter(LoanCfg.FIELD_LAST_REFERENCE_NUMBER, referenceNumber)); + parameters.add(new ModelParameter(LoanCfg.FIELD_LAST_UPDATED_BY, newAmountJaxb.getUserId())); + parameters.add(new ModelParameter(LoanCfg.FIELD_LAST_UPDATED_ON, date)); + parameters.add(new ModelParameter(LoanCfg.FIELD_ID, newAmountJaxb.getLoanId())); + + return addAmountRepository.saveNewAmount(notification, loanDetails, query, parameters); + } catch (Exception e) { + logger.error("saveNewAmount", e); + throw e; + } + } + + /** + * + * @param transfer + * @return + * @throws Exception + */ + public boolean saveNewTransferAmount(NewTransferAccountJaxb transfer) throws Exception { + logger.debug("saveNewTransferAmount"); + + LoanFeeNotification notification = null; + try { + Date date = new Date(); + List parameters = new ArrayList<>(); + + Loan loan = loanRepository.findLoanById(transfer.getLoanId()); + int referenceNumber = loan.getLastReferenceNumber() + 1; + + BigDecimal amountWithoutIVA = transfer.getAmount().divide(new BigDecimal(1.16)); + + amountWithoutIVA = amountWithoutIVA.setScale(2, RoundingMode.FLOOR); + + StringBuilder comments = new StringBuilder(transfer.getComments()); + + comments.append(". Monto de transferencia con IVA: $"); + comments.append(transfer.getAmount()); + comments.append(", monto de transferencia sin IVA: $"); + comments.append(amountWithoutIVA); + + LoanDetails loanDetails = new LoanDetails( + new Loan(transfer.getLoanId()), + new User(transfer.getUserId()), + PeopleType.CUSTOMER, + amountWithoutIVA, + referenceNumber, + LoanDetailsType.TRANSFER, + transfer.getUserId(), + date, + transfer.getComments(), + null == transfer.getTransferReference() || transfer.getTransferReference().trim().equals("") ? "Asesor no guardo la referencia de la transferencia. Rechar directamente o solicitar con el administrador la aclaración." : transfer.getTransferReference(), + TransferStatus.PENDING + ); + + BigDecimal newAmountPaid = loan.getAmountPaid().add(amountWithoutIVA); + + parameters.clear(); + + String query = LoanCfg.QUERY_UPDATE_LOAN_BY_ID; + + if (0 == loan.getAmountToPay().compareTo(newAmountPaid)) { + parameters.add(new ModelParameter(LoanCfg.FIELD_LOAN_STATUS, LoanStatus.FINISH)); + + query = LoanCfg.QUERY_UPDATE_AND_FINISH_LOAN_BY_ID; + } + + parameters.add(new ModelParameter(LoanCfg.FIELD_AMOUNT_PAID, newAmountPaid)); + parameters.add(new ModelParameter(LoanCfg.FIELD_AMOUNT_TO_PAY, loan.getAmountToPay())); + parameters.add(new ModelParameter(LoanCfg.FIELD_LAST_REFERENCE_NUMBER, referenceNumber)); + parameters.add(new ModelParameter(LoanCfg.FIELD_LAST_UPDATED_BY, transfer.getUserId())); + parameters.add(new ModelParameter(LoanCfg.FIELD_LAST_UPDATED_ON, date)); + parameters.add(new ModelParameter(LoanCfg.FIELD_ID, transfer.getLoanId())); + + return addAmountRepository.saveNewAmount(notification, loanDetails, query, parameters); + } catch (Exception e) { + logger.error("saveNewTransferAmount", e); + throw e; + } + } + + /** + * This method is for get all loan types applying some business rules, like + * number of Fees and if you are ok in 100% you can get next loan. + * + * @param officeId + * @param loanId + * @return + * @throws Exception + */ + public LoanTypeListJaxb findNewCreditLimit(String officeId, String loanId) throws Exception { + logger.debug("findNewCreditLimit"); + LoanTypeListJaxb loanTypeListJaxb = new LoanTypeListJaxb(); + try { + List parameters = new ArrayList<>(); + + parameters.add( + new ModelParameter( + LoanTypeCfg.FIELD_OFFICE, + new Office(officeId) + ) + ); + + parameters.add( + new ModelParameter( + LoanTypeCfg.PARAM_LOAN, + new Loan(loanId) + ) + ); + + parameters.add( + new ModelParameter( + LoanTypeCfg.PARAM_LOAN_ID, + loanId + ) + ); + + List results = loanTypeRepository.findIdAndPaymentLoans(LoanTypeCfg.QUERY_FIND_NEW_CREDIT_LINE_BY_LOAN_ID, parameters); + List loanTypeJaxbs = new ArrayList<>(); + + results.forEach((result) -> { + loanTypeJaxbs.add(new LoanTypeJaxb(result.getId(), result.getPayment())); + }); + + loanTypeListJaxb.setLoans(loanTypeJaxbs); + + return loanTypeListJaxb; + } catch (Exception e) { + logger.error("findNewCreditLimit", e); + throw e; + } + } + + /** + * + * @param officeId + * @return + * @throws Exception + */ + public LoanTypeListJaxb findAllLoansTypeByOffice(String officeId) throws Exception { + logger.debug("findNewCreditLimit"); + LoanTypeListJaxb loanTypeListJaxb = new LoanTypeListJaxb(); + try { + List parameters = new ArrayList<>(); + + parameters.add( + new ModelParameter( + LoanTypeCfg.FIELD_OFFICE, + new Office(officeId) + ) + ); + + List results = loanTypeRepository.findIdAndPaymentLoans( + LoanTypeCfg.QUERY_FIND_ALL_LOAN_TYPE_WITH_DESCRIPTION_BY_OFFICE, + parameters); + + List loanTypeJaxbs = new ArrayList<>(); + + results.forEach((result) -> { + loanTypeJaxbs.add(new LoanTypeJaxb(result.getId(), result.getPayment(), result.getLoanTypeName())); + }); + + loanTypeListJaxb.setLoans(loanTypeJaxbs); + + return loanTypeListJaxb; + } catch (Exception e) { + logger.error("findNewCreditLimit", e); + throw e; + } + } + + /** + * + * @param loan + * @param credit + * @param user + * @param paymentAmount + * @param endorsement + * @return + * @throws Exception + */ + public boolean renovation(String loan, + String credit, + String user, + BigDecimal paymentAmount, + PersonJaxb endorsement) throws Exception { + logger.debug("renovation"); + try { + Date date = new Date(); + + Loan currentLoan = loanRepository.findLoanById(loan); + LoanType newCredit = loanTypeRepository.findLoanType(credit); + int lastReferenceNumber = currentLoan.getLastReferenceNumber() + 1; + + LoanDetails loanDetails = new LoanDetails( + new Loan(loan), + new User(user), + PeopleType.CUSTOMER, + paymentAmount, + lastReferenceNumber, + LoanDetailsType.PAYMENT, + user, + date, + "Pago y solicitud de renovacion" + ); + + LoanByUser loanByUser = new LoanByUser( + new LoanByUserId(null, user), + LoanStatus.PENDING, + OwnerLoan.CURRENT_OWNER, + user); + + Loan renovation = new Loan( + new LoanType(newCredit.getId()), + new People(currentLoan.getCustomer().getId()), + null, + new RouteCtlg(currentLoan.getRouteCtlg().getId()), + LoanStatus.PENDING, + BigDecimal.ZERO, + newCredit.getPaymentTotal(), + 0, + user, + date, + ActiveStatus.DISABLED, + ActiveStatus.DISABLED // FROZEN funcationality + ); + + List parameters = new ArrayList<>(); + + parameters.add( + new ModelParameter( + LoanCfg.FIELD_AMOUNT_PAID, + currentLoan.getAmountPaid().add(paymentAmount) + ) + ); + + parameters.add( + new ModelParameter( + LoanCfg.FIELD_LAST_REFERENCE_NUMBER, + lastReferenceNumber + ) + ); + + parameters.add( + new ModelParameter( + LoanCfg.FIELD_LOAN_STATUS, + LoanStatus.PENDING_RENOVATION + ) + ); + + parameters.add( + new ModelParameter( + LoanCfg.FIELD_LAST_UPDATED_BY, + user + ) + ); + + parameters.add( + new ModelParameter( + LoanCfg.FIELD_LAST_UPDATED_ON, + date + ) + ); + + parameters.add( + new ModelParameter( + LoanCfg.FIELD_ID, + loan + ) + ); + + People people = null; + + if (null != endorsement) { + if (endorsement.isCreatePerson()) { + people = new People( + endorsement, false, + currentLoan.getRouteCtlg().getOffice().getId(), + user, currentLoan.getRouteCtlg().getId() + ); + } else { + renovation.setEndorsement(new People(endorsement.getId())); + } + } else { + renovation.setEndorsement(new People(currentLoan.getEndorsement().getId())); + } + + return loanRepository.renovationLoan( + loan, + renovation, + loanByUser, + LoanCfg.QUERY_UPDATE_LOAN_FROM_RENOVATION, + parameters, + loanDetails, people, + null == endorsement ? false : endorsement.isCreatePerson()); + } catch (Exception e) { + logger.error("renovation", e); + throw e; + } + } + + /** + * + * @param loan + * @param credit + * @param user + * @param paymentAmount + * @param currentOwner + * @param endorsement + * @return + * @throws Exception + */ + public boolean renovationHasPaymentToday(String loan, + String credit, + String user, + BigDecimal paymentAmount, + String currentOwner, + PersonJaxb endorsement) throws Exception { + logger.debug("renovationHasPaymentToday"); + try { + Date date = new Date(); + + Loan currentLoan = loanRepository.findLoanById(loan); + LoanType newCredit = loanTypeRepository.findLoanType(credit); + + LoanByUser loanByUser = new LoanByUser( + new LoanByUserId(null, currentOwner), + LoanStatus.PENDING, + OwnerLoan.CURRENT_OWNER, + user); + + Loan renovation = new Loan( + new LoanType(newCredit.getId()), + new People(currentLoan.getCustomer().getId()), + null, + new RouteCtlg(currentLoan.getRouteCtlg().getId()), + LoanStatus.PENDING, + BigDecimal.ZERO, + newCredit.getPaymentTotal(), + 0, + user, + date, + ActiveStatus.DISABLED, + ActiveStatus.DISABLED // FROZEN funcationality + ); + + People people = null; + + if (null != endorsement) { + if (endorsement.isCreatePerson()) { + people = new People( + endorsement, false, + currentLoan.getRouteCtlg().getOffice().getId(), + user, currentLoan.getRouteCtlg().getId() + ); + } else { + renovation.setEndorsement(new People(endorsement.getId())); + } + } else { + renovation.setEndorsement(new People(currentLoan.getEndorsement().getId())); + } + + return loanRepository.renovationHasPaymentToday( + loan, + renovation, + loanByUser, + people, + null == endorsement ? false : endorsement.isCreatePerson()); + } catch (Exception e) { + logger.error("renovationHasPaymentToday", e); + throw e; + } + } + + /** + * + * @param userId + * @return + * @throws Exception + */ + public List findLoansByCertifier(String userId) throws Exception { + logger.debug("findLoansByCertifier"); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanToDeliveryByCertifierViewCfg.FIELD_USER_ID, userId)); + + return toDeliveryByCertifierRepository.findLoansByCertifier( + LoanToDeliveryByCertifierView.class, + LoanToDeliveryByCertifierViewCfg.QUERY_FIND_LOANS_BY_CERTIFIER, + parameters); + } catch (Exception e) { + logger.error("findLoansByCertifier", e); + throw e; + } + } + + /** + * + * @param id + * @param user + * @param comments + * @param action true Approved otherwise Rejected. + * @param amount + * @param discount + * @return + * @throws Exception + */ + public boolean certifierAction(String id, String user, String comments, boolean action, BigDecimal amount, BigDecimal discount) throws Exception { + logger.debug("certifierAction"); + boolean success; + try { + // revisar si es nuevo (1) o renovado (2). + // 1 = se cambia el estatus al valor de action + // 2, si action es true, hay que hacer update de 3 tablas + // A)loan renovado estutus = APPROVED + // B) Finish + // 1)old loan estatus = FINISH, + // 2)old loandbyuser estatus = FINISH + // C)loans by renovation estatus = APPROVED + // 2, si action es false, hay que hacer update de 3 tablas + // A)loan renovado estutus = REJECT, and loandbyuser estatus = REJECT + // B)old loan estatus = APPROVED + // 1)old loan estatus = APPROVED + // 2)old loandbyuser estatus = APPROVED + // C)loans by renovation estatus = REJECT + LoanByRenovation loanByRenovation = loanByRenovationRepository.findLoanRenovationByNewLoanId(id); + + if (null == loanByRenovation) { + success = updateLoanByIdFromCertifiedView( + id, + user, + action, + comments, + amount, + ComissionType.INCLUDED); + } else { + LoanDetails loanDetails = null; + BigDecimal totalAmountPaid = null; + Integer newLastReferenceNumber = null; + + // Means discount is bigger than 0 + if (1 == discount.compareTo(new BigDecimal(0))) { + Loan loan = loanRepository.findLoanById(loanByRenovation.getLoanOld().getId()); + + totalAmountPaid = loan.getAmountPaid().add(discount); + newLastReferenceNumber = loan.getLastReferenceNumber() + 1; + + loanDetails = new LoanDetails( + new Loan(loanByRenovation.getLoanOld().getId()), + new User(user), + PeopleType.CUSTOMER, + discount, + newLastReferenceNumber, + LoanDetailsType.RENOVATION_PAYMENT, + user, + new Date(), + "Retención de " + discount + " el la entrega del crédito renovado"); + } + + success = loanByRenovationRepository.updateLoanRenovationFromCerfierView( + loanByRenovation, + user, + comments, + action, + amount, + discount, + loanDetails, + totalAmountPaid, + newLastReferenceNumber, + ComissionType.INCLUDED); + } + return success; + } catch (Exception e) { + logger.error("certifierAction", e); + throw e; + } + } + + /** + * + * @param id + * @param user + * @param comments + * @param action + * @param amount + * @param discount + * @param comissionType + * @return + * @throws Exception + */ + public boolean certifierAction(String id, String user, String comments, boolean action, BigDecimal amount, BigDecimal discount, ComissionType comissionType) throws Exception { + logger.debug("certifierAction"); + boolean success; + try { + // revisar si es nuevo (1) o renovado (2). + // 1 = se cambia el estatus al valor de action + // 2, si action es true, hay que hacer update de 3 tablas + // A)loan renovado estutus = APPROVED + // B) Finish + // 1)old loan estatus = FINISH, + // 2)old loandbyuser estatus = FINISH + // C)loans by renovation estatus = APPROVED + // 2, si action es false, hay que hacer update de 3 tablas + // A)loan renovado estutus = REJECT, and loandbyuser estatus = REJECT + // B)old loan estatus = APPROVED + // 1)old loan estatus = APPROVED + // 2)old loandbyuser estatus = APPROVED + // C)loans by renovation estatus = REJECT + LoanByRenovation loanByRenovation = loanByRenovationRepository.findLoanRenovationByNewLoanId(id); + + if (null == loanByRenovation) { + success = updateLoanByIdFromCertifiedView( + id, + user, + action, + comments, + amount, + comissionType); + } else { + LoanDetails loanDetails = null; + BigDecimal totalAmountPaid = null; + Integer newLastReferenceNumber = null; + + // Means discount is bigger than 0 + if (1 == discount.compareTo(new BigDecimal(0))) { + Loan loan = loanRepository.findLoanById(loanByRenovation.getLoanOld().getId()); + + totalAmountPaid = loan.getAmountPaid().add(discount); + newLastReferenceNumber = loan.getLastReferenceNumber() + 1; + + loanDetails = new LoanDetails( + new Loan(loanByRenovation.getLoanOld().getId()), + new User(user), + PeopleType.CUSTOMER, + discount, + newLastReferenceNumber, + LoanDetailsType.RENOVATION_PAYMENT, + user, + new Date(), + "Retención de " + discount + " el la entrega del crédito renovado"); + } + + success = loanByRenovationRepository.updateLoanRenovationFromCerfierView( + loanByRenovation, + user, + comments, + action, + amount, + discount, + loanDetails, + totalAmountPaid, + newLastReferenceNumber, + comissionType); + } + return success; + } catch (Exception e) { + logger.error("certifierAction", e); + throw e; + } + } + + /** + * + * @param idLoan + * @return + * @throws Exception + */ + public List approvedDetailsByIdLoan(String idLoan) throws Exception { + logger.debug("approvedDetailsByIdLoan"); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanDetailsCfg.FIELD_ID_LOAN, new Loan(idLoan))); + + return loanApprovedDetailViewRepository.findLoanDetailsByLoan( + LoanDetailsCfg.QUERY_FIND_LOAN_DETAILS_BY_LOAN, + parameters + ); + } catch (Exception e) { + logger.error("approvedDetailsByIdLoan", e); + throw e; + } + } + + /** + * Searching all loan details by id. + * + * @param loanId + * @return + * @throws Exception + */ + public List getLoanDetailsCurdatebyIdLoan(String loanId) throws Exception { + logger.debug("getLoanDetailsCurdatebyIdLoan"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanCfg.FIELD_DETAILS_LOAN, new Loan(loanId))); + + try { + return loanDetailsRepository.findLoanDetailsByLoanId(LoanCfg.QUERY_FIND_LOAN_DETAILS_CURDATE_BY_LOAN, parameters); + } catch (Exception ex) { + logger.error("getLoanDetailsCurdatebyIdLoan", ex); + throw ex; + } + } + + public List getLoanDetailsFeeCurdatebyIdLoan(String loanId) throws Exception { + logger.debug("getLoanDetailsFeeCurdatebyIdLoan"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanCfg.FIELD_DETAILS_LOAN, new Loan(loanId))); + + try { + return loanDetailsRepository.findLoanDetailsByLoanId(LoanCfg.QUERY_FIND_LOAN_DETAILS_FEE_CURDATE_BY_LOAN, parameters); + } catch (Exception ex) { + logger.error("getLoanDetailsCurdatebyIdLoan", ex); + throw ex; + } + } + + /** + * + * @param loanId + * @return + * @throws Exception + */ + public Loan getLoanById(String loanId) throws Exception { + try { + return loanRepository.findLoanById(loanId); + } catch (Exception ex) { + throw ex; + } + } + + /** + * + * @param idLoan + * @param idLoanType + * @return + * @throws Exception + */ + public boolean updatePaymentTotalLoanById(String idLoan, String idLoanType) throws Exception { + try { + Loan loan = loanRepository.findLoanById(idLoan); + LoanType loanType = loanTypeRepository.findLoanType(idLoanType); + + loan.setLoanType(loanType); + loan.setAmountToPay(loanType.getPaymentTotal()); + + return loanRepository.updateLoan(loan); + } catch (Exception ex) { + throw ex; + } + } + + /** + * + * @return @throws Exception + */ + public List findAllTransferToAuthorize() throws Exception { + try { + TransferInPendingStatusViewRepository repository = new TransferInPendingStatusViewRepository(); + List transferInPendingStatusViews = repository.findAllTransferFromHQL(TransferInPendingStatusViewCfg.QUERY_FIND_ALL_TRANSFER_IN_PENDING_STATUS, null); + List results = new ArrayList<>(); + + transferInPendingStatusViews.forEach((row) -> { + results.add(new AuthorizeTransferPaymentsDto(row.getIdLoanDetail(), + row.getStrCreatedOn(), + row.getCustomerName(), + row.getEndorsementName(), + row.getUserName(), + row.getPaymentAmount(), + row.getLoanComments())); + }); + + return results; + } catch (Exception e) { + throw e; + } + } + + /** + * + * @param authorizeTransferList + * @param transferStatus + * @return + * @throws Exception + */ + public boolean updateTransferList(AuthorizeTransferList authorizeTransferList, TransferStatus transferStatus) throws Exception { + try { + List parameters = new ArrayList<>(); + List ids = new ArrayList<>(); + + authorizeTransferList.getTransferListToUpdateStatus().forEach((row) -> { + ids.add(row.getIdLoan()); + }); + + parameters.add(new ModelParameter(LoanDetailsCfg.FIELD_TRANSFER_STATUS, transferStatus)); + parameters.add(new ModelParameter(LoanDetailsCfg.FIELD_COMMENS, authorizeTransferList.getComments())); + parameters.add(new ModelParameter(LoanDetailsCfg.FIELD_ID, ids)); + + return loanDetailsRepository.updateLoanDetails(LoanDetailsCfg.UPDATE_TRANSFER_STATUS_WHERE_ID_IN, parameters); + } catch (Exception e) { + throw e; + } + } + + /** + * + * @return @throws Exception + */ + public List findAllLoanInPendingStatusToDeliveryView() throws Exception { + try { + LoanInPendingStatusToDeliveryViewRepository repository = new LoanInPendingStatusToDeliveryViewRepository(); + List dataRows = repository.findAllLoanInPendingStatusToDeliveryViewFromHQL(LoanInPendingStatusToDeliveryViewCfg.QUERY_FIND_ALL_LOAN_IN_PENDING_STATUS_TO_DELIVERY_VIEW, null); + List results = new ArrayList<>(); + + dataRows.forEach((row) -> { + results.add(new UpdateLoanToDeliveryStatusDTO(row.getIdLoan(), + row.getStrCreatedOn(), + row.getCustomerName(), + row.getEndorsementName(), + row.getUserName(), + row.getPayment())); + }); + + return results; + } catch (Exception e) { + logger.error("findAllLoanInPendingStatusToDeliveryView", e); + throw e; + } + } + + public boolean updateLoanPendingStatusToDelivery(UpdateLoanToDeliveryStatusList updateLoanToDeliveryStatusList, LoanStatus loanStatus) throws Exception { + try { + List loanParams = new ArrayList<>(); + List loanByUserParams = new ArrayList<>(); + List ids = new ArrayList<>(); + List loans = new ArrayList<>(); + + updateLoanToDeliveryStatusList.getLoanToDeliveryList().forEach((row) -> { + ids.add(row.getIdLoan()); + loans.add(new Loan(row.getIdLoan())); + }); + + loanParams.add(new ModelParameter(LoanCfg.FIELD_LOAN_STATUS, loanStatus)); + loanParams.add(new ModelParameter(LoanCfg.FIELD_AMOUNT_PAID, new BigDecimal(0))); + loanParams.add(new ModelParameter(LoanCfg.FIELD_LAST_REFERENCE_NUMBER, 0)); + loanParams.add(new ModelParameter(LoanCfg.FIELD_LAST_UPDATED_BY, updateLoanToDeliveryStatusList.getIdUpdateUser())); + loanParams.add(new ModelParameter(LoanCfg.FIELD_LAST_UPDATED_ON, new Date())); + loanParams.add(new ModelParameter(LoanCfg.FIELD_ID, ids)); + + loanByUserParams.add(new ModelParameter(LoanByUserCfg.FIELD_LOAN_BY_USER_STATUS, loanStatus)); + loanByUserParams.add(new ModelParameter(LoanByUserCfg.FIELD_LOAN, loans)); + + return loanRepository.loanPendingStatusToDelivery(LoanCfg.QUERY_UPDATE_LOAN_STATUS_WHERE_ID_IN, LoanByUserCfg.QUERY_UPDATE_LOAN_BY_USER_STATUS_WHERE_LOAN_IN, loanParams, loanByUserParams); + } catch (Exception e) { + throw e; + } + } + + /** + * + * @param loanId + * @param userId + * @param action + * @param comments + * @param amount + * @param comissionType + * @return + * @throws Exception + */ + private boolean updateLoanByIdFromCertifiedView(String loanId, String userId, boolean action, String comments, BigDecimal amount, ComissionType comissionType) throws Exception { + logger.debug("updateLoanByIdFromCertifiedView"); + try { + List parameters = new ArrayList<>(); + Date date = new Date(); + + parameters.add( + new ModelParameter(LoanCfg.FIELD_LOAN_STATUS, action ? LoanStatus.APPROVED : LoanStatus.REJECTED) + ); + + parameters.add( + new ModelParameter(LoanCfg.FIELD_COMMENTS, comments) + ); + + parameters.add( + new ModelParameter(LoanCfg.FIELD_CREATED_ON, date) + ); + + parameters.add( + new ModelParameter(LoanCfg.FIELD_LAST_UPDATED_BY, userId) + ); + + parameters.add( + new ModelParameter(LoanCfg.FIELD_LAST_UPDATED_ON, date) + ); + + parameters.add( + new ModelParameter(LoanCfg.FIELD_ID, loanId) + ); + + Delivery delivery = null; + + if (action) { + delivery = new Delivery( + new User(userId), + new Loan(loanId), + amount, + userId, + date, + comissionType); + } + + return loanRepository.updateLoan( + loanId, + LoanCfg.QUERY_UPDATE_LOAN_WITH_CREATED_ON_BY_ID_FROM_CERTIFIER_VIEW, + parameters, + action ? LoanStatus.APPROVED : LoanStatus.REJECTED, + delivery); + } catch (Exception e) { + logger.error("updateLoanByIdFromCertifiedView", e); + throw e; + } + } + + /** + * Vefify that person is available to create a new Loan. + * + * @param clazz AvailableCustomersView or AvailableEndorsementsView. + * @param idPerson Identification NUmber + * @return true if is available otherwise false. + * @throws Exception + */ + private boolean verifyPersonAvailability(Class clazz, String idPerson) throws Exception { + logger.debug("verifyPersonAvailability"); + try { + if (null == idPerson || "".equals(idPerson.trim())) { + throw new NullPointerException(clazz + " id is null"); + } + + return null != searchPersonAvailableRepository.findAvailablePersonByPersonId(clazz, idPerson); + } catch (Exception e) { + logger.error("verifyPersonAvailability", e); + throw e; + } + } + + private static final long serialVersionUID = -3608679734068691688L; + final Logger logger = LogManager.getLogger(LoanController.class + ); + + private final LoanTypeRepository loanTypeRepository; + private final LoanRepository loanRepository; + private final LoanFeeNotificationRepository loanFeeNotificationRepository; + private final AddAmountRepository addAmountRepository; + private final LoanToDeliveryByCertifierRepository toDeliveryByCertifierRepository; + private final LoanByRenovationRepository loanByRenovationRepository; + private final SearchPersonAvailableRepository searchPersonAvailableRepository; + private final LoanApprovedDetailViewRepository loanApprovedDetailViewRepository; + private final LoanDetailsRepository loanDetailsRepository; + + private final String user_unavailable = "User unavailable to this operation"; + + public LoanController() { + this.loanTypeRepository = new LoanTypeRepository(); + this.loanRepository = new LoanRepository(); + this.loanFeeNotificationRepository = new LoanFeeNotificationRepository(); + this.addAmountRepository = new AddAmountRepository(); + this.toDeliveryByCertifierRepository = new LoanToDeliveryByCertifierRepository(); + this.loanByRenovationRepository = new LoanByRenovationRepository(); + this.searchPersonAvailableRepository = new SearchPersonAvailableRepository(); + this.loanApprovedDetailViewRepository = new LoanApprovedDetailViewRepository(); + this.loanDetailsRepository = new LoanDetailsRepository(); + } +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/login/LoginWSController.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/login/LoginWSController.java new file mode 100644 index 0000000..e83c1fb --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/login/LoginWSController.java @@ -0,0 +1,80 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.login; + +import com.arrebol.apc.controller.mobile.moxy.login.UserMxy; +import com.arrebol.apc.controller.mobile.moxy.login.UserPreferenceMxy; +import com.arrebol.apc.controller.mobile.repository.jaas.AuthenticationRepository; +import com.arrebol.apc.model.mobile.access.MobileUser; +import com.arrebol.apc.model.mobile.preference.UserMobilePreference; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class LoginWSController implements Serializable { + + public UserMxy login(String userName, String password) throws Exception { + logger.debug("login"); + + UserMxy userMxy; + List preferenceLst; + try { + MobileUser mobileUser = getAuthenticationRepository().findUser(userName, password); + + if (null == mobileUser) { + throw new Exception("Access denied"); + } else { + userMxy = new UserMxy( + mobileUser.getId(), + mobileUser.getUserName(), + mobileUser.getAvatar(), + mobileUser.getOfficeId(), + mobileUser.getRouteId(), + mobileUser.getCertifier(), + mobileUser.getManagement().toString() + ); + } + + List userMobilePreferences = getAuthenticationRepository().findAllMobilePreferenceByUser(userMxy.getId()); + + if (!userMobilePreferences.isEmpty()) { + preferenceLst = new ArrayList<>(); + + userMobilePreferences.forEach((preference) -> { + preferenceLst.add(new UserPreferenceMxy(preference.getPreferenceName(), preference.getPreferenceValue())); + }); + + userMxy.setPreferences(preferenceLst); + } + } catch (Exception e) { + logger.error("login", e); + throw e; + } + return userMxy; + } + + public LoginWSController() { + this.authenticationRepository = new AuthenticationRepository(); + } + + public AuthenticationRepository getAuthenticationRepository() { + return authenticationRepository; + } + + private static final long serialVersionUID = 2795964728722199660L; + final Logger logger = LogManager.getLogger(LoginWSController.class); + + private final AuthenticationRepository authenticationRepository; + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/otherexpense/OtherExpenseController.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/otherexpense/OtherExpenseController.java new file mode 100644 index 0000000..3df43be --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/otherexpense/OtherExpenseController.java @@ -0,0 +1,58 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.otherexpense; + +import com.arrebol.apc.controller.mobile.repository.admin.OtherExpenseRepository; +import com.arrebol.apc.model.admin.OtherExpense; +import java.io.Serializable; +import java.math.BigDecimal; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class OtherExpenseController implements Serializable { + + /** + * + * @param officeId + * @param userId + * @param expense + * @param description + * @return + * @throws Exception + */ + public boolean addOtherExpense( + String officeId, + String userId, + Double expense, + String description) throws Exception { + logger.debug("addOtherExpense"); + try { + OtherExpense otherExpense = new OtherExpense(officeId, userId, new BigDecimal(expense), description); + + return otherExpenseRepository.saveOtherExpense(otherExpense); + } catch (Exception e) { + logger.error("addOtherExpense", e); + throw e; + } + } + + private static final long serialVersionUID = -1748077572747436181L; + + final Logger logger = LogManager.getLogger(OtherExpenseController.class); + + private final OtherExpenseRepository otherExpenseRepository; + + public OtherExpenseController() { + this.otherExpenseRepository = new OtherExpenseRepository(); + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/person/PersonController.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/person/PersonController.java new file mode 100644 index 0000000..874e3f3 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/person/PersonController.java @@ -0,0 +1,54 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.person; + +import com.arrebol.apc.controller.mobile.repository.people.PeopleRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.catalog.constance.PeopleCfg; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class PersonController implements Serializable { + + /** + * + * @param loanId + * @param lastUpdatedBy + * @param phoneNumber + * @param isCustomer + * @return + */ + public boolean changeContactNumber(String loanId, String lastUpdatedBy, String phoneNumber, boolean isCustomer) { + boolean success = false; + try { + PeopleRepository repository = new PeopleRepository(); + String personId = repository.findPeopleIdByIdLoad(loanId, isCustomer); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PeopleCfg.FIELD_PHONE_HOME, phoneNumber)); + parameters.add(new ModelParameter(PeopleCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(PeopleCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(PeopleCfg.FIELD_ID, personId)); + + return repository.changeContactNumber(PeopleCfg.QUERY_UPDATE_PHONE_HOME_BY_PEOPLE_ID, parameters); + } catch (Exception e) { + logger.error("changeContactNumber", e); + } + return success; + } + + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/preference/SystemPreferenceController.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/preference/SystemPreferenceController.java new file mode 100644 index 0000000..5c0d4af --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/preference/SystemPreferenceController.java @@ -0,0 +1,243 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.preference; + +import com.arrebol.apc.controller.mobile.moxy.views.LoanByUserOrderPreferenceViewJaxb; +import com.arrebol.apc.controller.mobile.moxy.views.LoanByUserOrderPreferenceViewListJaxb; +import com.arrebol.apc.controller.mobile.repository.preference.UserMobilePreferenceRepository; +import com.arrebol.apc.controller.mobile.repository.views.LoanByUserOrderPreferenceViewRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.ClosingDayCfg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.core.constance.LoanByUserCfg; +import com.arrebol.apc.model.core.constance.LoanByUserOrderPreferenceViewCfg; +import com.arrebol.apc.model.core.constance.UserMobilePreferenceCfg; +import com.arrebol.apc.model.enums.PreferenceName; +import com.arrebol.apc.model.enums.PreferenceValue; +import com.arrebol.apc.model.loan.LoanByUserId; +import com.arrebol.apc.model.mobile.preference.UserMobilePreference; +import com.arrebol.apc.model.views.LoanByUserOrderPreferenceView; +import com.arrebol.apc.model.ws.parsed.ConfigurationJaxb; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class SystemPreferenceController implements Serializable { + + /** + * + * @param userId + * @return + * @throws Exception + */ + public List findAllLoanByUserOrderPreference(String userId) throws Exception { + logger.debug("findAllLoanByUserOrderPreference"); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanByUserOrderPreferenceViewCfg.FIELD_ORDER_USER_ID, userId)); + + return loanByUserOrderPreferenceViewRepository + .findAllLoanByUserOrderPreference( + LoanByUserOrderPreferenceViewCfg.QUERY_FIND_ALL_LOAN_BY_USER_ORDER_PREFERENCE, + parameters + ); + } catch (Exception e) { + logger.error("findAllLoanByUserOrderPreference", e); + throw e; + } + } + + /** + * + * @param updateOrderListPreference + * @return + * @throws Exception + */ + public boolean updateOrderInList(LoanByUserOrderPreferenceViewListJaxb updateOrderListPreference) throws Exception { + logger.debug("updateOrderInList"); + + boolean success = false; + try { + if (updateLoanByUser(updateOrderListPreference)) { + success = updateUserMobilePreference( + new User(updateOrderListPreference.getLoanByUserOrderPreferences().get(0).getUserId()), + PreferenceName.ORDER_LIST.toString(), + PreferenceValue.ORDER_IN_LIST.toString() + ); + } + return success; + } catch (Exception e) { + logger.error("updateOrderInList", e); + throw e; + } + } + + /** + * + * @param UserId + * @param preferenceName + * @param preferenceValue + * @return + * @throws Exception + */ + public boolean updateUserMobilePreference(String UserId, String preferenceName, String preferenceValue) throws Exception { + logger.debug("updateUserMobilePreference"); + + boolean success = false; + try { + success = updateUserMobilePreference( + new User(UserId), + preferenceName, + preferenceValue + ); + + } catch (Exception e) { + logger.error("updateUserMobilePreference", e); + throw e; + } + return success; + } + + /** + * + * @param updateOrderListPreference + * @return + * @throws Exception + */ + private boolean updateLoanByUser(LoanByUserOrderPreferenceViewListJaxb updateOrderListPreference) throws Exception { + logger.debug("updateLoanByUser"); + try { + for (int i = 0; i < updateOrderListPreference.getLoanByUserOrderPreferences().size(); i++) { + LoanByUserOrderPreferenceViewJaxb preference = updateOrderListPreference.getLoanByUserOrderPreferences().get(i); + List parameters = new ArrayList<>(); + + parameters.add( + new ModelParameter( + LoanByUserCfg.FIELD_ORDER_IN_LIST, + preference.getOrderInList() + ) + ); + + parameters.add( + new ModelParameter( + LoanByUserCfg.FIELD_ID, + new LoanByUserId( + preference.getId(), + preference.getUserId() + ) + ) + ); + + loanByUserOrderPreferenceViewRepository.updateQuery( + LoanByUserCfg.QUERY_UPDATE_ORDER_IN_LIST, + parameters + ); + } + return true; + } catch (Exception e) { + logger.error("updateLoanByUser", e); + throw e; + } + } + + /** + * + * @param user + * @param preferenceName + * @param preferenceValue + * @return + * @throws Exception + */ + private boolean updateUserMobilePreference(User user, String preferenceName, String preferenceValue) throws Exception { + logger.debug("updateUserMobilePreference"); + + boolean success = false; + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(UserMobilePreferenceCfg.FIELD_USER, user)); + parameters.add(new ModelParameter(UserMobilePreferenceCfg.FIELD_PREFERENCE_NAME, preferenceName)); + + UserMobilePreference userMobilePreference = userMobilePreferenceRepository.findUserMobilePreference( + UserMobilePreference.class, + UserMobilePreferenceCfg.QUERY_FIND_MOBILE_PREFERENCE_BY_USER_AND_PREFERENCE_NAME, + parameters); + + if (null != userMobilePreference) { + parameters.clear(); + + parameters.add(new ModelParameter(UserMobilePreferenceCfg.FIELD_PREFERENCE_VALUE, preferenceValue)); + parameters.add(new ModelParameter(UserMobilePreferenceCfg.FIELD_LAST_UPDATED_BY, user.getId())); + parameters.add(new ModelParameter(UserMobilePreferenceCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(UserMobilePreferenceCfg.FIELD_ID, userMobilePreference.getId())); + + success = userMobilePreferenceRepository.updateQueryUserMobilePreference( + UserMobilePreferenceCfg.QUERY_UPDATE_PREFERENCE_VALUE, + parameters + ); + } else { + userMobilePreference = new UserMobilePreference( + user, + preferenceName, + preferenceValue, + user.getId()); + success = userMobilePreferenceRepository.insertUserMobilePreference(userMobilePreference); + } + } catch (Exception e) { + logger.error("updateUserMobilePreference", e); + throw e; + } + return success; + } + + /** + * + * @param userId + * @param officeId + * @return + * @throws Exception + */ + public ConfigurationJaxb findConfigurationButton(String userId, String officeId) throws Exception { + logger.debug("findConfigurationButton"); + ConfigurationJaxb configuration; + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(ClosingDayCfg.FIELD_USER, new User(userId))); + parameters.add(new ModelParameter(ClosingDayCfg.FIELD_OFFICE, new Office(officeId))); + + Long result = userMobilePreferenceRepository.count(ClosingDayCfg.QUERY_COUNT_CLOSING_DATE_BY_USER_AND_OFFICE, parameters); + configuration = new ConfigurationJaxb(result.compareTo(new Long(0)) == 0); + } catch (Exception e) { + logger.error("findConfigurationButton", e); + configuration = new ConfigurationJaxb(false); + } + return configuration; + } + + private static final long serialVersionUID = 6329489276545356862L; + final Logger logger = LogManager.getLogger(SystemPreferenceController.class); + + private final LoanByUserOrderPreferenceViewRepository loanByUserOrderPreferenceViewRepository; + private final UserMobilePreferenceRepository userMobilePreferenceRepository; + + public SystemPreferenceController() { + this.loanByUserOrderPreferenceViewRepository = new LoanByUserOrderPreferenceViewRepository(); + this.userMobilePreferenceRepository = new UserMobilePreferenceRepository(); + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/reports/ReportsController.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/reports/ReportsController.java new file mode 100644 index 0000000..7d0f190 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/reports/ReportsController.java @@ -0,0 +1,54 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.reports; + +import com.arrebol.apc.controller.mobile.repository.reports.ReportsRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.reports.UserWeekReport; +import com.arrebol.apc.model.reports.constance.UserWeekReportCfg; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class ReportsController implements Serializable { + + /** + * + * @param id + * @return + * @throws Exception + */ + public UserWeekReport findUserWeekReportDetailsByUser(String id) throws Exception { + try { + ReportsRepository reportsRepository = new ReportsRepository(); + List parameters = new ArrayList<>(); + + parameters.add( + new ModelParameter(UserWeekReportCfg.FIELD_ID, id) + ); + + return reportsRepository.findUserWeekReportDetailsByUser(UserWeekReport.class, UserWeekReportCfg.QUERY_FIND_USER_WEEK_REPORT_BY_USER, parameters); + } catch (Exception e) { + logger.error("findUserWeekReportDetailsByUser", e); + throw e; + } + } + + private static final long serialVersionUID = -5280895557294295916L; + final Logger logger = LogManager.getLogger(getClass()); + + public ReportsController() { + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/route/RouteController.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/route/RouteController.java new file mode 100644 index 0000000..780db71 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/route/RouteController.java @@ -0,0 +1,44 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.route; + +import com.arrebol.apc.controller.mobile.moxy.views.ContainerRoutes; +import com.arrebol.apc.controller.mobile.repository.route.RouteRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.catalog.constance.RouteCfg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class RouteController implements Serializable { + + public ContainerRoutes findAllRoutesAvailables(String officeId) throws Exception { + try { + RouteRepository repository = new RouteRepository(); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(RouteCfg.FIELD_OFFICE, new Office(officeId))); + parameters.add(new ModelParameter(RouteCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + + return repository.findAllRoutesAvailables(RouteCfg.QUERY_FIND_ALL_AVAILABLES_ROUTES, parameters); + } catch (Exception e) { + logger.error("findAllRoutesAvailables", e); + throw e; + } + } + + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/search/PersonSearchController.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/search/PersonSearchController.java new file mode 100644 index 0000000..0e66d5d --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/search/PersonSearchController.java @@ -0,0 +1,175 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.search; + +import com.arrebol.apc.controller.mobile.repository.views.PersonSearchHistoricalDetailsViewRepository; +import com.arrebol.apc.controller.mobile.repository.views.PersonSearchViewRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.core.constance.LoanByUserCfg; +import com.arrebol.apc.model.core.constance.LoanCfg; +import com.arrebol.apc.model.core.constance.PersonSearchHistoricalDetailsViewCfg; +import com.arrebol.apc.model.core.constance.PersonSearchViewCfg; +import com.arrebol.apc.model.core.constance.UserCfg; +import com.arrebol.apc.model.views.LoanByUserView; +import com.arrebol.apc.model.views.PersonSearchDetailView; +import com.arrebol.apc.model.views.PersonSearchHistoricalDetailsView; +import com.arrebol.apc.model.views.PersonSearchView; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class PersonSearchController implements Serializable { + + /** + * + * @param nameToSearch + * @return + * @throws Exception + */ + public PersonSearchView fullNameEqualsToPersonSearch(String nameToSearch) throws Exception { + try { + List parameters = new ArrayList<>(); + + parameters.add( + new ModelParameter( + PersonSearchViewCfg.FIELD_PERSON_SEARCH, + nameToSearch + ) + ); + + PersonSearchView result = (PersonSearchView) personSearchViewRepository.findResultXML( + PersonSearchView.class, + PersonSearchViewCfg.QUERY_FULL_NAME_EQUALS_TO_PERSON_SEARCH, + parameters + ); + + if (null == result) { + result = new PersonSearchView("N/A", "N/A"); + } + return result; + } catch (Exception e) { + logger.error("findAllCoincidences", e); + throw e; + } + } + + /** + * + * @param search + * @return If any return list of coincidences otherwise return empty list. + * @throws Exception + */ + public List findAllCoincidences(String search) throws Exception { + logger.debug("findAllCoincidences"); + try { + List parameters = new ArrayList<>(); + + parameters.add( + new ModelParameter( + PersonSearchViewCfg.FIELD_PERSON_SEARCH, + search + ) + ); + + return personSearchViewRepository.findResultList( + PersonSearchView.class, + PersonSearchViewCfg.QUERY_LIKE_BY_PERSON_SEARCH, + parameters + ); + } catch (Exception e) { + logger.error("findAllCoincidences", e); + throw e; + } + } + + /** + * + * @param personSearchId + * @return + * @throws Exception + */ + public PersonSearchDetailView findPersonSearchDetail(String personSearchId) throws Exception { + logger.debug("findPersonSearchDetail"); + try { + return personSearchViewRepository.findResult(PersonSearchDetailView.class, personSearchId); + } catch (Exception e) { + logger.error("findPersonSearchDetail", e); + throw e; + } + } + + /** + * + * @param personSearchId + * @return + * @throws Exception + */ + public List findPersonHistoricalDetailsByPersonId(String personSearchId) throws Exception { + logger.debug("findPersonHistoricalDetailsByPersonId"); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PersonSearchHistoricalDetailsViewCfg.FIELD_PERSON_SEARCH_ID, personSearchId)); + + return personSearchHistoricalDetailsViewRepository.findAllByPersonId( + PersonSearchHistoricalDetailsView.class, + PersonSearchHistoricalDetailsViewCfg.QUERY_FIND_PERSON_SEARCH_HISTORICAL_DETAILS_BY_PERSON_ID, + parameters); + } catch (Exception e) { + logger.error("findPersonHistoricalDetailsByPersonId", e); + throw e; + } + } + + //Necesito utilizar tuple + /** + * + * @param idUser + * @param personSearch + * @return + * @throws Exception + */ + public LoanByUserView searchPaymentDetails(String idUser, String personSearch) throws Exception { + logger.debug("searchPaymentDetails"); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanCfg.FIELD_CUSTOMER, new People(personSearch))); + parameters.add(new ModelParameter(LoanByUserCfg.FIELD_USER, new User(idUser))); + parameters.add(new ModelParameter(UserCfg.FIELD_ID, idUser)); + + return (LoanByUserView) personSearchViewRepository.findResultTupleXML( + LoanCfg.QUERY_SEARCH_PAYMENT_DETAILS, + parameters); + + } catch (Exception e) { + logger.error("searchPaymentDetails", e); + throw e; + } + } + + private static final long serialVersionUID = -3224360462532091921L; + final Logger logger = LogManager.getLogger(PersonSearchController.class); + + final private PersonSearchViewRepository personSearchViewRepository; + final private PersonSearchHistoricalDetailsViewRepository personSearchHistoricalDetailsViewRepository; + + public PersonSearchController() { + this.personSearchViewRepository = new PersonSearchViewRepository(); + this.personSearchHistoricalDetailsViewRepository = new PersonSearchHistoricalDetailsViewRepository(); + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/tracking/PaymentTrackingController.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/tracking/PaymentTrackingController.java new file mode 100644 index 0000000..79783c3 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/tracking/PaymentTrackingController.java @@ -0,0 +1,69 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.tracking; + +import com.arrebol.apc.controller.mobile.moxy.views.PaymentTrackingViewJaxb; +import com.arrebol.apc.controller.mobile.repository.tracking.PaymentTrackingRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.views.AdvanceUserDailyView; +import com.arrebol.apc.model.views.constance.AdvanceUserDailyViewCfg; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class PaymentTrackingController implements Serializable { + + public PaymentTrackingViewJaxb paymentTrakingByUserDetails(String idUser, String idOffice) { + PaymentTrackingViewJaxb paymentTracking = new PaymentTrackingViewJaxb(); + logger.debug("paymentTrakingByUserDetails"); + try { + + List parameters = new ArrayList<>(); + + parameters.add( + new ModelParameter( + AdvanceUserDailyViewCfg.FIELD_VIEW_USER, + new User(idUser) + ) + ); + parameters.add( + new ModelParameter( + AdvanceUserDailyViewCfg.FIELD_VIEW_OFFICE, + new Office(idOffice) + ) + ); + + PaymentTrackingRepository repository = new PaymentTrackingRepository(); + + AdvanceUserDailyView result = repository.paymentTrakingByUserDetails( + AdvanceUserDailyView.class, + AdvanceUserDailyViewCfg.QUERY_PAYMENT_TRACKING_BY_IDS, + parameters); + + if (null != result) { + paymentTracking.setTotalExpected(result.getTotalExpected()); + paymentTracking.setTotalNow(result.getTotalNow()); + } + } catch (Exception e) { + logger.error("paymentTrakingByUserDetails"); + } + + return paymentTracking; + } + + private static final long serialVersionUID = -3224360462532091920L; + final Logger logger = LogManager.getLogger(PaymentTrackingController.class); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/user/UserController.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/user/UserController.java new file mode 100644 index 0000000..2cd14fd --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/controller/user/UserController.java @@ -0,0 +1,95 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.user; + +import com.arrebol.apc.controller.mobile.repository.user.UserRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.core.constance.UserCfg; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class UserController implements Serializable { + + /** + * + * @param userId + * @return + * @throws Exception + */ + public boolean isUserEnebled(String userId) throws Exception { + logger.info("isUserEnebled"); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(UserCfg.FIELD_ID, userId)); + + return userId.equals(userRepository.findUserStatusById(UserCfg.QUERY_VERIFY_USER_STATUS_BY_ID, parameters)); + } catch (Exception e) { + logger.error("isUserEnebled", e); + throw e; + } + } + + /** + * + * @param userId + * @return + * @throws Exception + */ + public boolean containtsUserManagementProperty(String userId) throws Exception { + logger.info("containtsUserManagementProperty"); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(UserCfg.FIELD_ID, userId)); + + return userRepository.containtsUserManagementProperty(UserCfg.QUERY_IS_USER_MANAGMENT, parameters); + } catch (Exception e) { + logger.error("containtsUserManagementProperty", e); + throw e; + } + } + + /** + * + * @param idOffice + * @return + * @throws Exception + */ + public List listOfUsersByOffice(String idOffice) throws Exception { + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(UserCfg.FIELD_OFFICE, new Office(idOffice))); + + return userRepository.listOfUsersByOffice(UserCfg.QUERY_LIST_OF_USERS_BY_OFFICE, parameters); + } catch (Exception e) { + logger.error("listOfUsersByOffice", e); + throw e; + } + } + + private static final long serialVersionUID = -2705701746315543593L; + final Logger logger = LogManager.getLogger(getClass()); + + private final UserRepository userRepository; + + public UserController() { + this.userRepository = new UserRepository(); + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/AuthorizeTransferList.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/AuthorizeTransferList.java new file mode 100644 index 0000000..db61a0a --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/AuthorizeTransferList.java @@ -0,0 +1,96 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.json.loan; + +import java.util.List; +import java.util.Objects; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "authorizeTransferList") +public class AuthorizeTransferList { + + private String idUpdateUser; + private String comments; + private List transferListToUpdateStatus; + + /** + * + */ + public AuthorizeTransferList() { + } + + /** + * + * @param idUpdateUser + * @param comments + * @param transferListToUpdateStatus + */ + public AuthorizeTransferList(String idUpdateUser, String comments, List transferListToUpdateStatus) { + this.idUpdateUser = idUpdateUser; + this.comments = comments; + this.transferListToUpdateStatus = transferListToUpdateStatus; + } + + @XmlElement(name = "idUpdateUser") + public String getIdUpdateUser() { + return idUpdateUser; + } + + public void setIdUpdateUser(String idUpdateUser) { + this.idUpdateUser = idUpdateUser; + } + + @XmlElement(name = "comments") + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + @XmlElement(name = "transferListToUpdateStatus") + public List getTransferListToUpdateStatus() { + return transferListToUpdateStatus; + } + + public void setTransferListToUpdateStatus(List transferListToUpdateStatus) { + this.transferListToUpdateStatus = transferListToUpdateStatus; + } + + @Override + public int hashCode() { + int hash = 3; + hash = 31 * hash + Objects.hashCode(this.idUpdateUser); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final AuthorizeTransferList other = (AuthorizeTransferList) obj; + if (!Objects.equals(this.idUpdateUser, other.idUpdateUser)) { + return false; + } + return true; + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/AuthorizeTransferPaymentsDto.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/AuthorizeTransferPaymentsDto.java new file mode 100644 index 0000000..6656274 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/AuthorizeTransferPaymentsDto.java @@ -0,0 +1,117 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.json.loan; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "authorizeTransferPaymentsDto") +public class AuthorizeTransferPaymentsDto { + + private String idLoan; + private String strDate; + private String customerName; + private String endorsementName; + private String userName; + private Double amount; + private String comments; + + /** + * + */ + public AuthorizeTransferPaymentsDto() { + } + + /** + * + * @param idLoan + * @param strDate + * @param customerName + * @param endorsementName + * @param userName + * @param amount + * @param comments + */ + public AuthorizeTransferPaymentsDto(String idLoan, String strDate, String customerName, String endorsementName, String userName, Double amount, String comments) { + this.idLoan = idLoan; + this.strDate = strDate; + this.customerName = customerName; + this.endorsementName = endorsementName; + this.userName = userName; + this.amount = amount; + this.comments = comments; + } + + @XmlElement(name = "idLoan") + public String getIdLoan() { + return idLoan; + } + + public void setIdLoan(String idLoan) { + this.idLoan = idLoan; + } + + @XmlElement(name = "strDate") + public String getStrDate() { + return strDate; + } + + public void setStrDate(String strDate) { + this.strDate = strDate; + } + + @XmlElement(name = "customerName") + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + @XmlElement(name = "endorsementName") + public String getEndorsementName() { + return endorsementName; + } + + public void setEndorsementName(String endorsementName) { + this.endorsementName = endorsementName; + } + + @XmlElement(name = "userName") + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + @XmlElement(name = "amount") + public Double getAmount() { + return amount; + } + + public void setAmount(Double amount) { + this.amount = amount; + } + + @XmlElement(name = "comments") + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/DeleteLoanDetailsJaxb.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/DeleteLoanDetailsJaxb.java new file mode 100644 index 0000000..03f6fda --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/DeleteLoanDetailsJaxb.java @@ -0,0 +1,117 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.json.loan; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "deleteLoanDetailsJaxb") +public class DeleteLoanDetailsJaxb { + + private Boolean approvedOrPendingRenovation; + private Boolean todayPayment; + private Boolean todayFee; + private String loanId; + + public DeleteLoanDetailsJaxb() { + } + + /** + * + * @param approvedOrPendingRenovation + * @param todayPayment + * @param todayFee + */ + public DeleteLoanDetailsJaxb(Boolean approvedOrPendingRenovation, Boolean todayPayment, Boolean todayFee) { + this.approvedOrPendingRenovation = approvedOrPendingRenovation; + this.todayPayment = todayPayment; + this.todayFee = todayFee; + } + + /** + * + * @param approvedOrPendingRenovation + * @param todayPayment + * @param todayFee + * @param loanId + */ + public DeleteLoanDetailsJaxb(Boolean approvedOrPendingRenovation, Boolean todayPayment, Boolean todayFee, String loanId) { + this.approvedOrPendingRenovation = approvedOrPendingRenovation; + this.todayPayment = todayPayment; + this.todayFee = todayFee; + this.loanId = loanId; + } + + /** + * + * @param todayPayment + * @param todayFee + */ + public DeleteLoanDetailsJaxb(Boolean todayPayment, Boolean todayFee) { + this.todayPayment = todayPayment; + this.todayFee = todayFee; + } + + /** + * + * @param todayPayment + * @param todayFee + * @param loanId + */ + public DeleteLoanDetailsJaxb(Boolean todayPayment, Boolean todayFee, String loanId) { + this.todayPayment = todayPayment; + this.todayFee = todayFee; + this.loanId = loanId; + } + + @XmlElement(name = "approvedOrPendingRenovation") + public Boolean getApprovedOrPendingRenovation() { + return approvedOrPendingRenovation; + } + + public void setApprovedOrPendingRenovation(Boolean approvedOrPendingRenovation) { + this.approvedOrPendingRenovation = approvedOrPendingRenovation; + } + + @XmlElement(name = "todayPayment") + public Boolean getTodayPayment() { + return todayPayment; + } + + public void setTodayPayment(Boolean todayPayment) { + this.todayPayment = todayPayment; + } + + @XmlElement(name = "todayFee") + public Boolean getTodayFee() { + return todayFee; + } + + public void setTodayFee(Boolean todayFee) { + this.todayFee = todayFee; + } + + @XmlElement(name = "loanId") + public String getLoanId() { + return loanId; + } + + public void setLoanId(String loanId) { + this.loanId = loanId; + } + + @Override + public String toString() { + return "DeleteLoanDetailsJaxb{" + "approvedOrPendingRenovation=" + approvedOrPendingRenovation + ", todayPayment=" + todayPayment + ", todayFee=" + todayFee + '}'; + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/GenericAPCResponserJaxb.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/GenericAPCResponserJaxb.java new file mode 100644 index 0000000..2b4f184 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/GenericAPCResponserJaxb.java @@ -0,0 +1,97 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.json.loan; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "apcResponse") +public class GenericAPCResponserJaxb { + + private Boolean successful; + private String message; + private String idClosingDay; + private String idSmallBox; + private String idGeneralBox; + private Boolean enabledSubmit; + + /** + * + */ + public GenericAPCResponserJaxb() { + } + + /** + * + * @param successful + * @param message + */ + public GenericAPCResponserJaxb(Boolean successful, String message) { + this.successful = successful; + this.message = message; + } + + @XmlElement(name = "successful") + public Boolean getSuccessful() { + return null == successful ? Boolean.FALSE : successful; + } + + public void setSuccessful(Boolean successful) { + this.successful = successful; + } + + @XmlElement(name = "message") + public String getMessage() { + return null == message ? "" : message; + } + + public void setMessage(String message) { + this.message = message; + } + + @XmlElement(name = "idClosingDay") + public String getIdClosingDay() { + return idClosingDay; + } + + public void setIdClosingDay(String idClosingDay) { + this.idClosingDay = idClosingDay; + } + + @XmlElement(name = "idSmallBox") + public String getIdSmallBox() { + return idSmallBox; + } + + public void setIdSmallBox(String idSmallBox) { + this.idSmallBox = idSmallBox; + } + + @XmlElement(name = "idGeneralBox") + public String getIdGeneralBox() { + return idGeneralBox; + } + + public void setIdGeneralBox(String idGeneralBox) { + this.idGeneralBox = idGeneralBox; + } + + @XmlElement(name = "enabledSubmit") + public Boolean getEnabledSubmit() { + return null == enabledSubmit ? Boolean.FALSE : enabledSubmit; + } + + public void setEnabledSubmit(Boolean enabledSubmit) { + this.enabledSubmit = enabledSubmit; + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/LoanTypeJaxb.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/LoanTypeJaxb.java new file mode 100644 index 0000000..1f0977f --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/LoanTypeJaxb.java @@ -0,0 +1,73 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.json.loan; + +import java.math.BigDecimal; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "loan") +public class LoanTypeJaxb { + + private String id; + private BigDecimal payment; + private String description; + + public LoanTypeJaxb() { + } + + public LoanTypeJaxb(String id, BigDecimal payment) { + this.id = id; + this.payment = payment; + } + + public LoanTypeJaxb(String id, BigDecimal payment, String description) { + this.id = id; + this.payment = payment; + this.description = description; + } + + @XmlElement(name = "id") + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @XmlElement(name = "payment") + public BigDecimal getPayment() { + return payment; + } + + public void setPayment(BigDecimal payment) { + this.payment = payment; + } + + @XmlElement(name = "description") + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + + + @Override + public String toString() { + return "LoanTypeJaxb{" + "payment=" + payment + '}'; + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/LoanTypeListJaxb.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/LoanTypeListJaxb.java new file mode 100644 index 0000000..f775c4b --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/LoanTypeListJaxb.java @@ -0,0 +1,48 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.json.loan; + +import java.util.List; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "availableLoans") +public class LoanTypeListJaxb { + + private List loans; + + public LoanTypeListJaxb() { + } + + /** + * + * @param loans + */ + public LoanTypeListJaxb(List loans) { + this.loans = loans; + } + + @XmlElement(name = "loans") + public List getLoans() { + return loans; + } + + public void setLoans(List loans) { + this.loans = loans; + } + + @Override + public String toString() { + return "LoanTypeListJaxb{" + "loans=" + loans + '}'; + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/TransferListToUpdateStatus.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/TransferListToUpdateStatus.java new file mode 100644 index 0000000..075e456 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/TransferListToUpdateStatus.java @@ -0,0 +1,71 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.json.loan; + +import java.util.Objects; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "transferListToUpdateStatus") +public class TransferListToUpdateStatus { + + private String idLoan; + + /** + * + */ + public TransferListToUpdateStatus() { + } + + /** + * + * @param idLoan + */ + public TransferListToUpdateStatus(String idLoan) { + this.idLoan = idLoan; + } + + @XmlElement(name = "idLoan") + public String getIdLoan() { + return idLoan; + } + + public void setIdLoan(String idLoan) { + this.idLoan = idLoan; + } + + @Override + public int hashCode() { + int hash = 3; + hash = 79 * hash + Objects.hashCode(this.idLoan); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final TransferListToUpdateStatus other = (TransferListToUpdateStatus) obj; + if (!Objects.equals(this.idLoan, other.idLoan)) { + return false; + } + return true; + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/UpdateLoanToDeliveryStatusDTO.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/UpdateLoanToDeliveryStatusDTO.java new file mode 100644 index 0000000..461fe6c --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/UpdateLoanToDeliveryStatusDTO.java @@ -0,0 +1,102 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.json.loan; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "updateLoanToDeliveryStatusDTO") +public class UpdateLoanToDeliveryStatusDTO { + + private String idLoan; + private String strDate; + private String customerName; + private String endorsementName; + private String userName; + private Double amount; + + public UpdateLoanToDeliveryStatusDTO() { + } + + /** + * + * @param idLoan + * @param strDate + * @param customerName + * @param endorsementName + * @param userName + * @param amount + */ + public UpdateLoanToDeliveryStatusDTO(String idLoan, String strDate, String customerName, String endorsementName, String userName, Double amount) { + this.idLoan = idLoan; + this.strDate = strDate; + this.customerName = customerName; + this.endorsementName = endorsementName; + this.userName = userName; + this.amount = amount; + } + + @XmlElement(name = "idLoan") + public String getIdLoan() { + return idLoan; + } + + public void setIdLoan(String idLoan) { + this.idLoan = idLoan; + } + + @XmlElement(name = "strDate") + public String getStrDate() { + return strDate; + } + + public void setStrDate(String strDate) { + this.strDate = strDate; + } + + @XmlElement(name = "customerName") + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + @XmlElement(name = "endorsementName") + public String getEndorsementName() { + return endorsementName; + } + + public void setEndorsementName(String endorsementName) { + this.endorsementName = endorsementName; + } + + @XmlElement(name = "userName") + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + @XmlElement(name = "amount") + public Double getAmount() { + return amount; + } + + public void setAmount(Double amount) { + this.amount = amount; + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/UpdateLoanToDeliveryStatusList.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/UpdateLoanToDeliveryStatusList.java new file mode 100644 index 0000000..584a1ca --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/json/loan/UpdateLoanToDeliveryStatusList.java @@ -0,0 +1,67 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.json.loan; + +import java.util.List; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "updateLoanToDeliveryStatusList") +public class UpdateLoanToDeliveryStatusList { + + private String idUpdateUser; + private String comments; + private List loanToDeliveryList; + + public UpdateLoanToDeliveryStatusList() { + } + + /** + * + * @param idUpdateUser + * @param comments + * @param loanToDeliveryList + */ + public UpdateLoanToDeliveryStatusList(String idUpdateUser, String comments, List loanToDeliveryList) { + this.idUpdateUser = idUpdateUser; + this.comments = comments; + this.loanToDeliveryList = loanToDeliveryList; + } + + @XmlElement(name = "idUpdateUser") + public String getIdUpdateUser() { + return idUpdateUser; + } + + public void setIdUpdateUser(String idUpdateUser) { + this.idUpdateUser = idUpdateUser; + } + + @XmlElement(name = "comments") + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + @XmlElement(name = "loanToDeliveryList") + public List getLoanToDeliveryList() { + return loanToDeliveryList; + } + + public void setLoanToDeliveryList(List loanToDeliveryList) { + this.loanToDeliveryList = loanToDeliveryList; + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/PersonMxy.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/PersonMxy.java new file mode 100644 index 0000000..e9e3afe --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/PersonMxy.java @@ -0,0 +1,122 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.moxy; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public abstract class PersonMxy { + + protected String id; + protected String firstName; + protected String secondName; + protected String lastName; + protected String middleName; + protected String addressHome; + protected String addressWork; + protected String phoneHome; + protected String phoneWork; + protected String thumbnail; + + public PersonMxy() { + } + + public PersonMxy(String id, String firstName, String lastName, String thumbnail) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + this.thumbnail = thumbnail; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getSecondName() { + return secondName; + } + + public void setSecondName(String secondName) { + this.secondName = secondName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getMiddleName() { + return middleName; + } + + public void setMiddleName(String middleName) { + this.middleName = middleName; + } + + public String getAddressHome() { + return addressHome; + } + + public void setAddressHome(String addressHome) { + this.addressHome = addressHome; + } + + public String getAddressWork() { + return addressWork; + } + + public void setAddressWork(String addressWork) { + this.addressWork = addressWork; + } + + public String getPhoneHome() { + return phoneHome; + } + + public void setPhoneHome(String phoneHome) { + this.phoneHome = phoneHome; + } + + public String getPhoneWork() { + return phoneWork; + } + + public void setPhoneWork(String phoneWork) { + this.phoneWork = phoneWork; + } + + public String getThumbnail() { + return thumbnail; + } + + public void setThumbnail(String thumbnail) { + this.thumbnail = thumbnail; + } + + @Override + public String toString() { + return "PersonMxy{" + "firstName=" + firstName + ", lastName=" + lastName + '}'; + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/login/UserMxy.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/login/UserMxy.java new file mode 100644 index 0000000..f230c8c --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/login/UserMxy.java @@ -0,0 +1,121 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.moxy.login; + +import com.arrebol.apc.controller.mobile.moxy.PersonMxy; +import java.util.List; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class UserMxy extends PersonMxy { + + private String userName; + private String officeId; + private String routeId; + private String certifier; + private String management; + + private List preferences; + + public UserMxy() { + } + + /** + * + * @param id + * @param userName + * @param thumbnail + * @param officeId + * @param routeId + * @param certifier + */ + public UserMxy(String id, String userName, String thumbnail, String officeId, String routeId, String certifier) { + this.id = id; + this.userName = userName; + this.thumbnail = thumbnail; + this.officeId = officeId; + this.routeId = routeId; + this.certifier = certifier; + } + + /** + * + * @param id + * @param userName + * @param thumbnail + * @param officeId + * @param routeId + * @param certifier + * @param management + */ + public UserMxy(String id, String userName, String thumbnail, String officeId, String routeId, String certifier, String management) { + this.id = id; + this.userName = userName; + this.thumbnail = thumbnail; + this.officeId = officeId; + this.routeId = routeId; + this.certifier = certifier; + this.management = management; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getOfficeId() { + return officeId; + } + + public void setOfficeId(String officeId) { + this.officeId = officeId; + } + + public void setPreferences(List preferences) { + this.preferences = preferences; + } + + public List getPreferences() { + return preferences; + } + + public String getRouteId() { + return routeId; + } + + public void setRouteId(String routeId) { + this.routeId = routeId; + } + + public String getCertifier() { + return certifier; + } + + public void setCertifier(String certifier) { + this.certifier = certifier; + } + + public String getManagement() { + return management; + } + + public void setManagement(String management) { + this.management = management; + } + + @Override + public String toString() { + return "UserMxy{" + "userName=" + userName + ", preferences=" + preferences + '}'; + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/login/UserPreferenceMxy.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/login/UserPreferenceMxy.java new file mode 100644 index 0000000..dff1fee --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/login/UserPreferenceMxy.java @@ -0,0 +1,53 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.moxy.login; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class UserPreferenceMxy { + + private String preferenceName; + private String preferenceValue; + + public UserPreferenceMxy() { + } + + /** + * + * @param preferenceName + * @param preferenceValue + */ + public UserPreferenceMxy(String preferenceName, String preferenceValue) { + this.preferenceName = preferenceName; + this.preferenceValue = preferenceValue; + } + + public String getPreferenceName() { + return preferenceName; + } + + public void setPreferenceName(String preferenceName) { + this.preferenceName = preferenceName; + } + + public String getPreferenceValue() { + return preferenceValue; + } + + public void setPreferenceValue(String preferenceValue) { + this.preferenceValue = preferenceValue; + } + + @Override + public String toString() { + return "UserPreferenceMxy{" + "preferenceName=" + preferenceName + '}'; + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/views/ContainerRoutes.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/views/ContainerRoutes.java new file mode 100644 index 0000000..1282ac4 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/views/ContainerRoutes.java @@ -0,0 +1,43 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.moxy.views; + +import java.util.List; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "containerRoutes") +public class ContainerRoutes { + + private List routes; + + public ContainerRoutes() { + } + + /** + * + * @param routes + */ + public ContainerRoutes(List routes) { + this.routes = routes; + } + + @XmlElement(name = "routes") + public List getRoutes() { + return routes; + } + + public void setRoutes(List routes) { + this.routes = routes; + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/views/LoanByUserOrderPreferenceViewJaxb.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/views/LoanByUserOrderPreferenceViewJaxb.java new file mode 100644 index 0000000..e96591d --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/views/LoanByUserOrderPreferenceViewJaxb.java @@ -0,0 +1,116 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.moxy.views; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "loanByUserOrderPreference") +public class LoanByUserOrderPreferenceViewJaxb { + + private String id; + + private String userId; + + private String customerName; + + private String customerAddressHome; + + private String customerAddressBusiness; + + private Integer orderInList; + + public LoanByUserOrderPreferenceViewJaxb() { + } + + /** + * + * @param id + * @param userId + * @param orderInList + */ + public LoanByUserOrderPreferenceViewJaxb(String id, String userId, Integer orderInList) { + this.id = id; + this.userId = userId; + this.orderInList = orderInList; + } + + /** + * + * @param customerName + * @param orderInList + */ + public LoanByUserOrderPreferenceViewJaxb(String customerName, Integer orderInList) { + this.customerName = customerName; + this.orderInList = orderInList; + } + + @XmlAttribute(name = "id") + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @XmlAttribute(name = "userId") + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + @XmlAttribute(name = "customerName") + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + @XmlAttribute(name = "customerAddressHome") + public String getCustomerAddressHome() { + return customerAddressHome; + } + + public void setCustomerAddressHome(String customerAddressHome) { + this.customerAddressHome = customerAddressHome; + } + + @XmlAttribute(name = "customerAddressBusiness") + public String getCustomerAddressBusiness() { + return customerAddressBusiness; + } + + public void setCustomerAddressBusiness(String customerAddressBusiness) { + this.customerAddressBusiness = customerAddressBusiness; + } + + @XmlAttribute(name = "orderInList") + public Integer getOrderInList() { + return orderInList; + } + + public void setOrderInList(Integer orderInList) { + this.orderInList = orderInList; + } + + @Override + public String toString() { + return "LoanByUserOrderPreferenceViewJaxb{" + "customerName=" + customerName + ", orderInList=" + orderInList + '}'; + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/views/LoanByUserOrderPreferenceViewListJaxb.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/views/LoanByUserOrderPreferenceViewListJaxb.java new file mode 100644 index 0000000..db05f0e --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/views/LoanByUserOrderPreferenceViewListJaxb.java @@ -0,0 +1,39 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.moxy.views; + +import java.util.List; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "systemPreferences") +public class LoanByUserOrderPreferenceViewListJaxb { + + List loanByUserOrderPreferences; + + public LoanByUserOrderPreferenceViewListJaxb() { + } + + public LoanByUserOrderPreferenceViewListJaxb(List loanByUserOrderPreferences) { + this.loanByUserOrderPreferences = loanByUserOrderPreferences; + } + + @XmlElement(name = "loanByUserOrderPreferences") + public List getLoanByUserOrderPreferences() { + return loanByUserOrderPreferences; + } + + public void setLoanByUserOrderPreferences(List loanByUserOrderPreferences) { + this.loanByUserOrderPreferences = loanByUserOrderPreferences; + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/views/PaymentTrackingViewJaxb.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/views/PaymentTrackingViewJaxb.java new file mode 100644 index 0000000..36eacce --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/views/PaymentTrackingViewJaxb.java @@ -0,0 +1,60 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.moxy.views; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "paymentTracking") +public class PaymentTrackingViewJaxb { + + private String id; + + private Integer totalExpected; + + private Integer totalNow; + + @XmlElement(name = "id") + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @XmlElement(name = "totalExpected") + public Integer getTotalExpected() { + if (null == totalExpected) { + totalExpected = 0; + } + return totalExpected; + } + + public void setTotalExpected(Integer totalExpected) { + this.totalExpected = totalExpected; + } + + @XmlElement(name = "totalNow") + public Integer getTotalNow() { + if (null == totalNow) { + totalNow = 0; + } + + return totalNow; + } + + public void setTotalNow(Integer totalNow) { + this.totalNow = totalNow; + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/views/RouteJaxb.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/views/RouteJaxb.java new file mode 100644 index 0000000..14c6b0d --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/moxy/views/RouteJaxb.java @@ -0,0 +1,49 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.moxy.views; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "route") +public class RouteJaxb { + + private String id; + private String name; + + public RouteJaxb() { + } + + public RouteJaxb(String id, String name) { + this.id = id; + this.name = name; + } + + @XmlElement(name = "id") + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @XmlElement(name = "name") + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/ArrebolTestRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/ArrebolTestRepository.java new file mode 100644 index 0000000..b7d4d0d --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/ArrebolTestRepository.java @@ -0,0 +1,39 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository; + +import com.arrebol.apc.test.ArrebolTest; +import java.io.Serializable; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class ArrebolTestRepository extends GenericRepository implements Serializable { + + /** + * + * @param arrebolTest + * @return + * @throws Exception + */ + public boolean saveArrebolTest(ArrebolTest arrebolTest) throws Exception { + logger.info("saveArrebolTest"); + try { + return save(arrebolTest); + } catch (Exception e) { + logger.error("saveArrebolTest", e); + throw e; + } + } + + private static final long serialVersionUID = -6564619785642944612L; + final Logger logger = LogManager.getLogger(ArrebolTestRepository.class); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/GenericRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/GenericRepository.java new file mode 100644 index 0000000..30d1351 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/GenericRepository.java @@ -0,0 +1,671 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository; + +import com.arrebol.apc.controller.mobile.util.HibernateUtil; +import com.arrebol.apc.model.ModelParameter; +import java.util.ArrayList; +import java.util.List; +import javax.persistence.Tuple; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.Query; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public abstract class GenericRepository { + + private Session sessionOld; + private Transaction transactionOld; + + /** + * Save an APC entity. + * + * @param entity APC entity in DB. + * @return + * @throws java.lang.Exception + */ + protected boolean save(Object entity) throws Exception { + logger.debug("Save"); + boolean success = false; + + Session session = null; + Transaction transaction = null; + try { + session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + session.save(entity); + + transaction.commit(); + logger.debug("Entity saved: " + entity); + + success = true; + } catch (HibernateException e) { + logger.error("Save Hibernate", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method save() ", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } + /* finally { + if (null != session) { + session.close(); + } + }*/ + + return success; + } + + /** + * + * @param entities + * @return + * @throws java.lang.Exception + */ + protected boolean saveMany(List entities) throws Exception { + logger.debug("saveMany"); + boolean success = false; + + Session session = null; + Transaction transaction = null; + try { + session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + for (Object entity : entities) { + session.save(entity); + } + + transaction.commit(); + + logger.debug("Entities saveMany: "); + + success = true; + } catch (HibernateException e) { + logger.error("saveMany Hibernate", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method saveMany() ", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } + /* finally { + if (null != session) { + session.close(); + } + }*/ + + return success; + } + + /** + * Update an APC entity. + * + * @param entity APC entity in DB. + * @return + * @throws java.lang.Exception + */ + protected boolean update(Object entity) throws Exception { + logger.debug("update"); + + boolean success = false; + Transaction transaction = null; + + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + session.update(entity); + + transaction.commit(); + + logger.debug("Entity updated: " + entity); + + success = true; + } catch (HibernateException e) { + logger.error("update Hibernate", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("update save() ", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } + + return success; + } + + /** + * + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + protected boolean updateCreateNamedQuery(String xmlQuery, List parameters) throws Exception { + logger.debug("updateCreateNamedQuery"); + boolean success = false; + + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + if (null != parameters && !parameters.isEmpty()) { + Query query = session.createNamedQuery(xmlQuery); + + parameters.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + + query.executeUpdate(); + logger.debug("Query update executed"); + } + + transaction.commit(); + + logger.debug("Entity updateCreateNamedQuery"); + + success = true; + } catch (HibernateException e) { + logger.error("updateCreateNamedQuery Hibernate", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method updateCreateNamedQuery() ", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } + return success; + } + + /** + * Delete an APC entity. + * + * @param entity APC entity in DB. + * @return + * @throws java.lang.Exception + */ + protected boolean delete(Object entity) throws Exception { + logger.debug("delete"); + boolean success = false; + + Session session = null; + Transaction transaction = null; + try { + session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + session.delete(entity); + + transaction.commit(); + + logger.debug("Entity deleted: " + entity); + + success = true; + } catch (HibernateException e) { + logger.error("delete Hibernate", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method delete() ", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } + /* finally { + if (null != session) { + session.close(); + } + }*/ + + return success; + } + + /** + * Find a APC entity. + * + * @param clazz APC entity class name to find in DB. + * @param id + * @return + * @throws java.lang.Exception + */ + protected Object findAPCEntity(Class clazz, String id) throws Exception { + logger.debug("findAPCEntity"); + + Object apcEntity = null; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + apcEntity = session.get(clazz, id); + + transaction.commit(); + + logger.debug("APC entity found: " + apcEntity); + } catch (HibernateException e) { + logger.error("findAPCEntity Hibernate", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method findAPCEntity() ", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } + + return apcEntity; + } + + /** + * Execute a query from XML mapping file. + * + * @param clazz + * @param xmlQuery + * @param parameters + * @return + * @throws java.lang.Exception + */ + protected Object createNamedQueryUniqueResult(Class clazz, String xmlQuery, List parameters) throws Exception { + logger.debug("createNamedQueryUniqueResult"); + + Object entity = null; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + if (null != parameters && !parameters.isEmpty()) { + Query query = session.createNamedQuery(xmlQuery, clazz); + + parameters.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + + entity = query.uniqueResult(); + } + + transaction.commit(); + logger.debug("APC entity from xml query: " + entity); + } catch (HibernateException e) { + logger.error("createNamedQueryUniqueResult Hibernate", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method createNamedQueryUniqueResult() ", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } + + return entity; + } + + /** + * + * @param clazz + * @param xmlQuery + * @param parameters + * @return + * @throws java.lang.Exception + */ + protected List createNamedQueryResultList(Class clazz, String xmlQuery, List parameters) throws Exception { + logger.debug("createNamedQueryResultList"); + + List entities = new ArrayList<>(); + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + if (null != parameters && !parameters.isEmpty()) { + Query query = session.createNamedQuery(xmlQuery, clazz); + + parameters.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + + entities = query.getResultList(); + } + + transaction.commit(); + logger.debug("Total of APC entities from xml query: " + entities.size()); + } catch (HibernateException e) { + logger.error("createNamedQueryResultList Hibernate", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method createNamedQueryResultList() ", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } + + return entities; + } + + /** + * + * @param clazz + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + protected List findEntityList(Class clazz, String xmlQuery, List parameters) throws Exception { + logger.debug("findEntityList"); + + List entities = new ArrayList<>(); + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + Query query = session.createNamedQuery(xmlQuery, clazz); + + if (null != parameters && !parameters.isEmpty()) { + parameters.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + } + + entities = query.getResultList(); + + transaction.commit(); + logger.debug("Total of APC entities from xml query: " + entities.size()); + } catch (HibernateException e) { + logger.error("findEntityList Hibernate", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method findEntityList() ", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } + + return entities; + } + + /** + * + * @param clazz + * @param xmlQuery + * @param parameters + * @param max + * @return + * @throws java.lang.Exception + */ + protected List createNamedQueryResultList(Class clazz, String xmlQuery, List parameters, int max) throws Exception { + logger.debug("createNamedQueryResultList"); + + List entities = new ArrayList<>(); + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + if (null != parameters && !parameters.isEmpty()) { + Query query = session.createNamedQuery(xmlQuery, clazz); + + parameters.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + + query.setMaxResults(max); + + entities = query.getResultList(); + } + + transaction.commit(); + logger.debug("Total of APC entities from xml query: " + entities.size()); + } catch (HibernateException e) { + logger.error("createNamedQueryResultList Hibernate", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method createNamedQueryResultList() ", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } + + return entities; + } + + /** + * + * @param xmlQuery + * @param parameters + * @return + */ + protected List xmlQueryTuple(String xmlQuery, List parameters) { + logger.debug("xmlQueryTuple"); + + List entityList = null; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + Query query = session.createNamedQuery(xmlQuery, Tuple.class); + + if (null != parameters && !parameters.isEmpty()) { + parameters.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + + entityList = query.getResultList(); + } + + transaction.commit(); + } catch (HibernateException e) { + logger.error("xmlQueryTuple Hibernate", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method xmlQueryTuple() ", e); + + if (null != transaction) { + transaction.rollback(); + } + throw e; + } + + return entityList; + } + + /** + * + * @param xmlUpdateOrDeleteQuery + * @param parameters + * @return + */ + protected boolean xmlUpdateOrDelete(String xmlUpdateOrDeleteQuery, List parameters) { + boolean success = false; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + Query updateOrDeleteQuery = session.createNamedQuery(xmlUpdateOrDeleteQuery); + + if (null != parameters && !parameters.isEmpty()) { + parameters.forEach((parameter) -> { + updateOrDeleteQuery.setParameter(parameter.getParameter(), parameter.getValue()); + }); + + int total = updateOrDeleteQuery.executeUpdate(); + + if (total > 0) { + transaction.commit(); + success = true; + } else { + transaction.rollback(); + } + } else { + transaction.rollback(); + } + } catch (HibernateException e) { + logger.error("xmlUpdateOrDelete Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method xmlUpdateOrDelete() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } + + return success; + } + + public Object genericObjectFromEntity(Class clazz, String xmlQuery, List parameters) throws Exception { + logger.debug("genericObjectFromEntity"); + + Object entity = null; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + Query query = session.createNamedQuery(xmlQuery, clazz); + + if (null != parameters) { + parameters.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + } + + entity = query.uniqueResult(); + transaction.commit(); + + logger.debug("APC generic entity from xml query: " + entity); + } catch (HibernateException e) { + logger.error("genericObjectFromEntity Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method genericObjectFromEntity() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } + return entity; + } + + protected Session getSession() { + return sessionOld; + } + + protected void openConnection() { + try { + sessionOld = HibernateUtil.getSessionFactory().getCurrentSession(); + transactionOld = getSession().beginTransaction(); + } catch (Exception e) { + logger.error("openConnection", e); + throw e; + } + } + + protected void closeConnection() { + try { + transactionOld.commit(); + } catch (Exception e) { + logger.error("closeConnection", e); + rollback(); + } + } + + protected void rollback() { + if (null != transactionOld) { + transactionOld.rollback(); + } + } + + protected void flushAndClear() { + if (null != sessionOld) { + getSession().flush(); + getSession().clear(); + } + } + + final Logger logger = LogManager.getLogger(GenericRepository.class); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/admin/ClosingDayRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/admin/ClosingDayRepository.java new file mode 100644 index 0000000..104d7c8 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/admin/ClosingDayRepository.java @@ -0,0 +1,78 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.admin; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.ClosingDayCfg; +import java.io.Serializable; +import java.util.List; +import javax.persistence.Tuple; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class ClosingDayRepository extends GenericRepository implements Serializable { + + /** + * + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public String findIdEntity(String xmlQuery, List parameters) throws Exception { + try { + for (Tuple tuple : xmlQueryTuple(xmlQuery, parameters)) { + return tuple.get(ClosingDayCfg.FIELD_ID, String.class); + } + + return null; + } catch (Exception e) { + logger.error("findIdEntity", e); + throw e; + } + } + + /** + * + * @param hbmQuery + * @param parameters + * @return + * @throws Exception + */ + public boolean updateClosingDay(String hbmQuery, List parameters) throws Exception { + try { + return xmlUpdateOrDelete(hbmQuery, parameters); + } catch (Exception e) { + logger.error("updateClosingDay", e); + throw e; + } + } + + /** + * + * @param hbmQuery + * @param parameters + * @return + * @throws Exception + */ + public Long countIdClosingDayByEmployee(String hbmQuery, List parameters) throws Exception { + try { + return (Long) genericObjectFromEntity(Long.class, hbmQuery, parameters); + } catch (Exception e) { + logger.error("countIdClosingDayByEmployee", e); + throw e; + } + } + + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/admin/OtherExpenseRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/admin/OtherExpenseRepository.java new file mode 100644 index 0000000..abf7681 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/admin/OtherExpenseRepository.java @@ -0,0 +1,41 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.admin; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.admin.OtherExpense; +import java.io.Serializable; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class OtherExpenseRepository extends GenericRepository implements Serializable { + + /** + * + * @param otherExpense + * @return + * @throws Exception + */ + public boolean saveOtherExpense(OtherExpense otherExpense) throws Exception { + logger.debug("addOtherExpense"); + try { + return save(otherExpense); + } catch (Exception e) { + logger.error("addOtherExpense", e); + throw e; + } + } + + private static final long serialVersionUID = -8510072805726896888L; + final Logger logger = LogManager.getLogger(OtherExpenseRepository.class); + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/admin/StableGeneralBoxRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/admin/StableGeneralBoxRepository.java new file mode 100644 index 0000000..8eb2938 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/admin/StableGeneralBoxRepository.java @@ -0,0 +1,40 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.admin; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import java.io.Serializable; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class StableGeneralBoxRepository extends GenericRepository implements Serializable { + + /** + * + * @param hbmQuery + * @param parameters + * @return + * @throws Exception + */ + public Long countStableGeneralBoxByOfficeEqualsToCurrentDate(String hbmQuery, List parameters) throws Exception { + try { + return (Long) genericObjectFromEntity(Long.class, hbmQuery, parameters); + } catch (Exception e) { + logger.error("countStableGeneralBoxByOfficeEqualsToCurrentDate", e); + throw e; + } + } + + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/admin/StableSmallBoxRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/admin/StableSmallBoxRepository.java new file mode 100644 index 0000000..ab6a6b1 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/admin/StableSmallBoxRepository.java @@ -0,0 +1,78 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.admin; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.StableSmallBoxCfg; +import java.io.Serializable; +import java.util.List; +import javax.persistence.Tuple; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class StableSmallBoxRepository extends GenericRepository implements Serializable { + + /** + * + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public String findIdEntity(String xmlQuery, List parameters) throws Exception { + try { + for (Tuple tuple : xmlQueryTuple(xmlQuery, parameters)) { + return tuple.get(StableSmallBoxCfg.FIELD_ID, String.class); + } + + return null; + } catch (Exception e) { + logger.error("findIdEntity", e); + throw e; + } + } + + /** + * + * @param hbmQuery + * @param parameters + * @return + * @throws Exception + */ + public boolean updateStableSmallBox(String hbmQuery, List parameters) throws Exception { + try { + return xmlUpdateOrDelete(hbmQuery, parameters); + } catch (Exception e) { + logger.error("updateStableSmallBox", e); + throw e; + } + } + + /** + * + * @param hbmQuery + * @param parameters + * @return + * @throws Exception + */ + public Long countStableSmallBoxByOfficeEqualsToCurrentDate(String hbmQuery, List parameters) throws Exception { + try { + return (Long) genericObjectFromEntity(Long.class, hbmQuery, parameters); + } catch (Exception e) { + logger.error("countStableSmallBoxByOfficeEqualsToCurrentDate", e); + throw e; + } + } + + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/admin/TransferRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/admin/TransferRepository.java new file mode 100644 index 0000000..63489f1 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/admin/TransferRepository.java @@ -0,0 +1,94 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.admin; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.Transfer; +import com.arrebol.apc.model.ws.parsed.Exchange; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import javax.persistence.Tuple; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class TransferRepository extends GenericRepository implements Serializable { + + /** + * + * @param transfer + * @return + * @throws Exception + */ + public boolean addTransfer(Transfer transfer) throws Exception { + logger.debug("addTransfer"); + try { + return save(transfer); + } catch (Exception e) { + logger.error("addTransfer", e); + throw e; + } + } + + /** + * + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public boolean updateTransfer(String xmlQuery, List parameters) throws Exception { + logger.debug("updateTransfer"); + try { + return updateCreateNamedQuery(xmlQuery, parameters); + } catch (Exception e) { + logger.error("updateTransfer", e); + throw e; + } + } + + /** + * + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public List findAllTransferByUserIdAndCurdate(String xmlQuery, List parameters) throws Exception { + logger.debug("findAllTransferByUserIdAndCurdate"); + List results = new ArrayList<>(); + try { + List tuples = xmlQueryTuple(xmlQuery, parameters); + + tuples.forEach((tuple) -> { + results.add( + new Exchange( + tuple.get("id").toString(), + tuple.get("userTransmitter").toString().equals("SENDER"), + (BigDecimal) tuple.get("amountToTransfer"), + tuple.get("actionStatus").toString() + ) + ); + }); + + return results; + } catch (Exception e) { + logger.error("findAllTransferByUserIdAndCurdate", e); + throw e; + } + } + + private static final long serialVersionUID = 1787207383193052932L; + final Logger logger = LogManager.getLogger(TransferRepository.class); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/bitacora/BitacoraRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/bitacora/BitacoraRepository.java new file mode 100644 index 0000000..db770e7 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/bitacora/BitacoraRepository.java @@ -0,0 +1,40 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.bitacora; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.system.logs.Bitacora; +import java.io.Serializable; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class BitacoraRepository extends GenericRepository implements Serializable { + + /** + * + * @param bitacora + * @return + */ + public boolean saveBitacora(Bitacora bitacora) { + boolean success; + try { + success = save(bitacora); + } catch (Exception e) { + success = false; + logger.error("saveBitacora", e); + } + return success; + } + + final Logger logger = LogManager.getLogger(getClass()); + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/gasoline/GasolineRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/gasoline/GasolineRepository.java new file mode 100644 index 0000000..4ebf827 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/gasoline/GasolineRepository.java @@ -0,0 +1,48 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.gasoline; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.gasoline.Gasoline; +import java.io.Serializable; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class GasolineRepository extends GenericRepository implements Serializable { + + /** + * + * @param gasoline + * @return + * @throws Exception + */ + public boolean saveNewGasolinePayment(Gasoline gasoline) throws Exception { + boolean success = false; + + try { + save(gasoline); + + logger.info("New gasoline payment saved"); + + success = true; + } catch (Exception e) { + logger.error("addNewGasolineEntry", e); + + throw e; + } + + return success; + } + + private static final long serialVersionUID = -5280895557294295010L; + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/jaas/AuthenticationRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/jaas/AuthenticationRepository.java new file mode 100644 index 0000000..754d768 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/jaas/AuthenticationRepository.java @@ -0,0 +1,89 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.jaas; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.core.constance.MobileUserCfg; +import com.arrebol.apc.model.core.constance.UserMobilePreferenceCfg; +import com.arrebol.apc.model.mobile.access.MobileUser; +import com.arrebol.apc.model.mobile.preference.UserMobilePreference; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class AuthenticationRepository extends GenericRepository implements Serializable { + + /** + * + * @param userName + * @param password + * @return + * @throws Exception + */ + public MobileUser findUser(String userName, String password) throws Exception { + logger.debug("findUser"); + + MobileUser mobileUser = null; + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(MobileUserCfg.FIELD_USER_NAME, userName)); + parameters.add(new ModelParameter(MobileUserCfg.FIELD_PASSWORD, password)); + + mobileUser = (MobileUser) createNamedQueryUniqueResult( + MobileUser.class, + MobileUserCfg.QUERY_FIND_MOBILE_USER_FROM_LOGIN, + parameters + ); + } catch (Exception e) { + logger.error("findUser", e); + throw e; + } + return mobileUser; + } + + /** + * + * @param userId + * @return + * @throws Exception + */ + public List findAllMobilePreferenceByUser(String userId) throws Exception { + logger.debug("findAllMobilePreferenceByUser"); + + List userMobilePreferences = new ArrayList<>(); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(UserMobilePreferenceCfg.FIELD_USER, new User(userId))); + + userMobilePreferences = createNamedQueryResultList( + UserMobilePreference.class, + UserMobilePreferenceCfg.QUERY_FIND_ALL_MOBILE_PREFERENCES_BY_USER, + parameters + ); + + } catch (Exception e) { + logger.error("findAllMobilePreferenceByUser", e); + throw e; + } + return userMobilePreferences; + } + + private static final long serialVersionUID = 4218734911509288001L; + final Logger logger = LogManager.getLogger(AuthenticationRepository.class); + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/AddAmountRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/AddAmountRepository.java new file mode 100644 index 0000000..b8d2709 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/AddAmountRepository.java @@ -0,0 +1,93 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.loan; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.loan.LoanDetails; +import com.arrebol.apc.model.loan.LoanFeeNotification; +import java.io.Serializable; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.HibernateException; +import org.hibernate.query.Query; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class AddAmountRepository extends GenericRepository implements Serializable { + + /** + * + * @param notification + * @param loanDetails + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public boolean saveNewAmount( + LoanFeeNotification notification, + LoanDetails loanDetails, + String xmlQuery, + List parameters) throws Exception { + logger.debug("saveNewAmount"); + + boolean success = false; + int total = 0; + + try { + openConnection(); + + if (null != notification) { + getSession().save(notification); + logger.info("Notification saved: " + notification); + } + + getSession().save(loanDetails); + logger.info("Loan details saved: " + loanDetails); + + if (null != parameters && !parameters.isEmpty()) { + Query query = getSession().createNamedQuery(xmlQuery); + + parameters.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + + total = query.executeUpdate(); + logger.info("Query update executed"); + } + + if (total > 0) { + flushAndClear(); + closeConnection(); + + success = true; + + logger.info("Loan successfuly saved"); + } else { + logger.error("Loan could not be added: " + loanDetails); + rollback(); + } + } catch (HibernateException e) { + logger.error("Save Hibernate", e); + rollback(); + throw e; + } catch (Exception e) { + logger.error("Method save() ", e); + rollback(); + throw e; + } + return success; + } + + private static final long serialVersionUID = 6466918195145358594L; + final Logger logger = LogManager.getLogger(AddAmountRepository.class); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanByRenovationRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanByRenovationRepository.java new file mode 100644 index 0000000..094353f --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanByRenovationRepository.java @@ -0,0 +1,219 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.loan; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.core.constance.LoanByRenovationCfg; +import com.arrebol.apc.model.core.constance.LoanByUserCfg; +import com.arrebol.apc.model.core.constance.LoanCfg; +import com.arrebol.apc.model.enums.ComissionType; +import com.arrebol.apc.model.enums.LoanRenovationStatus; +import com.arrebol.apc.model.enums.LoanStatus; +import com.arrebol.apc.model.loan.Delivery; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.loan.LoanByRenovation; +import com.arrebol.apc.model.loan.LoanDetails; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.query.Query; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class LoanByRenovationRepository extends GenericRepository implements Serializable { + + private static final long serialVersionUID = 1357519239619447184L; + final Logger logger = LogManager.getLogger(LoanByRenovationRepository.class); + + /** + * + * @param newLoanId + * @return + * @throws Exception + */ + public LoanByRenovation findLoanRenovationByNewLoanId(String newLoanId) throws Exception { + logger.debug("findLoanRenovationByNewLoanId"); + try { + List parameters = new ArrayList<>(); + + parameters.add( + new ModelParameter(LoanByRenovationCfg.FIELD_LOAN_NEW, new Loan(newLoanId)) + ); + + return (LoanByRenovation) createNamedQueryUniqueResult( + LoanByRenovation.class, + LoanByRenovationCfg.QUERY_FIND_LOAN_RENOVATION_BY_NEW_LOAN_ID, + parameters); + } catch (Exception e) { + logger.error("findLoanRenovationByNewLoanId", e); + throw e; + } + } + + /** + * + * @param loanByRenovation + * @param userId + * @param comments + * @param action + * @param amount + * @param discount + * @param loanDetails + * @param totalAmountPaid + * @param newLastReferenceNumber + * @param comission + * @return + * @throws Exception + */ + public boolean updateLoanRenovationFromCerfierView( + LoanByRenovation loanByRenovation, + String userId, + String comments, + boolean action, + BigDecimal amount, + BigDecimal discount, + LoanDetails loanDetails, + BigDecimal totalAmountPaid, + Integer newLastReferenceNumber, + ComissionType comission) throws Exception { + logger.debug("updateLoanRenovationFromCerfierView"); + boolean success = false; + try { + openConnection(); + + Date lastUpdatedOn = new Date(); + List parameters = new ArrayList<>(); + + // Update loanByRenovation details in Renovation table + parameters.add(new ModelParameter(LoanByRenovationCfg.FIELD_LOAN_RENOVATION_STATUS, action ? LoanRenovationStatus.APPROVED : LoanRenovationStatus.REJECTED)); + parameters.add(new ModelParameter(LoanByRenovationCfg.FIELD_COMMENTS, comments)); + parameters.add(new ModelParameter(LoanByRenovationCfg.FIELD_LAST_UPDATED_BY, userId)); + parameters.add(new ModelParameter(LoanByRenovationCfg.FIELD_LAST_UPDATED_ON, lastUpdatedOn)); + parameters.add(new ModelParameter(LoanByRenovationCfg.FIELD_ID, loanByRenovation.getId())); + + if (0 < executeQuery(LoanByRenovationCfg.QUERY_UPDATE_LOAN_RENOVATION, parameters)) { + + parameters.clear(); + + // Update NEW loan details in Loan table + parameters.add(new ModelParameter(LoanCfg.FIELD_LOAN_STATUS, action ? LoanStatus.APPROVED : LoanStatus.REJECTED)); + parameters.add(new ModelParameter(LoanCfg.FIELD_COMMENTS, comments)); + parameters.add(new ModelParameter(LoanCfg.FIELD_CREATED_ON, lastUpdatedOn)); + parameters.add(new ModelParameter(LoanCfg.FIELD_LAST_UPDATED_BY, userId)); + parameters.add(new ModelParameter(LoanCfg.FIELD_LAST_UPDATED_ON, lastUpdatedOn)); + parameters.add(new ModelParameter(LoanCfg.FIELD_ID, loanByRenovation.getLoanNew().getId())); + + if (0 < executeQuery(LoanCfg.QUERY_UPDATE_LOAN_WITH_CREATED_ON_BY_ID_FROM_CERTIFIER_VIEW, parameters)) { + parameters.clear(); + + // Update OLD loan details in Loan table + String commentsOldLoan = action ? "Crédito renovado" : "El certificador rechazo la renovación de este crédito"; + String strQuery = LoanCfg.QUERY_UPDATE_LOAN_BY_ID_FROM_CERTIFIER_VIEW; + + if (action && null != loanDetails && null != totalAmountPaid && null != newLastReferenceNumber) { + parameters.add(new ModelParameter(LoanCfg.FIELD_AMOUNT_PAID, totalAmountPaid)); + parameters.add(new ModelParameter(LoanCfg.FIELD_LAST_REFERENCE_NUMBER, newLastReferenceNumber)); + + strQuery = LoanCfg.QUERY_UPDATE_DISCOUNT_AND_LOAN_BY_ID_FROM_CERTIFIER_VIEW; + } + + parameters.add(new ModelParameter(LoanCfg.FIELD_LOAN_STATUS, action ? LoanStatus.FINISH : LoanStatus.APPROVED)); + parameters.add(new ModelParameter(LoanCfg.FIELD_COMMENTS, commentsOldLoan)); + parameters.add(new ModelParameter(LoanCfg.FIELD_LAST_UPDATED_BY, userId)); + parameters.add(new ModelParameter(LoanCfg.FIELD_LAST_UPDATED_ON, lastUpdatedOn)); + parameters.add(new ModelParameter(LoanCfg.FIELD_ID, loanByRenovation.getLoanOld().getId())); + + if (0 < executeQuery(strQuery, parameters)) { + + // Update OLD loanByUser details in Loan By User Table + List params = new ArrayList<>(); + + params.add(new ModelParameter(LoanByUserCfg.FIELD_LOAN, new Loan(loanByRenovation.getLoanOld().getId()))); + params.add(new ModelParameter(LoanByUserCfg.FIELD_LOAN_BY_USER_STATUS, action ? LoanStatus.FINISH : LoanStatus.APPROVED)); + + Query query1 = getSession().createNamedQuery(LoanByUserCfg.QUERY_UPDATE_LOAN_BY_USER_BY_LOAND_ID); + + params.forEach((param) -> { + query1.setParameter(param.getParameter(), param.getValue()); + }); + + query1.executeUpdate(); + + // Update NEW loanByUser details in Loan By User Table + params.clear(); + + params.add(new ModelParameter(LoanByUserCfg.FIELD_LOAN, new Loan(loanByRenovation.getLoanNew().getId()))); + params.add(new ModelParameter(LoanByUserCfg.FIELD_LOAN_BY_USER_STATUS, action ? LoanStatus.APPROVED : LoanStatus.REJECTED)); + + Query query2 = getSession().createNamedQuery(LoanByUserCfg.QUERY_UPDATE_LOAN_BY_USER_BY_LOAND_ID); + + params.forEach((param) -> { + query2.setParameter(param.getParameter(), param.getValue()); + }); + + query2.executeUpdate(); + + if (action) { + // Insert new loanDetails (discount) in Loan Details table + if (null != loanDetails) { + getSession().save(loanDetails); + } + + // Insert delivery details (To know cash that certifier deliveried) in Delivery Table + Delivery delivery = new Delivery( + new User(userId), + new Loan(loanByRenovation.getLoanNew().getId()), + amount, + userId, + new Date(), + comission + ); + + getSession().save(delivery); + } + + flushAndClear(); + closeConnection(); + + logger.info("Certifier delivery the loan details: " + loanByRenovation); + success = true; + } else { + rollback(); + } + } else { + rollback(); + } + } else { + rollback(); + } + return success; + } catch (Exception e) { + rollback(); + logger.error("updateLoanRenovationFromCerfierView", e); + throw e; + } + } + + private int executeQuery(String xmlQuery, List parameters) { + Query query = getSession().createNamedQuery(xmlQuery); + + parameters.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + + return query.executeUpdate(); + } +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanByUserRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanByUserRepository.java new file mode 100644 index 0000000..d7b0e05 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanByUserRepository.java @@ -0,0 +1,40 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.loan; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.loan.LoanByUser; +import java.io.Serializable; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class LoanByUserRepository extends GenericRepository implements Serializable { + + /** + * + * @param loanByUser + * @return + * @throws Exception + */ + public boolean saveLoanByUser(LoanByUser loanByUser) throws Exception { + logger.debug("saveLoanByUser"); + try { + return save(loanByUser); + } catch (Exception e) { + logger.error("saveLoanByUser", e); + throw e; + } + } + + private static final long serialVersionUID = 7523456759588286540L; + final Logger logger = LogManager.getLogger(LoanByUserRepository.class); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanDetailsRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanDetailsRepository.java new file mode 100644 index 0000000..9dd0bfc --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanDetailsRepository.java @@ -0,0 +1,199 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.loan; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.controller.mobile.util.HibernateUtil; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.enums.FeeStatus; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.loan.LoanDetails; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import javax.persistence.Tuple; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.Query; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class LoanDetailsRepository extends GenericRepository implements Serializable { + + /** + * + * @param details + * @return + * @throws Exception + */ + public boolean saveLoanDetails(LoanDetails details) throws Exception { + logger.debug("saveLoanDetails"); + try { + return save(details); + } catch (Exception e) { + logger.error("saveLoanDetails", e); + throw e; + } + } + + public List findFeesToPayByLoanId(String xmlQuery, List parameters) throws Exception { + logger.debug("findFeesToPayByLoanId"); + + List results = new ArrayList<>(); + try { + List tuples = xmlQueryTuple(xmlQuery, parameters); + + tuples.forEach((tuple) -> { + results.add(new LoanDetails(tuple.get("id", String.class), tuple.get("createdOn", Date.class), tuple.get("feeStatus", FeeStatus.class))); + }); + } catch (Exception e) { + logger.error("findFeesToPayByLoanId", e); + throw e; + } + + return results; + } + + /** + * + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public List findLoanDetailsByLoanId(String xmlQuery, List parameters) throws Exception { + logger.debug("findLoanDetailsByLoanId"); + + List results = new ArrayList<>(); + try { + results = createNamedQueryResultList(LoanDetails.class, xmlQuery, parameters); + } catch (Exception e) { + logger.error("findLoanDetailsByLoanId", e); + throw e; + } + + return results; + } + + /** + * + * @param xmlQuery + * @param parameters + * @param loanDetails + * @return + * @throws Exception + */ + public boolean updatePaidFeesStatusInLoanDetailIds(String xmlQuery, List parameters, LoanDetails loanDetails) throws Exception { + boolean success = false; + + Session sssn = null; + Transaction trnsctn = null; + try { + sssn = HibernateUtil.getSessionFactory().getCurrentSession(); + trnsctn = sssn.beginTransaction(); + + Loan loan = sssn.get(Loan.class, loanDetails.getLoan().getId()); + + if (null != parameters && !parameters.isEmpty()) { + Query query = sssn.createNamedQuery(xmlQuery); + parameters.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + query.executeUpdate(); + logger.debug("Query update executed"); + } + BigDecimal totalFees = loan.getAmountPaid().add(loanDetails.getPaymentAmount()); + + loanDetails.setReferenceNumber(loan.getLastReferenceNumber() + 1); + + sssn.save(loanDetails); + + loan.setAmountPaid(totalFees); + loan.setLastReferenceNumber(loan.getLastReferenceNumber() + 1); + loan.setLastUpdatedBy(loanDetails.getCreatedBy()); + loan.setLastUpdatedOn(new Date()); + + sssn.update(loan); + + trnsctn.commit(); + + logger.info("Entity updated"); + success = true; + } catch (Exception e) { + logger.error("Method updatePaidFeesStatusInLoanDetailIds() ", e); + if (null != trnsctn) { + trnsctn.rollback(); + } + throw e; + } + /* finally { + if (null != sssn) { + sssn.close(); + } + }*/ + return success; + } + + /** + * + * @param hbmQuery + * @param params + * @return + */ + public Long countLoandDetails(String hbmQuery, List params) { + Long count; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + Query query = session.createNamedQuery(hbmQuery); + + params.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + + count = (Long) query.getSingleResult(); + + transaction.commit(); + + return count; + } catch (Exception e) { + logger.error("countLoandDetails", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } + } + + /** + * + * @param hbmQuery + * @param parameters + * @return + * @throws Exception + */ + public boolean updateLoanDetails(String hbmQuery, List parameters) throws Exception { + try { + return updateCreateNamedQuery(hbmQuery, parameters); + } catch (Exception e) { + logger.error("Method updateLoanDetails", e); + throw e; + } + } + + private static final long serialVersionUID = -6088464996350747643L; + final Logger logger = LogManager.getLogger(LoanDetailsRepository.class); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanFeeNotificationRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanFeeNotificationRepository.java new file mode 100644 index 0000000..948756f --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanFeeNotificationRepository.java @@ -0,0 +1,62 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.loan; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.loan.LoanFeeNotification; +import java.io.Serializable; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class LoanFeeNotificationRepository extends GenericRepository implements Serializable { + + /** + * + * @param notification + * @return + * @throws Exception + */ + public boolean saveLoanFeeNotification(LoanFeeNotification notification) throws Exception { + logger.debug("saveLoanFeeNotification"); + + try { + return save(notification); + } catch (Exception e) { + logger.error("saveLoanFeeNotification", e); + throw e; + } + } + + /** + * + * @param clazz + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public Long countNotificationByLoanId(Class clazz, String xmlQuery, List parameters) throws Exception { + logger.debug("countNotificationByLoanId"); + + try { + return (Long) createNamedQueryUniqueResult(clazz, xmlQuery, parameters); + } catch (Exception e) { + logger.error("countNotificationByLoanId", e); + throw e; + } + } + + private static final long serialVersionUID = -7172367255017070335L; + final Logger logger = LogManager.getLogger(LoanFeeNotificationRepository.class); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanRepository.java new file mode 100644 index 0000000..b04e25e --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanRepository.java @@ -0,0 +1,630 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.loan; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.controller.mobile.util.HibernateUtil; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.core.constance.LoanByUserCfg; +import com.arrebol.apc.model.core.constance.LoanCfg; +import com.arrebol.apc.model.enums.LoanRenovationStatus; +import com.arrebol.apc.model.enums.LoanStatus; +import com.arrebol.apc.model.loan.Delivery; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.loan.LoanByRenovation; +import com.arrebol.apc.model.loan.LoanByRenovationId; +import com.arrebol.apc.model.loan.LoanByUser; +import com.arrebol.apc.model.loan.LoanDetails; +import com.arrebol.apc.model.ws.parsed.LoanRequestedJaxb; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.Query; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class LoanRepository extends GenericRepository implements Serializable { + + /** + * + * @param loan + * @return + * @throws Exception + */ + public String saveLoan(Loan loan) throws Exception { + logger.debug("saveLoan"); + try { + if (save(loan)) { + return loan.getId(); + } else { + return null; + } + } catch (Exception e) { + logger.error("saveLoan", e); + throw e; + } + } + + public boolean updateLoan(Loan loan) throws Exception { + logger.debug("saveLoan"); + try { + return update(loan); + } catch (Exception e) { + logger.error("saveLoan", e); + throw e; + } + } + + /** + * + * @param loanId + * @return + * @throws Exception + */ + public Loan findLoanById(String loanId) throws Exception { + logger.debug("findLoanById"); + try { + return (Loan) findAPCEntity(Loan.class, loanId); + } catch (Exception e) { + logger.error("findLoanById", e); + throw e; + } + } + + /** + * + * @param loanId + * @param xmlQuery + * @param parameters + * @param status + * @param delivery + * @return + * @throws Exception + */ + public boolean updateLoan(String loanId, String xmlQuery, List parameters, LoanStatus status, Delivery delivery) throws Exception { + logger.debug("updateLoan"); + boolean success = false; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + List params = new ArrayList<>(); + + params.add(new ModelParameter(LoanByUserCfg.FIELD_LOAN, new Loan(loanId))); + params.add(new ModelParameter(LoanByUserCfg.FIELD_LOAN_BY_USER_STATUS, status)); + + Query query1 = session.createNamedQuery(LoanByUserCfg.QUERY_UPDATE_LOAN_BY_USER_BY_LOAND_ID); + + params.forEach((param) -> { + query1.setParameter(param.getParameter(), param.getValue()); + }); + + query1.executeUpdate(); + + if (null != parameters && !parameters.isEmpty()) { + Query query = session.createNamedQuery(xmlQuery); + + parameters.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + + if (0 < query.executeUpdate()) { + + if (null != delivery) { + session.save(delivery); + } + + transaction.commit(); + + success = true; + logger.info("updateLoan suucess"); + } else { + if (null != transaction) { + transaction.rollback(); + } + } + } else { + if (null != transaction) { + transaction.rollback(); + } + } + return success; + } catch (Exception e) { + logger.error("updateLoan", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } + } + + public boolean updateLoanWithComission(String loanId, String xmlQuery, List parameters, LoanStatus status, Delivery delivery) throws Exception { + logger.debug("updateLoan"); + boolean success = false; + + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + List params = new ArrayList<>(); + + params.add(new ModelParameter(LoanByUserCfg.FIELD_LOAN, new Loan(loanId))); + params.add(new ModelParameter(LoanByUserCfg.FIELD_LOAN_BY_USER_STATUS, status)); + + Query query1 = session.createNamedQuery(LoanByUserCfg.QUERY_UPDATE_LOAN_BY_USER_BY_LOAND_ID); + + params.forEach((param) -> { + query1.setParameter(param.getParameter(), param.getValue()); + }); + + query1.executeUpdate(); + + if (null != parameters && !parameters.isEmpty()) { + Query query = session.createNamedQuery(xmlQuery); + + parameters.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + + if (0 < query.executeUpdate()) { + + if (null != delivery) { + session.save(delivery); + } + + transaction.commit(); + + success = true; + logger.info("updateLoan suucess"); + } else { + if (null != transaction) { + transaction.rollback(); + } + } + } else { + if (null != transaction) { + transaction.rollback(); + } + } + return success; + } catch (Exception e) { + logger.error("updateLoan", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } + } + + /** + * + * @param loan + * @param loanByUser + * @param jaxb + * @return + * @throws Exception + */ + public boolean createLoan(Loan loan, LoanByUser loanByUser, LoanRequestedJaxb jaxb) throws Exception { + logger.debug("createLoan"); + try { + People customer = jaxb.getCustomer().isCreatePerson() + ? null + : new People(jaxb.getCustomer().getId()); + + People endorsement = jaxb.getEndorsement().isCreatePerson() + ? null + : new People(jaxb.getEndorsement().getId()); + + openConnection(); + + if (null == customer) { + customer = new People( + jaxb.getCustomer(), + true, + jaxb.getOfficeId(), + jaxb.getUserId(), + //jaxb.getRouteId() + jaxb.chooseRouteId() + ); + + getSession().save(customer); + } + + if (null == endorsement) { + endorsement = new People( + jaxb.getEndorsement(), + false, + jaxb.getOfficeId(), + jaxb.getUserId(), + jaxb.getRouteId() + ); + + getSession().save(endorsement); + } + + loan.setCustomer(customer); + loan.setEndorsement(endorsement); + + getSession().save(loan); + + loanByUser.getId().setIdLoan(loan.getId()); + + getSession().save(loanByUser); + + flushAndClear(); + closeConnection(); + + return true; + } catch (HibernateException e) { + logger.error("createLoan", e); + rollback(); + throw e; + } catch (Exception e) { + logger.error("Method createLoan() ", e); + rollback(); + throw e; + } + } + + /** + * + * @param oldLoanId + * @param loan + * @param loanByUser + * @param xmlQuery + * @param parameters + * @param loanDetails + * @param endorsement + * @param isNewEndorsement + * @return + * @throws Exception + */ + public boolean renovationLoan(String oldLoanId, + Loan loan, + LoanByUser loanByUser, + String xmlQuery, + List parameters, + LoanDetails loanDetails, + People endorsement, + boolean isNewEndorsement) throws Exception { + logger.debug("renovationLoan"); + + boolean success = false; + try { + openConnection(); + int total = 0; + + // Crea Aval y lo asigna al nuevo prestamo + if (isNewEndorsement) { + getSession().save(endorsement); + loan.setEndorsement(endorsement); + } + + // falta actualizar el status de la tabla APC_LOAN_BY_USER + // del loan (oldLoanId) a PENDING_RENOVATION + List params = new ArrayList<>(); + + params.add(new ModelParameter(LoanByUserCfg.FIELD_LOAN, new Loan(oldLoanId))); + params.add(new ModelParameter(LoanByUserCfg.FIELD_LOAN_BY_USER_STATUS, LoanStatus.PENDING_RENOVATION)); + + Query query1 = getSession().createNamedQuery(LoanByUserCfg.QUERY_UPDATE_LOAN_BY_USER_BY_LOAND_ID); + + params.forEach((param) -> { + query1.setParameter(param.getParameter(), param.getValue()); + }); + + query1.executeUpdate(); + + if (null != parameters && !parameters.isEmpty()) { + Query query = getSession().createNamedQuery(xmlQuery); + + parameters.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + + total = query.executeUpdate(); + logger.info("Query update executed"); + } + if (total > 0) { + getSession().save(loan); + + loanByUser.getId().setIdLoan(loan.getId()); + + getSession().save(loanByUser); + + LoanByRenovation renovation = new LoanByRenovation( + new LoanByRenovationId( + oldLoanId, + loan.getId() + ) + ); + + renovation.setLoanRenovationStatus(LoanRenovationStatus.PENDING); + renovation.setCreatedBy(loan.getCreatedBy()); + renovation.setCreatedOn(loan.getCreatedOn()); + + getSession().save(renovation); + + getSession().save(loanDetails); + + flushAndClear(); + closeConnection(); + + logger.info("Renovation was created"); + success = true; + } else { + logger.error("Renovation was not updated"); + rollback(); + } + + return success; + } catch (HibernateException e) { + logger.error("renovationLoan", e); + rollback(); + throw e; + } catch (Exception e) { + logger.error("Method renovationLoan() ", e); + rollback(); + throw e; + } + } + + /** + * + * @param oldLoanId + * @param loan + * @param loanByUser + * @param endorsement + * @param isNewEndorsement + * @return + * @throws Exception + */ + public boolean renovationHasPaymentToday(String oldLoanId, + Loan loan, + LoanByUser loanByUser, + People endorsement, + boolean isNewEndorsement) throws Exception { + logger.debug("renovationHasPaymentToday"); + + boolean success = false; + try { + openConnection(); + int total; + + // Crea Aval y lo asigna al nuevo prestamo + if (isNewEndorsement) { + getSession().save(endorsement); + loan.setEndorsement(endorsement); + } + + /** + * Actualiza el loan original a PENDING RENOVATION + */ + List params = new ArrayList<>(); + + params.add(new ModelParameter(LoanCfg.FIELD_LOAN_STATUS, LoanStatus.PENDING_RENOVATION)); + params.add(new ModelParameter(LoanCfg.FIELD_COMMENTS, "El cliente previamente abono su pago diario, solo me contactode nuevo para renovar su crédito")); + params.add(new ModelParameter(LoanCfg.FIELD_LAST_UPDATED_BY, loanByUser.getCreatedBy())); + params.add(new ModelParameter(LoanCfg.FIELD_LAST_UPDATED_ON, new Date())); + params.add(new ModelParameter(LoanCfg.FIELD_ID, oldLoanId)); + + Query query = getSession().createNamedQuery(LoanCfg.QUERY_UPDATE_LOAN_BY_ID_FROM_CERTIFIER_VIEW); + + params.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + + total = query.executeUpdate(); + + if (total > 0) { + /** + * Actualiza el loan by user a PENDING RENOVATION + */ + params.clear(); + + params.add(new ModelParameter(LoanByUserCfg.FIELD_LOAN, new Loan(oldLoanId))); + params.add(new ModelParameter(LoanByUserCfg.FIELD_LOAN_BY_USER_STATUS, LoanStatus.PENDING_RENOVATION)); + + Query query2 = getSession().createNamedQuery(LoanByUserCfg.QUERY_UPDATE_LOAN_BY_USER_BY_LOAND_ID); + + params.forEach((param) -> { + query2.setParameter(param.getParameter(), param.getValue()); + }); + + total = query.executeUpdate(); + + if (total > 0) { + // Crea el nuevo prestamo + getSession().save(loan); + + loanByUser.getId().setIdLoan(loan.getId()); + + // guarda elprestamo por usuario + getSession().save(loanByUser); + + // crea historico para saber de donde proviene en nuevo prestamo + LoanByRenovation renovation = new LoanByRenovation( + new LoanByRenovationId( + oldLoanId, + loan.getId() + ) + ); + + renovation.setLoanRenovationStatus(LoanRenovationStatus.PENDING); + renovation.setCreatedBy(loan.getCreatedBy()); + renovation.setCreatedOn(loan.getCreatedOn()); + + getSession().save(renovation); + + flushAndClear(); + closeConnection(); + + logger.info("renovationHasPaymentToday was created"); + success = true; + } else { + logger.error("renovationHasPaymentToday was not updated"); + rollback(); + } + } else { + logger.error("renovationHasPaymentToday was not updated"); + rollback(); + } + return success; + } catch (HibernateException e) { + logger.error("renovationHasPaymentToday", e); + rollback(); + throw e; + } catch (Exception e) { + logger.error("Method renovationHasPaymentToday() ", e); + rollback(); + throw e; + } + } + + /** + * + * @param hbmQuery + * @param params + * @return + */ + public Long countLoan(String hbmQuery, List params) { + Long count; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + Query query = session.createNamedQuery(hbmQuery); + + params.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + + count = (Long) query.getSingleResult(); + + transaction.commit(); + + return count; + } catch (Exception e) { + logger.error("countLoan", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } + } + + /** + * + * @param hbmQuery + * @param params + * @return + */ + public String findLoanId(String hbmQuery, List params) { + String loanId; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + Query query = session.createNamedQuery(hbmQuery); + + params.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + + loanId = (String) query.getSingleResult(); + + transaction.commit(); + + return loanId; + } catch (Exception e) { + logger.error("findLoanId", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } + } + + /** + * + * @param xmlUpdateOrDeleteQuery + * @param parameters + * @return + */ + public boolean deleteLoanDetailsByLoanCurdate(String xmlUpdateOrDeleteQuery, List parameters) { + logger.debug("updateLoandByUserByUserId"); + + return xmlUpdateOrDelete(xmlUpdateOrDeleteQuery, parameters); + } + + /** + * + * @param updateLoanStatusQuery + * @param updateLoanByUserStatusQuery + * @param loanParams + * @param loanByUserParams + * @return + * @throws Exception + */ + public boolean loanPendingStatusToDelivery(String updateLoanStatusQuery, String updateLoanByUserStatusQuery, List loanParams, List loanByUserParams) throws Exception { + boolean success = false; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + // Update loan status WHERE id IN + Query query = session.createNamedQuery(updateLoanStatusQuery); + + for (ModelParameter parameters : loanParams) { + query.setParameter(parameters.getParameter(), parameters.getValue()); + } + + query.executeUpdate(); + query.getParameters().clear(); + + // Update loan by user status WHERE loan IN + query = session.createNamedQuery(updateLoanByUserStatusQuery); + + for (ModelParameter parameters : loanByUserParams) { + query.setParameter(parameters.getParameter(), parameters.getValue()); + } + + query.executeUpdate(); + + transaction.commit(); + + success = true; + + return success; + } catch (Exception e) { + logger.error("loanPendingStatusToDelivery", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } + } + + private static final long serialVersionUID = -9216757241090613435L; + final Logger logger = LogManager.getLogger(LoanRepository.class); + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanToDeliveryByCertifierRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanToDeliveryByCertifierRepository.java new file mode 100644 index 0000000..34046c0 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanToDeliveryByCertifierRepository.java @@ -0,0 +1,45 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.loan; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.views.LoanToDeliveryByCertifierView; +import java.io.Serializable; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class LoanToDeliveryByCertifierRepository extends GenericRepository implements Serializable { + + /** + * + * @param clazz + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public List findLoansByCertifier(Class clazz, String xmlQuery, List parameters) throws Exception { + logger.debug("findLoansByCertifier"); + + try { + return createNamedQueryResultList(clazz, xmlQuery, parameters); + } catch (Exception e) { + logger.error("findLoansByCertifier", e); + throw e; + } + } + + private static final long serialVersionUID = 1692607159278862158L; + final Logger logger = LogManager.getLogger(LoanToDeliveryByCertifierRepository.class); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanTypeRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanTypeRepository.java new file mode 100644 index 0000000..ed92397 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/loan/LoanTypeRepository.java @@ -0,0 +1,114 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.loan; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.loan.LoanType; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import javax.persistence.Tuple; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class LoanTypeRepository extends GenericRepository implements Serializable { + + /** + * + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public List findAllLoanTypeByOffice(String xmlQuery, List parameters) throws Exception { + logger.debug("findAllLoanTypeByOffice"); + + List results = new ArrayList<>(); + try { + List tuples = xmlQueryTuple(xmlQuery, parameters); + + tuples.forEach((tuple) -> { + results.add(new LoanType((String) tuple.get("id"), (BigDecimal) tuple.get("payment"), (String) tuple.get("loanTypeName"))); + }); + } catch (Exception e) { + logger.error("findAllLoanTypeByOffice", e); + throw e; + } + + return results; + } + + /** + * Find loan type by id. + * + * @param id Identifycation number + * @return + * @throws Exception + */ + public LoanType findLoanType(String id) throws Exception { + logger.debug("findLoanType"); + try { + return (LoanType) findAPCEntity(LoanType.class, id); + } catch (Exception e) { + logger.error("findLoanType", e); + throw e; + } + } + + /** + * + * @param clazz + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public List findLoanTypes(Class clazz, String xmlQuery, List parameters) throws Exception { + logger.debug("findLoanTypes"); + try { + return createNamedQueryResultList(clazz, xmlQuery, parameters); + } catch (Exception e) { + logger.error("findLoanTypes", e); + throw e; + } + } + + /** + * + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public List findIdAndPaymentLoans(String xmlQuery, List parameters) throws Exception { + logger.debug("findIdAndPaymentLoans"); + + List results = new ArrayList<>(); + try { + List tuples = xmlQueryTuple(xmlQuery, parameters); + + tuples.forEach((tuple) -> { + results.add(new LoanType((String) tuple.get("id"), (BigDecimal) tuple.get("payment"), (String) tuple.get("loanTypeName"))); + }); + } catch (Exception e) { + logger.error("findIdAndPaymentLoans", e); + throw e; + } + + return results; + } + + private static final long serialVersionUID = -5815645336646530766L; + final Logger logger = LogManager.getLogger(LoanTypeRepository.class); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/people/PeopleRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/people/PeopleRepository.java new file mode 100644 index 0000000..33a3ec4 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/people/PeopleRepository.java @@ -0,0 +1,99 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.people; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.loan.Loan; +import java.io.Serializable; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class PeopleRepository extends GenericRepository implements Serializable { + + /** + * + * @param people + * @return + * @throws Exception + */ + public String createPeople(People people) throws Exception { + logger.debug("createPeople"); + try { + save(people); + + return people.getId(); + + } catch (Exception e) { + logger.error("createPeople", e); + throw e; + } + } + + /** + * + * @param people + * @return + * @throws Exception + */ + public boolean removePeople(People people) throws Exception { + logger.debug("removePeople"); + try { + people = (People) findAPCEntity(People.class, people.getId()); + + return delete(people); + } catch (Exception e) { + logger.error("removePeople", e); + throw e; + } + } + + /** + * + * @param loanId + * @param isCustomer + * @return + * @throws Exception + */ + public String findPeopleIdByIdLoad(String loanId, boolean isCustomer) throws Exception { + try { + Loan loan = (Loan) findAPCEntity(Loan.class, loanId); + + return isCustomer ? loan.getCustomer().getId() : loan.getEndorsement().getId(); + } catch (Exception e) { + logger.error("findPeopleByIdLoad", e); + throw e; + } + } + + /** + * + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public boolean changeContactNumber(String xmlQuery, List parameters) throws Exception { + logger.debug("changeContactNumber"); + try { + return updateCreateNamedQuery(xmlQuery, parameters); + } catch (Exception e) { + logger.error("changeContactNumber", e); + throw e; + } + } + + private static final long serialVersionUID = 6168828614367099322L; + final Logger logger = LogManager.getLogger(PeopleRepository.class); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/preference/UserMobilePreferenceRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/preference/UserMobilePreferenceRepository.java new file mode 100644 index 0000000..8590750 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/preference/UserMobilePreferenceRepository.java @@ -0,0 +1,98 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.preference; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.mobile.preference.UserMobilePreference; +import java.io.Serializable; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class UserMobilePreferenceRepository extends GenericRepository implements Serializable { + + /** + * + * @param clazz + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public UserMobilePreference findUserMobilePreference(Class clazz, String xmlQuery, List parameters) throws Exception { + logger.debug("findUserMobilePreference"); + + try { + return (UserMobilePreference) createNamedQueryUniqueResult(clazz, xmlQuery, parameters); + } catch (Exception e) { + logger.error("findUserMobilePreference", e); + throw e; + } + } + + /** + * + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public boolean updateQueryUserMobilePreference(String xmlQuery, List parameters) throws Exception { + logger.debug("updateQueryUserMobilePreference"); + + try { + return updateCreateNamedQuery(xmlQuery, parameters); + } catch (Exception e) { + logger.error("updateQueryUserMobilePreference", e); + throw e; + } + } + + /** + * + * @param userMobilePreference + * @return + * @throws Exception + */ + public boolean insertUserMobilePreference(UserMobilePreference userMobilePreference) throws Exception { + logger.debug("insertUserMobilePreference"); + + try { + return save(userMobilePreference); + } catch (Exception e) { + logger.error("insertUserMobilePreference", e); + throw e; + } + } + + /** + * + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public Long count(String xmlQuery, List parameters) throws Exception { + logger.debug("count"); + try { + return (Long) createNamedQueryUniqueResult(Long.class, xmlQuery, parameters); + } catch (Exception e) { + logger.error("count", e); + throw e; + } + } + + private static final long serialVersionUID = 4667354927801455153L; + final Logger logger = LogManager.getLogger(UserMobilePreferenceRepository.class); + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/reports/ReportsRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/reports/ReportsRepository.java new file mode 100644 index 0000000..714a40e --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/reports/ReportsRepository.java @@ -0,0 +1,47 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.reports; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.reports.UserWeekReport; +import java.io.Serializable; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class ReportsRepository extends GenericRepository implements Serializable { + + /** + * + * @param clazz + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public UserWeekReport findUserWeekReportDetailsByUser(Class clazz, String xmlQuery, List parameters) throws Exception { + try { + return (UserWeekReport) createNamedQueryUniqueResult( + clazz, + xmlQuery, + parameters + ); + } catch (Exception e) { + logger.error("findUserWeekReportDetailsByUser", e); + throw e; + } + } + + private static final long serialVersionUID = 5669198954766725576L; + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/route/RouteRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/route/RouteRepository.java new file mode 100644 index 0000000..5a4c027 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/route/RouteRepository.java @@ -0,0 +1,55 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.route; + +import com.arrebol.apc.controller.mobile.moxy.views.ContainerRoutes; +import com.arrebol.apc.controller.mobile.moxy.views.RouteJaxb; +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.controller.mobile.repository.people.PeopleRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.catalog.constance.RouteCfg; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import javax.persistence.Tuple; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class RouteRepository extends GenericRepository implements Serializable { + + /** + * + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public ContainerRoutes findAllRoutesAvailables(String xmlQuery, List parameters) throws Exception { + try { + List tuples = xmlQueryTuple(xmlQuery, parameters); + if (!tuples.isEmpty()) { + List results = new ArrayList<>(); + tuples.forEach(tuple -> { + results.add(new RouteJaxb(tuple.get(RouteCfg.FIELD_ID, String.class), tuple.get(RouteCfg.FIELD_NAME, String.class))); + }); + return new ContainerRoutes(results); + } else { + throw new Exception("Error loading route, size equals to ZERO"); + } + } catch (Exception e) { + logger.error("findAllRoutesAvailables", e); + throw e; + } + } + + final Logger logger = LogManager.getLogger(PeopleRepository.class); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/tracking/PaymentTrackingRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/tracking/PaymentTrackingRepository.java new file mode 100644 index 0000000..333805b --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/tracking/PaymentTrackingRepository.java @@ -0,0 +1,49 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.tracking; + +import com.arrebol.apc.controller.mobile.moxy.views.PaymentTrackingViewJaxb; +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.reports.UserWeekReport; +import com.arrebol.apc.model.views.AdvanceUserDailyView; +import java.io.Serializable; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class PaymentTrackingRepository extends GenericRepository implements Serializable { + + /** + * + * @param clazz + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public AdvanceUserDailyView paymentTrakingByUserDetails(Class clazz, String xmlQuery, List parameters) throws Exception { + try { + return (AdvanceUserDailyView) createNamedQueryUniqueResult( + clazz, + xmlQuery, + parameters + ); + } catch (Exception e) { + logger.error("PaymentTrackingViewJaxb", e); + throw e; + } + } + + private static final long serialVersionUID = 5669198954766725577L; + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/user/UserRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/user/UserRepository.java new file mode 100644 index 0000000..c3f2ce6 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/user/UserRepository.java @@ -0,0 +1,114 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.user; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.controller.mobile.util.HibernateUtil; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.core.constance.UserCfg; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import javax.persistence.Tuple; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.Query; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class UserRepository extends GenericRepository implements Serializable { + + /** + * + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public String findUserStatusById(String xmlQuery, List parameters) throws Exception { + try { + for (Tuple tuple : xmlQueryTuple(xmlQuery, parameters)) { + return tuple.get(UserCfg.FIELD_ID, String.class); + } + + return null; + } catch (Exception e) { + logger.error("findUserStatusById", e); + throw e; + } + } + + /** + * + * @param hbmQuery + * @param params + * @return + * @throws Exception + */ + public boolean containtsUserManagementProperty(String hbmQuery, List params) throws Exception { + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + Query query = session.createNamedQuery(hbmQuery); + + params.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + + Long total = (Long) query.getSingleResult(); + Long one = 1l; + transaction.commit(); + + return one.equals(total); + } catch (Exception e) { + logger.error("containtsUserManagementProperty", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } + } + + /** + * + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public List listOfUsersByOffice(String xmlQuery, List parameters) throws Exception { + try { + List users = new ArrayList<>(); + + xmlQueryTuple(xmlQuery, parameters).forEach(_item -> { + users.add( + new User( + _item.get(UserCfg.FIELD_ID, String.class), + _item.get(UserCfg.FIELD_USER_NAME, String.class) + ) + ); + }); + + return users; + } catch (Exception e) { + logger.error("listOfUsersByOffice", e); + throw e; + } + } + + private static final long serialVersionUID = -7339139534291674077L; + final Logger logger = LogManager.getLogger(getClass()); + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/CashRegisterCurdateByUserViewRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/CashRegisterCurdateByUserViewRepository.java new file mode 100644 index 0000000..2937d72 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/CashRegisterCurdateByUserViewRepository.java @@ -0,0 +1,44 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.views; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.views.CashRegisterCurdateByUserView; +import java.io.Serializable; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class CashRegisterCurdateByUserViewRepository extends GenericRepository implements Serializable { + + /** + * + * @param clazz + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public List findAllCashRegisterCurdateByUserId(Class clazz, String xmlQuery, List parameters) throws Exception { + logger.debug("findAllCashRegisterCurdateByUserId"); + try { + return createNamedQueryResultList(clazz, xmlQuery, parameters); + } catch (Exception e) { + logger.error("findAllCashRegisterCurdateByUserId", e); + throw e; + } + } + + private static final long serialVersionUID = -9108098827445980249L; + final Logger logger = LogManager.getLogger(CashRegisterCurdateByUserViewRepository.class); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/ExchangeEnebledUsersViewRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/ExchangeEnebledUsersViewRepository.java new file mode 100644 index 0000000..7c1f6ed --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/ExchangeEnebledUsersViewRepository.java @@ -0,0 +1,43 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.views; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.views.ExchangeEnebledUsersView; +import java.io.Serializable; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class ExchangeEnebledUsersViewRepository extends GenericRepository implements Serializable { + + /** + * + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public List findEnebledUsersToUserId(String xmlQuery, List parameters) throws Exception { + logger.debug("exchangeEnebledUsersViewRepository"); + try { + return createNamedQueryResultList(ExchangeEnebledUsersView.class, xmlQuery, parameters); + } catch (Exception e) { + logger.error("findEnebledUsersToUserId", e); + throw e; + } + } + + private static final long serialVersionUID = 3811795552537797634L; + final Logger logger = LogManager.getLogger(ExchangeEnebledUsersViewRepository.class); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/LoanApprovedDetailViewRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/LoanApprovedDetailViewRepository.java new file mode 100644 index 0000000..733ab23 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/LoanApprovedDetailViewRepository.java @@ -0,0 +1,124 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.views; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.enums.LoanDetailsType; +import com.arrebol.apc.model.views.LoanApprovedDetailView; +import com.arrebol.apc.model.ws.parsed.LoanDetailJaxb; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import javax.persistence.Tuple; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class LoanApprovedDetailViewRepository extends GenericRepository implements Serializable { + + /* + public List findAllTransferByUserIdAndCurdate(String xmlQuery, List parameters) throws Exception { + logger.debug("findAllTransferByUserIdAndCurdate"); + List results = new ArrayList<>(); + try { + List tuples = xmlQueryTuple(xmlQuery, parameters); + + tuples.forEach((tuple) -> { + results.add( + new Exchange( + tuple.get("id").toString(), + tuple.get("userTransmitter").toString().equals("SENDER"), + (BigDecimal) tuple.get("amountToTransfer"), + tuple.get("actionStatus").toString() + ) + ); + }); + + return results; + } catch (Exception e) { + logger.error("findAllTransferByUserIdAndCurdate", e); + throw e; + } + } + */ + /** + * + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public List findLoanDetailsByLoan(String xmlQuery, List parameters) throws Exception { + logger.debug("findLoanDetailsByLoan"); + List results = new ArrayList<>(); + try { + List tuples = xmlQueryTuple(xmlQuery, parameters); + + double total = 0d; + + for (Tuple tuple : tuples) { + if (results.isEmpty()) { + total = ((BigDecimal) tuple.get("amountToPay")).doubleValue(); + } + LoanDetailsType type = tuple.get("loanDetailsType", LoanDetailsType.class); + + switch (type) { + case PAYMENT: + total = total - ((BigDecimal) tuple.get("paymentAmount")).doubleValue(); + break; + case FEE: + total = total + ((BigDecimal) tuple.get("paymentAmount")).doubleValue(); + break; + case TRANSFER: + total = total - (tuple.get("paymentAmount", BigDecimal.class)).doubleValue(); + break; + } + + LoanDetailJaxb detail = new LoanDetailJaxb( + tuple.get("createdOn", String.class), + ((BigDecimal) tuple.get("paymentAmount")).doubleValue(), + total, + tuple.get("comments", String.class), + type.toString() + ); + + results.add(detail); + } + + return results; + } catch (Exception e) { + logger.error("findLoanDetailsByLoan", e); + throw e; + } + } + + /** + * + * @param idLoan + * @return + * @throws Exception + */ + public LoanApprovedDetailView approvedDetailsByIdLoan(String idLoan) throws Exception { + logger.debug("approvedDetailsByIdLoan"); + try { + return (LoanApprovedDetailView) findAPCEntity(LoanApprovedDetailView.class, idLoan); + } catch (Exception e) { + logger.error("approvedDetailsByIdLoan", e); + throw e; + } + } + + private static final long serialVersionUID = -7364653160752676339L; + final Logger logger = LogManager.getLogger(LoanApprovedDetailViewRepository.class); + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/LoanByUserOrderPreferenceViewRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/LoanByUserOrderPreferenceViewRepository.java new file mode 100644 index 0000000..89b2ef5 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/LoanByUserOrderPreferenceViewRepository.java @@ -0,0 +1,62 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.views; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.views.LoanByUserOrderPreferenceView; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class LoanByUserOrderPreferenceViewRepository extends GenericRepository implements Serializable { + + /** + * + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public List findAllLoanByUserOrderPreference(String xmlQuery, List parameters) throws Exception { + logger.debug("findAllLoanByUserOrderPreference"); + List results = new ArrayList<>(); + + try { + results = createNamedQueryResultList( + LoanByUserOrderPreferenceView.class, + xmlQuery, + parameters + ); + } catch (Exception e) { + logger.error("findAllLoanByUserOrderPreference", e); + throw e; + } + + return results; + } + + public boolean updateQuery(String xmlQuery, List parameters) throws Exception { + logger.debug("updateQuery"); + try { + return updateCreateNamedQuery(xmlQuery, parameters); + } catch (Exception e) { + logger.error("updateQuery", e); + throw e; + } + } + + private static final long serialVersionUID = -5747654537116880219L; + final Logger logger = LogManager.getLogger(LoanByUserOrderPreferenceViewRepository.class); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/LoanByUserViewRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/LoanByUserViewRepository.java new file mode 100644 index 0000000..3cceb77 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/LoanByUserViewRepository.java @@ -0,0 +1,54 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.views; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.views.LoanByUserView; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class LoanByUserViewRepository extends GenericRepository implements Serializable { + + /** + * + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public List findAllLoansByUserId(String xmlQuery, List parameters) throws Exception { + logger.debug("findAllLoansByUserId"); + List results = new ArrayList<>(); + + try { + results = createNamedQueryResultList( + LoanByUserView.class, + xmlQuery, + parameters + ); + + } catch (Exception e) { + logger.error("findAllLoansByUserId", e); + throw e; + } + + return results; + } + + private static final long serialVersionUID = 5669198954766725476L; + final Logger logger = LogManager.getLogger(LoanByUserViewRepository.class); + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/LoanInPendingStatusToDeliveryViewRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/LoanInPendingStatusToDeliveryViewRepository.java new file mode 100644 index 0000000..c9f733f --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/LoanInPendingStatusToDeliveryViewRepository.java @@ -0,0 +1,42 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.views; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.views.LoanInPendingStatusToDeliveryView; +import java.io.Serializable; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class LoanInPendingStatusToDeliveryViewRepository extends GenericRepository implements Serializable { + + /** + * + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public List findAllLoanInPendingStatusToDeliveryViewFromHQL(String xmlQuery, List parameters) throws Exception { + try { + return findEntityList(LoanInPendingStatusToDeliveryView.class, xmlQuery, parameters); + } catch (Exception e) { + logger.error("findAllLoanInPendingStatusToDeliveryViewFromHQL", e); + throw e; + } + } + + private static final long serialVersionUID = 6824052895894178526L; + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/PersonSearchHistoricalDetailsViewRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/PersonSearchHistoricalDetailsViewRepository.java new file mode 100644 index 0000000..5364ac9 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/PersonSearchHistoricalDetailsViewRepository.java @@ -0,0 +1,48 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.views; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.views.PersonSearchHistoricalDetailsView; +import java.io.Serializable; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class PersonSearchHistoricalDetailsViewRepository extends GenericRepository implements Serializable { + + /** + * + * @param clazz + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public List findAllByPersonId(Class clazz, String xmlQuery, List parameters) throws Exception { + logger.debug("findAllByPersonId"); + + try { + return createNamedQueryResultList(clazz, xmlQuery, parameters); + } catch (Exception e) { + logger.error("findAllByPersonId", e); + throw e; + } + } + + + + private static final long serialVersionUID = 3507366187310617715L; + final Logger logger = LogManager.getLogger(PersonSearchHistoricalDetailsViewRepository.class); + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/PersonSearchViewRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/PersonSearchViewRepository.java new file mode 100644 index 0000000..a2a5853 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/PersonSearchViewRepository.java @@ -0,0 +1,121 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.views; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.views.LoanByUserView; +import com.arrebol.apc.model.views.PersonSearchDetailView; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; +import javax.persistence.Tuple; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class PersonSearchViewRepository extends GenericRepository implements Serializable { + + /** + * + * @param clazz + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public List findResultList(Class clazz, String xmlQuery, List parameters) throws Exception { + logger.debug("likePersonSearchViewByPersonSearch"); + + try { + return createNamedQueryResultList(clazz, xmlQuery, parameters, 10); + } catch (Exception e) { + logger.error("likePersonSearchViewByPersonSearch", e); + throw e; + } + } + + /** + * + * @param clazz + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public Object findResultXML(Class clazz, String xmlQuery, List parameters) throws Exception { + logger.debug("findResultXML"); + try { + return createNamedQueryUniqueResult(clazz, xmlQuery, parameters); + } catch (Exception e) { + logger.error("findResultXML", e); + throw e; + } + } + + public Object findResultTupleXML(String xmlQuery, List parameters) throws Exception { + logger.debug("findResultXML"); + try { + List tuples = xmlQueryTuple(xmlQuery, parameters); + + LoanByUserView result = new LoanByUserView(); + + for (Tuple tuple : tuples) { + + result = new LoanByUserView( + tuple.get("customerName", String.class), + tuple.get("customerAddressHome", String.class), + tuple.get("customerAddressBusiness", String.class), + tuple.get("companyName", String.class), + tuple.get("customerThumbnail", String.class), + tuple.get("endorsementName", String.class), + tuple.get("endorsementAddressHome", String.class), + tuple.get("endorsementThumbnail", String.class), + tuple.get("endorsementPhoneHome", String.class), + tuple.get("paymentDaily", BigDecimal.class), + tuple.get("fee", BigDecimal.class), + tuple.get("notificationNumber", Long.class).intValue(), + tuple.get("renovation", String.class), + tuple.get("maxAmountToPay", BigDecimal.class), + 1 == tuple.get("hasPaymentToday", Integer.class), + tuple.get("loanId", String.class), + tuple.get("currentOwner", String.class) + ); + } + + return result; + } catch (Exception e) { + logger.error("findResultXML", e); + throw e; + } + } + + /** + * + * @param clazz + * @param id + * @return + * @throws Exception + */ + public PersonSearchDetailView findResult(Class clazz, String id) throws Exception { + logger.debug("findResult"); + try { + return (PersonSearchDetailView) findAPCEntity(clazz, id); + } catch (Exception e) { + logger.error("findResult", e); + throw e; + } + } + + private static final long serialVersionUID = -5127034542019248849L; + final Logger logger = LogManager.getLogger(PersonSearchViewRepository.class); + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/SearchPersonAvailableRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/SearchPersonAvailableRepository.java new file mode 100644 index 0000000..b3c1414 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/SearchPersonAvailableRepository.java @@ -0,0 +1,63 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.views; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import java.io.Serializable; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * Views: AvailableCustomersView or AvailableEndorsementsView + * + * @author Carlos Janitzio Zavala Lopez + */ +public class SearchPersonAvailableRepository extends GenericRepository implements Serializable { + + /** + * + * @param clazz + * @param id + * @return + * @throws Exception + */ + public Object findAvailablePersonByPersonId(Class clazz, String id) throws Exception { + logger.debug("findAvailablePersonByPersonId"); + try { + return findAPCEntity(clazz, id); + } catch (Exception e) { + logger.error("findAvailablePersonByPersonId", e); + throw e; + } + } + + /** + * Find customers or endorsemenent using hibernate like clause. + * + * @param clazz AvailableCustomersView and AvailableEndorsementsView + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public List findAvailablePersonLike(Class clazz, String xmlQuery, List parameters) throws Exception { + logger.debug("findAvailablePersonLike"); + try { + return createNamedQueryResultList(clazz, xmlQuery, parameters,10); + } catch (Exception e) { + logger.error("findAvailablePersonLike", e); + throw e; + } + } + + private static final long serialVersionUID = 1734430028791204289L; + final Logger logger = LogManager.getLogger(SearchPersonAvailableRepository.class); + +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/TotalCashByCurdateViewRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/TotalCashByCurdateViewRepository.java new file mode 100644 index 0000000..8189f93 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/TotalCashByCurdateViewRepository.java @@ -0,0 +1,40 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.views; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.views.TotalCashByCurdateView; +import java.io.Serializable; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class TotalCashByCurdateViewRepository extends GenericRepository implements Serializable { + + /** + * + * @param id + * @return + * @throws Exception + */ + public TotalCashByCurdateView findById(String id) throws Exception { + logger.debug("findById"); + try { + return (TotalCashByCurdateView) findAPCEntity(TotalCashByCurdateView.class, id); + } catch (Exception e) { + logger.error("findById", e); + throw e; + } + } + + private static final long serialVersionUID = 7691052895894112231L; + final Logger logger = LogManager.getLogger(TotalCashByCurdateViewRepository.class); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/TransferInPendingStatusViewRepository.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/TransferInPendingStatusViewRepository.java new file mode 100644 index 0000000..358f1fb --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/repository/views/TransferInPendingStatusViewRepository.java @@ -0,0 +1,42 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.views; + +import com.arrebol.apc.controller.mobile.repository.GenericRepository; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.views.TransferInPendingStatusView; +import java.io.Serializable; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class TransferInPendingStatusViewRepository extends GenericRepository implements Serializable { + + /** + * + * @param xmlQuery + * @param parameters + * @return + * @throws Exception + */ + public List findAllTransferFromHQL(String xmlQuery, List parameters) throws Exception { + try { + return findEntityList(TransferInPendingStatusView.class, xmlQuery, parameters); + } catch (Exception e) { + logger.error("findAllTransferFromHQL", e); + throw e; + } + } + + private static final long serialVersionUID = 5391052895894173231L; + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/util/HibernateUtil.java b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/util/HibernateUtil.java new file mode 100644 index 0000000..1723c04 --- /dev/null +++ b/apc-controller-mobile/src/main/java/com/arrebol/apc/controller/mobile/util/HibernateUtil.java @@ -0,0 +1,69 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.util; + +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class HibernateUtil { + + private static final String HIBERNATE_CFG_XML = "apc.cfg.xml"; + private static SessionFactory sessionFactory; + + private HibernateUtil() { + } + + // Hibernate 5: + private static SessionFactory buildSessionFactory() { + try { + // Create the ServiceRegistry from hibernate.cfg.xml + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure(HIBERNATE_CFG_XML).build(); + + // Create a metadata sources using the specified service registry. + Metadata metadata = new MetadataSources(serviceRegistry).getMetadataBuilder().build(); + + return metadata.getSessionFactoryBuilder().build(); + } catch (Throwable ex) { + System.err.println("Initial SessionFactory creation failed." + ex); + throw new ExceptionInInitializerError(ex); + } + } + + /** + * Configuration object is used to create a SessionFactory object which in + * turn configures Hibernate for the application using the supplied + * configuration file and allows for a Session object to be instantiated. + * + * The SessionFactory is a thread safe object and used by all the threads of + * an application. + * + * The SessionFactory is a heavyweight object; it is usually created during + * application start up and kept for later use. + * + * You would need one SessionFactory object per database using a separate + * configuration file. + * + * So, if you are using multiple databases, then you would have to create + * multiple SessionFactory objects. + * + * @return SessionFactory. + */ + public final static SessionFactory getSessionFactory() { + if (null == sessionFactory) { + sessionFactory = buildSessionFactory(); + } + return sessionFactory; + } +} diff --git a/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/cash/CashRegisterCurdateByUserControllerTest.java b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/cash/CashRegisterCurdateByUserControllerTest.java new file mode 100644 index 0000000..7fbb1d3 --- /dev/null +++ b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/cash/CashRegisterCurdateByUserControllerTest.java @@ -0,0 +1,46 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.cash; + +import com.arrebol.apc.model.views.TotalCashByCurdateView; +import org.junit.Assert; +import static org.junit.Assert.assertFalse; +import org.junit.Before; +import org.junit.Test; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class CashRegisterCurdateByUserControllerTest { + + public CashRegisterCurdateByUserController controller; + public static final String USER_ID = "52cbc85a-8bc9-11ea-b45c-c7b846343364"; + + public CashRegisterCurdateByUserControllerTest() { + } + + @Before + public void setUp() { + controller = new CashRegisterCurdateByUserController(); + } + + @Test + public void findAllLoansByUserId() { + try { + TotalCashByCurdateView result = controller.findDailyTotalsByUserId(USER_ID); + + System.out.println("Total: " + result.getTotal()); + + Assert.assertNotNull(result); + } catch (Exception e) { + assertFalse(true); + } + } + +} diff --git a/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/customer/CustomerControllerTest.java b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/customer/CustomerControllerTest.java new file mode 100644 index 0000000..7c0c9df --- /dev/null +++ b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/customer/CustomerControllerTest.java @@ -0,0 +1,49 @@ +package com.arrebol.apc.controller.mobile.controller.customer; + +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ + + +import com.arrebol.apc.model.enums.PreferenceValue; +import com.arrebol.apc.model.views.LoanByUserView; +import java.util.List; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.*; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class CustomerControllerTest { + + public CustomerController controller; + public static final String USER_ID = "52cbc85a-8bc9-11ea-b45c-c7b846343364"; + + public CustomerControllerTest() { + } + + @Before + public void setUp() { + controller = new CustomerController(); + } + + @Test + public void findAllLoansByUserId() { + try { + List results = controller.findAllLoansByUserId(PreferenceValue.ORDER_IN_LIST.toString(),USER_ID); + + results.forEach(System.out::println); + + assertFalse(results.isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } + +} diff --git a/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/exchange/ExchangeEnebledUsersControllerTest.java b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/exchange/ExchangeEnebledUsersControllerTest.java new file mode 100644 index 0000000..f98a096 --- /dev/null +++ b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/exchange/ExchangeEnebledUsersControllerTest.java @@ -0,0 +1,62 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.exchange; + +import com.arrebol.apc.model.views.ExchangeEnebledUsersView; +import com.arrebol.apc.model.ws.parsed.Exchange; +import java.util.List; +import static org.junit.Assert.assertFalse; +import org.junit.Before; +import org.junit.Test; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class ExchangeEnebledUsersControllerTest { + + public ExchangeEnebledUsersController controller; + public static final String USER_ID_AVATAR_TWO = "52cbc85a-8bc9-11ea-b45c-c7b846343364"; + public static final String AVATAR= "22fb81e2-8bc9-11ea-b45c-c7b846343364"; + public static final String OFFICE_ID_GDL = "e0f1a2fc-7d1f-11ea-af3e-28f659da398e"; + public static final String OFFICE_ID_TPC = "caef3a64-7d1f-11ea-af3e-28f659da398e"; + + public ExchangeEnebledUsersControllerTest() { + } + + @Before + public void setUp() { + controller = new ExchangeEnebledUsersController(); + } + + //@Test + public void findEnebledUsersToUserId() { + try { + List results = controller.findEnebledUsersToUserId(USER_ID_AVATAR_TWO, OFFICE_ID_TPC); + + results.forEach(System.out::println); + + assertFalse(results.isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } + + @Test + public void exchangesByUsers() { + try { + List results = controller.exchangesByUsers(AVATAR); + + results.forEach(System.out::println); + + assertFalse(results.isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } +} diff --git a/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/loan/LoanControllerTest.java b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/loan/LoanControllerTest.java new file mode 100644 index 0000000..ee2d0b3 --- /dev/null +++ b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/loan/LoanControllerTest.java @@ -0,0 +1,205 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.loan; + +import com.arrebol.apc.controller.mobile.json.loan.DeleteLoanDetailsJaxb; +import com.arrebol.apc.controller.mobile.json.loan.LoanTypeListJaxb; +import com.arrebol.apc.model.views.AvailableCustomersView; +import com.arrebol.apc.model.views.AvailableEndorsementsView; +import com.arrebol.apc.model.views.LoanToDeliveryByCertifierView; +import com.arrebol.apc.model.ws.parsed.LoanDetailJaxb; +import com.arrebol.apc.model.ws.parsed.LoanRequestedJaxb; +import com.arrebol.apc.model.ws.parsed.PersonJaxb; +import java.util.List; +import org.junit.Test; +import static org.junit.Assert.*; +import org.junit.Before; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class LoanControllerTest { + + /** + * $3,000.00 + */ + public final static String LOAN_TYPE_ID = "8d91bc36-8e00-11ea-8745-07889553dd5f"; + /** + * GDL + */ + public static final String OFFICE_ID = "e0f1a2fc-7d1f-11ea-af3e-28f659da398e"; + /** + * TEPIC + */ + public static final String TEPIC_OFFICE_ID = "caef3a64-7d1f-11ea-af3e-28f659da398e"; + /** + * LOANS + */ + public static final String LOAND_ID = "606e42f4-8e1b-11ea-b65e-4e1376171215"; + /** + * Avatar 2 + */ + public final static String MOBILE_USER_ID = "52cbc85a-8bc9-11ea-b45c-c7b846343364"; + /** + * + */ + public final static String ROUTE_ID = "55baf3ae-8e19-11ea-b65e-4e1376171215"; + /** + * + */ + public final static String DUMMY_DATA = "DUMMY"; + private LoanController controller; + + @Before + public void setUp() { + controller = new LoanController(); + } + + //@Test + public void findAllLoanTypeByOffice() { + try { + LoanTypeListJaxb result = controller.findAllLoanTypeByOffice(OFFICE_ID); + + System.out.println(result); + + assertFalse(result.getLoans().isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } + + @Test + public void enebleToDeleteTodayDetails(){ + try { + DeleteLoanDetailsJaxb result = controller.enebleToDeleteTodayDetails(LOAND_ID,""); + + System.out.println(result); + + assertFalse(result.getApprovedOrPendingRenovation()); + } catch (Exception e) { + assertFalse(true); + } + } + + //@Test + public void findAvailableCustomersByOffice() { + try { + List results = controller.findAllAvailableCustomersByType("%SeGuNDo%"); + + results.forEach(System.out::println); + + assertFalse(results.isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } + + //@Test + public void findAvailableEndorsementByOffice() { + try { + List results = controller.findAllAvailableEndorsementsByType("%AvAl%"); + + results.forEach(System.out::println); + + assertFalse(results.isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } + + //@Test + public void findNewCreditLimit() { + try { + LoanTypeListJaxb result = controller.findNewCreditLimit(OFFICE_ID, LOAND_ID); + + System.out.println(result); + + assertFalse(result.getLoans().isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } + + //@Test + public void createLoan() { + try { + LoanRequestedJaxb jaxb = new LoanRequestedJaxb(); + + PersonJaxb customer = buildPerson(false, true); + PersonJaxb endorsement = buildPerson(false, false); + + jaxb.setLoanTypeId(LOAN_TYPE_ID); + jaxb.setOfficeId(OFFICE_ID); + jaxb.setUserId(MOBILE_USER_ID); + jaxb.setRouteId(ROUTE_ID); + jaxb.setCustomer(customer); + jaxb.setEndorsement(endorsement); + jaxb.setStrDate("2020-28-05 16:04:62"); + + //assertTrue(controller.createLoan(jaxb)); + } catch (Exception e) { + assertFalse(true); + } + } + + //@Test + public void findLoansByCertifier() { + try { + List results = controller.findLoansByCertifier(MOBILE_USER_ID); + + results.forEach(System.out::println); + + assertFalse(results.isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } + + @Test + public void approvedDetailsByIdLoan() { + try { + //LoanJaxb result = controller.approvedDetailsByIdLoan(LOAND_ID); + List result = controller.approvedDetailsByIdLoan(LOAND_ID); + System.out.println(result); + + assertNotNull(result); + } catch (Exception e) { + assertFalse(true); + } + } + + private PersonJaxb buildPerson(boolean isNewPerson, boolean isCustomer) { + PersonJaxb person = new PersonJaxb(); + + if (!isNewPerson) { + if (isCustomer) { + person.setId("e61db008-8e1e-11ea-b65e-4e1376171215"); + } else { + person.setId("2b502d50-8e1e-11ea-b65e-4e1376171215"); + } + } else { + person.setFirstName(DUMMY_DATA); + person.setSecondName(DUMMY_DATA); + person.setLastName(DUMMY_DATA); + person.setMiddleName(DUMMY_DATA); + person.setAddressHome(DUMMY_DATA); + person.setPhoneHome(DUMMY_DATA); + person.setCreatePerson(true); + person.setThumbnail("https://f0.pngfuel.com/png/980/304/man-profile-illustration-computer-icons-user-profile-avatar-png-clip-art.png"); + + if (isCustomer) { + person.setAddressWork(DUMMY_DATA); + person.setPhoneWork(DUMMY_DATA); + person.setCompanyName(DUMMY_DATA); + } + } + + return person; + } +} diff --git a/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/login/LoginWSControllerTest.java b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/login/LoginWSControllerTest.java new file mode 100644 index 0000000..a3515a8 --- /dev/null +++ b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/login/LoginWSControllerTest.java @@ -0,0 +1,46 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.login; + +import com.arrebol.apc.controller.mobile.moxy.login.UserMxy; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.*; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class LoginWSControllerTest { + + private LoginWSController controller; + private final static String USER_NAME = "avatar1"; + private final static String PASSWORD = "8478A4A2819E9C06AB738123C5D04B4FA1AA67548EBA64EAD40B635EA8AA8D5B"; + + public LoginWSControllerTest() { + } + + @Before + public void setUp() { + controller = new LoginWSController(); + } + + @Test + public void login() { + try { + UserMxy userMxy = controller.login(USER_NAME, PASSWORD); + + System.out.println(userMxy); + + assertFalse(userMxy.getPreferences().isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } + +} diff --git a/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/preference/SystemPreferenceControllerTest.java b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/preference/SystemPreferenceControllerTest.java new file mode 100644 index 0000000..9499b67 --- /dev/null +++ b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/preference/SystemPreferenceControllerTest.java @@ -0,0 +1,58 @@ +package com.arrebol.apc.controller.mobile.controller.preference; + +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +import com.arrebol.apc.model.views.LoanByUserOrderPreferenceView; +import com.arrebol.apc.model.ws.parsed.ConfigurationJaxb; +import java.util.List; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.*; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class SystemPreferenceControllerTest { + + private SystemPreferenceController controller; + public static final String USER_ID = "52cbc85a-8bc9-11ea-b45c-c7b846343364"; + + public SystemPreferenceControllerTest() { + } + + @Before + public void setUp() { + controller = new SystemPreferenceController(); + } + + @Test + public void findAllLoanByUserOrderPreference() { + try { + List results = controller.findAllLoanByUserOrderPreference(USER_ID); + + results.forEach(System.out::println); + + assertFalse(results.isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } + + @Test + public void findConfigurationButton() { + try { + ConfigurationJaxb result = controller.findConfigurationButton(USER_ID, USER_ID); + + assertTrue(result.isActiveButton()); + } catch (Exception e) { + assertFalse(true); + } + } + +} diff --git a/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/search/PersonSearchControllerTest.java b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/search/PersonSearchControllerTest.java new file mode 100644 index 0000000..4d3761a --- /dev/null +++ b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/search/PersonSearchControllerTest.java @@ -0,0 +1,74 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.search; + +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.views.LoanByUserView; +import com.arrebol.apc.model.views.PersonSearchDetailView; +import com.arrebol.apc.model.views.PersonSearchView; +import java.util.List; +import org.junit.Test; +import static org.junit.Assert.*; +import org.junit.Before; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class PersonSearchControllerTest { + + private PersonSearchController controller; + public static final String PERSON_SEARCH_ID = "83d2cd30-8e1d-11ea-b65e-4e1376171215"; + public static final String USER_ID = "67b3081e-8bc9-11ea-b45c-c7b846343364"; + + public PersonSearchControllerTest() { + } + + @Before + public void setUp() { + controller = new PersonSearchController(); + } + + //@Test + public void findAllLoanByUserOrderPreference() { + try { + List results = controller.findAllCoincidences("%janitzio%"); + + results.forEach(System.out::println); + + assertFalse(results.isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } + + //@Test + public void findPersonSearchDetail() { + try { + PersonSearchDetailView personSearchDetailView = controller.findPersonSearchDetail(PERSON_SEARCH_ID); + + System.out.println(personSearchDetailView); + assertNotNull(personSearchDetailView); + } catch (Exception e) { + assertFalse(true); + } + } + + @Test + public void searchPaymentDetails() { + try { + LoanByUserView personSearchDetailView = controller.searchPaymentDetails(USER_ID, PERSON_SEARCH_ID); + + System.out.println(personSearchDetailView); + assertNotNull(personSearchDetailView); + } catch (Exception e) { + assertFalse(true); + } + } + +} diff --git a/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/user/UserControllerTest.java b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/user/UserControllerTest.java new file mode 100644 index 0000000..a662eca --- /dev/null +++ b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/controller/user/UserControllerTest.java @@ -0,0 +1,66 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.controller.user; + +import com.arrebol.apc.model.core.User; +import java.util.List; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import org.junit.Before; +import org.junit.Test; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class UserControllerTest { + + /** + * Avatar 2 + */ + public final static String USER_MOBILE_AVATAR_2_ID = "52cbc85a-8bc9-11ea-b45c-c7b846343364"; + public final static String TEPIC_OFFICE = "caef3a64-7d1f-11ea-af3e-28f659da398e"; + + private UserController controller; + + @Before + public void setUp() { + controller = new UserController(); + } + + //@Test + public void isUserEnebled() { + try { + assertTrue(controller.isUserEnebled(USER_MOBILE_AVATAR_2_ID)); + } catch (Exception e) { + assertFalse(true); + } + } + + //@Test + public void containtsUserManagementProperty() { + try { + assertTrue(controller.containtsUserManagementProperty(USER_MOBILE_AVATAR_2_ID)); + } catch (Exception e) { + assertFalse(true); + } + } + + @Test + public void listOfUsersByOffice() { + try { + List results = controller.listOfUsersByOffice(TEPIC_OFFICE); + + results.forEach(System.out::println); + + assertFalse(results.isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } +} diff --git a/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/repository/ArrebolTestRepositoryTest.java b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/repository/ArrebolTestRepositoryTest.java new file mode 100644 index 0000000..07f847f --- /dev/null +++ b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/repository/ArrebolTestRepositoryTest.java @@ -0,0 +1,39 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository; + +import com.arrebol.apc.test.ArrebolTest; +import java.util.Date; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class ArrebolTestRepositoryTest { + + private ArrebolTestRepository repository; + + @Before + public void setUp() { + repository = new ArrebolTestRepository(); + } + + @Test + public void save() { + try { + ArrebolTest arrebolTest = new ArrebolTest(new Date(), new Date()); + + Assert.assertTrue(repository.saveArrebolTest(arrebolTest)); + } catch (Exception e) { + Assert.assertFalse(true); + } + } +} diff --git a/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/repository/loan/LoanTypeRepositoryTest.java b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/repository/loan/LoanTypeRepositoryTest.java new file mode 100644 index 0000000..62d37c4 --- /dev/null +++ b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/repository/loan/LoanTypeRepositoryTest.java @@ -0,0 +1,75 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.loan; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.constance.LoanTypeCfg; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.loan.LoanType; +import java.util.ArrayList; +import java.util.List; +import static org.junit.Assert.assertFalse; +import org.junit.Before; +import org.junit.Test; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class LoanTypeRepositoryTest { + + public static final String OFFICE_ID = "caef3a64-7d1f-11ea-af3e-28f659da398e"; + public static final String LOAND_ID = "acccdfac-8e1b-11ea-b65e-4e1376171215"; + + private LoanTypeRepository repository; + + @Before + public void setUp() { + repository = new LoanTypeRepository(); + } + + @Test + public void findLoanTypes() { + try { + List parameters = new ArrayList<>(); + + parameters.add( + new ModelParameter( + LoanTypeCfg.FIELD_OFFICE, + new Office(OFFICE_ID) + ) + ); + + parameters.add( + new ModelParameter( + LoanTypeCfg.PARAM_LOAN, + new Loan(LOAND_ID) + ) + ); + + parameters.add( + new ModelParameter( + LoanTypeCfg.PARAM_LOAN_ID, + LOAND_ID + ) + ); + + List results = repository.findLoanTypes( + LoanType.class, + LoanTypeCfg.QUERY_FIND_NEW_CREDIT_LINE_BY_LOAN_ID, + parameters); + + results.forEach(System.out::println); + assertFalse(results.isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } + +} diff --git a/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/repository/people/PeopleRepositoryTest.java b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/repository/people/PeopleRepositoryTest.java new file mode 100644 index 0000000..40dce2b --- /dev/null +++ b/apc-controller-mobile/src/test/java/com/arrebol/apc/controller/mobile/repository/people/PeopleRepositoryTest.java @@ -0,0 +1,68 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.mobile.repository.people; + +import com.arrebol.apc.controller.mobile.repository.people.PeopleRepository; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.PeopleType; +import java.util.Date; +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class PeopleRepositoryTest { + + private PeopleRepository repository; + public static final String OFFICE_ID = "e0f1a2fc-7d1f-11ea-af3e-28f659da398e"; + public static final String ROUTE_ID = "5e9a24e0-8e19-11ea-b65e-4e1376171215"; + public static final String TEXT_VALUE = "Testing"; + + public PeopleRepositoryTest() { + } + + @Before + public void setUp() { + repository = new PeopleRepository(); + } + + @Test + public void createPeople() { + try { + People people = new People(); + + people.setFirstName(TEXT_VALUE); + people.setLastName(TEXT_VALUE); + people.setMiddleName(TEXT_VALUE); + people.setAddressHome(TEXT_VALUE); + people.setPhoneHome(TEXT_VALUE); + people.setThumbnail(TEXT_VALUE); + people.setPeopleType(PeopleType.BOTH); + people.setActiveStatus(ActiveStatus.DISABLED); + people.setOffice(new Office(OFFICE_ID)); + people.setRouteCtlg(new RouteCtlg(ROUTE_ID)); + people.setCreatedBy(TEXT_VALUE); + people.setCreatedOn(new Date()); + + String id = null;//repository.createPeople(people); + + System.out.println(id); + + assertNotNull(id); + } catch (Exception e) { + assertFalse(true); + } + } + +} diff --git a/apc-controller-mobile/src/test/resources/apc.cfg.xml b/apc-controller-mobile/src/test/resources/apc.cfg.xml new file mode 100644 index 0000000..1ee5dd4 --- /dev/null +++ b/apc-controller-mobile/src/test/resources/apc.cfg.xml @@ -0,0 +1,224 @@ + + + + + org.hibernate.dialect.MySQLDialect + com.mysql.cj.jdbc.Driver + jdbc:mysql://localhost:3306/apo_pro_com_april_ten?serverTimezone=GMT-5 + apoprocommobilelocalhost + 0Ps$6%q8 + 1 + 2 + 300 + 50 + 3000 + false + false + true + thread + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-controller-mobile/src/test/resources/log4j2.xml b/apc-controller-mobile/src/test/resources/log4j2.xml new file mode 100644 index 0000000..64f531e --- /dev/null +++ b/apc-controller-mobile/src/test/resources/log4j2.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-controller/nb-configuration.xml b/apc-controller/nb-configuration.xml new file mode 100644 index 0000000..a65c451 --- /dev/null +++ b/apc-controller/nb-configuration.xml @@ -0,0 +1,18 @@ + + + + + + JDK_1.8 + + diff --git a/apc-controller/pom.xml b/apc-controller/pom.xml new file mode 100644 index 0000000..d40f887 --- /dev/null +++ b/apc-controller/pom.xml @@ -0,0 +1,91 @@ + + + 4.0.0 + com.arrebol + apc-controller + 1.0.0 + jar + + UTF-8 + 1.8 + 1.8 + 2.17.0 + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12.4 + + true + + + + + + + + mysql + mysql-connector-java + 8.0.12 + + + + org.apache.logging.log4j + log4j-api + ${log4j.version} + + + org.apache.logging.log4j + log4j-core + ${log4j.version} + + + org.apache.logging.log4j + log4j-slf4j-impl + ${log4j.version} + + + org.apache.commons + commons-dbcp2 + 2.6.0 + + + + com.arrebol + apc-layout + 1.0.0 + jar + + + com.arrebol + apc-model + 1.0.0 + + + + junit + junit + 4.12 + test + + + \ No newline at end of file diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/BitacoraController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/BitacoraController.java new file mode 100644 index 0000000..f5f151c --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/BitacoraController.java @@ -0,0 +1,75 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.BitacoraCfg; +import com.arrebol.apc.model.admin.constance.GoalCfg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.system.logs.Bitacora; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class BitacoraController implements Serializable{ + + /** + * + * Searching all bitacora by office. + * + * @param officeId + * @return + */ + public List fillBitacoraDatatable(String officeId) { + logger.debug("fillBitacoraDatatable"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(BitacoraCfg.FIELD_OFFICE, new Office(officeId))); + + return genericEntityRepository.xmlQueryAPCEntities(Bitacora.class, BitacoraCfg.QUERY_FIND_ALL_BITACORA_BY_OFFICE, parameters); + } + + public List fillBitacoraDatatableByDate(String officeId, Date startDate, Date endDate) { + logger.debug("fillBitacoraDatatableByDate"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(BitacoraCfg.FIELD_OFFICE, new Office(officeId))); + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + + return genericEntityRepository.xmlQueryAPCEntities(Bitacora.class, BitacoraCfg.QUERY_FIND_ALL_BITACORA_BY_OFFICE_DATE, parameters); + } + + /** + * + * @param bitacora + * @return boolean + */ + public boolean saveBitacora(Bitacora bitacora) { + logger.debug("saveBitacora"); + boolean success = genericEntityRepository.insertAPCEntity(bitacora); + + return success; + + } + + final Logger logger = LogManager.getLogger(BitacoraController.class); + private final GenericEntityRepository genericEntityRepository; + + public BitacoraController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/GenericController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/GenericController.java new file mode 100644 index 0000000..666d4a1 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/GenericController.java @@ -0,0 +1,191 @@ +/* + * Arrebol Consultancy copyright + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.ClosingDayCfg; +import com.arrebol.apc.model.admin.constance.StableGeneralBoxCfg; +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.core.constance.HumanResourceCfg; +import com.arrebol.apc.model.core.constance.UserCfg; +import com.arrebol.apc.model.enums.HumanResourceStatus; +import com.arrebol.apc.model.views.GeneralBoxView; +import com.arrebol.apc.model.views.constance.GeneralBoxViewCfg; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class GenericController implements Serializable{ + + /** + * + * Searching all user actives by office. + * + * @param officeId + * @return + */ + public List getAllUsersByOffice(String officeId) { + logger.debug("getAllUsersByOffice"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(UserCfg.FIELD_OFFICE, new Office(officeId))); + + return genericEntityRepository.xmlQueryAPCEntities(User.class, UserCfg.QUERY_FIND_ALL_USERS_COMPLETE, parameters); + } + + /** + * + * Searching all human resources actives by office. + * + * @param officeId + * @return + */ + public List getAllHRByOffice(String officeId) { + logger.debug("getAllHRByOffice"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(HumanResourceCfg.FIELD_OFFICE, new Office(officeId))); + parameters.add(new ModelParameter(HumanResourceCfg.FIELD_HR_STATUS, HumanResourceStatus.ENEBLED)); + + return genericEntityRepository.xmlQueryAPCEntities(HumanResource.class, HumanResourceCfg.QUERY_FIND_ALL_HR_BY_OFFICE, parameters); + } + + /** + * + * Searching all details by general box by office. + * + * @param officeId + * @return + */ + public BigDecimal findAllGeneralBox(String officeId) { + logger.debug("findAllGeneralBox"); + List generalBox = null; + BigDecimal totalBox; + totalBox = BigDecimal.ZERO; + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(GeneralBoxViewCfg.FIELD_OFFICE, officeId)); + + generalBox = genericEntityRepository.xmlQueryAPCEntities(GeneralBoxView.class, GeneralBoxViewCfg.QUERY_FIND_ALL_DETAILS, parameters); + + if(generalBox != null && !generalBox.isEmpty()) + { + for(GeneralBoxView total : generalBox) + { + if(total.getType().equalsIgnoreCase("Inicio")) + totalBox = totalBox.subtract(total.getAmount()); + if(total.getType().equalsIgnoreCase("Corte del día")) + totalBox = totalBox.add(total.getAmount()); + if(total.getType().equalsIgnoreCase("Entrada")) + totalBox = totalBox.add(total.getAmount()); + if(total.getType().equalsIgnoreCase("Salida")) + totalBox = totalBox.subtract(total.getAmount()); + if(total.getType().equalsIgnoreCase("Adelanto")) + totalBox = totalBox.subtract(total.getAmount()); + if(total.getType().equalsIgnoreCase("Nomina")) + totalBox = totalBox.subtract(total.getAmount()); + if(total.getType().equalsIgnoreCase("Préstamo Empleado")) + totalBox = totalBox.subtract(total.getAmount()); + } + } + + return totalBox; + } + + public BigDecimal findAllSmallBox(String officeId) { + logger.debug("findAllSmallBox"); + BigDecimal totalBox; + totalBox = BigDecimal.ZERO; + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(ClosingDayCfg.FIELD_OFFICE, new Office(officeId))); + + totalBox = (BigDecimal)genericEntityRepository.xmlQueryAPCEntityUniqueResult(BigDecimal.class, + ClosingDayCfg.QUERY_SUM_CLOSING_DAY_BY_CURDATE_AND_OFFICE, parameters); + + return totalBox; + } + + public Date getMaxDateStableGeneralBoxByOffice(String officeid) { + logger.debug("getMaxDateStableGeneralBoxByOffice"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(StableGeneralBoxCfg.FIELD_OFFICE, new Office(officeid))); + + return (Date) genericEntityRepository.xmlQueryAPCEntityUniqueResult(Date.class, StableGeneralBoxCfg.QUERY_MAX_STABLE_GENERAL_BOX_BY_OFFICE, parameters); + } + + public Date getMaxDateClosingDayByOffice(String officeid) { + logger.debug("getMaxDateClosingDayByOffice"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(StableGeneralBoxCfg.FIELD_OFFICE, new Office(officeid))); + + return (Date) genericEntityRepository.xmlQueryAPCEntityUniqueResult(Date.class, StableGeneralBoxCfg.QUERY_MAX_CLOSING_DAY_BY_OFFICE, parameters); + } + + public boolean verifyStableGeneralBoxVsClosingDay(String officeid) + { + if(getMaxDateStableGeneralBoxByOffice(officeid) == null || getMaxDateClosingDayByOffice(officeid) == null) + { + return true; + } + if(getMaxDateStableGeneralBoxByOffice(officeid).compareTo(getMaxDateClosingDayByOffice(officeid)) == 0) + { + return true; + } + else + { + return false; + } + } + + public boolean existStableSmallBoxByCreatedOn(Date date) { + logger.info("existStableSmallBoxByCreatedOn"); + + String query = "SELECT ssb.id " + + "FROM APC_STABLE_SMALL_BOX ssb " + + "WHERE DATE(ssb.created_on) = DATE(:date) " + + "AND ssb.active_status = 'ENEBLED'"; + + return genericEntityRepository.existRecordsUsingSQLQueryFindByCreatedOnField(date, query); + } + + /** + * + * @param date + * @return + */ + public boolean existStableGeneralBoxByCreatedOn(Date date) { + logger.info("existStableGeneralBoxByCreatedOn"); + + String query = "SELECT sgb.id " + + "FROM APC_STABLE_GENERAL_BOX sgb " + + "WHERE DATE(sgb.created_on) = DATE(:date) " + + "AND sgb.active_status = 'ENEBLED'"; + + return genericEntityRepository.existRecordsUsingSQLQueryFindByCreatedOnField(date, query); + } + + final Logger logger = LogManager.getLogger(GenericController.class); + private final GenericEntityRepository genericEntityRepository; + + public GenericController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/GenericValidationController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/GenericValidationController.java new file mode 100644 index 0000000..2037fd1 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/GenericValidationController.java @@ -0,0 +1,202 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller; + +import com.arrebol.apc.controller.util.ConnectionManager; +import com.arrebol.apc.controller.util.HibernateUtil; +import com.arrebol.apc.model.admin.ClosingDay; +import com.arrebol.apc.model.core.User; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.Transaction; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class GenericValidationController extends ConnectionManager implements Serializable{ + + /** + * + * @param date + * @param user + * @return + */ + public boolean existClosingDayByCreatedOn(Date date, User user) { + logger.info("existClosingDayByCreatedOn"); + + boolean success = true; + Transaction transaction = null; + + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + String query = "SELECT COUNT(ssb.id) " + + "FROM ClosingDay ssb " + + "WHERE DATE(ssb.createdOn) = DATE(:date) " + + "AND ssb.activeStatus = 'ENEBLED' " + + "AND ssb.user = :user"; + + Long count = (Long) session.createQuery(query) + .setParameter("date", date) + .setParameter("user", user).uniqueResult(); + + if (null != count && count == 0) { + success = false; + } + + transaction.commit(); + + logger.info("Total of closing day found: " + count); + } catch (HibernateException e) { + logger.error("Can not find stable small box by created on", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method existStableSmallBoxByCreatedOn()", e); + rollback(transaction); + } + + return success; + } + + public boolean existStableGeneralBoxByCurdate(User user) { + logger.info("existStableGeneralBoxByCurdate"); + + boolean success = true; + Transaction transaction = null; + + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + String query = "SELECT COUNT(ssb.id) " + + "FROM StableGeneralBox ssb " + + "WHERE DATE(ssb.createdOn) = CURDATE() " + + "AND ssb.activeStatus = 'ENEBLED'"; + + Long count = (Long) session.createQuery(query).uniqueResult(); + + if (null != count && count == 0) { + success = false; + } + + transaction.commit(); + + logger.info("Total of StableGeneralBox found: " + count); + } catch (HibernateException e) { + logger.error("Can not find StableGeneralBox by created on", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method existStableGeneralBoxByCurdate()", e); + rollback(transaction); + } + + return success; + } + + public Date lastStableGeneralBoxByDate(User user) { + logger.info("lastStableGeneralBoxByDate"); + + Date success = null; + Transaction transaction = null; + + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + String query = "SELECT cd.createdOn FROM StableGeneralBox cd " + + "WHERE DATE(cd.createdOn) <= CURDATE() AND cd.activeStatus = 'ENEBLED' " + + "order by cd.createdOn DESC"; + + success = (Date) session.createQuery(query).setMaxResults(1) + .uniqueResult(); + + transaction.commit(); + + logger.info("Total of closing day found: "); + } catch (HibernateException e) { + logger.error("Can not find stable small box by created on", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method lastStableGeneralBoxByDate()", e); + rollback(transaction); + } + + return success; + } + + public Date lastStableSmallBoxByDate(User user) { + logger.info("lastStableSmallBoxByDate"); + + Date success = null; + Transaction transaction = null; + + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + String query = "SELECT cd.createdOn FROM StableSmallBox cd " + + "WHERE DATE(cd.createdOn) <= CURDATE() AND cd.activeStatus = 'ENEBLED' " + + "order by cd.createdOn DESC"; + + success = (Date) session.createQuery(query).setMaxResults(1) + .uniqueResult(); + + transaction.commit(); + + logger.info("Total of closing day found: "); + } catch (HibernateException e) { + logger.error("Can not find stable small box by created on", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method lastStableSmallBoxByDate()", e); + rollback(transaction); + } + + return success; + } + + public List allClosingDayByDate( ) { + logger.info("allClosingDayByDate"); + + List success = null; + Transaction transaction = null; + + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + String query = "SELECT cd FROM ClosingDay cd " + + "WHERE DATE(cd.createdOn) = CURDATE() AND cd.activeStatus = 'ENEBLED'"; + + success = session.createQuery(query).getResultList(); + + transaction.commit(); + + logger.info("Total of closing day found: "); + } catch (HibernateException e) { + logger.error("Can not find stable small box by created on", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method lastStableSmallBoxByDate()", e); + rollback(transaction); + } + + return success; + } + + final Logger logger = LogManager.getLogger(GenericValidationController.class); + private static final long serialVersionUID = -6732331411572526429L; + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/AdministrationPersonSearchViewController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/AdministrationPersonSearchViewController.java new file mode 100644 index 0000000..e079f61 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/AdministrationPersonSearchViewController.java @@ -0,0 +1,148 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.catalog.constance.RouteCfg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.PeopleType; +import com.arrebol.apc.model.views.AdministrationPersonSerchView; +import com.arrebol.apc.model.views.constance.AdministrationPersonSerchViewCfg; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class AdministrationPersonSearchViewController implements Serializable { + + public List findAllActiveRoutesByOfficce(String idOffice) { + List routes; + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(RouteCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + parameters.add(new ModelParameter(RouteCfg.FIELD_OFFICE, new Office(idOffice))); + + routes = genericEntityRepository.xmlQueryAPCEntities(RouteCtlg.class, RouteCfg.QUERY_FIND_ALL_ROUTES, parameters); + } catch (Exception e) { + routes = new ArrayList<>(); + + logger.error("findPersonByTypeAndRouteAndOffice", e); + } + return routes; + } + + /** + * + * @param type + * @param idRoute + * @param idOffice + * @return + */ + public List findPersonByTypeAndRouteAndOffice(PeopleType type, String idRoute, String idOffice) { + List persons; + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(AdministrationPersonSerchViewCfg.FIELD_PEOPLE_TYPE, type)); + parameters.add(new ModelParameter(AdministrationPersonSerchViewCfg.FIELD_ID_ROUTE, idRoute)); + parameters.add(new ModelParameter(AdministrationPersonSerchViewCfg.FIELD_ID_OFFICE, idOffice)); + + persons = genericEntityRepository.xmlQueryAPCEntities(AdministrationPersonSerchView.class, AdministrationPersonSerchViewCfg.QUERY_FIND_PERSON_BY_TYPE_ROUTE_OFFICE, parameters); + } catch (Exception e) { + persons = new ArrayList<>(); + + logger.error("findPersonByTypeAndRouteAndOffice", e); + } + return persons; + } + + /** + * + * @param personSearch + * @param type + * @param routes + * @param idOffice + * @return + */ + public List likePersonNameInPersonTypeInRoutesAndOffice(String personSearch, PeopleType type, List routes, String idOffice) { + List persons; + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(AdministrationPersonSerchViewCfg.FIELD_PERSON_SEARCH, personSearch)); + parameters.add(new ModelParameter(AdministrationPersonSerchViewCfg.FIELD_PEOPLE_TYPE, type)); + parameters.add(new ModelParameter(AdministrationPersonSerchViewCfg.FIELD_ID_ROUTE, routes)); + parameters.add(new ModelParameter(AdministrationPersonSerchViewCfg.FIELD_ID_OFFICE, idOffice)); + + persons = genericEntityRepository.xmlQueryAPCEntities(AdministrationPersonSerchView.class, AdministrationPersonSerchViewCfg.QUERY_LIKE_PERSON_NAME_IN_PERSON_TYPE_IN_ROUTES_AND_OFFICE, parameters); + } catch (Exception e) { + persons = new ArrayList<>(); + + logger.error("likePersonNameInPersonTypeInRoutesAndOffice", e); + } + return persons; + } + + /** + * + * @param personSearch + * @param type + * @param idOffice + * @return + */ + public List likePersonNameInPersonTypeAllRoutesByOffice(String personSearch, PeopleType type, String idOffice) { + List persons; + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(AdministrationPersonSerchViewCfg.FIELD_PERSON_SEARCH, personSearch)); + parameters.add(new ModelParameter(AdministrationPersonSerchViewCfg.FIELD_PEOPLE_TYPE, type)); + parameters.add(new ModelParameter(AdministrationPersonSerchViewCfg.FIELD_ID_OFFICE, idOffice)); + + persons = genericEntityRepository.xmlQueryAPCEntities(AdministrationPersonSerchView.class, AdministrationPersonSerchViewCfg.QUERY_LIKE_PERSON_NAME_IN_PERSON_TYPE_ALL_ROUTES_BY_OFFICE, parameters); + } catch (Exception e) { + persons = new ArrayList<>(); + + logger.error("likePersonNameInPersonTypeAllRoutesByOffice", e); + } + return persons; + } + + /** + * + * @param id + * @return + */ + public AdministrationPersonSerchView administrationPersonSerchViewById(String id) { + AdministrationPersonSerchView person; + try { + person = (AdministrationPersonSerchView) genericEntityRepository.selectAPCEntityById(AdministrationPersonSerchView.class, id); + } catch (Exception e) { + person = new AdministrationPersonSerchView(); + + logger.error("administrationPersonSerchViewById", e); + } + return person; + } + + public AdministrationPersonSearchViewController() { + this.genericEntityRepository = new GenericEntityRepository(); + } + + final Logger logger = LogManager.getLogger(getClass()); + private final GenericEntityRepository genericEntityRepository; +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/AdvanceController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/AdvanceController.java new file mode 100644 index 0000000..d99b83d --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/AdvanceController.java @@ -0,0 +1,91 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.Advance; +import com.arrebol.apc.model.admin.constance.AdvanceCfg; +import com.arrebol.apc.model.admin.constance.BonusCfg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class AdvanceController implements Serializable { + + /** + * + * Searching all advances by office. + * + * @param officeId + * @param startDate + * @param endDate + * @return + */ + public List fillAdvanceDatatable(String officeId, Date startDate, Date endDate) { + logger.debug("fillAdvanceDatatable"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(AdvanceCfg.FIELD_OFFICE, new Office(officeId))); + //parameters.add(new ModelParameter(AdvanceCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + parameters.add(new ModelParameter(BonusCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(BonusCfg.PARAM_END_DATE, endDate)); + + return genericEntityRepository.xmlQueryAPCEntities(Advance.class, AdvanceCfg.QUERY_FIND_ALL_ADVANCE_BY_OFFICE_BETWEEN_DATES, parameters); + } + + /** + * + * @param advance + * @return boolean + */ + public boolean saveAdvance(Advance advance) { + logger.debug("saveAdvance"); + boolean success = genericEntityRepository.insertAPCEntity(advance); + + return success; + + } + + /** + * + * @param status + * @param advanceIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updateAdvanceByStatus(ActiveStatus status, String advanceIdToUpdate, String lastUpdatedBy) { + logger.debug("updateAdvanceByStatus"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(AdvanceCfg.FIELD_ACTIVE_STATUS, status)); + parameters.add(new ModelParameter(AdvanceCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(AdvanceCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(AdvanceCfg.FIELD_ID, advanceIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(AdvanceCfg.QUERY_UPDATE_ADVANCE_BY_STATUS, parameters); + } + + final Logger logger = LogManager.getLogger(AdvanceController.class); + private final GenericEntityRepository genericEntityRepository; + + public AdvanceController() { + this.genericEntityRepository = new GenericEntityRepository(); + } + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/AjustarInventariosController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/AjustarInventariosController.java new file mode 100644 index 0000000..c01d06f --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/AjustarInventariosController.java @@ -0,0 +1,93 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.controller.util.HibernateUtil; +import com.arrebol.apc.model.catalog.MovimientosInventario; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.GenericEnumType; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.UUID; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.Transaction; + +/** + * + * @author Oscar + */ +public class AjustarInventariosController implements Serializable { + + final Logger logger = LogManager.getLogger(AjustarInventariosController.class); + + public boolean addMovimientosInventario(MovimientosInventario moldelo, User user, Boolean guardar) { + logger.info("addMovimientosInventario"); + boolean success = false; + Transaction transaction = null; + + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + if (guardar) { + moldelo.setId(UUID.randomUUID().toString()); + moldelo.setCreatedBy(user.getId()); + moldelo.setCreatedOn(new Date()); + session.save(moldelo); + transaction.commit(); + logger.info(moldelo.getClass() + " saved " + moldelo.getId()); + } else { + moldelo.setLastUpdatedOn(new Date()); + moldelo.setLastUpdatedBy(user.getId()); + session.update(moldelo); + transaction.commit(); + logger.info(moldelo.getClass() + " updated " + moldelo.getId()); + } + + success = true; + } catch (HibernateException e) { + logger.error(moldelo.getClass() + " can not be added ", e); + } catch (Exception e) { + logger.error("Method addMovimientosInventario() ", e); + } + return success; + } + + public List fillMovimientosInventario() { + logger.info("fillMovimientosInventario"); + List resultList = null; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + CriteriaBuilder builder = session.getCriteriaBuilder(); + + CriteriaQuery criteria = builder.createQuery(MovimientosInventario.class); + Root root = criteria.from(MovimientosInventario.class); + + Predicate criterio = builder.equal(root.get("estatusActivo"), GenericEnumType.ENABLED); + criteria.where(builder.and(criterio)); + criteria.orderBy(builder.asc(root.get("createdOn"))); + resultList = session.createQuery(criteria).getResultList(); + + logger.info("MovimientosInventario encontrados: " + (null == resultList ? -1 : resultList.size())); + transaction.commit(); + } catch (HibernateException e) { + logger.error("No se econtraron MovimientosInventario: " + e); + } catch (Exception e) { + logger.error("Method fillMovimientosInventario ", e); + } + return resultList; + } + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/BonusController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/BonusController.java new file mode 100644 index 0000000..af92303 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/BonusController.java @@ -0,0 +1,102 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.Bonus; +import com.arrebol.apc.model.admin.constance.BonusCfg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class BonusController implements Serializable{ + + private static final long serialVersionUID = 4204730064288408417L; + + /** + * + * Searching all advances by office. + * + * @param officeId + * @param startDate + * @param endDate + * @return + */ + public List fillBonusDatatable(String officeId, Date startDate, Date endDate) { + logger.debug("fillBonusDatatable"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(BonusCfg.FIELD_OFFICE, new Office(officeId))); + parameters.add(new ModelParameter(BonusCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + parameters.add(new ModelParameter(BonusCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(BonusCfg.PARAM_END_DATE, endDate)); + + return genericEntityRepository.xmlQueryAPCEntities(Bonus.class, BonusCfg.QUERY_FIND_ALL_BONUS_BETWEEN_DATES, parameters); + } + + /** + * + * @param bonus + * @return boolean + */ + public boolean updateByBonusId(Bonus bonus) { + logger.debug("updateByBonusId"); + + return genericEntityRepository.updateAPCEntity(bonus); + } + + /** + * + * @param bonus + * @return boolean + */ + public boolean saveBonus(Bonus bonus) { + logger.debug("saveBonus"); + boolean success = genericEntityRepository.insertAPCEntity(bonus); + + return success; + } + + /** + * + * @param status + * @param bonusIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updateBonusByStatus(ActiveStatus status, String bonusIdToUpdate, String lastUpdatedBy) { + logger.debug("updateBonusByStatus"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(BonusCfg.FIELD_ACTIVE_STATUS, status)); + parameters.add(new ModelParameter(BonusCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(BonusCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(BonusCfg.FIELD_ID, bonusIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(BonusCfg.QUERY_UPDATE_BONUS_BY_STATUS, parameters); + } + + final Logger logger = LogManager.getLogger(BonusController.class); + private final GenericEntityRepository genericEntityRepository; + + public BonusController() { + this.genericEntityRepository = new GenericEntityRepository(); + } + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/ChangeOwnerController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/ChangeOwnerController.java new file mode 100644 index 0000000..3411818 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/ChangeOwnerController.java @@ -0,0 +1,140 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.ClosingDayCfg; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.core.constance.LoanByUserCfg; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.views.AvailablesOwnersView; +import com.arrebol.apc.model.views.CurrentCustomerByLoanView; +import com.arrebol.apc.model.views.constance.AvailablesOwnersViewCfg; +import com.arrebol.apc.model.views.constance.CurrentCustomerByLoanViewCfg; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class ChangeOwnerController implements Serializable { + + /** + * Find all users that have loans by office. + * + * @param officeId + * @return + * @throws Exception + */ + public List findAllCurrentOwners(String officeId) throws Exception { + logger.info("findAllCurrentOwners"); + + List results = new ArrayList(); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(AvailablesOwnersViewCfg.PARAM_OFFICE_ID, officeId)); + + results = genericEntityRepository.xmlQueryAPCEntities(AvailablesOwnersView.class, AvailablesOwnersViewCfg.QUERY_FIND_ALL_CURRENT_OWNERS, parameters); + } catch (Exception e) { + logger.error("findAllCurrentOwners", e); + } + return results; + } + + /** + * Find all users in office execluding user id (currentOwnerId). + * + * @param officeId + * @param currentOwnerId + * @return + * @throws Exception + */ + public List findAllNewOwners(String officeId, String currentOwnerId) throws Exception { + logger.info("findAllNewOwners"); + + List results = new ArrayList(); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(AvailablesOwnersViewCfg.PARAM_OFFICE_ID, officeId)); + parameters.add(new ModelParameter(AvailablesOwnersViewCfg.USER_ID, currentOwnerId)); + + results = genericEntityRepository.xmlQueryAPCEntities(AvailablesOwnersView.class, AvailablesOwnersViewCfg.QUERY_FIND_ALL_NEW_OWNERS, parameters); + } catch (Exception e) { + logger.error("findAllNewOwners", e); + } + return results; + } + + /** + * Find all loans that current owner has in status PENDING, TO_DELIVERY, + * PENDING_RENOVATION and APPROVED. + * + * @param officeId + * @param currentOwnerId + * @return + * @throws Exception + */ + public List findAllLoansByCurrentOwner(String officeId, String currentOwnerId) throws Exception { + logger.info("findAllLoansByCurrentOwner"); + + List results = new ArrayList(); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(CurrentCustomerByLoanViewCfg.PARAM_OFFICE_ID, officeId)); + parameters.add(new ModelParameter(CurrentCustomerByLoanViewCfg.USER_ID, currentOwnerId)); + + results = genericEntityRepository.xmlQueryAPCEntities(CurrentCustomerByLoanView.class, CurrentCustomerByLoanViewCfg.QUERY_FIND_ALL_LOANS_BY_CURRENT_OWNER, parameters); + } catch (Exception e) { + logger.error("findAllLoansByCurrentOwner", e); + } + return results; + } + + /** + * + * @param newOwner + * @param loans + * @return + */ + public boolean changeLoansBetweenUsers(String newOwner, List loans) { + logger.info("changeLoansBetweenUsers"); + + boolean success = false; + + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanByUserCfg.FIELD_USER, new User(newOwner))); + parameters.add(new ModelParameter(LoanByUserCfg.PARAMS_LOAN, loans)); + + success = genericEntityRepository.xmlUpdateOrDeleteAPCEntity(LoanByUserCfg.QUERY_CHANGE_LOANS_BETWEEN_USERS_IN_LOAN_IDS, parameters); + } catch (Exception e) { + logger.error("changeLoansBetweenUsers", e); + } + + return success; + } + + private static final long serialVersionUID = 2051770456409752434L; + final Logger logger = LogManager.getLogger(getClass().getName()); + + private final GenericEntityRepository genericEntityRepository; + + public ChangeOwnerController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/ClosingDayController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/ClosingDayController.java new file mode 100644 index 0000000..252da32 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/ClosingDayController.java @@ -0,0 +1,439 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.controller.util.ConnectionManager; +import com.arrebol.apc.controller.util.HibernateUtil; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.ClosingDay; +import com.arrebol.apc.model.admin.ClosingDayDetail; +import com.arrebol.apc.model.admin.constance.ClosingDayCfg; +import com.arrebol.apc.model.admin.constance.ClosingDayDetailCfg; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.views.ClosingDailyDetailFromUserByCurdateView; +import com.arrebol.apc.model.views.LoanByUserPaymentZeroView; +import com.arrebol.apc.model.views.TotalCashByCurdateDashboardView; +import com.arrebol.apc.model.views.TotalCashByCurdateView; +import com.arrebol.apc.model.views.TotalClosingDayByCurdateView; +import com.arrebol.apc.model.views.constance.ClosingDailyDetailFromUserByCurdateCfg; +import com.arrebol.apc.model.views.constance.LoanByUserPaymentZeroViewCfg; +import com.arrebol.apc.model.views.constance.TotalLoansByOfficeViewCfg; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.Transaction; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class ClosingDayController extends ConnectionManager implements Serializable { + + /** + * + * Searching all closing day by office. + * + * @param officeId + * @param startDate + * @param endDate + * @return + */ + public List fillClosingDayDatatable(String officeId, Date startDate, Date endDate) { + logger.debug("fillClosingDayDatatable"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(ClosingDayCfg.FIELD_OFFICE, new Office(officeId))); + //parameters.add(new ModelParameter(ClosingDayCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + parameters.add(new ModelParameter(ClosingDayCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(ClosingDayCfg.PARAM_END_DATE, endDate)); + + return genericEntityRepository.xmlQueryAPCEntities(ClosingDay.class, ClosingDayCfg.QUERY_FIND_ALL_CLOSING_DAY_BY_OFFICE_BETWEEN_DATES, parameters); + } + + /** + * + * @param status + * @param closingDayIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updateClosingDayByStatus(ActiveStatus status, String closingDayIdToUpdate, String lastUpdatedBy) { + logger.debug("updateClosingDayByStatus"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(ClosingDayCfg.FIELD_ACTIVE_STATUS, status)); + parameters.add(new ModelParameter(ClosingDayCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(ClosingDayCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(ClosingDayCfg.FIELD_ID, closingDayIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(ClosingDayCfg.QUERY_UPDATE_CLOSING_DAY_BY_STATUS, parameters); + } + + /** + * + * @param closingDay + * @return boolean + */ + public boolean saveClosingDay(ClosingDay closingDay) { + logger.debug("saveClosingDay"); + boolean success = genericEntityRepository.insertAPCEntity(closingDay); + + return success; + } + + /** + * + * Searching TotalCashByCurdateView by id. + * + * @param id + * @return + */ + public TotalCashByCurdateView getTotalCashByCurdateViewById(String id) { + logger.debug("getTotalCashByCurdateViewById"); + + return (TotalCashByCurdateView) genericEntityRepository.selectAPCEntityById(TotalCashByCurdateView.class, id); + } + + /** + * + * Searching all total money day by office. + * + * @param officeId + * @return + */ + public List getAllTotalCashByCurdateView(String officeId) { + logger.debug("getAllTotalCashByCurdateView"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(ClosingDayCfg.FIELD_VIEW_OFFICE, officeId)); + + return genericEntityRepository.xmlQueryAPCEntities(TotalCashByCurdateView.class, ClosingDayCfg.QUERY_FIND_TOTAL_BY_OFFICE, parameters); + } + + public List getAllTotalCashByCurdateDashboardView(String officeId) { + logger.debug("getAllTotalCashByCurdateDashboardView"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(ClosingDayCfg.FIELD_VIEW_OFFICE, officeId)); + + return genericEntityRepository.xmlQueryAPCEntities(TotalCashByCurdateDashboardView.class, ClosingDayCfg.QUERY_FIND_TOTAL_DASHBOARD_BY_OFFICE, parameters); + } + + /** + * + * Searching all TotalClosingDayByCurdateView by curdate. + * + * @param officeId + * @return + */ + public List findAllClosingDayByCurdate(String officeId) { + logger.debug("findAllClosingDayByCurdate"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(ClosingDayCfg.FIELD_VIEW_OFFICE, officeId)); + + return genericEntityRepository.xmlQueryAPCEntities(TotalClosingDayByCurdateView.class, ClosingDayCfg.QUERY_FIND_ALL_CLOSING_DAY_BY_CURDATE, parameters); + } + + /** + * + * Searching all ClosingDailyDetailFromUserByCurdateView by curdate. + * + * @param userId + * @return + */ + public List findAllClosingDailyDetailFromUserByCurdateView(String userId) { + logger.debug("findAllClosingDailyDetailFromUserByCurdateView"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(ClosingDailyDetailFromUserByCurdateCfg.FIELD_VIEW_USER, userId)); + + return genericEntityRepository.xmlQueryAPCEntities(ClosingDailyDetailFromUserByCurdateView.class, ClosingDailyDetailFromUserByCurdateCfg.QUERY_FIND_ALL_DETAILS, parameters); + } + + /** + * + * Searching all ClosingDailyDetailFromUserByCurdateView by curdate. + * + * @param userId + * @return + */ + public List findAllClosingDailyDetailFromUserCertifierByCurdateView(String userId) { + logger.debug("findAllClosingDailyDetailFromUserCertifierByCurdateView"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(ClosingDailyDetailFromUserByCurdateCfg.FIELD_VIEW_USER, userId)); + + return genericEntityRepository.xmlQueryAPCEntities(ClosingDailyDetailFromUserByCurdateView.class, ClosingDailyDetailFromUserByCurdateCfg.QUERY_FIND_ALL_DETAILS_CERTIFIER, parameters); + } + + /** + * + * Searching the num by closing day + * + * @param num for closing day + * @return + */ + public Long getClosingDayCurdateByUserId(String userId, String officeid) { + logger.debug("getClosingDayCurdateByUserId"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(ClosingDayCfg.FIELD_USER, new User(userId))); + parameters.add(new ModelParameter(ClosingDayCfg.FIELD_OFFICE, new Office(officeid))); + + return (Long) genericEntityRepository.xmlQueryAPCEntityUniqueResult(Long.class, ClosingDayCfg.QUERY_COUNT_CLOSING_DATE_BY_USER_AND_OFFICE, parameters); + } + + public Long getLoansCountDailyByUser(String userId) { + logger.debug("getLoansCountDailyByUser"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(TotalLoansByOfficeViewCfg.FIELD_VIEW_USER, userId)); + + return (Long) genericEntityRepository.xmlQueryAPCEntityUniqueResult(Long.class, TotalLoansByOfficeViewCfg.QUERY_COUNT_ALL_LOANS_BY_USER, parameters); + } + + public List getLoansPaymentZeroByUser(String userId) { + logger.debug("getLoansPaymentZeroByUser"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanByUserPaymentZeroViewCfg.FIELD_VIEW_USER, new User(userId))); + + return genericEntityRepository.xmlQueryAPCEntities(LoanByUserPaymentZeroView.class, LoanByUserPaymentZeroViewCfg.QUERY_FIND_ALL_LOANS_PAYMENT_ZERO_BY_USER, parameters); + } + + /** + * + * @param details + * @return boolean + */ + public boolean saveClosingDayDetail(List details) { + logger.debug("saveClosingDayDetail"); + boolean success = genericEntityRepository.insertManyAPCEntity(details); + + return success; + } + + /** + * + * Searching closing day by id. + * + * @param closingDayId + * @return + */ + public ClosingDay getClosingDayById(String closingDayId) { + logger.debug("getClosingDayById"); + + return (ClosingDay) genericEntityRepository.selectAPCEntityById(ClosingDay.class, closingDayId); + } + + public List getClosingDayDetailByIdClosingDay(String closingDay) { + logger.debug("getClosingDayDetailByIdClosingDay"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(ClosingDayDetailCfg.FIELD_CLOSING_DAY, new ClosingDay(closingDay))); + + return genericEntityRepository.xmlQueryAPCEntities(ClosingDayDetail.class, ClosingDayDetailCfg.QUERY_FIND_ALL_CLOSING_DAY_DETAIL_BY_ID, parameters); + } + + public User getUserById(String userId) { + logger.debug("getUserById"); + + return (User) genericEntityRepository.selectAPCEntityById(User.class, userId); + } + + /** + * + * @param date + * @return + */ + public boolean existNextPaidClosingDayByCreatedOn(Date date) { + logger.info("existNextPaidClosingDayByCreatedOn"); + + String query = "SELECT cd.id " + + "FROM APC_CLOSING_DAY cd " + + "WHERE DATE(cd.created_on) >= DATE_ADD(DATE(:date), INTERVAL 1 DAY) " + + "AND cd.active_status = 'ENEBLED'"; + + return genericEntityRepository.existRecordsUsingSQLQueryFindByCreatedOnField(date, query); + } + + /** + * + * @param date + * @return + */ + public boolean existStableSmallBoxByCreatedOn(Date date) { + logger.info("existStableSmallBoxByCreatedOn"); + + String query = "SELECT ssb.id " + + "FROM APC_STABLE_SMALL_BOX ssb " + + "WHERE DATE(ssb.created_on) = DATE(:date) " + + "AND ssb.active_status = 'ENEBLED'"; + + return genericEntityRepository.existRecordsUsingSQLQueryFindByCreatedOnField(date, query); + } + + /** + * + * @param userId + * @return + */ + public List findDetailsFromClosingDayCurDate(String userId){ + logger.debug("findDetailsFromClosingDayCurDate"); + + List rows = new ArrayList<>(); + Transaction transaction = null; + + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + rows = session.createNativeQuery(queryClosingDayReport).setParameter("userId", userId).getResultList(); + + transaction.commit(); + + } catch (HibernateException e) { + logger.error("Driver", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method findDetailsFromClosingDayCurDate(" + userId + " " + ") ", e); + rollback(transaction); + } + + return rows; + } + + public List findDetailsFromClosingDayHisotry(String idClosingDay){ + logger.debug("findDetailsFromClosingDayCurDate"); + + List rows = new ArrayList<>(); + Transaction transaction = null; + + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + rows = session.createNativeQuery(queryClosingDayReportHistory).setParameter("idClosingDay", idClosingDay).getResultList(); + + transaction.commit(); + + } catch (HibernateException e) { + logger.error("Driver", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method findDetailsFromClosingDayHistory(" + idClosingDay + " " + ") ", e); + rollback(transaction); + } + + return rows; + } + + /** + * + * Searching people. + * + * @param peopleId + * @return + */ + public People findPeopleById(String peopleId) { + logger.debug("findPeopleById"); + + return (People) genericEntityRepository.selectAPCEntityById(User.class, peopleId); + } + + final Logger logger = LogManager.getLogger(ClosingDayController.class); + private final GenericEntityRepository genericEntityRepository; + + public ClosingDayController() { + this.genericEntityRepository = new GenericEntityRepository(); + } + + private final String queryClosingDayReport = + "SELECT " + + "cldd.comments, " + + "cldd.amount, " + + "cldd.type, " + + "cldd.saldo, " + + "cldd.created_on, " + + "cldd.comisionApertura, " + + "cldd.prestamoAnterior, " + + "cldd.route, " + + "CONCAT(hr.first_name,' ',IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name, ' ')),hr.last_name,' ', hr.middle_name) AS username, " + + "(SELECT sum(tc.total_amount_payment) FROM APC_TOTAL_CASH_BY_CURDATE_VIEW tc where id = :userId) as total_amount_payment, " + + "(SELECT sum(tc.total_amount_deposit) FROM APC_TOTAL_CASH_BY_CURDATE_VIEW tc where id = :userId) as total_amount_deposit, " + + "(SELECT sum(tc.transfer_sender) FROM APC_TOTAL_CASH_BY_CURDATE_VIEW tc where id = :userId) as transfer_sender, " + + "(SELECT sum(tc.transfer_receiver) FROM APC_TOTAL_CASH_BY_CURDATE_VIEW tc where id = :userId) as transfer_receiver, " + + "(SELECT sum(tc.money_daily) FROM APC_TOTAL_CASH_BY_CURDATE_VIEW tc where id = :userId) as money_daily, " + + "(SELECT sum(tc.other_expense) FROM APC_TOTAL_CASH_BY_CURDATE_VIEW tc where id = :userId) as other_expense, " + + "(SELECT sum(tc.delivery) FROM APC_TOTAL_CASH_BY_CURDATE_VIEW tc where id = :userId) as delivery, " + + "(SELECT sum(tc.transfer_pending) FROM APC_TOTAL_CASH_BY_CURDATE_VIEW tc where id = :userId) as transfer_pending " + + "FROM " + + " APC_CLOSING_DAILY_DETAIL_FROM_USER_BY_CURDATE_VIEW_REPORT cldd " + + "INNER JOIN " + + " APC_USER u ON u.id = cldd.id_user " + + "INNER JOIN " + + " APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource " + + "WHERE " + + " cldd.id_user = :userId " + + "ORDER BY " + + " cldd.created_on ASC"; + + + private final String queryClosingDayReportHistory = +" SELECT " + +" cldd.comments, " + +" cldd.amount, " + +" cldd.type, " + +" cldd.created_on, " + +" cd.amount_expected, " + +" cd.amount_paid, " + +" CONCAT(hr.first_name,' ',IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name, ' ')),hr.last_name,' ', hr.middle_name) AS username, " + +" (SELECT IFNULL(SUM(cld.amount),0) FROM APC_CLOSING_DAY_DETAIL cld WHERE cld.type='Abono' AND cld.id_closing_day = :idClosingDay) as total_amount_payment, " + +" (SELECT IFNULL(SUM(cld.amount),0) FROM APC_CLOSING_DAY_DETAIL cld WHERE cld.type='Depósito' AND cld.id_closing_day = :idClosingDay) as total_amount_deposit, " + +" (SELECT IFNULL(SUM(cld.amount),0) FROM APC_CLOSING_DAY_DETAIL cld WHERE cld.type='Transferencia enviada' AND cld.id_closing_day = :idClosingDay) as transfer_sender, " + +" (SELECT IFNULL(SUM(cld.amount),0) FROM APC_CLOSING_DAY_DETAIL cld WHERE cld.type='Transferencia recibida' AND cld.id_closing_day = :idClosingDay) as transfer_receiver, " + +" (SELECT IFNULL(SUM(cld.amount),0) FROM APC_CLOSING_DAY_DETAIL cld WHERE cld.type='Inicio' AND cld.id_closing_day = :idClosingDay) as money_daily, " + +" (SELECT IFNULL(SUM(cld.amount),0) FROM APC_CLOSING_DAY_DETAIL cld WHERE cld.type='Gasto' AND cld.id_closing_day = :idClosingDay) as other_expense, " + +" (SELECT IFNULL(SUM(cld.amount),0) FROM APC_CLOSING_DAY_DETAIL cld WHERE cld.type='Entrega de préstamo' AND cld.id_closing_day = :idClosingDay) as delivery, " + +" (SELECT IFNULL(SUM(cld.amount),0) FROM APC_CLOSING_DAY_DETAIL cld WHERE cld.type='Multa' AND cld.id_closing_day = :idClosingDay) as total_amount_fee, " + +" cldd.dateDetail "+ +" FROM " + +" APC_CLOSING_DAY_DETAIL cldd " + +" INNER JOIN " + +" APC_CLOSING_DAY cd on cldd.id_closing_day = cd.id" + +" INNER JOIN" + +" APC_USER u ON u.id = cd.id_user " + +" INNER JOIN " + +" APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource " + +" WHERE " + +" cldd.id_closing_day = :idClosingDay" + +" ORDER BY" + +" cldd.created_on ASC; "; +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/CustomerController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/CustomerController.java new file mode 100644 index 0000000..69ee707 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/CustomerController.java @@ -0,0 +1,141 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.controller.util.HibernateUtil; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.catalog.constance.PeopleCfg; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.core.constance.LoanCfg; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.views.LoanDetailZeroView; +import com.arrebol.apc.model.views.LoanFinishedView; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.Transaction; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class CustomerController extends PeopleController implements Serializable{ + + /** + * + * Searching all customers. + * + * @param officeId + * @return + */ + public List fillCustomersDatatable(String officeId) { + logger.debug("fillCustomersDatatable"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PeopleCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + + return genericEntityRepository.xmlQueryAPCEntities(People.class, PeopleCfg.QUERY_FIND_ALL_CUSTOMER, parameters); + } + + /** + * + * Searching all loan by customer. + * + * @param peopleId + * @return + */ + public List findLoanByCustomer(String peopleId) { + logger.debug("findLoanByCustomer"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanCfg.FIELD_CUSTOMER, new People(peopleId))); + + return genericEntityRepository.xmlQueryAPCEntities(Loan.class, LoanCfg.QUERY_FIND_LOAN_BY_CUSTOMER, parameters); + } + + public List findLoanByCustomerLimit(String peopleId) { + logger.debug("findLoanByCustomer"); + List results = new ArrayList<>(); + + Transaction transaction = null; + + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + + transaction = session.beginTransaction(); + + + + results = session.createQuery("SELECT l FROM Loan l WHERE customer = :customer AND loanStatus != 'DELETED' ORDER BY createdOn DESC") + .setParameter("customer", peopleId) + .setMaxResults(2) + .getResultList(); + + transaction.commit(); + + logger.info("Closing daily detail's list " + results.size()); + } catch (HibernateException e) { + logger.error("Can not find closing daily details list", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method findDetailsFromClosingDayID()", e); + rollback(transaction); + } + + + + + return results; + } + + /** + * + * Searching all loan for juridical. + * + * @param idUser + * @return + */ + public List findLoanJuridical(String idUser) { + logger.debug("findLoanJuridical"); + List parameters = new ArrayList<>(); + parameters.add(new ModelParameter(LoanCfg.FIELD_USER, new User(idUser))); + return genericEntityRepository.xmlQueryAPCEntities(Loan.class, LoanCfg.QUERY_FIND_LOAN_JURIDICAL, parameters); + } + + public List findLoanZero( ) { + logger.debug("findLoanZero"); + List parameters = new ArrayList<>(); + return genericEntityRepository.xmlQueryAPCEntities(LoanDetailZeroView.class, LoanCfg.QUERY_FIND_LOAN_ZERO, parameters); + } + + public List findLoanFinished( ) { + logger.debug("findLoanFinished"); + List parameters = new ArrayList<>(); + return genericEntityRepository.xmlQueryAPCEntities(LoanFinishedView.class, LoanCfg.QUERY_FIND_LOAN_FINISHED, parameters); + } + + final Logger logger = LogManager.getLogger(CustomerController.class); + private final GenericEntityRepository genericEntityRepository; + + public CustomerController() { + this.genericEntityRepository = new GenericEntityRepository(); + } + + protected void rollback(Transaction transaction) { + if (null != transaction) { + transaction.rollback(); + } + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/EndorsementController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/EndorsementController.java new file mode 100644 index 0000000..979bacb --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/EndorsementController.java @@ -0,0 +1,67 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.catalog.constance.PeopleCfg; +import com.arrebol.apc.model.core.constance.LoanCfg; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class EndorsementController extends PeopleController implements Serializable{ + + /** + * + * Searching all endorsement. + * + * @param officeId + * @return + */ + public List fillEndorsementsDatatable(String officeId) { + logger.debug("fillEndorsementsDatatable"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PeopleCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + + return genericEntityRepository.xmlQueryAPCEntities(People.class, PeopleCfg.QUERY_FIND_ALL_ENDORSEMENT, parameters); + } + + /** + * + * Searching all loan by endorsement. + * + * @param peopleId + * @return + */ + public List findLoanByEndorsement(String peopleId) { + logger.debug("findLoanByEndorsement"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanCfg.FIELD_ENDORSEMENT, new People(peopleId))); + + return genericEntityRepository.xmlQueryAPCEntities(Loan.class, LoanCfg.QUERY_FIND_LOAN_BY_ENDORSEMENT, parameters); + } + + final Logger logger = LogManager.getLogger(EndorsementController.class); + private final GenericEntityRepository genericEntityRepository; + + public EndorsementController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/ExpenseCompanyController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/ExpenseCompanyController.java new file mode 100644 index 0000000..f032e7a --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/ExpenseCompanyController.java @@ -0,0 +1,147 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.ExpenseCompany; +import com.arrebol.apc.model.admin.constance.ExpenseCompanyCfg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.ExpenseCompanyType; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class ExpenseCompanyController implements Serializable { + + /** + * + * Searching all expense company in by office. + * + * @param officeId + * @param startDate + * @param endDate + * @return + */ + public List fillxpenseCompanyInDatatable(String officeId, Date startDate, Date endDate) { + logger.debug("fillxpenseCompanyDatatable"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(ExpenseCompanyCfg.FIELD_OFFICE, new Office(officeId))); + //parameters.add(new ModelParameter(ExpenseCompanyCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + parameters.add(new ModelParameter(ExpenseCompanyCfg.FIELD_EXPENSE_COMPANY_TYPE, ExpenseCompanyType.PAYMENT_IN)); + parameters.add(new ModelParameter(ExpenseCompanyCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(ExpenseCompanyCfg.PARAM_END_DATE, endDate)); + + return genericEntityRepository.xmlQueryAPCEntities(ExpenseCompany.class, ExpenseCompanyCfg.QUERY_FIND_ALL_EXPENSE_COMPANY_BY_OFFICE_BETWEEN_DATES, parameters); + } + + /** + * + * Searching all expense company out by office. + * + * @param officeId + * @param startDate + * @param endDate + * @return + */ + public List fillxpenseCompanyOutDatatable(String officeId, Date startDate, Date endDate) { + logger.debug("fillxpenseCompanyOutDatatable"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(ExpenseCompanyCfg.FIELD_OFFICE, new Office(officeId))); + //parameters.add(new ModelParameter(ExpenseCompanyCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + parameters.add(new ModelParameter(ExpenseCompanyCfg.FIELD_EXPENSE_COMPANY_TYPE, ExpenseCompanyType.PAYMENT_OUT)); + parameters.add(new ModelParameter(ExpenseCompanyCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(ExpenseCompanyCfg.PARAM_END_DATE, endDate)); + + return genericEntityRepository.xmlQueryAPCEntities(ExpenseCompany.class, ExpenseCompanyCfg.QUERY_FIND_ALL_EXPENSE_COMPANY_BY_OFFICE_BETWEEN_DATES, parameters); + } + + /** + * + * @param status + * @param expenseCompanyIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updateExpenseCompanyByStatus(ActiveStatus status, String expenseCompanyIdToUpdate, String lastUpdatedBy) { + logger.debug("updateExpenseCompanyByStatus"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(ExpenseCompanyCfg.FIELD_ACTIVE_STATUS, status)); + parameters.add(new ModelParameter(ExpenseCompanyCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(ExpenseCompanyCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(ExpenseCompanyCfg.FIELD_ID, expenseCompanyIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(ExpenseCompanyCfg.QUERY_UPDATE_EXPENSE_COMPANY_BY_STATUS, parameters); + } + + /** + * + * @param expenseCompany + * @return boolean + */ + public boolean saveExpenseCompany(ExpenseCompany expenseCompany) { + logger.debug("saveExpenseCompany"); + boolean success = genericEntityRepository.insertAPCEntity(expenseCompany); + + return success; + } + + /** + * + * Searching expense by id. + * + * @param expenseId + * @return + */ + public ExpenseCompany getExpenseById(String expenseId) { + logger.debug("getExpenseById"); + + return (ExpenseCompany) genericEntityRepository.selectAPCEntityById(ExpenseCompany.class, expenseId); + } + + final Logger logger = LogManager.getLogger(ExpenseCompanyController.class); + private final GenericEntityRepository genericEntityRepository; + + public ExpenseCompanyController() { + this.genericEntityRepository = new GenericEntityRepository(); + } + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/FeesController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/FeesController.java new file mode 100644 index 0000000..a1acff2 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/FeesController.java @@ -0,0 +1,113 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.GoalCfg; +import com.arrebol.apc.model.enums.FeeStatus; +import com.arrebol.apc.model.views.FeesView; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import com.arrebol.apc.model.views.constance.FeesViewCfg; +import java.math.BigDecimal; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; + +/** + * + * @author David Rodriguez + */ +public class FeesController implements Serializable { + + public List fillFeesDataTable(Date startDate, Date endDate, String idUser) { + logger.debug("fillFeesDataTable"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = new ArrayList<>(); + + if (idUser != null && !idUser.equals("")) { + parameters.add(new ModelParameter(FeesViewCfg.FIELD_USER, idUser)); + dataComplete = genericEntityRepository.xmlQueryAPCEntities(FeesView.class, FeesViewCfg.QUERY_FIND_ALL_FEES_BETWEEN_DATES_USER, parameters); + } else { + dataComplete = genericEntityRepository.xmlQueryAPCEntities(FeesView.class, FeesViewCfg.QUERY_FIND_ALL_FEES_BETWEEN_DATES, parameters); + } + + Map mapDataFees = new HashMap<>(); + for (FeesView fee : dataComplete) { + if (mapDataFees.get(fee.getIdUser()) != null) { + mapDataFees.get(fee.getIdUser()).setTotalFees(mapDataFees.get(fee.getIdUser()).getTotalFees().add(fee.getTotalFees())); + } else { + mapDataFees.put(fee.getIdUser(), fee); + } + + if(fee.getFeeStatus() != null && fee.getFeeStatus().equals(FeeStatus.PAID)){ + mapDataFees.get(fee.getIdUser()).setTotalFeePaid(mapDataFees.get(fee.getIdUser()).getTotalFeePaid().add(fee.getTotalFees())); + } + } + dataComplete.clear(); + dataComplete.addAll(mapDataFees.values()); + return dataComplete; + } + + public List fillFeesDataTableByRoute(Date startDate, Date endDate, String idRoute) { + logger.debug("fillFeesDataTableByRoute"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = new ArrayList<>(); + + if (idRoute != null && !idRoute.equals("")) { + parameters.add(new ModelParameter(FeesViewCfg.FIELD_ROUTE, idRoute)); + dataComplete = genericEntityRepository.xmlQueryAPCEntities(FeesView.class, FeesViewCfg.QUERY_FIND_ALL_FEES_BETWEEN_DATES_ROUTE, parameters); + } else { + dataComplete = genericEntityRepository.xmlQueryAPCEntities(FeesView.class, FeesViewCfg.QUERY_FIND_ALL_FEES_BETWEEN_DATES, parameters); + } + + Map mapDataFees = new HashMap<>(); + dataComplete.forEach((fee) -> { + if (mapDataFees.get(fee.getIdRoute()) != null) { + mapDataFees.get(fee.getIdRoute()).setTotalFees(mapDataFees.get(fee.getIdRoute()).getTotalFees().add(fee.getTotalFees())); + } else { + mapDataFees.put(fee.getIdRoute(), fee); + } + }); + dataComplete.clear(); + dataComplete.addAll(mapDataFees.values()); + + dataComplete.sort(Comparator.comparing(FeesView::getRouteName)); + return dataComplete; + } + + public BigDecimal fillTotalFees(Date startDate, Date endDate) { + logger.debug("fillFeesDataTable"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(FeesView.class, FeesViewCfg.QUERY_FIND_ALL_FEES_BETWEEN_DATES, parameters); + BigDecimal totalFees = new BigDecimal("0"); + for (FeesView fee : dataComplete) { + totalFees = totalFees.add(fee.getTotalFees()); + } + return totalFees; + } + + final Logger logger = LogManager.getLogger(FeesController.class); + private final GenericEntityRepository genericEntityRepository; + + public FeesController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/GoalController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/GoalController.java new file mode 100644 index 0000000..3521b06 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/GoalController.java @@ -0,0 +1,100 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.Goal; +import com.arrebol.apc.model.admin.constance.GoalCfg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class GoalController implements Serializable{ + + /** + * + * Searching all goals by office. + * + * @param officeId + * @param startDate + * @param endDate + * @return + */ + public List fillGoalDatatable(String officeId, Date startDate, Date endDate) { + logger.debug("fillGoalDatatable"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(GoalCfg.FIELD_OFFICE, new Office(officeId))); + parameters.add(new ModelParameter(GoalCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + + return genericEntityRepository.xmlQueryAPCEntities(Goal.class, GoalCfg.QUERY_FIND_ALL_GOALS_BY_OFFICE_BETWEEN_DATES, parameters); + } + + /** + * + * @param goal + * @return boolean + */ + public boolean saveGoal(Goal goal) { + logger.debug("saveGoal"); + boolean success = genericEntityRepository.insertAPCEntity(goal); + + return success; + + } + /** + * + * @param status + * @param goalIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updateGoalByStatus(ActiveStatus status, String goalIdToUpdate, String lastUpdatedBy) { + logger.debug("updateGoalByStatus"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(GoalCfg.FIELD_ACTIVE_STATUS, status)); + parameters.add(new ModelParameter(GoalCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(GoalCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(GoalCfg.FIELD_ID, goalIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(GoalCfg.QUERY_UPDATE_GOAL_BY_STATUS, parameters); + } + + /** + * + * @param goal + * @return boolean + */ + public boolean updateByGoalId(Goal goal) { + logger.debug("updateByGoalId"); + + return genericEntityRepository.updateAPCEntity(goal); + } + + final Logger logger = LogManager.getLogger(GoalController.class); + private final GenericEntityRepository genericEntityRepository; + + public GoalController() { + this.genericEntityRepository = new GenericEntityRepository(); + } + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/LoanController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/LoanController.java new file mode 100644 index 0000000..55f89b5 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/LoanController.java @@ -0,0 +1,563 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.core.constance.LoanByRenovationCfg; +import com.arrebol.apc.model.core.constance.LoanByUserCfg; +import com.arrebol.apc.model.core.constance.LoanCfg; +import com.arrebol.apc.model.core.constance.LoanDetailsCfg; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.LoanRenovationStatus; +import com.arrebol.apc.model.enums.LoanStatus; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.loan.LoanByRenovation; +import com.arrebol.apc.model.loan.LoanByUser; +import com.arrebol.apc.model.loan.LoanDetails; +import com.arrebol.apc.model.loan.LoanFeeNotification; +import com.arrebol.apc.model.views.HistoryLoanView; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class LoanController implements Serializable { + + /** + * + * Searching all loan by status pending. + * + * @param officeId + * @return + */ + public List fillLoanByStatusPendingDatatable(String officeId) { + logger.debug("fillLoanByStatusPendingDatatable"); + List parameters = new ArrayList<>(); + + //parameters.add(new ModelParameter(LoanCfg.FIELD_CUSTOMER_OFFICE, new Office(officeId))); + return genericEntityRepository.xmlQueryAPCEntities(Loan.class, LoanCfg.QUERY_FIND_LOAN_BY_STATUS_PENDING, parameters); + } + + /** + * + * Searching all loan + * + * @return + */ + public List fillAllLoansDatatable() { + logger.debug("fillAllLoansDatatable"); + List parameters = new ArrayList<>(); + return genericEntityRepository.xmlQueryAPCEntities(Loan.class, LoanCfg.QUERY_FIND_ALL_LOANS, parameters); + } + + /** + * + * Searching all loan + * + * @return + */ + public List fillAllLoansViewDatatable() { + logger.debug("fillAllLoansViewDatatable"); + List parameters = new ArrayList<>(); + return genericEntityRepository.xmlQueryAPCEntities(HistoryLoanView.class, LoanCfg.QUERY_FIND_ALL_LOANS_VIEW, parameters); + } + + /** + * + * @param startDate + * @param endDate + * @return + */ + public List fillAllLoansViewDatatable(Date startDate, Date endDate) { + logger.debug("fillAllLoansViewDatatable from start and end date"); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(LoanCfg.PARAM_END_DATE, endDate)); + + return genericEntityRepository.xmlQueryAPCEntities(HistoryLoanView.class, LoanCfg.QUERY_FIND_ALL_LOANS_VIEW_BY_START_AND_END_DATE, parameters); + } catch (Exception e) { + logger.info("fillAllLoansViewDatatable from start and end date", e); + return new ArrayList<>(); + } + } + + /** + * + * @param startDate + * @param endDate + * @return + */ + public List fillAllLoansJuridicalViewDatatable(Date startDate, Date endDate) { + logger.debug("fillAllLoansJuridicalViewDatatable from start and end date"); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(LoanCfg.PARAM_END_DATE, endDate)); + + return genericEntityRepository.xmlQueryAPCEntities(HistoryLoanView.class, LoanCfg.QUERY_FIND_ALL_LOANS_JURIDICAL_VIEW_BY_START_AND_END_DATE, parameters); + } catch (Exception e) { + logger.info("fillAllLoansJuridicalViewDatatable from start and end date", e); + return new ArrayList<>(); + } + } + + /** + * + * Searching loan by id. + * + * @param loanId + * @return + */ + public Loan getLoanById(String loanId) { + logger.debug("getLoanById"); + + return (Loan) genericEntityRepository.selectAPCEntityById(Loan.class, loanId); + } + + /** + * + * @param status + * @param loanIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updateLoanByStatus(LoanStatus status, String loanIdToUpdate, String lastUpdatedBy) { + logger.debug("updateLoanByStatus"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanCfg.FIELD_LOAN_STATUS, status)); + parameters.add(new ModelParameter(LoanCfg.FIELD_AMOUNT_PAID, new BigDecimal(0))); + parameters.add(new ModelParameter(LoanCfg.FIELD_LAST_REFERENCE_NUMBER, 0)); + parameters.add(new ModelParameter(LoanCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(LoanCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(LoanCfg.FIELD_ID, loanIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(LoanCfg.QUERY_UPDATE_LOAN_FROM_RENOVATION, parameters); + } + + /** + * + * @param status + * @param loanIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updateLoanByStatusWeb(LoanStatus status, String loanIdToUpdate, String lastUpdatedBy) { + logger.debug("updateLoanByStatusWeb"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanCfg.FIELD_LOAN_STATUS, status)); + parameters.add(new ModelParameter(LoanCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(LoanCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(LoanCfg.FIELD_ID, loanIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(LoanCfg.QUERY_UPDATE_LOAN_FROM_WEB, parameters); + } + + /** + * + * Searching all loan details by id. + * + * @param loanId + * @return + */ + public List getLoanDetailsbyId(String loanId) { + logger.debug("getLoanDetailsbyId"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanCfg.FIELD_DETAILS_LOAN, new Loan(loanId))); + + return genericEntityRepository.xmlQueryAPCEntities(LoanDetails.class, LoanCfg.QUERY_FIND_LOAN_DETAILS_BY_ID, parameters); + } + + public LoanDetails getLoanDetailbyId(String loanDetailsId) { + logger.debug("getLoanDetailbyId"); + + return (LoanDetails) genericEntityRepository.selectAPCEntityById(LoanDetails.class, loanDetailsId); + } + + public boolean updateAuthorizeLoanDetailById(String loanDetailId) { + logger.debug("updateAuthorizeLoanDetailById"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanDetailsCfg.FIELD_ID, loanDetailId)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(LoanDetailsCfg.UPDATE_AUTHORIZE_LOAN_DETAIL, parameters); + } + + public Long countLoanDetailsAuthorize(String user) { + logger.debug("countLoanDetailsAutorize"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanDetailsCfg.FIELD_USER, user)); + return (Long) genericEntityRepository.xmlQueryAPCEntityUniqueResult(Long.class, LoanDetailsCfg.COUNT_LOAN_DETAILS_AUTHORIZE, parameters); + + } + + public boolean updateRejectLoanDetailById(String loanDetailId) { + logger.debug("updateAuthorizeLoanDetailById"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanDetailsCfg.FIELD_ID, loanDetailId)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(LoanDetailsCfg.UPDATE_REJECT_LOAN_DETAIL, parameters); + } + + public List fillAllTransfersLoanDetails() { + logger.debug("findAllTransfersLoanDetail"); + + return genericEntityRepository.xmlQueryAPCEntities(LoanDetails.class, LoanDetailsCfg.QUERY_FIND_ALL_TRANSFERS_LOAN_DETAIL); + } + + /** + * + * Searching all loan details by id. + * + * @param loanId + * @return + */ + public List getLoanDetailsCurdatebyIdLoan(String loanId) { + logger.debug("getLoanDetailsCurdatebyIdLoan"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanCfg.FIELD_DETAILS_LOAN, new Loan(loanId))); + + return genericEntityRepository.xmlQueryAPCEntities(LoanDetails.class, LoanCfg.QUERY_FIND_LOAN_DETAILS_CURDATE_BY_LOAN, parameters); + } + + /** + * + * @param loan + * @return boolean + */ + public boolean saveLoan(Loan loan) { + logger.debug("saveLoan"); + boolean success = genericEntityRepository.insertAPCEntity(loan); + + return success; + } + + /** + * + * @param loan + * @return boolean + */ + public boolean updateLoan(Loan loan) { + logger.debug("updateLoan"); + boolean success = genericEntityRepository.updateAPCEntity(loan); + + return success; + } + + /** + * + * @param loan + * @return boolean + */ + public boolean updateLoanByUser(LoanByUser loan) { + logger.debug("updateLoanByUser"); + boolean success = genericEntityRepository.updateAPCEntity(loan); + + return success; + } + + /** + * + * @param loan + * @return boolean + */ + public boolean saveLoanNotificationFee(LoanFeeNotification notification) { + logger.debug("saveLoanNotificationFee"); + boolean success = genericEntityRepository.insertAPCEntity(notification); + + return success; + } + + /** + * + * @param loan detail + * @return boolean + */ + public boolean saveLoanDetail(LoanDetails loan) { + logger.debug("saveLoanDetail"); + boolean success = genericEntityRepository.insertAPCEntity(loan); + + return success; + } + + /** + * + * @param loanByUser + * @return boolean + */ + public boolean saveLoanByUser(LoanByUser loanByUser) { + logger.debug("saveLoanByUser"); + boolean success = genericEntityRepository.insertAPCEntity(loanByUser); + + return success; + } + + /** + * + * @param status + * @param loanIdToUpdate + * @return + */ + public boolean updateLoanByUserByStatus(LoanStatus status, Loan loanIdToUpdate) { + logger.debug("updateLoanByUserByStatus"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanByUserCfg.FIELD_LOAN_BY_USER_STATUS, status)); + parameters.add(new ModelParameter(LoanByUserCfg.FIELD_LOAN, loanIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(LoanByUserCfg.QUERY_UPDATE_LOAN_BY_USER_BY_LOAND_ID, parameters); + } + + /** + * + * Searching the loan by renovation by id + * + * @param loanId + * @return + */ + public LoanByRenovation getLoanByRenovationByIdLoanNew(Loan loan) { + logger.debug("getLoanByRenovationByIdLoanNew"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanByRenovationCfg.FIELD_LOAN_NEW, loan)); + + return (LoanByRenovation) genericEntityRepository.xmlQueryAPCEntityUniqueResult(LoanByRenovation.class, LoanByRenovationCfg.QUERY_FIND_LOAN_RENOVATION_BY_NEW_LOAN_ID, parameters); + } + + /** + * + * @param status + * @param loanIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updateLoanByRenovationByStatus(LoanRenovationStatus status, Loan loanIdToUpdate, String lastUpdatedBy) { + logger.debug("updateLoanByRenovationByStatus"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanByRenovationCfg.FIELD_LOAN_RENOVATION_STATUS, status)); + parameters.add(new ModelParameter(LoanByRenovationCfg.FIELD_LOAN_NEW, loanIdToUpdate)); + parameters.add(new ModelParameter(LoanByRenovationCfg.FIELD_COMMENTS, "Se rechazó la renovación")); + parameters.add(new ModelParameter(LoanByRenovationCfg.FIELD_LAST_UPDATED_BY, new User(lastUpdatedBy))); + parameters.add(new ModelParameter(LoanByRenovationCfg.FIELD_LAST_UPDATED_ON, new Date())); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(LoanByRenovationCfg.QUERY_UPDATE_LOAN_RENOVATION_WEB, parameters); + } + + /** + * + * @param userId + * @param loanIdToUpdate + * @return + */ + public boolean updateLoandByUserByUserId(String userId, Loan loanIdToUpdate) { + logger.debug("updateLoandByUserByUserId"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanByUserCfg.FIELD_USER, new User(userId))); + parameters.add(new ModelParameter(LoanByUserCfg.FIELD_LOAN, loanIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(LoanByUserCfg.QUERY_UPDATE_LOAN_BY_USER_BU_USER_ID, parameters); + } + + /** + * + * Searching the loan by user by id + * + * @param loan + * @return + */ + public LoanByUser getLoanByUserByIdLoan(Loan loan) { + logger.debug("getLoanByUserByIdLoan"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanByUserCfg.FIELD_LOAN, loan)); + + return (LoanByUser) genericEntityRepository.xmlQueryAPCEntityUniqueResult(LoanByUser.class, LoanByUserCfg.QUERY_FIND_LOAN_BY_USER_BY_LOAND_ID, parameters); + } + + /** + * + * @param loanByUser + * @return boolean + */ + public boolean deleteLoanByUser(LoanByUser loanByUser) { + logger.debug("deleteLoanByUser"); + boolean success = genericEntityRepository.deleteAPCEntityById(loanByUser); + + return success; + } + + /** + * + * @param loanByUser + * @return boolean + */ + public boolean deleteLoanDetails(LoanDetails loanDetail) { + logger.debug("deleteLoanDetails"); + boolean success = genericEntityRepository.deleteAPCEntityById(loanDetail); + + return success; + } + + /** + * + * @param userId + * @param loanIdToUpdate + * @return + */ + public boolean deleteLoanDetailsByLoanCurdate(Loan loanIdToUpdate) { + logger.debug("updateLoandByUserByUserId"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanCfg.FIELD_DETAILS_LOAN, loanIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(LoanCfg.QUERY_DELETE_LOAN_DETAILS_CURDATE_BY_LOAN, parameters); + } + + /** + * + * @param route + * @param routeIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updateRouteById(RouteCtlg route, String routeIdToUpdate, String lastUpdatedBy) { + logger.debug("updateRouteById"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanCfg.FIELD_ROUTE, route)); + parameters.add(new ModelParameter(LoanCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + // parameters.add(new ModelParameter(LoanCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(LoanCfg.FIELD_ID, routeIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(LoanCfg.QUERY_UPDATE_ROUTE_BY_ID, parameters); + } + + public boolean updatePeopleRoute(RouteCtlg route, People people) { + people.setRouteCtlg(route); + return genericEntityRepository.updateAPCEntity(people); + } + + /** + * + * Searching all loan details by id. + * + * @param loanId + * @return + */ + public List getLoanDetailsFeeCurdatebyIdLoan(String loanId) { + logger.debug("getLoanDetailsFeeCurdatebyIdLoan"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanCfg.FIELD_DETAILS_LOAN, new Loan(loanId))); + + return genericEntityRepository.xmlQueryAPCEntities(LoanDetails.class, LoanCfg.QUERY_FIND_LOAN_DETAILS_FEE_CURDATE_BY_LOAN, parameters); + } + + /** + * + * @param userId + * @param loanIdToUpdate + * @return + */ + public boolean deleteLoanDetailsFeeByLoanCurdate(Loan loanIdToUpdate) { + logger.debug("deleteLoanDetailsFeeByLoanCurdate"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanCfg.FIELD_DETAILS_LOAN, loanIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(LoanCfg.QUERY_DELETE_LOAN_DETAILS_FEE_CURDATE_BY_LOAN, parameters); + } + + /** + * + * @param userId + * @param loanIdToUpdate + * @return + */ + public boolean deleteLoanFeeNotificationByLoanCurdate(Loan loanIdToUpdate) { + logger.debug("deleteLoanFeeNotificationByLoanCurdate"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanCfg.FIELD_DETAILS_LOAN, loanIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(LoanCfg.QUERY_DELETE_LOAN_FEE_NOTIFICATION_CURDATE_BY_LOAN, parameters); + } + + /** + * Borra los registros de LoanFeeNotifications del préstamo que recibe + * + * @param loanIdToUpdate + * @return + */ + public boolean deleteLoanFeeNotificationByLoan(Loan loanIdToUpdate) { + logger.debug("deleteLoanFeeNotification"); + + List parameters = new ArrayList<>(); + parameters.add(new ModelParameter(LoanCfg.FIELD_DETAILS_LOAN, loanIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(LoanCfg.QUERY_DELETE_LOAN_FEE_NOTIFICATION_BY_LOAN, parameters); + } + + /** + * + * @param status + * @param loanIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updateBonusNewCustomer(ActiveStatus status, String loanIdToUpdate, String lastUpdatedBy) { + logger.debug("updateBonusNewCustomer"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanCfg.FIELD_NEW_CUSTOMER, status)); + parameters.add(new ModelParameter(LoanCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(LoanCfg.FIELD_ID, loanIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(LoanCfg.QUERY_UPDATE_LOAN_BONUS_NEW_CUSTOMER, parameters); + } + + final Logger logger = LogManager.getLogger(LoanController.class); + private final GenericEntityRepository genericEntityRepository; + + public LoanController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/LoanEmployeeController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/LoanEmployeeController.java new file mode 100644 index 0000000..bee5571 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/LoanEmployeeController.java @@ -0,0 +1,180 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.LoanEmployee; +import com.arrebol.apc.model.admin.LoanEmployeeDetails; +import com.arrebol.apc.model.admin.constance.ExpenseCompanyCfg; +import com.arrebol.apc.model.admin.constance.GoalCfg; +import com.arrebol.apc.model.views.LoanEmployeeView; +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.views.LoanEmployeeAllDataView; +import com.arrebol.apc.model.views.LoanEmployeeDetailAllDataView; +import com.arrebol.apc.model.views.StatsEmployeeSavingView; +import com.arrebol.apc.model.views.constance.LoanEmployeeDetailAllDataViewCfg; +import com.arrebol.apc.model.views.constance.LoanEmployeeViewCfg; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import com.arrebol.apc.model.views.constance.LoanEmployeeAllDataCfg; +import com.arrebol.apc.model.views.constance.StatsEmployeeSavingViewCfg; +import java.math.BigDecimal; + +/** + * + * @author David Rodriguez + */ +public class LoanEmployeeController implements Serializable { + + public List fillLoanEmployeeDataTable(Date startDate, Date endDate) { + logger.debug("fillLoanEmployeeDataTable"); + List parameters = new ArrayList<>(); + +// parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); +// parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(LoanEmployeeView.class, LoanEmployeeViewCfg.QUERY_FIND_ALL_LOAN_EMPLOYEE_HIST, parameters); + return dataComplete; + } + + public BigDecimal fillTotalAmountLoan(Date startDate, Date endDate) { + logger.debug("fillTotalAmountLoan"); + List parameters = new ArrayList<>(); + +// parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); +// parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(LoanEmployeeView.class, LoanEmployeeViewCfg.QUERY_FIND_ALL_LOAN_EMPLOYEE_HIST, parameters); + BigDecimal totalAmountLoan = BigDecimal.ZERO; + for (LoanEmployeeView employee : dataComplete) { + totalAmountLoan = totalAmountLoan.add(employee.getAmountLoan()); + } + return totalAmountLoan; + } + + public List getLoanEmployeeDetailByIdLoan(String idLoanEmployee) { + + logger.debug("getLoanEmployeeDetailByIdLoan"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanEmployeeDetailAllDataViewCfg.FIELD_ID_LOAN, idLoanEmployee)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(LoanEmployeeDetailAllDataView.class, + LoanEmployeeDetailAllDataViewCfg.QUERY_FIND_ALL_LOAN_EMPLOYEE_DETAIL_BY_ID_LOAN, parameters); + + return dataComplete; + } + + public LoanEmployee getLoanEmployeeById(String idLoanEmployee) { + + logger.debug("getLoanEmployeeById"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanEmployeeAllDataCfg.FIELD_ID_LOAN, idLoanEmployee)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(LoanEmployee.class, + LoanEmployeeAllDataCfg.QUERY_FIND_ALL_LOAN_EMPLOYEE_BY_ID, parameters); + + return dataComplete.get(0); + } + + public boolean saveLoanEmployee(LoanEmployee loan, HumanResource hr) { + logger.debug("saveLoanEmployee"); + boolean success = genericEntityRepository.insertAPCEntity(loan); + + if (hr != null) { + genericEntityRepository.updateAPCEntity(hr); + } + return success; + } + + public boolean saveLoanEmployeeDetail(LoanEmployeeDetails loanDetail, HumanResource hr, LoanEmployee loanEmployee) { + logger.debug("saveLoanEmployeeDetail"); + boolean success = genericEntityRepository.insertAPCEntity(loanDetail); + + if (hr != null) { + genericEntityRepository.updateAPCEntity(hr); + } + + if (loanEmployee != null) { + genericEntityRepository.updateAPCEntity(loanEmployee); + } + + return success; + } + + /** + * + * @param status + * @param expenseCompanyIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updateLoanEmployeeByStatus(ActiveStatus status, String expenseCompanyIdToUpdate, String lastUpdatedBy) { + logger.debug("updateLoanEmployeeByStatus"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanEmployeeAllDataCfg.FIELD_ACTIVE_STATUS, status)); + parameters.add(new ModelParameter(ExpenseCompanyCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(ExpenseCompanyCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(LoanEmployeeAllDataCfg.FIELD_ID, expenseCompanyIdToUpdate)); + + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(LoanEmployeeAllDataCfg.QUERY_UPDATE_LOAN_EMPLOYEE_BY_STATUS, parameters); + } + + /** + * + * @param status + * @param expenseCompanyIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updateLoanEmployeeDetailByStatus(String idUser, Date createdOn) { + logger.debug("updateLoanEmployeeDetailByStatus"); + + List parameters = new ArrayList<>(); + + + parameters.add(new ModelParameter(LoanEmployeeDetailAllDataViewCfg.FIELD_ID_USER, idUser )); + parameters.add(new ModelParameter(LoanEmployeeDetailAllDataViewCfg.FIELD_CREATED_ON, createdOn)); + + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(LoanEmployeeDetailAllDataViewCfg.QUERY_UPDATE_LOAN_EMPLOYEE_DETAIL_BY_STATUS, parameters); + } + + + public List findLoanDetailToUpdate(String idUser, Date createdOn) { + logger.debug("updateLoanEmployeeDetailByStatus"); + + List parameters = new ArrayList<>(); + + + parameters.add(new ModelParameter(LoanEmployeeDetailAllDataViewCfg.FIELD_ID_USER, idUser )); + parameters.add(new ModelParameter(LoanEmployeeDetailAllDataViewCfg.FIELD_CREATED_ON, createdOn)); + + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(LoanEmployeeDetails.class, LoanEmployeeDetailAllDataViewCfg.QUERY_FIND_LOAN_DETAL_TO_UPDATE, parameters); + return dataComplete; + } + + + public boolean updateLoanEmployee(LoanEmployee loanEmployee) { + logger.debug("savePayroll"); + boolean success = genericEntityRepository.updateAPCEntity(loanEmployee); + + return success; + } + + final Logger logger = LogManager.getLogger(LoanEmployeeController.class); + private final GenericEntityRepository genericEntityRepository; + + public LoanEmployeeController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/LoanRenovationDeliveryWeeklyController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/LoanRenovationDeliveryWeeklyController.java new file mode 100644 index 0000000..1269b92 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/LoanRenovationDeliveryWeeklyController.java @@ -0,0 +1,61 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.AdvanceCfg; +import com.arrebol.apc.model.admin.constance.BonusCfg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.views.LoanRenovationDeliveryWeeklyView; +import com.arrebol.apc.model.views.constance.LoanRenovationDeliveryWeeklyViewCfg; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class LoanRenovationDeliveryWeeklyController implements Serializable { + + public List fillLoanRenovationDatatable() { + logger.debug("fillLoanRenovationDatatable"); + + return genericEntityRepository.xmlQueryAPCEntities(LoanRenovationDeliveryWeeklyView.class,LoanRenovationDeliveryWeeklyViewCfg.QUERY_FIND_LOAN_RENOVATION_DELIVERY_WEEKLY); + } + + public Long getTotalRenovation(String renovation) { + logger.debug("getTotalRenovation"); + List parameters = new ArrayList<>(); + parameters.add(new ModelParameter(LoanRenovationDeliveryWeeklyViewCfg.FIELD_RENOVATION, renovation)); + + return (Long) genericEntityRepository.xmlQueryAPCEntityUniqueResult(Long.class,LoanRenovationDeliveryWeeklyViewCfg.QUERY_FIND_LOAN_RENOVATION_TOTAL_RENOVATION,parameters); + } + + public BigDecimal getTotalRenovationAmount(String renovation) { + logger.debug("getTotalRenovation"); + List parameters = new ArrayList<>(); + parameters.add(new ModelParameter(LoanRenovationDeliveryWeeklyViewCfg.FIELD_RENOVATION, renovation)); + + return (BigDecimal) genericEntityRepository.xmlQueryAPCEntityUniqueResult(BigDecimal.class,LoanRenovationDeliveryWeeklyViewCfg.QUERY_FIND_LOAN_RENOVATION_TOTAL_RENOVATION_AMOUNT,parameters); + } + + final Logger logger = LogManager.getLogger(LoanRenovationDeliveryWeeklyController.class); + private final GenericEntityRepository genericEntityRepository; + + public LoanRenovationDeliveryWeeklyController() { + this.genericEntityRepository = new GenericEntityRepository(); + } + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/MoneyDailyController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/MoneyDailyController.java new file mode 100644 index 0000000..6cfc00f --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/MoneyDailyController.java @@ -0,0 +1,124 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.MoneyDaily; +import com.arrebol.apc.model.admin.constance.MoneyDailyCfg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.views.MoneyDailyByUserCertifier; +import com.arrebol.apc.model.views.constance.MoneyDailyByUserCertifierViewCfg; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class MoneyDailyController implements Serializable { + + /** + * + * Searching all money daily by office. + * + * @param officeId + * @param startDate + * @param endDate + * @param idUser + * @return + */ + public List fillMoneyDailyDatatable(String officeId, Date startDate, Date endDate, String idUser) { + logger.debug("fillMoneyDailyDatatable"); + List dataComplete = new ArrayList<>(); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(MoneyDailyCfg.FIELD_OFFICE, new Office(officeId))); + parameters.add(new ModelParameter(MoneyDailyCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(MoneyDailyCfg.PARAM_END_DATE, endDate)); + + if (idUser != null && !idUser.equals("")) { + parameters.add(new ModelParameter(MoneyDailyCfg.FIELD_USER, new User(idUser))); + dataComplete = genericEntityRepository.xmlQueryAPCEntities(MoneyDaily.class, MoneyDailyCfg.QUERY_FIND_ALL_MONEY_DAILY_BY_OFFICE_BETWEEN_DATES_USER, parameters); + }else{ + dataComplete = genericEntityRepository.xmlQueryAPCEntities(MoneyDaily.class, MoneyDailyCfg.QUERY_FIND_ALL_MONEY_DAILY_BY_OFFICE_BETWEEN_DATES, parameters); + } + + return dataComplete; + } + + /** + * + * @param money + * @return boolean + */ + public boolean saveMoneyDaily(MoneyDaily money) { + logger.debug("saveMoneyDaily"); + boolean success = genericEntityRepository.insertAPCEntity(money); + + return success; + } + + /** + * + * @param money + * @return boolean + */ + public boolean deleteMoneyDaily(MoneyDaily money) { + logger.debug("deleteMoneyDaily"); + boolean success = genericEntityRepository.deleteAPCEntityById(money); + + return success; + } + + public List findAllAmountByUserCertifierView(String officeId) { + logger.debug("findAllAmountByUserCertifierView"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(MoneyDailyByUserCertifierViewCfg.FIELD_VIEW_OFFICE, officeId)); + + return genericEntityRepository.xmlQueryAPCEntities(MoneyDailyByUserCertifier.class, MoneyDailyByUserCertifierViewCfg.QUERY_FIND_ALL_MONEY_DAILY_BY_CERTIFIER_BY_OFFICE, parameters); + } + + /** + * + * Searching money daily by id. + * + * @param moneyDailyId + * @return + */ + public MoneyDaily getMoneyDailyById(String moneyDailyId) { + logger.debug("getMoneyDailyById"); + + return (MoneyDaily) genericEntityRepository.selectAPCEntityById(MoneyDaily.class, moneyDailyId); + } + + final Logger logger = LogManager.getLogger(MoneyDailyController.class); + private final GenericEntityRepository genericEntityRepository; + + public MoneyDailyController() { + this.genericEntityRepository = new GenericEntityRepository(); + } + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/OtherExpenseController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/OtherExpenseController.java new file mode 100644 index 0000000..7a9f92b --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/OtherExpenseController.java @@ -0,0 +1,99 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.OtherExpense; +import com.arrebol.apc.model.admin.constance.OtherExpenseCfg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class OtherExpenseController implements Serializable { + + /** + * + * Searching all other expenses by office. + * + * @param officeId + * @param startDate + * @param endDate + * @param idUser + * @return + */ + public List fillOtherExpenseDatatable(String officeId, Date startDate, Date endDate, String idUser) { + logger.debug("fillOtherExpenseDatatable"); + List dataComplete = new ArrayList<>(); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(OtherExpenseCfg.FIELD_OFFICE, new Office(officeId))); + parameters.add(new ModelParameter(OtherExpenseCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(OtherExpenseCfg.PARAM_END_DATE, endDate)); + if (idUser != null && !idUser.equals("")) { + parameters.add(new ModelParameter(OtherExpenseCfg.FIELD_USER, new User(idUser))); + dataComplete = genericEntityRepository.xmlQueryAPCEntities(OtherExpense.class, OtherExpenseCfg.QUERY_FIND_ALL_OTHER_EXPENSE_BY_OFFICE_BETWEEN_DATES_USER, parameters); + } else { + dataComplete = genericEntityRepository.xmlQueryAPCEntities(OtherExpense.class, OtherExpenseCfg.QUERY_FIND_ALL_OTHER_EXPENSE_BY_OFFICE_BETWEEN_DATES, parameters); + } + + return dataComplete; + } + + /** + * + * @param otherExpense + * @return boolean + */ + public boolean saveOtherExpense(OtherExpense otherExpense) { + logger.debug("saveOtherExpense"); + boolean success = genericEntityRepository.insertAPCEntity(otherExpense); + + return success; + } + + /** + * + * @param otherExpense + * @return boolean + */ + public boolean deleteOtherExpense(OtherExpense otherExpense) { + logger.debug("deleteOtherExpense"); + boolean success = genericEntityRepository.deleteAPCEntityById(otherExpense); + + return success; + } + + final Logger logger = LogManager.getLogger(OtherExpenseController.class); + private final GenericEntityRepository genericEntityRepository; + + public OtherExpenseController() { + this.genericEntityRepository = new GenericEntityRepository(); + } + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/PayRollController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/PayRollController.java new file mode 100644 index 0000000..0c767d1 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/PayRollController.java @@ -0,0 +1,343 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.EmployeeSaving; +import com.arrebol.apc.model.admin.Goal; +import com.arrebol.apc.model.admin.LoanEmployee; +import com.arrebol.apc.model.admin.LoanEmployeeDetails; +import com.arrebol.apc.model.admin.StableGeneralBox; +import com.arrebol.apc.model.admin.constance.StableGeneralBoxCfg; +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.payroll.Payroll; +import com.arrebol.apc.model.payroll.constance.PayRollCfg; +import com.arrebol.apc.model.views.LoanEmployeeView; +import com.arrebol.apc.model.views.constance.LoanEmployeeAllDataCfg; +import com.arrebol.apc.model.views.constance.LoanEmployeeViewCfg; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class PayRollController implements Serializable { + + /** + * + * Searching all stable general box by office. + * + * @param officeId + * @param startDate + * @param endDate + * @return + */ + public List fillPayrollDatatable(String officeId, Date startDate, Date endDate) { + logger.debug("fillPayrollDatatable"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PayRollCfg.FIELD_OFFICE, new Office(officeId))); + //parameters.add(new ModelParameter(PayRollCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + parameters.add(new ModelParameter(PayRollCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(PayRollCfg.PARAM_END_DATE, endDate)); + + return genericEntityRepository.xmlQueryAPCEntities(Payroll.class, PayRollCfg.QUERY_FIND_PAYROLL_BY_OFFICE_BETWEEN_DATES, parameters); + } + + public boolean updatePayrollByStatus(ActiveStatus status, String payrollIdToUpdate, String lastUpdatedBy) { + logger.debug("updatePayrollByStatus"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PayRollCfg.FIELD_ACTIVE_STATUS, status)); + parameters.add(new ModelParameter(PayRollCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(PayRollCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(PayRollCfg.FIELD_ID, payrollIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(PayRollCfg.QUERY_UPDATE_PAYROLL_BY_STATUS, parameters); + } + + public List getStableGeneralBoxByDate(String officeId, Date startDate, Date endDate) { + logger.debug("fillStableGeneralBoxDatatable"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(StableGeneralBoxCfg.FIELD_OFFICE, new Office(officeId))); + parameters.add(new ModelParameter(StableGeneralBoxCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(StableGeneralBoxCfg.PARAM_END_DATE, endDate)); + + return genericEntityRepository.xmlQueryAPCEntities(StableGeneralBox.class, StableGeneralBoxCfg.QUERY_FIND_ALL_STABLE_GENERAL_BOX_BY_OFFICE_BETWEEN_DATES, parameters); + } + + /** + * + * Searching user by id. + * + * @param userId + * @return + */ + public User getUserById(String userId) { + logger.debug("getUserById"); + + return (User) genericEntityRepository.selectAPCEntityById(User.class, userId); + } + + /** + * + * Searching the advance sum by user + * + * @param humanResourceId + * @param officeId + * @param dateInit + * @param dateEnd + * @return + */ + public BigDecimal getSumAdvanceByUser(String humanResourceId, String officeId, Date dateInit, Date dateEnd) { + logger.debug("getSumAdvanceByUser"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PayRollCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + parameters.add(new ModelParameter(PayRollCfg.FIELD_OFFICE, new Office(officeId))); + parameters.add(new ModelParameter(PayRollCfg.FIELD_HUMAN_RESOURCE, new HumanResource(humanResourceId))); + parameters.add(new ModelParameter(PayRollCfg.FIELD_DATE_INIT, dateInit)); + parameters.add(new ModelParameter(PayRollCfg.FIELD_DATE_END, dateEnd)); + + return (BigDecimal) genericEntityRepository.xmlQueryAPCEntityUniqueResult(BigDecimal.class, PayRollCfg.QUERY_SUM_ALL_ADVANCE_BY_USER, parameters); + } + + /** + * + * Searching the count for new customer by loan by user + * + * @param userId + * @param dateInit + * @param dateEnd + * @return + */ + public List getTotalNewCustomerLoansByUser(String userId, Date dateInit, Date dateEnd) { + logger.debug("getTotalNewCustomerLoansByUser"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PayRollCfg.FIELD_USER, userId)); + parameters.add(new ModelParameter(PayRollCfg.FIELD_DATE_INIT, dateInit)); + parameters.add(new ModelParameter(PayRollCfg.FIELD_DATE_END, dateEnd)); + + return genericEntityRepository.xmlQueryAPCEntities(Loan.class, PayRollCfg.QUERY_COUNT_NEW_CUSTOMER_FOR_LOANS_BY_USER, parameters); + } + + /** + * + * Searching the sum amount by loan by user + * + * @param userId + * @param dateInit + * @param dateEnd + * @return + */ + public BigDecimal getTotalLoansByUserForDates(String userId, Date dateInit, Date dateEnd) { + logger.debug("getTotalLoansByUserForDates"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PayRollCfg.FIELD_USER, userId)); + parameters.add(new ModelParameter(PayRollCfg.FIELD_DATE_INIT, dateInit)); + parameters.add(new ModelParameter(PayRollCfg.FIELD_DATE_END, dateEnd)); + + return (BigDecimal) genericEntityRepository.xmlQueryAPCEntityUniqueResult(BigDecimal.class, PayRollCfg.QUERY_SUM_FOR_LOANS_BY_USER, parameters); + } + + /** + * + * Searching the goal by dates + * + * @param officeId + * @param dateInit + * @param dateEnd + * @return + */ + public Goal getGoalByDates(String officeId, Date dateInit, Date dateEnd) { + logger.debug("getGoalByDates"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PayRollCfg.FIELD_OFFICE, new Office(officeId))); + parameters.add(new ModelParameter(PayRollCfg.FIELD_DATE_INIT, dateInit)); + parameters.add(new ModelParameter(PayRollCfg.FIELD_DATE_END, dateEnd)); + + return (Goal) genericEntityRepository.xmlQueryAPCEntityUniqueResult(Goal.class, PayRollCfg.QUERY_FIND_GOAL_BY_DATES, parameters); + } + + public Goal getLastGoal(String officeId) { + logger.debug("getLastGoal"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PayRollCfg.FIELD_OFFICE, new Office(officeId))); + + return (Goal) genericEntityRepository.xmlQueryAPCEntityUniqueResult(Goal.class, PayRollCfg.QUERY_FIND_LAST_GOAL, parameters); + } + + public List getPaymentToDebtByUser(String userId) { + + logger.debug("fillLoanEmployeeDataTable"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanEmployeeViewCfg.FIEL_LOAN_EMPLOYEE_USERID, userId)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(LoanEmployeeView.class, LoanEmployeeViewCfg.QUERY_FIND_ALL_LOAN_EMPLOYEE_BY_ID, parameters); + return dataComplete; + } + + public LoanEmployee getLoanEmployeeById(String idLoanEmployee) { + + logger.debug("getLoanEmployeeById"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanEmployeeAllDataCfg.FIELD_ID_LOAN, idLoanEmployee)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(LoanEmployee.class, + LoanEmployeeAllDataCfg.QUERY_FIND_ALL_LOAN_EMPLOYEE_BY_ID, parameters); + + return dataComplete.get(0); + } + + public boolean saveLoanEmployeeDetail(LoanEmployeeDetails loanDetail, HumanResource hr, LoanEmployee loanEmployee) { + logger.debug("saveLoanEmployeeDetail"); + boolean success = genericEntityRepository.insertAPCEntity(loanDetail); + + if (hr != null) { + genericEntityRepository.updateAPCEntity(hr); + } + + if (loanEmployee != null) { + genericEntityRepository.updateAPCEntity(loanEmployee); + } + + return success; + } + + public boolean saveEmployeeSaving(EmployeeSaving employeeSaving, HumanResource hr) { + logger.debug("saveEmployeeSaving"); + boolean success = genericEntityRepository.insertAPCEntity(employeeSaving); + + if (hr != null) { + genericEntityRepository.updateAPCEntity(hr); + } + + return success; + } + + /** + * + * Searching the sum of loan details for type Payment by user + * + * @param userId + * @param dateInit + * @param dateEnd + * @return + */ + public BigDecimal getLoanDetailsByUserForDates(String userId, Date dateInit, Date dateEnd) { + logger.debug("getLoanDetailsByUserForDates"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PayRollCfg.FIELD_USER, new User(userId))); + parameters.add(new ModelParameter(PayRollCfg.FIELD_DATE_INIT, dateInit)); + parameters.add(new ModelParameter(PayRollCfg.FIELD_DATE_END, dateEnd)); + + return (BigDecimal) genericEntityRepository.xmlQueryAPCEntityUniqueResult(BigDecimal.class, PayRollCfg.QUERY_SUM_LOAN_DETAILS_PAYMENT_BY_USER, parameters); + } + + /** + * + * Searching the sum of loan details for type Payment by user + * + * @param userId + * @param dateInit + * @param dateEnd + * @return + */ + public BigDecimal getFeeByUserForDates(String userId, Date dateInit, Date dateEnd) { + logger.debug("getFeeByUserForDates"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PayRollCfg.FIELD_USER_ID, userId)); + + return (BigDecimal) genericEntityRepository.xmlQueryAPCEntityUniqueResult(BigDecimal.class, PayRollCfg.QUERY_SUM_DIFERENCES_BY_USER, parameters); + } + + /** + * + * Searching the sum of loan details for type Payment by user + * + * @param userId + * @param dateInit + * @param dateEnd + * @return + */ + public BigDecimal getDiscountByUserThisWeek(String userId) { + logger.debug("getDiscountByUserThisWeek"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PayRollCfg.FIELD_USER, new User(userId))); + + return (BigDecimal) genericEntityRepository.xmlQueryAPCEntityUniqueResult(BigDecimal.class, PayRollCfg.QUERY_SUM_DIFERENCES_BETWEEN_CLOSING_DAY_BY_USER, parameters); + } + + /** + * + * Searching the sum of loan details for type Payment by user + * + * @param userId + * @param dateInit + * @param dateEnd + * @return + */ + public Long getTotalOpeningFeeByUser(String userId, Date dateInit, Date dateEnd) { + logger.debug("getDiscountByUserThisWeek"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PayRollCfg.FIELD_USER, new User(userId))); + parameters.add(new ModelParameter(PayRollCfg.FIELD_DATE_INIT, dateInit)); + parameters.add(new ModelParameter(PayRollCfg.FIELD_DATE_END, dateEnd)); + + return (Long) genericEntityRepository.xmlQueryAPCEntityUniqueResult(Long.class, PayRollCfg.QUERY_SUM_OPENING_FEE_BY_USER, parameters); + } + + public BigDecimal getTotalExpectedWeekByUser(String userId) { + logger.debug("getTotalExpectedWeekByUser"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PayRollCfg.FIELD_USER, new User(userId))); + + return (BigDecimal) genericEntityRepository.xmlQueryAPCEntityUniqueResult(BigDecimal.class, PayRollCfg.QUERY_SUM_TOTAL_EXPECTED_FOR_WEEK_BY_USER, parameters); + } + + /** + * + * @param payroll + * @return boolean + */ + public boolean savePayroll(Payroll payroll) { + logger.debug("savePayroll"); + boolean success = genericEntityRepository.insertAPCEntity(payroll); + + return success; + } + + final Logger logger = LogManager.getLogger(PayRollController.class); + private final GenericEntityRepository genericEntityRepository; + + public PayRollController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/PeopleController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/PeopleController.java new file mode 100644 index 0000000..b3c040c --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/PeopleController.java @@ -0,0 +1,133 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.catalog.constance.PeopleCfg; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.PeopleType; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class PeopleController implements Serializable{ + + final Logger logger = LogManager.getLogger(PeopleController.class); + private final GenericEntityRepository genericEntityRepository; + + /** + * + * @param people + * @return boolean + */ + public boolean savePeople(People people) { + logger.debug("savePeopleController"); + boolean success = genericEntityRepository.insertAPCEntity(people); + + return success; + } + + /** + * + * @param people + * @return boolean + */ + public boolean updateByPeopleId(People people) { + logger.debug("updateByPeopleId"); + + return genericEntityRepository.updateAPCEntity(people); + } + + /** + * + * @param status + * @param peopleIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updatePeopleByStatus(ActiveStatus status, String peopleIdToUpdate, String lastUpdatedBy) { + logger.debug("updatePeopleByStatus"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PeopleCfg.FIELD_ACTIVE_STATUS, status)); + parameters.add(new ModelParameter(PeopleCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(PeopleCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(PeopleCfg.FIELD_ID, peopleIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(PeopleCfg.UPDATE_PEOPLE_BY_STATUS, parameters); + } + + /** + * + * @param type + * @param peopleIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updatePeopleTypeById(PeopleType type, String peopleIdToUpdate, String lastUpdatedBy) { + logger.debug("updatePeopleTypeById"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PeopleCfg.FIELD_PEOPLE_TYPE, type)); + parameters.add(new ModelParameter(PeopleCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(PeopleCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(PeopleCfg.FIELD_ID, peopleIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(PeopleCfg.UPDATE_PEOPLE_TYPE_BY_STATUS, parameters); + } + + /** + * + * Searching people. + * + * @param peopleId + * @return + */ + public People findPeopleById(String peopleId) { + logger.debug("findPeopleById"); + + return (People) genericEntityRepository.selectAPCEntityById(People.class, peopleId); + } + + /** + * + * @param type + * @param peopleIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updateRouteById(RouteCtlg route, String peopleIdToUpdate, String lastUpdatedBy) { + logger.debug("updateRouteById"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PeopleCfg.FIELD_ROUTE, route)); + parameters.add(new ModelParameter(PeopleCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(PeopleCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(PeopleCfg.FIELD_ID, peopleIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(PeopleCfg.UPDATE_ROUTE_BY_PEOPLE, parameters); + } + + public PeopleController() { + this.genericEntityRepository = new GenericEntityRepository(); + } + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StableGeneralBoxController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StableGeneralBoxController.java new file mode 100644 index 0000000..c853ae7 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StableGeneralBoxController.java @@ -0,0 +1,364 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.controller.util.ConnectionManager; +import com.arrebol.apc.controller.util.HibernateUtil; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.ExpenseCompany; +import com.arrebol.apc.model.admin.StableGeneralBox; +import com.arrebol.apc.model.admin.constance.StableGeneralBoxCfg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.views.GeneralBoxView; +import com.arrebol.apc.model.views.ResumenTotalWeekView; +import com.arrebol.apc.model.views.constance.GeneralBoxViewCfg; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.math.BigDecimal; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.Transaction; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class StableGeneralBoxController extends ConnectionManager implements Serializable { + + /** + * + * Searching all stable general box by office. + * + * @param officeId + * @param startDate + * @param endDate + * @return + */ + public List fillStableGeneralBoxDatatable(String officeId, Date startDate, Date endDate) { + logger.debug("fillStableGeneralBoxDatatable"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(StableGeneralBoxCfg.FIELD_OFFICE, new Office(officeId))); + //parameters.add(new ModelParameter(StableGeneralBoxCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + parameters.add(new ModelParameter(StableGeneralBoxCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(StableGeneralBoxCfg.PARAM_END_DATE, endDate)); + + return genericEntityRepository.xmlQueryAPCEntities(StableGeneralBox.class, StableGeneralBoxCfg.QUERY_FIND_ALL_STABLE_GENERAL_BOX_BY_OFFICE_BETWEEN_DATES, parameters); + } + + /** + * + * @param status + * @param stableGeneralBoxIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updateStableGeneralBoxByStatus(ActiveStatus status, String stableGeneralBoxIdToUpdate, String lastUpdatedBy) { + logger.debug("updateStableGeneralBoxByStatus"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(StableGeneralBoxCfg.FIELD_ACTIVE_STATUS, status)); + parameters.add(new ModelParameter(StableGeneralBoxCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(StableGeneralBoxCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(StableGeneralBoxCfg.FIELD_ID, stableGeneralBoxIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(StableGeneralBoxCfg.QUERY_UPDATE_STABLE_GENERAL_BOX_BY_STATUS, parameters); + } + + /** + * + * @param stableGeneralBox + * @return boolean + */ + public boolean saveStableGeneralBox(StableGeneralBox stableGeneralBox) { + logger.debug("saveStableGeneralBox"); + boolean success = genericEntityRepository.insertAPCEntity(stableGeneralBox); + + return success; + } + + public boolean autoSaveEntry(ExpenseCompany expense){ + logger.debug("autoSaveEntry"); + boolean success = genericEntityRepository.insertAPCEntity(expense); + + return success; + } + + /** + * + * Searching all details by general box by office. + * + * @param officeId + * @return + */ + public List findAllGeneralBox(String officeId) { + logger.debug("findAllGeneralBox"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(GeneralBoxViewCfg.FIELD_OFFICE, officeId)); + + return genericEntityRepository.xmlQueryAPCEntities(GeneralBoxView.class, GeneralBoxViewCfg.QUERY_FIND_ALL_DETAILS, parameters); + } + + /** + * + * Searching the stable general box by date and office + * + * @param createdOn + * @param officeid + * @return + */ + public Long getCountStableGeneralBoxByOfficeAndDate(Date createdOn, String officeid) { + logger.debug("getClosingDayCurdateByUserId"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(StableGeneralBoxCfg.FIELD_CREATEDON, createdOn)); + parameters.add(new ModelParameter(StableGeneralBoxCfg.FIELD_OFFICE, new Office(officeid))); + + return (Long) genericEntityRepository.xmlQueryAPCEntityUniqueResult(Long.class, StableGeneralBoxCfg.QUERY_COUNT_STABLE_GENERAL_BOX_BY_OFFICE_AND_DATE, parameters); + } + + /** + * + * Searching the stable small box by date and office + * + * @param officeid + * @return + */ + public BigDecimal getPendingByClosingDay(String officeid) { + logger.debug("getPendingByClosingDay"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(StableGeneralBoxCfg.FIELD_OFFICE_VIEW, officeid)); + + return (BigDecimal) genericEntityRepository.xmlQueryAPCEntityUniqueResult(BigDecimal.class, StableGeneralBoxCfg.QUERY_SUM_PENDING_CLOSING_BY_OFFICE, parameters); + } + + /** + * + * @param date + * @return + */ + public boolean existNextPaidStableGeneralBoxByCreatedOn(Date date) { + logger.info("existNextPaidStableGeneralBoxByCreatedOn"); + + String query = "SELECT sgb.id " + + "FROM APC_STABLE_GENERAL_BOX sgb " + + "WHERE DATE(sgb.created_on) >= DATE_ADD(DATE(:date), INTERVAL 1 DAY) " + + "AND sgb.active_status = 'ENEBLED'"; + + return genericEntityRepository.existRecordsUsingSQLQueryFindByCreatedOnField(date, query); + } + + public BigDecimal getTotalBox() { + logger.info("getTotalBox"); + BigDecimal totalBox = BigDecimal.ZERO; + Transaction transaction = null; + + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + List rows = session.createNativeQuery(queryTotalBox).getResultList(); + + transaction.commit(); + + if (rows != null) { + totalBox = (BigDecimal) rows.get(0); +// Object[] results = (Object[]) rows.get(0); +// totalBox = new BigDecimal(results[0] == null ? "0.0" : results[11].toString()); + } else { + totalBox = BigDecimal.ZERO; + } + + } catch (HibernateException e) { + logger.error("General Box - getTotalBox( )", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method getTotalBox( ) ", e); + rollback(transaction); + } + + return totalBox; + } + + final Logger logger = LogManager.getLogger(StableGeneralBoxController.class); + private final GenericEntityRepository genericEntityRepository; + + public StableGeneralBoxController() { + this.genericEntityRepository = new GenericEntityRepository(); + } + + public List getDataReport(Date fecha) { + DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd"); + String dateFormat = formatter.format(fecha); + + String queryReport = generalBoxReport; + queryReport = queryReport.replace(":dateReport", dateFormat); + List rows = new ArrayList<>(); + Transaction transaction = null; + + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + //rows = session.createNativeQuery(queryReport).setParameter("dateReport", dateFormat).getResultList(); + rows = session.createNativeQuery(queryReport).getResultList(); + + transaction.commit(); + + } catch (HibernateException e) { + logger.error("Driver", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method getDataReport(" + fecha + " " + ") ", e); + rollback(transaction); + } + + return rows; + } + + String queryTotalBox + = "SELECT \n" + + "( \n" + + " (CASE \n" + + " WHEN \n" + + " (SELECT COUNT(total_general_box) AS total_in_box FROM APC_STABLE_GENERAL_BOX WHERE DATE(created_on) < CURDATE() AND active_status = 'ENEBLED' ORDER BY created_on DESC LIMIT 1) > 0 \n" + + " THEN \n" + + " (SELECT IF(ISNULL(total_general_box),0,total_general_box) AS total_in_box FROM APC_STABLE_GENERAL_BOX WHERE DATE(created_on) < CURDATE() AND active_status = 'ENEBLED' ORDER BY created_on DESC LIMIT 1) \n" + + " ELSE 0 \n" + + " END) \n" + // + " -- Entradas\n" + + " + (SELECT IF(ISNULL(SUM(amount)),0,SUM(amount)) AS total_payment_in_today FROM APC_EXPENSE_COMPANY WHERE expense_company_type = 'PAYMENT_IN' AND DATE(created_on) > (SELECT DATE(sgb.created_on) FROM APC_STABLE_GENERAL_BOX sgb WHERE DATE(sgb.created_on) < CURDATE() AND sgb.active_status = 'ENEBLED' ORDER BY sgb.created_on DESC LIMIT 1) AND active_status = 'ENEBLED') \n" + // + " -- Salidas\n" + + " - (SELECT IF(ISNULL(SUM(amount)),0,SUM(amount)) AS total_payment_out_today FROM APC_EXPENSE_COMPANY WHERE expense_company_type = 'PAYMENT_OUT' AND DATE(created_on) > (SELECT DATE(sgb.created_on) FROM APC_STABLE_GENERAL_BOX sgb WHERE DATE(sgb.created_on) < CURDATE() AND sgb.active_status = 'ENEBLED' ORDER BY sgb.created_on DESC LIMIT 1) AND active_status = 'ENEBLED') \n" + // + " -- Inicios\n" + + " - (SELECT IF(ISNULL(SUM(amount)),0,SUM(amount)) AS payment FROM APC_MONEY_DAILY WHERE DATE(created_on) > (SELECT DATE(sgb.created_on) FROM APC_STABLE_GENERAL_BOX sgb WHERE DATE(sgb.created_on) < CURDATE() AND sgb.active_status = 'ENEBLED' ORDER BY sgb.created_on DESC LIMIT 1)) \n" + // + " -- Adelantos\n" + + " - (SELECT IF(ISNULL(SUM(amount)),0,SUM(amount)) AS total_advances_today FROM APC_ADVANCE WHERE DATE(created_on) > (SELECT DATE(sgb.created_on) FROM APC_STABLE_GENERAL_BOX sgb WHERE DATE(sgb.created_on) < CURDATE() AND sgb.active_status = 'ENEBLED' ORDER BY sgb.created_on DESC LIMIT 1) AND active_status = 'ENEBLED') \n" + // + " -- Nóminas\n" + + " - (SELECT IF(ISNULL(SUM(total_payment)),0,SUM(total_payment)) AS total_payroll_today FROM APC_PAYROLL WHERE DATE(created_on) > (SELECT DATE(sgb.created_on) FROM APC_STABLE_GENERAL_BOX sgb WHERE DATE(sgb.created_on) < CURDATE() AND sgb.active_status = 'ENEBLED' ORDER BY sgb.created_on DESC LIMIT 1) AND active_status = 'ENEBLED') \n" + // + " -- Préstamo empleados\n" + + " - (SELECT IF(ISNULL(SUM(amount_loan)),0,SUM(amount_loan)) AS total_loan_employee_today FROM APC_LOAN_EMPLOYEE WHERE loan_employee_status = 'ENEBLED' AND DATE(created_on) > (SELECT DATE(sgb.created_on) FROM APC_STABLE_GENERAL_BOX sgb WHERE DATE(sgb.created_on) < CURDATE() AND sgb.active_status = 'ENEBLED' ORDER BY sgb.created_on DESC LIMIT 1)) \n" + // + " -- Caja Chica\n" + + " + (SELECT IF(ISNULL(SUM(total_envelope)),0,SUM(total_envelope)) + IF(ISNULL(SUM(total_bank_note)),0,SUM(total_bank_note)) + IF(ISNULL(SUM(total_coin)),0,SUM(total_coin)) AS payment FROM APC_STABLE_SMALL_BOX WHERE active_status = 'ENEBLED' AND DATE(created_on) > (SELECT DATE(sgb.created_on) FROM APC_STABLE_GENERAL_BOX sgb WHERE DATE(sgb.created_on) < CURDATE() AND sgb.active_status = 'ENEBLED' ORDER BY sgb.created_on DESC LIMIT 1)) \n" + // + " -- DISPOSICIÓN DE AHORRO\n" + + " - (SELECT IF(ISNULL(SUM(employee_saving)),0,SUM(employee_saving)) AS payment FROM APC_EMPLOYEE_SAVING WHERE type = 'DISPOSAL' AND DATE(created_on) > (SELECT DATE(sgb.created_on) FROM APC_STABLE_GENERAL_BOX sgb WHERE DATE(sgb.created_on) < CURDATE() AND sgb.active_status = 'ENEBLED' ORDER BY sgb.created_on DESC LIMIT 1)) \n" + // + " -- ABONO A PRESTAMO FUERA DE NOMINA\n" + + " + (SELECT IF(ISNULL(SUM(payment_amount)),0,SUM(payment_amount)) AS payment FROM APC_LOAN_EMPLOYEE_DETAIL WHERE loan_employee_detail_status = 'ENEBLED' AND payroll = 'DISABLED' AND DATE(created_on) > (SELECT DATE(sgb.created_on) FROM APC_STABLE_GENERAL_BOX sgb WHERE DATE(sgb.created_on) < CURDATE() AND sgb.active_status = 'ENEBLED' ORDER BY sgb.created_on DESC LIMIT 1)) \n" + + + ")AS TOTAL FROM DUAL;"; + + String generalBoxReport + = "SELECT\n" + + "u.id,\n" + + "-- Inicios\n" + + "(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) \n" + + "FROM APC_MONEY_DAILY md\n" + + "WHERE DATE(md.money_daily_date) = DATE(':dateReport') AND md.id_office = u.id) as money_daily_today,\n" + + "-- nominas\n" + + "(SELECT IF(ISNULL(SUM(ap.total_payment)),0,SUM(ap.total_payment)) FROM APC_PAYROLL ap \n" + + "WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' \n" + + "AND DATE(ap.created_on) = DATE(':dateReport')) as nomina_today,\n" + + "-- adelantos\n" + + "(SELECT IF(ISNULL(SUM(ap.amount)),0,SUM(ap.amount)) FROM APC_ADVANCE ap \n" + + "WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' \n" + + "AND DATE(ap.created_on) = DATE(':dateReport')) as adelantos_today,\n" + + "-- entradas\n" + + "(SELECT IF(ISNULL(SUM(ap.amount)),0,SUM(ap.amount)) FROM APC_EXPENSE_COMPANY ap \n" + + "WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' AND \n" + + "ap.expense_company_type = 'PAYMENT_IN'\n" + + "AND DATE(ap.created_on) = DATE(':dateReport')) as entradas_today, \n" + + "-- gastos admon\n" + + "(SELECT IF(ISNULL(SUM(ap.amount)),0,SUM(ap.amount)) FROM APC_EXPENSE_COMPANY ap \n" + + "WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' AND \n" + + "ap.expense_company_type = 'PAYMENT_OUT'\n" + + "AND DATE(ap.created_on) = DATE(':dateReport')) as gastos_admon_today,\n" + + "-- total caja chica\n" + + "(SELECT total_small_box FROM APC_STABLE_SMALL_BOX where active_status = 'ENEBLED'\n" + + " AND DATE(created_on) = DATE(':dateReport')) total_caja_chica_today,\n" + + "(SELECT total_envelope FROM APC_STABLE_SMALL_BOX where active_status = 'ENEBLED'\n" + + " AND DATE(created_on) = DATE(':dateReport')) sobres_caja_chica_today,\n" + + "(SELECT total_bank_note FROM APC_STABLE_SMALL_BOX where active_status = 'ENEBLED'\n" + + " AND DATE(created_on) = DATE(':dateReport')) efectivo_caja_chica_today,\n" + + "(SELECT total_coin FROM APC_STABLE_SMALL_BOX where active_status = 'ENEBLED'\n" + + " AND DATE(created_on) = DATE(':dateReport')) monedas_caja_chica_today,\n" + + " (SELECT total_stable FROM APC_STABLE_SMALL_BOX where active_status = 'ENEBLED'\n" + + " AND DATE(created_on) = DATE(':dateReport')) cuadre_caja_chica_today,\n" + + " (SELECT description FROM APC_STABLE_SMALL_BOX where active_status = 'ENEBLED'\n" + + " AND DATE(created_on) = DATE(':dateReport')) descripcion_caja_chica_today,\n" + + " (SELECT total_general_box FROM APC_STABLE_GENERAL_BOX where active_status = 'ENEBLED'\n" + + " AND DATE(created_on) = DATE(':dateReport')) total_caja_general_today,\n" + + "(SELECT total_envelope FROM APC_STABLE_GENERAL_BOX where active_status = 'ENEBLED'\n" + + " AND DATE(created_on) = DATE(':dateReport')) sobres_caja_general_today,\n" + + "(SELECT total_bank_note FROM APC_STABLE_GENERAL_BOX where active_status = 'ENEBLED'\n" + + " AND DATE(created_on) = DATE(':dateReport')) efectivo_caja_general_today,\n" + + "(SELECT total_coin FROM APC_STABLE_GENERAL_BOX where active_status = 'ENEBLED'\n" + + " AND DATE(created_on) = DATE(':dateReport')) monedas_caja_general_today,\n" + + " (SELECT total_stable FROM APC_STABLE_GENERAL_BOX where active_status = 'ENEBLED'\n" + + " AND DATE(created_on) = DATE(':dateReport')) cuadre_caja_general_today,\n" + + " (SELECT description FROM APC_STABLE_GENERAL_BOX where active_status = 'ENEBLED'\n" + + " AND DATE(created_on) = DATE(':dateReport')) descripcion_caja_general_today,\n" + + " -- Cortes\n" + + "(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) \n" + + "FROM APC_CLOSING_DAY ld\n" + + "WHERE DATE(ld.created_on) = DATE(':dateReport') AND ld.active_status = 'ENEBLED' \n" + + "AND ld.id_office = u.id) as closing_day_today,\n" + + "-- Subtotal\n" + + "(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) \n" + + "FROM APC_LOAN_DETAIL ld\n" + + "INNER JOIN APC_LOAN l ON l.id = ld.id_loan \n" + + "INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id\n" + + "WHERE DATE(ld.created_on) = DATE(':dateReport') \n" + + "AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_today,\n" + + "-- comision por apertura\n" + + "(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al \n" + + " INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id \n" + + " INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id\n" + + " WHERE loan_status = 'APPROVED' \n" + + " AND DATE(al.created_on) = DATE(':dateReport')) \n" + + " as opening_fee_today,\n" + + "-- cobranza\n" + + "(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) \n" + + "FROM APC_LOAN_DETAIL ld\n" + + "INNER JOIN APC_LOAN l ON l.id = ld.id_loan \n" + + "INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id\n" + + "WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' \n" + + "AND DATE(ld.created_on) = DATE(':dateReport') \n" + + "AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_today,\n" + + "-- colocacion\n" + + "(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al \n" + + " INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id \n" + + " INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id\n" + + " WHERE loan_status = 'APPROVED' \n" + + " AND DATE(al.created_on) = DATE(':dateReport')) \n" + + " as colocation_today\n" + + "FROM APC_OFFICE u\n" + + "WHERE u.office_status = 'ENEBLED';"; + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StableSmallBoxController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StableSmallBoxController.java new file mode 100644 index 0000000..9a26f48 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StableSmallBoxController.java @@ -0,0 +1,250 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.controller.util.ConnectionManager; +import com.arrebol.apc.controller.util.HibernateUtil; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.OtherExpense; +import com.arrebol.apc.model.admin.StableSmallBox; +import com.arrebol.apc.model.admin.constance.OtherExpenseCfg; +import com.arrebol.apc.model.admin.constance.StableSmallBoxCfg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.math.BigDecimal; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.Transaction; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class StableSmallBoxController extends ConnectionManager implements Serializable { + + /** + * + * Searching all stable general box by office. + * + * @param officeId + * @param startDate + * @param endDate + * @return + */ + public List fillStableSmallBoxDatatable(String officeId, Date startDate, Date endDate) { + logger.debug("fillStableSmallBoxDatatable"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(StableSmallBoxCfg.FIELD_OFFICE, new Office(officeId))); + //parameters.add(new ModelParameter(StableSmallBoxCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + parameters.add(new ModelParameter(StableSmallBoxCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(StableSmallBoxCfg.PARAM_END_DATE, endDate)); + + return genericEntityRepository.xmlQueryAPCEntities(StableSmallBox.class, StableSmallBoxCfg.QUERY_FIND_ALL_STABLE_SMALL_BOX_BY_OFFICE_BETWEEN_DATES, parameters); + } + + /** + * + * @param status + * @param stableSmallBoxIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updateStableSmallBoxByStatus(ActiveStatus status, String stableSmallBoxIdToUpdate, String lastUpdatedBy) { + logger.debug("updateStableSmallBoxByStatus"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(StableSmallBoxCfg.FIELD_ACTIVE_STATUS, status)); + parameters.add(new ModelParameter(StableSmallBoxCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(StableSmallBoxCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(StableSmallBoxCfg.FIELD_ID, stableSmallBoxIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(StableSmallBoxCfg.QUERY_UPDATE_STABLE_SMALL_BOX_BY_STATUS, parameters); + } + + /** + * + * @param stableSmallBox + * @return boolean + */ + public boolean saveStableSmallBox(StableSmallBox stableSmallBox) { + logger.debug("saveStableSmallBox"); + boolean success = genericEntityRepository.insertAPCEntity(stableSmallBox); + + return success; + } + + /** + * + * Searching the stable small box by date and office + * + * @param createdOn + * @param officeid + * @return + */ + public Long getCountStableSmallBoxByOfficeAndDate(Date createdOn, String officeid) { + logger.debug("getCountStableSmallBoxByOfficeAndDate"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(StableSmallBoxCfg.FIELD_CREATEDON, createdOn)); + parameters.add(new ModelParameter(StableSmallBoxCfg.FIELD_OFFICE, new Office(officeid))); + + return (Long) genericEntityRepository.xmlQueryAPCEntityUniqueResult(Long.class, StableSmallBoxCfg.QUERY_COUNT_STABLE_SMALL_BOX_BY_OFFICE_AND_DATE, parameters); + } + + /** + * + * Searching the stable small box by date and office + * + * @param officeid + * @return + */ + public BigDecimal getPendingByClosingDay(String officeid) { + logger.debug("getPendingByClosingDay"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(StableSmallBoxCfg.FIELD_OFFICE_VIEW, officeid)); + + return (BigDecimal) genericEntityRepository.xmlQueryAPCEntityUniqueResult(BigDecimal.class, StableSmallBoxCfg.QUERY_SUM_PENDING_CLOSING_BY_OFFICE, parameters); + } + + /** + * + * @param date + * @return + */ + public boolean existStableGeneralBoxByCreatedOn(Date date) { + logger.info("existStableGeneralBoxByCreatedOn"); + + String query = "SELECT sgb.id " + + "FROM APC_STABLE_GENERAL_BOX sgb " + + "WHERE DATE(sgb.created_on) = DATE(:date) " + + "AND sgb.active_status = 'ENEBLED'"; + + return genericEntityRepository.existRecordsUsingSQLQueryFindByCreatedOnField(date, query); + } + + /** + * + * @param date + * @return + */ + public boolean existNextPaidStableSmallBoxByCreatedOn(Date date) { + logger.info("existNextPaidStableSmallBoxByCreatedOn"); + + String query = "SELECT ssb.id " + + "FROM APC_STABLE_SMALL_BOX ssb " + + "WHERE DATE(ssb.created_on) >= DATE_ADD(DATE(:date), INTERVAL 1 DAY) " + + "AND ssb.active_status = 'ENEBLED'"; + + return genericEntityRepository.existRecordsUsingSQLQueryFindByCreatedOnField(date, query); + } + + public List getDataReport(Date fecha) { + DateFormat formatter = new SimpleDateFormat("yyyy/MM/dd"); + String dateFormat = formatter.format(fecha); + + String queryReportLocal = queryReport; + queryReportLocal = queryReportLocal.replace(":dateReport", dateFormat); + List rows = new ArrayList<>(); + Transaction transaction = null; + + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + //rows = session.createNativeQuery(queryReport).setParameter("dateReport", dateFormat).getResultList(); + rows = session.createNativeQuery(queryReportLocal).getResultList(); + + transaction.commit(); + + } catch (HibernateException e) { + logger.error("Driver", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method getDataReport(" + fecha + " " + ") ", e); + rollback(transaction); + } + + return rows; + } + + public List fillOtherExpenseDatatable(String officeId, Date startDate, Date endDate) { + logger.debug("fillOtherExpenseDatatable"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(OtherExpenseCfg.FIELD_OFFICE, new Office(officeId))); + parameters.add(new ModelParameter(OtherExpenseCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(OtherExpenseCfg.PARAM_END_DATE, endDate)); + + return genericEntityRepository.xmlQueryAPCEntities(OtherExpense.class, OtherExpenseCfg.QUERY_FIND_ALL_OTHER_EXPENSE_BY_OFFICE_BETWEEN_DATES, parameters); + } + + final Logger logger = LogManager.getLogger(StableSmallBoxController.class); + private final GenericEntityRepository genericEntityRepository; + + public StableSmallBoxController() { + this.genericEntityRepository = new GenericEntityRepository(); + } + + private String queryReport + = "SELECT\n" + + "CONCAT(hr.first_name, ' ', hr.last_name) as asesor,\n" + + "rt.route_name as ruta,\n" + + "cd.amount_expected as monto_esperado,\n" + + "cd.amount_paid as monto_reportado,\n" + + "cd.comments as comentarios,\n" + + "(SELECT total_small_box FROM APC_STABLE_SMALL_BOX WHERE active_status = 'ENEBLED' and DATE(created_on) = DATE(':dateReport')) as total_caja,\n" + + "(SELECT total_envelope FROM APC_STABLE_SMALL_BOX WHERE active_status = 'ENEBLED' and DATE(created_on) = DATE(':dateReport')) as total_sobre,\n" + + "(SELECT total_bank_note FROM APC_STABLE_SMALL_BOX WHERE active_status = 'ENEBLED' and DATE(created_on) = DATE(':dateReport')) as total_efectivo,\n" + + "(SELECT total_coin FROM APC_STABLE_SMALL_BOX WHERE active_status = 'ENEBLED' and DATE(created_on) = DATE(':dateReport')) as total_monedas,\n" + + "(SELECT total_stable FROM APC_STABLE_SMALL_BOX WHERE active_status = 'ENEBLED' and DATE(created_on) = DATE(':dateReport')) as total_cuadre,\n" + + "(SELECT description FROM APC_STABLE_SMALL_BOX WHERE active_status = 'ENEBLED' and DATE(created_on) = DATE(':dateReport')) as descripcion_cuadre\n" + + "FROM APC_CLOSING_DAY cd\n" + + "INNER JOIN APC_USER u ON cd.id_user = u.id\n" + + "INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource\n" + + "INNER JOIN (\n" + + " SELECT id_human_resource, id_route, max(created_on) \n" + + " FROM APC_HUMAN_RESOURCE_HAS_ROUTE\n" + + " GROUP BY id_human_resource\n" + + ")hrr ON hr.id = hrr.id_human_resource\n" + + "INNER JOIN APC_ROUTE rt ON hrr.id_route = rt.id\n" + + "WHERE cd.active_status = 'ENEBLED' and DATE(cd.created_on) = DATE(':dateReport');"; + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsAdvancesController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsAdvancesController.java new file mode 100644 index 0000000..3874de0 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsAdvancesController.java @@ -0,0 +1,100 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.GoalCfg; +import com.arrebol.apc.model.views.StatsAdvancesView; +import com.arrebol.apc.model.views.constance.StatsAdvancesViewCfg; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; + +/** + * + * @author David Rodriguez + */ +public class StatsAdvancesController implements Serializable { + + public List fillAdvancesDataTable(Date startDate, Date endDate, String idRoute) { + logger.debug("fillAdvancesDataTable"); + List parameters = new ArrayList<>(); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = new ArrayList<>(); + + if (idRoute != null && !idRoute.equals("")) { + parameters.add(new ModelParameter(StatsAdvancesViewCfg.FIELD_ROUTE, idRoute)); + dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsAdvancesView.class, StatsAdvancesViewCfg.QUERY_FIND_ALL_ADVANCES_BETWEEN_DATES_ROUTE, parameters); + } else { + dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsAdvancesView.class, StatsAdvancesViewCfg.QUERY_FIND_ALL_ADVANCES_BETWEEN_DATES, parameters); + } + + Map mapDataAdvances = new HashMap<>(); + for (StatsAdvancesView advances : dataComplete) { + if (mapDataAdvances.get(advances.getIdRoute()) != null) { + mapDataAdvances.get(advances.getIdRoute()).setTotalAdvances(mapDataAdvances.get(advances.getIdRoute()).getTotalAdvances().add(advances.getTotalAdvances())); + } else { + mapDataAdvances.put(advances.getIdRoute(), advances); + } + } + dataComplete.clear(); + dataComplete.addAll(mapDataAdvances.values()); + + dataComplete.sort(Comparator.comparing(StatsAdvancesView::getRouteName)); + return dataComplete; + } + + public BigDecimal fillTotalAdvances(Date startDate, Date endDate) { + logger.debug("fillTotalAdvances"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsAdvancesView.class, StatsAdvancesViewCfg.QUERY_FIND_ALL_ADVANCES_BETWEEN_DATES, parameters); + BigDecimal totalAdvances = new BigDecimal("0"); + for (StatsAdvancesView advances : dataComplete) { + totalAdvances = totalAdvances.add(advances.getTotalAdvances()); + } + return totalAdvances; + } + + final Logger logger = LogManager.getLogger(StatsAdvancesController.class); + private final GenericEntityRepository genericEntityRepository; + + public StatsAdvancesController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsClosingDayController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsClosingDayController.java new file mode 100644 index 0000000..c7a06a3 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsClosingDayController.java @@ -0,0 +1,102 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.GoalCfg; +import com.arrebol.apc.model.views.StatsClosingDayView; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import com.arrebol.apc.model.views.constance.StatsClosingDayViewCfg; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; + +/** + * + * @author David Rodriguez + */ +public class StatsClosingDayController implements Serializable { + + public List fillClosingDayDataTable(Date startDate, Date endDate, String idUser) { + logger.debug("fillClosingDayDataTable"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = new ArrayList<>(); + + if (idUser != null && !idUser.equals("")) { + parameters.add(new ModelParameter(StatsClosingDayViewCfg.FIELD_USER, idUser)); + dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsClosingDayView.class, StatsClosingDayViewCfg.QUERY_FIND_ALL_CLOSING_DAY_BETWEEN_DATES_USER, parameters); + } else { + dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsClosingDayView.class, StatsClosingDayViewCfg.QUERY_FIND_ALL_CLOSING_DAY_BETWEEN_DATES, parameters); + } + + Map mapDataClosingDay = new HashMap<>(); + for (StatsClosingDayView closingDay : dataComplete) { + if (mapDataClosingDay.get(closingDay.getIdUser()) != null) { + mapDataClosingDay.get(closingDay.getIdUser()).setTotalClosingDay( + mapDataClosingDay.get(closingDay.getIdUser()).getTotalClosingDay().add(closingDay.getTotalClosingDay())); + } else { + mapDataClosingDay.put(closingDay.getIdUser(), closingDay); + } + } + dataComplete.clear(); + dataComplete.addAll(mapDataClosingDay.values()); + + dataComplete.sort(Comparator.comparing(StatsClosingDayView::getRouteName)); + return dataComplete; + } + + public BigDecimal fillTotalClosingDay(Date startDate, Date endDate) { + logger.debug("fillTotalClosingDay"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsClosingDayView.class, StatsClosingDayViewCfg.QUERY_FIND_ALL_CLOSING_DAY_BETWEEN_DATES, parameters); + BigDecimal totalClosingDay = new BigDecimal("0"); + for (StatsClosingDayView closingDay : dataComplete) { + totalClosingDay = totalClosingDay.add(closingDay.getTotalClosingDay()); + } + return totalClosingDay; + } + + final Logger logger = LogManager.getLogger(StatsClosingDayController.class); + private final GenericEntityRepository genericEntityRepository; + + public StatsClosingDayController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsDepositsController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsDepositsController.java new file mode 100644 index 0000000..58d9905 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsDepositsController.java @@ -0,0 +1,105 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.GoalCfg; +import com.arrebol.apc.model.views.StatsDepositsView; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import com.arrebol.apc.model.views.constance.StatsDepositsViewCfg; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; + +/** + * + * @author David Rodriguez + */ +public class StatsDepositsController implements Serializable { + + public List fillDepositsDataTable(Date startDate, Date endDate, String idUser) { + logger.debug("fillDepositsDataTable"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = new ArrayList<>(); + + if (idUser != null && !idUser.equals("")) { + parameters.add(new ModelParameter(StatsDepositsViewCfg.FIELD_USER, idUser)); + dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsDepositsView.class, StatsDepositsViewCfg.QUERY_FIND_ALL_DEPOSITS_BETWEEN_DATES_USER, parameters); + } else { + dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsDepositsView.class, StatsDepositsViewCfg.QUERY_FIND_ALL_DEPOSITS_BETWEEN_DATES, parameters); + } + + Map mapDataDeposits = new HashMap<>(); + /* + for (StatsDepositsView deposits : dataComplete) { + if (mapDataDeposits.get(deposits.getIdUser()) != null) { + if(!mapDataDeposits.get(deposits.getIdUser()).getRouteName().contains(deposits.getRouteName())){ + mapDataDeposits.get(deposits.getIdUser()).setRouteName(mapDataDeposits.get(deposits.getIdUser()).getRouteName() + ", " + deposits.getRouteName()); + } + + mapDataDeposits.get(deposits.getIdUser()).setTotalDeposits( + mapDataDeposits.get(deposits.getIdUser()).getTotalDeposits().add(deposits.getTotalDeposits())); + } else { + mapDataDeposits.put(deposits.getIdUser(), deposits); + } + } + */ + dataComplete.sort(Comparator.comparing(StatsDepositsView::getRouteName)); + return dataComplete; + } + + public BigDecimal fillTotalDeposits(Date startDate, Date endDate) { + logger.debug("fillTotalDeposits"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsDepositsView.class, StatsDepositsViewCfg.QUERY_FIND_ALL_DEPOSITS_BETWEEN_DATES, parameters); + BigDecimal totalDeposits = new BigDecimal("0"); + for (StatsDepositsView deposits : dataComplete) { + totalDeposits = totalDeposits.add(deposits.getTotalDeposits()); + } + return totalDeposits; + } + + final Logger logger = LogManager.getLogger(StatsDepositsController.class); + private final GenericEntityRepository genericEntityRepository; + + public StatsDepositsController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsEmployeeSavingController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsEmployeeSavingController.java new file mode 100644 index 0000000..d5a6345 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsEmployeeSavingController.java @@ -0,0 +1,155 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.EmployeeSaving; +import com.arrebol.apc.model.admin.constance.GoalCfg; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.EmployeeSavingType; +import com.arrebol.apc.model.views.StatsEmployeeSavingView; +import com.arrebol.apc.model.views.constance.StatsEmployeeSavingViewCfg; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; + +/** + * + * @author David Rodriguez + */ +public class StatsEmployeeSavingController implements Serializable { + public List fillEmployeeSavingDataTable (Date startDate, Date endDate) { + logger.debug("fillEmployeeSavingDataTable"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsEmployeeSavingView.class, StatsEmployeeSavingViewCfg.QUERY_FIND_ALL_EMPLOYEE_SAVING_BETWEEN_DATES, parameters); + Map mapDataEmployeeSaving = new HashMap<>(); + for (StatsEmployeeSavingView employeeSaving : dataComplete) { + if (mapDataEmployeeSaving.get(employeeSaving.getIdUser()) != null) { + if (employeeSaving.getType().equals(EmployeeSavingType.SAVING)) { + mapDataEmployeeSaving.get(employeeSaving.getIdUser()).setEmployeeSaving( + mapDataEmployeeSaving.get(employeeSaving.getIdUser()).getEmployeeSaving().add(employeeSaving.getEmployeeSaving())); + }else{ + mapDataEmployeeSaving.get(employeeSaving.getIdUser()).setEmployeeSaving( + mapDataEmployeeSaving.get(employeeSaving.getIdUser()).getEmployeeSaving().subtract(employeeSaving.getEmployeeSaving())); + } + } else { + if (employeeSaving.getType().equals(EmployeeSavingType.SAVING)) { + employeeSaving.setEmployeeSaving(employeeSaving.getEmployeeSaving()); + }else{ + employeeSaving.setEmployeeSaving(employeeSaving.getEmployeeSaving().negate()); + } + mapDataEmployeeSaving.put(employeeSaving.getIdUser(), employeeSaving); + } + } + + dataComplete.clear(); + dataComplete.addAll(mapDataEmployeeSaving.values()); + + // Asigna todas las rutas al usuario + // dataComplete.forEach(d -> d.setRouteName(mapDataEmployeeSaving.get(d.getIdUser()).getRouteName())); + + return dataComplete; + } + + public List getEmployeeSavingById (Date startDate, Date endDate, String idUser) { + logger.debug("getEmployeeSavingById"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + parameters.add(new ModelParameter(StatsEmployeeSavingViewCfg.USER_ID, idUser)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsEmployeeSavingView.class, StatsEmployeeSavingViewCfg.QUERY_FIND_ALL_EMPLOYEE_SAVING_BY_ID_BETWEEN_DATES, parameters); + + return dataComplete; + + } + + public BigDecimal fillTotalEmployeeSaving(Date startDate, Date endDate) { + logger.debug("fillTotalEmployeeSaving"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsEmployeeSavingView.class, StatsEmployeeSavingViewCfg.QUERY_FIND_ALL_EMPLOYEE_SAVING_BETWEEN_DATES, parameters); + BigDecimal totalEmployeeSaving = BigDecimal.ZERO; + for (StatsEmployeeSavingView employeeSaving : dataComplete) { + if (employeeSaving.getType().equals(EmployeeSavingType.SAVING)) { + totalEmployeeSaving = totalEmployeeSaving.add(employeeSaving.getEmployeeSaving()); + }else{ + totalEmployeeSaving = totalEmployeeSaving.subtract(employeeSaving.getEmployeeSaving()); + } + } + return totalEmployeeSaving; + } + + public boolean saveEmployeeSaving(EmployeeSaving employeeSaving) { + logger.debug("saveEmployeeSaving"); + boolean success = genericEntityRepository.insertAPCEntity(employeeSaving); + + return success; + } + + /** + * + * Searching user by id. + * + * @param userId + * @return + */ + public User getUserById(String userId) { + logger.debug("getUserById"); + + return (User) genericEntityRepository.selectAPCEntityById(User.class, userId); + } + + final Logger logger = LogManager.getLogger(StatsEmployeeSavingController.class); + private final GenericEntityRepository genericEntityRepository; + + public StatsEmployeeSavingController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsGasolineController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsGasolineController.java new file mode 100644 index 0000000..dbfbfa3 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsGasolineController.java @@ -0,0 +1,81 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.GoalCfg; +import com.arrebol.apc.model.views.StatsGasolineView; +import com.arrebol.apc.model.views.constance.StatsGasolineViewCfg; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class StatsGasolineController implements Serializable { + + public List fillGasolineDataTable(Date startDate, Date endDate) { + logger.debug("fillGasolineDataTable"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsGasolineView.class, StatsGasolineViewCfg.QUERY_FIND_ALL_GASOLINE_BETWEEN_DATES, parameters); + + return dataComplete; + } + + public Double fillTotalGasoline(Date startDate, Date endDate) { + logger.debug("fillTotalGasoline"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsGasolineView.class, StatsGasolineViewCfg.QUERY_FIND_ALL_GASOLINE_BETWEEN_DATES, parameters); + Double totalGasoline = 0.0; + for (StatsGasolineView gasoline : dataComplete) { + totalGasoline = totalGasoline + gasoline.getTotalGasoline(); + } + return totalGasoline; + } + + final Logger logger = LogManager.getLogger(StatsAdvancesController.class); + private final GenericEntityRepository genericEntityRepository; + + public StatsGasolineController() { + this.genericEntityRepository = new GenericEntityRepository(); + } + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsOpeningFeesController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsOpeningFeesController.java new file mode 100644 index 0000000..66191b0 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsOpeningFeesController.java @@ -0,0 +1,107 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.GoalCfg; +import com.arrebol.apc.model.views.StatsOpeningFeesView; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import com.arrebol.apc.model.views.constance.StatsOpeningFeesViewCfg; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; + +/** + * + * @author David Rodriguez + */ +public class StatsOpeningFeesController implements Serializable { + + public List fillOpeningFeesDataTable(Date startDate, Date endDate, String idUser) { + logger.debug("fillOpeningFeesDataTable"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = new ArrayList<>(); + + if (idUser != null && !idUser.equals("")) { + parameters.add(new ModelParameter(StatsOpeningFeesViewCfg.FIELD_USER, idUser)); + dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsOpeningFeesView.class, StatsOpeningFeesViewCfg.QUERY_FIND_ALL_OPENING_FEES_BETWEEN_DATES_USER, parameters); + } else { + dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsOpeningFeesView.class, StatsOpeningFeesViewCfg.QUERY_FIND_ALL_OPENING_FEES_BETWEEN_DATES, parameters); + } + + Map mapDataOpeningFees = new HashMap<>(); + for (StatsOpeningFeesView openingFee : dataComplete) { + if (mapDataOpeningFees.get(openingFee.getIdUser()) != null) { + if(!mapDataOpeningFees.get(openingFee.getIdUser()).getRouteName().contains(openingFee.getRouteName())){ + mapDataOpeningFees.get(openingFee.getIdUser()).setRouteName(mapDataOpeningFees.get(openingFee.getIdUser()).getRouteName() + ", " + openingFee.getRouteName()); + } + + mapDataOpeningFees.get(openingFee.getIdUser()).setTotaltotalOpeningFees( + mapDataOpeningFees.get(openingFee.getIdUser()).getTotalOpeningFees().add(openingFee.getTotalOpeningFees())); + } else { + mapDataOpeningFees.put(openingFee.getIdUser(), openingFee); + } + } + dataComplete.clear(); + dataComplete.addAll(mapDataOpeningFees.values()); + + dataComplete.sort(Comparator.comparing(StatsOpeningFeesView::getRouteName)); + return dataComplete; + } + + public BigDecimal fillTotalOpeningFees(Date startDate, Date endDate) { + logger.debug("fillTotalOpeningFees"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsOpeningFeesView.class, StatsOpeningFeesViewCfg.QUERY_FIND_ALL_OPENING_FEES_BETWEEN_DATES, parameters); + BigDecimal totalOpeningFees = new BigDecimal("0"); + for (StatsOpeningFeesView openingFee : dataComplete) { + totalOpeningFees = totalOpeningFees.add(openingFee.getTotalOpeningFees()); + } + return totalOpeningFees; + } + + final Logger logger = LogManager.getLogger(StatsOpeningFeesController.class); + private final GenericEntityRepository genericEntityRepository; + + public StatsOpeningFeesController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsPaymentController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsPaymentController.java new file mode 100644 index 0000000..abb091e --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsPaymentController.java @@ -0,0 +1,117 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.GoalCfg; +import com.arrebol.apc.model.views.StatsPaymentView; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import com.arrebol.apc.model.views.constance.StatsPaymentViewCfg; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; + +/** + * + * @author David Rodriguez + */ +public class StatsPaymentController implements Serializable { + + public List fillPaymentDataTable(Date startDate, Date endDate, String idUser) { + logger.debug("fillPaymentDataTable"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = new ArrayList<>(); + + if (idUser != null && !idUser.equals("")) { + parameters.add(new ModelParameter(StatsPaymentViewCfg.FIELD_USER, idUser)); + dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsPaymentView.class, StatsPaymentViewCfg.QUERY_FIND_ALL_PAYMENT_BETWEEN_DATES_USER, parameters); + } else { + dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsPaymentView.class, StatsPaymentViewCfg.QUERY_FIND_ALL_PAYMENT_BETWEEN_DATES, parameters); + } + + Map mapDataPayment = new HashMap<>(); + List listLoanTypeSum = new ArrayList<>(); + + for (StatsPaymentView payment : dataComplete) { + if (mapDataPayment.get(payment.getIdUser()) != null) { + mapDataPayment.get(payment.getIdUser()).setTotalPayment( + mapDataPayment.get(payment.getIdUser()).getTotalPayment().add(payment.getTotalPayment())); + if(!listLoanTypeSum.contains(payment.getIdLoan())){ + listLoanTypeSum.add(payment.getIdLoan()); + mapDataPayment.get(payment.getIdUser()).setTotalPayment( + mapDataPayment.get(payment.getIdUser()).getTotalPayment().add(payment.getOpeningFee())); + } + } else { + payment.setTotalPayment(payment.getTotalPayment().add(payment.getOpeningFee())); + mapDataPayment.put(payment.getIdUser(), payment); + listLoanTypeSum.add(payment.getIdLoan()); + + } + } + dataComplete.clear(); + dataComplete.addAll(mapDataPayment.values()); + + dataComplete.sort(Comparator.comparing(StatsPaymentView::getRouteName)); + return dataComplete; + } + + public BigDecimal fillTotalPayment(Date startDate, Date endDate) { + logger.debug("fillTotalPayment"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsPaymentView.class, StatsPaymentViewCfg.QUERY_FIND_ALL_PAYMENT_BETWEEN_DATES, parameters); + List listLoanTypeSum = new ArrayList<>(); + BigDecimal totalPayment = new BigDecimal("0"); + for (StatsPaymentView payment : dataComplete) { + totalPayment = totalPayment.add(payment.getTotalPayment()); + if(!listLoanTypeSum.contains(payment.getIdLoan())){ + listLoanTypeSum.add(payment.getIdLoan()); + totalPayment = totalPayment.add(payment.getOpeningFee()); + } + } + return totalPayment; + } + + final Logger logger = LogManager.getLogger(StatsPaymentController.class); + private final GenericEntityRepository genericEntityRepository; + + public StatsPaymentController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsPaymentRenovationController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsPaymentRenovationController.java new file mode 100644 index 0000000..8bb700b --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsPaymentRenovationController.java @@ -0,0 +1,86 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.GoalCfg; +import com.arrebol.apc.model.views.StatsPaymentRenovationView; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import com.arrebol.apc.model.views.constance.StatsPaymentRenovationViewCfg; +import java.math.BigDecimal; +import java.util.Calendar; + +/** + * + * @author David Rodriguez + */ +public class StatsPaymentRenovationController implements Serializable { + + public List fillPaymentDataTable(Date startDate, Date endDate, String idUser) { + logger.debug("fillPaymentDataTable"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = new ArrayList<>(); + + if (idUser != null && !idUser.equals("")) { + parameters.add(new ModelParameter(StatsPaymentRenovationViewCfg.FIELD_USER, idUser)); + dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsPaymentRenovationView.class, StatsPaymentRenovationViewCfg.QUERY_FIND_ALL_PAYMENT_RENOVATION_BETWEEN_DATES_USER, parameters); + } else { + dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsPaymentRenovationView.class, StatsPaymentRenovationViewCfg.QUERY_FIND_ALL_PAYMENT_RENOVATION_BETWEEN_DATES, parameters); + } + + return dataComplete; + } + + public BigDecimal fillTotalPayment(Date startDate, Date endDate) { + logger.debug("fillTotalPayment"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsPaymentRenovationView.class, StatsPaymentRenovationViewCfg.QUERY_FIND_ALL_PAYMENT_RENOVATION_BETWEEN_DATES, parameters); + BigDecimal totalPayment = new BigDecimal("0"); + for (StatsPaymentRenovationView payment : dataComplete) { + totalPayment = totalPayment.add(payment.getTotalPayment()); + } + return totalPayment; + } + + final Logger logger = LogManager.getLogger(StatsPaymentRenovationController.class); + private final GenericEntityRepository genericEntityRepository; + + public StatsPaymentRenovationController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsPaymentRouteController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsPaymentRouteController.java new file mode 100644 index 0000000..989b72d --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsPaymentRouteController.java @@ -0,0 +1,120 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.GoalCfg; +import com.arrebol.apc.model.views.StatsPaymentRouteView; +import com.arrebol.apc.model.views.constance.StatsPaymentRouteViewCfg; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; + +/** + * + * @author David Rodriguez + */ +public class StatsPaymentRouteController implements Serializable { + + public BigDecimal fillTotalPayment(Date startDate, Date endDate) { + logger.debug("fillTotalPayment"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsPaymentRouteView.class, StatsPaymentRouteViewCfg.QUERY_FIND_ALL_PAYMENT_ROUTE_BETWEEN_DATES, parameters); + BigDecimal totalPayment = new BigDecimal("0"); + List listLoanTypeSum = new ArrayList<>(); + for (StatsPaymentRouteView payment : dataComplete) { + totalPayment = totalPayment.add(payment.getTotalPayment()); + if (!listLoanTypeSum.contains(payment.getIdLoan())) { + listLoanTypeSum.add(payment.getIdLoan()); + totalPayment = totalPayment.add(payment.getOpeningFee()); + } + } + return totalPayment; + } + + public List fillPaymentDataTable(Date startDate, Date endDate, String idRoute) { + logger.debug("fillPaymentDataTable"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + List dataComplete = new ArrayList<>(); + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + + if (idRoute != null && !idRoute.equals("")) { + parameters.add(new ModelParameter(StatsPaymentRouteViewCfg.FIELD_ROUTE, idRoute)); + dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsPaymentRouteView.class, StatsPaymentRouteViewCfg.QUERY_FIND_ALL_PAYMENT_ROUTE_BETWEEN_DATES_ROUTE, parameters); + } else { + dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsPaymentRouteView.class, StatsPaymentRouteViewCfg.QUERY_FIND_ALL_PAYMENT_ROUTE_BETWEEN_DATES, parameters); + } + + Map mapDataPayment = new HashMap<>(); + List listLoanTypeSum = new ArrayList<>(); + + for (StatsPaymentRouteView payment : dataComplete) { + if (mapDataPayment.get(payment.getIdRoute()) != null) { + if(!mapDataPayment.get(payment.getIdRoute()).getUserName().contains(payment.getUserName())){ + mapDataPayment.get(payment.getIdRoute()).setUserName(mapDataPayment.get(payment.getIdRoute()).getUserName() + ", " + payment.getUserName()); + } + mapDataPayment.get(payment.getIdRoute()).setTotalPayment( + mapDataPayment.get(payment.getIdRoute()).getTotalPayment().add(payment.getTotalPayment())); + + if (!listLoanTypeSum.contains(payment.getIdLoan())) { + listLoanTypeSum.add(payment.getIdLoan()); + mapDataPayment.get(payment.getIdRoute()).setTotalPayment( + mapDataPayment.get(payment.getIdRoute()).getTotalPayment().add(payment.getOpeningFee())); + } + } else { + payment.setTotalPayment(payment.getTotalPayment().add(payment.getOpeningFee())); + mapDataPayment.put(payment.getIdRoute(), payment); + listLoanTypeSum.add(payment.getIdLoan()); + } + } + dataComplete.clear(); + dataComplete.addAll(mapDataPayment.values()); + + dataComplete.sort(Comparator.comparing(StatsPaymentRouteView::getRouteName)); + return dataComplete; + } + + final Logger logger = LogManager.getLogger(StatsPaymentRouteController.class); + private final GenericEntityRepository genericEntityRepository; + + public StatsPaymentRouteController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsPayrollController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsPayrollController.java new file mode 100644 index 0000000..2ace223 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsPayrollController.java @@ -0,0 +1,99 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.GoalCfg; +import com.arrebol.apc.model.views.StatsPayrollView; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import com.arrebol.apc.model.views.constance.StatsPayrollViewCfg; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; + +/** + * + * @author David Rodriguez + */ +public class StatsPayrollController implements Serializable { + + public List fillPayrollDataTable(Date startDate, Date endDate, String idUser) { + logger.debug("fillPayrollDataTable"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = new ArrayList<>(); + + if (idUser != null && !idUser.equals("")) { + parameters.add(new ModelParameter(StatsPayrollViewCfg.FIELD_USER, idUser)); + dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsPayrollView.class, StatsPayrollViewCfg.QUERY_FIND_ALL_PAYROLL_BETWEEN_DATES_USER, parameters); + } else { + dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsPayrollView.class, StatsPayrollViewCfg.QUERY_FIND_ALL_PAYROLL_BETWEEN_DATES, parameters); + } + + Map mapDataPayroll = new HashMap<>(); + for (StatsPayrollView payroll : dataComplete) { + if (mapDataPayroll.get(payroll.getIdUser()) != null) { + mapDataPayroll.get(payroll.getIdUser()).setTotalPayroll( + mapDataPayroll.get(payroll.getIdUser()).getTotalPayroll().add(payroll.getTotalPayroll())); + } else { + mapDataPayroll.put(payroll.getIdUser(), payroll); + } + } + dataComplete.clear(); + dataComplete.addAll(mapDataPayroll.values()); + return dataComplete; + } + + public BigDecimal fillTotalPayroll(Date startDate, Date endDate) { + logger.debug("fillTotalPayroll"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsPayrollView.class, StatsPayrollViewCfg.QUERY_FIND_ALL_PAYROLL_BETWEEN_DATES, parameters); + BigDecimal totalPayroll = new BigDecimal("0"); + for (StatsPayrollView payroll : dataComplete) { + totalPayroll = totalPayroll.add(payroll.getTotalPayroll()); + } + return totalPayroll; + } + + final Logger logger = LogManager.getLogger(StatsPayrollController.class); + private final GenericEntityRepository genericEntityRepository; + + public StatsPayrollController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsSummaryController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsSummaryController.java new file mode 100644 index 0000000..3595778 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsSummaryController.java @@ -0,0 +1,233 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.controller.util.ConnectionManager; +import com.arrebol.apc.controller.util.HibernateUtil; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.GoalCfg; +import com.arrebol.apc.model.views.StatsPayrollView; +import com.arrebol.apc.model.views.StatsSummaryView; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import com.arrebol.apc.model.views.constance.StatsPayrollViewCfg; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.Transaction; + +/** + * + * @author David Rodriguez + */ +public class StatsSummaryController extends ConnectionManager implements Serializable { + + public List fillSummaryDataTable(Date startDate, Date endDate) { + logger.debug("fillSummaryDataTable"); + List dataList = new ArrayList<>(); + Transaction transaction = null; + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); + + List rows = session.createNativeQuery(querySummary) + .setParameter("startDate", startDate) + .setParameter("endDate", endDate) + .getResultList(); + + transaction.commit(); + + rows.forEach((row) -> { + Object[] results = (Object[]) row; + + // Create Data Row + StatsSummaryView summaryRow = new StatsSummaryView(); + summaryRow.setIdUser(results[0] == null ? "" : results[0].toString()); + summaryRow.setUserName(results[1] == null ? "" : results[1].toString()); + summaryRow.setOpeningFee(new BigDecimal(results[2] == null ? "0.0" : results[2].toString())); + summaryRow.setDeposits(new BigDecimal(results[3] == null ? "0.0" : results[3].toString())); + summaryRow.setPayment(new BigDecimal(results[4] == null ? "0.0" : results[4].toString())); + summaryRow.setPayroll(new BigDecimal(results[5] == null ? "0.0" : results[5].toString())); + summaryRow.setGasoline(new BigDecimal(results[6] == null ? "0.0" : results[6].toString())); + summaryRow.setAdvances(new BigDecimal(results[7] == null ? "0.0" : results[7].toString())); + summaryRow.setExpenses(new BigDecimal(results[8] == null ? "0.0" : results[8].toString())); + summaryRow.setTrasferTransmitter(new BigDecimal(results[9] == null ? "0.0" : results[9].toString())); + summaryRow.setTrasferReceiver(new BigDecimal(results[10] == null ? "0.0" : results[10].toString())); + + dataList.add(summaryRow); + }); + + } catch (HibernateException e) { + logger.error("Driver", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method fillSummaryDataTable(" + startDate + " " + ") ", e); + rollback(transaction); + } + + return dataList; + } + + public BigDecimal fillTotalSummary(Date startDate, Date endDate) { + logger.debug("fillTotalSummary"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsPayrollView.class, StatsPayrollViewCfg.QUERY_FIND_ALL_PAYROLL_BETWEEN_DATES, parameters); + BigDecimal totalPayroll = new BigDecimal("0"); + for (StatsPayrollView payroll : dataComplete) { + totalPayroll = totalPayroll.add(payroll.getTotalPayroll()); + } + return totalPayroll; + } + + final Logger logger = LogManager.getLogger(StatsSummaryController.class); + private final GenericEntityRepository genericEntityRepository; + + public StatsSummaryController() { + this.genericEntityRepository = new GenericEntityRepository(); + } + + private final String querySummary + = "SELECT " + + " HR.id AS id_user, " + + " CONCAT(HR.first_name, ' ', HR.last_name) AS Name, " + + " IFNULL(OFE.opening_fee, 0.0) AS opening_fee, " + + " IFNULL(DEP.total_deposits, 0.0) AS deposits, " + + " IFNULL(PAY.total_payment, 0.0) AS payment, " + + " IFNULL(PR.total_payroll, 0.0) AS payroll, " + + " IFNULL(GAS.total_gasoline, 0.0) AS gasoline, " + + " IFNULL(ADV.total_advances, 0.0) AS advances, " + + " IFNULL(EXP.total_expenses, 0.0) AS expenses, " + + " IFNULL(TE.total_transfer, 0.0) AS trasfer_transmitter, " + + " IFNULL(TR.total_transfer, 0.0) AS trasfer_receiver " + + "FROM APC_HUMAN_RESOURCE AS HR " + + "INNER JOIN APC_USER AS U ON U.id_human_resource = HR.Id " + + "LEFT JOIN " + + "( " + + " SELECT " + + " HR.id AS id_HR, CONCAT(HR.first_name, ' ', HR.last_name) AS Name, SUM(LT.opening_fee) AS opening_fee " + + " FROM APC_LOAN L " + + " INNER JOIN APC_LOAN_TYPE LT ON L.id_loan_type = LT.id " + + " INNER JOIN APC_USER U ON L.created_by = U.id " + + " INNER JOIN APC_HUMAN_RESOURCE HR ON U.id_human_resource = HR.id " + + " WHERE DATE(L.created_on) BETWEEN DATE(:startDate) AND DATE(:endDate) " + + " GROUP BY HR.id " + + ") OFE ON HR.id = OFE.id_HR " + + "LEFT JOIN " + + "( " + + " SELECT " + + " HR.id AS id_HR, CONCAT(HR.first_name, ' ', HR.last_name) AS Name, SUM(LD.payment_amount )AS total_deposits " + + " FROM APC_LOAN_DETAIL LD " + + " INNER JOIN APC_LOAN L ON LD.id_loan = L.id AND L.loan_status <> 'DELETED' " + + " INNER JOIN APC_USER U ON LD.id_user = U.id " + + " INNER JOIN APC_HUMAN_RESOURCE HR ON U.id_human_resource = HR.id " + + " WHERE loan_details_type IN ('TRANSFER') AND DATE(LD.created_on) BETWEEN DATE(:startDate) AND DATE(:endDate) " + + " GROUP BY HR.id " + + ") DEP ON HR.id = DEP.id_HR " + + "LEFT JOIN " + + "( " + + " SELECT " + + " HR.id AS id_HR, CONCAT(HR.first_name, ' ', HR.last_name) AS Name, SUM(LD.payment_amount )AS total_payment " + + " FROM APC_LOAN_DETAIL LD " + + " INNER JOIN APC_LOAN L ON LD.id_loan = L.id AND L.loan_status <> 'DELETED' " + + " INNER JOIN APC_USER U ON LD.id_user = U.id " + + " INNER JOIN APC_HUMAN_RESOURCE HR ON U.id_human_resource = HR.id " + + " WHERE loan_details_type IN ('PAYMENT') AND DATE(LD.created_on) BETWEEN DATE(:startDate) AND DATE(:endDate) " + + " GROUP BY HR.id " + + ") PAY ON HR.id = PAY.id_HR " + + "LEFT JOIN " + + "( " + + " SELECT " + + " P.id_human_resource AS id_HR, " + + " SUM(P.salary + P.total_bonus_colocation + P.total_bonus_mora + P.total_bonus_new_customer + P.increases) AS total_payroll " + + " FROM APC_PAYROLL P " + + " WHERE DATE(P.created_on) BETWEEN DATE(:startDate) AND DATE(:endDate) " + + " GROUP BY P.id_human_resource " + + ")PR ON HR.id = PR.id_HR " + + "LEFT JOIN " + + "( " + + " SELECT " + + " HR.id AS id_HR, CONCAT(HR.first_name, ' ', HR.last_name) AS user_name, SUM(G.total) AS total_gasoline " + + " FROM APC_GASOLINE G " + + " INNER JOIN APC_USER U ON G.id_user = U.id " + + " INNER JOIN APC_HUMAN_RESOURCE HR ON U.id_human_resource = HR.id " + + " WHERE G.status = 'ENABLED' AND DATE(G.created_on) BETWEEN DATE(:startDate) AND DATE(:endDate) " + + " GROUP BY HR.id " + + ")GAS ON HR.id = GAS.id_HR " + + "LEFT JOIN " + + "( " + + " SELECT " + + " HR.id AS id_HR, SUM(LD.payment_amount) AS total_advances " + + " FROM APC_LOAN_DETAIL LD " + + " INNER JOIN APC_LOAN L ON LD.id_loan = L.id AND L.loan_status <> 'DELETED' " + + " INNER JOIN APC_USER U ON LD.id_user = U.id " + + " INNER JOIN APC_HUMAN_RESOURCE HR ON U.id_human_resource = HR.id " + + " WHERE loan_details_type IN ('RENOVATION_PAYMENT') AND DATE(LD.created_on) BETWEEN DATE(:startDate) AND DATE(:endDate) " + + " GROUP BY HR.id " + + ")ADV ON HR.id = ADV.id_HR " + + "LEFT JOIN " + + "( " + + " SELECT " + + " HR.id AS id_HR, CONCAT(HR.first_name, ' ', HR.last_name) AS user_name, SUM(OE.expense) AS total_expenses " + + " FROM APC_OTHER_EXPENSE OE " + + " INNER JOIN APC_USER U ON OE.id_user = U.id " + + " INNER JOIN APC_HUMAN_RESOURCE HR ON U.id_human_resource = HR.id " + + " WHERE DATE(OE.created_on) BETWEEN DATE(:startDate) AND DATE(:endDate) " + + " GROUP BY HR.id " + + ")EXP ON HR.id = EXP.id_HR " + + "LEFT JOIN " + + "( " + + " SELECT " + + " HR.id AS id_HR, CONCAT(HR.first_name, ' ', HR.last_name) AS user_name, SUM(TE.amount_to_transfer) AS total_transfer " + + " FROM APC_TRANSFER TE " + + " INNER JOIN APC_USER U ON TE.id_user_transmitter = U.id " + + " INNER JOIN APC_HUMAN_RESOURCE HR ON U.id_human_resource = HR.id " + + " WHERE DATE(TE.created_on) BETWEEN DATE(:startDate) AND DATE(:endDate) " + + " GROUP BY HR.id " + + ")TE ON HR.id = TE.id_HR " + + "LEFT JOIN " + + "( " + + " SELECT " + + " HR.id AS id_HR, CONCAT(HR.first_name, ' ', HR.last_name) AS user_name, SUM(TR.amount_to_transfer) AS total_transfer " + + " FROM APC_TRANSFER TR " + + " INNER JOIN APC_USER U ON TR.id_user_receiver = U.id " + + " INNER JOIN APC_HUMAN_RESOURCE HR ON U.id_human_resource = HR.id " + + " WHERE DATE(TR.created_on) BETWEEN DATE(:startDate) AND DATE(:endDate) " + + " GROUP BY HR.id " + + ")TR ON HR.id = TR.id_HR " + + "WHERE HR.human_resource_status = 'ENEBLED';"; +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsVehicleController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsVehicleController.java new file mode 100644 index 0000000..39cbf94 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsVehicleController.java @@ -0,0 +1,53 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.catalog.Vehicle; +import com.arrebol.apc.model.views.constance.StatsVehicleCfg; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class StatsVehicleController implements Serializable { + + public List fillVehicleDataTable(Date startDate, Date endDate) { + logger.debug("fillVehicleDataTable"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(Vehicle.class, StatsVehicleCfg.QUERY_FIND_ALL_VEHICLES, parameters); + + return dataComplete; + } + + final Logger logger = LogManager.getLogger(StatsAdvancesController.class); + private final GenericEntityRepository genericEntityRepository; + + public StatsVehicleController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsZeroPaymentsController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsZeroPaymentsController.java new file mode 100644 index 0000000..0dbd44e --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/StatsZeroPaymentsController.java @@ -0,0 +1,113 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.constance.GoalCfg; +import com.arrebol.apc.model.views.StatsZeroPaymentsView; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import com.arrebol.apc.model.views.constance.StatsZeroPaymentsViewCfg; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; + +/** + * + * @author David Rodriguez + */ +public class StatsZeroPaymentsController implements Serializable { + + public List fillZeroPaymentsDataTable(Date startDate, Date endDate, String idUser) { + logger.debug("fillZeroPaymentsDataTable"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = new ArrayList<>(); + + if (idUser != null && !idUser.equals("")) { + parameters.add(new ModelParameter(StatsZeroPaymentsViewCfg.FIELD_USER, idUser)); + dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsZeroPaymentsView.class, StatsZeroPaymentsViewCfg.QUERY_FIND_ALL_ZERO_PAYMENTS_BETWEEN_DATES_USER, parameters); + } else { + dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsZeroPaymentsView.class, StatsZeroPaymentsViewCfg.QUERY_FIND_ALL_ZERO_PAYMENTS_BETWEEN_DATES, parameters); + } + + Map mapDataZeroPayments = new HashMap<>(); + for (StatsZeroPaymentsView zeroPayments : dataComplete) { + if (mapDataZeroPayments.get(zeroPayments.getIdUser()) != null) { + if(!mapDataZeroPayments.get(zeroPayments.getIdUser()).getRouteName().contains(zeroPayments.getRouteName())){ + mapDataZeroPayments.get(zeroPayments.getIdUser()).setRouteName(mapDataZeroPayments.get(zeroPayments.getIdUser()).getRouteName() + ", " + zeroPayments.getRouteName()); + } + } else { + mapDataZeroPayments.put(zeroPayments.getIdUser(), zeroPayments); + } + } + // Asigna todas las rutas al usuario + dataComplete.forEach(d -> d.setRouteName(mapDataZeroPayments.get(d.getIdUser()).getRouteName())); + + mapDataZeroPayments.clear(); + for (StatsZeroPaymentsView zeroPayments : dataComplete) { + if (mapDataZeroPayments.get(zeroPayments.getIdUser()) != null) { + mapDataZeroPayments.get(zeroPayments.getIdUser()).setTotalZeroPayments(mapDataZeroPayments.get(zeroPayments.getIdUser()).getTotalZeroPayments().add(BigDecimal.ONE)); + } else { + zeroPayments.setTotalZeroPayments(BigDecimal.ONE); + mapDataZeroPayments.put(zeroPayments.getIdUser(), zeroPayments); + } + } + dataComplete.clear(); + dataComplete.addAll(mapDataZeroPayments.values()); + + dataComplete.sort(Comparator.comparing(StatsZeroPaymentsView::getRouteName)); + + return dataComplete; + } + + public int fillTotalZeroPayments(Date startDate, Date endDate) { + logger.debug("fillTotalZeroPayments"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(GoalCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(GoalCfg.PARAM_END_DATE, endDate)); + List dataComplete = genericEntityRepository.xmlQueryAPCEntities(StatsZeroPaymentsView.class, StatsZeroPaymentsViewCfg.QUERY_FIND_ALL_ZERO_PAYMENTS_BETWEEN_DATES, parameters); + + return dataComplete.size(); + } + + final Logger logger = LogManager.getLogger(StatsZeroPaymentsController.class); + private final GenericEntityRepository genericEntityRepository; + + public StatsZeroPaymentsController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/TransferController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/TransferController.java new file mode 100644 index 0000000..adc2c83 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/TransferController.java @@ -0,0 +1,110 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.Transfer; +import com.arrebol.apc.model.admin.constance.TransferCfg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class TransferController implements Serializable{ + + /** + * + * Searching all transfer by office. + * + * @param officeId + * @param startDate + * @param endDate + * @return + */ + public List fillTransferDatatable(String officeId, Date startDate, Date endDate) { + logger.debug("fillTransferDatatable"); + List parameters = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.add(Calendar.DAY_OF_YEAR, 1); + startDate = calendar.getTime(); + + Calendar calendarF = Calendar.getInstance(); + calendarF.setTime(endDate); + calendarF.add(Calendar.DAY_OF_YEAR, 1); + endDate = calendarF.getTime(); + + parameters.add(new ModelParameter(TransferCfg.FIELD_OFFICE, new Office(officeId))); + parameters.add(new ModelParameter(TransferCfg.PARAM_START_DATE, startDate)); + parameters.add(new ModelParameter(TransferCfg.PARAM_END_DATE, endDate)); + + return genericEntityRepository.xmlQueryAPCEntities(Transfer.class, TransferCfg.QUERY_FIND_ALL_TRANFERS_BY_OFFICE_BETWEEN_DATES, parameters); + } + + /** + * + * @param transfer + * @return boolean + */ + public boolean saveTransfer(Transfer transfer) { + logger.debug("saveTransfer"); + boolean success = genericEntityRepository.insertAPCEntity(transfer); + + return success; + } + + /** + * + * @param transfer + * @return boolean + */ + public boolean updateByTransferId(Transfer transfer) { + logger.debug("updateByTransferId"); + + return genericEntityRepository.updateAPCEntity(transfer); + } + + /** + * + * @param status + * @param transferIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updateTransferByStatus(ActiveStatus status, String transferIdToUpdate, String lastUpdatedBy) { + logger.debug("updateTransferByStatus"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(TransferCfg.FIELD_ACTIVE_STATUS, status)); + parameters.add(new ModelParameter(TransferCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(TransferCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(TransferCfg.FIELD_ID, transferIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(TransferCfg.QUERY_UPDATE_TRANSFER_BY_ACTIVE_STATUS, parameters); + } + + final Logger logger = LogManager.getLogger(TransferController.class); + private final GenericEntityRepository genericEntityRepository; + + public TransferController() { + this.genericEntityRepository = new GenericEntityRepository(); + } + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/admin/VehicleController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/VehicleController.java new file mode 100644 index 0000000..1d4e7e4 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/admin/VehicleController.java @@ -0,0 +1,170 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.Bonus; +import com.arrebol.apc.model.admin.constance.BonusCfg; +import com.arrebol.apc.model.catalog.Vehicle; +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.constance.HumanResourceByOfficeCfg; +import com.arrebol.apc.model.core.constance.HumanResourceCfg; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.HumanResourceStatus; +import com.arrebol.apc.repository.GenericEntityRepository; +import com.arrebol.apc.repository.core.HumanResourceRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import javax.persistence.Tuple; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class VehicleController implements Serializable { + + /** + * Find where status EQUALS TO status. + * + * @param office + * @param status + * @param hrOwnerId Human resource id from user logged. + * @return + */ + public List findEmployeesByType(Office office, HumanResourceStatus status, String hrOwnerId) { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(HumanResourceCfg.FIELD_OFFICE, office)); + parameters.add(new ModelParameter(HumanResourceCfg.FIELD_HR_STATUS, status)); + parameters.add(new ModelParameter(HumanResourceByOfficeCfg.HUMAN_RESOURCE, new HumanResource(hrOwnerId))); + + return genericEntityRepository.xmlQueryAPCEntities(HumanResource.class, HumanResourceCfg.QUERY_FIND_ALL_BY_STATUS, parameters); + } + + /** + * Find where status IN status. + * + * @param office + * @param statusLst + * @param hrOwnerId Human resource id from user logged. + * @return + */ + public List findEmployeesInType(Office office, List statusLst, String hrOwnerId) { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(HumanResourceCfg.FIELD_OFFICE, office)); + parameters.add(new ModelParameter(HumanResourceCfg.FIELD_HR_STATUS, statusLst)); + parameters.add(new ModelParameter(HumanResourceByOfficeCfg.HUMAN_RESOURCE, new HumanResource(hrOwnerId))); + + return genericEntityRepository.xmlQueryAPCEntities(HumanResource.class, HumanResourceCfg.QUERY_FIND_ALL_IN_STATUS, parameters); + } + + /** + * Save an entity. + * + * @param vehicle + * @return + */ + public boolean saveVehicle(Vehicle vehicle) { + logger.debug("saveVehicle"); + + boolean success = genericEntityRepository.insertAPCEntity(vehicle); + return success; + } + + /** + * + * @param hr + * @param updateAvatar + * @return + */ + public boolean updateByHumanResourceId(HumanResource hr, boolean updateAvatar) { + logger.debug("updateByHumanResourceId"); + + return humanResourceRepository.updateByHumanResourceId(hr, updateAvatar); + } + + /** + * + * @param status + * @param userIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updateHRByStatus(HumanResourceStatus status, String userIdToUpdate, String lastUpdatedBy) { + logger.debug("updateHRByStatus"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(HumanResourceCfg.FIELD_HR_STATUS, status)); + parameters.add(new ModelParameter(HumanResourceCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(HumanResourceCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(HumanResourceCfg.FIELD_ID, userIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(HumanResourceCfg.UPDATE_HR_BY_STATUS, parameters); + } + + /** + * + * @param officeId + * @return + */ + public List findAllActiveBonus(String officeId) { + logger.debug("findAllActiveBonus"); + + List results = new ArrayList<>(); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(BonusCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + parameters.add(new ModelParameter(BonusCfg.FIELD_OFFICE, new Office(officeId))); + + List tuples = genericEntityRepository.xmlQueryAPCEntities( + Tuple.class, + BonusCfg.QUERY_FIND_ALL_ACTIVE_BONUS, + parameters); + + tuples.forEach((tuple) -> { + results.add(new Bonus(tuple.get("id").toString(), tuple.get("name").toString())); + }); + + } catch (Exception e) { + logger.error("findAllActiveBonus", e); + } + + return results; + } + + /** + * + * @param hrId + * @return + */ + public HumanResource findHumanResourceById(String hrId) { + logger.debug("findHumanResourceById"); + + return (HumanResource) genericEntityRepository.selectAPCEntityById(HumanResource.class, hrId); + } + + private static final long serialVersionUID = 2527037592427439763L; + final Logger logger = LogManager.getLogger(VehicleController.class); + + private final GenericEntityRepository genericEntityRepository; + private final HumanResourceRepository humanResourceRepository; + + public VehicleController() { + this.genericEntityRepository = new GenericEntityRepository(); + this.humanResourceRepository = new HumanResourceRepository(); + } + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/catalog/LoanTypeController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/catalog/LoanTypeController.java new file mode 100644 index 0000000..367d222 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/catalog/LoanTypeController.java @@ -0,0 +1,85 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.catalog; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.constance.LoanTypeCfg; +import com.arrebol.apc.model.loan.LoanType; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class LoanTypeController implements Serializable{ + + /** + * + * Searching all loans type. + * + * @param officeId + * @return + */ + public List fillLoanTypeDatatable(String officeId) { + logger.debug("fillLoanTypeDatatable"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanTypeCfg.FIELD_OFFICE, new Office(officeId))); + + return genericEntityRepository.xmlQueryAPCEntities(LoanType.class, LoanTypeCfg.QUERY_FIND_ALL_DATA_LOAN_TYPE_BY_OFFICE, parameters); + } + + /** + * + * @param loanType + * @return boolean + */ + public boolean saveLoanType(LoanType loanType) { + logger.debug("saveLoanTypeController"); + boolean success = genericEntityRepository.insertAPCEntity(loanType); + + return success; + } + + /** + * + * @param loanType + * @return boolean + */ + public boolean updateByLoanTypeId(LoanType loanType) { + logger.debug("updateByLoanTypeId"); + + return genericEntityRepository.updateAPCEntity(loanType); + } + + /** + * + * Searching loantype by id. + * + * @param loanTypeId + * @return + */ + public LoanType getLoanTypeById(String loanTypeId) { + logger.debug("getLoanTypeById"); + + return (LoanType) genericEntityRepository.selectAPCEntityById(LoanType.class, loanTypeId); + } + + final Logger logger = LogManager.getLogger(LoanTypeController.class); + private final GenericEntityRepository genericEntityRepository; + + public LoanTypeController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/catalog/RoleController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/catalog/RoleController.java new file mode 100644 index 0000000..8fb8774 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/catalog/RoleController.java @@ -0,0 +1,93 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.catalog; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.catalog.RoleCtlg; +import com.arrebol.apc.model.catalog.constance.RoleCfg; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class RoleController implements Serializable{ + + /** + * + * Searching all roles. + * + * @return + */ + public List fillRolesDatatable() { + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(RoleCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + + return genericEntityRepository.xmlQueryAPCEntities(RoleCtlg.class, RoleCfg.QUERY_FIND_ALL_ROLES, parameters); + } + + /** + * + * @param role + * @return boolean + */ + public boolean saveRoles(RoleCtlg role) { + logger.debug("saveRolesController"); + boolean success = genericEntityRepository.insertAPCEntity(role); + + return success; + } + + /** + * + * @param role + * @return boolean + */ + public boolean updateByRoleId(RoleCtlg role) { + logger.debug("updateByRoleId"); + + return genericEntityRepository.updateAPCEntity(role); + } + + /** + * + * @param status + * @param roleIdToUpdate + * @return + */ + public boolean updateRoleByStatus(ActiveStatus status, String roleIdToUpdate, String lastUpdatedBy) { + logger.debug("updateRoleByStatus"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(RoleCfg.FIELD_ACTIVE_STATUS, status)); + parameters.add(new ModelParameter(RoleCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(RoleCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(RoleCfg.FIELD_ID, roleIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(RoleCfg.UPDATE_ROLE_BY_STATUS, parameters); + } + + + final Logger logger = LogManager.getLogger(RoleController.class); + private final GenericEntityRepository genericEntityRepository; + + public RoleController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/catalog/RouteController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/catalog/RouteController.java new file mode 100644 index 0000000..b9a7a04 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/catalog/RouteController.java @@ -0,0 +1,96 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.catalog; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.catalog.constance.RouteCfg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class RouteController implements Serializable { + + /** + * + * Searching all roles. + * + * @param officeId + * @return + */ + public List fillRoutesDatatable(String officeId) { + logger.debug("fillRoutesDatatable"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(RouteCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + parameters.add(new ModelParameter(RouteCfg.FIELD_OFFICE, new Office(officeId))); + + return genericEntityRepository.xmlQueryAPCEntities(RouteCtlg.class, RouteCfg.QUERY_FIND_ALL_ROUTES, parameters); + } + + /** + * + * @param route + * @return boolean + */ + public boolean saveRoute(RouteCtlg route) { + logger.debug("saveRouteController"); + boolean success = genericEntityRepository.insertAPCEntity(route); + + return success; + } + + /** + * + * @param route + * @return boolean + */ + public boolean updateByRouteId(RouteCtlg route) { + logger.debug("updateByRouteId"); + + return genericEntityRepository.updateAPCEntity(route); + } + + /** + * + * @param status + * @param routeIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updateRouteByStatus(ActiveStatus status, String routeIdToUpdate, String lastUpdatedBy) { + logger.debug("updateRouteByStatus"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(RouteCfg.FIELD_ACTIVE_STATUS, status)); + parameters.add(new ModelParameter(RouteCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(RouteCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(RouteCfg.FIELD_ID, routeIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(RouteCfg.UPDATE_ROUTE_BY_STATUS, parameters); + } + + private static final long serialVersionUID = -6277126340752974003L; + final Logger logger = LogManager.getLogger(RoleController.class); + private final GenericEntityRepository genericEntityRepository; + + public RouteController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/dashboard/CustomerWithoutRenovationViewService.java b/apc-controller/src/main/java/com/arrebol/apc/controller/dashboard/CustomerWithoutRenovationViewService.java new file mode 100644 index 0000000..6332a4f --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/dashboard/CustomerWithoutRenovationViewService.java @@ -0,0 +1,41 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.dashboard; + +import com.arrebol.apc.model.views.CustomerWithoutRenovationView; +import java.util.List; +import java.util.Map; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface CustomerWithoutRenovationViewService { + + /** + * + * @param officeId + * @param filterBy + * @param map + * @return + */ + public Long countAllCustomerWithOutRenovationByOfficePaginator(String officeId, String filterBy, Map map); + + /** + * + * @param officeId + * @param first + * @param pageSize + * @param filterBy + * @param sortBy + * @param sorting + * @param map + * @return + */ + public List findAllCustomerWithOutRenovationByOfficePaginator(String officeId, int first, int pageSize, String filterBy, String sortBy, String sorting, Map map); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/dashboard/CustomerWithoutRenovationViewServiceImpl.java b/apc-controller/src/main/java/com/arrebol/apc/controller/dashboard/CustomerWithoutRenovationViewServiceImpl.java new file mode 100644 index 0000000..1ecc584 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/dashboard/CustomerWithoutRenovationViewServiceImpl.java @@ -0,0 +1,154 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.dashboard; + +import com.arrebol.apc.controller.util.FilterMap; +import com.arrebol.apc.controller.util.HibernateUtil; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.views.CustomerWithoutRenovationView; +import java.util.List; +import java.util.Map; +import javax.enterprise.context.RequestScoped; +import javax.persistence.Query; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.Transaction; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@RequestScoped +public class CustomerWithoutRenovationViewServiceImpl implements CustomerWithoutRenovationViewService { + + @Override + public Long countAllCustomerWithOutRenovationByOfficePaginator(String officeId, String filterBy, Map map) { + logger.debug("countAllCustomerWithOutRenovationByOfficePaginator"); + + Long result = 0l; + Session session = null; + Transaction transaction = null; + try { + session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + StringBuilder sqlQuery = new StringBuilder("SELECT COUNT(id) FROM CustomerWithoutRenovationView "); + + sqlQuery.append(buildQueryForCustomerWithoutRenovationView(filterBy, map)); + + result = session + .createQuery(sqlQuery.toString(), Long.class) + .setParameter("office", new Office(officeId)) + .getSingleResult(); + + transaction.commit(); + } catch (HibernateException e) { + logger.error("countAllCustomerWithOutRenovationByOfficePaginator Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method countAllCustomerWithOutRenovationByOfficePaginator() ", e); + if (null != transaction) { + transaction.rollback(); + throw e; + } + } finally { + if (null != session) { + session.close(); + } + } + return result; + } + + @Override + public List findAllCustomerWithOutRenovationByOfficePaginator(String officeId, int first, int pageSize, String filterBy, String sortBy, String sorting, Map map) { + logger.debug("findAllCustomerWithOutRenovationByOfficePaginator"); + + List results = null; + Session session = null; + Transaction transaction = null; + try { + session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + StringBuilder sqlQuery = new StringBuilder("FROM CustomerWithoutRenovationView "); + + sqlQuery.append(buildQueryForCustomerWithoutRenovationView(filterBy, map)); + sqlQuery.append(" ORDER BY "); + + if (null == sortBy || "".equals(sortBy)) { + sqlQuery.append("personName ASC"); + } else { + sqlQuery.append(sortBy); + sqlQuery.append(" "); + sqlQuery.append(sorting); + } + + Query query = session.createQuery(sqlQuery.toString(), CustomerWithoutRenovationView.class); + + query.setFirstResult(first); + query.setMaxResults(pageSize); + + results = query.setParameter("office", new Office(officeId)).getResultList(); + + transaction.commit(); + } catch (HibernateException e) { + logger.error("findAllCustomerWithOutRenovationByOfficePaginator Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method findAllCustomerWithOutRenovationByOfficePaginator() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } finally { + if (null != session) { + session.close(); + } + } + return results; + } + + /** + * + * @param filterBy + * @param map + * @return + */ + private StringBuilder buildQueryForCustomerWithoutRenovationView( + String filterBy, Map map) { + StringBuilder sqlQuery = new StringBuilder("WHERE office = :office "); + + if (null != filterBy & !"".equals(filterBy)) { + sqlQuery.append("AND (personName LIKE '"); + sqlQuery.append(filterBy); + sqlQuery.append("' OR "); + + sqlQuery.append("routeName LIKE '"); + sqlQuery.append(filterBy); + sqlQuery.append("' OR "); + + sqlQuery.append("strPaymentDate LIKE '"); + sqlQuery.append(filterBy); + sqlQuery.append("') "); + } + + sqlQuery.append(FilterMap.genericFilterByMapping(map, true)); + + return sqlQuery; + } + + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/dashboard/DashboardController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/dashboard/DashboardController.java new file mode 100644 index 0000000..b2a942b --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/dashboard/DashboardController.java @@ -0,0 +1,150 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.dashboard; + +import com.arrebol.apc.controller.util.FilterMap; +import com.arrebol.apc.controller.util.HibernateUtil; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.payroll.TotalExpectedPaymentDailyByUser; +import com.arrebol.apc.model.payroll.constance.TotalExpectedPaymentDailyByUserCfg; +import com.arrebol.apc.model.views.AdvanceUserDailyDetail; +import com.arrebol.apc.model.views.AdvanceUserDailyView; +import com.arrebol.apc.model.views.CustomerWithoutRenovationView; +import com.arrebol.apc.model.views.TotalLoansByOfficeView; +import com.arrebol.apc.model.views.constance.AdvanceUserDailyDetailViewCfg; +import com.arrebol.apc.model.views.constance.AdvanceUserDailyViewCfg; +import com.arrebol.apc.model.views.constance.CustomerWithoutRenovationViewCfg; +import com.arrebol.apc.model.views.constance.TotalLoansApprovedByOfficeViewCfg; +import com.arrebol.apc.model.views.constance.TotalLoansByOfficeViewCfg; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import javax.persistence.Query; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.Transaction; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class DashboardController implements Serializable { + + /** + * + * Searching loans by office. + * + * @param officeId + * @return + */ + public List fillAllLoansByOffice(String officeId) { + logger.debug("fillClosingDayDatatable"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(TotalLoansByOfficeViewCfg.FIELD_VIEW_OFFICE, officeId)); + + return genericEntityRepository.xmlQueryAPCEntities(TotalLoansByOfficeView.class, TotalLoansByOfficeViewCfg.QUERY_FIND_ALL_LOANS_BY_OFFICE, parameters); + } + + /** + * + * Searching loans by office. + * + * @param officeId + * @return + */ + public BigDecimal sumLoansApprovedByOffice(String officeId) { + logger.debug("sumLoansApprovedByOffice"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(TotalLoansApprovedByOfficeViewCfg.FIELD_VIEW_OFFICE, officeId)); + + return (BigDecimal) genericEntityRepository.xmlQueryAPCEntityUniqueResult(BigDecimal.class, TotalLoansApprovedByOfficeViewCfg.QUERY_SUM_ALL_LOANS_BY_OFFICE, parameters); + } + + public Long getLoansSumPaymentDailyByUser(String userId) { + logger.debug("getLoansSumPaymentDailyByUser"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(TotalLoansByOfficeViewCfg.FIELD_VIEW_USER, userId)); + + return (Long) genericEntityRepository.xmlQueryAPCEntityUniqueResult(Long.class, TotalLoansByOfficeViewCfg.QUERY_COUNT_ALL_LOANS_BY_USER, parameters); + } + + public BigDecimal getLoansSumPaymentDailyByUserMoney(String userId) { + logger.debug("getLoansSumPaymentDailyByUserMoney"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(TotalLoansByOfficeViewCfg.FIELD_VIEW_USER, userId)); + + return (BigDecimal) genericEntityRepository.xmlQueryAPCEntityUniqueResult(BigDecimal.class, TotalLoansByOfficeViewCfg.QUERY_FIND_ALL_LOANS_BY_USER, parameters); + } + + /** + * + * @param advance + * @return boolean + */ + public boolean saveTotalExpectedPaymentDailyByUser(TotalExpectedPaymentDailyByUser totalExpectedPaymentDailyByUser) { + logger.debug("saveTotalExpectedPaymentDailyByUser"); + boolean success = genericEntityRepository.insertAPCEntity(totalExpectedPaymentDailyByUser); + + return success; + + } + + public Long verifyTotalExpectedPaymentDailyByUserCreatedByOffice(String officeid) { + logger.debug("verifyTotalExpectedPaymentDailyByUserCreatedByOffice"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(TotalExpectedPaymentDailyByUserCfg.FIELD_OFFICE, new Office(officeid))); + + return (Long) genericEntityRepository.xmlQueryAPCEntityUniqueResult(Long.class, TotalExpectedPaymentDailyByUserCfg.QUERY_SELECT_MAX_DATE_BY_CURDATE, parameters); + } + + public List fillAllAdvanceUserDailyByOffice(String officeId) { + logger.debug("fillAllAdvanceUserDailyByOffice"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(AdvanceUserDailyViewCfg.FIELD_VIEW_OFFICE, new Office(officeId))); + + return genericEntityRepository.xmlQueryAPCEntities(AdvanceUserDailyView.class, AdvanceUserDailyViewCfg.QUERY_FIND_ALL_ADVANCE_USER_DAILY_BY_OFFICE, parameters); + } + + public List findAllCustomerWithOutRenovationByOffice(String officeId) { + logger.debug("findAllCustomerWithOutRenovationByOffice"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(CustomerWithoutRenovationViewCfg.FIELD_VIEW_OFFICE, new Office(officeId))); + + return genericEntityRepository.xmlQueryAPCEntities(CustomerWithoutRenovationView.class, CustomerWithoutRenovationViewCfg.QUERY_FIND_ALL_CUSTOMER_WITHOUT_RENOVATION_BY_OFFICE, parameters); + } + + public List findAllAdvancesUserDailyDetailByUser(String userId) { + logger.debug("findAllAdvancesUserDailyDetailByUser"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(AdvanceUserDailyDetailViewCfg.FIELD_VIEW_USER, userId)); + + return genericEntityRepository.xmlQueryAPCEntities(AdvanceUserDailyDetail.class, AdvanceUserDailyDetailViewCfg.QUERY_FIND_ALL_ADVANCE_USER_DAILY_DETAIL_BY_USER, parameters); + } + + final Logger logger = LogManager.getLogger(DashboardController.class); + private final GenericEntityRepository genericEntityRepository; + + public DashboardController() { + this.genericEntityRepository = new GenericEntityRepository(); + } + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/drive/DriverController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/drive/DriverController.java new file mode 100644 index 0000000..ed4fd2f --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/drive/DriverController.java @@ -0,0 +1,1434 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.drive; + +import com.arrebol.apc.controller.util.ConnectionManager; +import com.arrebol.apc.controller.util.HibernateUtil; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.views.CobranzaLastWeekByUserView; +import com.arrebol.apc.model.views.CobranzaWeekByUserView; +import com.arrebol.apc.model.views.ColocationLastWeekByUserView; +import com.arrebol.apc.model.views.ColocationWeekByUserView; +import com.arrebol.apc.model.views.InformationLoanLastWeekView; +import com.arrebol.apc.model.views.InformationLoanWeekView; +import com.arrebol.apc.model.views.ResumeNewCustomerLastWeekView; +import com.arrebol.apc.model.views.ResumeNewCustomerWeekView; +import com.arrebol.apc.model.views.ResumenInOutLastWeekByUserView; +import com.arrebol.apc.model.views.ResumenInOutWeekByUserView; +import com.arrebol.apc.model.views.ResumenTotalLastWeekView; +import com.arrebol.apc.model.views.ResumenTotalWeekView; +import com.arrebol.apc.model.views.SubtotalLastWeekByUserView; +import com.arrebol.apc.model.views.SubtotalWeekByUserView; +import com.arrebol.apc.model.views.constance.InformationLoanWeekViewCfg; +import com.arrebol.apc.model.views.constance.ResumenNewCustomerLastWeekViewCfg; +import com.arrebol.apc.model.views.constance.ResumenNewCustomerWeekViewCfg; +import com.arrebol.apc.model.views.constance.ResumenTotalLastWeekViewCfg; +import com.arrebol.apc.model.views.constance.ResumenTotalWeekViewCfg; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.Transaction; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class DriverController extends ConnectionManager implements Serializable{ + + /** + * + * Searching all loans with activity at this week by office. + * + * @param officeId + * @return + */ + public List getAllLoanThisWeekByOffice(String officeId) { + logger.debug("getAllLoanThisWeekByOffice"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(InformationLoanWeekViewCfg.FIELD_VIEW_OFFICE, officeId)); + + return genericEntityRepository.xmlQueryAPCEntities(InformationLoanWeekView.class, InformationLoanWeekViewCfg.QUERY_FIND_ALL_LOANS_THIS_WEEK_BY_OFFICE, parameters); + } + + public List getAllLoanLastWeekByOffice(String officeId) { + logger.debug("getAllLoanLastWeekByOffice"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(InformationLoanWeekViewCfg.FIELD_VIEW_OFFICE, officeId)); + + return genericEntityRepository.xmlQueryAPCEntities(InformationLoanLastWeekView.class, InformationLoanWeekViewCfg.QUERY_FIND_ALL_LOANS_LAST_WEEK_BY_OFFICE, parameters); + } + + public List getAllColocationWeekByOffice(String officeId) { + logger.debug("getAllColocationWeekByOffice"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(InformationLoanWeekViewCfg.FIELD_VIEW_OFFICE_COLOCATION, new Office(officeId))); + + return genericEntityRepository.xmlQueryAPCEntities(ColocationWeekByUserView.class, InformationLoanWeekViewCfg.QUERY_FIND_ALL_COLOCATION_WEEK_BY_OFFICE, parameters); + } + + public List getAllColocationLastWeekByOffice(String officeId) { + logger.debug("getAllColocationLastWeekByOffice"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(InformationLoanWeekViewCfg.FIELD_VIEW_OFFICE_COLOCATION, new Office(officeId))); + + return genericEntityRepository.xmlQueryAPCEntities(ColocationLastWeekByUserView.class, InformationLoanWeekViewCfg.QUERY_FIND_ALL_COLOCATION_LAST_WEEK_BY_OFFICE, parameters); + } + + public List getAllSubtotalLastWeekByOffice(String officeId) { + logger.debug("getAllSubtotalLastWeekByOffice"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(InformationLoanWeekViewCfg.FIELD_VIEW_OFFICE_COLOCATION, new Office(officeId))); + + return genericEntityRepository.xmlQueryAPCEntities(SubtotalLastWeekByUserView.class, InformationLoanWeekViewCfg.QUERY_FIND_ALL_SUBTOTAL_LAST_WEEK_BY_OFFICE, parameters); + } + + public List getAllSubtotalThisWeekByOffice(String officeId) { + logger.debug("getAllSubtotalThisWeekByOffice"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(InformationLoanWeekViewCfg.FIELD_VIEW_OFFICE_COLOCATION, new Office(officeId))); + + return genericEntityRepository.xmlQueryAPCEntities(SubtotalWeekByUserView.class, InformationLoanWeekViewCfg.QUERY_FIND_ALL_SUBTOTAL_WEEK_BY_OFFICE, parameters); + } + + public List getAllResumenInOutThisWeekByOffice(String officeId) { + logger.debug("getAllResumenInOutThisWeekByOffice"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(InformationLoanWeekViewCfg.FIELD_VIEW_OFFICE_COLOCATION, new Office(officeId))); + + return genericEntityRepository.xmlQueryAPCEntities(ResumenInOutWeekByUserView.class, InformationLoanWeekViewCfg.QUERY_FIND_ALL_RESUMEN_IN_OUT_WEEK_BY_OFFICE, parameters); + } + + public List getAllResumenInOutLastWeekByOffice(String officeId) { + logger.debug("getAllResumenInOutLastWeekByOffice"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(InformationLoanWeekViewCfg.FIELD_VIEW_OFFICE_COLOCATION, new Office(officeId))); + + return genericEntityRepository.xmlQueryAPCEntities(ResumenInOutLastWeekByUserView.class, InformationLoanWeekViewCfg.QUERY_FIND_ALL_RESUMEN_IN_OUT_LAST_WEEK_BY_OFFICE, parameters); + } + + public List getAllCobranzaLastWeekByOffice(String officeId) { + logger.debug("getAllCobranzaLastWeekByOffice"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(InformationLoanWeekViewCfg.FIELD_VIEW_OFFICE_COLOCATION, new Office(officeId))); + + return genericEntityRepository.xmlQueryAPCEntities(CobranzaLastWeekByUserView.class, InformationLoanWeekViewCfg.QUERY_FIND_ALL_COBRANZA_LAST_WEEK_BY_OFFICE, parameters); + } + + public List getAllCobranzaThisWeekByOffice(String officeId) { + logger.debug("getAllCobranzaThisWeekByOffice"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(InformationLoanWeekViewCfg.FIELD_VIEW_OFFICE_COLOCATION, new Office(officeId))); + + return genericEntityRepository.xmlQueryAPCEntities(CobranzaWeekByUserView.class, InformationLoanWeekViewCfg.QUERY_FIND_ALL_COBRANZA_WEEK_BY_OFFICE, parameters); + } + + public List getAllResumenTotalLastWeekByOffice(String officeId) { + logger.debug("getAllResumenTotalLastWeekByOffice"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(ResumenTotalLastWeekViewCfg.FIELD_VIEW_OFFICE, officeId)); + + return genericEntityRepository.xmlQueryAPCEntities(ResumenTotalLastWeekView.class, ResumenTotalLastWeekViewCfg.QUERY_FIND_ALL_RESUMEN_TOTAL, parameters); + } + + public List getAllResumenNewCustomerLastWeekByOffice() { + logger.debug("getAllResumenNewCustomerLastWeekByOffice"); + List parameters = new ArrayList<>(); + + return genericEntityRepository.xmlQueryAPCEntities(ResumeNewCustomerLastWeekView.class, ResumenNewCustomerLastWeekViewCfg.QUERY_FIND_ALL_RESUMEN_NEW_CUSTOMER, parameters); + } + + public List getAllResumenNewCustomerWeekByOffice() { + logger.debug("getAllResumenNewCustomerWeekByOffice"); + List parameters = new ArrayList<>(); + + return genericEntityRepository.xmlQueryAPCEntities(ResumeNewCustomerWeekView.class, ResumenNewCustomerWeekViewCfg.QUERY_FIND_ALL_RESUMEN_NEW_CUSTOMER, parameters); + } + + public List getAllResumenTotalWeekByOffice(String officeId) { + logger.debug("getAllResumenTotalWeekByOffice"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(ResumenTotalWeekViewCfg.FIELD_VIEW_OFFICE, officeId)); + + return genericEntityRepository.xmlQueryAPCEntities(ResumenTotalWeekView.class, ResumenTotalWeekViewCfg.QUERY_FIND_ALL_RESUMEN_TOTAL, parameters); + } + + /** + * + * Searching all loans with activity at this week by office. + * @param startDate + * @param officeId + * @return + */ + public List getAllLoanWeekByOfficeMySQLQuery(String startDate, String idOffice) { + logger.debug("getAllLoanWeekByOfficeMySQLQuery"); + logger.debug("Fecha inicial: " + startDate); + + List dataList = new ArrayList<>(); + Transaction transaction = null; + + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); + + List rows = session.createNativeQuery(queryLoanWeek) + .setParameter("startDate", startDate) + .setParameter("idOffice", idOffice) + .getResultList(); + + transaction.commit(); + + rows.forEach((row) -> { + Object[] results = (Object[]) row; + + // Create Data Row + InformationLoanWeekView loanWeek = new InformationLoanWeekView( ); + loanWeek.setId(results[0] == null ? "" : results[0].toString()); + loanWeek.setIdUser(results[1] == null ? "" : results[1].toString()); + loanWeek.setIdOffice(results[2] == null ? "" : results[2].toString()); + try { + loanWeek.setFecha(DATE_FORMAT.parse(results[3].toString())); + } catch (ParseException ex) { + logger.error("driver week", ex); + } + loanWeek.setApoyos(new BigDecimal(results[4] == null ? "0.0" : results[4].toString())); + loanWeek.setApoyosTotal(new BigDecimal(results[5] == null ? "0.0" : results[5].toString())); + loanWeek.setComisionApertura(new BigDecimal(results[6] == null ? "0.0" : results[6].toString())); + loanWeek.setAval(results[7] == null ? "" : results[7].toString()); + loanWeek.setCustomer(results[8] == null ? "" : results[8].toString()); + loanWeek.setDocumentoPor(new BigDecimal(results[9] == null ? "0.0" : results[9].toString())); + loanWeek.setAbonoDiario(new BigDecimal(results[10] == null ? "0.0" : results[10].toString())); + loanWeek.setAmountPaid(new BigDecimal(results[11] == null ? "0.0" : results[11].toString())); + loanWeek.setSaldoInsoluto(new BigDecimal(results[12] == null ? "0.0" : results[12].toString())); + loanWeek.setRouteName(results[13] == null ? "" : results[13].toString()); + loanWeek.setAsesor(results[14] == null ? "" : results[14].toString()); + loanWeek.setNumFee(Integer.parseInt(results[15] == null ? "0" : results[15].toString())); + loanWeek.setPaymentMonday(new BigDecimal(results[16] == null ? "0.0" : results[16].toString())); + loanWeek.setFeeMonday(new BigDecimal(results[17] == null ? "0.0" : results[17].toString())); + loanWeek.setPaymentTuesday(new BigDecimal(results[18] == null ? "0.0" : results[18].toString())); + loanWeek.setFeeTuesday(new BigDecimal(results[19] == null ? "0.0" : results[19].toString())); + loanWeek.setPaymentWednesday(new BigDecimal(results[20] == null ? "0.0" : results[20].toString())); + loanWeek.setFeeWednesday(new BigDecimal(results[21] == null ? "0.0" : results[21].toString())); + loanWeek.setPaymentThursday(new BigDecimal(results[22] == null ? "0.0" : results[22].toString())); + loanWeek.setFeeThursday(new BigDecimal(results[23] == null ? "0.0" : results[23].toString())); + loanWeek.setPaymentFriday(new BigDecimal(results[24] == null ? "0.0" : results[24].toString())); + loanWeek.setFeeFriday(new BigDecimal(results[25] == null ? "0.0" : results[25].toString())); + loanWeek.setPaymentSaturday(new BigDecimal(results[26] == null ? "0.0" : results[26].toString())); + loanWeek.setFeeSaturday(new BigDecimal(results[27] == null ? "0.0" : results[27].toString())); + loanWeek.setFaltante(new BigDecimal(results[28] == null ? "0.0" : results[28].toString())); + loanWeek.setNewCustomer(results[29] == null ? "" : results[29].toString()); + loanWeek.setRenovation(results[30] == null ? "" : results[30].toString()); + loanWeek.setEstatusPrestamo(results[31] == null ? "" : results[31].toString()); + loanWeek.setNumPagosAll(new BigDecimal(results[32] == null ? "0.0" : results[32].toString())); + loanWeek.setNumPagosWeek(new BigDecimal(results[33] == null ? "0.0" : results[33].toString())); + loanWeek.setFeeTodos(new BigDecimal(results[34] == null ? "0.0" : results[34].toString())); + loanWeek.setLoanTypeName(results[35] == null ? "" : results[35].toString()); + if (results[36] == null) { + loanWeek.setFrozen(ActiveStatus.DISABLED); + } else { + if (results[36].equals(ActiveStatus.ENEBLED.getValue())) { + loanWeek.setFrozen(ActiveStatus.ENEBLED); + } else { + loanWeek.setFrozen(ActiveStatus.DISABLED); + } + } + loanWeek.setTotalPaid(new BigDecimal(results[37].toString())); + loanWeek.setNumPagosLoanType(new BigDecimal(results[38] == null ? "0.0" : results[38].toString())); + loanWeek.setMovimientosMonday(results[39] == null ? "" : results[39].toString()); + loanWeek.setMovimientosTuesday(results[40] == null ? "" : results[40].toString()); + loanWeek.setMovimientosWednesday(results[41] == null ? "" : results[41].toString()); + loanWeek.setMovimientosThursday(results[42] == null ? "" : results[42].toString()); + loanWeek.setMovimientosFriday(results[43] == null ? "" : results[43].toString()); + loanWeek.setMovimientosSaturday(results[44] == null ? "" : results[44].toString()); + loanWeek.setRenovationMonday(results[45] == null ? "" : results[45].toString()); + loanWeek.setRenovationTuesday(results[46] == null ? "" : results[46].toString()); + loanWeek.setRenovationWednesday(results[47] == null ? "" : results[47].toString()); + loanWeek.setRenovationThursday(results[48] == null ? "" : results[48].toString()); + loanWeek.setRenovationFriday(results[49] == null ? "" : results[49].toString()); + loanWeek.setRenovationSaturday(results[50] == null ? "" : results[50].toString()); + loanWeek.setReactivation(results[51] == null ? "" : results[51].toString()); + loanWeek.setWeekOfCreation(results[52] == null ? "" : results[52].toString()); + dataList.add(loanWeek); + }); + + } catch (HibernateException e) { + logger.error("Driver", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method getAllLoanWeekByOfficeMySQLQuery(" + startDate + " " + ") ", e); + rollback(transaction); + } + + return dataList; + } + + /** + * + * Searching all loans with activity at this week by office. + * @param startDate + * @param officeId + * @return + */ + public List getAllColocationWeekByOfficeMySQLQuery(String startDate, String idOffice){ + logger.debug("getAllColocationWeekByOfficeMySQLQuery"); + + List dataList = new ArrayList<>(); + Transaction transaction = null; + + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + List rows = session.createNativeQuery(queryColocation) + .setParameter("startDate", startDate) + .setParameter("idOffice", idOffice) + .getResultList(); + + transaction.commit(); + + rows.forEach((row) -> { + Object[] results = (Object[]) row; + + // Create Data Row + ColocationWeekByUserView colocation = new ColocationWeekByUserView( ); + colocation.setId(results[0] == null ? "" : results[0].toString()); + colocation.setUserName(results[1] == null ? "" : results[1].toString()); + colocation.setOffice(new Office(idOffice)); + colocation.setColocationMonday(new BigDecimal(results[3] == null ? "0.0" : results[3].toString())); + colocation.setColocationTuesday(new BigDecimal(results[4] == null ? "0.0" : results[4].toString())); + colocation.setColocationWednesday(new BigDecimal(results[5] == null ? "0.0" : results[5].toString())); + colocation.setColocationThursday(new BigDecimal(results[6] == null ? "0.0" : results[6].toString())); + colocation.setColocationFriday(new BigDecimal(results[7] == null ? "0.0" : results[7].toString())); + colocation.setColocationSaturday(new BigDecimal(results[8] == null ? "0.0" : results[8].toString())); + colocation.setColocationTotal(new BigDecimal(results[9] == null ? "0.0" : results[9].toString())); + + dataList.add(colocation); + }); + + } catch (HibernateException e) { + logger.error("Driver", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method getAllColocationWeekByOfficeMySQLQuery(" + idOffice + " " + ") ", e); + rollback(transaction); + } + + return dataList; + } + + /** + * + * Searching all loans with activity at this week by office. + * @param startDate + * @param officeId + * @return + */ + public List getAllSubtotalThisWeekByOfficeMySQLQuery(String startDate, String idOffice) { + logger.debug("getAllSubtotalThisWeekByOfficeMySQLQuery"); + + List dataList = new ArrayList<>(); + Transaction transaction = null; + + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + List rows = session.createNativeQuery(querySubtotal) + .setParameter("startDate", startDate) + .setParameter("idOffice", idOffice) + .getResultList(); + + transaction.commit(); + + rows.forEach((row) -> { + Object[] results = (Object[]) row; + + // Create Data Row + SubtotalWeekByUserView subtotal = new SubtotalWeekByUserView( ); + subtotal.setId(results[0] == null ? "" : results[0].toString()); + subtotal.setUserName(results[1] == null ? "" : results[1].toString()); + subtotal.setOffice(new Office(idOffice)); + subtotal.setSubtotalMonday(new BigDecimal(results[3] == null ? "0.0" : results[3].toString())); + subtotal.setOpeningFeeMonday(new BigDecimal(results[4] == null ? "0.0" : results[4].toString())); + subtotal.setSubtotalTuesday(new BigDecimal(results[5] == null ? "0.0" : results[5].toString())); + subtotal.setOpeningFeeTuesday(new BigDecimal(results[6] == null ? "0.0" : results[6].toString())); + subtotal.setSubtotalWednesday(new BigDecimal(results[7] == null ? "0.0" : results[7].toString())); + subtotal.setOpeningFeeWednesday(new BigDecimal(results[8] == null ? "0.0" : results[8].toString())); + subtotal.setSubtotalThursday(new BigDecimal(results[9] == null ? "0.0" : results[9].toString())); + subtotal.setOpeningFeeThursday(new BigDecimal(results[10] == null ? "0.0" : results[10].toString())); + subtotal.setSubtotalFriday(new BigDecimal(results[11] == null ? "0.0" : results[11].toString())); + subtotal.setOpeningFeeFriday(new BigDecimal(results[12] == null ? "0.0" : results[12].toString())); + subtotal.setSubtotalSaturday(new BigDecimal(results[13] == null ? "0.0" : results[13].toString())); + subtotal.setOpeningFeeSaturday(new BigDecimal(results[14] == null ? "0.0" : results[14].toString())); + subtotal.setSubtotalTotal(new BigDecimal(results[15] == null ? "0.0" : results[15].toString())); + + dataList.add(subtotal); + }); + + } catch (HibernateException e) { + logger.error("Driver", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method getAllSubtotalThisWeekByOfficeMySQLQuery(" + idOffice + " " + ") ", e); + rollback(transaction); + } + + return dataList; + } + + /** + * + * Searching all loans with activity at this week by office. + * @param startDate + * @param officeId + * @return + */ + public List getAllResumenInOutThisWeekByOfficeMySQLQuery(String startDate, String idOffice) { + logger.debug("getAllResumenInOutThisWeekByOffice"); + + List dataList = new ArrayList<>(); + Transaction transaction = null; + + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + List rows = session.createNativeQuery(queryResumenInOut) + .setParameter("startDate", startDate) + .setParameter("idOffice", idOffice) + .getResultList(); + + transaction.commit(); + + rows.forEach((row) -> { + Object[] results = (Object[]) row; + + // Create Data Row + ResumenInOutWeekByUserView resumen = new ResumenInOutWeekByUserView( ); + resumen.setId(results[0] == null ? "" : results[0].toString()); + resumen.setUserName(results[1] == null ? "" : results[1].toString()); + resumen.setOffice(new Office(idOffice)); + resumen.setClosingMonday(new BigDecimal(results[3] == null ? "0.0" : results[3].toString())); + resumen.setExpenseMonday(new BigDecimal(results[4] == null ? "0.0" : results[4].toString())); + resumen.setMoneyDailyTodayMonday(new BigDecimal(results[5] == null ? "0.0" : results[5].toString())); + resumen.setClosingTuesday(new BigDecimal(results[6] == null ? "0.0" : results[6].toString())); + resumen.setExpenseTuesday(new BigDecimal(results[7] == null ? "0.0" : results[7].toString())); + resumen.setMoneyDailyTodayTuesday(new BigDecimal(results[8] == null ? "0.0" : results[8].toString())); + resumen.setClosingWednesday(new BigDecimal(results[9] == null ? "0.0" : results[9].toString())); + resumen.setExpenseWednesday(new BigDecimal(results[10] == null ? "0.0" : results[10].toString())); + resumen.setMoneyDailyTodayWednesday(new BigDecimal(results[11] == null ? "0.0" : results[11].toString())); + resumen.setClosingThursday(new BigDecimal(results[12] == null ? "0.0" : results[12].toString())); + resumen.setExpenseThursday(new BigDecimal(results[13] == null ? "0.0" : results[13].toString())); + resumen.setMoneyDailyTodayThursday(new BigDecimal(results[14] == null ? "0.0" : results[14].toString())); + resumen.setClosingFriday(new BigDecimal(results[15] == null ? "0.0" : results[15].toString())); + resumen.setExpenseFriday(new BigDecimal(results[16] == null ? "0.0" : results[16].toString())); + resumen.setMoneyDailyTodayFriday(new BigDecimal(results[17] == null ? "0.0" : results[17].toString())); + resumen.setClosingSaturday(new BigDecimal(results[18] == null ? "0.0" : results[18].toString())); + resumen.setExpenseSaturday(new BigDecimal(results[19] == null ? "0.0" : results[19].toString())); + resumen.setMoneyDailyTodaySaturday(new BigDecimal(results[20] == null ? "0.0" : results[20].toString())); + + dataList.add(resumen); + }); + + } catch (HibernateException e) { + logger.error("Driver", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method getAllResumenInOutThisWeekByOffice(" + idOffice + " " + ") ", e); + rollback(transaction); + } + + return dataList; + } + + /** + * Searching all loans with activity at this week by office. + * @param startDate + * @param officeId + * @return + */ + public List getAllCobranzaThisWeekByOfficeMySQLQuery(String startDate, String idOffice) { + logger.debug("getAllCobranzaThisWeekByOfficeMySQLQuery"); + + List dataList = new ArrayList<>(); + Transaction transaction = null; + + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + List rows = session.createNativeQuery(queryCobranza) + .setParameter("startDate", startDate) + .setParameter("idOffice", idOffice) + .getResultList(); + + transaction.commit(); + + rows.forEach((row) -> { + Object[] results = (Object[]) row; + + // Create Data Row + CobranzaWeekByUserView cobranza = new CobranzaWeekByUserView( ); + cobranza.setId(results[0] == null ? "" : results[0].toString()); + cobranza.setUserName(results[1] == null ? "" : results[1].toString()); + cobranza.setOffice(new Office(idOffice)); + cobranza.setCobranzaMonday(new BigDecimal(results[3] == null ? "0.0" : results[3].toString())); + cobranza.setCobranzaTuesday(new BigDecimal(results[4] == null ? "0.0" : results[4].toString())); + cobranza.setCobranzaWednesday(new BigDecimal(results[5] == null ? "0.0" : results[5].toString())); + cobranza.setCobranzaThursday(new BigDecimal(results[6] == null ? "0.0" : results[6].toString())); + cobranza.setCobranzaFriday(new BigDecimal(results[7] == null ? "0.0" : results[7].toString())); + cobranza.setCobranzaSaturday(new BigDecimal(results[8] == null ? "0.0" : results[8].toString())); + cobranza.setCobranzaTotal(new BigDecimal(results[9] == null ? "0.0" : results[9].toString())); + + dataList.add(cobranza); + }); + + } catch (HibernateException e) { + logger.error("Driver", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method getAllCobranzaThisWeekByOfficeMySQLQuery(" + idOffice + " " + ") ", e); + rollback(transaction); + } + + return dataList; + } + /** + * Searching all loans with activity at this week by office. + * @param startDate + * @param officeId + * @return + */ + public List getAllResumenTotalWeekByOfficeMySQLQuery(String startDate, String idOffice) { + logger.debug("getAllResumenTotalWeekByOfficeMySQLQuery"); + + List dataList = new ArrayList<>(); + Transaction transaction = null; + + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + List rows = session.createNativeQuery(queryResumenTotal) + .setParameter("startDate", startDate) + .setParameter("idOffice", idOffice) + .getResultList(); + + transaction.commit(); + + rows.forEach((row) -> { + Object[] results = (Object[]) row; + + // Create Data Row + ResumenTotalWeekView resumenTotal = new ResumenTotalWeekView( ); + resumenTotal.setId(results[0] == null ? "" : results[0].toString()); + resumenTotal.setOfficeName(results[1] == null ? "" : results[1].toString()); + resumenTotal.setClosingDayTotal(new BigDecimal(results[2] == null ? "0.0" : results[3].toString())); + resumenTotal.setMoneyDailyTodayTotal(new BigDecimal(results[3] == null ? "0.0" : results[3].toString())); + resumenTotal.setSubtotalTotal(new BigDecimal(results[4] == null ? "0.0" : results[4].toString())); + resumenTotal.setOpeningFeeTotal(new BigDecimal(results[5] == null ? "0.0" : results[5].toString())); + resumenTotal.setCobranzaToday(new BigDecimal(results[6] == null ? "0.0" : results[6].toString())); + resumenTotal.setColocationTotal(new BigDecimal(results[7] == null ? "0.0" : results[7].toString())); + resumenTotal.setNominaTotal(new BigDecimal(results[8] == null ? "0.0" : results[8].toString())); + resumenTotal.setAdelantosTotal(new BigDecimal(results[9] == null ? "0.0" : results[9].toString())); + resumenTotal.setEntradasTotal(new BigDecimal(results[10] == null ? "0.0" : results[10].toString())); + resumenTotal.setGastosAdmonTotal(new BigDecimal(results[11] == null ? "0.0" : results[11].toString())); + + dataList.add(resumenTotal); + }); + + } catch (HibernateException e) { + logger.error("Driver", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method getAllResumenTotalWeekByOfficeMySQLQuery(" + idOffice + " " + ") ", e); + rollback(transaction); + } + + return dataList; + } + + final Logger logger = LogManager.getLogger(DriverController.class); + private final GenericEntityRepository genericEntityRepository; + + public DriverController() { + this.genericEntityRepository = new GenericEntityRepository(); + } + + private final String queryLoanWeek = +"SELECT " + +" l.id, " + +" u.id as id_user, " + +" r.id_office, " + +" l.created_on as fecha, " + +" lt.payment as apoyos, " + +" lt.payment_total as apoyos_total, " + +" lt.opening_fee as comision_apertura, " + +" CONCAT(endor.first_name,' ', IF(ISNULL(endor.second_name) ,'', CONCAT(endor.second_name,' ')) ,endor.last_name, ' ', endor.middle_name) AS aval, " + +" CONCAT(cus.first_name,' ', IF(ISNULL(cus.second_name) ,'', CONCAT(cus.second_name,' ')) ,cus.last_name, ' ', cus.middle_name) AS customer, " + +" l.amount_to_pay as documento_por, " + +" lt.payment_daily as abono_diario, " + +" l.amount_paid, " + +" (l.amount_to_pay - l.amount_paid) saldo_insoluto, " + +" r.route_name, " + +" CONCAT(hr.first_name,' ', IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name,' ')) ,hr.last_name, ' ', hr.middle_name) AS asesor, " + +" (SELECT COUNT(lfn.id) FROM APC_LOAN_FEE_NOTIFICATION lfn WHERE lfn.id_loan = l.id) as num_fee, " + +//"-- Lunes " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes \n" + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day))" + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'monday' " + +" AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_monday, " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) " + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'monday' " + +" AND ldLunes.loan_details_type IN ('FEE')) as fee_monday, " + +//"-- Martes " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day))" + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'tuesday' " + +" AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_tuesday, " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) " + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'tuesday' " + +" AND ldLunes.loan_details_type IN ('FEE')) as fee_tuesday, " + +//"-- Miercoles " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day))" + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'wednesday' " + +" AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_wednesday, " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day))" + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'wednesday' " + +" AND ldLunes.loan_details_type IN ('FEE')) as fee_wednesday, " + +//"-- Jueves " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day))" + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'thursday' " + +" AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_thursday, " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) " + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'thursday' " + +" AND ldLunes.loan_details_type IN ('FEE')) as fee_thursday, " + +//"-- Viernes " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day))" + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'friday' " + +" AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_friday, " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day))" + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'friday' " + +" AND ldLunes.loan_details_type IN ('FEE')) as fee_friday, " + +//"-- Sabado " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day))" + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'saturday' " + +" AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_saturday, " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day))" + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'saturday' " + +" AND ldLunes.loan_details_type IN ('FEE')) as fee_saturday, " + +//"-- Faltante " + +" ((lt.payment_daily * (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) > 5, 5 , COUNT(DISTINCT(DATE(ldFaltante.created_on)))) FROM APC_LOAN_DETAIL ldFaltante " + +" WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1) AND " + +" YEAR(DATE(ldFaltante.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') " + +" AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE'))) " + +" - (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1) AND " + +" YEAR(DATE(ldLunes.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +" AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) as faltante, " + +//"-- new_customer " + +" CASE WHEN l.new_customer = 'ENEBLED' AND WEEK(DATE(l.created_on),1) = WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1) THEN 'Si' ELSE 'No' END as new_customer, " + +//"-- renovation " + +" if((SELECT COUNT(id_loan_old) FROM APC_LOAN_BY_RENOVATION lbr " + +" INNER JOIN APC_LOAN lRenovation ON lbr.id_loan_new = lRenovation.id " + +" WHERE id_loan_old = l.id " + +" AND loan_by_renovation_status = 'APPROVED' and WEEK(DATE(lRenovation.created_on),1) <= WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1) AND " + +" YEAR(DATE(lRenovation.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d'))) = 0 , 'No' , 'Si') as renovation, " + +//" -- estatus_prestamo " + +" l.loan_status as estatus_prestamo, " + +//"-- num_pagos_all " + +" (SELECT COUNT(DISTINCT(DATE(ldFaltante.created_on))) FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND date(ldFaltante.created_on) > date(l.created_on) AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday') \n" + +" AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE')) as num_pagos_all, " + +//"-- num_pagos_week " + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) > 6, 6, COUNT(DISTINCT(DATE(ldFaltante.created_on)))) FROM APC_LOAN_DETAIL ldFaltante " + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday') " + +" AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE')) as num_pagos_week, " + +//"-- fee_todos " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) " + +" AND ldLunes.loan_details_type IN ('FEE')) as fee_todos, " + +" lt.loan_type_name AS loan_type_name, " + +" l.frozen AS frozen, "+ + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan= l.id AND ldLunes.created_on <=(DATE_ADD(DATE_ADD(:startDate, INTERVAL -WEEKDAY(:startDate)-1 DAY), INTERVAL 7 DAY)) " + +" AND ldLunes.loan_details_type IN ('PAYMENT','TRANSFER','RENOVATION_PAYMENT')) AS totalPaid, " + +" lt.total_days AS numPagosLoanType, " + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'monday' \n" + +" AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER','FEE')) as movimiento_monday, \n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'tuesday' \n" + +" AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER','FEE')) as movimiento_tuesday, \n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'wednesday' \n" + +" AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER','FEE')) as movimiento_wendsday, \n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'thursday' \n" + +" AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER','FEE')) as movimiento_thursday,\n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'friday' \n" + +" AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER','FEE')) as movimiento_friday,\n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'saturday' \n" + +" AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER','FEE')) as movimiento_saturday,\n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'monday' \n" + +" AND ldFaltante.loan_details_type IN ('RENOVATION_PAYMENT')) as renovation_monday, \n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'tuesday' \n" + +" AND ldFaltante.loan_details_type IN ('RENOVATION_PAYMENT')) as renovation_tuesday, \n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'wednesday' \n" + +" AND ldFaltante.loan_details_type IN ('RENOVATION_PAYMENT')) as renovation_wendsday, \n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'thursday' \n" + +" AND ldFaltante.loan_details_type IN ('RENOVATION_PAYMENT')) as renovation_thursday,\n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'friday' \n" + +" AND ldFaltante.loan_details_type IN ('RENOVATION_PAYMENT')) as renovation_friday,\n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'saturday' \n" + +" AND ldFaltante.loan_details_type IN ('RENOVATION_PAYMENT')) as renovation_saturday, "+ + + "IF((SELECT count(ln.id_customer) FROM apo_pro_com_april_ten.APC_LOAN ln WHERE ln.id_customer=l.id_customer and \n" + +" NOT (SELECT COUNT(id_loan_new) from APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id) > 0) = 0 , 'No' , 'Si') as reactivation, " + + + "if((Select count(lsemana.id) from APC_LOAN lsemana where lsemana.id= l.id and \n" + +" lsemana.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) \n" + +" and lsemana.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)))>0,'Si','No') as weekOfCreation " + + +"FROM APC_LOAN l " + +"INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id " + +"INNER JOIN APC_PEOPLE cus ON cus.id = l.id_customer " + +"INNER JOIN APC_PEOPLE endor ON endor.id = l.id_endorsement " + +"INNER JOIN APC_ROUTE r ON r.id = l.id_route AND r.id_office = :idOffice " + +"INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id " + +"INNER JOIN APC_USER u ON u.id = lbu.id_user " + +"INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource " + +"WHERE " + +"l.loan_status not in ('DELETED','REJECTED') AND " + +"((SELECT COUNT(ld.id) FROM APC_LOAN_DETAIL ld WHERE WEEK(DATE(ld.created_on),1) = WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1) AND " + +" YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) AND ld.id_loan = l.id) > 0 ) " + +"UNION " + +"SELECT " + +" l.id, " + +" u.id as id_user, " + +" r.id_office, " + +" l.created_on as fecha, " + +" lt.payment as apoyos, " + +" lt.payment_total as apoyos_total, " + +" lt.opening_fee as comision_apertura, " + +" CONCAT(endor.first_name,' ', IF(ISNULL(endor.second_name) ,'', CONCAT(endor.second_name,' ')) ,endor.last_name, ' ', endor.middle_name) AS aval, " + +" CONCAT(cus.first_name,' ', IF(ISNULL(cus.second_name) ,'', CONCAT(cus.second_name,' ')) ,cus.last_name, ' ', cus.middle_name) AS customer, " + +" l.amount_to_pay as documento_por, " + +" lt.payment_daily as abono_diario, " + +" l.amount_paid, " + +" (l.amount_to_pay - l.amount_paid) saldo_insoluto, " + +" r.route_name, " + +" CONCAT(hr.first_name,' ', IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name,' ')) ,hr.last_name, ' ', hr.middle_name) AS asesor, " + +" (SELECT COUNT(lfn.id) FROM APC_LOAN_FEE_NOTIFICATION lfn WHERE lfn.id_loan = l.id) as num_fee, " + +//"-- Lunes " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes \n" + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day))" + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'monday' " + +" AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_monday, " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) " + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'monday' " + +" AND ldLunes.loan_details_type IN ('FEE')) as fee_monday, " + +//"-- Martes " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day))" + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'tuesday' " + +" AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_tuesday, " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) " + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'tuesday' " + +" AND ldLunes.loan_details_type IN ('FEE')) as fee_tuesday, " + +//"-- Miercoles " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day))" + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'wednesday' " + +" AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_wednesday, " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day))" + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'wednesday' " + +" AND ldLunes.loan_details_type IN ('FEE')) as fee_wednesday, " + +//"-- Jueves " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day))" + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'thursday' " + +" AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_thursday, " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) " + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'thursday' " + +" AND ldLunes.loan_details_type IN ('FEE')) as fee_thursday, " + +//"-- Viernes " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day))" + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'friday' " + +" AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_friday, " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day))" + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'friday' " + +" AND ldLunes.loan_details_type IN ('FEE')) as fee_friday, " + +//"-- Sabado " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day))" + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'saturday' " + +" AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_saturday, " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldLunes.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day))" + +" AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'saturday' " + +" AND ldLunes.loan_details_type IN ('FEE')) as fee_saturday, " + +//"-- Faltante " + +" ((lt.payment_daily * (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) > 5, 5 , COUNT(DISTINCT(DATE(ldFaltante.created_on)))) FROM APC_LOAN_DETAIL ldFaltante " + +" WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1) AND " + +" YEAR(DATE(ldFaltante.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') " + +" AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE'))) " + +" - (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1) AND " + +" YEAR(DATE(ldLunes.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +" AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) as faltante, " + +//"-- new_customer " + +" CASE WHEN l.new_customer = 'ENEBLED' AND WEEK(DATE(l.created_on),1) = WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1) THEN 'Si' ELSE 'No' END as new_customer, " + +//"-- renovation " + +" if((SELECT COUNT(id_loan_old) FROM APC_LOAN_BY_RENOVATION lbr " + +" INNER JOIN APC_LOAN lRenovation ON lbr.id_loan_new = lRenovation.id " + +" WHERE id_loan_old = l.id " + +" AND loan_by_renovation_status = 'APPROVED' and WEEK(DATE(lRenovation.created_on),1) <= WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1) AND " + +" YEAR(DATE(lRenovation.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d'))) = 0 , 'No' , 'Si') as renovation, " + +//" -- estatus_prestamo " + +" l.loan_status as estatus_prestamo, " + +//"-- num_pagos_all " + +" (SELECT COUNT(DISTINCT(DATE(ldFaltante.created_on))) FROM APC_LOAN_DETAIL ldFaltante " + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday') " + +" AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE')) as num_pagos_all, " + +//"-- num_pagos_week " + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) > 6, 6, COUNT(DISTINCT(DATE(ldFaltante.created_on)))) FROM APC_LOAN_DETAIL ldFaltante " + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday') " + +" AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE')) as num_pagos_week, " + +//"-- fee_todos " + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan = l.id AND ldLunes.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) " + +" AND ldLunes.loan_details_type IN ('FEE')) as fee_todos, " + +" lt.loan_type_name AS loan_type_name, " + +" l.frozen AS frozen, "+ + +" (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) " + +" FROM APC_LOAN_DETAIL ldLunes " + +" WHERE ldLunes.id_loan= l.id AND ldLunes.created_on <=(DATE_ADD(DATE_ADD(:startDate, INTERVAL -WEEKDAY(:startDate)-1 DAY), INTERVAL 7 DAY)) " + +" AND ldLunes.loan_details_type IN ('PAYMENT','TRANSFER','RENOVATION_PAYMENT')) AS totalPaid, " + +" lt.total_days AS numPagosLoanType, " + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'monday' \n" + +" AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER','FEE')) as movimiento_monday, \n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'tuesday' \n" + +" AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER','FEE')) as movimiento_tuesday, \n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'wednesday' \n" + +" AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER','FEE')) as movimiento_wendsday, \n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'thursday' \n" + +" AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER','FEE')) as movimiento_thursday,\n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'friday' \n" + +" AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER','FEE')) as movimiento_friday,\n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'saturday' \n" + +" AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER','FEE')) as movimiento_saturday,\n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'monday' \n" + +" AND ldFaltante.loan_details_type IN ('RENOVATION_PAYMENT')) as renovation_monday, \n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'tuesday' \n" + +" AND ldFaltante.loan_details_type IN ('RENOVATION_PAYMENT')) as renovation_tuesday, \n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'wednesday' \n" + +" AND ldFaltante.loan_details_type IN ('RENOVATION_PAYMENT')) as renovation_wendsday, \n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'thursday' \n" + +" AND ldFaltante.loan_details_type IN ('RENOVATION_PAYMENT')) as renovation_thursday,\n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'friday' \n" + +" AND ldFaltante.loan_details_type IN ('RENOVATION_PAYMENT')) as renovation_friday,\n" + + +" (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) >= 1, 'Si','No') FROM APC_LOAN_DETAIL ldFaltante \n" + +" WHERE ldFaltante.id_loan = l.id AND ldFaltante.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) and ldFaltante.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('sunday')\n" + +" AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) = 'saturday' \n" + +" AND ldFaltante.loan_details_type IN ('RENOVATION_PAYMENT')) as renovation_saturday, "+ + + "IF((SELECT count(ln.id_customer) FROM apo_pro_com_april_ten.APC_LOAN ln WHERE ln.id_customer=l.id_customer and \n" + +" NOT (SELECT COUNT(id_loan_new) from APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id) > 0) = 0 , 'No' , 'Si') as reactivation, " + + "if((Select count(lsemana.id) from APC_LOAN lsemana where lsemana.id= l.id and \n" + +" lsemana.created_on <=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 7 day)) \n" + +" and lsemana.created_on >=(date_add(date_add(:startDate, interval -WEEKDAY(:startDate)-1 day), interval 1 day)))>0,'Si','No') as weekOfCreation"+ +" from APC_LOAN l\n" + +"INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id \n" + +"INNER JOIN APC_PEOPLE cus ON cus.id = l.id_customer \n" + +"INNER JOIN APC_PEOPLE endor ON endor.id = l.id_endorsement \n" + +"INNER JOIN APC_ROUTE r ON r.id = l.id_route AND r.id_office = \"caef3a64-7d1f-11ea-af3e-28f659da398e\"\n" + +"INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id \n" + +"INNER JOIN APC_USER u ON u.id = lbu.id_user \n" + +"INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource \n" + +"where WEEK(DATE(l.created_on),1) = WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1) AND \n" + +" YEAR(DATE(l.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) and l.loan_status='APPROVED'\n" + +"ORDER BY fecha"; + + private final String queryColocation = +"SELECT " + +"u.id, " + +"CONCAT(hr.first_name, ' ' , hr.last_name) as username, " + +"ubo.id_office, " + +"(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al " + +" INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id " + +" INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id " + +" WHERE loan_status = 'APPROVED' AND al.created_by = u.id " + +" AND WEEK(DATE(al.created_on),1) = WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1) AND " + +" YEAR(Date(al.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +" AND LOWER(DAYNAME(DATE(al.created_on))) = 'monday') " + +" as colocation_monday, " + +"(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al " + +" INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id " + +" INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id " + +" WHERE loan_status = 'APPROVED' AND al.created_by = u.id " + +" AND WEEK(DATE(al.created_on),1) = WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1) AND " + +" YEAR(Date(al.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +" AND LOWER(DAYNAME(DATE(al.created_on))) = 'tuesday') " + +" as colocation_tuesday, " + +"(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al " + +" INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id " + +" INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id " + +" WHERE loan_status = 'APPROVED' AND al.created_by = u.id " + +" AND WEEK(DATE(al.created_on),1) = WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1) AND " + +" YEAR(Date(al.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +" AND LOWER(DAYNAME(DATE(al.created_on))) = 'wednesday') " + +" as colocation_wednesday, " + +"(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al " + +" INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id " + +" INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id " + +" WHERE loan_status = 'APPROVED' AND al.created_by = u.id " + +" AND WEEK(DATE(al.created_on),1) = WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1) AND " + +" YEAR(Date(al.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +" AND LOWER(DAYNAME(DATE(al.created_on))) = 'thursday') " + +" as colocation_thursday, " + +"(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al " + +" INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id " + +" INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id " + +" WHERE loan_status = 'APPROVED' AND al.created_by = u.id " + +" AND WEEK(DATE(al.created_on),1) = WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1) AND " + +" YEAR(Date(al.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +" AND LOWER(DAYNAME(DATE(al.created_on))) = 'friday') " + +" as colocation_friday, " + +"(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al " + +" INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id " + +" INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id " + +" WHERE loan_status = 'APPROVED' AND al.created_by = u.id " + +" AND WEEK(DATE(al.created_on),1) = WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1) AND " + +" YEAR(Date(al.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +" AND LOWER(DAYNAME(DATE(al.created_on))) = 'saturday') " + +" as colocation_saturday, " + +"(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al " + +" INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id " + +" INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id " + +" WHERE loan_status = 'APPROVED' AND al.created_by = u.id " + +" AND WEEK(DATE(al.created_on),1) = WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1) AND " + +" YEAR(Date(al.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d'))) " + +" as colocation_total " + +"FROM APC_USER u " + +"INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource AND hr.human_resource_status = 'ENEBLED' " + +"INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id AND ubo.id_office = :idOffice " + +"WHERE u.user_status = 'ENEBLED' AND " + +"u.user_type IN ('MOBILE','BOTH');"; + + private final String queryCobranza = +"SELECT " + +"u.id, " + +"CONCAT(hr.first_name, ' ' , hr.last_name) as username, " + +"ubo.id_office, " + +"(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) " + +"FROM APC_LOAN_DETAIL ld " + +"INNER JOIN APC_LOAN l ON l.id = ld.id_loan " + +"INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id " + +"WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' AND ld.id_user = u.id " + +"AND WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(ld.created_on))) = 'monday' " + +"AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_monday, " + +"(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) " + +"FROM APC_LOAN_DETAIL ld " + +"INNER JOIN APC_LOAN l ON l.id = ld.id_loan " + +"INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id " + +"WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id " + +"AND WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(ld.created_on))) = 'tuesday' " + +"AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_tuesday, " + +"(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) " + +"FROM APC_LOAN_DETAIL ld " + +"INNER JOIN APC_LOAN l ON l.id = ld.id_loan " + +"INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id " + +"WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id " + +"AND WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(ld.created_on))) = 'wednesday' " + +"AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_wednesday, " + +"(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) " + +"FROM APC_LOAN_DETAIL ld " + +"INNER JOIN APC_LOAN l ON l.id = ld.id_loan " + +"INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id " + +"WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id " + +"AND WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(ld.created_on))) = 'thursday' " + +"AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_thursday, " + +"(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) " + +"FROM APC_LOAN_DETAIL ld " + +"INNER JOIN APC_LOAN l ON l.id = ld.id_loan " + +"INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id " + +"WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id " + +"AND WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(ld.created_on))) = 'friday' " + +"AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_friday, " + +"(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) " + +"FROM APC_LOAN_DETAIL ld " + +"INNER JOIN APC_LOAN l ON l.id = ld.id_loan " + +"INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id " + +"WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id " + +"AND WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(ld.created_on))) = 'saturday' " + +"AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_saturday, " + +"(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) " + +"FROM APC_LOAN_DETAIL ld " + +"INNER JOIN APC_LOAN l ON l.id = ld.id_loan " + +"INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id " + +"WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id " + +"AND WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_total " + +"FROM APC_USER u " + +"INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource AND hr.human_resource_status = 'ENEBLED' " + +"INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id AND ubo.id_office = :idOffice " + +"WHERE u.user_status = 'ENEBLED' AND " + +"u.user_type IN ('MOBILE','BOTH') AND " + +"u.certifier = 'DISABLED';"; + + private final String querySubtotal = +"SELECT " + +"u.id, " + +"CONCAT(hr.first_name, ' ' , hr.last_name) as username, " + +"ubo.id_office, " + +"(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) " + +"FROM APC_LOAN_DETAIL ld " + +"INNER JOIN APC_LOAN l ON l.id = ld.id_loan " + +"INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id " + +"WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(ld.created_on))) = 'monday' " + +"AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_monday, " + +"(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al " + +" INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id " + +" INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id " + +" WHERE loan_status = 'APPROVED' AND albu.id_user = u.id " + +" AND WEEK(DATE(al.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +" YEAR(Date(al.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +" AND LOWER(DAYNAME(DATE(al.created_on))) = 'monday') " + +" as opening_fee_monday, " + +"(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) " + +"FROM APC_LOAN_DETAIL ld " + +"INNER JOIN APC_LOAN l ON l.id = ld.id_loan " + +"INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id " + +"WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(ld.created_on))) = 'tuesday' " + +"AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_tuesday, " + +"(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al " + +" INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id " + +" INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id " + +" WHERE loan_status = 'APPROVED' AND albu.id_user = u.id " + +" AND WEEK(DATE(al.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +" YEAR(Date(al.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +" AND LOWER(DAYNAME(DATE(al.created_on))) = 'tuesday') " + +" as opening_fee_tuesday, " + +"(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) " + +"FROM APC_LOAN_DETAIL ld " + +"INNER JOIN APC_LOAN l ON l.id = ld.id_loan " + +"INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id " + +"WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(ld.created_on))) = 'wednesday' " + +"AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_wednesday, " + +"(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al " + +" INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id " + +" INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id " + +" WHERE loan_status = 'APPROVED' AND albu.id_user = u.id " + +" AND WEEK(DATE(al.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +" YEAR(Date(al.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +" AND LOWER(DAYNAME(DATE(al.created_on))) = 'wednesday') " + +" as opening_fee_wednesday, " + +"(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) " + +"FROM APC_LOAN_DETAIL ld " + +"INNER JOIN APC_LOAN l ON l.id = ld.id_loan " + +"INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id " + +"WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(ld.created_on))) = 'thursday' " + +"AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_thursday, " + +"(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al " + +" INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id " + +" INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id " + +" WHERE loan_status = 'APPROVED' AND albu.id_user = u.id " + +" AND WEEK(DATE(al.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +" YEAR(Date(al.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +" AND LOWER(DAYNAME(DATE(al.created_on))) = 'thursday') " + +" as opening_fee_thursday, " + +"(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) " + +"FROM APC_LOAN_DETAIL ld " + +"INNER JOIN APC_LOAN l ON l.id = ld.id_loan " + +"INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id " + +"WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(ld.created_on))) = 'friday' " + +"AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_friday, " + +"(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al " + +" INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id " + +" INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id " + +" WHERE loan_status = 'APPROVED' AND albu.id_user = u.id " + +" AND WEEK(DATE(al.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +" YEAR(Date(al.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +" AND LOWER(DAYNAME(DATE(al.created_on))) = 'friday') " + +" as opening_fee_friday, " + +"(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) " + +"FROM APC_LOAN_DETAIL ld " + +"INNER JOIN APC_LOAN l ON l.id = ld.id_loan " + +"INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id " + +"WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(ld.created_on))) = 'saturday' " + +"AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_saturday, " + +"(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al " + +" INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id " + +" INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id " + +" WHERE loan_status = 'APPROVED' AND albu.id_user = u.id " + +" AND WEEK(DATE(al.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +" YEAR(Date(al.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +" AND LOWER(DAYNAME(DATE(al.created_on))) = 'saturday') " + +" as opening_fee_saturday, " + +"(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) " + +"FROM APC_LOAN_DETAIL ld " + +"INNER JOIN APC_LOAN l ON l.id = ld.id_loan " + +"INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id " + +"WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_total, " + +"(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al " + +" INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id " + +" INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id " + +" WHERE loan_status = 'APPROVED' AND albu.id_user = u.id " + +" AND WEEK(DATE(al.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +" YEAR(Date(al.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) ) " + +" as opening_fee_total " + +"FROM APC_USER u " + +"INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource AND hr.human_resource_status = 'ENEBLED' " + +"INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id AND ubo.id_office = :idOffice " + +"WHERE u.user_status = 'ENEBLED' AND " + +"u.user_type IN ('MOBILE','BOTH') AND " + +"u.certifier = 'DISABLED';"; + + private final String queryResumenInOut = +"SELECT " + +"u.id, " + +"CONCAT(hr.first_name, ' ' , hr.last_name) as username, " + +"ubo.id_office, " + +//"-- Lunes " + +"(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) " + +"FROM APC_CLOSING_DAY ld " + +"WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(ld.created_on))) = 'monday') as closing_monday, " + +"(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) " + +"FROM APC_OTHER_EXPENSE oe " + +"WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(oe.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(oe.created_on))) = 'monday') as expense_monday, " + +"(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) " + +"FROM APC_MONEY_DAILY md " + +"WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(md.money_daily_date)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'monday') as money_daily_today_monday, " + +//"-- Martes " + +"(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) " + +"FROM APC_CLOSING_DAY ld " + +"WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(ld.created_on))) = 'tuesday') as closing_tuesday, " + +"(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) " + +"FROM APC_OTHER_EXPENSE oe " + +"WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(oe.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(oe.created_on))) = 'tuesday') as expense_tuesday, " + +"(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) " + +"FROM APC_MONEY_DAILY md " + +"WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(md.money_daily_date)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'tuesday') as money_daily_today_tuesday, " + +//"-- Miercoles " + +"(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) " + +"FROM APC_CLOSING_DAY ld " + +"WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(ld.created_on))) = 'wednesday') as closing_wednesday, " + +"(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) " + +"FROM APC_OTHER_EXPENSE oe " + +"WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(oe.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(oe.created_on))) = 'wednesday') as expense_wednesday, " + +"(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) " + +"FROM APC_MONEY_DAILY md " + +"WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(md.money_daily_date)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'wednesday') as money_daily_today_wednesday, " + +//"-- Jueves " + +"(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) " + +"FROM APC_CLOSING_DAY ld " + +"WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(ld.created_on))) = 'thursday') as closing_thursday, " + +"(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) " + +"FROM APC_OTHER_EXPENSE oe " + +"WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(oe.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(oe.created_on))) = 'thursday') as expense_thursday, " + +"(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) " + +"FROM APC_MONEY_DAILY md " + +"WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(md.money_daily_date)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'thursday') as money_daily_today_thursday, " + +//"-- Viernes " + +"(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) " + +"FROM APC_CLOSING_DAY ld " + +"WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(ld.created_on))) = 'friday') as closing_friday, " + +"(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) " + +"FROM APC_OTHER_EXPENSE oe " + +"WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(oe.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(oe.created_on))) = 'friday') as expense_friday, " + +"(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) " + +"FROM APC_MONEY_DAILY md " + +"WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(md.money_daily_date)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'friday') as money_daily_today_friday, " + +//"-- Sabado " + +"(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) " + +"FROM APC_CLOSING_DAY ld " + +"WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(ld.created_on))) = 'saturday') as closing_saturday, " + +"(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) " + +"FROM APC_OTHER_EXPENSE oe " + +"WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(oe.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(oe.created_on))) = 'saturday') as expense_saturday, " + +"(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) " + +"FROM APC_MONEY_DAILY md " + +"WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(md.money_daily_date)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'saturday') as money_daily_today_saturday " + +"FROM APC_USER u " + +"INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource AND hr.human_resource_status = 'ENEBLED' " + +"INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id AND ubo.id_office = :idOffice " + +"WHERE u.user_status = 'ENEBLED' AND " + +"u.user_type IN ('MOBILE','BOTH');"; + + private final String queryResumenTotal = +"SELECT " + +"u.id, " + +"u.office_name, " + +//"-- Cortes " + +"(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) " + +"FROM APC_CLOSING_DAY ld " + +"WHERE WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) AND ld.active_status = 'ENEBLED' " + +"AND ld.id_office = u.id) as closing__day_total, " + +//"-- Inicios " + +"(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) " + +"FROM APC_MONEY_DAILY md " + +"WHERE WEEK(DATE(md.money_daily_date),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(md.money_daily_date)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) AND md.id_office = u.id) as money_daily_today_total, " + +//"-- Subtotal " + +"(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) " + +"FROM APC_LOAN_DETAIL ld " + +"INNER JOIN APC_LOAN l ON l.id = ld.id_loan " + +"INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id " + +"WHERE WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_total, " + +//"-- comision por apertura " + +"(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al " + +" INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id " + +" INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id " + +" WHERE loan_status = 'APPROVED' " + +" AND WEEK(DATE(al.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +" YEAR(Date(al.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d'))) " + +" as opening_fee_total, " + +//"-- cobranza " + +"(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) " + +"FROM APC_LOAN_DETAIL ld " + +"INNER JOIN APC_LOAN l ON l.id = ld.id_loan " + +"INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id " + +"WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' " + +"AND WEEK(DATE(ld.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +"YEAR(DATE(ld.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) " + +"AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_today, " + +//"-- colocacion " + +"(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al " + +" INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id " + +" INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id " + +" WHERE loan_status = 'APPROVED' " + +" AND WEEK(DATE(al.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +" YEAR(Date(al.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d')) ) " + +" as colocation_total, " + +//"-- nominas " + +"(SELECT IF(ISNULL(SUM(ap.total_payment)),0,SUM(ap.total_payment)) FROM APC_PAYROLL ap " + +"WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' " + +"AND WEEK(DATE(ap.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +" YEAR(Date(ap.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d'))) as nomina_total, " + +//"-- adelantos " + +"(SELECT IF(ISNULL(SUM(ap.amount)),0,SUM(ap.amount)) FROM APC_ADVANCE ap " + +"WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' " + +"AND WEEK(DATE(ap.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +" YEAR(Date(ap.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d'))) as adelantos_total, " + +//"-- entradas " + +"(SELECT IF(ISNULL(SUM(ap.amount)),0,SUM(ap.amount)) FROM APC_EXPENSE_COMPANY ap " + +"WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' AND " + +"ap.expense_company_type = 'PAYMENT_IN' " + +"AND WEEK(DATE(ap.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +" YEAR(Date(ap.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d'))) as entradas_total, " + +//"-- gastos admon " + +"(SELECT IF(ISNULL(SUM(ap.amount)),0,SUM(ap.amount)) FROM APC_EXPENSE_COMPANY ap " + +"WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' AND " + +"ap.expense_company_type = 'PAYMENT_OUT' " + +"AND WEEK(DATE(ap.created_on),1) = (WEEK(STR_TO_DATE(:startDate, '%Y-%m-%d'),1)) AND " + +" YEAR(Date(ap.created_on)) = YEAR(STR_TO_DATE(:startDate, '%Y-%m-%d'))) as gastos_admon_total " + +"FROM APC_OFFICE u " + +"WHERE u.office_status = 'ENEBLED' AND u.id = :idOffice ;"; +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/drive/FaltanteInDatesController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/drive/FaltanteInDatesController.java new file mode 100644 index 0000000..6522289 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/drive/FaltanteInDatesController.java @@ -0,0 +1,222 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.controller.drive; + +import com.arrebol.apc.controller.util.ConnectionManager; +import com.arrebol.apc.controller.util.HibernateUtil; +import com.arrebol.apc.model.views.FaltanteInDates; +//import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.math.BigDecimal; +//import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.Transaction; + + +/** + * + * @author Donadony + */ +public class FaltanteInDatesController extends ConnectionManager implements Serializable { + + + public List getAllLoanWeekMySQLQuery(String startDate,String endDate) { + logger.debug("getAllLoanWeekByOfficeMySQLQuery"); + logger.debug("Fecha inicial: " + startDate); + + List dataList = new ArrayList<>(); + Transaction transaction = null; + + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + //SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); + + List rows = session.createNativeQuery(queryLoan) + .setParameter("startDate", startDate) + .setParameter("endDate",endDate) + .getResultList(); + + transaction.commit(); + + rows.forEach((row) -> { + Object[] results = (Object[]) row; + + // Create Data Row + FaltanteInDates loanWeek = new FaltanteInDates( ); + loanWeek.setId(results[0] == null ? "" : results[0].toString()); + loanWeek.setIdUser(results[1] == null ? "" : results[1].toString()); + loanWeek.setUserName(results[2] == null ? "" : results[2].toString()); + loanWeek.setCustomerName(results[3] == null ? "" : results[3].toString()); + loanWeek.setRouteName(results[4] == null ? "" : results[4].toString()); + loanWeek.setAmountPaid(new BigDecimal(results[5] == null ? "0.0" : results[5].toString())); + loanWeek.setAmountToPay(new BigDecimal(results[6] == null ? "0.0" : results[6].toString())); + loanWeek.setAmountToPayNoFee(new BigDecimal(results[7] == null ? "0.0" : results[7].toString())); + loanWeek.setPaymentDaily(new BigDecimal(results[8] == null ? "0.0" : results[8].toString())); + loanWeek.setExpectedPayment(new BigDecimal(results[9] == null ? "0.0" : results[9].toString())); + loanWeek.setAmountPaidDetails(new BigDecimal(results[10] == null ? "0.0" : results[10].toString())); + loanWeek.setFee(new BigDecimal(results[11] == null ? "0.0" : results[11].toString())); + loanWeek.setFeeNumber(results[12] == null ? 0 : (Long) results[12]); + loanWeek.setNumPagosAll(results[13] == null ? 0 :(Long) results[13]); + + + dataList.add(loanWeek); + }); + + } catch (HibernateException e) { + logger.error("Driver", e); + rollback(transaction); + } catch (Exception e) { + logger.error("Method getAllLoanWeekByOfficeMySQLQuery(" + startDate + " " + ") ", e); + rollback(transaction); + } + + return dataList; + } + + final Logger logger = LogManager.getLogger(DriverController.class); + /*private final GenericEntityRepository genericEntityRepository; + + public FaltanteInDatesController() { + this.genericEntityRepository = new GenericEntityRepository(); + }*/ + + + private final String queryLoan = +"SELECT " + +" al.id," + +" ald.id_user," + +" CONCAT((CASE" + +" WHEN" + +" ((hr.first_name IS NOT NULL)" + +" AND (hr.first_name <> ''))" + +" THEN" + +" CONCAT(SUBSTR(UPPER(hr.first_name), 1, 1)," + +" SUBSTR(LOWER(hr.first_name), 2)," + +" ' ')" + +" ELSE ''" + +" END)," + +" (CASE" + +" WHEN" + +" ((hr.second_name IS NOT NULL)" + +" AND (hr.second_name <> ''))" + +" THEN" + +" CONCAT(SUBSTR(UPPER(hr.second_name), 1, 1)," + +" SUBSTR(LOWER(hr.second_name), 2)," + +" ' ')" + +" ELSE ''" + +" END)," + +" (CASE" + +" WHEN" + +" ((hr.last_name IS NOT NULL)" + +" AND (hr.last_name <> ''))" + +" THEN" + +" CONCAT(SUBSTR(UPPER(hr.last_name), 1, 1)," + +" SUBSTR(LOWER(hr.last_name), 2))" + +" ELSE ''" + +" END)) AS user_name," + +" CONCAT((CASE" + +" WHEN" + +" ((cstmr.first_name IS NOT NULL)" + +" AND (cstmr.first_name <> ''))" + +" THEN" + +" CONCAT(SUBSTR(UPPER(cstmr.first_name)," + +" 1," + +" 1)," + +" SUBSTR(LOWER(cstmr.first_name), 2)," + +" ' ')" + +" ELSE ''" + +" END)," + +" (CASE" + +" WHEN" + +" ((cstmr.second_name IS NOT NULL)" + +" AND (cstmr.second_name <> ''))" + +" THEN\n" + +" CONCAT(SUBSTR(UPPER(cstmr.second_name)," + +" 1," + +" 1)," + +" SUBSTR(LOWER(cstmr.second_name), 2)," + +" ' ')" + +" ELSE ''" + +" END)," + +" (CASE" + +" WHEN" + +" ((cstmr.last_name IS NOT NULL)" + +" AND (cstmr.last_name <> ''))" + +" THEN" + +" CONCAT(SUBSTR(UPPER(cstmr.last_name), 1, 1)," + +" SUBSTR(LOWER(cstmr.last_name), 2))" + +" ELSE ''" + +" END)) AS customer_name," + +" ar.route_name," + +" al.amount_paid," + +" al.amount_to_pay, " + +" al.amount_to_pay-(SELECT " + +" IF((SUM(ldLunes.payment_amount) IS NULL)," + +" 0," + +" SUM(ldLunes.payment_amount))" + +" FROM" + +" APC_LOAN_DETAIL ldLunes" + +" WHERE" + +" ((ldLunes.id_loan = al.id)" + +" AND (ldLunes.loan_details_type = 'FEE'))) AS amount_to_pay_no_fee," + +" alt.payment_daily," + +" (SELECT " + +" COUNT(DISTINCT CAST(ldfaltante.created_on AS DATE))" + +" FROM\n" + +" APC_LOAN_DETAIL ldfaltante" + +" WHERE" + +" ((ldfaltante.id_loan = ald.id_loan)" + +" AND ldfaltante.id_user = ald.id_user" + +" AND (LOWER(DAYNAME(CAST(ldfaltante.created_on AS DATE))) <> 'sunday')" + +" AND date(ldfaltante.created_on) >= :startDate and date(ldfaltante.created_on) <= :endDate" + +" AND (ldfaltante.loan_details_type = 'PAYMENT')))*alt.payment_daily as expected_payment," + +" sum(ald.payment_amount) as amount_paid_details, " + +" (SELECT " + +" IF((SUM(ldLunes.payment_amount) IS NULL)," + +" 0," + +" SUM(ldLunes.payment_amount))" + +" FROM" + +" APC_LOAN_DETAIL ldLunes" + +" WHERE" + +" ((ldLunes.id_loan = al.id)" + +" AND (ldLunes.loan_details_type = 'FEE'))) AS fee," + +" (SELECT " + +" count(ldLunes.created_on)" + +" FROM" + +" APC_LOAN_DETAIL ldLunes" + +" WHERE\n" + +" ((ldLunes.id_loan = al.id)" + +" AND (ldLunes.loan_details_type = 'FEE'))) AS fee_number," + +" (SELECT " + +" COUNT(DISTINCT CAST(ldfaltante.created_on AS DATE))" + +" FROM\n" + +" APC_LOAN_DETAIL ldfaltante" + +" WHERE" + +" ((ldfaltante.id_loan = ald.id_loan)" + +" AND ldfaltante.id_user = ald.id_user" + +" AND (LOWER(DAYNAME(CAST(ldfaltante.created_on AS DATE))) <> 'sunday')" + +" AND date(ldfaltante.created_on) >= :startDate and date(ldfaltante.created_on) <= :endDate" + +" AND (ldfaltante.loan_details_type IN ('PAYMENT','TRANSFER')))) AS num_pagos_all," + +" al.created_on " + +"FROM APC_LOAN_DETAIL ald" + +"JOIN APC_LOAN al ON al.id = ald.id_loan" + +"JOIN APC_USER au ON au.id = ald.id_user" + +"JOIN APC_ROUTE ar on al.id_route = ar.id" + +"JOIN APC_LOAN_BY_USER lub ON lub.id_loan = al.id" + +"JOIN APC_LOAN_TYPE alt on alt.id = al.id_loan_type" + +"JOIN APC_PEOPLE cstmr ON ((al.id_customer = cstmr.id))" + +"JOIN APC_USER u ON ((ald.id_user = u.id))" + +"JOIN APC_HUMAN_RESOURCE hr ON ((hr.id = u.id_human_resource))" + +"WHERE al.loan_status= 'APPROVED' AND ald.loan_details_type in('PAYMENT','TRANSFER') and date(ald.created_on) >= :startDate and date(ald.created_on) <= :endDate" + +" AND lub.id_user <> 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6'" + +"group by ald.id_loan,ald.id_user"; +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/login/LoginController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/login/LoginController.java new file mode 100644 index 0000000..ffdce78 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/login/LoginController.java @@ -0,0 +1,56 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.login; + +import com.arrebol.apc.repository.core.OfficeRepository; +import com.arrebol.apc.repository.core.UserByOfficeRepository; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.UserByOffice; +import java.io.Serializable; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class LoginController implements Serializable { + + public List getAllActiveOfficeController() { + logger.debug("getAllActiveOfficeController"); + + return getOfficeRepository().getAllActiveOffice(); + + } + + public UserByOffice findUserLoggedController(UserByOffice userByOffice) { + logger.debug("findUserLoggedController"); + return getUserByOfficeRepository().findUserLogged(userByOffice); + } + + private static final long serialVersionUID = 6949757021314889125L; + final Logger logger = LogManager.getLogger(LoginController.class); + + private final OfficeRepository officeRepository; + private final UserByOfficeRepository userByOfficeRepository; + + public LoginController() { + this.officeRepository = new OfficeRepository(); + this.userByOfficeRepository = new UserByOfficeRepository(); + } + + public OfficeRepository getOfficeRepository() { + return officeRepository; + } + + public UserByOfficeRepository getUserByOfficeRepository() { + return userByOfficeRepository; + } + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/login/LoginService.java b/apc-controller/src/main/java/com/arrebol/apc/controller/login/LoginService.java new file mode 100644 index 0000000..7eb7cb6 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/login/LoginService.java @@ -0,0 +1,32 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.login; + +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.UserByOffice; +import java.util.List; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface LoginService { + + /** + * + * @return + */ + public List getAllActiveOfficeController(); + + /** + * + * @param userByOffice + * @return + */ + public UserByOffice findUserLoggedController(UserByOffice userByOffice); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/login/LoginServiceImpl.java b/apc-controller/src/main/java/com/arrebol/apc/controller/login/LoginServiceImpl.java new file mode 100644 index 0000000..669cf87 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/login/LoginServiceImpl.java @@ -0,0 +1,47 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.login; + +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.UserByOffice; +import com.arrebol.apc.repository.core.OfficeRepository; +import com.arrebol.apc.repository.core.UserByOfficeRepository; +import java.util.List; +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@RequestScoped +public class LoginServiceImpl implements LoginService { + + @Override + public List getAllActiveOfficeController() { + logger.debug("getAllActiveOfficeController"); + + return officeRepository.getAllActiveOffice(); + + } + + @Override + public UserByOffice findUserLoggedController(UserByOffice userByOffice) { + logger.debug("findUserLoggedController"); + return userByOfficeRepository.findUserLogged(userByOffice); + } + + final Logger logger = LogManager.getLogger(getClass()); + + @Inject + private OfficeRepository officeRepository; + @Inject + private UserByOfficeRepository userByOfficeRepository; +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/system/employee/EmployeeController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/system/employee/EmployeeController.java new file mode 100644 index 0000000..3cf3fda --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/system/employee/EmployeeController.java @@ -0,0 +1,177 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.system.employee; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.Bonus; +import com.arrebol.apc.model.admin.constance.BonusCfg; +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.HumanResourceByOffice; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.constance.HumanResourceByOfficeCfg; +import com.arrebol.apc.model.core.constance.HumanResourceCfg; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.HumanResourceStatus; +import com.arrebol.apc.repository.GenericEntityRepository; +import com.arrebol.apc.repository.core.HumanResourceRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import javax.persistence.Tuple; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class EmployeeController implements Serializable { + + /** + * Find where status EQUALS TO status. + * + * @param office + * @param status + * @param hrOwnerId Human resource id from user logged. + * @return + */ + public List findEmployeesByType(Office office, HumanResourceStatus status, String hrOwnerId) { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(HumanResourceCfg.FIELD_OFFICE, office)); + parameters.add(new ModelParameter(HumanResourceCfg.FIELD_HR_STATUS, status)); + parameters.add(new ModelParameter(HumanResourceByOfficeCfg.HUMAN_RESOURCE, new HumanResource(hrOwnerId))); + + return genericEntityRepository.xmlQueryAPCEntities(HumanResource.class, HumanResourceCfg.QUERY_FIND_ALL_BY_STATUS, parameters); + } + + /** + * Find where status IN status. + * + * @param office + * @param statusLst + * @param hrOwnerId Human resource id from user logged. + * @return + */ + public List findEmployeesInType(Office office, List statusLst, String hrOwnerId) { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(HumanResourceCfg.FIELD_OFFICE, office)); + parameters.add(new ModelParameter(HumanResourceCfg.FIELD_HR_STATUS, statusLst)); + parameters.add(new ModelParameter(HumanResourceByOfficeCfg.HUMAN_RESOURCE, new HumanResource(hrOwnerId))); + + return genericEntityRepository.xmlQueryAPCEntities(HumanResource.class, HumanResourceCfg.QUERY_FIND_ALL_IN_STATUS, parameters); + } + + /** + * Save an entity. + * + * @param humanResourceByOffice + * @param humanResource + * @return + */ + public boolean saveHRController(HumanResourceByOffice humanResourceByOffice, HumanResource humanResource) { + logger.debug("saveHRController"); + + boolean success = genericEntityRepository.insertAPCEntity(humanResource); + + if (success) { + humanResourceByOffice.setHumanResource(new HumanResource(humanResource.getId())); + success = genericEntityRepository.insertAPCEntity(humanResourceByOffice); + } + + return success; + } + + /** + * + * @param hr + * @param updateAvatar + * @return + */ + public boolean updateByHumanResourceId(HumanResource hr, boolean updateAvatar) { + logger.debug("updateByHumanResourceId"); + + return humanResourceRepository.updateByHumanResourceId(hr, updateAvatar); + } + + /** + * + * @param status + * @param userIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updateHRByStatus(HumanResourceStatus status, String userIdToUpdate, String lastUpdatedBy) { + logger.debug("updateHRByStatus"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(HumanResourceCfg.FIELD_HR_STATUS, status)); + parameters.add(new ModelParameter(HumanResourceCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(HumanResourceCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(HumanResourceCfg.FIELD_ID, userIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(HumanResourceCfg.UPDATE_HR_BY_STATUS, parameters); + } + + /** + * + * @param officeId + * @return + */ + public List findAllActiveBonus(String officeId) { + logger.debug("findAllActiveBonus"); + + List results = new ArrayList<>(); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(BonusCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + parameters.add(new ModelParameter(BonusCfg.FIELD_OFFICE, new Office(officeId))); + + List tuples = genericEntityRepository.xmlQueryAPCEntities( + Tuple.class, + BonusCfg.QUERY_FIND_ALL_ACTIVE_BONUS, + parameters); + + tuples.forEach((tuple) -> { + results.add(new Bonus(tuple.get("id").toString(), tuple.get("name").toString())); + }); + + } catch (Exception e) { + logger.error("findAllActiveBonus", e); + } + + return results; + } + + /** + * + * @param hrId + * @return + */ + public HumanResource findHumanResourceById(String hrId) { + logger.debug("findHumanResourceById"); + + return (HumanResource) genericEntityRepository.selectAPCEntityById(HumanResource.class, hrId); + } + + private static final long serialVersionUID = 2527037592427439763L; + final Logger logger = LogManager.getLogger(EmployeeController.class); + + private final GenericEntityRepository genericEntityRepository; + private final HumanResourceRepository humanResourceRepository; + + public EmployeeController() { + this.genericEntityRepository = new GenericEntityRepository(); + this.humanResourceRepository = new HumanResourceRepository(); + } + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/system/office/OfficeController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/system/office/OfficeController.java new file mode 100644 index 0000000..a2e15e4 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/system/office/OfficeController.java @@ -0,0 +1,91 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.system.office; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.constance.OfficeCfg; +import com.arrebol.apc.model.enums.OfficeStatus; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class OfficeController implements Serializable{ + + /** + * + * Searching all roles. + * + * @return + */ + public List fillOfficeDatatable() { + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(OfficeCfg.FIELD_OFFICE_STATUS, OfficeStatus.ENEBLED)); + + return genericEntityRepository.xmlQueryAPCEntities(Office.class, OfficeCfg.QUERY_FIND_ALL_OFFICES_ACTIVES, parameters); + } + + /** + * + * @param office + * @return boolean + */ + public boolean saveOffice(Office office) { + logger.debug("saveOffice"); + boolean success = genericEntityRepository.insertAPCEntity(office); + + return success; + } + + /** + * + * @param office + * @return boolean + */ + public boolean updateByOfficeId(Office office) { + logger.debug("updateByOfficeId"); + + return genericEntityRepository.updateAPCEntity(office); + } + + /** + * + * @param status + * @param officeIdToUpdate + * @return + */ + public boolean updateOfficeByStatus(OfficeStatus status, String officeIdToUpdate, String lastUpdatedBy) { + logger.debug("updateOfficeByStatus"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(OfficeCfg.FIELD_OFFICE_STATUS, status)); + parameters.add(new ModelParameter(OfficeCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(OfficeCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(OfficeCfg.FIELD_ID, officeIdToUpdate)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(OfficeCfg.UPDATE_OFFICES_BY_ID, parameters); + } + + final Logger logger = LogManager.getLogger(OfficeController.class); + private final GenericEntityRepository genericEntityRepository; + + public OfficeController() { + this.genericEntityRepository = new GenericEntityRepository(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/system/user/UserAccessController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/system/user/UserAccessController.java new file mode 100644 index 0000000..39461c5 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/system/user/UserAccessController.java @@ -0,0 +1,185 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.system.user; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.Permission; +import com.arrebol.apc.model.core.UserByOffice; +import com.arrebol.apc.model.core.UserByOfficeHasPermission; +import com.arrebol.apc.model.core.UserByOfficeHasPermissionId; +import com.arrebol.apc.model.core.constance.PermissionCfg; +import com.arrebol.apc.model.core.constance.UserByOfficeHasPermissionCfg; +import com.arrebol.apc.model.enums.UserStatus; +import com.arrebol.apc.repository.GenericEntityRepository; +import com.arrebol.apc.repository.core.PermissionRepository; +import com.arrebol.apc.repository.core.UserByOfficeRepository; +import com.arrebol.apc.repository.core.UserRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class UserAccessController implements Serializable { + + public List findUsersInOfficeInStatuses(List statuses, String officeId, String ownerId) { + logger.debug("findUsersInOfficeInStatuses"); + List retults = new ArrayList(); + try { + retults = getUserByOfficeRepository() + .findUsersInOfficeInStatuses(statuses, new Office(officeId), ownerId); + } catch (Exception e) { + logger.error("findUsersInOfficeInStatuses", e); + } + + return retults; + } + + /** + * + * @param userByOffice + * @param missing + * @return + */ + public List loadUserByOfficePermissionLst(UserByOffice userByOffice, boolean missing) { + logger.debug("loadUserByOfficePermissionLst"); + String query = PermissionCfg.QUERY_FIND_PERMISSION_THAT_USER_HAS_ASSIGNED; + + if (missing) { + query = PermissionCfg.QUERY_FIND_MISSING_PERMISSION_UBO; + } + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(UserByOfficeHasPermissionCfg.FIELD_USER_BY_OFFICE, userByOffice)); + + return getGenericEntityRepository().xmlQueryAPCEntities(Permission.class, query, parameters); + } + + /** + * + * @param permissions + * @param createdBy + * @param userByOfficeId Used to look all old permissions that need to be + * delete before to insert new permission list. + * @return + */ + public boolean updatePermissionsController(List permissions, String userByOfficeId, String createdBy) { + logger.debug("updatePermissionsController"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(UserByOfficeHasPermissionCfg.FIELD_USER_BY_OFFICE, new UserByOffice(userByOfficeId))); + + boolean success = getGenericEntityRepository().xmlUpdateOrDeleteAPCEntity(UserByOfficeHasPermissionCfg.XML_QUERY_DELETE_PERMISSION_BY_USER_ID_AND_OFFICE_ID, parameters); + + if (success) { + success = getGenericEntityRepository().insertManyAPCEntity(buildUniquePermissionList(permissions, userByOfficeId, createdBy)); + } + + return success; + } + + /** + * + * @return + */ + public List findAllEnebledPermissions() { + logger.debug("findAllEnebledPermissions"); + return getPermissionRepository().findAllEnebledPermissions(); + } + + /** + * + * @param entities + * @return + */ + private List buildUniquePermissionList(List permissions, String userByOfficeId, String createdBy) { + logger.info("buildUniquePermissionList"); + + List allNewPermissions = new ArrayList<>(); + + try { + Set uniquePermission = new HashSet<>(); + + List appMenuLst = findAllEnebledPermissions(); + + permissions.forEach((permission) -> { + if (!uniquePermission.contains(permission)) { + uniquePermission.add(permission); + } + + Optional optional = appMenuLst.stream() + .filter((appMenu) -> appMenu.getPermission().equals(permission.getParentName())) + .findAny(); + + if (optional.isPresent()) { + if (!uniquePermission.contains(optional.get())) { + uniquePermission.add(optional.get()); + } + } + }); + + uniquePermission.forEach((unique) -> { + allNewPermissions.add( + new UserByOfficeHasPermission( + new UserByOfficeHasPermissionId( + userByOfficeId, + unique.getId() + ), + createdBy + ) + ); + }); + } catch (Exception e) { + logger.error("buildUniquePermissionList", e); + throw e; + } + + return allNewPermissions; + } + + private static final long serialVersionUID = -4994341295468752327L; + final Logger logger = LogManager.getLogger(UserAccessController.class); + + private final GenericEntityRepository genericEntityRepository; + private final UserRepository userRepository; + private final UserByOfficeRepository userByOfficeRepository; + private final PermissionRepository permissionRepository; + + public UserAccessController() { + this.genericEntityRepository = new GenericEntityRepository(); + this.userRepository = new UserRepository(); + this.userByOfficeRepository = new UserByOfficeRepository(); + this.permissionRepository = new PermissionRepository(); + } + + public GenericEntityRepository getGenericEntityRepository() { + return genericEntityRepository; + } + + public UserRepository getUserRepository() { + return userRepository; + } + + public UserByOfficeRepository getUserByOfficeRepository() { + return userByOfficeRepository; + } + + public PermissionRepository getPermissionRepository() { + return permissionRepository; + } + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/system/user/UserAdminController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/system/user/UserAdminController.java new file mode 100644 index 0000000..eb30113 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/system/user/UserAdminController.java @@ -0,0 +1,111 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.system.user; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.catalog.constance.RouteCfg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.UserByOffice; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.UserStatus; +import com.arrebol.apc.repository.GenericEntityRepository; +import com.arrebol.apc.repository.core.UserByOfficeRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class UserAdminController implements Serializable { + + /** + * + * @param statuses + * @param officeId + * @param ownerId + * @return + */ + public List findUsersInOfficeInStatuses(List statuses, String officeId, String ownerId) { + logger.debug("findUsersInOfficeInStatuses"); + List retults = new ArrayList(); + try { + retults = getUserByOfficeRepository() + .findUsersInOfficeInStatuses(statuses, new Office(officeId), ownerId); + } catch (Exception e) { + logger.error("findUsersInOfficeInStatuses", e); + } + + return retults; + } + + /** + * + * @param officeId + * @return + * @throws Exception + */ + public List findRoutesByOffice(String officeId) throws Exception { + logger.debug("findRoutesByOffice"); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(RouteCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + parameters.add(new ModelParameter(RouteCfg.FIELD_OFFICE, new Office(officeId))); + + return genericEntityRepository.xmlQueryAPCEntities(RouteCtlg.class, RouteCfg.QUERY_FIND_ALL_ROUTES, parameters); + } catch (Exception e) { + logger.error("findRoutesByOffice", e); + throw e; + } + } + + /** + * + * @param officeId + * @return + * @throws Exception + */ + public List findRoutesWithNoCertifierUser(String officeId) throws Exception { + logger.debug("findRoutesWithNoCertifierUser"); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(RouteCfg.FIELD_OFFICE, new Office(officeId))); + + return genericEntityRepository.xmlQueryAPCEntities(RouteCtlg.class, RouteCfg.QUERY_FIND_ROUTES_WITH_NO_CERTIFIER_USER, parameters); + } catch (Exception e) { + logger.error("findRoutesWithNoCertifierUser", e); + throw e; + } + } + + private static final long serialVersionUID = -2718549077979303345L; + final Logger logger = LogManager.getLogger(UserAdminController.class); + + private final GenericEntityRepository genericEntityRepository; + private final UserByOfficeRepository userByOfficeRepository; + + public UserAdminController() { + this.genericEntityRepository = new GenericEntityRepository(); + this.userByOfficeRepository = new UserByOfficeRepository(); + } + + public GenericEntityRepository getGenericEntityRepository() { + return genericEntityRepository; + } + + public UserByOfficeRepository getUserByOfficeRepository() { + return userByOfficeRepository; + } + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/system/user/UserCreateController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/system/user/UserCreateController.java new file mode 100644 index 0000000..72c88e0 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/system/user/UserCreateController.java @@ -0,0 +1,419 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.system.user; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.catalog.HumanResourceHasRoute; +import com.arrebol.apc.model.catalog.HumanResourceHasRouteId; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.catalog.constance.RouteCfg; +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.Permission; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.core.UserByOffice; +import com.arrebol.apc.model.core.UserByOfficeHasPermission; +import com.arrebol.apc.model.core.UserByOfficeHasPermissionId; +import com.arrebol.apc.model.core.constance.HumanResourceCfg; +import com.arrebol.apc.model.core.constance.OfficeCfg; +import com.arrebol.apc.model.core.constance.PermissionCfg; +import com.arrebol.apc.model.core.constance.UserByOfficeCfg; +import com.arrebol.apc.model.core.constance.UserByOfficeHasPermissionCfg; +import com.arrebol.apc.model.core.constance.UserCfg; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.HumanResourceStatus; +import com.arrebol.apc.model.enums.PermissionStatus; +import com.arrebol.apc.model.enums.PermissionType; +import com.arrebol.apc.repository.GenericEntityRepository; +import com.arrebol.apc.repository.core.HumanResourceRepository; +import com.arrebol.apc.repository.core.PermissionRepository; +import com.arrebol.apc.repository.core.UserByOfficeRepository; +import com.arrebol.apc.repository.core.UserRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class UserCreateController implements Serializable { + + /** + * + * @return + */ + public List getAllActivePermissionController() { + logger.debug("getAllActivePermissionController"); + return getPermissionRepository().getAllActivePermissionByType(PermissionType.PRIVATE); + } + + /** + * + * @param searchingName + * @param officeId + * @return True if userName is available otherwise false. + */ + public boolean isUsernameAvailableController(String searchingName, String officeId) { + logger.debug("isUsernameAvailableController"); + + boolean available = false; + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(UserCfg.FIELD_USER_NAME, searchingName)); + parameters.add(new ModelParameter(OfficeCfg.FIELD_ID, officeId)); + + Long count = (Long) getUserRepository() + .xmlQueryAPCEntityUniqueResult( + UserCfg.QUERY_IS_USERNAME_AVAILABLE, + parameters + ); + + if (count == 0) { + available = true; + } + } catch (Exception e) { + logger.error("isUsernameAvailableController", e); + } + + return available; + } + + /** + * 1) Verifica que el usuario aun este disponible 2) Verifica que tipo de + * usuario se va a crear y en todos los casos se debera de guardar usuario y + * oficina más las carecteristicas propias de cada tipo de usuario: A) WEB + * debe guardar permisos B) MOBILE debe guardar rutas C) BOTH debe guardar + * rutas y permisos. + * + * @param user + * @param userByOffice + * @param routes + * @param permissions + * @return + */ + public boolean saveUserController(User user, UserByOffice userByOffice, + List routes, List permissions) { + logger.debug("saveUserController"); + boolean success = false; + try { + List humanResourceHasRoutes = new ArrayList<>(); + List userByOfficeHasPermissions = new ArrayList<>(); + List parameters = new ArrayList<>(); + List types = new ArrayList<>(); + List genericPermissions; + + switch (user.getUserType()) { + case WEB: + types.add(PermissionType.PUBLIC); + + parameters.add(new ModelParameter(PermissionCfg.FIELD_PERMISSION_TYPE, types)); + parameters.add(new ModelParameter(PermissionCfg.FIELD_PERMISSION_STATUS, PermissionStatus.ENEBLED)); + + genericPermissions = getGenericEntityRepository().xmlQueryAPCEntities(Permission.class, PermissionCfg.QUERY_FIND_PERMISSION_BY_TYPE_AND_STATUS, parameters); + + genericPermissions.forEach((Permission value) -> { + UserByOfficeHasPermission row = new UserByOfficeHasPermission( + new UserByOfficeHasPermissionId(null, value.getId()), user.getCreatedBy() + ); + + userByOfficeHasPermissions.add(row); + }); + + permissions.forEach((Permission value) -> { + UserByOfficeHasPermission row = new UserByOfficeHasPermission( + new UserByOfficeHasPermissionId(null, value.getId()), user.getCreatedBy() + ); + + userByOfficeHasPermissions.add(row); + }); + break; + case MOBILE: + routes.forEach((RouteCtlg value) -> { + HumanResourceHasRoute row = new HumanResourceHasRoute( + new HumanResourceHasRouteId(user.getHumanResource().getId(), value.getId()), + user.getCreatedBy() + ); + + humanResourceHasRoutes.add(row); + }); + break; + case BOTH: + types.add(PermissionType.PUBLIC); + + parameters.add(new ModelParameter(PermissionCfg.FIELD_PERMISSION_TYPE, types)); + parameters.add(new ModelParameter(PermissionCfg.FIELD_PERMISSION_STATUS, PermissionStatus.ENEBLED)); + + genericPermissions = getGenericEntityRepository().xmlQueryAPCEntities(Permission.class, PermissionCfg.QUERY_FIND_PERMISSION_BY_TYPE_AND_STATUS, parameters); + + genericPermissions.forEach((Permission value) -> { + UserByOfficeHasPermission row = new UserByOfficeHasPermission( + new UserByOfficeHasPermissionId(null, value.getId()), user.getCreatedBy() + ); + + userByOfficeHasPermissions.add(row); + }); + + permissions.forEach((Permission value) -> { + UserByOfficeHasPermission row = new UserByOfficeHasPermission( + new UserByOfficeHasPermissionId(null, value.getId()), user.getCreatedBy() + ); + + userByOfficeHasPermissions.add(row); + }); + + routes.forEach((RouteCtlg value) -> { + HumanResourceHasRoute row = new HumanResourceHasRoute( + new HumanResourceHasRouteId(user.getHumanResource().getId(), value.getId()), + user.getCreatedBy() + ); + + humanResourceHasRoutes.add(row); + }); + break; + } + + success = userRepository.createUser(user, + userByOffice, + humanResourceHasRoutes, + userByOfficeHasPermissions); + } catch (Exception e) { + logger.error(e); + } + + return success; + } + + /** + * Save a list of APC entities + * + * + * @param permissions + * @param userByOfficeId + * @param createdBy + * @return + */ + public boolean saveManyController(List permissions, String userByOfficeId, String createdBy) { + + return getGenericEntityRepository().insertManyAPCEntity(buildUniquePermissionList(permissions, userByOfficeId, createdBy)); + } + + /** + * + * @param permissions New permission to be saved. + * @param createdBy + * @param userByOfficeId Used to look all old permissions that need to be + * delete before to insert new permission list. + * @return + */ + public boolean updatePermissionsController(List permissions, String userByOfficeId, String createdBy) { + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(UserByOfficeHasPermissionCfg.FIELD_USER_BY_OFFICE, new UserByOffice(userByOfficeId))); + + boolean success = getGenericEntityRepository().xmlUpdateOrDeleteAPCEntity(UserByOfficeHasPermissionCfg.XML_QUERY_DELETE_PERMISSION_BY_USER_ID_AND_OFFICE_ID, parameters); + + if (success) { + success = getGenericEntityRepository().insertManyAPCEntity(buildUniquePermissionList(permissions, userByOfficeId, createdBy)); + } + + return success; + } + + /** + * + * @param user + * @param fromView 1 = From User-> Create
+ * @return + */ + @Deprecated + public boolean updateCreateUserController(User user, int fromView) { + logger.debug("updateCreateUser"); + + return getUserRepository().updateUserById(user, fromView); + } + + /** + * + * @param office + * @param humanResourceStatus + * @return + */ + public List findAllHRsWithoutUser(Office office, HumanResourceStatus humanResourceStatus) { + logger.debug("findAllHRsWithoutUser"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(HumanResourceCfg.FIELD_OFFICE, office)); + parameters.add(new ModelParameter(HumanResourceCfg.FIELD_HR_STATUS, humanResourceStatus)); + + return getGenericEntityRepository().xmlQueryAPCEntities(HumanResource.class, HumanResourceCfg.QUERY_FIND_ALL_HRS_WITHOUT_USER, parameters); + } + + /** + * + * @param userId + * @param officeId + * @return If user was found return an instace of UserByOffice object, but + * return null if user was not found. + */ + public UserByOffice findIdOfUserByOffice(String userId, String officeId) { + logger.debug("findAllHRsWithoutUser"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(UserByOfficeCfg.FIELD_USER, new User(userId))); + parameters.add(new ModelParameter(UserByOfficeCfg.FIELD_OFFICE, new Office(officeId))); + + return getUserByOfficeRepository().findIdOfUserByOffice(UserByOfficeCfg.QUERY_FIND_ID_OF_USER_BY_OFFICE, parameters); + } + + /** + * + * @return + */ + public List findAllEnebledPermissions() { + logger.debug("findAllEnebledPermissions"); + return getPermissionRepository().findAllEnebledPermissions(); + } + + /** + * + * @param entities + * @return + */ + private List buildUniquePermissionList(List permissions, String userByOfficeId, String createdBy) { + logger.info("buildUniquePermissionList"); + + List allNewPermissions = new ArrayList<>(); + + try { + Set uniquePermission = new HashSet<>(); + + List appMenuLst = findAllEnebledPermissions(); + + permissions.forEach((permission) -> { + if (!uniquePermission.contains(permission)) { + uniquePermission.add(permission); + } + + Optional optional = appMenuLst.stream() + .filter((appMenu) -> appMenu.getPermission().equals(permission.getParentName())) + .findAny(); + + if (optional.isPresent()) { + if (!uniquePermission.contains(optional.get())) { + uniquePermission.add(optional.get()); + } + } + }); + + uniquePermission.forEach((unique) -> { + allNewPermissions.add( + new UserByOfficeHasPermission( + new UserByOfficeHasPermissionId( + userByOfficeId, + unique.getId() + ), + createdBy + ) + ); + }); + } catch (Exception e) { + logger.error("buildUniquePermissionList", e); + throw e; + } + + return allNewPermissions; + } + + /** + * + * @param officeId + * @return + * @throws Exception + */ + public List findRoutesByOffice(String officeId) throws Exception { + logger.debug("findRoutesByOffice"); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(RouteCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + parameters.add(new ModelParameter(RouteCfg.FIELD_OFFICE, new Office(officeId))); + + return genericEntityRepository.xmlQueryAPCEntities(RouteCtlg.class, RouteCfg.QUERY_FIND_ALL_ROUTES, parameters); + } catch (Exception e) { + logger.error("findRoutesByOffice", e); + throw e; + } + } + + /** + * + * @param officeId + * @return + * @throws Exception + */ + public List findRoutesWithNoCertifierUser(String officeId) throws Exception { + logger.debug("findRoutesWithNoCertifierUser"); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(RouteCfg.FIELD_OFFICE, new Office(officeId))); + + return genericEntityRepository.xmlQueryAPCEntities(RouteCtlg.class, RouteCfg.QUERY_FIND_ROUTES_WITH_NO_CERTIFIER_USER, parameters); + } catch (Exception e) { + logger.error("findRoutesWithNoCertifierUser", e); + throw e; + } + } + + private static final long serialVersionUID = 3496689435395697940L; + final Logger logger = LogManager.getLogger(UserCreateController.class); + + private final GenericEntityRepository genericEntityRepository; + private final PermissionRepository permissionRepository; + private final UserRepository userRepository; + private final HumanResourceRepository humanResourceRepository; + private final UserByOfficeRepository userByOfficeRepository; + + public UserCreateController() { + this.genericEntityRepository = new GenericEntityRepository(); + this.permissionRepository = new PermissionRepository(); + this.userRepository = new UserRepository(); + this.humanResourceRepository = new HumanResourceRepository(); + this.userByOfficeRepository = new UserByOfficeRepository(); + } + + private GenericEntityRepository getGenericEntityRepository() { + return genericEntityRepository; + } + + private PermissionRepository getPermissionRepository() { + return permissionRepository; + } + + private UserRepository getUserRepository() { + return userRepository; + } + + private HumanResourceRepository getHumanResourceRepository() { + return humanResourceRepository; + } + + public UserByOfficeRepository getUserByOfficeRepository() { + return userByOfficeRepository; + } + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/system/user/UserUpdateController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/system/user/UserUpdateController.java new file mode 100644 index 0000000..1ef42b0 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/system/user/UserUpdateController.java @@ -0,0 +1,294 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.system.user; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.catalog.HumanResourceHasRoute; +import com.arrebol.apc.model.catalog.HumanResourceHasRouteId; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.catalog.constance.RouteCfg; +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.Permission; +import com.arrebol.apc.model.core.UserByOffice; +import com.arrebol.apc.model.core.UserByOfficeHasPermission; +import com.arrebol.apc.model.core.UserByOfficeHasPermissionId; +import com.arrebol.apc.model.core.constance.HumanResourceHasRouteCfg; +import com.arrebol.apc.model.core.constance.OfficeCfg; +import com.arrebol.apc.model.core.constance.PermissionCfg; +import com.arrebol.apc.model.core.constance.UserByOfficeHasPermissionCfg; +import com.arrebol.apc.model.core.constance.UserCfg; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.PermissionStatus; +import com.arrebol.apc.model.enums.PermissionType; +import com.arrebol.apc.model.enums.UserStatus; +import com.arrebol.apc.model.enums.UserType; +import com.arrebol.apc.repository.core.UserByOfficeRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class UserUpdateController implements Serializable { + + /** + * + * @param statuses + * @param officeId + * @param ownerId + * @return + */ + public List findUsersInOfficeInStatuses(List statuses, String officeId, String ownerId) { + logger.debug("findUsersInOfficeInStatuses"); + List retults = new ArrayList(); + try { + retults = userByOfficeRepository.findUsersInOfficeInStatuses(statuses, new Office(officeId), ownerId); + } catch (Exception e) { + logger.error("findUsersInOfficeInStatuses", e); + } + + return retults; + } + + /** + * + * @param isRoute true is route otherwise is permission. + * @param in true means bring by UBO or HR, otherwise means find list that + * does not have UBO or HR. + * @param uboId User By Office Id. + * @param hrId Human Resource Id. + * @param officeId Office Id. + * @return + */ + public List findList(boolean isRoute, boolean in, String uboId, String hrId, String officeId) { + logger.debug("findList"); + List results = new ArrayList(); + try { + String query; + List parameters = new ArrayList<>(); + + if (isRoute) { + query = in ? RouteCfg.QUERY_FIND_ALL_ROUTES_BY_HRHR : RouteCfg.QUERY_FIND_ALL_NOT_ROUTES_BY_HRHR; + + parameters.add(new ModelParameter(HumanResourceHasRouteCfg.FIELD_HUMAN_RESOURCE, new HumanResource(hrId))); + parameters.add(new ModelParameter(RouteCfg.FIELD_OFFICE, new Office(officeId))); + } else { + query = in ? PermissionCfg.QUERY_FIND_ALL_PERMISSIONS_BY_UBO : PermissionCfg.QUERY_FIND_ALL_NOT_PERMISSIONS_BY_UBO; + + parameters.add(new ModelParameter(UserByOfficeHasPermissionCfg.FIELD_USER_BY_OFFICE, new UserByOffice(uboId))); + } + results = userByOfficeRepository.findList(isRoute, query, parameters); + } catch (Exception e) { + logger.error("findList", e); + } + return results; + } + + /** + * + * @param isRoute + * @param types + * @param officeId + * @return + */ + public List findGeneralList(boolean isRoute, List types, String officeId) { + logger.debug("findGeneralList"); + List results = new ArrayList(); + try { + String query; + List parameters = new ArrayList<>(); + + if (isRoute) { + query = RouteCfg.QUERY_FIND_ALL_AVAILABLES_ROUTES; + + parameters.add(new ModelParameter(RouteCfg.FIELD_OFFICE, new Office(officeId))); + parameters.add(new ModelParameter(RouteCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + } else { + query = PermissionCfg.QUERY_FIND_ALL_PERMISSION_BY_TYPE_AND_STATUS; + + parameters.add(new ModelParameter(PermissionCfg.FIELD_PERMISSION_TYPE, types)); + parameters.add(new ModelParameter(PermissionCfg.FIELD_PERMISSION_STATUS, PermissionStatus.ENEBLED)); + } + results = userByOfficeRepository.findList(isRoute, query, parameters); + } catch (Exception e) { + logger.error("findGeneralList", e); + } + return results; + } + + public boolean updateUser(UserType newUserType, UserByOffice userByOffice, + List routes, List permissions, ActiveStatus certifier, ActiveStatus management) { + logger.info("updateUser"); + boolean success = false; + try { + List humanResourceHasRoutes = new ArrayList<>(); + List userByOfficeHasPermissions = new ArrayList<>(); + + switch (newUserType) { + case WEB: + permissions.forEach((Permission value) -> { + UserByOfficeHasPermission row = new UserByOfficeHasPermission( + new UserByOfficeHasPermissionId(userByOffice.getId(), value.getId()), userByOffice.getCreatedBy() + ); + + userByOfficeHasPermissions.add(row); + }); + break; + case MOBILE: + routes.forEach((RouteCtlg value) -> { + HumanResourceHasRoute row = new HumanResourceHasRoute( + new HumanResourceHasRouteId(userByOffice.getUser().getHumanResource().getId(), value.getId()), + userByOffice.getCreatedBy() + ); + + humanResourceHasRoutes.add(row); + }); + break; + case BOTH: + permissions.forEach((Permission value) -> { + UserByOfficeHasPermission row = new UserByOfficeHasPermission( + new UserByOfficeHasPermissionId(userByOffice.getId(), value.getId()), userByOffice.getCreatedBy() + ); + + userByOfficeHasPermissions.add(row); + }); + + routes.forEach((RouteCtlg value) -> { + HumanResourceHasRoute row = new HumanResourceHasRoute( + new HumanResourceHasRouteId(userByOffice.getUser().getHumanResource().getId(), value.getId()), + userByOffice.getCreatedBy() + ); + + humanResourceHasRoutes.add(row); + }); + break; + } + + // 1 Borrar rutas y/o permisos + // a- Si usuario previo es web - borrar permisos + // b- Si usuario previo es mobile - borrar rutas + // c- Si usuario previo es ambos - borrar permisos y rutas. + // 2 Actualizar datos + // a- Si usuario es web - agregar permisos + // b- Si usuario es mobile - agragar rutas + // c- Si usuario es ambos - agregar permisos y rutas. + success = userByOfficeRepository.updateUser( + newUserType, + userByOffice, + certifier, + humanResourceHasRoutes, + userByOfficeHasPermissions, + management + + ); + } catch (Exception e) { + logger.error("updateUser", e); + } + return success; + } + + /** + * + * @param searchingName + * @param officeId + * @return + */ + public boolean isUsernameAvailableController(String searchingName, String officeId) { + logger.debug("isUsernameAvailableController"); + + boolean available = false; + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(UserCfg.FIELD_USER_NAME, searchingName)); + parameters.add(new ModelParameter(OfficeCfg.FIELD_ID, officeId)); + + Long count = (Long) userByOfficeRepository + .xmlQueryAPCEntityUniqueResult( + UserCfg.QUERY_IS_USERNAME_AVAILABLE, + parameters + ); + + if (count == 0) { + available = true; + } + } catch (Exception e) { + logger.error("isUsernameAvailableController", e); + } + + return available; + } + + /** + * + * @param action Actions are pwd, usr, enebled, disabled & deleted. + * @param userId + * @param status + * @param pwd + * @param userName + * @param lastUpdatedBy + * @return + */ + public boolean updateUserOtherActions( + String action, + String userId, + UserStatus status, + String pwd, + String userName, + String lastUpdatedBy) { + logger.info("updateUserOtherActions"); + boolean success = false; + try { + String updateQuery; + List parameters = new ArrayList<>(); + switch (action) { + case "pwd": + updateQuery = UserCfg.QUERY_UPDATE_PASSWORD_BY_USER_ID; + + parameters.add(new ModelParameter(UserCfg.FIELD_PASSWORD, pwd)); + break; + case "usr": + updateQuery = UserCfg.QUERY_UPDATE_USER_NAME_BY_USER_ID; + + parameters.add(new ModelParameter(UserCfg.FIELD_USER_NAME, userName)); + parameters.add(new ModelParameter(UserCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(UserCfg.FIELD_LAST_UPDATED_ON, new Date())); + break; + default: + updateQuery = UserCfg.QUERY_UPDATE_USER_STATUS_BY_USER_ID; + + parameters.add(new ModelParameter(UserCfg.FIELD_USER_STATUS, status)); + parameters.add(new ModelParameter(UserCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(UserCfg.FIELD_LAST_UPDATED_ON, new Date())); + break; + } + parameters.add(new ModelParameter(UserCfg.FIELD_ID, userId)); + + success = userByOfficeRepository.updateEntityByQuery(updateQuery, parameters); + } catch (Exception e) { + logger.error("updateUserOtherActions", e); + } + return success; + } + + private static final long serialVersionUID = -6448348501480568726L; + final Logger logger = LogManager.getLogger(UserUpdateController.class); + + public UserUpdateController() { + this.userByOfficeRepository = new UserByOfficeRepository(); + } + + private final UserByOfficeRepository userByOfficeRepository; + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/topbar/PrivacyController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/topbar/PrivacyController.java new file mode 100644 index 0000000..8207636 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/topbar/PrivacyController.java @@ -0,0 +1,56 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.topbar; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.core.constance.UserCfg; +import com.arrebol.apc.repository.GenericEntityRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class PrivacyController implements Serializable { + + /** + * + * @param password + * @param userId + * @return + * @throws Exception + */ + public boolean updatePasswordByUserId(String password, String userId) throws Exception { + logger.debug("updatePasswordByUserId"); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(UserCfg.FIELD_PASSWORD, password)); + parameters.add(new ModelParameter(UserCfg.FIELD_ID, userId)); + + return genericEntityRepository.xmlUpdateOrDeleteAPCEntity(UserCfg.QUERY_UPDATE_PASSWORD_BY_USER_ID, parameters); + } catch (Exception e) { + logger.error("updatePasswordByUserId", e); + throw e; + } + } + + private static final long serialVersionUID = 1131011930227628970L; + final Logger logger = LogManager.getLogger(PrivacyController.class); + + private final GenericEntityRepository genericEntityRepository; + + public PrivacyController() { + this.genericEntityRepository = new GenericEntityRepository(); + } + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/topbar/TopBarController.java b/apc-controller/src/main/java/com/arrebol/apc/controller/topbar/TopBarController.java new file mode 100644 index 0000000..aa4d5e9 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/topbar/TopBarController.java @@ -0,0 +1,51 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.topbar; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.repository.core.OfficeRepository; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.core.constance.OfficeCfg; +import com.arrebol.apc.model.core.constance.UserByOfficeCfg; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class TopBarController implements Serializable { + + public List findAllOfficesByUserController(String userId) { + logger.debug("findAllOfficesByUserController"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(UserByOfficeCfg.FIELD_USER, new User(userId))); + + return getOfficeRepository().findAllOfficesByUser(OfficeCfg.QUERY_TUPLE_FIND_ALL_OFFICES_BY_USER, parameters); + } + + private static final long serialVersionUID = -4239053737928432361L; + final Logger logger = LogManager.getLogger(TopBarController.class); + + public final OfficeRepository officeRepository; + + public TopBarController() { + this.officeRepository = new OfficeRepository(); + } + + public OfficeRepository getOfficeRepository() { + return officeRepository; + } + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/util/ConnectionManager.java b/apc-controller/src/main/java/com/arrebol/apc/controller/util/ConnectionManager.java new file mode 100644 index 0000000..a376c20 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/util/ConnectionManager.java @@ -0,0 +1,40 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.util; + +import org.hibernate.Session; +import org.hibernate.Transaction; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public class ConnectionManager { + + /** + * + * @param session + */ + protected void closeSession(Session session) { + if (null != session) { + session.close(); + } + } + + /** + * + * @param transaction + */ + protected void rollback(Transaction transaction) { + if (null != transaction) { + transaction.rollback(); + } + } + + public static final String USER_ID_MANAGER_APPLICATION = "User-Id-Manager-Application"; +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/util/DateWrapper.java b/apc-controller/src/main/java/com/arrebol/apc/controller/util/DateWrapper.java new file mode 100644 index 0000000..0021cdf --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/util/DateWrapper.java @@ -0,0 +1,199 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.controller.util; + +import static java.util.Calendar.MONTH; +import static java.util.Calendar.DAY_OF_YEAR; +import static java.util.Calendar.DAY_OF_MONTH; +import static java.util.Calendar.HOUR_OF_DAY; +import static java.util.Calendar.MILLISECOND; +import static java.util.Calendar.MINUTE; +import static java.util.Calendar.SECOND; + +import java.util.Calendar; +import java.util.Date; + +/** + * + * @author oscarvargas + */ +public class DateWrapper { + + @Override + public String toString() { + return this.date.toString(); + } + + public static DateWrapper getInstance() { + return new DateWrapper(); + } + + public static DateWrapper today() { + return new DateWrapper(); + } + + /** + * Get date time Gregorian Time - 6 (GT-6). + * + * @return + */ + public static Date getTodayMXTime() { + Calendar calendar = Calendar.getInstance(); + + calendar.add(Calendar.HOUR_OF_DAY, -6); + + return calendar.getTime(); + } + + public static Date updateDateToMXTime(Date curdate) { + Calendar calendar = Calendar.getInstance(); + + calendar.setTime(curdate); + + calendar.add(Calendar.HOUR_OF_DAY, -6); + + return calendar.getTime(); + } + + /** + * Get date time Gregorian Time - 6 (GT-6), set time to midnigth + * 00:00:00:000. + * + * @return + */ + public static Date midnigthMXTime() { + Calendar calendar = Calendar.getInstance(); + + calendar.add(Calendar.HOUR_OF_DAY, -6); + + calendar.set(HOUR_OF_DAY, 0); + calendar.set(MINUTE, 0); + calendar.set(SECOND, 0); + calendar.set(MILLISECOND, 0); + + return calendar.getTime(); + } + + public static Date startDate(Date startDate) { + Calendar calendar = Calendar.getInstance(); + + calendar.setTime(startDate); + + calendar.add(Calendar.HOUR_OF_DAY, -6); + + calendar.set(HOUR_OF_DAY, 0); + calendar.set(MINUTE, 0); + calendar.set(SECOND, 0); + calendar.set(MILLISECOND, 0); + + return calendar.getTime(); + } + + public static Date endDate(Date endDate) { + Calendar calendar = Calendar.getInstance(); + + calendar.setTime(endDate); + + calendar.add(Calendar.HOUR_OF_DAY, -6); + + calendar.set(HOUR_OF_DAY, 23); + calendar.set(MINUTE, 59); + calendar.set(SECOND, 59); + calendar.set(MILLISECOND, 999); + + return calendar.getTime(); + } + + /** + * Get date time Gregorian Time - 6 (GT-6), set time to midnigth 23:59:59. + * + * @return + */ + public static Date lastMXTime() { + Calendar calendar = Calendar.getInstance(); + + calendar.add(Calendar.HOUR, -6); + + calendar.set(HOUR_OF_DAY, 23); + calendar.set(MINUTE, 59); + calendar.set(SECOND, 59); + + return calendar.getTime(); + } + + public DateWrapper midnigthTime() { + Calendar calendar = this.newCalendar(this.date); + calendar.set(HOUR_OF_DAY, 0); + calendar.set(MINUTE, 0); + calendar.set(SECOND, 0); + calendar.set(MILLISECOND, 0); + return new DateWrapper(calendar.getTime()); + } + + public DateWrapper add(int aCalendarField, int anMount) { + Calendar calendar = this.newCalendar(this.date); + calendar.add(aCalendarField, anMount); + return new DateWrapper(calendar.getTime()); + } + + private Calendar newCalendar(Date aDate) { + Calendar calendar = Calendar.getInstance(); + calendar.setLenient(false); + calendar.setTime(aDate); + return calendar; + } + + public DateWrapper subtractDaysOfYears(int anMount) { + return this.addDaysOfYears(-anMount); + } + + public DateWrapper addDaysOfYears(int anMount) { + return this.add(DAY_OF_YEAR, anMount); + } + + public Date asDate() { + return (Date) this.date.clone(); + } + + public DateWrapper firstDateForMonth() { + + Calendar calendar = newCalendar(this.date); + calendar.set(DAY_OF_MONTH, Calendar.getInstance().getActualMinimum(DAY_OF_MONTH)); + return new DateWrapper(calendar.getTime()); + } + + public DateWrapper lastDateForMonth() { + Calendar calendar = newCalendar(this.date); + calendar.set(DAY_OF_MONTH, Calendar.getInstance().getActualMaximum(DAY_OF_MONTH)); + return new DateWrapper(calendar.getTime()); + } + + public DateWrapper subtractMonths(int months) { + return this.addMonths(-months); + } + + public DateWrapper subtractHours(int hours) { + return this.addHours(-hours); + } + + public DateWrapper addMonths(int months) { + return this.add(MONTH, months); + } + + public DateWrapper addHours(int hours) { + return this.add(HOUR_OF_DAY, hours); + } + + public Date date; + + public DateWrapper(Date aDate) { + this.date = aDate; + } + + private DateWrapper() { + this.date = new Date(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/util/FilterMap.java b/apc-controller/src/main/java/com/arrebol/apc/controller/util/FilterMap.java new file mode 100644 index 0000000..87b7c81 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/util/FilterMap.java @@ -0,0 +1,79 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.util; + +import java.util.Map; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class FilterMap { + + static final String GLOBAL_FILTER = "globalFilter"; + + /** + * + * @param map + * @param hasWhere + * @return + */ + public static StringBuilder genericFilterByMapping(Map map, boolean hasWhere) { + StringBuilder sqlQuery = new StringBuilder(); + if (null != map) { + for (Map.Entry mapping : map.entrySet()) { + if (hasWhere) { + sqlQuery.append(" AND "); + sqlQuery.append(mapping.getKey()); + sqlQuery.append(" LIKE '%"); + sqlQuery.append(mapping.getValue()); + sqlQuery.append("%' "); + } else { + sqlQuery.append(" WHERE "); + sqlQuery.append(mapping.getKey()); + sqlQuery.append(" LIKE '%"); + sqlQuery.append(mapping.getValue()); + sqlQuery.append("%' "); + hasWhere = true; + } + } + } + return sqlQuery; + } + + /** + * + * @param filterBy + * @param hasWhere True is query contains where clause otherwise false + * @return + */ + public static StringBuilder filterByExcludeGlobalFilter(Map filterBy, boolean hasWhere) { + StringBuilder sqlQuery = new StringBuilder(); + if (null != filterBy) { + for (Map.Entry mapping : filterBy.entrySet()) { + if (!GLOBAL_FILTER.equals(mapping.getKey())) { + if (hasWhere) { + sqlQuery.append(" AND "); + sqlQuery.append(mapping.getKey()); + sqlQuery.append(" LIKE '%"); + sqlQuery.append(mapping.getValue().toString()); + sqlQuery.append("%' "); + } else { + sqlQuery.append(" WHERE "); + sqlQuery.append(mapping.getKey()); + sqlQuery.append(" LIKE '%"); + sqlQuery.append(mapping.getValue().toString()); + sqlQuery.append("%' "); + hasWhere = true; + } + } + } + } + return sqlQuery; + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/util/HibernateUtil.java b/apc-controller/src/main/java/com/arrebol/apc/controller/util/HibernateUtil.java new file mode 100644 index 0000000..4fa65d7 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/util/HibernateUtil.java @@ -0,0 +1,69 @@ +/* + * Arrebol Consultancy copyright + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.util; + +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class HibernateUtil { + + private static final String HIBERNATE_CFG_XML = "apc.cfg.xml"; + private static SessionFactory sessionFactory; + + private HibernateUtil() { + } + + // Hibernate 5: + private static SessionFactory buildSessionFactory() { + try { + // Create the ServiceRegistry from hibernate.cfg.xml + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure(HIBERNATE_CFG_XML).build(); + + // Create a metadata sources using the specified service registry. + Metadata metadata = new MetadataSources(serviceRegistry).getMetadataBuilder().build(); + + return metadata.getSessionFactoryBuilder().build(); + } catch (Throwable ex) { + System.err.println("Initial SessionFactory creation failed." + ex); + throw new ExceptionInInitializerError(ex); + } + } + + /** + * Configuration object is used to create a SessionFactory object which in + * turn configures Hibernate for the application using the supplied + * configuration file and allows for a Session object to be instantiated. + * + * The SessionFactory is a thread safe object and used by all the threads of + * an application. + * + * The SessionFactory is a heavyweight object; it is usually created during + * application start up and kept for later use. + * + * You would need one SessionFactory object per database using a separate + * configuration file. + * + * So, if you are using multiple databases, then you would have to create + * multiple SessionFactory objects. + * + * @return SessionFactory. + */ + public final static SessionFactory getSessionFactory() { + if (null == sessionFactory) { + sessionFactory = buildSessionFactory(); + } + return sessionFactory; + } + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/controller/util/logger/LogConnectionFactory.java b/apc-controller/src/main/java/com/arrebol/apc/controller/util/logger/LogConnectionFactory.java new file mode 100644 index 0000000..36ca2eb --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/controller/util/logger/LogConnectionFactory.java @@ -0,0 +1,34 @@ +/* + * Arrebol Consultancy copyright + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.util.logger; + +import java.sql.Connection; +import java.sql.SQLException; +import org.apache.commons.dbcp2.BasicDataSource; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class LogConnectionFactory { + + private static BasicDataSource dataSource; + + public LogConnectionFactory() { + } + + public static Connection getConnection() throws SQLException { + if (dataSource == null) { + dataSource = new BasicDataSource(); + dataSource.setUrl("jdbc:mysql://localhost:3306/apo_pro_com_april_ten?serverTimezone=UTC"); + dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); + dataSource.setUsername("errortracelocalhost"); + dataSource.setPassword("zy61$Jql"); + } + return dataSource.getConnection(); + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/repository/AbstractRepository.java b/apc-controller/src/main/java/com/arrebol/apc/repository/AbstractRepository.java new file mode 100644 index 0000000..d1526cc --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/repository/AbstractRepository.java @@ -0,0 +1,763 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.repository; + +import com.arrebol.apc.controller.util.HibernateUtil; +import com.arrebol.apc.model.ModelParameter; +import java.util.List; +import javax.persistence.Tuple; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.Query; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public abstract class AbstractRepository { + + private Session sessionOld; + private Transaction transactionOld; + + /** + * Save an APC entity. + * + * @param entity APC entity in DB. + * @return + */ + protected boolean save(Object entity) { + logger.debug("Save"); + boolean success = false; + + //Session session = null; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + session.save(entity); + transaction.commit(); + + logger.debug("Entity saved: " + entity); + + success = true; + } catch (HibernateException e) { + logger.error("Save Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method save() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + }/* finally { + if (null != session) { + session.close(); + } + }*/ + + return success; + } + + /** + * + * @param entities + * @return + */ + protected boolean saveMany(List entities) { + logger.debug("saveMany"); + boolean success = false; + + //Session session = null; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + entities.forEach(entity -> { + session.save(entity); + }); + transaction.commit(); + + logger.debug("Entities saved: "); + + success = true; + } catch (HibernateException e) { + logger.error("saveMany Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method saveMany() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + }/* finally { + if (null != session) { + session.close(); + } + }*/ + + return success; + } + + /** + * Update an APC entity. + * + * @param entity APC entity in DB. + * @return + */ + protected boolean update(Object entity) { + logger.debug("update"); + boolean success = false; + + //Session session = null; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + session.update(entity); + transaction.commit(); + + logger.debug("Entity updated: " + entity); + + success = true; + } catch (HibernateException e) { + logger.error("update Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method update() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + }/* finally { + if (null != session) { + session.close(); + } + }*/ + + return success; + } + + /** + * Delete an APC entity. + * + * @param entity APC entity in DB. + * @return + */ + protected boolean delete(Object entity) { + logger.debug("delete"); + boolean success = false; + + //Session session = null; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + session.delete(entity); + transaction.commit(); + + logger.debug("Entity deleted: " + entity); + + success = true; + } catch (HibernateException e) { + logger.error("delete Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method delete() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + }/* finally { + if (null != session) { + session.close(); + } + }*/ + + return success; + } + + /** + * Find a APC entity. + * + * @param clazz APC entity class name to find in DB. + * @param id + * @return + */ + protected Object findAPCEntity(Class clazz, String id) { + logger.debug("findAPCEntity"); + Object apcEntity = null; + + //Session session = null; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + apcEntity = session.get(clazz, id); + + transaction.commit(); + + logger.debug("APC entity found: " + apcEntity); + } catch (HibernateException e) { + logger.error("findAPCEntity Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method findAPCEntity() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + }/* finally { + if (null != session) { + session.close(); + } + }*/ + return apcEntity; + } + + /** + * + * @param clazz + * @param xmlQuery + * @param parameters + * @return + */ + protected List xmlQueryLoadEntities(Class clazz, String xmlQuery, List parameters) { + logger.debug("xmlQueryLoadEntities"); + + List entities = null; + //Session session = null; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + Query query = session.createNamedQuery(xmlQuery, clazz); + + if (null != parameters) { + parameters.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + } + + entities = query.getResultList(); + + transaction.commit(); + + logger.debug("APC entities loaded from xml query: " + entities.size()); + } catch (HibernateException e) { + logger.error("xmlQueryLoadEntities Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method xmlQueryLoadEntities() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + }/* finally { + if (null != session) { + session.close(); + } + }*/ + return entities; + } + + /** + * + * @param xmlQuery + * @param parameters + * @return + */ + protected List xmlQueryTuple(String xmlQuery, List parameters) { + logger.debug("xmlQueryTuple"); + + List entityList = null; + //Session session = null; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + Query query = session.createNamedQuery(xmlQuery, Tuple.class); + + if (null != parameters) { + parameters.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + } + + entityList = query.getResultList(); + transaction.commit(); + + logger.debug("APC entity from xml query list size: " + entityList.size()); + } catch (HibernateException e) { + logger.error("xmlQueryTuple Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method xmlQueryTuple() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + }/* finally { + if (null != session) { + session.close(); + } + }*/ + return entityList; + } + + /** + * + * @param strQuery + * @param parameters + * @return + */ + protected List queryTuple(String strQuery, List parameters) { + logger.debug("queryTuple"); + + List entityList = null; + //Session session = null; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + Query query = session.createQuery(strQuery, Tuple.class); + + if (null != parameters) { + parameters.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + } + + entityList = query.getResultList(); + transaction.commit(); + + logger.debug("APC entity from string query list size: " + entityList.size()); + } catch (HibernateException e) { + logger.error("queryTuple Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method queryTuple() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + }/* finally { + if (null != session) { + session.close(); + } + }*/ + return entityList; + } + + /** + * + * @param clazz + * @param xmlQuery + * @param parameters + * @return + */ + public List xmlQueryAPCEntities(Class clazz, String xmlQuery, List parameters) { + logger.debug("xmlQueryAPCEntities"); + + List entityList = null; + //Session session = null; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + Query query = session.createNamedQuery(xmlQuery, clazz); + + if (null != parameters) { + parameters.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + } + + entityList = query.getResultList(); + transaction.commit(); + + logger.debug("APC entities from xml query list size: " + entityList.size()); + } catch (HibernateException e) { + logger.error("xmlQueryAPCEntities Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method xmlQueryAPCEntities() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + }/* finally { + if (null != session) { + session.close(); + } + }*/ + return entityList; + } + + + public List xmlQueryAPCEntities(Class clazz, String xmlQuery) { + logger.debug("xmlQueryAPCEntities"); + + List entityList = null; + //Session session = null; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + Query query = session.createNamedQuery(xmlQuery, clazz); + + entityList = query.getResultList(); + transaction.commit(); + + logger.debug("APC entities from xml query list size: " + entityList.size()); + } catch (HibernateException e) { + logger.error("xmlQueryAPCEntities Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method xmlQueryAPCEntities() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + }/* finally { + if (null != session) { + session.close(); + } + }*/ + return entityList; + } + + /** + * + * @param clazz + * @param strQuery + * @param parameters + * @return + */ + public List queryAPCEntities(Class clazz, String strQuery, List parameters) { + logger.debug("queryAPCEntities"); + + List entityList = null; + //Session session = null; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + Query query = session.createQuery(strQuery, clazz); + + if (null != parameters) { + parameters.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + } + + entityList = query.getResultList(); + transaction.commit(); + + logger.debug("APC entities from string query list size: " + entityList.size()); + } catch (HibernateException e) { + logger.error("queryAPCEntities Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method queryAPCEntities() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + }/* finally { + if (null != session) { + session.close(); + } + }*/ + return entityList; + } + + /** + * + * @param clazz + * @param xmlQuery + * @param parameters + * @return + */ + public Object xmlQueryAPCEntityUniqueResult(Class clazz, String xmlQuery, List parameters) { + logger.debug("xmlQueryAPCEntityUniqueResult"); + + Object entity = null; + //Session session = null; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + Query query = session.createNamedQuery(xmlQuery, clazz); + + if (null != parameters) { + parameters.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + } + + entity = query.uniqueResult(); + transaction.commit(); + + logger.debug("APC entity from xml query: " + entity); + } catch (HibernateException e) { + logger.error("xmlQueryAPCEntityUniqueResult Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method xmlQueryAPCEntityUniqueResult() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + }/* finally { + if (null != session) { + session.close(); + } + }*/ + return entity; + } + + /** + * + * @param xmlQuery + * @param parameters + * @return + */ + public Object xmlQueryAPCEntityUniqueResult(String xmlQuery, List parameters) { + logger.debug("xmlQueryAPCEntityUniqueResult"); + + Object entity = null; + //Session session = null; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + Query query = session.createNamedQuery(xmlQuery); + + if (null != parameters) { + parameters.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + } + + entity = query.uniqueResult(); + transaction.commit(); + + logger.debug("APC entity from xml query: " + entity); + } catch (HibernateException e) { + logger.error("xmlQueryAPCEntityUniqueResult Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method xmlQueryAPCEntityUniqueResult() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + }/* finally { + if (null != session) { + session.close(); + } + }*/ + return entity; + } + + /** + * + * @param clazz + * @param strQuery + * @param parameters + * @return + */ + public Object queryAPCEntityUniqueResult(Class clazz, String strQuery, List parameters) { + logger.debug("queryAPCEntity"); + + Object entity = null; + //Session session = null; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + Query query = session.createQuery(strQuery, clazz); + + if (null != parameters) { + parameters.forEach((param) -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + } + + entity = query.uniqueResult(); + transaction.commit(); + + logger.debug("APC entity from string query " + entity); + } catch (HibernateException e) { + logger.error("queryAPCEntityUniqueResult Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method queryAPCEntityUniqueResult() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + }/* finally { + if (null != session) { + session.close(); + } + }*/ + return entity; + } + + /** + * + * @param xmlUpdateOrDeleteQuery XML query mapped in Model hbm file. + * @param parameters Paramerter cannot be empy, it has at least one paramert + * in list. + * @return Is parameters is empty return false, otherwise execute and return + * true if was success the execution of query. + */ + protected boolean xmlUpdateOrDelete(String xmlUpdateOrDeleteQuery, List parameters) { + boolean success = false; + //Session session = null; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + Query updateOrDeleteQuery = session.createNamedQuery(xmlUpdateOrDeleteQuery); + + if (null != parameters && !parameters.isEmpty()) { + parameters.forEach((parameter) -> { + updateOrDeleteQuery.setParameter(parameter.getParameter(), parameter.getValue()); + }); + + int total = updateOrDeleteQuery.executeUpdate(); + + if (total > 0) { + transaction.commit(); + success = true; + } else { + transaction.rollback(); + } + } else { + transaction.rollback(); + } + } catch (HibernateException e) { + logger.error("xmlUpdateOrDelete Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method xmlUpdateOrDelete() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + }/* finally { + if (null != session) { + session.close(); + } + }*/ + return success; + } + + protected void openConnection() { + try { + sessionOld = HibernateUtil.getSessionFactory().getCurrentSession(); + transactionOld = sessionOld.beginTransaction(); + } catch (Exception e) { + logger.error("openConnection", e); + throw e; + } + } + + protected Session getSession() { + return sessionOld; + } + + protected void closeConnection() { + try { + transactionOld.commit(); + } catch (Exception e) { + logger.error("closeConnection", e); + rollback(); + } + } + + protected void rollback() { + if (null != transactionOld) { + transactionOld.rollback(); + } + } + + protected void flushAndClear() { + if (null != sessionOld) { + sessionOld.flush(); + sessionOld.clear(); + } + } + + final Logger logger = LogManager.getLogger(AbstractRepository.class); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/repository/AutoCompleteDAORepository.java b/apc-controller/src/main/java/com/arrebol/apc/repository/AutoCompleteDAORepository.java new file mode 100644 index 0000000..620cbd3 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/repository/AutoCompleteDAORepository.java @@ -0,0 +1,56 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.repository; + +import com.arrebol.apc.controller.util.HibernateUtil; +import com.arrebol.apc.model.ModelParameter; +import java.util.ArrayList; +import java.util.List; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.Query; + +/** + * + * @author Carlos Janitzio Zavala Lopez + * @param + */ +public abstract class AutoCompleteDAORepository extends AbstractRepository { + + /** + * + * @param clazz + * @param hbmQuery + * @param parameters + * @return + */ + public List searchLike(Class clazz, String hbmQuery, List parameters) { + List results; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + Query query = session.createQuery(hbmQuery, clazz); + if (null != parameters) { + parameters.forEach(param -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + } + query.setMaxResults(10); + results = query.getResultList(); + transaction.commit(); + } catch (Exception e) { + logger.error("searchLike from class: " + clazz.getName(), e); + if (null != transaction) { + transaction.rollback(); + } + results = new ArrayList<>(); + } + return results; + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/repository/GenericEntityRepository.java b/apc-controller/src/main/java/com/arrebol/apc/repository/GenericEntityRepository.java new file mode 100644 index 0000000..41a02de --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/repository/GenericEntityRepository.java @@ -0,0 +1,111 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.repository; + +import com.arrebol.apc.model.ModelParameter; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class GenericEntityRepository extends AbstractRepository implements Serializable { + + private static final long serialVersionUID = -886033066217353341L; + + /** + * Insert APC entity. + * + * @param apcEntity + * @return + */ + public boolean insertAPCEntity(Object apcEntity) { + return super.save(apcEntity); + } + + /** + * Insert APC entities list. + * + * @param apcEntities + * @return + */ + public boolean insertManyAPCEntity(List apcEntities) { + return super.saveMany(apcEntities); + } + + /** + * Delete APC entity. + * + * @param apcEntity + * @return + */ + public boolean deleteAPCEntityById(Object apcEntity) { + return super.delete(apcEntity); + } + + /** + * + * @param xmlUpdateOrDeleteQuery XML query mapped in Model hbm file. + * @param parameters Paramerter cannot be empy, it has at least one paramert + * in list. + * @return Is parameters is empty return false, otherwise execute and return + * true if was success the execution of query. + */ + public boolean xmlUpdateOrDeleteAPCEntity(String xmlUpdateOrDeleteQuery, List parameters) { + return super.xmlUpdateOrDelete(xmlUpdateOrDeleteQuery, parameters); + } + + /** + * Find an Object by its primary key. + * + * @param clazz + * @param id + * @return + */ + public Object selectAPCEntityById(Class clazz, String id) { + return (Object) findAPCEntity(clazz, id); + } + + /** + * Update APC entity. + * + * @param apcEntity + * @return + */ + public boolean updateAPCEntity(Object apcEntity) { + return super.update(apcEntity); + } + + /** + * + * @param date + * @param query Must has parameter named ":date" and return just one field + * @return + */ + public boolean existRecordsUsingSQLQueryFindByCreatedOnField(Date date, String query) { + boolean success = true; + + try { + openConnection(); + + List records = getSession().createSQLQuery(query).setParameter("date", date).getResultList(); + + if (records.isEmpty()) { + success = false; + } + + closeConnection(); + } catch (Exception e) { + logger.error("existNextPaidStableGeneralBoxByCreatedOn", e); + rollback(); + } + return success; + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/repository/LazyDataModelDAORepository.java b/apc-controller/src/main/java/com/arrebol/apc/repository/LazyDataModelDAORepository.java new file mode 100644 index 0000000..74e18fb --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/repository/LazyDataModelDAORepository.java @@ -0,0 +1,94 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.repository; + +import com.arrebol.apc.controller.util.HibernateUtil; +import com.arrebol.apc.model.ModelParameter; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.Query; + +/** + * + * @author Carlos Janitzio Zavala Lopez + * @param + */ +public abstract class LazyDataModelDAORepository extends AbstractRepository { + + /** + * + * @param hbmQuery + * @param parameters + * @return + */ + public long lazyLoadingEntityCount(String hbmQuery, List parameters) { + Long total; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + Query query = session.createQuery(hbmQuery, Long.class); + if (null != parameters) { + parameters.forEach(param -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + } + total = (Long) query.getSingleResult(); + transaction.commit(); + } catch (Exception e) { + logger.error("lazyLoadingEntityCount from hbmQuery: " + hbmQuery, e); + if (null != transaction) { + transaction.rollback(); + } + total = 0l; + } + return total; + } + + /** + * + * @param clazz + * @param hbmQuery + * @param parameters + * @param first + * @param pageSize + * @return + */ + public List lazyLoadingEntityList(Class clazz, String hbmQuery, List parameters, int first, int pageSize) { + List results; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + Query query = session.createQuery(hbmQuery, clazz); + if (null != parameters) { + parameters.forEach(param -> { + query.setParameter(param.getParameter(), param.getValue()); + }); + } + query.setFirstResult(first); + query.setMaxResults(pageSize); + + results = query.getResultList(); + transaction.commit(); + } catch (Exception e) { + logger.error("lazyLoadingEntityList from class: " + clazz.getName(), e); + if (null != transaction) { + transaction.rollback(); + } + results = new ArrayList<>(); + } + return results; + } + + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/repository/core/HumanResourceRepository.java b/apc-controller/src/main/java/com/arrebol/apc/repository/core/HumanResourceRepository.java new file mode 100644 index 0000000..0849bcb --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/repository/core/HumanResourceRepository.java @@ -0,0 +1,97 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.repository.core; + +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.constance.HumanResourceCfg; +import com.arrebol.apc.repository.AbstractRepository; +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaUpdate; +import javax.persistence.criteria.Root; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.HibernateException; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class HumanResourceRepository extends AbstractRepository implements Serializable { + + /** + * + * @param hr + * @param updateAvatar + * @return + */ + public boolean updateByHumanResourceId(HumanResource hr, boolean updateAvatar) { + logger.debug("updateByHumanResourceId"); + + boolean success = false; + try { + openConnection(); + + CriteriaBuilder builder = getSession().getCriteriaBuilder(); + CriteriaUpdate update = builder.createCriteriaUpdate(HumanResource.class); + Root root = update.from(HumanResource.class); + + if (updateAvatar) { + update.set(root.get(HumanResourceCfg.FIELD_AVATAR), hr.getAvatar()); + } else { + update.set(root.get(HumanResourceCfg.FIELD_FIRST_NAME), hr.getFirstName()); + update.set(root.get(HumanResourceCfg.FIELD_SECOND_NAME), hr.getSecondName()); + update.set(root.get(HumanResourceCfg.FIELD_LAST_NAME), hr.getLastName()); + update.set(root.get(HumanResourceCfg.FIELD_MIDDLE_NAME), hr.getMiddleName()); + update.set(root.get(HumanResourceCfg.FIELD_BIRTHDATE), hr.getBirthdate()); + update.set(root.get(HumanResourceCfg.FIELD_ADMISSION_DATE), hr.getAdmissionDate()); + update.set(root.get(HumanResourceCfg.FIELD_PAYMENT), hr.getPayment()); + update.set(root.get(HumanResourceCfg.FIELD_IMSS), hr.getImss()); + update.set(root.get(HumanResourceCfg.FIELD_ROLE), hr.getRoleCtlg()); + update.set(root.get(HumanResourceCfg.FIELD_BONUS), hr.getBonus()); + + if(hr.getEmployeeSaving() != null){ + update.set(root.get(HumanResourceCfg.FIELD_EMPLOYEE_SAVING), hr.getEmployeeSaving()); + }else{ + update.set(root.get(HumanResourceCfg.FIELD_EMPLOYEE_SAVING), BigDecimal.ZERO); + } + + //update.set(root.get(HumanResourceCfg.FIELD_HR_TYPE), hr.getHumanResourceType()); + } + + update.set(root.get(HumanResourceCfg.FIELD_LAST_UPDATED_BY), hr.getLastUpdatedBy()); + update.set(root.get(HumanResourceCfg.FIELD_LAST_UPDATED_ON), hr.getLastUpdatedOn()); + + update.where(builder.equal(root.get(HumanResourceCfg.FIELD_ID), hr.getId())); + + int total = getSession().createQuery(update).executeUpdate(); + + if (1 == total) { + closeConnection(); + + success = true; + + logger.debug("Human resource updated"); + } else { + logger.error("Update HR from create user", new Exception("Was avatar update " + updateAvatar)); + rollback(); + } + } catch (HibernateException e) { + logger.error("updateByHumanResourceId hibernate", e); + rollback(); + } catch (Exception e) { + logger.error("Method updateByHumanResourceId() ", e); + rollback(); + } + return success; + } + + private static final long serialVersionUID = -5624272695296306941L; + final Logger logger = LogManager.getLogger(HumanResourceRepository.class); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/repository/core/OfficeRepository.java b/apc-controller/src/main/java/com/arrebol/apc/repository/core/OfficeRepository.java new file mode 100644 index 0000000..01b4c77 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/repository/core/OfficeRepository.java @@ -0,0 +1,110 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.repository.core; + +import com.arrebol.apc.controller.util.HibernateUtil; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.constance.OfficeCfg; +import com.arrebol.apc.model.enums.OfficeStatus; +import com.arrebol.apc.repository.AbstractRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import javax.enterprise.context.RequestScoped; +import javax.persistence.Tuple; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Path; +import javax.persistence.criteria.Root; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.Transaction; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@RequestScoped +public class OfficeRepository extends AbstractRepository implements Serializable { + + public List getAllActiveOffice() { + logger.debug("getAllActiveOffice"); + + List offices = null; + Session session = null; + Transaction transaction = null; + try { + session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + CriteriaBuilder builder = session.getCriteriaBuilder(); + CriteriaQuery query = builder.createQuery(Office.class); + Root root = query.from(Office.class); + Path idPath = root.get(OfficeCfg.FIELD_ID); + Path permissionPath = root.get(OfficeCfg.FIELD_PERMISSION); + + query.select(builder.construct(Office.class, idPath, permissionPath)); + query.where(builder.equal(root.get(OfficeCfg.FIELD_OFFICE_STATUS), OfficeStatus.ENEBLED)); + query.orderBy(builder.asc(root.get(OfficeCfg.FIELD_PERMISSION))); + + offices = session.createQuery(query).getResultList(); + + transaction.commit(); + logger.debug("Total of office: " + offices.size()); + } catch (HibernateException e) { + logger.error("getAllActiveOffice Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method getAllActiveOffice() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } finally { + if (null != session) { + session.close(); + } + } + return offices; + } + + /** + * + * @param xmlQueryTuple + * @param parameters + * @return + */ + public List findAllOfficesByUser(String xmlQueryTuple, List parameters) { + logger.debug("findAllOfficesByUser"); + + List offices = new ArrayList<>(); + try { + List tupleLst = xmlQueryTuple(xmlQueryTuple, parameters); + + tupleLst.forEach((tuple) -> { + offices.add(new Office((String) tuple.get(0), (String) tuple.get(1))); + }); + + logger.debug("User has office " + offices.size()); + } catch (HibernateException e) { + logger.error("findAllOfficeByUser hibernate", e); + } catch (Exception e) { + logger.error("Method findAllOfficeByUser() ", e); + } + return offices; + } + + private static final long serialVersionUID = 1712329089116981172L; + final Logger logger = LogManager.getLogger(OfficeRepository.class); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/repository/core/PermissionRepository.java b/apc-controller/src/main/java/com/arrebol/apc/repository/core/PermissionRepository.java new file mode 100644 index 0000000..2afc8dd --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/repository/core/PermissionRepository.java @@ -0,0 +1,93 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.repository.core; + +import com.arrebol.apc.model.core.Permission; +import com.arrebol.apc.model.core.constance.PermissionCfg; +import com.arrebol.apc.model.enums.PermissionStatus; +import com.arrebol.apc.model.enums.PermissionType; +import com.arrebol.apc.repository.AbstractRepository; +import java.io.Serializable; +import java.util.List; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Path; +import javax.persistence.criteria.Root; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.HibernateException; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class PermissionRepository extends AbstractRepository implements Serializable { + + public List getAllActivePermissionByType(PermissionType permissionType) { + logger.debug("getAllActivePermissionByType"); + + List permissions = null; + try { + openConnection(); + + CriteriaBuilder builder = getSession().getCriteriaBuilder(); + CriteriaQuery query = builder.createQuery(Permission.class); + Root root = query.from(Permission.class); + Path id = root.get(PermissionCfg.FIELD_ID); + Path permission = root.get(PermissionCfg.FIELD_PERMISSION); + Path description = root.get(PermissionCfg.FIELD_DESCRIPTION); + Path menuPath = root.get(PermissionCfg.FIELD_MENU_PATH); + + query.select(builder.construct(Permission.class, id, permission, description, menuPath)); + query.where( + builder.and( + builder.equal(root.get(PermissionCfg.FIELD_PERMISSION_STATUS), PermissionStatus.ENEBLED), + builder.equal(root.get(PermissionCfg.FIELD_PERMISSION_TYPE), permissionType) + ) + ); + + query.orderBy( + builder.asc(root.get(PermissionCfg.FIELD_LEFT_TO_RIGHT)), + builder.asc(root.get(PermissionCfg.FIELD_TOP_TO_BOTTOM)) + ); + + permissions = getSession().createQuery(query).getResultList(); + + closeConnection(); + logger.debug("Total of permissions: " + permissions.size()); + } catch (HibernateException e) { + logger.error("getAllActivePermissionByType hibernate", e); + rollback(); + } catch (Exception e) { + logger.error("Method getAllActivePermissionByType() ", e); + rollback(); + } + + return permissions; + } + + /** + * + * @return + */ + public List findAllEnebledPermissions() { + logger.debug("findAllEnebledPermissions"); + List permissions = null; + + try { + permissions = xmlQueryAPCEntities(Permission.class, PermissionCfg.QUERY_FIND_ENEBLED_PERMISSIONS, null); + } catch (Exception e) { + logger.error("findAllEnebledPermissions", e); + } + + return permissions; + } + + private static final long serialVersionUID = -3100646446560072563L; + final Logger logger = LogManager.getLogger(PermissionRepository.class); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/repository/core/UserByOfficeRepository.java b/apc-controller/src/main/java/com/arrebol/apc/repository/core/UserByOfficeRepository.java new file mode 100644 index 0000000..430d641 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/repository/core/UserByOfficeRepository.java @@ -0,0 +1,373 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.repository.core; + +import com.arrebol.apc.controller.util.HibernateUtil; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.catalog.HumanResourceHasRoute; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.Permission; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.core.UserByOffice; +import com.arrebol.apc.model.core.UserByOfficeHasPermission; +import com.arrebol.apc.model.core.constance.HumanResourceHasRouteCfg; +import com.arrebol.apc.model.core.constance.UserByOfficeCfg; +import com.arrebol.apc.model.core.constance.UserByOfficeHasPermissionCfg; +import com.arrebol.apc.model.core.constance.UserCfg; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.UserStatus; +import com.arrebol.apc.model.enums.UserType; +import com.arrebol.apc.repository.AbstractRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import javax.enterprise.context.RequestScoped; +import javax.persistence.Tuple; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.Query; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@RequestScoped +public class UserByOfficeRepository extends AbstractRepository implements Serializable { + + public List findUsersInOfficeInStatuses(List statuses, Office office, String ownerId) { + logger.debug("findUsersInOfficeInStatuses"); + + List userByOfficeLst = new ArrayList<>(); + Session session = null; + Transaction transaction = null; + try { + session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + List tupleLst = session + .createNamedQuery( + UserByOfficeCfg.QUERY_FIND_USERS_IN_OFFICE_IN_STATUSES, Tuple.class + ) + .setParameter(UserByOfficeCfg.FIELD_OFFICE, office) + .setParameter(UserByOfficeCfg.PARAM_OWNER_ID, ownerId) + .setParameter(UserCfg.FIELD_USER_STATUS, statuses) + .getResultList(); + + tupleLst.forEach( + (tuple) -> { + userByOfficeLst.add( + new UserByOffice( + tuple.get("id", String.class), + new User( + tuple.get("usrId", String.class), + new HumanResource( + tuple.get("hrId", String.class), + tuple.get("fullName", String.class) + ), + tuple.get("userName", String.class), + tuple.get("certifier", ActiveStatus.class), + tuple.get("userType", UserType.class), + tuple.get("management",ActiveStatus.class) + ) + ) + ); + } + ); + + transaction.commit(); + logger.debug("Office has users " + userByOfficeLst.size()); + } catch (HibernateException e) { + logger.error("findUsersInOfficeInStatuses Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method findUsersInOfficeInStatuses() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } finally { + if (null != session) { + session.close(); + } + } + return userByOfficeLst; + } + + /** + * + * @param userByOffice + * @return + */ + public UserByOffice findUserLogged(UserByOffice userByOffice) { + logger.debug("findUserLogged"); + + Session session = null; + Transaction transaction = null; + try { + session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + Object idsLst = session.createNamedQuery(UserByOfficeCfg.QUERY_FIND_USER_LOGGED) + .setParameter(UserByOfficeCfg.PARAM_USER_NAME, userByOffice.getUser().getUserName()) + .setParameter(UserByOfficeCfg.PARAM_OFFICE_ID, userByOffice.getOffice().getId()) + .uniqueResult(); + + if (null != idsLst && idsLst instanceof Object[] && ((Object[]) idsLst).length == 8) { + Object[] obj = ((Object[]) idsLst); + + HumanResource hr = new HumanResource( + obj[2].toString(), + obj[3].toString(), + obj[4].toString(), + obj[5].toString() + ); + + userByOffice.setId(obj[0].toString()); + userByOffice.getUser().setId(obj[1].toString()); + userByOffice.getUser().setHumanResource(hr); + userByOffice.setOffice(new Office(obj[6].toString(), obj[7].toString())); + } + + transaction.commit(); + logger.debug("User logged: " + userByOffice); + } catch (HibernateException e) { + logger.error("findUserLogged Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method findUserLogged() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } finally { + if (null != session) { + session.close(); + } + } + + return userByOffice; + } + + /** + * + * @param xmlQuery + * @param parameters + * @return + */ + public UserByOffice findIdOfUserByOffice(String xmlQuery, List parameters) { + UserByOffice userByOffice = null; + try { + List tupleLst = xmlQueryTuple(xmlQuery, parameters); + + for (Tuple tuple : tupleLst) { + userByOffice = new UserByOffice((String) tuple.get(UserByOfficeCfg.FIELD_ID)); + } + } catch (Exception e) { + logger.error("getAllActiveOffice hibernate", e); + } + return userByOffice; + } + + public List findList(boolean isRoute, String xmlQuery, List parameters) { + List results = new ArrayList(); + try { + List tupleLst = xmlQueryTuple(xmlQuery, parameters); + + tupleLst.forEach((tuple) -> { + if (isRoute) { + results.add( + new RouteCtlg( + tuple.get("id", String.class), + tuple.get("route", String.class) + ) + ); + } else { + results.add( + new Permission( + tuple.get("id", String.class), + tuple.get("permission", String.class), + tuple.get("description", String.class), + tuple.get("menuPath", String.class) + ) + ); + } + }); + } catch (Exception e) { + logger.error("getAllActiveOffice hibernate", e); + } + return results; + } + + // 1 Borrar rutas y/o permisos + // a- Si usuario previo es web - borrar permisos + // b- Si usuario previo es mobile - borrar rutas + // c- Si usuario previo es ambos - borrar permisos y rutas. + // 2 Actualizar datos + // a- Si usuario es web - agregar permisos + // b- Si usuario es mobile - agragar rutas + // c- Si usuario es ambos - agregar permisos y rutas. + // 3 Actualiza cretificador + public boolean updateUser(UserType newUserType, + UserByOffice userByOffice, ActiveStatus certifier, + List humanResourceHasRoutes, + List userByOfficeHasPermissions,ActiveStatus management) { + logger.info("updateUser"); + boolean success = false; + Session session = null; + Transaction transaction = null; + try { + session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + String query = UserCfg.QUERY_UPDATE_CERTIFIER_AND_USER_TYPE_BY_ID; + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(UserCfg.FIELD_USER_TYPE, newUserType)); + parameters.add(new ModelParameter(UserCfg.FIELD_CERTIFIER, certifier)); + parameters.add(new ModelParameter(UserCfg.FIELD_LAST_UPDATED_BY, userByOffice.getCreatedBy())); + parameters.add(new ModelParameter(UserCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(UserCfg.FIELD_ID, userByOffice.getUser().getId())); + parameters.add(new ModelParameter(UserCfg.FIELD_MANAGMENT, management)); + + Query updateOrDeleteQuery = session.createNamedQuery(query); + + for (ModelParameter parameter : parameters) { + updateOrDeleteQuery.setParameter(parameter.getParameter(), parameter.getValue()); + } + + int total = updateOrDeleteQuery.executeUpdate(); + + if (total > 0) { + switch (userByOffice.getUser().getUserType()) { + case WEB: + query = UserByOfficeHasPermissionCfg.QUERY_DELETE_ALL_PERMISSION_BY_UBO; + updateOrDeleteQuery = session.createNamedQuery(query); + + parameters.clear(); + parameters.add(new ModelParameter(UserByOfficeHasPermissionCfg.FIELD_USER_BY_OFFICE, new UserByOffice(userByOffice.getId()))); + + for (ModelParameter parameter : parameters) { + updateOrDeleteQuery.setParameter(parameter.getParameter(), parameter.getValue()); + } + + updateOrDeleteQuery.executeUpdate(); + break; + case MOBILE: + query = HumanResourceHasRouteCfg.QUERY_DELETE_ALL_HR_HAS_ROUTE_BY_HR; + updateOrDeleteQuery = session.createNamedQuery(query); + + parameters.clear(); + parameters.add(new ModelParameter(HumanResourceHasRouteCfg.FIELD_HUMAN_RESOURCE, new HumanResource(userByOffice.getUser().getHumanResource().getId()))); + + for (ModelParameter parameter : parameters) { + updateOrDeleteQuery.setParameter(parameter.getParameter(), parameter.getValue()); + } + + updateOrDeleteQuery.executeUpdate(); + break; + case BOTH: + // WEB + query = UserByOfficeHasPermissionCfg.QUERY_DELETE_ALL_PERMISSION_BY_UBO; + updateOrDeleteQuery = session.createNamedQuery(query); + + parameters.clear(); + parameters.add(new ModelParameter(UserByOfficeHasPermissionCfg.FIELD_USER_BY_OFFICE, new UserByOffice(userByOffice.getId()))); + + for (ModelParameter parameter : parameters) { + updateOrDeleteQuery.setParameter(parameter.getParameter(), parameter.getValue()); + } + + updateOrDeleteQuery.executeUpdate(); + + // MOBILE + query = HumanResourceHasRouteCfg.QUERY_DELETE_ALL_HR_HAS_ROUTE_BY_HR; + updateOrDeleteQuery = session.createNamedQuery(query); + + parameters.clear(); + parameters.add(new ModelParameter(HumanResourceHasRouteCfg.FIELD_HUMAN_RESOURCE, new HumanResource(userByOffice.getUser().getHumanResource().getId()))); + + for (ModelParameter parameter : parameters) { + updateOrDeleteQuery.setParameter(parameter.getParameter(), parameter.getValue()); + } + + updateOrDeleteQuery.executeUpdate(); + break; + } + + switch (newUserType) { + case WEB: + userByOfficeHasPermissions.forEach(session::save); + break; + case MOBILE: + humanResourceHasRoutes.forEach(session::save); + break; + case BOTH: + userByOfficeHasPermissions.forEach(session::save); + humanResourceHasRoutes.forEach(session::save); + break; + } + + success = true; + transaction.commit(); + } else { + transaction.rollback(); + } + } catch (HibernateException e) { + logger.error("updateUser Hibernate", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } catch (Exception e) { + logger.error("Method updateUser() ", e); + if (null != transaction) { + transaction.rollback(); + } + throw e; + } finally { + if (null != session) { + session.close(); + } + } + return success; + } + + /** + * + * @param updateQuery + * @param parameters + * @return + */ + public boolean updateEntityByQuery(String updateQuery, List parameters) { + logger.info("updateEntityByQuery"); + try { + if (null == updateQuery || null == parameters || parameters.isEmpty()) { + return false; + } + + return xmlUpdateOrDelete(updateQuery, parameters); + } catch (Exception e) { + logger.error("updateEntityByQuery", e); + throw e; + } + } + + private static final long serialVersionUID = -6925993802118470170L; + final Logger logger = LogManager.getLogger(UserByOfficeRepository.class); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/repository/core/UserRepository.java b/apc-controller/src/main/java/com/arrebol/apc/repository/core/UserRepository.java new file mode 100644 index 0000000..870ff75 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/repository/core/UserRepository.java @@ -0,0 +1,186 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.repository.core; + +import com.arrebol.apc.model.catalog.HumanResourceHasRoute; +import com.arrebol.apc.model.catalog.HumanResourceHasRouteId; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.core.UserByOffice; +import com.arrebol.apc.model.core.UserByOfficeHasPermission; +import com.arrebol.apc.model.core.constance.UserByOfficeCfg; +import com.arrebol.apc.model.core.constance.UserCfg; +import com.arrebol.apc.repository.AbstractRepository; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import javax.persistence.Tuple; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaUpdate; +import javax.persistence.criteria.Root; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.HibernateException; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class UserRepository extends AbstractRepository implements Serializable { + + /** + * + * @param officeId + * @return + */ + public List findAllUsersByOffice(String officeId) { + logger.debug("findAllUsersByOffice"); + + List users = new ArrayList<>(); + try { + openConnection(); + + List tupleLst = getSession().createNamedQuery(UserCfg.QUERY_FIND_ALL_USERS_BY_OFFICE, Tuple.class) + .setParameter(UserByOfficeCfg.FIELD_OFFICE, new Office(officeId)) + .getResultList(); + + tupleLst.forEach((tuple) -> { + HumanResource hr = new HumanResource((String) tuple.get(0), (String) tuple.get(0), (String) tuple.get(0)); + User usr = new User((String) tuple.get(0), (String) tuple.get(1), hr); + + users.add(usr); + }); + + closeConnection(); + logger.debug("Office has users " + users.size()); + } catch (HibernateException e) { + logger.error("findAllUsersByOffice hibernate", e); + rollback(); + } catch (Exception e) { + logger.error("Method findAllUsersByOffice() ", e); + rollback(); + } + return users; + } + + /** + * + * @param user + * @param fromView 1 = From View User -> Create
+ * @return + */ + @Deprecated + public boolean updateUserById(User user, int fromView) { + logger.debug("updateByHumanResourceId"); + + boolean success = false; + try { + openConnection(); + + CriteriaBuilder builder = getSession().getCriteriaBuilder(); + CriteriaUpdate update = builder.createCriteriaUpdate(HumanResource.class); + Root root = update.from(HumanResource.class); + + switch (fromView) { + case 1: + update.set(root.get(UserCfg.FIELD_HUMAN_RESOURCE), user.getHumanResource()); + //update.set(root.get(UserCfg.FIELD_USER_NAME), user.getUserName()); + update.set(root.get(UserCfg.FIELD_PASSWORD), user.getPassword()); + break; + } + + update.set(root.get(UserCfg.FIELD_LAST_UPDATED_BY), user.getLastUpdatedBy()); + update.set(root.get(UserCfg.FIELD_LAST_UPDATED_ON), user.getLastUpdatedOn()); + + update.where(builder.equal(root.get(UserCfg.FIELD_ID), user.getId())); + + int total = getSession().createQuery(update).executeUpdate(); + + if (1 == total) { + closeConnection(); + success = true; + logger.debug("User updated"); + } else { + logger.error("Update user", new Exception("From: " + fromView)); + rollback(); + } + } catch (HibernateException e) { + logger.error("updateByHumanResourceId hibernate", e); + rollback(); + } catch (Exception e) { + logger.error("Method updateByHumanResourceId() ", e); + rollback(); + } + return success; + } + + /** + * 1) Verifica que el usuario aun este disponible 2) Verifica que tipo de + * usuario se va a crear y en todos los casos se debera de guardar usuario y + * oficina más las carecteristicas propias de cada tipo de usuario: A) WEB + * debe guardar permisos B) MOBILE debe guardar rutas C) BOTH debe guardar + * rutas y permisos. + * + * @param user + * @param userByOffice + * @param humanResourceHasRoutes + * @param userByOfficeHasPermissions + * @return + */ + public boolean createUser(User user, UserByOffice userByOffice, + List humanResourceHasRoutes, + List userByOfficeHasPermissions) { + boolean success = false; + + try { + openConnection(); + + // Start generic block for all user types + getSession().save(user); + + userByOffice.setUser(new User(user.getId())); + + getSession().save(userByOffice); + // End generic block for all user types + + switch (user.getUserType()) { + case WEB: + userByOfficeHasPermissions.forEach((value) -> { + value.getId().setIdUserByOffice(userByOffice.getId()); + getSession().save(value); + }); + break; + case MOBILE: + humanResourceHasRoutes.forEach(getSession()::save); + break; + case BOTH: + userByOfficeHasPermissions.forEach((value) -> { + value.getId().setIdUserByOffice(userByOffice.getId()); + getSession().save(value); + }); + + humanResourceHasRoutes.forEach(getSession()::save); + break; + } + + closeConnection(); + success = true; + } catch (HibernateException e) { + logger.error("updateByHumanResourceId hibernate", e); + rollback(); + } catch (Exception e) { + logger.error("Method updateByHumanResourceId() ", e); + rollback(); + } + return success; + } + private static final long serialVersionUID = -3153392012298562511L; + final Logger logger = LogManager.getLogger(UserRepository.class); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/AutoCompleteService.java b/apc-controller/src/main/java/com/arrebol/apc/service/AutoCompleteService.java new file mode 100644 index 0000000..1667ddc --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/AutoCompleteService.java @@ -0,0 +1,25 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service; + +import java.util.List; + +/** + * + * @author Carlos Janitzio Zavala Lopez + * @param + */ +public interface AutoCompleteService { + + /** + * + * @param valueToSearch + * @return + */ + public List queryLike(String valueToSearch); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/BitacoraService.java b/apc-controller/src/main/java/com/arrebol/apc/service/BitacoraService.java new file mode 100644 index 0000000..2a28295 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/BitacoraService.java @@ -0,0 +1,24 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service; + +import com.arrebol.apc.model.system.logs.Bitacora; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface BitacoraService { + + /** + * + * @param bitacora + * @return + */ + boolean saveBitacora(Bitacora bitacora); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/BitacoraServiceImpl.java b/apc-controller/src/main/java/com/arrebol/apc/service/BitacoraServiceImpl.java new file mode 100644 index 0000000..1fe5017 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/BitacoraServiceImpl.java @@ -0,0 +1,30 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service; + +import com.arrebol.apc.model.system.logs.Bitacora; +import com.arrebol.apc.repository.LazyDataModelDAORepository; +import javax.enterprise.context.RequestScoped; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@RequestScoped +public class BitacoraServiceImpl extends LazyDataModelDAORepository implements BitacoraService { + + @Override + public boolean saveBitacora(Bitacora bitacora) { + logger.debug("saveBitacora"); + return save(bitacora); + } + + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/GenericValidationService.java b/apc-controller/src/main/java/com/arrebol/apc/service/GenericValidationService.java new file mode 100644 index 0000000..054c1b5 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/GenericValidationService.java @@ -0,0 +1,32 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service; + +import com.arrebol.apc.model.core.User; +import java.util.Date; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface GenericValidationService { + + /** + * + * @param user + * @return + */ + Date lastStableSmallBoxByDate(User user); + + /** + * + * @param date + * @return + */ + boolean existStableSmallBoxByCreatedOn(Date date); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/GenericValidationServiceImpl.java b/apc-controller/src/main/java/com/arrebol/apc/service/GenericValidationServiceImpl.java new file mode 100644 index 0000000..0950292 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/GenericValidationServiceImpl.java @@ -0,0 +1,93 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service; + +import com.arrebol.apc.controller.util.HibernateUtil; +import com.arrebol.apc.model.core.User; +import java.util.Date; +import java.util.List; +import javax.enterprise.context.RequestScoped; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.Transaction; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@RequestScoped +public class GenericValidationServiceImpl implements GenericValidationService { + + @Override + public Date lastStableSmallBoxByDate(User user) { + logger.info("lastStableSmallBoxByDate"); + + Date success = null; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + String query = "SELECT cd.createdOn FROM StableSmallBox cd " + + "WHERE DATE(cd.createdOn) <= CURDATE() AND cd.activeStatus = 'ENEBLED' " + + "order by cd.createdOn DESC"; + + success = (Date) session.createQuery(query).setMaxResults(1) + .uniqueResult(); + + transaction.commit(); + + logger.info("Total of closing day found: "); + } catch (HibernateException e) { + logger.error("Can not find stable small box by created on", e); + if (null != transaction) { + transaction.rollback(); + } + } catch (Exception e) { + logger.error("Method lastStableSmallBoxByDate()", e); + if (null != transaction) { + transaction.rollback(); + } + } + + return success; + } + + @Override + public boolean existStableSmallBoxByCreatedOn(Date date) { + logger.info("existStableSmallBoxByCreatedOn"); + boolean success = true; + Transaction transaction = null; + try { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + transaction = session.beginTransaction(); + + String query = "SELECT ssb.id FROM APC_STABLE_SMALL_BOX ssb " + + "WHERE DATE(ssb.created_on) = DATE(:date) AND ssb.active_status = 'ENEBLED'"; + + List records = session.createSQLQuery(query).setParameter("date", date).getResultList(); + + if (records.isEmpty()) { + success = false; + } + + transaction.commit(); + } catch (Exception e) { + logger.error("existStableSmallBoxByCreatedOn", e); + if (null != transaction) { + transaction.rollback(); + } + } + return success; + } + + final Logger logger = LogManager.getLogger(getClass()); + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/LazyDataModelBetweenDatesService.java b/apc-controller/src/main/java/com/arrebol/apc/service/LazyDataModelBetweenDatesService.java new file mode 100644 index 0000000..865df56 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/LazyDataModelBetweenDatesService.java @@ -0,0 +1,46 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service; + +import com.arrebol.apc.model.admin.Transfer; +import java.util.Date; +import java.util.List; +import java.util.Map; +import org.primefaces.model.SortOrder; + +/** + * + * @author Carlos Janitzio Zavala Lopez + * @param + */ +public interface LazyDataModelBetweenDatesService { + + /** + * + * @param filterBy + * @param officeId + * @param starDate + * @param endDate + * @return + */ + long countPaginator(Map filterBy, String officeId, Date starDate, Date endDate); + + /** + * + * @param first + * @param pageSize + * @param sortField + * @param sortOrder + * @param filterBy + * @param officeId + * @param starDate + * @param endDate + * @return + */ + List lazyEntityListPaginator(int first, int pageSize, String sortField, SortOrder sortOrder, Map filterBy, String officeId, Date starDate, Date endDate); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/LazyDataModelService.java b/apc-controller/src/main/java/com/arrebol/apc/service/LazyDataModelService.java new file mode 100644 index 0000000..06a0316 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/LazyDataModelService.java @@ -0,0 +1,38 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service; + +import java.util.List; +import java.util.Map; +import org.primefaces.model.SortOrder; + +/** + * + * @author Carlos Janitzio Zavala Lopez + * @param + */ +public interface LazyDataModelService { + + /** + * + * @param filterBy + * @return + */ + long countPaginator(Map filterBy); + + /** + * + * @param first + * @param pageSize + * @param sortField + * @param sortOrder + * @param filterBy + * @return + */ + List lazyEntityListPaginator(int first, int pageSize, String sortField, SortOrder sortOrder, Map filterBy); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/admin/CustomerService.java b/apc-controller/src/main/java/com/arrebol/apc/service/admin/CustomerService.java new file mode 100644 index 0000000..fa34359 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/admin/CustomerService.java @@ -0,0 +1,58 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service.admin; + +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.CustomerClassification; +import com.arrebol.apc.model.enums.PeopleType; +import com.arrebol.apc.model.views.CustomerView; +import com.arrebol.apc.service.LazyDataModelService; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface CustomerService extends LazyDataModelService { + + /** + * + * @param type + * @param peopleIdToUpdate + * @param lastUpdatedBy + * @return + */ + boolean updatePeopleTypeById(PeopleType type, String peopleIdToUpdate, String lastUpdatedBy); + + /** + * + * @param status + * @param peopleIdToUpdate + * @param lastUpdatedBy + * @return + */ + boolean updatePeopleByStatus(ActiveStatus status, String peopleIdToUpdate, String lastUpdatedBy); + + /** + * + * @param classification + * @param peopleIdToUpdate + * @param lastUpdatedBy + * @return + */ + public boolean updatePeopleByClassification(CustomerClassification classification, String peopleIdToUpdate, String lastUpdatedBy); + + /** + * + * @param route + * @param peopleIdToUpdate + * @param lastUpdatedBy + * @return + */ + boolean updateRouteById(RouteCtlg route, String peopleIdToUpdate, String lastUpdatedBy); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/admin/CustomerServiceImpl.java b/apc-controller/src/main/java/com/arrebol/apc/service/admin/CustomerServiceImpl.java new file mode 100644 index 0000000..9e380e2 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/admin/CustomerServiceImpl.java @@ -0,0 +1,137 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service.admin; + +import com.arrebol.apc.controller.util.FilterMap; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.catalog.constance.PeopleCfg; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.CustomerClassification; +import com.arrebol.apc.model.enums.PeopleType; +import com.arrebol.apc.model.views.CustomerView; +import com.arrebol.apc.repository.LazyDataModelDAORepository; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import javax.enterprise.context.RequestScoped; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.primefaces.model.SortOrder; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@RequestScoped +public class CustomerServiceImpl extends LazyDataModelDAORepository implements CustomerService { + + @Override + public boolean updatePeopleTypeById(PeopleType type, String peopleIdToUpdate, String lastUpdatedBy) { + logger.debug("updatePeopleTypeById"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PeopleCfg.FIELD_PEOPLE_TYPE, type)); + parameters.add(new ModelParameter(PeopleCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(PeopleCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(PeopleCfg.FIELD_ID, peopleIdToUpdate)); + + return xmlUpdateOrDelete(PeopleCfg.UPDATE_PEOPLE_TYPE_BY_STATUS, parameters); + } + + @Override + public boolean updatePeopleByStatus(ActiveStatus status, String peopleIdToUpdate, String lastUpdatedBy) { + logger.debug("updatePeopleByStatus"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PeopleCfg.FIELD_ACTIVE_STATUS, status)); + parameters.add(new ModelParameter(PeopleCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(PeopleCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(PeopleCfg.FIELD_ID, peopleIdToUpdate)); + + return xmlUpdateOrDelete(PeopleCfg.UPDATE_PEOPLE_BY_STATUS, parameters); + } + + @Override + public boolean updatePeopleByClassification(CustomerClassification classification, String peopleIdToUpdate, String lastUpdatedBy) { + logger.debug("updatePeopleByClassification"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PeopleCfg.FIELD_CLASSIFICATION, classification)); + parameters.add(new ModelParameter(PeopleCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(PeopleCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(PeopleCfg.FIELD_ID, peopleIdToUpdate)); + + return xmlUpdateOrDelete(PeopleCfg.UPDATE_PEOPLE_BY_CLASSIFICATION, parameters); + } + + @Override + public boolean updateRouteById(RouteCtlg route, String peopleIdToUpdate, String lastUpdatedBy) { + logger.debug("updateRouteById"); + + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(PeopleCfg.FIELD_ROUTE, route)); + parameters.add(new ModelParameter(PeopleCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(PeopleCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(PeopleCfg.FIELD_ID, peopleIdToUpdate)); + + return xmlUpdateOrDelete(PeopleCfg.UPDATE_ROUTE_BY_PEOPLE, parameters); + } + + @Override + public long countPaginator(Map filterBy) { + logger.debug("countPaginator"); + try { + StringBuilder sqlQuery = new StringBuilder("SELECT COUNT(id) FROM CustomerView "); + + sqlQuery.append(FilterMap.filterByExcludeGlobalFilter(filterBy, false)); + + return lazyLoadingEntityCount(sqlQuery.toString(), null); + } catch (Exception e) { + logger.error("countPaginator", e); + + return 0l; + } + } + + @Override + public List lazyEntityListPaginator(int first, int pageSize, String sortField, SortOrder sortOrder, Map filterBy) { + logger.debug("fillListPaginator"); + try { + StringBuilder sqlQuery = new StringBuilder("FROM CustomerView "); + + sqlQuery.append(FilterMap.filterByExcludeGlobalFilter(filterBy, false)); + sqlQuery.append(" ORDER BY "); + + if (null == sortField || "".equals(sortField)) { + sqlQuery.append(" fullName ASC"); + } else { + sqlQuery.append(sortField); + + if (null != sortOrder) { + sqlQuery.append(" "); + sqlQuery.append(sortOrder.equals(SortOrder.ASCENDING) ? "ASC" : "DESC"); + } else { + sqlQuery.append(" ASC"); + } + } + + return lazyLoadingEntityList(CustomerView.class, sqlQuery.toString(), null, first, pageSize); + } catch (Exception e) { + logger.error("CustomerView", e); + return new ArrayList(); + } + } + + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/admin/PeopleService.java b/apc-controller/src/main/java/com/arrebol/apc/service/admin/PeopleService.java new file mode 100644 index 0000000..cdda933 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/admin/PeopleService.java @@ -0,0 +1,31 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service.admin; + +import com.arrebol.apc.model.catalog.People; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface PeopleService { + + /** + * + * @param peopleId + * @return + */ + People findPeopleById(String peopleId); + + /** + * + * @param people + * @return + */ + boolean savePeople(People people); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/admin/PeopleServiceImpl.java b/apc-controller/src/main/java/com/arrebol/apc/service/admin/PeopleServiceImpl.java new file mode 100644 index 0000000..caf2a65 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/admin/PeopleServiceImpl.java @@ -0,0 +1,36 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service.admin; + +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.repository.LazyDataModelDAORepository; +import javax.enterprise.context.RequestScoped; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@RequestScoped +public class PeopleServiceImpl extends LazyDataModelDAORepository implements PeopleService { + + @Override + public People findPeopleById(String peopleId) { + logger.debug("findPeopleById"); + + return (People) findAPCEntity(People.class, peopleId); + } + + public boolean savePeople(People people) { + logger.debug("savePeopleController"); + return save(people); + } + + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/admin/TransferService.java b/apc-controller/src/main/java/com/arrebol/apc/service/admin/TransferService.java new file mode 100644 index 0000000..dac1030 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/admin/TransferService.java @@ -0,0 +1,36 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service.admin; + +import com.arrebol.apc.model.admin.Transfer; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.views.TransferView; +import com.arrebol.apc.service.LazyDataModelBetweenDatesService; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface TransferService extends LazyDataModelBetweenDatesService { + + /** + * + * @param status + * @param transferIdToUpdate + * @param lastUpdatedBy + * @return + */ + boolean updateTransferByStatus(ActiveStatus status, String transferIdToUpdate, String lastUpdatedBy); + + /** + * + * @param transfer + * @return + */ + boolean saveTransfer(Transfer transfer); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/admin/TransferServiceImpl.java b/apc-controller/src/main/java/com/arrebol/apc/service/admin/TransferServiceImpl.java new file mode 100644 index 0000000..2370c4c --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/admin/TransferServiceImpl.java @@ -0,0 +1,131 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service.admin; + +import com.arrebol.apc.controller.util.FilterMap; +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.admin.Transfer; +import com.arrebol.apc.model.admin.constance.TransferCfg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.views.TransferView; +import com.arrebol.apc.repository.LazyDataModelDAORepository; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import javax.enterprise.context.RequestScoped; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.primefaces.model.SortOrder; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@RequestScoped +public class TransferServiceImpl extends LazyDataModelDAORepository implements TransferService { + + final Logger logger = LogManager.getLogger(getClass()); + + @Override + public boolean updateTransferByStatus(ActiveStatus status, String transferIdToUpdate, String lastUpdatedBy) { + logger.debug("updateTransferByStatus"); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(TransferCfg.FIELD_ACTIVE_STATUS, status)); + parameters.add(new ModelParameter(TransferCfg.FIELD_LAST_UPDATED_BY, lastUpdatedBy)); + parameters.add(new ModelParameter(TransferCfg.FIELD_LAST_UPDATED_ON, new Date())); + parameters.add(new ModelParameter(TransferCfg.FIELD_ID, transferIdToUpdate)); + + return xmlUpdateOrDelete(TransferCfg.QUERY_UPDATE_TRANSFER_BY_ACTIVE_STATUS, parameters); + } catch (Exception e) { + logger.error("updateTransferByStatus", e); + return false; + } + } + + @Override + public boolean saveTransfer(Transfer transfer) { + logger.debug("saveTransfer"); + return save(transfer); + } + + @Override + public long countPaginator(Map filterBy, String officeId, Date starDate, Date endDate) { + logger.debug("countPaginator"); + try { + StringBuilder sqlQuery = new StringBuilder("SELECT COUNT(id) FROM TransferView "); + + sqlQuery.append(FilterMap.filterByExcludeGlobalFilter(filterBy, false)); + + if (null != filterBy && !filterBy.isEmpty()) { + sqlQuery.append(" AND DATE(createdOn) BETWEEN DATE(:startDate) AND DATE(:endDate) "); + sqlQuery.append(" AND idOffice = :idOffice "); + } else { + sqlQuery.append(" WHERE DATE(createdOn) BETWEEN DATE(:startDate) AND DATE(:endDate) "); + sqlQuery.append(" AND idOffice = :idOffice "); + } + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter("startDate", starDate)); + parameters.add(new ModelParameter("endDate", endDate)); + parameters.add(new ModelParameter("idOffice", officeId)); + + return lazyLoadingEntityCount(sqlQuery.toString(), parameters); + } catch (Exception e) { + logger.error("countPaginator", e); + + return 0l; + } + } + + @Override + public List lazyEntityListPaginator(int first, int pageSize, String sortField, SortOrder sortOrder, Map filterBy, String officeId, Date starDate, Date endDate) { + logger.debug("fillListPaginator"); + try { + StringBuilder sqlQuery = new StringBuilder("FROM TransferView "); + + sqlQuery.append(FilterMap.filterByExcludeGlobalFilter(filterBy, false)); + + if (null != filterBy && !filterBy.isEmpty()) { + sqlQuery.append(" AND DATE(createdOn) BETWEEN DATE(:startDate) AND DATE(:endDate) "); + sqlQuery.append(" AND idOffice = :idOffice "); + } else { + sqlQuery.append(" WHERE DATE(createdOn) BETWEEN DATE(:startDate) AND DATE(:endDate) "); + sqlQuery.append(" AND idOffice = :idOffice "); + } + + sqlQuery.append(" ORDER BY "); + + if (null == sortField || "".equals(sortField)) { + sqlQuery.append(" createdOn ASC"); + } else { + sqlQuery.append(sortField); + + if (null != sortOrder) { + sqlQuery.append(" "); + sqlQuery.append(sortOrder.equals(SortOrder.ASCENDING) ? "ASC" : "DESC"); + } else { + sqlQuery.append(" ASC"); + } + } + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter("startDate", starDate)); + parameters.add(new ModelParameter("endDate", endDate)); + parameters.add(new ModelParameter("idOffice", officeId)); + + return lazyLoadingEntityList(TransferView.class, sqlQuery.toString(), parameters, first, pageSize); + } catch (Exception e) { + logger.error("CustomerView", e); + return new ArrayList(); + } + } +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/catalog/LoanService.java b/apc-controller/src/main/java/com/arrebol/apc/service/catalog/LoanService.java new file mode 100644 index 0000000..c8f1d8a --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/catalog/LoanService.java @@ -0,0 +1,47 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service.catalog; + +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.loan.LoanByUser; +import com.arrebol.apc.model.loan.LoanDetails; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface LoanService { + + /** + * + * @param loan + * @return + */ + boolean saveLoan(Loan loan); + + /** + * + * @param loanId + * @return + */ + Loan getLoanById(String loanId); + + /** + * + * @param loanByUser + * @return + */ + boolean saveLoanByUser(LoanByUser loanByUser); + + /** + * + * @param loanDetails + * @return + */ + boolean saveLoanDetail(LoanDetails loanDetails); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/catalog/LoanServiceImpl.java b/apc-controller/src/main/java/com/arrebol/apc/service/catalog/LoanServiceImpl.java new file mode 100644 index 0000000..97aa142 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/catalog/LoanServiceImpl.java @@ -0,0 +1,51 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service.catalog; + +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.loan.LoanByUser; +import com.arrebol.apc.model.loan.LoanDetails; +import com.arrebol.apc.repository.LazyDataModelDAORepository; +import javax.enterprise.context.RequestScoped; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@RequestScoped +public class LoanServiceImpl extends LazyDataModelDAORepository implements LoanService { + + @Override + public boolean saveLoan(Loan loan) { + logger.debug("saveLoan"); + return save(loan); + } + + @Override + public Loan getLoanById(String loanId) { + logger.debug("getLoanById"); + + return (Loan) findAPCEntity(Loan.class, loanId); + } + + @Override + public boolean saveLoanByUser(LoanByUser loanByUser) { + logger.debug("saveLoanByUser"); + return save(loanByUser); + } + + @Override + public boolean saveLoanDetail(LoanDetails loanDetails) { + logger.debug("saveLoanDetail"); + return save(loanDetails); + } + + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/catalog/LoanTypeService.java b/apc-controller/src/main/java/com/arrebol/apc/service/catalog/LoanTypeService.java new file mode 100644 index 0000000..7d9312d --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/catalog/LoanTypeService.java @@ -0,0 +1,32 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service.catalog; + +import com.arrebol.apc.model.loan.LoanType; +import java.util.List; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface LoanTypeService { + + /** + * + * @param loanTypeId + * @return + */ + LoanType getLoanTypeById(String loanTypeId); + + /** + * + * @param officeId + * @return + */ + List fillLoanTypeDatatable(String officeId); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/catalog/LoanTypeServiceImpl.java b/apc-controller/src/main/java/com/arrebol/apc/service/catalog/LoanTypeServiceImpl.java new file mode 100644 index 0000000..e2ddd08 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/catalog/LoanTypeServiceImpl.java @@ -0,0 +1,47 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service.catalog; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.constance.LoanTypeCfg; +import com.arrebol.apc.model.loan.LoanType; +import com.arrebol.apc.repository.LazyDataModelDAORepository; +import java.util.ArrayList; +import java.util.List; +import javax.enterprise.context.RequestScoped; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@RequestScoped +public class LoanTypeServiceImpl extends LazyDataModelDAORepository implements LoanTypeService { + + @Override + public LoanType getLoanTypeById(String loanTypeId) { + logger.debug("getLoanTypeById"); + + return (LoanType) findAPCEntity(LoanType.class, loanTypeId); + } + + @Override + public List fillLoanTypeDatatable(String officeId) { + logger.debug("fillLoanTypeDatatable"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(LoanTypeCfg.FIELD_OFFICE, new Office(officeId))); + + return xmlQueryAPCEntities(LoanType.class, LoanTypeCfg.QUERY_FIND_ALL_DATA_LOAN_TYPE_BY_OFFICE, parameters); + } + + final Logger logger = LogManager.getLogger(getClass()); + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/catalog/PeopleAutoCompleteService.java b/apc-controller/src/main/java/com/arrebol/apc/service/catalog/PeopleAutoCompleteService.java new file mode 100644 index 0000000..52fff2b --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/catalog/PeopleAutoCompleteService.java @@ -0,0 +1,23 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service.catalog; + +import com.arrebol.apc.model.catalog.People; +import java.util.List; + +/** + * + * @author Carlos Janitzio Zavala Lopez + * + */ +public interface PeopleAutoCompleteService { + + List findCustomersLike(String valueToSearch); + + List findEndorsementsLike(String valueToSearch); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/catalog/PeopleAutoCompleteServiceImpl.java b/apc-controller/src/main/java/com/arrebol/apc/service/catalog/PeopleAutoCompleteServiceImpl.java new file mode 100644 index 0000000..601f5a4 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/catalog/PeopleAutoCompleteServiceImpl.java @@ -0,0 +1,83 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service.catalog; + +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.repository.AutoCompleteDAORepository; +import java.util.ArrayList; +import java.util.List; +import javax.enterprise.context.RequestScoped; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@RequestScoped +public class PeopleAutoCompleteServiceImpl extends AutoCompleteDAORepository implements PeopleAutoCompleteService { + + @Override + public List findCustomersLike(String valueToSearch) { + try { + StringBuilder builder = new StringBuilder("FROM People WHERE "); + + builder.append("(firstName LIKE '%"); + builder.append(valueToSearch); + builder.append("%' OR "); + builder.append("secondName LIKE '%"); + builder.append(valueToSearch); + builder.append("%' OR "); + builder.append("lastName LIKE '%"); + builder.append(valueToSearch); + builder.append("%' OR "); + builder.append("middleName LIKE '%"); + builder.append(valueToSearch); + builder.append("%') "); + builder.append("AND peopleType IN('CUSTOMER','BOTH') "); + builder.append("AND activeStatus = 'ENEBLED' "); + builder.append("ORDER BY firstName"); + + return searchLike(People.class, builder.toString(), null); + } catch (Exception e) { + logger.error("findCustomersLike", e); + return new ArrayList<>(); + } + } + + @Override + public List findEndorsementsLike(String valueToSearch) { + try { + StringBuilder builder = new StringBuilder("FROM People WHERE "); + + builder.append("(firstName LIKE '%"); + builder.append(valueToSearch); + builder.append("%' OR "); + builder.append("secondName LIKE '%"); + builder.append(valueToSearch); + builder.append("%' OR "); + builder.append("lastName LIKE '%"); + builder.append(valueToSearch); + builder.append("%' OR "); + builder.append("middleName LIKE '%"); + builder.append(valueToSearch); + builder.append("%') "); + builder.append("AND peopleType IN('ENDORSEMENT','BOTH') "); + builder.append("AND activeStatus = 'ENEBLED' "); + builder.append("ORDER BY firstName"); + + return searchLike(People.class, builder.toString(), null); + } catch (Exception e) { + logger.error("findEndorsementsLike", e); + return new ArrayList<>(); + } + } + + final Logger logger = LogManager.getLogger(getClass()); + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/catalog/RouteService.java b/apc-controller/src/main/java/com/arrebol/apc/service/catalog/RouteService.java new file mode 100644 index 0000000..40337b4 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/catalog/RouteService.java @@ -0,0 +1,25 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service.catalog; + +import com.arrebol.apc.model.catalog.RouteCtlg; +import java.util.List; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface RouteService { + + /** + * + * @param officeId + * @return + */ + List fillRoutesDatatable(String officeId); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/catalog/RouteServiceImpl.java b/apc-controller/src/main/java/com/arrebol/apc/service/catalog/RouteServiceImpl.java new file mode 100644 index 0000000..d6823dd --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/catalog/RouteServiceImpl.java @@ -0,0 +1,42 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service.catalog; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.catalog.constance.RouteCfg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.repository.LazyDataModelDAORepository; +import java.util.ArrayList; +import java.util.List; +import javax.enterprise.context.RequestScoped; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@RequestScoped +public class RouteServiceImpl extends LazyDataModelDAORepository implements RouteService { + + @Override + public List fillRoutesDatatable(String officeId) { + logger.debug("fillRoutesDatatable"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(RouteCfg.FIELD_ACTIVE_STATUS, ActiveStatus.ENEBLED)); + parameters.add(new ModelParameter(RouteCfg.FIELD_OFFICE, new Office(officeId))); + + return xmlQueryAPCEntities(RouteCtlg.class, RouteCfg.QUERY_FIND_ALL_ROUTES, parameters); + } + + final Logger logger = LogManager.getLogger(getClass()); + +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/core/UserService.java b/apc-controller/src/main/java/com/arrebol/apc/service/core/UserService.java new file mode 100644 index 0000000..a7d8c56 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/core/UserService.java @@ -0,0 +1,25 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service.core; + +import com.arrebol.apc.model.core.User; +import java.util.List; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface UserService { + + /** + * + * @param officeId + * @return + */ + List getAllUsersByOffice(String officeId); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/core/UserServiceImpl.java b/apc-controller/src/main/java/com/arrebol/apc/service/core/UserServiceImpl.java new file mode 100644 index 0000000..42dd1c3 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/core/UserServiceImpl.java @@ -0,0 +1,39 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service.core; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.core.constance.UserCfg; +import com.arrebol.apc.repository.LazyDataModelDAORepository; +import java.util.ArrayList; +import java.util.List; +import javax.enterprise.context.RequestScoped; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@RequestScoped +public class UserServiceImpl extends LazyDataModelDAORepository implements UserService { + + @Override + public List getAllUsersByOffice(String officeId) { + logger.debug("getAllUsersByOffice"); + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(UserCfg.FIELD_OFFICE, new Office(officeId))); + + return xmlQueryAPCEntities(User.class, UserCfg.QUERY_FIND_ALL_USERS_COMPLETE, parameters); + } + + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/views/EnabledUserDetailsViewService.java b/apc-controller/src/main/java/com/arrebol/apc/service/views/EnabledUserDetailsViewService.java new file mode 100644 index 0000000..02ff983 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/views/EnabledUserDetailsViewService.java @@ -0,0 +1,25 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service.views; + +import com.arrebol.apc.model.views.EnabledUserDetailsView; +import java.util.List; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface EnabledUserDetailsViewService { + + /** + * + * @param officeId + * @return + */ + List findEnabledUsersByOffice(String officeId); +} diff --git a/apc-controller/src/main/java/com/arrebol/apc/service/views/EnabledUserDetailsViewServiceImpl.java b/apc-controller/src/main/java/com/arrebol/apc/service/views/EnabledUserDetailsViewServiceImpl.java new file mode 100644 index 0000000..b399c55 --- /dev/null +++ b/apc-controller/src/main/java/com/arrebol/apc/service/views/EnabledUserDetailsViewServiceImpl.java @@ -0,0 +1,43 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.service.views; + +import com.arrebol.apc.model.ModelParameter; +import com.arrebol.apc.model.views.EnabledUserDetailsView; +import com.arrebol.apc.model.views.constance.EnabledUserDetailsViewCfg; +import com.arrebol.apc.repository.LazyDataModelDAORepository; +import java.util.ArrayList; +import java.util.List; +import javax.enterprise.context.RequestScoped; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@RequestScoped +public class EnabledUserDetailsViewServiceImpl extends LazyDataModelDAORepository implements EnabledUserDetailsViewService { + + @Override + public List findEnabledUsersByOffice(String officeId) { + logger.debug("findEnabledUsersByOffice"); + try { + List parameters = new ArrayList<>(); + + parameters.add(new ModelParameter(EnabledUserDetailsViewCfg.PARAM_OFFICE_ID, officeId)); + + return xmlQueryAPCEntities(EnabledUserDetailsView.class, EnabledUserDetailsViewCfg.QUERY_FIND_ENABLED_USERS_BY_OFFICE, parameters); + } catch (Exception e) { + logger.error("findEnabledUsersByOffice", e); + return new ArrayList<>(); + } + } + + final Logger logger = LogManager.getLogger(getClass()); +} diff --git a/apc-controller/src/test/java/com/arrebol/apc/controller/admin/AdministrationPersonSearchViewControllerTest.java b/apc-controller/src/test/java/com/arrebol/apc/controller/admin/AdministrationPersonSearchViewControllerTest.java new file mode 100644 index 0000000..f1de3ee --- /dev/null +++ b/apc-controller/src/test/java/com/arrebol/apc/controller/admin/AdministrationPersonSearchViewControllerTest.java @@ -0,0 +1,47 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import com.arrebol.apc.model.enums.PeopleType; +import com.arrebol.apc.model.views.AdministrationPersonSerchView; +import java.util.ArrayList; +import java.util.List; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class AdministrationPersonSearchViewControllerTest { + + private AdministrationPersonSearchViewController controller; + private final String person_search = "%mari%"; + private final String id_office = "caef3a64-7d1f-11ea-af3e-28f659da398e"; + private List routes; + + @Before + public void init() { + controller = new AdministrationPersonSearchViewController(); + routes = new ArrayList<>(); + + routes.add("51b207a2-8e19-11ea-b65e-4e1376171215"); + routes.add("5a329e3c-8e19-11ea-b65e-4e1376171215"); + routes.add("55baf3ae-8e19-11ea-b65e-4e1376171215"); + } + + @Test + public void existStableSmallBoxByCreatedOn() { + List results = controller.likePersonNameInPersonTypeInRoutesAndOffice(person_search, PeopleType.ENDORSEMENT, routes, id_office); + + results.forEach(System.out::println); + + Assert.assertTrue(!results.isEmpty()); + } +} diff --git a/apc-controller/src/test/java/com/arrebol/apc/controller/admin/ClosingDayControllerTest.java b/apc-controller/src/test/java/com/arrebol/apc/controller/admin/ClosingDayControllerTest.java new file mode 100644 index 0000000..e307df5 --- /dev/null +++ b/apc-controller/src/test/java/com/arrebol/apc/controller/admin/ClosingDayControllerTest.java @@ -0,0 +1,46 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import java.util.Calendar; +import java.util.Date; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class ClosingDayControllerTest { + + private Date date; + private ClosingDayController controller; + + @Before + public void init() { + Calendar calendar = Calendar.getInstance(); + + //2021-March-07 09:07:04 + calendar.set(2021, 2, 13, 9, 7, 4); + date = calendar.getTime(); + + controller = new ClosingDayController(); + } + + @Test + public void existStableSmallBoxByCreatedOn() { + Assert.assertTrue(controller.existStableSmallBoxByCreatedOn(date)); + } + + @Test + public void existNextPaidClosingDayByCreatedOn() { + Assert.assertTrue(controller.existNextPaidClosingDayByCreatedOn(date)); + } + +} diff --git a/apc-controller/src/test/java/com/arrebol/apc/controller/admin/StableGeneralBoxControllerTest.java b/apc-controller/src/test/java/com/arrebol/apc/controller/admin/StableGeneralBoxControllerTest.java new file mode 100644 index 0000000..949dd9b --- /dev/null +++ b/apc-controller/src/test/java/com/arrebol/apc/controller/admin/StableGeneralBoxControllerTest.java @@ -0,0 +1,40 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import java.util.Calendar; +import java.util.Date; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class StableGeneralBoxControllerTest { + + private Date date; + private StableGeneralBoxController controller; + + @Before + public void init() { + Calendar calendar = Calendar.getInstance(); + + //2021-March-07 09:07:04 + calendar.set(2021, 2, 13, 9, 7, 4); + date = calendar.getTime(); + + controller = new StableGeneralBoxController(); + } + + @Test + public void existNextPaidStableGeneralBoxByCreatedOn() { + Assert.assertTrue(controller.existNextPaidStableGeneralBoxByCreatedOn(date)); + } +} diff --git a/apc-controller/src/test/java/com/arrebol/apc/controller/admin/StableSmallBoxControllerTest.java b/apc-controller/src/test/java/com/arrebol/apc/controller/admin/StableSmallBoxControllerTest.java new file mode 100644 index 0000000..e816f8f --- /dev/null +++ b/apc-controller/src/test/java/com/arrebol/apc/controller/admin/StableSmallBoxControllerTest.java @@ -0,0 +1,45 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.admin; + +import java.util.Calendar; +import java.util.Date; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class StableSmallBoxControllerTest { + + private Date date; + private StableSmallBoxController controller; + + @Before + public void init() { + Calendar calendar = Calendar.getInstance(); + + //2021-March-07 09:07:04 + calendar.set(2021, 2, 13, 9, 7, 4); + date = calendar.getTime(); + + controller = new StableSmallBoxController(); + } + + @Test + public void existStableGeneralBoxByCreatedOn() { + Assert.assertTrue(controller.existStableGeneralBoxByCreatedOn(date)); + } + + @Test + public void existNextPaidStableSmallBoxByCreatedOn() { + Assert.assertTrue(controller.existNextPaidStableSmallBoxByCreatedOn(date)); + } +} diff --git a/apc-controller/src/test/java/com/arrebol/apc/controller/login/LoginControllerTest.java b/apc-controller/src/test/java/com/arrebol/apc/controller/login/LoginControllerTest.java new file mode 100644 index 0000000..6109817 --- /dev/null +++ b/apc-controller/src/test/java/com/arrebol/apc/controller/login/LoginControllerTest.java @@ -0,0 +1,62 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.login; + +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.core.UserByOffice; +import java.util.List; +import org.junit.Test; +import static org.junit.Assert.*; +import org.junit.Before; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class LoginControllerTest { + + private LoginController controller; + private UserByOffice ubo; + private String USER_DIRECTOR = "direccion"; + private String CEO = "ejecutivo"; + private String OFFICE_TEPIC = "caef3a64-7d1f-11ea-af3e-28f659da398e"; + private String OFFICE_GDL = "e0f1a2fc-7d1f-11ea-af3e-28f659da398e"; + + public LoginControllerTest() { + } + + @Before + public void init() { + User user = new User("", CEO); + Office office = new Office(OFFICE_GDL); + ubo = new UserByOffice(user, office); + controller = new LoginController(); + } + + @Test + public void getAllActiveOffice() { + try { + List offices = controller.getAllActiveOfficeController(); + + assertFalse(offices.isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } + + @Test + public void findUserLogged() { + try { + assertNotNull(controller.findUserLoggedController(ubo)); + } catch (Exception e) { + assertFalse(true); + } + } + +} diff --git a/apc-controller/src/test/java/com/arrebol/apc/controller/system/employee/EmployeeControllerTest.java b/apc-controller/src/test/java/com/arrebol/apc/controller/system/employee/EmployeeControllerTest.java new file mode 100644 index 0000000..cbfcf00 --- /dev/null +++ b/apc-controller/src/test/java/com/arrebol/apc/controller/system/employee/EmployeeControllerTest.java @@ -0,0 +1,122 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.system.employee; + +import com.arrebol.apc.model.admin.Bonus; +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.HumanResourceByOffice; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ApplicationOwner; +import com.arrebol.apc.model.enums.HumanResourceStatus; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.UUID; +import org.junit.Test; +import static org.junit.Assert.*; +import org.junit.Before; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class EmployeeControllerTest { + + private EmployeeController controller; + private String JANITZIO = "13c588a6-7d1b-11ea-af3e-28f659da398e"; + private String RUBEN = "0dc7c246-7db8-11ea-9b1f-500320958bf8"; + private String DIRECCION_JANITZIO = "5751074e-7d1b-11ea-af3e-28f659da398e"; + private String OFFICE_TEPIC = "caef3a64-7d1f-11ea-af3e-28f659da398e"; + private String OFFICE_GDL = "e0f1a2fc-7d1f-11ea-af3e-28f659da398e"; + + public EmployeeControllerTest() { + } + + @Before + public void init() { + controller = new EmployeeController(); + } + + //@Test + public void findEmployeesByType() { + try { + List result = controller.findEmployeesByType( + new Office(OFFICE_GDL), + HumanResourceStatus.ENEBLED, + JANITZIO + ); + + result.forEach(System.out::println); + + assertFalse(result.isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } + + //@Test + public void findEmployeesInType() { + try { + List resourceStatuses = new ArrayList<>(); + + resourceStatuses.add(HumanResourceStatus.ENEBLED); + resourceStatuses.add(HumanResourceStatus.DISABLED); + + List result = controller.findEmployeesInType( + new Office(OFFICE_GDL), + resourceStatuses, + JANITZIO + ); + + result.forEach(System.out::println); + + assertFalse(result.isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } + + //@Test + public void saveHRController() { + try { + HumanResource hr = new HumanResource(); + hr.setId(UUID.randomUUID().toString()); + hr.setFirstName("Empleado 1"); + hr.setSecondName("Empleado 1"); + hr.setLastName("Paterno 1"); + hr.setMiddleName("Materno 2"); + hr.setAvatar("images/avatar.png"); + //hr.setHumanResourceType(HumanResourceType.ADVISER); + hr.setHumanResourceStatus(HumanResourceStatus.ENEBLED); + hr.setCreatedBy(DIRECCION_JANITZIO); + + HumanResourceByOffice humanResourceByOffice = new HumanResourceByOffice( + new Office(OFFICE_GDL), + DIRECCION_JANITZIO, + new Date(), + ApplicationOwner.APP_USER + ); + + assertTrue(controller.saveHRController(humanResourceByOffice, hr)); + + } catch (Exception e) { + assertFalse(true); + } + } + + @Test + public void findAllActiveBonus() { + try { + List bonuses = controller.findAllActiveBonus(OFFICE_TEPIC); + + assertTrue(bonuses.isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } +} diff --git a/apc-controller/src/test/java/com/arrebol/apc/controller/system/user/UserAccessControllerTest.java b/apc-controller/src/test/java/com/arrebol/apc/controller/system/user/UserAccessControllerTest.java new file mode 100644 index 0000000..0f48fb2 --- /dev/null +++ b/apc-controller/src/test/java/com/arrebol/apc/controller/system/user/UserAccessControllerTest.java @@ -0,0 +1,66 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.system.user; + +import com.arrebol.apc.model.core.Permission; +import com.arrebol.apc.model.core.UserByOffice; +import java.util.List; +import org.junit.Test; +import static org.junit.Assert.*; +import org.junit.Before; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class UserAccessControllerTest { + + private UserAccessController controller; + private UserByOffice userByOffice; + + public UserAccessControllerTest() { + } + + @Before + public void init() { + controller = new UserAccessController(); + userByOffice = new UserByOffice("d855f570-7dbb-11ea-9b1f-500320958bf8"); + } + + //@Test + public void loadUserByOfficePermissionLst() { + try { + List source = controller.loadUserByOfficePermissionLst(userByOffice, true); + List target = controller.loadUserByOfficePermissionLst(userByOffice, false); + + System.out.println("SOURCE"); + source.forEach(System.out::println); + System.out.println("TARGET"); + target.forEach(System.out::println); + + assertFalse(source.isEmpty()); + assertFalse(target.isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } + + @Test + public void findAllEnebledPermissions() { + try { + List permissions = controller.findAllEnebledPermissions(); + + permissions.forEach(System.out::println); + + assertFalse(permissions.isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } + +} diff --git a/apc-controller/src/test/java/com/arrebol/apc/controller/system/user/UserCreateControllerTest.java b/apc-controller/src/test/java/com/arrebol/apc/controller/system/user/UserCreateControllerTest.java new file mode 100644 index 0000000..0f8766d --- /dev/null +++ b/apc-controller/src/test/java/com/arrebol/apc/controller/system/user/UserCreateControllerTest.java @@ -0,0 +1,99 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.system.user; + +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.UserByOffice; +import com.arrebol.apc.model.enums.HumanResourceStatus; +import java.util.List; +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class UserCreateControllerTest { + + private UserCreateController controller; + private String USER_DIRECTOR = "DireCCioNa"; + private String CEO = "ejecutivo"; + private String USER_GLD_JANITZIO = "5751074e-7d1b-11ea-af3e-28f659da398e"; + private String OFFICE_TEPIC = "caef3a64-7d1f-11ea-af3e-28f659da398e"; + private String OFFICE_GDL = "e0f1a2fc-7d1f-11ea-af3e-28f659da398e"; + + @Before + public void init() { + controller = new UserCreateController(); + } + + @Test + public void isUsernameAvailableController() { + try { + assertTrue(controller.isUsernameAvailableController(USER_DIRECTOR, OFFICE_GDL)); + } catch (Exception e) { + assertFalse(true); + } + } + + @Test + public void findAllHRsWithoutUser() { + try { + List result = controller.findAllHRsWithoutUser(new Office(OFFICE_GDL), HumanResourceStatus.ENEBLED); + + result.forEach(System.out::println); + + assertFalse(result.isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } + + @Test + public void findIdOfUserByOffice() { + try { + UserByOffice userByOffice = controller.findIdOfUserByOffice(USER_GLD_JANITZIO, OFFICE_GDL); + + System.out.println(userByOffice); + + assertNotNull(userByOffice); + } catch (Exception e) { + assertFalse(true); + } + } + + @Test + public void findRoutesByOffice() { + try { + List result = controller.findRoutesByOffice(OFFICE_GDL); + + result.forEach(System.out::println); + + assertFalse(result.isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } + + @Test + public void findRoutesWithNoCertifierUser() { + try { + List result = controller.findRoutesWithNoCertifierUser(OFFICE_TEPIC); + + result.forEach(System.out::println); + + assertTrue(result.isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } + +} diff --git a/apc-controller/src/test/java/com/arrebol/apc/controller/system/user/UserUpdateControllerTest.java b/apc-controller/src/test/java/com/arrebol/apc/controller/system/user/UserUpdateControllerTest.java new file mode 100644 index 0000000..23b7673 --- /dev/null +++ b/apc-controller/src/test/java/com/arrebol/apc/controller/system/user/UserUpdateControllerTest.java @@ -0,0 +1,64 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.system.user; + +import com.arrebol.apc.model.core.Permission; +import com.arrebol.apc.model.core.UserByOffice; +import com.arrebol.apc.model.enums.UserStatus; +import java.util.ArrayList; +import java.util.List; +import org.junit.Test; +import static org.junit.Assert.*; +import org.junit.Before; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class UserUpdateControllerTest { + + private UserUpdateController controller; + private final String OWNER_ID = "0dc7c246-7db8-11ea-9b1f-500320958bf8"; + private final String BALAM_UBO_ID = "caee5744-017b-4d1b-83f4-9087631cce4a"; + private final String BALAM_HR_ID = "9dc91af3-8c95-4234-b188-4e193e04e6bc"; + private final String YUNUEN_UBO_ID = "e9b4d118-da8a-48ac-aac8-50327294be71"; + private final String YUNUEN_HR_ID = "6ec0f133-bb05-4be9-ab9d-ec7b89d344ac"; + private final String OFFICE_ID = "caef3a64-7d1f-11ea-af3e-28f659da398e"; + private final boolean IS_ROUTE = true; + private final boolean IN = false; + + @Before + public void init() { + controller = new UserUpdateController(); + } + + @Test + public void findUsersInOfficeInStatuses() { + try { + List statuses = new ArrayList<>(); + + statuses.add(UserStatus.ENEBLED); + controller.findUsersInOfficeInStatuses(statuses, OFFICE_ID, OWNER_ID); + } catch (Exception e) { + assertFalse(true); + } + } + + @Test + public void findList() { + try { + List result = controller.findList(IS_ROUTE, IN, BALAM_UBO_ID, BALAM_HR_ID, OFFICE_ID); + + System.out.println("Size of the list: " + result.size()); + result.forEach(System.out::println); + assertFalse(result.isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } +} diff --git a/apc-controller/src/test/java/com/arrebol/apc/controller/topbar/TopBarControllerTest.java b/apc-controller/src/test/java/com/arrebol/apc/controller/topbar/TopBarControllerTest.java new file mode 100644 index 0000000..4ac01a8 --- /dev/null +++ b/apc-controller/src/test/java/com/arrebol/apc/controller/topbar/TopBarControllerTest.java @@ -0,0 +1,46 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.controller.topbar; + +import com.arrebol.apc.model.core.Office; +import java.util.List; +import org.junit.Test; +import static org.junit.Assert.*; +import org.junit.Before; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class TopBarControllerTest { + + private TopBarController controller; + private final String USER_ID = "5751074e-7d1b-11ea-af3e-28f659da398e"; + private final String OFFICE_ID = "e0f1a2fc-7d1f-11ea-af3e-28f659da398e"; + + public TopBarControllerTest() { + } + + @Before + public void init() { + controller = new TopBarController(); + } + + @Test + public void findAllOfficesByUser() { + try { + List offices = controller.findAllOfficesByUserController(USER_ID); + + offices.forEach(System.out::println); + + assertFalse(offices.isEmpty()); + } catch (Exception e) { + assertFalse(true); + } + } +} diff --git a/apc-controller/src/test/resources/apc.cfg.xml b/apc-controller/src/test/resources/apc.cfg.xml new file mode 100644 index 0000000..7179e6f --- /dev/null +++ b/apc-controller/src/test/resources/apc.cfg.xml @@ -0,0 +1,224 @@ + + + + + org.hibernate.dialect.MySQLDialect + com.mysql.cj.jdbc.Driver + jdbc:mysql://localhost:3306/apo_pro_com_april_ten?serverTimezone=GMT-5 + apoprocomlocalhost + Yj$2Da0z! + 1 + 2 + 300 + 50 + 3000 + false + false + true + thread + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-controller/src/test/resources/log4j2.xml b/apc-controller/src/test/resources/log4j2.xml new file mode 100644 index 0000000..9611256 --- /dev/null +++ b/apc-controller/src/test/resources/log4j2.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-db/build.xml b/apc-db/build.xml new file mode 100644 index 0000000..5fc94c9 --- /dev/null +++ b/apc-db/build.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + Builds, tests, and runs the project apc-db. + + + diff --git a/apc-db/manifest.mf b/apc-db/manifest.mf new file mode 100644 index 0000000..328e8e5 --- /dev/null +++ b/apc-db/manifest.mf @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +X-COMMENT: Main-Class will be added automatically by build + diff --git a/apc-db/nbproject/build-impl.xml b/apc-db/nbproject/build-impl.xml new file mode 100644 index 0000000..2980166 --- /dev/null +++ b/apc-db/nbproject/build-impl.xml @@ -0,0 +1,1771 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set src.dir + Must set test.src.dir + Must set build.dir + Must set dist.dir + Must set build.classes.dir + Must set dist.javadoc.dir + Must set build.test.classes.dir + Must set build.test.results.dir + Must set build.classes.excludes + Must set dist.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No tests executed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set JVM to use for profiling in profiler.info.jvm + Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + java -jar "${dist.jar.resolved}" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + Must select one file in the IDE or set run.class + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + Must select one file in the IDE or set debug.class + + + + + Must set fix.includes + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + Must select one file in the IDE or set profile.class + This target only works when run from inside the NetBeans IDE. + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + Must select some files in the IDE or set test.includes + + + + + Must select one file in the IDE or set run.class + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + Some tests failed; see details above. + + + + + + + + + Must select some files in the IDE or set test.includes + + + + Some tests failed; see details above. + + + + Must select some files in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + Some tests failed; see details above. + + + + + Must select one file in the IDE or set test.class + + + + Must select one file in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + + + + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apc-db/nbproject/genfiles.properties b/apc-db/nbproject/genfiles.properties new file mode 100644 index 0000000..47fc549 --- /dev/null +++ b/apc-db/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=d3b167ef +build.xml.script.CRC32=9dc73bba +build.xml.stylesheet.CRC32=f85dc8f2@1.93.0.48 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=d3b167ef +nbproject/build-impl.xml.script.CRC32=17d0f71e +nbproject/build-impl.xml.stylesheet.CRC32=12e0a6c2@1.104.0.48 diff --git a/apc-db/nbproject/project.properties b/apc-db/nbproject/project.properties new file mode 100644 index 0000000..1627a6e --- /dev/null +++ b/apc-db/nbproject/project.properties @@ -0,0 +1,86 @@ +annotation.processing.enabled=true +annotation.processing.enabled.in.editor=false +annotation.processing.processor.options= +annotation.processing.processors.list= +annotation.processing.run.all.processors=true +annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.java,**/*.form +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +build.generated.sources.dir=${build.dir}/generated-sources +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +# Uncomment to specify the preferred debugger connection transport: +#debug.transport=dt_socket +debug.classpath=\ + ${run.classpath} +debug.modulepath=\ + ${run.modulepath} +debug.test.classpath=\ + ${run.test.classpath} +debug.test.modulepath=\ + ${run.test.modulepath} +# Files in build.classes.dir which should be excluded from distribution jar +dist.archive.excludes= +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/apc-db.jar +dist.javadoc.dir=${dist.dir}/javadoc +excludes= +includes=** +jar.compress=false +javac.classpath= +# Space-separated list of extra javac options +javac.compilerargs= +javac.deprecation=false +javac.external.vm=true +javac.modulepath= +javac.processormodulepath= +javac.processorpath=\ + ${javac.classpath} +javac.source=1.8 +javac.target=1.8 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +javac.test.modulepath=\ + ${javac.modulepath} +javac.test.processorpath=\ + ${javac.test.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +main.class= +manifest.file=manifest.mf +meta.inf.dir=${src.dir}/META-INF +mkdist.disabled=false +platform.active=default_platform +run.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +# Space-separated list of JVM arguments used when running the project. +# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value. +# To set system properties for unit tests define test-sys-prop.name=value: +run.jvmargs= +run.modulepath=\ + ${javac.modulepath} +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +run.test.modulepath=\ + ${javac.test.modulepath} +source.encoding=UTF-8 +src.dir=src +test.src.dir=test diff --git a/apc-db/nbproject/project.xml b/apc-db/nbproject/project.xml new file mode 100644 index 0000000..86a935f --- /dev/null +++ b/apc-db/nbproject/project.xml @@ -0,0 +1,15 @@ + + + org.netbeans.modules.java.j2seproject + + + apc-db + + + + + + + + + diff --git a/apc-db/src/XXXXXXXX.sql b/apc-db/src/XXXXXXXX.sql new file mode 100644 index 0000000..261405d --- /dev/null +++ b/apc-db/src/XXXXXXXX.sql @@ -0,0 +1,303 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +/** + * Author: Oscar + * Created: 11/01/2022 + */ + +CREATE OR REPLACE VIEW `APC_INFORMATION_LOAN_WEEK_VIEW` AS +SELECT +l.id, +u.id as id_user, +r.id_office, +l.created_on as fecha, +lt.payment as apoyos, +lt.payment_total as apoyos_total, +lt.opening_fee as comision_apertura, +CONCAT(endor.first_name,' ', IF(ISNULL(endor.second_name) ,'', CONCAT(endor.second_name,' ')) ,endor.last_name, ' ', endor.middle_name) AS aval, +CONCAT(cus.first_name,' ', IF(ISNULL(cus.second_name) ,'', CONCAT(cus.second_name,' ')) ,cus.last_name, ' ', cus.middle_name) AS customer, +l.amount_to_pay as documento_por, +lt.payment_daily as abono_diario, +l.amount_paid, +(l.amount_to_pay - l.amount_paid) saldo_insoluto, +r.route_name, +CONCAT(hr.first_name,' ', IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name,' ')) ,hr.last_name, ' ', hr.middle_name) AS asesor, +(SELECT COUNT(lfn.id) FROM APC_LOAN_FEE_NOTIFICATION lfn WHERE lfn.id_loan = l.id) as num_fee, +-- Lunes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'monday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_monday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'monday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_monday, +-- Martes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'tuesday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_tuesday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'tuesday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_tuesday, +-- Miercoles +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) +AND YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'wednesday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_wednesday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'wednesday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_wednesday, +-- Jueves +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'thursday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_thursday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'thursday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_thursday, +-- Viernes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'friday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_friday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'friday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_friday, +-- Sabado +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'saturday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_saturday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'saturday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_saturday, + +((lt.payment_daily * (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) > 5, 5 , COUNT(DISTINCT(DATE(ldFaltante.created_on)))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE'))) +- (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) as faltante, + +CASE WHEN l.new_customer = 'ENEBLED' AND WEEK(DATE(l.created_on),1) = WEEK(CURDATE(),1) THEN 'Si' ELSE 'No' END as new_customer, +if((SELECT COUNT(id_loan_old) FROM APC_LOAN_BY_RENOVATION lbr +INNER JOIN APC_LOAN lRenovation ON lbr.id_loan_new = lRenovation.id +WHERE id_loan_old = l.id + AND loan_by_renovation_status = 'APPROVED' and WEEK(DATE(lRenovation.created_on),1) <= WEEK(CURDATE(),1) AND + YEAR(DATE(lRenovation.created_on)) = YEAR(CURDATE())) = 0 , 'No' , 'Si') as renovation, +l.loan_status as estatus_prestamo, +(SELECT COUNT(DISTINCT(DATE(ldFaltante.created_on))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE')) as num_pagos_all, +(SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) > 5, 5, COUNT(DISTINCT(DATE(ldFaltante.created_on)))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE')) as num_pagos_week, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND ldLunes.loan_details_type IN ('FEE')) as fee_todos +FROM +APC_LOAN l +INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +INNER JOIN APC_PEOPLE cus ON cus.id = l.id_customer +INNER JOIN APC_PEOPLE endor ON endor.id = l.id_endorsement +INNER JOIN APC_ROUTE r ON r.id = l.id_route +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +INNER JOIN APC_USER u ON u.id = lbu.id_user +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +WHERE +l.loan_status not in ('DELETED','REJECTED') AND +((SELECT COUNT(ld.id) FROM APC_LOAN_DETAIL ld WHERE WEEK(DATE(ld.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.id_loan = l.id) > 0 OR + ((SELECT COUNT(ld.id) FROM APC_LOAN_DETAIL ld WHERE WEEK(DATE(ld.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.id_loan = l.id) = 0 AND l.loan_status = 'APPROVED' AND + WEEK(DATE(l.created_on),1) <= (WEEK(CURDATE(),1)))); +---------------------------------------------------------------- +---------------------------------------------------------------- +CREATE OR REPLACE VIEW `APC_INFORMATION_LOAN_LAST_WEEK_VIEW` AS +SELECT +l.id, +u.id as id_user, +r.id_office, +l.created_on as fecha, +lt.payment as apoyos, +lt.payment_total as apoyos_total, +lt.opening_fee as comision_apertura, +CONCAT(endor.first_name,' ', IF(ISNULL(endor.second_name) ,'', CONCAT(endor.second_name,' ')) ,endor.last_name, ' ', endor.middle_name) AS aval, +CONCAT(cus.first_name,' ', IF(ISNULL(cus.second_name) ,'', CONCAT(cus.second_name,' ')) ,cus.last_name, ' ', cus.middle_name) AS customer, +l.amount_to_pay as documento_por, +lt.payment_daily as abono_diario, +l.amount_paid, +(l.amount_to_pay - l.amount_paid) saldo_insoluto, +r.route_name, +CONCAT(hr.first_name,' ', IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name,' ')) ,hr.last_name, ' ', hr.middle_name) AS asesor, +(SELECT COUNT(lfn.id) FROM APC_LOAN_FEE_NOTIFICATION lfn WHERE lfn.id_loan = l.id) as num_fee, +-- Lunes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'monday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_monday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'monday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_monday, +-- Martes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'tuesday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_tuesday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'tuesday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_tuesday, +-- Miercoles +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'wednesday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_wednesday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'wednesday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_wednesday, +-- Jueves +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'thursday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_thursday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'thursday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_thursday, +-- Viernes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'friday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_friday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'friday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_friday, +-- Sabado +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'saturday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_saturday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'saturday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_saturday, + +((lt.payment_daily * (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) > 5, 5, COUNT(DISTINCT(DATE(ldFaltante.created_on)))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE'))) +- (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) as faltante, + +CASE WHEN l.new_customer = 'ENEBLED' AND WEEK(DATE(l.created_on),1) = (WEEK(CURDATE(),1) - 1) THEN 'Si' ELSE 'No' END as new_customer, +(SELECT IF(COUNT(id_loan_old) = 0 , 'No' , 'Si') FROM APC_LOAN_BY_RENOVATION lbr +INNER JOIN APC_LOAN lRenovation ON lbr.id_loan_new = lRenovation.id +WHERE id_loan_old = l.id + AND loan_by_renovation_status = 'APPROVED' and WEEK(DATE(lRenovation.created_on),1) <= (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(lRenovation.created_on)) = YEAR(CURDATE())) as renovation, +l.loan_status as estatus_prestamo, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as abono_semana_actual, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('FEE')) as fee_semana_actual, +(SELECT COUNT(DISTINCT(DATE(ldFaltante.created_on))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND DATE(ldFaltante.created_on) <= DATE('2022-01-23') and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE')) as num_pagos_all, +(SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) > 5, 5, COUNT(DISTINCT(DATE(ldFaltante.created_on)))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE')) as num_pagos_week, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) <= DATE('2022-01-23') +AND ldLunes.loan_details_type IN ('FEE')) as fee_todos +FROM +APC_LOAN l +INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +INNER JOIN APC_PEOPLE cus ON cus.id = l.id_customer +INNER JOIN APC_PEOPLE endor ON endor.id = l.id_endorsement +INNER JOIN APC_ROUTE r ON r.id = l.id_route +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +INNER JOIN APC_USER u ON u.id = lbu.id_user +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +WHERE +l.loan_status not in ('DELETED','REJECTED') AND +((SELECT COUNT(ld.id) FROM APC_LOAN_DETAIL ld WHERE WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.id_loan = l.id) > 0 OR + ((SELECT COUNT(ld.id) FROM APC_LOAN_DETAIL ld WHERE WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.id_loan = l.id) = 0 AND l.loan_status = 'APPROVED' AND + WEEK(DATE(l.created_on),1) <= (WEEK(CURDATE(),1) - 1))); \ No newline at end of file diff --git a/apc-db/src/apc-config-db-aws.sql b/apc-db/src/apc-config-db-aws.sql new file mode 100644 index 0000000..5785fe7 --- /dev/null +++ b/apc-db/src/apc-config-db-aws.sql @@ -0,0 +1,133 @@ +-- -------------------------------------------------------- +-- Arrebol Consuntancy +-- version 1.0.1 +-- http://www.arrebolconsultancy.com +-- -------------------------------------------------------- + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET AUTOCOMMIT = 0; +START TRANSACTION; +-- SET time_zone = "+00:00"; + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- -------------------------------------------------------- + +-- +-- Base de datos: `apo_pro_com_april_ten` +-- +USE `apo_pro_com_april_ten`; + +-- -------------------------------------------------------- + +-- +-- Drop users: apoprocom & errortrace +-- +DROP USER IF EXISTS 'apoprocom'@'%'; +DROP USER IF EXISTS 'errortrace'@'%'; +DROP USER IF EXISTS 'apoprocommobile'@'%'; +DROP USER IF EXISTS 'apcreportdesktop'@'%'; +-- -------------------------------------------------------- + +-- +-- App user: `apoprocom` application user +-- + +CREATE USER 'apoprocom'@'%' + IDENTIFIED BY 'Yj$2Da0z!'; + +GRANT SELECT ON apo_pro_com_april_ten.* TO 'apoprocom'@'%'; +GRANT INSERT, UPDATE, DELETE ON apo_pro_com_april_ten.* TO 'apoprocom'@'%'; +GRANT EXECUTE ON apo_pro_com_april_ten.* TO 'apoprocom'@'%'; + +-- -------------------------------------------------------- + +-- +-- Error trace user: `errortrace` DB user +-- + +-- -------------------------------------------------------- + +CREATE USER 'errortrace'@'%' + IDENTIFIED BY 'zy61$Jql'; +GRANT ALL ON apo_pro_com_april_ten.APC_ERROR_APP_LOG TO 'errortrace'@'%'; + +-- -------------------------------------------------------- + +-- +-- Error trace user: `apoprocommobile` DB user +-- + +-- -------------------------------------------------------- + +CREATE USER 'apoprocommobile'@'%' + IDENTIFIED BY '0Ps$6%q8'; + +GRANT SELECT, INSERT, DELETE ON apo_pro_com_april_ten.APC_LOAN_DETAIL TO 'apoprocommobile'@'%'; +GRANT SELECT, INSERT, DELETE ON apo_pro_com_april_ten.APC_LOAN_FEE_NOTIFICATION TO 'apoprocommobile'@'%'; +GRANT SELECT, INSERT ON apo_pro_com_april_ten.APC_DELIVERY TO 'apoprocommobile'@'%'; +GRANT SELECT, INSERT ON apo_pro_com_april_ten.APC_OTHER_EXPENSE TO 'apoprocommobile'@'%'; + +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_LOAN_BY_RENOVATION TO 'apoprocommobile'@'%'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_LOAN_BY_USER TO 'apoprocommobile'@'%'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_USER_MOBILE_PREFERECE TO 'apoprocommobile'@'%'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_PEOPLE TO 'apoprocommobile'@'%'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_LOAN TO 'apoprocommobile'@'%'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_TRANSFER TO 'apoprocommobile'@'%'; +-- SELECT +GRANT SELECT ON apo_pro_com_april_ten.APC_OFFICE TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_USER TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_TYPE TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_MONEY_DAILY TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_CLOSING_DAY TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_HUMAN_RESOURCE_HAS_ROUTE TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_ROUTE TO 'apoprocommobile'@'%'; +-- Views +GRANT SELECT ON apo_pro_com_april_ten.APC_SECURITY_AUTHENTICATION_MOBILE TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_BY_USER_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_BY_USER_ORDER_PREFERENCE_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_PERSON_SEARCH_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_PERSON_SEARCH_DETAIL_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_AVAILABLE_CUSTOMERS_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_AVAILABLE_ENDORSEMENTS_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_CASH_REGISTER_CURDATE_BY_USER_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_TO_DELIVERY_BY_CERTIFIER_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_EXCHANGE_ENEBLED_USERS_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_TOTAL_CASH_BY_CURDATE_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_PERSON_SEARCH_HISTORICAL_DETAILS_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_APPROVED_DETAIL_VIEW TO 'apoprocommobile'@'%'; +-- ---------------------------------------------------------------------- +GRANT ALL ON apo_pro_com_april_ten.ARREBOL_TEST TO 'apoprocommobile'@'%'; +-- -------------------------------------------------------- + +-- +-- App user: `apcreportdesktop` report desktop user +-- + +CREATE USER 'apcreportdesktop'@'%' + IDENTIFIED BY 'hY5znQ8j'; + +GRANT SELECT ON apo_pro_com_april_ten.APC_USER TO 'apcreportdesktop'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_HUMAN_RESOURCE TO 'apcreportdesktop'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_TOTAL_CASH_BY_CURDATE_VIEW TO 'apcreportdesktop'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_CLOSING_DAILY_DETAIL_FROM_USER_BY_CURDATE_VIEW TO 'apcreportdesktop'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_CLOSING_DAILY_DETAIL_FROM_USER_BY_CURDATE_VIEW_REPORT TO 'apcreportdesktop'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_STABLE_SMALL_BOX TO 'apcreportdesktop'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_CLOSING_DAY TO 'apcreportdesktop'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_MONEY_DAILY TO 'apcreportdesktop'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_PAYROLL TO 'apcreportdesktop'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_ADVANCE TO 'apcreportdesktop'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_EXPENSE_COMPANY TO 'apcreportdesktop'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_STABLE_GENERAL_BOX TO 'apcreportdesktop'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN TO 'apcreportdesktop'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_TYPE TO 'apcreportdesktop'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_DETAIL TO 'apcreportdesktop'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_BY_USER TO 'apcreportdesktop'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_OFFICE TO 'apcreportdesktop'@'%'; +-- ---------------------------------------------------------------------- +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; \ No newline at end of file diff --git a/apc-db/src/apc-config-db-localhost.sql b/apc-db/src/apc-config-db-localhost.sql new file mode 100644 index 0000000..cdb1dd6 --- /dev/null +++ b/apc-db/src/apc-config-db-localhost.sql @@ -0,0 +1,133 @@ +-- -------------------------------------------------------- +-- Arrebol Consuntancy +-- version 1.0.1 +-- http://www.arrebolconsultancy.com +-- -------------------------------------------------------- + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET AUTOCOMMIT = 0; +START TRANSACTION; +-- SET time_zone = "+00:00"; + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- -------------------------------------------------------- + +-- +-- Base de datos: `apo_pro_com_april_ten` +-- +USE `apo_pro_com_april_ten`; + +-- -------------------------------------------------------- + +-- +-- Drop users: apoprocomlocalhost & errortracelocalhost +-- +DROP USER IF EXISTS 'apoprocomlocalhost'@'localhost'; +DROP USER IF EXISTS 'errortracelocalhost'@'localhost'; +DROP USER IF EXISTS 'apoprocommobilelocalhost'@'localhost'; +DROP USER IF EXISTS 'apcreportdesktop'@'localhost'; +-- -------------------------------------------------------- + +-- +-- App user: `apoprocomlocalhost` application user +-- + +CREATE USER 'apoprocomlocalhost'@'localhost' + IDENTIFIED BY 'Yj$2Da0z!'; + +GRANT SELECT ON apo_pro_com_april_ten.* TO 'apoprocomlocalhost'@'localhost'; +GRANT INSERT, UPDATE, DELETE ON apo_pro_com_april_ten.* TO 'apoprocomlocalhost'@'localhost'; +GRANT EXECUTE ON apo_pro_com_april_ten.* TO 'apoprocomlocalhost'@'localhost'; + +-- -------------------------------------------------------- + +-- +-- Error trace user: `errortracelocalhost` DB user +-- + +-- -------------------------------------------------------- + +CREATE USER 'errortracelocalhost'@'localhost' + IDENTIFIED BY 'zy61$Jql'; +GRANT ALL ON apo_pro_com_april_ten.APC_ERROR_APP_LOG TO 'errortracelocalhost'@'localhost'; + +-- -------------------------------------------------------- + +-- +-- Error trace user: `apoprocommobilelocalhost` DB user +-- + +-- -------------------------------------------------------- + +CREATE USER 'apoprocommobilelocalhost'@'localhost' + IDENTIFIED BY '0Ps$6%q8'; + +GRANT SELECT, INSERT, DELETE ON apo_pro_com_april_ten.APC_LOAN_DETAIL TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, INSERT, DELETE ON apo_pro_com_april_ten.APC_LOAN_FEE_NOTIFICATION TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, INSERT ON apo_pro_com_april_ten.APC_DELIVERY TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, INSERT ON apo_pro_com_april_ten.APC_OTHER_EXPENSE TO 'apoprocommobilelocalhost'@'localhost'; + +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_LOAN_BY_RENOVATION TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_LOAN_BY_USER TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_USER_MOBILE_PREFERECE TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_PEOPLE TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_LOAN TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_TRANSFER TO 'apoprocommobilelocalhost'@'localhost'; +-- SELECT +GRANT SELECT ON apo_pro_com_april_ten.APC_OFFICE TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_USER TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_TYPE TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_MONEY_DAILY TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_CLOSING_DAY TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_HUMAN_RESOURCE_HAS_ROUTE TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_ROUTE TO 'apoprocommobilelocalhost'@'localhost'; +-- Views +GRANT SELECT ON apo_pro_com_april_ten.APC_SECURITY_AUTHENTICATION_MOBILE TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_BY_USER_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_BY_USER_ORDER_PREFERENCE_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_PERSON_SEARCH_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_PERSON_SEARCH_DETAIL_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_AVAILABLE_CUSTOMERS_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_AVAILABLE_ENDORSEMENTS_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_CASH_REGISTER_CURDATE_BY_USER_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_TO_DELIVERY_BY_CERTIFIER_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_EXCHANGE_ENEBLED_USERS_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_TOTAL_CASH_BY_CURDATE_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_PERSON_SEARCH_HISTORICAL_DETAILS_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_APPROVED_DETAIL_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +-- ------------------------------------------------------------------------------------- +GRANT ALL ON apo_pro_com_april_ten.ARREBOL_TEST TO'apoprocommobilelocalhost'@'localhost'; +-- -------------------------------------------------------- + +-- +-- App user: `apcreportdesktop` report desktop user +-- + +CREATE USER 'apcreportdesktop'@'localhost' + IDENTIFIED BY 'hY5znQ8j'; + +GRANT SELECT ON apo_pro_com_april_ten.APC_USER TO 'apcreportdesktop'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_HUMAN_RESOURCE TO 'apcreportdesktop'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_TOTAL_CASH_BY_CURDATE_VIEW TO 'apcreportdesktop'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_CLOSING_DAILY_DETAIL_FROM_USER_BY_CURDATE_VIEW TO 'apcreportdesktop'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_CLOSING_DAILY_DETAIL_FROM_USER_BY_CURDATE_VIEW_REPORT TO 'apcreportdesktop'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_STABLE_SMALL_BOX TO 'apcreportdesktop'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_CLOSING_DAY TO 'apcreportdesktop'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_MONEY_DAILY TO 'apcreportdesktop'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_PAYROLL TO 'apcreportdesktop'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_ADVANCE TO 'apcreportdesktop'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_EXPENSE_COMPANY TO 'apcreportdesktop'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_STABLE_GENERAL_BOX TO 'apcreportdesktop'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN TO 'apcreportdesktop'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_TYPE TO 'apcreportdesktop'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_DETAIL TO 'apcreportdesktop'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_BY_USER TO 'apcreportdesktop'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_OFFICE TO 'apcreportdesktop'@'localhost'; +-- ------------------------------------------------------------------------------------- +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; \ No newline at end of file diff --git a/apc-db/src/apc-db-populate-empty.sql b/apc-db/src/apc-db-populate-empty.sql new file mode 100644 index 0000000..382f3b4 --- /dev/null +++ b/apc-db/src/apc-db-populate-empty.sql @@ -0,0 +1,27 @@ +-- -------------------------------------------------------- +-- Arrebol Consuntancy +-- version 1.0.1 +-- http://www.arrebolconsultancy.com +-- -------------------------------------------------------- + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET AUTOCOMMIT = 0; +START TRANSACTION; +-- SET time_zone = "+00:00"; + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- -------------------------------------------------------- + +-- +-- Base de datos: Select `apo_pro_com_april_ten` DB +-- +USE `apo_pro_com_april_ten`; + +COMMIT; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/apc-db/src/apc-db-populate.sql b/apc-db/src/apc-db-populate.sql new file mode 100644 index 0000000..62d1dd8 --- /dev/null +++ b/apc-db/src/apc-db-populate.sql @@ -0,0 +1,515 @@ +-- -------------------------------------------------------- +-- Arrebol Consuntancy +-- version 1.0.1 +-- http://www.arrebolconsultancy.com +-- -------------------------------------------------------- + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET AUTOCOMMIT = 0; +START TRANSACTION; +-- SET time_zone = "+00:00"; + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- -------------------------------------------------------- + +-- +-- Base de datos: Select `apo_pro_com_april_ten` DB +-- +USE `apo_pro_com_april_ten`; +-- -------------------------------------------------------- +-- +-- Volcado de datos para la tabla `APC_ROLE` +-- +INSERT INTO APC_ROLE(id,role_name,active_status,created_by) +VALUES +('56dd386a-88c8-11ea-a6b0-82987069bf80','DIRECTOR GENERAL','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('b9c76e82-88c8-11ea-a6b0-82987069bf80','GERENCIA','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('e7fbf750-88c8-11ea-a6b0-82987069bf80','SUPERVISOR REGIONAL','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('ee39d1aa-88c8-11ea-a6b0-82987069bf80','CERTIFICADOR Y FACILITADOR DE CREDITO','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('3e07c998-a81e-11ea-aa38-77eb3547c70f','JEFE DE ASESORES','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('b5b506f9-3ca4-4ceb-b938-dc58da3f039b','ASESORES DE CREDITO Y COBRANZA','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('e67360db-5953-46ba-9fe1-d71e30ae9b59','JURIDICO','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('b691aea2-3ba5-4e4d-a256-37f749a310bd','JEFE DE PERSONAL PRO FAM','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('44cb12f9-19e6-439a-9cd9-abdf4af38651','EJECUTIVO DE RUTA PRO FAM','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('23259ba5-7a0e-4503-a470-b8bd900635e1','AUXILIAR DE RUTA PRO FAM.','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'); +-- -------------------------------------------------------- +-- +-- Volcado de datos para la tabla `APC_HUMAN_RESOURCE` +-- +INSERT INTO APC_HUMAN_RESOURCE(id,first_name,second_name,last_name,middle_name,birthdate,avatar,human_resource_status, id_role ,created_by) +VALUES +('13c588a6-7d1b-11ea-af3e-28f659da398e','Carlos','Janitzio','Zavala','Lopez',str_to_date('1977-03-02','%Y-%m-%d'),'images/avatar1.png','ENEBLED','b9c76e82-88c8-11ea-a6b0-82987069bf80','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('cb5e8bec-7db7-11ea-9b1f-500320958bf8','Oscar','Armando','Vargas','Cardenas',str_to_date('1977-03-02','%Y-%m-%d'),'images/avatar2.png','ENEBLED','b9c76e82-88c8-11ea-a6b0-82987069bf80','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('ebae5148-7db7-11ea-9b1f-500320958bf8','Ruben','Ruben','Campos','Campos',str_to_date('1977-03-02','%Y-%m-%d'),'images/avatar3.png','ENEBLED','b9c76e82-88c8-11ea-a6b0-82987069bf80','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('c021214a-8bc7-11ea-b45c-c7b846343364','Avatar 1','Avatar 1','Campos','Campos',str_to_date('1977-03-02','%Y-%m-%d'),'https://freisteller24.eu/wp-content/uploads/2017/11/26603674-1200x1200.jpg','ENEBLED','e7fbf750-88c8-11ea-a6b0-82987069bf80','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('d2869da6-8bc7-11ea-b45c-c7b846343364','Avatar 2','Avatar 2','Campos','Campos',str_to_date('1977-03-02','%Y-%m-%d'),'https://freisteller24.eu/wp-content/uploads/2017/11/97783667-1200x1200.jpg','ENEBLED','3e07c998-a81e-11ea-aa38-77eb3547c70f','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('088d7268-8bc7-11ea-b45c-c7b846343364','Avatar 4','Avatar 4','Campos','Campos',str_to_date('1977-03-02','%Y-%m-%d'),'https://freisteller24.eu/wp-content/uploads/2017/10/573675226-1200x1200.jpg','ENEBLED','e7fbf750-88c8-11ea-a6b0-82987069bf80','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('c687acca-8bc7-11ea-b45c-c7b846343364','Avatar 3','Avatar 3','Campos','Campos',str_to_date('1977-03-02','%Y-%m-%d'),'https://freisteller24.eu/wp-content/uploads/2017/10/653323645.jpg','ENEBLED','ee39d1aa-88c8-11ea-a6b0-82987069bf80','0dc7c246-7db8-11ea-9b1f-500320958bf8'); +-- -------------------------------------------------------- +-- +-- Volcado de datos para la tabla `APC_OFFICE` +-- +INSERT INTO APC_OFFICE(id,office_name,office_status,created_by) +VALUES +-- Tepic +('caef3a64-7d1f-11ea-af3e-28f659da398e','TEPIC','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +-- Compostela +('e0f1a2fc-7d1f-11ea-af3e-28f659da398e','COMPOSTELA','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('a7fa34c1-f549-49d9-a262-4d61af50d8c4','PROYECTOS FAMILIARES','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('1223d3a5-092e-49a5-9d94-f05af4720342','JURIDICO','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'); +-- -------------------------------------------------------- +-- +-- Add APC_HUMAN_RESOURCE_BY_OFFICE +-- +INSERT INTO APC_HUMAN_RESOURCE_BY_OFFICE(id,id_human_resource,id_office,application_owner,created_by) +VALUES +-- Janitzio GDL +('e540fd40-8246-11ea-9f9f-a9ab5ed40dc4','13c588a6-7d1b-11ea-af3e-28f659da398e','e0f1a2fc-7d1f-11ea-af3e-28f659da398e','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +-- Oscar Tepic +('14affe8c-8247-11ea-9f9f-a9ab5ed40dc4','cb5e8bec-7db7-11ea-9b1f-500320958bf8','caef3a64-7d1f-11ea-af3e-28f659da398e','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +-- Ruben Tepic +('f41be05a-8246-11ea-9f9f-a9ab5ed40dc4','ebae5148-7db7-11ea-9b1f-500320958bf8','caef3a64-7d1f-11ea-af3e-28f659da398e','APP_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +-- Ruben GDL +('0a8cf342-8247-11ea-9f9f-a9ab5ed40dc4','ebae5148-7db7-11ea-9b1f-500320958bf8','e0f1a2fc-7d1f-11ea-af3e-28f659da398e','APP_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +-- Avatar 1 Tepic +('0fc73388-8bc8-11ea-b45c-c7b846343364','c021214a-8bc7-11ea-b45c-c7b846343364','caef3a64-7d1f-11ea-af3e-28f659da398e','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +-- Avatar 2 Tepic +('2412e3d2-8bc8-11ea-b45c-c7b846343364','d2869da6-8bc7-11ea-b45c-c7b846343364','caef3a64-7d1f-11ea-af3e-28f659da398e','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +-- Avatar 4 GDL +('32ea4a62-8bc8-11ea-b45c-c7b846343364','088d7268-8bc7-11ea-b45c-c7b846343364','e0f1a2fc-7d1f-11ea-af3e-28f659da398e','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +-- Avatar 3 Tepic +('49662edc-8bc8-11ea-b45c-c7b846343364','c687acca-8bc7-11ea-b45c-c7b846343364','caef3a64-7d1f-11ea-af3e-28f659da398e','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8'); +-- -------------------------------------------------------- +-- +-- Volcado de datos para la tabla `APC_USER` +-- +INSERT INTO APC_USER(id,id_human_resource,user_name,pwd,user_type,user_status,application_owner,created_by,certifier) +VALUES +-- Janitzio WEB +('5751074e-7d1b-11ea-af3e-28f659da398e','13c588a6-7d1b-11ea-af3e-28f659da398e','direccion','8478A4A2819E9C06AB738123C5D04B4FA1AA67548EBA64EAD40B635EA8AA8D5B','WEB','ENEBLED','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8','DISABLED'), +-- Oscar WEB +('092a95d8-7db8-11ea-9b1f-500320958bf8','cb5e8bec-7db7-11ea-9b1f-500320958bf8','direccion','8478A4A2819E9C06AB738123C5D04B4FA1AA67548EBA64EAD40B635EA8AA8D5B','WEB','ENEBLED','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8','DISABLED'), +-- Ruben WEB +('0dc7c246-7db8-11ea-9b1f-500320958bf8','ebae5148-7db7-11ea-9b1f-500320958bf8','ejecutivo','8478A4A2819E9C06AB738123C5D04B4FA1AA67548EBA64EAD40B635EA8AA8D5B','WEB','ENEBLED','APP_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8','DISABLED'), +-- Avatar 1 MOBILE +('67b3081e-8bc9-11ea-b45c-c7b846343364','c021214a-8bc7-11ea-b45c-c7b846343364','avatar1','8478A4A2819E9C06AB738123C5D04B4FA1AA67548EBA64EAD40B635EA8AA8D5B','MOBILE','ENEBLED','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8','DISABLED'), +-- Avatar 2 MOBILE +('52cbc85a-8bc9-11ea-b45c-c7b846343364','d2869da6-8bc7-11ea-b45c-c7b846343364','avatar2','8478A4A2819E9C06AB738123C5D04B4FA1AA67548EBA64EAD40B635EA8AA8D5B','MOBILE','ENEBLED','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8','ENEBLED'), +-- Avatar 4 MOBILE +('3870767c-8bc9-11ea-b45c-c7b846343364','088d7268-8bc7-11ea-b45c-c7b846343364','avatar4','8478A4A2819E9C06AB738123C5D04B4FA1AA67548EBA64EAD40B635EA8AA8D5B','MOBILE','ENEBLED','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8','DISABLED'), +-- Avatar 3 MOBILE +('22fb81e2-8bc9-11ea-b45c-c7b846343364','c687acca-8bc7-11ea-b45c-c7b846343364','avatar3','8478A4A2819E9C06AB738123C5D04B4FA1AA67548EBA64EAD40B635EA8AA8D5B','MOBILE','ENEBLED','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8','DISABLED'); +-- -------------------------------------------------------- +-- +-- Add APC_USER_BY_OFFICE +-- +INSERT INTO APC_USER_BY_OFFICE(id,id_user,id_office,user_by_office_status,application_owner,created_by) +VALUES +-- Janitzio GDL +('a742dfe8-7d20-11ea-af3e-28f659da398e','5751074e-7d1b-11ea-af3e-28f659da398e','e0f1a2fc-7d1f-11ea-af3e-28f659da398e','ENEBLED','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +-- Oscar Tepic +('d855f570-7dbb-11ea-9b1f-500320958bf8','092a95d8-7db8-11ea-9b1f-500320958bf8','caef3a64-7d1f-11ea-af3e-28f659da398e','ENEBLED','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +-- Ruben Tepic +('eca3f824-7dbb-11ea-9b1f-500320958bf8','0dc7c246-7db8-11ea-9b1f-500320958bf8','caef3a64-7d1f-11ea-af3e-28f659da398e','ENEBLED','APP_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +-- Ruben GDL +('e5a44222-7dbb-11ea-9b1f-500320958bf8','0dc7c246-7db8-11ea-9b1f-500320958bf8','e0f1a2fc-7d1f-11ea-af3e-28f659da398e','ENEBLED','APP_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +-- Avatar 1 Tepic +('37835b02-8bca-11ea-b45c-c7b846343364','67b3081e-8bc9-11ea-b45c-c7b846343364','caef3a64-7d1f-11ea-af3e-28f659da398e','ENEBLED','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +-- Avatar 2 Tepic +('5e4c992e-8bca-11ea-b45c-c7b846343364','52cbc85a-8bc9-11ea-b45c-c7b846343364','caef3a64-7d1f-11ea-af3e-28f659da398e','ENEBLED','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +-- Avatar 4 GDL +('efffe026-8bcd-11ea-b45c-c7b846343364','3870767c-8bc9-11ea-b45c-c7b846343364','e0f1a2fc-7d1f-11ea-af3e-28f659da398e','ENEBLED','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +-- Avatar 3 Tepic +('f6dfcbc2-8bcd-11ea-b45c-c7b846343364','22fb81e2-8bc9-11ea-b45c-c7b846343364','caef3a64-7d1f-11ea-af3e-28f659da398e','ENEBLED','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8'); +-- -------------------------------------------------------- +-- +-- Add APC_PERMISSION +-- +INSERT INTO `APC_PERMISSION` (`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , `permission_type`, `permission_status`,`created_by`) +VALUES +('7a6cbba2-7dba-11ea-9b1f-500320958bf8','public.access', 'public.access.description', 'public.access.path', 0, 10,'PUBLIC', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('001055b6-804f-11ea-bd33-54754d23c678','system.employee', 'system.employee.description', 'system.employee.path', 10, 10,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('7f116c66-7dba-11ea-9b1f-500320958bf8','system.user.create', 'system.user.create.description', 'system.user.create.path', 10, 20,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('87d3d32a-7dba-11ea-9b1f-500320958bf8','system.user.admin', 'system.user.admin.description', 'system.user.admin.path', 10, 30,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('8c54a1f4-7dba-11ea-9b1f-500320958bf8','system.user.access', 'system.user.access.description', 'system.user.access.path', 10, 40,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('3697f4e3-6a7d-46df-9618-60c632e3e472','catalog.role', 'catalog.role.description', 'catalog.role.path', 10, 50,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('572bccc2-4848-4dad-b63c-ddf6f29c14f7','catalog.typeLoan', 'catalog.typeLoan.description', 'catalog.typeLoan.path', 10, 60,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('7f139dd9-a1fb-42a4-866c-e70b4d84587a','catalog.route', 'catalog.route.description', 'catalog.route.path', 10, 70,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('58ef9e12-13b3-4a7d-a5ad-fd0db3557d3c','admin.customer', 'admin.customer.description', 'admin.customer.path', 10, 80,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('45f2cd84-98df-4991-be77-3f22dfa7d4b2','admin.endorsement', 'admin.endorsement.description', 'admin.endorsement.path', 10, 90,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('e492bbf5-b25e-4ff2-b126-dc92a733e921','admin.loan', 'admin.loan.description', 'admin.loan.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('fee9d1d9-3961-4dfa-a8e2-56eccae1e347','admin.transfer', 'admin.transfer.description', 'admin.transfer.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('7a8d71b0-1d2b-43ae-b7f7-fd048929ae8e','admin.moneyDaily', 'admin.moneyDaily.description', 'admin.moneyDaily.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('55a79bce-9466-44f8-8a13-7b69f176b80b','admin.closingDay', 'admin.closingDay.description', 'admin.closingDay.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('04d9cf0f-b8e9-46fb-9b77-b301dec9c533','admin.otherExpense', 'admin.otherExpense.description', 'admin.otherExpense.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('f01aeaac-8b18-4eb5-95ae-d02ae5a0716d','admin.goal', 'admin.goal.description', 'admin.goal.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('6c2ec1ce-9163-42b4-bbf1-8448e3894d55','admin.bonus', 'admin.bonus.description', 'admin.bonus.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('9067f64e-b2eb-4361-9c9b-c6dccc29e67f','admin.advance', 'admin.advance.description', 'admin.advance.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('de5d48ac-2242-4937-95e2-1140b987b8c2','system.office', 'system.office.description', 'system.office.path', 10, 110,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'); +-- Permission by role +INSERT INTO `APC_PERMISSION` (`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , `permission_type`, `permission_status`,`created_by`, `parent_name`) +VALUES +-- employee +('dcfafbee-82a1-11ea-a6b6-200fe86028a8','system.employee.add', 'system.employee.add.description', 'system.employee.add.path', 10, 11,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.employee'), +('e2ea92a8-82a1-11ea-a6b6-200fe86028a8','system.employee.enebled', 'system.employee.enebled.description', 'system.employee.enebled.path', 10, 12,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.employee'), +('eb530786-82a1-11ea-a6b6-200fe86028a8','system.employee.disabled', 'system.employee.disabled.description', 'system.employee.disabled.path', 10, 13,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.employee'), +('f2245ed4-82a1-11ea-a6b6-200fe86028a8','system.employee.deleted', 'system.employee.deleted.description', 'system.employee.deleted.path', 10, 14,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.employee'), +('fec3b7a2-82a1-11ea-a6b6-200fe86028a8','system.employee.updated', 'system.employee.updated.description', 'system.employee.updated.path', 10, 15,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.employee'), +-- user create +('065b2432-82a2-11ea-a6b6-200fe86028a8','system.user.create.permission', 'system.user.create.permission.description', 'system.user.create.permission.path', 10, 21,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.user.create'), +('10d740d0-82a2-11ea-a6b6-200fe86028a8','system.user.admin.enebled', 'system.user.admin.enebled.description', 'system.user.admin.enebled.path', 10, 31,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.user.admin'), +('36b619fe-82fa-11ea-a6b6-200fe86028a8','system.user.admin.disabled', 'system.user.admin.disabled.description', 'system.user.admin.disabled.path', 10, 32,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.user.admin'), +('2fcf2806-82fa-11ea-a6b6-200fe86028a8','system.user.admin.deleted', 'system.user.admin.deleted.description', 'system.user.admin.deleted.path', 10, 33,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.user.admin'), +('282079e8-82fa-11ea-a6b6-200fe86028a8','system.user.admin.updated', 'system.user.admin.updated.description', 'system.user.admin.updated.path', 10, 34,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.user.admin'), +('176d3744-82fa-11ea-a6b6-200fe86028a8','system.user.admin.pwd', 'system.user.admin.pwd.description', 'system.user.admin.pwd.path', 10, 35,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.user.admin'), +('1fecd260-82a2-11ea-a6b6-200fe86028a8','system.user.admin.avatar', 'system.user.admin.avatar.description', 'system.user.admin.avatar.path', 10, 36,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.user.admin'), +-- office +('c5ef3b18-6cc2-4d62-88ba-41304c6ae9c8','system.office.add', 'system.office.add.description', 'system.office.add.path', 10, 111,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.user.admin'), +('037ea752-c33f-4bfe-ae84-da867de0d7cd','system.office.updated', 'system.office.updated.description', 'system.office.updated.path', 10, 112,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.user.admin'), +('65399669-44da-4e17-9217-c6b89c1f0a61','system.office.deleted', 'system.office.deleted.description', 'system.office.deleted.path', 10, 113,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.user.admin'); + +INSERT INTO `APC_PERMISSION` (`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , `permission_type`, `permission_status`,`created_by`, `parent_name`) +VALUES +-- role +('96f78612-1e06-47cf-a282-f4f1a14f8e0d','catalog.role.add', 'catalog.role.add.description', 'catalog.role.add.path', 10, 51,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','catalog.role'), +('1c8175f5-dcde-4611-b2d7-9b79a68b3f0c','catalog.role.updated', 'catalog.role.updated.description', 'catalog.role.updated.path', 10, 52,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','catalog.role'), +('4c11f842-6c29-4d18-a58c-595df41afaa0','catalog.role.deleted', 'catalog.role.deleted.description', 'catalog.role.deleted.path', 10, 53,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','catalog.role'), +-- type loan +('29445731-3e36-427b-a14a-ee53b9699582','catalog.typeLoan.add', 'catalog.typeLoan.add.description', 'catalog.typeLoan.add.path', 10, 61,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','catalog.typeLoan'), +('39482063-a243-490b-bb78-0c0599bce30e','catalog.typeLoan.updated', 'catalog.typeLoan.updated.description', 'catalog.typeLoan.updated.path', 10, 62,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','catalog.typeLoan'), +('c573acd1-cb14-4464-8bbc-b962dbb0bc62','catalog.typeLoan.deleted', 'catalog.typeLoan.deleted.description', 'catalog.typeLoan.deleted.path', 10, 63,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','catalog.typeLoan'), +-- route +('ab812966-4df0-4462-a9e2-a2c364cf97f1','catalog.route.add', 'catalog.route.add.description', 'catalog.route.add.path', 10, 71,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','catalog.route'), +('886ab08d-9494-4ae4-8635-4a6b4363cdf7','catalog.route.updated', 'catalog.route.updated.description', 'catalog.route.updated.path', 10, 72,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','catalog.route'), +('629c0be7-b3a9-49f5-9c20-3f6681a4b6d3','catalog.route.deleted', 'catalog.route.deleted.description', 'catalog.route.deleted.path', 10, 73,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','catalog.route'); + +INSERT INTO `APC_PERMISSION` (`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , `permission_type`, `permission_status`,`created_by`, `parent_name`) +VALUES +-- customer +('65928cb3-f463-4266-9d29-bc29c560c891','admin.customer.add', 'admin.customer.add.description', 'admin.customer.add.path', 10, 81,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.customer'), +('b209327b-f568-4783-8da1-7d45b88fd65b','admin.customer.updated', 'admin.customer.updated.description', 'admin.customer.updated.path', 10, 82,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.customer'), +('6aeb69ff-bb96-4ab9-9d07-8a3b237cfc9e','admin.customer.deleted', 'admin.customer.deleted.description', 'admin.customer.deleted.path', 10, 83,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.customer'), +-- endorsement +('8bee00dc-199f-43c5-8e83-5d670502552b','admin.endorsement.add', 'admin.endorsement.add.description', 'admin.endorsement.add.path', 10, 91,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.endorsement'), +('d16b9b0b-7c4d-456a-a257-ed67586226b0','admin.endorsement.updated', 'admin.endorsement.updated.description', 'admin.endorsement.updated.path', 10, 92,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.endorsement'), +('b57da38c-ba69-4d1e-944f-0dd1f11d816f','admin.endorsement.deleted', 'admin.endorsement.deleted.description', 'admin.endorsement.deleted.path', 10, 93,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.endorsement'), +-- loan +('cca7b7e8-2d41-471b-bb81-c4ca518294dc','admin.loan.add', 'admin.loan.add.description', 'admin.loan.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.loan'), +('55fd99c6-8110-4604-901b-0ed95ca31132','admin.loan.updated', 'admin.loan.updated.description', 'admin.loan.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.loan'), +('1e98037f-1950-417e-be11-39b51203c409','admin.loan.deleted', 'admin.loan.deleted.description', 'admin.loan.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.loan'), +-- transfer +('0d582b8a-2820-4a58-95ca-37484daa8304','admin.transfer.add', 'admin.transfer.add.description', 'admin.transfer.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.transfer'), +('f8bb6db8-acd1-4c5e-845a-ef62f16c7b2d','admin.transfer.updated', 'admin.transfer.updated.description', 'admin.transfer.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.transfer'), +('ae782c52-1e20-40a3-88cf-28f2fb7d7583','admin.transfer.deleted', 'admin.transfer.deleted.description', 'admin.transfer.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.transfer'), +-- money daily +('d14f5077-ecd9-467e-b274-8674e1955667','admin.moneyDaily.add', 'admin.moneyDaily.add.description', 'admin.moneyDaily.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.moneyDaily'), +('a8f492bf-0a8b-4a4e-9d61-0de2b7153334','admin.moneyDaily.updated', 'admin.moneyDaily.updated.description', 'admin.moneyDaily.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.moneyDaily'), +('285860be-92fd-4c7a-bac2-eec1f530d6d9','admin.moneyDaily.deleted', 'admin.moneyDaily.deleted.description', 'admin.moneyDaily.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.moneyDaily'), +-- closing day +('8ab4bea2-3e00-4474-bf94-e01f1ed6b52c','admin.closingDay.add', 'admin.closingDay.add.description', 'admin.closingDay.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.closingDay'), +('89d55a97-8bc4-4430-8e8d-ce8d15851695','admin.closingDay.updated', 'admin.closingDay.updated.description', 'admin.closingDay.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.closingDay'), +('4e8ab1c5-1889-45b3-8550-101f300b2e70','admin.closingDay.deleted', 'admin.closingDay.deleted.description', 'admin.closingDay.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.closingDay'), +-- other expense +('f8b6306b-166d-48b8-8626-0e8a92970c17','admin.otherExpense.add', 'admin.otherExpense.add.description', 'admin.otherExpense.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.otherExpense'), +('2dbc0faa-2cd0-4490-a5af-e6a8eb4eb132','admin.otherExpense.updated', 'admin.otherExpense.updated.description', 'admin.otherExpense.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.otherExpense'), +('aa7c8eca-2117-45a0-b7ce-6d78599b0a66','admin.otherExpense.deleted', 'admin.otherExpense.deleted.description', 'admin.otherExpense.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.otherExpense'), +-- goal +('2e3e6bc1-6baf-4fde-9cc2-c60cd4c1d2f3','admin.goal.add', 'admin.goal.add.description', 'admin.goal.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.goal'), +('6add466f-4a1d-464a-a96c-2aecc67087ab','admin.goal.updated', 'admin.goal.updated.description', 'admin.goal.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.goal'), +('cd3306f9-b713-4995-a8bf-7585e42c2ca0','admin.goal.deleted', 'admin.goal.deleted.description', 'admin.goal.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.goal'), +-- bonus +('71e44e75-91e8-4a55-8d36-d24e2a645f10','admin.bonus.add', 'admin.bonus.add.description', 'admin.bonus.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.bonus'), +('14b6bf11-cc3b-41d9-b589-7c2aebc5dbeb','admin.bonus.updated', 'admin.bonus.updated.description', 'admin.bonus.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.bonus'), +('9f5d7c8d-2115-4114-82a6-5b7329c3efc7','admin.bonus.deleted', 'admin.bonus.deleted.description', 'admin.bonus.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.bonus'), +-- advance +('961193c0-754e-4444-b281-7c62aacb3987','admin.advance.add', 'admin.advance.add.description', 'admin.advance.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.advance'), +('0fa64abd-3e2a-4a42-96cf-1672bdd51086','admin.advance.updated', 'admin.advance.updated.description', 'admin.advance.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.advance'), +('6ee26a46-919b-4400-8837-31762892fa97','admin.advance.deleted', 'admin.advance.deleted.description', 'admin.advance.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.advance'); + +-- Entradas de caja general +INSERT INTO `APC_PERMISSION` (`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , `permission_type`, `permission_status`,`created_by`) +VALUES +('1bd221ee-bfd2-49e1-899a-8456cc05e559','admin.expenseCompanyIn', 'admin.expenseCompanyIn.description', 'admin.expenseCompanyIn.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'); + +INSERT INTO `APC_PERMISSION` (`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , `permission_type`, `permission_status`,`created_by`,`parent_name`) +VALUES +('b855fbbc-e25a-4051-8789-9ec9af62ce3a','admin.expenseCompanyIn.add', 'admin.expenseCompanyIn.add.description', 'admin.expenseCompanyIn.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.expenseCompanyIn'), +('8165c4e7-eb55-4eb7-bb07-98e14234ad8b','admin.expenseCompanyIn.updated', 'admin.expenseCompanyIn.updated.description', 'admin.expenseCompanyIn.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.expenseCompanyIn'), +('292e5385-1368-4b8d-895d-638181e05e0d','admin.expenseCompanyIn.deleted', 'admin.expenseCompanyIn.deleted.description', 'admin.expenseCompanyIn.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.expenseCompanyIn'); + +-- Salidas de caja general +INSERT INTO `APC_PERMISSION` (`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , `permission_type`, `permission_status`,`created_by`) +VALUES +('a5301073-05f2-4d80-bed9-e39e0739ee95','admin.expenseCompanyOut', 'admin.expenseCompanyOut.description', 'admin.expenseCompanyOut.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'); + +INSERT INTO `APC_PERMISSION` (`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , `permission_type`, `permission_status`,`created_by`,`parent_name`) +VALUES +('8d4985e8-c3e1-4534-9ebc-06d2f708398c','admin.expenseCompanyOut.add', 'admin.expenseCompanyOut.add.description', 'admin.expenseCompanyOut.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.expenseCompanyOut'), +('3d812774-98ec-4157-ab62-5a60a69f6ddd','admin.expenseCompanyOut.updated', 'admin.expenseCompanyOut.updated.description', 'admin.expenseCompanyOut.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.expenseCompanyOut'), +('c59fd63d-7658-40e9-82be-c2a75221e200','admin.expenseCompanyOut.deleted', 'admin.expenseCompanyOut.deleted.description', 'admin.expenseCompanyOut.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.expenseCompanyOut'); + +-- Cuadre de caja general +INSERT INTO `APC_PERMISSION` (`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , `permission_type`, `permission_status`,`created_by`) +VALUES +('a18072cb-ff92-4763-977c-c604828ff4c7','admin.stableGeneralBox', 'admin.stableGeneralBox.description', 'admin.stableGeneralBox.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'); + +INSERT INTO `APC_PERMISSION` (`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , `permission_type`, `permission_status`,`created_by`,`parent_name`) +VALUES +('4273bd52-7435-483b-a185-d6686c8fb3e7','admin.stableGeneralBox.add', 'admin.stableGeneralBox.add.description', 'admin.stableGeneralBox.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.stableGeneralBox'), +('2cceb95d-6d3c-4c67-8c9f-cedc75d4e293','admin.stableGeneralBox.updated', 'admin.stableGeneralBox.updated.description', 'admin.stableGeneralBox.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.stableGeneralBox'), +('c46ebab5-904c-4cc1-8c77-49a9fded0fba','admin.stableGeneralBox.deleted', 'admin.stableGeneralBox.deleted.description', 'admin.stableGeneralBox.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.stableGeneralBox'); +-- Chages loans between users +INSERT INTO `APC_PERMISSION` +(`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , + `permission_type`, `permission_status`,`created_by`, `parent_name`) +VALUES +('073fba18-2a8e-11eb-9de2-a30e5a9c0028','admin.loan.change.owner', 'admin.loan.change.owner.description', 'admin.loan.change.owner.path', 10, 110,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.loan'), +('50942348-2a8e-11eb-9de2-a30e5a9c0028','admin.loan.change.owner.update', 'admin.loan.change.owner.update.description', 'admin.loan.change.owner.update.path', 10, 111,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.loan'); + +INSERT INTO APC_USER_BY_OFFICE_HAS_PERMISSION (id_user_by_office,id_permission,created_by) +SELECT + -- Janitzio GDL + 'a742dfe8-7d20-11ea-af3e-28f659da398e', + id, + '0dc7c246-7db8-11ea-9b1f-500320958bf8' +FROM APC_PERMISSION; + +INSERT INTO APC_USER_BY_OFFICE_HAS_PERMISSION (id_user_by_office,id_permission,created_by) +SELECT + -- Oscar Tepic + 'd855f570-7dbb-11ea-9b1f-500320958bf8', + id, + '0dc7c246-7db8-11ea-9b1f-500320958bf8' +FROM APC_PERMISSION; + +INSERT INTO APC_USER_BY_OFFICE_HAS_PERMISSION (id_user_by_office,id_permission,created_by) +SELECT + -- Ruben Tepic + 'eca3f824-7dbb-11ea-9b1f-500320958bf8', + id, + '0dc7c246-7db8-11ea-9b1f-500320958bf8' +FROM APC_PERMISSION; + + +INSERT INTO APC_USER_BY_OFFICE_HAS_PERMISSION (id_user_by_office,id_permission,created_by) +SELECT + -- Ruben GDL + 'e5a44222-7dbb-11ea-9b1f-500320958bf8', + id, + '0dc7c246-7db8-11ea-9b1f-500320958bf8' +FROM APC_PERMISSION; + +INSERT INTO APC_USER_MOBILE_PREFERECE(id,id_user,preference_name,preference_value,created_by,created_on) +VALUES +-- Avatar 1 +('235e819e-8bbe-11ea-8c0e-beeb61238d59','67b3081e-8bc9-11ea-b45c-c7b846343364','ORDER_LIST','ALPHABETICALLY','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +-- Avatar 2 +('e914e614-8bd0-11ea-b45c-c7b846343364','52cbc85a-8bc9-11ea-b45c-c7b846343364','ORDER_LIST','ALPHABETICALLY','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +-- Avatar 4 +('ef48f296-8bd0-11ea-b45c-c7b846343364','3870767c-8bc9-11ea-b45c-c7b846343364','ORDER_LIST','ALPHABETICALLY','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +-- Avatar 3 +('f49797de-8bd0-11ea-b45c-c7b846343364','22fb81e2-8bc9-11ea-b45c-c7b846343364','ORDER_LIST','ALPHABETICALLY','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()); +-- ------------------------- +-- Logica de negocio de los +-- pagos de APC +-- ------------------------- +-- FALTA CREAR RUTA +INSERT INTO APC_ROUTE(id,id_office,route_name,active_status,created_by, created_on) +VALUES +-- Tepic +('51b207a2-8e19-11ea-b65e-4e1376171215','caef3a64-7d1f-11ea-af3e-28f659da398e','Ruta 1 Tepic','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('55baf3ae-8e19-11ea-b65e-4e1376171215','caef3a64-7d1f-11ea-af3e-28f659da398e','Ruta 2 Tepic','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('5a329e3c-8e19-11ea-b65e-4e1376171215','caef3a64-7d1f-11ea-af3e-28f659da398e','Ruta 3 Tepic','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +-- GDL +('5e9a24e0-8e19-11ea-b65e-4e1376171215','e0f1a2fc-7d1f-11ea-af3e-28f659da398e','Ruta 1 GDL','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()); +-- FALTA MAPEAR RUTA CON USUARIO + +INSERT INTO APC_PEOPLE(id,first_name,second_name,last_name, middle_name, phone_home,address_home, phone_business, address_business, company_name, people_type, active_status,id_office,id_route,created_by,created_on,thumbnail) +VALUES +-- Clientes tepic +('83d2cd30-8e1d-11ea-b65e-4e1376171215','Diego','Segundo 1','Rivera','Materno 1','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Tepic Nayarit','22-22-22-22','Negocio Calle #Num. col. Colonia, Tepic Nayarit','Nombre Negocio 01','CUSTOMER','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/653323645.jpg'), +('c32a578c-8e1d-11ea-b65e-4e1376171215','David','Segundo 2','Alfaro','Siqueiros','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Tepic Nayarit','22-22-22-22','Negocio Calle #Num. col. Colonia, Tepic Nayarit','Nombre Negocio 01','CUSTOMER','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/11/blogbeitrag-haare-2-1024x713.jpg'), +('ca7fbd56-8e1d-11ea-b65e-4e1376171215','Jose','Segundo 3','Clemente','Orozco','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Tepic Nayarit','22-22-22-22','Negocio Calle #Num. col. Colonia, Tepic Nayarit','Nombre Negocio 01','CUSTOMER','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/666164992-1200x1200.jpg'), +('d0e60fec-8e1d-11ea-b65e-4e1376171215','Aurora','Segundo 4','Reyes','Materno 4','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Tepic Nayarit','22-22-22-22','Negocio Calle #Num. col. Colonia, Tepic Nayarit','Nombre Negocio 01','CUSTOMER','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/653323645.jpg'), +('d9763d1c-8e1d-11ea-b65e-4e1376171215','Jorge','Segundo 5','Gonzalez','Camarena','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Tepic Nayarit','22-22-22-22','Negocio Calle #Num. col. Colonia, Tepic Nayarit','Nombre Negocio 01','CUSTOMER','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/104313029.jpg'), +('e32dd9fa-8e1d-11ea-b65e-4e1376171215','Juan','Segundo 6','O Gorman','Materno 6','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Tepic Nayarit','22-22-22-22','Negocio Calle #Num. col. Colonia, Tepic Nayarit','Nombre Negocio 01','CUSTOMER','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/666164992-1200x1200.jpg'), +('e8eafa6c-8e1d-11ea-b65e-4e1376171215','Jose','Luis','Cuevas','Materno 7','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Tepic Nayarit','22-22-22-22','Negocio Calle #Num. col. Colonia, Tepic Nayarit','Nombre Negocio 01','CUSTOMER','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/653323645.jpg'), +('eecbe234-8e1d-11ea-b65e-4e1376171215','Pedro','Segundo 8','Nel','Gomez','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Tepic Nayarit','22-22-22-22','Negocio Calle #Num. col. Colonia, Tepic Nayarit','Nombre Negocio 01','CUSTOMER','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/11/blogbeitrag-haare-2-1024x713.jpg'), +('f45155a4-8e1d-11ea-b65e-4e1376171215','Fernando','Segundo 9','Leal','Materno 9','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Tepic Nayarit','22-22-22-22','Negocio Calle #Num. col. Colonia, Tepic Nayarit','Nombre Negocio 01','CUSTOMER','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/229554145-1200x1200.jpg'), +('faa43aa2-8e1d-11ea-b65e-4e1376171215','Mario','Segundo 10','Orozco','Rivera','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Tepic Nayarit','22-22-22-22','Negocio Calle #Num. col. Colonia, Tepic Nayarit','Nombre Negocio 01','CUSTOMER','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','55baf3ae-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/229554145-1200x1200.jpg'), +('fffd273e-8e1d-11ea-b65e-4e1376171215','Saturnino','Segundo 11','Herran','Materno 11','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Tepic Nayarit','22-22-22-22','Negocio Calle #Num. col. Colonia, Tepic Nayarit','Nombre Negocio 01','CUSTOMER','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','55baf3ae-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/666164992-1200x1200.jpg'), +('05d35002-8e1e-11ea-b65e-4e1376171215','Fermin','Segundo 12','Revueltas','Materno 12','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Tepic Nayarit','22-22-22-22','Negocio Calle #Num. col. Colonia, Tepic Nayarit','Nombre Negocio 01','CUSTOMER','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','55baf3ae-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/653323645.jpg'), +('0b27081e-8e1e-11ea-b65e-4e1376171215','Zabel','Segundo 13','Merida','Materno 13','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Tepic Nayarit','22-22-22-22','Negocio Calle #Num. col. Colonia, Tepic Nayarit','Nombre Negocio 01','CUSTOMER','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','55baf3ae-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/11/blogbeitrag-haare-2-1024x713.jpg'), +('109b9b84-8e1e-11ea-b65e-4e1376171215','Luis','Segundo 14','Nishizawa','Flores','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Tepic Nayarit','22-22-22-22','Negocio Calle #Num. col. Colonia, Tepic Nayarit','Nombre Negocio 01','CUSTOMER','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','55baf3ae-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/104313029.jpg'), +('15151320-8e1e-11ea-b65e-4e1376171215','Jose','Segundo 15','Chavez','Morado','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Tepic Nayarit','22-22-22-22','Negocio Calle #Num. col. Colonia, Tepic Nayarit','Nombre Negocio 01','CUSTOMER','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','55baf3ae-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/229554145-1200x1200.jpg'), +('1f292d38-8e1e-11ea-b65e-4e1376171215','Alfredo','Segundo 16','Ramos','Martinez','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Tepic Nayarit','22-22-22-22','Negocio Calle #Num. col. Colonia, Tepic Nayarit','Nombre Negocio 01','CUSTOMER','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','5a329e3c-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/666164992-1200x1200.jpg'), +('25bf9ccc-8e1e-11ea-b65e-4e1376171215','Desiderio','Segundo 17','Hernandez','Xochitiotzin','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Tepic Nayarit','22-22-22-22','Negocio Calle #Num. col. Colonia, Tepic Nayarit','Nombre Negocio 01','CUSTOMER','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','5a329e3c-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/653323645.jpg'), +('2b502d50-8e1e-11ea-b65e-4e1376171215','Rina','Segundo 18','Lazo','Materno 18','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Tepic Nayarit','22-22-22-22','Negocio Calle #Num. col. Colonia, Tepic Nayarit','Nombre Negocio 01','CUSTOMER','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','5a329e3c-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/11/blogbeitrag-haare-2-1024x713.jpg'), +('305aee3e-8e1e-11ea-b65e-4e1376171215','Ramon','Segundo 19','Alva','de la Canal','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Tepic Nayarit','22-22-22-22','Negocio Calle #Num. col. Colonia, Tepic Nayarit','Nombre Negocio 01','CUSTOMER','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','5a329e3c-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/104313029.jpg'), +('394ffa70-8e1e-11ea-b65e-4e1376171215','Xavier','Segundo 20','Guerrero','Materno 20','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Tepic Nayarit','22-22-22-22','Negocio Calle #Num. col. Colonia, Tepic Nayarit','Nombre Negocio 01','CUSTOMER','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','5a329e3c-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/666164992-1200x1200.jpg'), +-- Clientes GDL +('3d8c43e6-8e1e-11ea-b65e-4e1376171215','Juan','Segundo 21','Rulfo','Materno 21','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Guadalajara Jalisco','22-22-22-22','Negocio Calle #Num. col. Colonia, Guadalajara Jalisco','Nombre Negocio 01','CUSTOMER','ENEBLED','e0f1a2fc-7d1f-11ea-af3e-28f659da398e','5e9a24e0-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/653323645.jpg'), +('428c5b88-8e1e-11ea-b65e-4e1376171215','Octavio','Segundo 22','Paz','Materno 22','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Guadalajara Jalisco','22-22-22-22','Negocio Calle #Num. col. Colonia, Guadalajara Jalisco','Nombre Negocio 01','CUSTOMER','ENEBLED','e0f1a2fc-7d1f-11ea-af3e-28f659da398e','5e9a24e0-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/11/blogbeitrag-haare-2-1024x713.jpg'), +('46f6f070-8e1e-11ea-b65e-4e1376171215','Carlos','Segundo 23','Fuentes','Materno 23','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Guadalajara Jalisco','22-22-22-22','Negocio Calle #Num. col. Colonia, Guadalajara Jalisco','Nombre Negocio 01','CUSTOMER','ENEBLED','e0f1a2fc-7d1f-11ea-af3e-28f659da398e','5e9a24e0-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/104313029.jpg'), +('4adc2c28-8e1e-11ea-b65e-4e1376171215','Juan','Jose','Arreola','Materno 24','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Guadalajara Jalisco','22-22-22-22','Negocio Calle #Num. col. Colonia, Guadalajara Jalisco','Nombre Negocio 01','CUSTOMER','ENEBLED','e0f1a2fc-7d1f-11ea-af3e-28f659da398e','5e9a24e0-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/229554145-1200x1200.jpg'), +('4ed391e0-8e1e-11ea-b65e-4e1376171215','Rosario','Segundo 25','Castellanos','Materno 25','11-11-11-11-11','Cliente Casa Calle #Num. col. Colonia, Guadalajara Jalisco','22-22-22-22','Negocio Calle #Num. col. Colonia, Guadalajara Jalisco','Nombre Negocio 01','CUSTOMER','ENEBLED','e0f1a2fc-7d1f-11ea-af3e-28f659da398e','5e9a24e0-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/666164992-1200x1200.jpg'); +INSERT INTO APC_PEOPLE(id,first_name,second_name,last_name, middle_name, phone_home,address_home, people_type, active_status,id_office,id_route,created_by,created_on,thumbnail) +VALUES +-- Avales tepic +('76a2650c-8e1e-11ea-b65e-4e1376171215','Frida','Segundo 1','Kahlo','Materno 1','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Tepic Nayarit','ENDORSEMENT','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/653323645.jpg'), +('7ce4fdc6-8e1e-11ea-b65e-4e1376171215','Enrique','Segundo 2','Carbajal','Materno 2','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Tepic Nayarit','ENDORSEMENT','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/104313029.jpg'), +('818a97aa-8e1e-11ea-b65e-4e1376171215','Juan','Segundo 3','Soriano','Materno 3','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Tepic Nayarit','ENDORSEMENT','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/666164992-1200x1200.jpg'), +('85d8f694-8e1e-11ea-b65e-4e1376171215','Jose','Segundo 4','Marin','Materno 4','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Tepic Nayarit','ENDORSEMENT','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/229554145-1200x1200.jpg'), +('8a4ad7a6-8e1e-11ea-b65e-4e1376171215','Vicente','Segundo 5','Rojo','Almazan','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Tepic Nayarit','ENDORSEMENT','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/653323645.jpg'), +('91328532-8e1e-11ea-b65e-4e1376171215','Luis','Segundo 6','Ortiz','Monasterio','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Tepic Nayarit','ENDORSEMENT','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/104313029.jpg'), +('96c9319e-8e1e-11ea-b65e-4e1376171215','Pedro','Segundo 7','Coronel','Materno 7','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Tepic Nayarit','ENDORSEMENT','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/666164992-1200x1200.jpg'), +('9c481676-8e1e-11ea-b65e-4e1376171215','Miriam','Segundo 8','Medrez','Materno 8','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Tepic Nayarit','ENDORSEMENT','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/11/blogbeitrag-haare-2-1024x713.jpg'), +('aca49c06-8e1e-11ea-b65e-4e1376171215','Maria','Elena','Delgado','Materno 9','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Tepic Nayarit','ENDORSEMENT','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/653323645.jpg'), +('b0361e44-8e1e-11ea-b65e-4e1376171215','Angela','Segundo 10','Gurria','Materno 10','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Tepic Nayarit','ENDORSEMENT','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','55baf3ae-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/104313029.jpg'), +('b4c2e9ba-8e1e-11ea-b65e-4e1376171215','Aval 11','Segundo 11','Paterno 11','Materno 11','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Tepic Nayarit','ENDORSEMENT','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','55baf3ae-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/11/blogbeitrag-haare-2-1024x713.jpg'), +('ba2faa96-8e1e-11ea-b65e-4e1376171215','Aval 12','Segundo 12','Paterno 12','Materno 12','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Tepic Nayarit','ENDORSEMENT','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','55baf3ae-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/11/blogbeitrag-haare-2-1024x713.jpg'), +('be92604c-8e1e-11ea-b65e-4e1376171215','Aval 13','Segundo 13','Paterno 13','Materno 13','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Tepic Nayarit','ENDORSEMENT','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','55baf3ae-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/653323645.jpg'), +('c2b2b2f8-8e1e-11ea-b65e-4e1376171215','Aval 14','Segundo 14','Paterno 14','Materno 14','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Tepic Nayarit','ENDORSEMENT','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','55baf3ae-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/104313029.jpg'), +('c6a8b04c-8e1e-11ea-b65e-4e1376171215','Aval 15','Segundo 15','Paterno 15','Materno 15','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Tepic Nayarit','ENDORSEMENT','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','55baf3ae-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/666164992-1200x1200.jpg'), +('cb0e8d00-8e1e-11ea-b65e-4e1376171215','Aval 16','Segundo 16','Paterno 16','Materno 16','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Tepic Nayarit','ENDORSEMENT','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','5a329e3c-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/229554145-1200x1200.jpg'), +('cfafc590-8e1e-11ea-b65e-4e1376171215','Aval 17','Segundo 17','Paterno 17','Materno 17','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Tepic Nayarit','ENDORSEMENT','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','5a329e3c-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/653323645.jpg'), +('d474b96e-8e1e-11ea-b65e-4e1376171215','Aval 18','Segundo 18','Paterno 18','Materno 18','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Tepic Nayarit','ENDORSEMENT','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','5a329e3c-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/104313029.jpg'), +('d8f8c804-8e1e-11ea-b65e-4e1376171215','Aval 19','Segundo 19','Paterno 19','Materno 19','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Tepic Nayarit','ENDORSEMENT','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','5a329e3c-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/666164992-1200x1200.jpg'), +('dd7b34e8-8e1e-11ea-b65e-4e1376171215','Aval 20','Segundo 20','Paterno 20','Materno 20','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Tepic Nayarit','ENDORSEMENT','ENEBLED','caef3a64-7d1f-11ea-af3e-28f659da398e','5a329e3c-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/229554145-1200x1200.jpg'), +-- Avales GDL +('e13baa9a-8e1e-11ea-b65e-4e1376171215','Aval 21','Segundo 21','Paterno 21','Materno 21','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Guadalajara Jalisco','ENDORSEMENT','ENEBLED','e0f1a2fc-7d1f-11ea-af3e-28f659da398e','5e9a24e0-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/653323645.jpg'), +('e61db008-8e1e-11ea-b65e-4e1376171215','Aval 22','Segundo 22','Paterno 22','Materno 22','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Guadalajara Jalisco','ENDORSEMENT','ENEBLED','e0f1a2fc-7d1f-11ea-af3e-28f659da398e','5e9a24e0-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/104313029.jpg'), +('eaa8c70c-8e1e-11ea-b65e-4e1376171215','Aval 23','Segundo 23','Paterno 23','Materno 23','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Guadalajara Jalisco','ENDORSEMENT','ENEBLED','e0f1a2fc-7d1f-11ea-af3e-28f659da398e','5e9a24e0-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/666164992-1200x1200.jpg'), +('ef10171e-8e1e-11ea-b65e-4e1376171215','Aval 24','Segundo 24','Paterno 24','Materno 24','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Guadalajara Jalisco','ENDORSEMENT','ENEBLED','e0f1a2fc-7d1f-11ea-af3e-28f659da398e','5e9a24e0-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/10/229554145-1200x1200.jpg'), +('f30d1358-8e1e-11ea-b65e-4e1376171215','Guillermo','Segundo 25','Tellez','Materno 25','11-11-11-11-11','Aval Casa Calle #Num. col. Colonia, Guadalajara Jalisco','ENDORSEMENT','ENEBLED','e0f1a2fc-7d1f-11ea-af3e-28f659da398e','5e9a24e0-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),'https://freisteller24.eu/wp-content/uploads/2017/11/blogbeitrag-haare-2-1024x713.jpg'); +INSERT INTO APC_LOAN_TYPE(id,loan_type_name,total_days, loan_fee, payment,payment_daily,payment_total, id_office,created_by, created_on,opening_fee) +VALUES +-- Para tepic +('db833bf0-8e5e-11ea-8ee4-e54bc704beac','Prestamo $1000', 22,50,1000,60,1320,'caef3a64-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),20), +('c59e5bee-8dff-11ea-8745-07889553dd5f','Prestamo $2000', 22,50,2000,120,2640,'caef3a64-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),40), +('dc255a16-8dff-11ea-8745-07889553dd5f','Prestamo $3000', 22,50,3000,180,3960,'caef3a64-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),60), +('e7cc91c2-8dff-11ea-8745-07889553dd5f','Prestamo $4000', 22,50,4000,240,5280,'caef3a64-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),80), +('f0cb05ba-8dff-11ea-8745-07889553dd5f','Prestamo $5000', 22,50,5000,300,6600,'caef3a64-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),100), +('fdaa4318-8dff-11ea-8745-07889553dd5f','Prestamo $6000', 22,50,6000,360,7920,'caef3a64-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),120), +-- Para GDL; +('7f0cc30e-8e00-11ea-8745-07889553dd5f','Prestamo $1000', 22,50,1000,60,1320,'e0f1a2fc-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),20), +('8623efbe-8e00-11ea-8745-07889553dd5f','Prestamo $2000', 22,50,2000,120,2640,'e0f1a2fc-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),40), +('8d91bc36-8e00-11ea-8745-07889553dd5f','Prestamo $3000', 22,50,3000,180,3960,'e0f1a2fc-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),60), +('93b13506-8e00-11ea-8745-07889553dd5f','Prestamo $4000', 22,50,4000,240,5280,'e0f1a2fc-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),80), +('99d91a66-8e00-11ea-8745-07889553dd5f','Prestamo $5000', 22,50,5000,300,6600,'e0f1a2fc-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),100), +('a0292d0c-8e00-11ea-8745-07889553dd5f','Prestamo $6000', 22,50,6000,360,7920,'e0f1a2fc-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),120); +INSERT INTO APC_LOAN(id,id_loan_type,id_customer,id_endorsement,id_route,loan_status,amount_paid,amount_to_pay,last_reference_number,created_by,created_on,last_updated_on) +VALUES +-- Tepic / Avatar 1 +('c4ed9e5a-8e1b-11ea-b65e-4e1376171215','db833bf0-8e5e-11ea-8ee4-e54bc704beac','83d2cd30-8e1d-11ea-b65e-4e1376171215','76a2650c-8e1e-11ea-b65e-4e1376171215','51b207a2-8e19-11ea-b65e-4e1376171215','APPROVED',0,1320,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),DATE_SUB(NOW(), INTERVAL 1 DAY)), +('c09f127a-8e1b-11ea-b65e-4e1376171215','db833bf0-8e5e-11ea-8ee4-e54bc704beac','c32a578c-8e1d-11ea-b65e-4e1376171215','7ce4fdc6-8e1e-11ea-b65e-4e1376171215','51b207a2-8e19-11ea-b65e-4e1376171215','REJECTED',0,1320,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),NOW()), +('bc185d2e-8e1b-11ea-b65e-4e1376171215','db833bf0-8e5e-11ea-8ee4-e54bc704beac','ca7fbd56-8e1d-11ea-b65e-4e1376171215','818a97aa-8e1e-11ea-b65e-4e1376171215','51b207a2-8e19-11ea-b65e-4e1376171215','APPROVED',0,1320,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),NOW()), +('b64c6e94-8e1b-11ea-b65e-4e1376171215','db833bf0-8e5e-11ea-8ee4-e54bc704beac','d0e60fec-8e1d-11ea-b65e-4e1376171215','85d8f694-8e1e-11ea-b65e-4e1376171215','51b207a2-8e19-11ea-b65e-4e1376171215','FINISH',1320,1320,22,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),DATE_SUB(NOW(), INTERVAL 1 DAY)), +('b0d25168-8e1b-11ea-b65e-4e1376171215','db833bf0-8e5e-11ea-8ee4-e54bc704beac','d9763d1c-8e1d-11ea-b65e-4e1376171215','8a4ad7a6-8e1e-11ea-b65e-4e1376171215','51b207a2-8e19-11ea-b65e-4e1376171215','PENDING',0,1320,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),NOW()), +-- Tepic / Avatar 2 +('acccdfac-8e1b-11ea-b65e-4e1376171215','c59e5bee-8dff-11ea-8745-07889553dd5f','e32dd9fa-8e1d-11ea-b65e-4e1376171215','91328532-8e1e-11ea-b65e-4e1376171215','55baf3ae-8e19-11ea-b65e-4e1376171215','APPROVED',0,2640,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),DATE_SUB(NOW(), INTERVAL 1 DAY)), +('a811395e-8e1b-11ea-b65e-4e1376171215','c59e5bee-8dff-11ea-8745-07889553dd5f','e8eafa6c-8e1d-11ea-b65e-4e1376171215','96c9319e-8e1e-11ea-b65e-4e1376171215','55baf3ae-8e19-11ea-b65e-4e1376171215','APPROVED',0,2640,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),DATE_SUB(NOW(), INTERVAL 1 DAY)), +('a42ceb26-8e1b-11ea-b65e-4e1376171215','c59e5bee-8dff-11ea-8745-07889553dd5f','eecbe234-8e1d-11ea-b65e-4e1376171215','9c481676-8e1e-11ea-b65e-4e1376171215','55baf3ae-8e19-11ea-b65e-4e1376171215','FINISH',2640,2640,22,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),NOW()), +('9ff730b6-8e1b-11ea-b65e-4e1376171215','c59e5bee-8dff-11ea-8745-07889553dd5f','f45155a4-8e1d-11ea-b65e-4e1376171215','aca49c06-8e1e-11ea-b65e-4e1376171215','55baf3ae-8e19-11ea-b65e-4e1376171215','APPROVED',0,2640,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),NOW()), +('98c4de60-8e1b-11ea-b65e-4e1376171215','c59e5bee-8dff-11ea-8745-07889553dd5f','faa43aa2-8e1d-11ea-b65e-4e1376171215','b0361e44-8e1e-11ea-b65e-4e1376171215','55baf3ae-8e19-11ea-b65e-4e1376171215','APPROVED',0,2640,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),DATE_SUB(NOW(), INTERVAL 1 DAY)), +('94aad8a2-8e1b-11ea-b65e-4e1376171215','e7cc91c2-8dff-11ea-8745-07889553dd5f','fffd273e-8e1d-11ea-b65e-4e1376171215','b4c2e9ba-8e1e-11ea-b65e-4e1376171215','55baf3ae-8e19-11ea-b65e-4e1376171215','FINISH',5280,5280,22,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),DATE_SUB(NOW(), INTERVAL 1 DAY)), +('90dadcae-8e1b-11ea-b65e-4e1376171215','e7cc91c2-8dff-11ea-8745-07889553dd5f','05d35002-8e1e-11ea-b65e-4e1376171215','ba2faa96-8e1e-11ea-b65e-4e1376171215','55baf3ae-8e19-11ea-b65e-4e1376171215','APPROVED',0,5280,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),NOW()), +('8d017a66-8e1b-11ea-b65e-4e1376171215','e7cc91c2-8dff-11ea-8745-07889553dd5f','0b27081e-8e1e-11ea-b65e-4e1376171215','be92604c-8e1e-11ea-b65e-4e1376171215','55baf3ae-8e19-11ea-b65e-4e1376171215','TO_DELIVERY',0,5280,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 2 DAY),DATE_SUB(NOW(), INTERVAL 2 DAY)), +('86a09490-8e1b-11ea-b65e-4e1376171215','dc255a16-8dff-11ea-8745-07889553dd5f','109b9b84-8e1e-11ea-b65e-4e1376171215','c2b2b2f8-8e1e-11ea-b65e-4e1376171215','55baf3ae-8e19-11ea-b65e-4e1376171215','APPROVED',0,3960,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),DATE_SUB(NOW(), INTERVAL 1 DAY)), +('82a781dc-8e1b-11ea-b65e-4e1376171215','dc255a16-8dff-11ea-8745-07889553dd5f','15151320-8e1e-11ea-b65e-4e1376171215','c6a8b04c-8e1e-11ea-b65e-4e1376171215','55baf3ae-8e19-11ea-b65e-4e1376171215','FINISH',3960,3960,22,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),DATE_SUB(NOW(), INTERVAL 1 DAY)), +-- Tepic / Avatar 3 +('7ec212f8-8e1b-11ea-b65e-4e1376171215','f0cb05ba-8dff-11ea-8745-07889553dd5f','1f292d38-8e1e-11ea-b65e-4e1376171215','cb0e8d00-8e1e-11ea-b65e-4e1376171215','5a329e3c-8e19-11ea-b65e-4e1376171215','APPROVED',0,6600,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),NOW()), +('788f666a-8e1b-11ea-b65e-4e1376171215','f0cb05ba-8dff-11ea-8745-07889553dd5f','25bf9ccc-8e1e-11ea-b65e-4e1376171215','cfafc590-8e1e-11ea-b65e-4e1376171215','5a329e3c-8e19-11ea-b65e-4e1376171215','REJECTED',0,6600,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),DATE_SUB(NOW(), INTERVAL 1 DAY)), +('74eca1c6-8e1b-11ea-b65e-4e1376171215','f0cb05ba-8dff-11ea-8745-07889553dd5f','2b502d50-8e1e-11ea-b65e-4e1376171215','d474b96e-8e1e-11ea-b65e-4e1376171215','5a329e3c-8e19-11ea-b65e-4e1376171215','APPROVED',0,6600,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),DATE_SUB(NOW(), INTERVAL 1 DAY)), +('705b9662-8e1b-11ea-b65e-4e1376171215','f0cb05ba-8dff-11ea-8745-07889553dd5f','305aee3e-8e1e-11ea-b65e-4e1376171215','d8f8c804-8e1e-11ea-b65e-4e1376171215','5a329e3c-8e19-11ea-b65e-4e1376171215','APPROVED',0,6600,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),DATE_SUB(NOW(), INTERVAL 1 DAY)), +('6cd18fec-8e1b-11ea-b65e-4e1376171215','fdaa4318-8dff-11ea-8745-07889553dd5f','394ffa70-8e1e-11ea-b65e-4e1376171215','dd7b34e8-8e1e-11ea-b65e-4e1376171215','5a329e3c-8e19-11ea-b65e-4e1376171215','APPROVED',0,7920,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),DATE_SUB(NOW(), INTERVAL 1 DAY)), +-- GDL / Avatar 4 +('68b7b92c-8e1b-11ea-b65e-4e1376171215','7f0cc30e-8e00-11ea-8745-07889553dd5f','3d8c43e6-8e1e-11ea-b65e-4e1376171215','e13baa9a-8e1e-11ea-b65e-4e1376171215','5e9a24e0-8e19-11ea-b65e-4e1376171215','FINISH',1320,1320,22,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 4 DAY),DATE_SUB(NOW(), INTERVAL 4 DAY)), +('6613cd16-9a9e-11ea-b304-ce916d70ea46','7f0cc30e-8e00-11ea-8745-07889553dd5f','3d8c43e6-8e1e-11ea-b65e-4e1376171215','e13baa9a-8e1e-11ea-b65e-4e1376171215','5e9a24e0-8e19-11ea-b65e-4e1376171215','REJECTED',0,1320,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 3 DAY),DATE_SUB(NOW(), INTERVAL 3 DAY)), +('6fab97c8-9a9e-11ea-b304-ce916d70ea46','7f0cc30e-8e00-11ea-8745-07889553dd5f','3d8c43e6-8e1e-11ea-b65e-4e1376171215','e13baa9a-8e1e-11ea-b65e-4e1376171215','5e9a24e0-8e19-11ea-b65e-4e1376171215','APPROVED',0,1320,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),DATE_SUB(NOW(), INTERVAL 1 DAY)), +('606e42f4-8e1b-11ea-b65e-4e1376171215','8623efbe-8e00-11ea-8745-07889553dd5f','428c5b88-8e1e-11ea-b65e-4e1376171215','e61db008-8e1e-11ea-b65e-4e1376171215','5e9a24e0-8e19-11ea-b65e-4e1376171215','APPROVED',0,2640,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),DATE_SUB(NOW(), INTERVAL 1 DAY)), +('5c925364-8e1b-11ea-b65e-4e1376171215','8d91bc36-8e00-11ea-8745-07889553dd5f','46f6f070-8e1e-11ea-b65e-4e1376171215','eaa8c70c-8e1e-11ea-b65e-4e1376171215','5e9a24e0-8e19-11ea-b65e-4e1376171215','APPROVED',0,3960,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),DATE_SUB(NOW(), INTERVAL 1 DAY)), +('58f3fb72-8e1b-11ea-b65e-4e1376171215','93b13506-8e00-11ea-8745-07889553dd5f','4adc2c28-8e1e-11ea-b65e-4e1376171215','ef10171e-8e1e-11ea-b65e-4e1376171215','5e9a24e0-8e19-11ea-b65e-4e1376171215','FINISH',5280,5280,22,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 3 DAY),DATE_SUB(NOW(), INTERVAL 3 DAY)), +('551308c2-8e1b-11ea-b65e-4e1376171215','99d91a66-8e00-11ea-8745-07889553dd5f','4ed391e0-8e1e-11ea-b65e-4e1376171215','f30d1358-8e1e-11ea-b65e-4e1376171215','5e9a24e0-8e19-11ea-b65e-4e1376171215','REJECTED',0,6600,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 2 DAY),DATE_SUB(NOW(), INTERVAL 2 DAY)), +('7d9d4850-9a9d-11ea-b304-ce916d70ea46','99d91a66-8e00-11ea-8745-07889553dd5f','4ed391e0-8e1e-11ea-b65e-4e1376171215','f30d1358-8e1e-11ea-b65e-4e1376171215','5e9a24e0-8e19-11ea-b65e-4e1376171215','APPROVED',0,6600,0,'0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_SUB(NOW(), INTERVAL 1 DAY),NOW()); +INSERT INTO APC_HUMAN_RESOURCE_HAS_ROUTE(id_human_resource,id_route,created_by,created_on) +VALUES +-- Avatar 1 +('c021214a-8bc7-11ea-b45c-c7b846343364','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +-- Avatar 2 +('d2869da6-8bc7-11ea-b45c-c7b846343364','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('d2869da6-8bc7-11ea-b45c-c7b846343364','55baf3ae-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('d2869da6-8bc7-11ea-b45c-c7b846343364','5a329e3c-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +-- Avatar 3 +('c687acca-8bc7-11ea-b45c-c7b846343364','5a329e3c-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +-- Avatar 4 +('088d7268-8bc7-11ea-b45c-c7b846343364','5e9a24e0-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()); +INSERT INTO APC_LOAN_BY_USER(id_loan,id_user,loan_by_user_status,owner_loan,created_by,created_on) +VALUES +-- Tepic / Avatar 1 +('c4ed9e5a-8e1b-11ea-b65e-4e1376171215','67b3081e-8bc9-11ea-b45c-c7b846343364','APPROVED','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('c09f127a-8e1b-11ea-b65e-4e1376171215','67b3081e-8bc9-11ea-b45c-c7b846343364','REJECTED','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('bc185d2e-8e1b-11ea-b65e-4e1376171215','67b3081e-8bc9-11ea-b45c-c7b846343364','APPROVED','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('b64c6e94-8e1b-11ea-b65e-4e1376171215','67b3081e-8bc9-11ea-b45c-c7b846343364','FINISH','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('b0d25168-8e1b-11ea-b65e-4e1376171215','67b3081e-8bc9-11ea-b45c-c7b846343364','PENDING','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +-- Tepic / Avatar 2 +('acccdfac-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','APPROVED','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('a811395e-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','APPROVED','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('a42ceb26-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','FINISH','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('9ff730b6-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','APPROVED','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('98c4de60-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','APPROVED','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('94aad8a2-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','FINISH','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('90dadcae-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','APPROVED','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('8d017a66-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','TO_DELIVERY','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('86a09490-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','APPROVED','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('82a781dc-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','FINISH','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +-- Tepic / Avatar 3 +('7ec212f8-8e1b-11ea-b65e-4e1376171215','22fb81e2-8bc9-11ea-b45c-c7b846343364','APPROVED','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('788f666a-8e1b-11ea-b65e-4e1376171215','22fb81e2-8bc9-11ea-b45c-c7b846343364','REJECTED','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('74eca1c6-8e1b-11ea-b65e-4e1376171215','22fb81e2-8bc9-11ea-b45c-c7b846343364','APPROVED','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('705b9662-8e1b-11ea-b65e-4e1376171215','22fb81e2-8bc9-11ea-b45c-c7b846343364','APPROVED','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('6cd18fec-8e1b-11ea-b65e-4e1376171215','22fb81e2-8bc9-11ea-b45c-c7b846343364','APPROVED','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +-- GDL / Avatar 4 +('68b7b92c-8e1b-11ea-b65e-4e1376171215','3870767c-8bc9-11ea-b45c-c7b846343364','FINISH','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('6613cd16-9a9e-11ea-b304-ce916d70ea46','3870767c-8bc9-11ea-b45c-c7b846343364','REJECTED','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_ADD(NOW(), INTERVAL 22 DAY)), +('6fab97c8-9a9e-11ea-b304-ce916d70ea46','3870767c-8bc9-11ea-b45c-c7b846343364','APPROVED','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_ADD(NOW(), INTERVAL 44 DAY)), +('606e42f4-8e1b-11ea-b65e-4e1376171215','3870767c-8bc9-11ea-b45c-c7b846343364','APPROVED','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('5c925364-8e1b-11ea-b65e-4e1376171215','3870767c-8bc9-11ea-b45c-c7b846343364','APPROVED','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('58f3fb72-8e1b-11ea-b65e-4e1376171215','3870767c-8bc9-11ea-b45c-c7b846343364','FINISH','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('551308c2-8e1b-11ea-b65e-4e1376171215','3870767c-8bc9-11ea-b45c-c7b846343364','REJECTED','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('7d9d4850-9a9d-11ea-b304-ce916d70ea46','3870767c-8bc9-11ea-b45c-c7b846343364','APPROVED','CURRENT_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8',DATE_ADD(NOW(), INTERVAL 22 DAY)); +INSERT INTO APC_LOAN_DETAIL(id,id_loan,id_user,people_type,payment_amount,reference_number,loan_details_type, created_by, created_on) +VALUES +(UUID(),'acccdfac-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','CUSTOMER',120,1,'PAYMENT','52cbc85a-8bc9-11ea-b45c-c7b846343364', DATE_SUB(NOW(), INTERVAL 21 DAY)), +(UUID(),'acccdfac-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','CUSTOMER',120,2,'PAYMENT','52cbc85a-8bc9-11ea-b45c-c7b846343364', DATE_SUB(NOW(), INTERVAL 20 DAY)), +(UUID(),'acccdfac-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','CUSTOMER',120,3,'PAYMENT','52cbc85a-8bc9-11ea-b45c-c7b846343364', DATE_SUB(NOW(), INTERVAL 19 DAY)), +(UUID(),'acccdfac-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','CUSTOMER',120,4,'PAYMENT','52cbc85a-8bc9-11ea-b45c-c7b846343364', DATE_SUB(NOW(), INTERVAL 18 DAY)), +(UUID(),'acccdfac-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','CUSTOMER',120,5,'PAYMENT','52cbc85a-8bc9-11ea-b45c-c7b846343364', DATE_SUB(NOW(), INTERVAL 17 DAY)), +(UUID(),'acccdfac-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','CUSTOMER',120,6,'PAYMENT','52cbc85a-8bc9-11ea-b45c-c7b846343364', DATE_SUB(NOW(), INTERVAL 16 DAY)), +(UUID(),'acccdfac-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','CUSTOMER',120,7,'PAYMENT','52cbc85a-8bc9-11ea-b45c-c7b846343364', DATE_SUB(NOW(), INTERVAL 15 DAY)), +(UUID(),'acccdfac-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','CUSTOMER',120,8,'PAYMENT','52cbc85a-8bc9-11ea-b45c-c7b846343364', DATE_SUB(NOW(), INTERVAL 14 DAY)), +(UUID(),'acccdfac-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','CUSTOMER',120,9,'PAYMENT','52cbc85a-8bc9-11ea-b45c-c7b846343364', DATE_SUB(NOW(), INTERVAL 13 DAY)), +(UUID(),'acccdfac-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','CUSTOMER',120,10,'PAYMENT','52cbc85a-8bc9-11ea-b45c-c7b846343364', DATE_SUB(NOW(), INTERVAL 12 DAY)), +(UUID(),'acccdfac-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','CUSTOMER',120,11,'PAYMENT','52cbc85a-8bc9-11ea-b45c-c7b846343364', DATE_SUB(NOW(), INTERVAL 11 DAY)), +(UUID(),'acccdfac-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','CUSTOMER',120,12,'PAYMENT','52cbc85a-8bc9-11ea-b45c-c7b846343364', DATE_SUB(NOW(), INTERVAL 10 DAY)), +(UUID(),'acccdfac-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','CUSTOMER',120,13,'PAYMENT','52cbc85a-8bc9-11ea-b45c-c7b846343364', DATE_SUB(NOW(), INTERVAL 9 DAY)), +(UUID(),'acccdfac-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','CUSTOMER',120,14,'PAYMENT','52cbc85a-8bc9-11ea-b45c-c7b846343364', DATE_SUB(NOW(), INTERVAL 8 DAY)), +(UUID(),'acccdfac-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','CUSTOMER',120,15,'PAYMENT','52cbc85a-8bc9-11ea-b45c-c7b846343364', DATE_SUB(NOW(), INTERVAL 7 DAY)), +(UUID(),'acccdfac-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','CUSTOMER',120,16,'PAYMENT','52cbc85a-8bc9-11ea-b45c-c7b846343364', DATE_SUB(NOW(), INTERVAL 6 DAY)), +(UUID(),'acccdfac-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','CUSTOMER',120,17,'PAYMENT','52cbc85a-8bc9-11ea-b45c-c7b846343364', DATE_SUB(NOW(), INTERVAL 5 DAY)), +-- sumar 100 al monto por pagar +(UUID(),'acccdfac-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','CUSTOMER',50,18,'FEE','52cbc85a-8bc9-11ea-b45c-c7b846343364', DATE_SUB(NOW(), INTERVAL 4 DAY)), +(UUID(),'acccdfac-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','CUSTOMER',50,19,'FEE','52cbc85a-8bc9-11ea-b45c-c7b846343364', DATE_SUB(NOW(), INTERVAL 3 DAY)), +-- sumar +120 al monto pagado +(UUID(),'acccdfac-8e1b-11ea-b65e-4e1376171215','52cbc85a-8bc9-11ea-b45c-c7b846343364','CUSTOMER',120,20,'PAYMENT','52cbc85a-8bc9-11ea-b45c-c7b846343364', DATE_SUB(NOW(), INTERVAL 2 DAY)); +UPDATE APC_LOAN +SET amount_paid = 2160, amount_to_pay = 2740 ,last_reference_number = 20, last_updated_by = '52cbc85a-8bc9-11ea-b45c-c7b846343364', last_updated_on = DATE_SUB(NOW(), INTERVAL 1 DAY) +WHERE id = 'acccdfac-8e1b-11ea-b65e-4e1376171215'; +COMMIT; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/apc-db/src/apc-db.sql b/apc-db/src/apc-db.sql new file mode 100644 index 0000000..7c070ba --- /dev/null +++ b/apc-db/src/apc-db.sql @@ -0,0 +1,3430 @@ +-- -------------------------------------------------------- +-- Arrebol Consuntancy +-- version 1.0.1 +-- http://www.arrebolconsultancy.com +-- -------------------------------------------------------- + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET AUTOCOMMIT = 0; +START TRANSACTION; +-- SET time_zone = "+00:00"; + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +DROP DATABASE IF EXISTS `apo_pro_com_april_ten`; + +CREATE DATABASE IF NOT EXISTS `apo_pro_com_april_ten` DEFAULT CHARACTER SET latin1 COLLATE latin1_spanish_ci; +USE `apo_pro_com_april_ten`; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_ERROR_APP_LOG` +-- +CREATE TABLE `APC_ERROR_APP_LOG`( + `id_log` varchar(36) primary key, + `log_entry_date` timestamp, + `log_logger` varchar(100), + `log_level` varchar(100), + `log_message` varchar(250), + `log_exception` varchar(4000) +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +USE `apo_pro_com_april_ten`; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_OFFICE` +-- +CREATE TABLE `APC_OFFICE`( + `id` char(36) NOT NULL, + `office_name` varchar(100) NOT NULL, + `address` varchar(250), + `office_status` ENUM('ENEBLED', 'DISABLED', 'DELETED') NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_office_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_office_uk` UNIQUE KEY (`office_name`) +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_ROLE` +-- +CREATE TABLE `APC_ROLE`( + `id` char(36) NOT NULL, + `role_name` varchar(100) NOT NULL, + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_role_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_role_uk` UNIQUE KEY (`role_name`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_ROUTE` +-- +CREATE TABLE `APC_ROUTE`( + `id` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `route_name` varchar(25) NOT NULL, + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_route_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_route_uk` UNIQUE KEY (`id_office`,`route_name`), + CONSTRAINT `apc_route_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_BONUS` +-- +-- Dar de alta los bonos activos. +-- +CREATE TABLE `APC_BONUS`( + `id` char(36) NOT NULL, + `name` varchar(100) NOT NULL, + `loan_bonus` numeric(8,2) NOT NULL, + `mora_bonus` numeric(8,2) NOT NULL, + `new_customer_bonus` numeric(8,2) NOT NULL, + `administrative` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `id_office` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_bono_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_bono_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_HUMAN_RESOURCES` +-- +CREATE TABLE `APC_HUMAN_RESOURCE` ( + `id` char(36) NOT NULL, + `first_name` varchar(25) NOT NULL, + `second_name` varchar(25) DEFAULT NULL, + `last_name` varchar(25) NOT NULL, + `middle_name` varchar(25) NOT NULL, + `birthdate` date DEFAULT NULL, + `avatar` varchar(150) NOT NULL, + `curp` varchar(20) DEFAULT NULL, + `rfc` varchar(13) DEFAULT NULL, + `ife` varchar(20) DEFAULT NULL, + `admission_date` date DEFAULT NULL, + `human_resource_status` ENUM('ENEBLED', 'DISABLED', 'DELETED') NOT NULL, + `id_role` char(36) NOT NULL, + `id_bonus` char(36) DEFAULT NULL, + `payment` numeric(8,2) DEFAULT NULL, + `imss` numeric(8,2) DEFAULT NULL, + `created_by` char(36) DEFAULT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `person_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_human_resource_to_apc_role_fk` + FOREIGN KEY (`id_role`) REFERENCES `APC_ROLE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_human_resource_to_apc_bonus_fk` + FOREIGN KEY (`id_bonus`) REFERENCES `APC_BONUS`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_HUMAN_RESOURCE_HAS_ROUTE` +-- +CREATE TABLE `APC_HUMAN_RESOURCE_HAS_ROUTE`( + `id_human_resource` char(36) NOT NULL, + `id_route` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_human_resource_has_route_pk` PRIMARY KEY (`id_human_resource`, `id_route`), + CONSTRAINT `apc_human_resource_has_route_to_apc_human_resource_fk` + FOREIGN KEY (`id_human_resource`) REFERENCES `APC_HUMAN_RESOURCE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_human_resource_has_route_to_apc_office_fk` + FOREIGN KEY (`id_route`) REFERENCES `APC_ROUTE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_PEOPLE` +-- +CREATE TABLE `APC_PEOPLE`( + `id` char(36) NOT NULL, + `first_name` varchar(25) NOT NULL, + `second_name` varchar(25) DEFAULT NULL, + `last_name` varchar(25) NOT NULL, + `middle_name` varchar(25) NOT NULL, + `birthdate` date DEFAULT NULL, + `thumbnail` varchar(250) NOT NULL, + `phone_home` varchar(15) NOT NULL, + `address_home` varchar(150) NOT NULL, + `phone_business` varchar(15), + `address_business` varchar(150), + `company_name` varchar(150), + `people_type` ENUM('CUSTOMER', 'ENDORSEMENT', 'BOTH') NOT NULL DEFAULT 'CUSTOMER', + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `id_office` char(36) NOT NULL, + `id_route` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_people_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_people_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_people_to_apc_route_fk` + FOREIGN KEY (`id_route`) REFERENCES `APC_ROUTE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_LOAN_TYPE` +-- +CREATE TABLE `APC_LOAN_TYPE`( + `id` char(36) NOT NULL, + `loan_type_name` varchar(50) NOT NULL, + `total_days` smallint NOT NULL DEFAULT 22, + `loan_fee` numeric(8,2) NOT NULL,-- Multa + `opening_fee` int NOT NULL, -- Comisión + `payment` numeric(8,2) NOT NULL,-- Monte del prestamo + `payment_daily` numeric(8,2) NOT NULL,-- 60 x c/1000 + `payment_total` numeric(8,2) NOT NULL, -- Prestamo más intereses + `payment_monday` ENUM('MONDAY'), + `payment_tuesday` ENUM('TUESDAY'), + `payment_wednesday` ENUM('WEDNESDAY'), + `payment_thursday` ENUM('THURSDAY'), + `payment_friday` ENUM('FRIDAY'), + `payment_saturday` ENUM('SATURDAY'), + `payment_sunday` ENUM('SUNDAY'), + `id_office` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_loan_type_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_loan_type_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_LOAN` +-- +CREATE TABLE `APC_LOAN`( + `id` char(36) NOT NULL, + `id_loan_type` char(36) NOT NULL, + `id_customer` char(36) NOT NULL, + `id_endorsement` char(36) NOT NULL, + `id_route` char(36) NOT NULL, + `loan_status` ENUM('PENDING', 'FINISH','BLACK_LIST', 'APPROVED','REJECTED', 'PENDING_RENOVATION', 'TO_DELIVERY') NOT NULL DEFAULT 'PENDING', + `new_customer` ENUM('ENEBLED', 'DISABLED') DEFAULT 'DISABLED', + `amount_paid` numeric(8,2) NOT NULL, + `amount_to_pay` numeric(8,2) NOT NULL, + `last_reference_number` smallint NOT NULL, + `comments` varchar(200), + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36), + `last_updated_on` datetime, + CONSTRAINT `apc_loan_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_loan_to_apc_loan_type_fk` + FOREIGN KEY (`id_loan_type`) REFERENCES `APC_LOAN_TYPE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_loan_to_apc_person_as_customer_fk` + FOREIGN KEY (`id_customer`) REFERENCES `APC_PEOPLE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_loan_to_apc_person_as_endorsement_fk` + FOREIGN KEY (`id_endorsement`) REFERENCES `APC_PEOPLE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_loan_to_apc_route_fk` + FOREIGN KEY (`id_route`) REFERENCES `APC_ROUTE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_HUMAN_RESOURCE_BY_OFFICE` +-- +CREATE TABLE `APC_HUMAN_RESOURCE_BY_OFFICE`( + `id` char(36) NOT NULL, + `id_human_resource` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `application_owner` ENUM('APP_OWNER', 'APP_USER') NOT NULL DEFAULT 'APP_USER', + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_human_resource_by_office_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_human_resource_by_office_uk` UNIQUE KEY (`id_human_resource`, `id_office`), + CONSTRAINT `apc_human_resource_by_office_to_apc_human_resource_fk` + FOREIGN KEY (`id_human_resource`) REFERENCES `APC_HUMAN_RESOURCE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_human_resource_by_office_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_USER` +-- +CREATE TABLE `APC_USER`( + `id` char(36) NOT NULL, + `id_human_resource` char(36) NOT NULL, + `user_name` varchar(100) NOT NULL, + `pwd` varchar(100)NOT NULL, + `user_type` ENUM('WEB', 'MOBILE', 'BOTH') NOT NULL, + `user_status` ENUM('ENEBLED', 'DISABLED', 'DELETED') NOT NULL, + `application_owner` ENUM('APP_OWNER', 'APP_USER') NOT NULL DEFAULT 'APP_USER', + `certifier` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'DISABLED', + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_user_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_user_by_office_to_apc_human_resource_fk` + FOREIGN KEY (`id_human_resource`) REFERENCES `APC_HUMAN_RESOURCE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_LOAN_DETAIL` +-- +CREATE TABLE `APC_LOAN_DETAIL`( + `id` char(36) NOT NULL, + `id_loan` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `people_type` ENUM('CUSTOMER', 'ENDORSEMENT') NOT NULL DEFAULT 'CUSTOMER', + `payment_amount` numeric(8,2) NOT NULL, + `reference_number` smallint NOT NULL, + `loan_details_type` ENUM('CREDIT_PAYMENT', 'DEBIT_PAYMENT', 'PAYMENT', 'FEE','RENOVATION_PAYMENT') NOT NULL, + `loan_comments` varchar(150), + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_loan_details_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_loan_details_uk` UNIQUE KEY (`id`,`reference_number`), + CONSTRAINT `apc_loan_details_to_apc_loan_fk` + FOREIGN KEY (`id_loan`) REFERENCES `APC_LOAN`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_loan_details_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_LOAN_FEE_NOTIFICATION` +-- +CREATE TABLE `APC_LOAN_FEE_NOTIFICATION`( + `id` char(36) NOT NULL, + `id_loan` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `notification_number` smallint NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_loan_notification_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_loan_notification_to_apc_loan_fk` + FOREIGN KEY (`id_loan`) REFERENCES `APC_LOAN`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_loan_notification_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_LOAN_BY_USER` +-- +CREATE TABLE `APC_LOAN_BY_USER`( + `id_loan` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `loan_by_user_status` ENUM('PENDING', 'FINISH','BLACK_LIST', 'APPROVED','REJECTED', 'PENDING_RENOVATION', 'TO_DELIVERY') NOT NULL DEFAULT 'PENDING', + `comments` varchar(150), + `owner_loan` ENUM('CURRENT_OWNER', 'OLD_OWNER') NOT NULL, + `order_in_list` smallint DEFAULT 0, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_loan_by_user_pk` PRIMARY KEY (`id_loan`, `id_user`), + CONSTRAINT `apc_loan_by_user_to_apc_loan_fk` + FOREIGN KEY (`id_loan`) REFERENCES `APC_LOAN`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_loan_by_user_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_LOAN_BY_RENOVATION` +-- +CREATE TABLE `APC_LOAN_BY_RENOVATION`( + `id_loan_old` char(36) NOT NULL, + `id_loan_new` char(36) NOT NULL, + `loan_by_renovation_status` ENUM('PENDING', 'APPROVED','REJECTED') NOT NULL DEFAULT 'PENDING', + `comments` varchar(150), + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_loan_by_renovation_pk` PRIMARY KEY (`id_loan_old`, `id_loan_new`), + CONSTRAINT `apc_loan_by_renovation_old_to_apc_loan_fk` + FOREIGN KEY (`id_loan_old`) REFERENCES `APC_LOAN`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_loan_by_renovation_new_to_apc_user_fk` + FOREIGN KEY (`id_loan_new`) REFERENCES `APC_LOAN`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_USER_BY_OFFICE` +-- +CREATE TABLE `APC_USER_BY_OFFICE`( + `id` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `user_by_office_status` ENUM('ENEBLED', 'DISABLED', 'DELETED') NOT NULL, + `application_owner` ENUM('APP_OWNER', 'APP_USER')NOT NULL DEFAULT 'APP_USER', + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_user_by_office_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_user_by_office_uk` UNIQUE KEY (`id_user`, `id_office`), + CONSTRAINT `apc_user_by_office_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_user_by_office_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_PERMISSION` +-- +CREATE TABLE `APC_PERMISSION` ( + `id` char(36) NOT NULL, + `permission` varchar(200) NOT NULL, -- dashboard.policy.to.expire.name + `description` varchar(200) NOT NULL, -- dashboard.policy.to.expire.description + `menu_path` varchar(200) NOT NULL, -- dashboard.policy.to.expire.path + `left_to_right_order` smallint NOT NULL, -- Orden en la que aparece el menu principal (Dashboard, Administración, Catálogo) + `top_to_bottom_order` smallint NOT NULL, -- Orden en la que aparece de arriba hacia abajo + `permission_type` ENUM('PUBLIC', 'PRIVATE', 'EXCLUSIVE') NOT NULL, + `parent_name` varchar(200), + `permission_status` ENUM('ENEBLED', 'DISABLED') NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_permission_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_permission_uk` UNIQUE KEY (`permission`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_USER_BY_OFFICE_HAS_PERMISSION` +-- +CREATE TABLE `APC_USER_BY_OFFICE_HAS_PERMISSION` ( + `id_user_by_office` char(36) NOT NULL, + `id_permission` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_user_by_office_has_permission_pk` PRIMARY KEY (`id_user_by_office`,`id_permission`) , + CONSTRAINT `apc_user_by_office_has_permission_to_apc_user_by_office_fk` + FOREIGN KEY (`id_user_by_office`) REFERENCES `APC_USER_BY_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_user_by_office_has_permission_to_apc_permission_fk` + FOREIGN KEY (`id_permission`) REFERENCES `APC_PERMISSION`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_USER_MOBILE_PREFERECE` +-- +CREATE TABLE `APC_USER_MOBILE_PREFERECE`( + `id` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `preference_name` varchar(25) NOT NULL, + `preference_value` varchar(25) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_user_mobile_preference_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_user_mobile_preference_uk` UNIQUE KEY (`id_user`,`preference_name`), + CONSTRAINT `apc_user_mobile_preference_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_TRANSFER` +-- +CREATE TABLE `APC_TRANSFER`( + `id` char(36) NOT NULL, + `id_user_transmitter` char(36) NOT NULL, + `id_user_receiver` char(36) NOT NULL, + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `action_status` ENUM('PENDING', 'APPROVED','REJECTED') NOT NULL DEFAULT 'PENDING', + `amount_to_transfer` numeric(8,2) NOT NULL, + `id_office` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_transfer_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_transfer_user_transmitter_to_apc_user_fk` + FOREIGN KEY (`id_user_transmitter`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_transfer_user_receiver_to_apc_user_fk` + FOREIGN KEY (`id_user_receiver`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_transfer_by_office_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_MONEY_DAILY` +-- +CREATE TABLE `APC_MONEY_DAILY`( + `id` char(36) NOT NULL, + `money_daily_date` datetime DEFAULT CURRENT_TIMESTAMP, + `amount` numeric(8,2) NOT NULL, + `id_user` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_money_daily_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_money_daily_by_id_user_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_money_daily_by_id_office_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de la tabla `APC_DELIVERY` +-- +CREATE TABLE `APC_DELIVERY`( + `id` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `id_loan` char(36) NOT NULL, + `amount` numeric(8,2) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_delivery_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_delivery_by_id_user_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_delivery_to_apc_loan_fk` + FOREIGN KEY (`id_loan`) REFERENCES `APC_LOAN`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- ------------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_CLOSING_DAY` +-- +CREATE TABLE `APC_CLOSING_DAY`( + `id` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `amount_paid` numeric(8,2) NOT NULL, + `amount_expected` numeric(8,2) NOT NULL, + `comments` varchar(250), + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_closing_day_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_closing_day_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_closing_day_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- ------------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_OTHER_EXPENSE` +-- +CREATE TABLE `APC_OTHER_EXPENSE`( + `id` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `expense` numeric(8,2) NOT NULL, + `description` varchar(200) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_other_expense_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_other_expense_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_other_expense_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_GOAL` +-- +-- Dar de alta las metas de los trabajadores. +-- +CREATE TABLE `APC_GOAL`( + `id` char(36) NOT NULL, + `start_date` date NOT NULL, + `end_date` date NOT NULL, + `amount` numeric(8,2) NOT NULL, + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `id_office` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_goal_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_goal_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_ADVANCE` +-- +-- Adelanto de nomina. +-- +CREATE TABLE `APC_ADVANCE`( + `id` char(36) NOT NULL, + `id_human_resource` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `amount` numeric(8,2) NOT NULL, + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_advance_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_advance_to_apc_human_resource_fk` + FOREIGN KEY (`id_human_resource`) REFERENCES `APC_HUMAN_RESOURCE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_advance_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------------------- +-- +-- Estructura para la tabla `APC_EXPENSE_COMPANY` +-- +-- Gastos de la compañia. +-- +CREATE TABLE `APC_EXPENSE_COMPANY`( + `id` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `amount` numeric(8,2) NOT NULL, + `description` varchar(200), + `expense_company_type` ENUM('PAYMENT_IN', 'PAYMENT_OUT') NOT NULL, + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_expense_company_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_expense_company_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------------------- +-- +-- Estructura para la tabla `APC_STABLE_GENERAL_BOX` +-- +-- Totales de la caja de APC. +-- +CREATE TABLE `APC_STABLE_GENERAL_BOX`( + `id` char(36) NOT NULL, + `total_general_box` numeric(8,2) NOT NULL, + `total_envelope` numeric(8,2) NOT NULL, + `total_bank_note` numeric(8,2) NOT NULL, + `total_coin` numeric(8,2) NOT NULL, + `total_stable` numeric(8,2) NOT NULL, + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `description` varchar(200), + `id_office` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_stable_general_box_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_stable_general_box_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Estructura para la tabla `APC_STABLE_GENERAL_BOX` +-- +-- Totales de la caja de APC. +-- +CREATE TABLE `APC_TOTAL_EXPECTED_PAYMENT_DAILY_BY_USER`( + `id` char(36) NOT NULL, + `total_expected` numeric(8,2) NOT NULL, + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `id_office` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_total_expected_payment_daily_by_user_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_total_expected_payment_daily_by_user_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_total_expected_payment_daily_by_user_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `ARREBOL_TEST` +-- +-- Solo para pruebas exclusivas. +-- +CREATE TABLE `ARREBOL_TEST`( + `id` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_SECURITY_AUTHENTICATION` (USER) +-- +CREATE OR REPLACE VIEW `APC_SECURITY_AUTHENTICATION` AS +SELECT CONCAT(`usr`.`user_name`,`ubo`.`id_office`) AS `user_name`, `usr`.`pwd` AS `pwd` +FROM `APC_USER_BY_OFFICE` `ubo` +INNER JOIN `APC_USER` `usr` ON `ubo`.`id_user` = `usr`.`id` +INNER JOIN `APC_HUMAN_RESOURCE` `hr` ON `usr`.`id_human_resource` = `hr`.`id` +WHERE +`usr`.`user_status` = 'ENEBLED' AND +`usr`.`user_type` IN ('WEB', 'BOTH') AND +`ubo`.`user_by_office_status` = 'ENEBLED' AND +`hr`.`human_resource_status` = 'ENEBLED'; +-- ------------------------------------------------------------ +-- +-- Estructura para la vista `APC_SECURITY_AUTHORIZATION` (ROLE) +-- +CREATE OR REPLACE VIEW `APC_SECURITY_AUTHORIZATION` AS +SELECT CONCAT(`usr`.`user_name`,`ubo`.`id_office`) AS `user_name`, `perm`.`permission` AS `permission` +FROM `APC_PERMISSION` `perm` +INNER JOIN `APC_USER_BY_OFFICE_HAS_PERMISSION` `ubohp` ON `perm`.`id` = `ubohp`.`id_permission` +INNER JOIN `APC_USER_BY_OFFICE` `ubo` ON `ubohp`.`id_user_by_office` = `ubo`.`id` +INNER JOIN `APC_USER` `usr` ON `ubo`.`id_user` = `usr`.`id` +INNER JOIN `APC_HUMAN_RESOURCE` `hr` ON `usr`.`id_human_resource` = `hr`.`id` +WHERE +`perm`.`permission_status` = 'ENEBLED' AND +`ubo`.`user_by_office_status` = 'ENEBLED' AND +`usr`.`user_status` = 'ENEBLED' AND +`usr`.`user_type` IN ('WEB', 'BOTH') AND +`hr`.`human_resource_status` = 'ENEBLED' +ORDER BY `user_name`; +-- ------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_SECURITY_AUTHENTICATION_MOBILE` (USER) +-- +CREATE OR REPLACE VIEW `APC_SECURITY_AUTHENTICATION_MOBILE` AS +SELECT +`usr`.`id` AS `id`, +`usr`.`user_name` AS `user_name`, +`usr`.`pwd` AS `pwd`, +`hr`.`avatar` AS `avatar`, +`ubo`.`id_office` AS `id_office`, +`hrhr`.`id_route` AS `id_route`, +`usr`.`certifier` AS `certifier` +FROM `APC_USER_BY_OFFICE` `ubo` +INNER JOIN `APC_USER` `usr` ON `ubo`.`id_user` = `usr`.`id` +INNER JOIN `APC_HUMAN_RESOURCE` `hr` ON `usr`.`id_human_resource` = `hr`.`id` +INNER JOIN `APC_HUMAN_RESOURCE_HAS_ROUTE` `hrhr` ON `hr`.`id` = `hrhr`.`id_human_resource` +WHERE +`usr`.`user_status` = 'ENEBLED' AND +`usr`.`user_type` IN ('MOBILE', 'BOTH') AND +`ubo`.`user_by_office_status` = 'ENEBLED' AND +`hr`.`human_resource_status` = 'ENEBLED'; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_LOAN_BY_USER_VIEW` (USER) +-- Se utiliza para que un Asesor cargue todos los pretamos que tiene +-- que cobrar en el día actual. +-- +CREATE OR REPLACE VIEW `APC_LOAN_BY_USER_VIEW` AS +SELECT + CONCAT(l.id, u.id) AS id, + u.id AS user_id, + CONCAT( + CASE + WHEN cstmr.first_name IS NOT NULL AND cstmr.first_name != '' + THEN CONCAT(SUBSTR(UPPER(cstmr.first_name), 1, 1),SUBSTR(LOWER(cstmr.first_name), 2), ' ') + ELSE '' + END, + CASE + WHEN cstmr.second_name IS NOT NULL AND cstmr.second_name != '' + THEN CONCAT(SUBSTR(UPPER(cstmr.second_name), 1, 1),SUBSTR(LOWER(cstmr.second_name), 2), ' ') + ELSE '' + END, + CASE + WHEN cstmr.last_name IS NOT NULL AND cstmr.last_name != '' + THEN CONCAT(SUBSTR(UPPER(cstmr.last_name), 1, 1),SUBSTR(LOWER(cstmr.last_name), 2)) + ELSE '' + END + ) AS customer_name, + (CASE + WHEN cstmr.address_home IS NULL THEN '' + ELSE cstmr.address_home + END) AS customer_address_home, + (CASE + WHEN cstmr.address_business IS NULL THEN '' + ELSE cstmr.address_business + END) AS customer_address_business, + (CASE + WHEN cstmr.company_name IS NULL THEN '' + ELSE cstmr.company_name + END) AS company_name, + (CASE + WHEN cstmr.thumbnail IS NULL THEN '' + ELSE cstmr.thumbnail + END) AS customer_thumbnail, + CONCAT( + CASE + WHEN ndrsmnt.first_name IS NOT NULL AND ndrsmnt.first_name != '' + THEN CONCAT(SUBSTR(UPPER(ndrsmnt.first_name), 1, 1),SUBSTR(LOWER(ndrsmnt.first_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ndrsmnt.second_name IS NOT NULL AND ndrsmnt.second_name != '' + THEN CONCAT(SUBSTR(UPPER(ndrsmnt.second_name), 1, 1),SUBSTR(LOWER(ndrsmnt.second_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ndrsmnt.last_name IS NOT NULL AND ndrsmnt.last_name != '' + THEN CONCAT(SUBSTR(UPPER(ndrsmnt.last_name), 1, 1),SUBSTR(LOWER(ndrsmnt.last_name), 2)) + ELSE '' + END + )AS endorsement_name, + (CASE + WHEN ndrsmnt.address_home IS NULL THEN '' + ELSE ndrsmnt.address_home + END) AS endorsement_address_home, + (CASE + WHEN ndrsmnt.thumbnail IS NULL THEN '' + ELSE ndrsmnt.thumbnail + END) AS endorsement_thumbnail, + (CASE + WHEN ndrsmnt.phone_home IS NULL THEN '' + ELSE ndrsmnt.phone_home + END) AS endorsement_phone_home, + IF((l.amount_to_pay - l.amount_paid >= lt.payment_daily), lt.payment_daily, l.amount_to_pay - l.amount_paid) AS payment_daily, + lt.loan_fee, + lbu.order_in_list, + (SELECT count(notification_number) FROM APC_LOAN_FEE_NOTIFICATION WHERE id_loan = l.id) AS notification_number, +IF( + ( + l.amount_paid >= (SELECT FLOOR(lt.payment_total * .6364) FROM DUAL) + ), + CASE + WHEN + (SELECT count(notification_number) as total + FROM APC_LOAN_FEE_NOTIFICATION + WHERE id_loan = l.id + ) < 4 + THEN 'ENEBLED' + WHEN + (SELECT count(notification_number) as total + FROM APC_LOAN_FEE_NOTIFICATION + WHERE id_loan = l.id + ) BETWEEN 4 AND 5 + AND + lt.payment > 1000 + THEN 'ENEBLED' + ELSE 'DISABLED' + END + ,'DISABLED' +) as renovation, +(SELECT amount_to_pay - amount_paid FROM APC_LOAN WHERE id = l.id) AS max_amount_to_pay +FROM APC_LOAN_BY_USER lbu +INNER JOIN APC_LOAN l ON lbu.id_loan = l.id +INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +INNER JOIN APC_PEOPLE cstmr ON l.id_customer = cstmr.id +INNER JOIN APC_PEOPLE ndrsmnt ON l.id_endorsement = ndrsmnt.id +INNER JOIN APC_USER u ON lbu.id_user = u.id +WHERE + l.loan_status = 'APPROVED' AND + l.id = ( + CASE + -- WHEN IS NEW AND update created_on less equals to currentdate + WHEN ( + (SELECT count(id) FROM APC_LOAN_DETAIL WHERE id_loan = l.id ) = 0 AND + DATE(l.last_updated_on) < curdate() + ) THEN l.id + -- WHEN LOAN HAS PAYMENTS + WHEN ( + ( + SELECT count(id) + FROM APC_LOAN_DETAIL + WHERE + id_loan = l.id AND + reference_number = l.last_reference_number AND + DATE(created_on) < curdate() + ) > 0 AND + DATE(l.last_updated_on) < curdate() + ) THEN l.id + ELSE '' + END + ) AND + lbu.owner_loan = 'CURRENT_OWNER'; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_LOAN_BY_USER_ORDER_PREFERENCE_VIEW` (USER) +-- Se utiliza para que un Asesor cargue todos los pretamos que tiene +-- que cobrar en el día actual y los pueda order por order de preferencia +-- para que pueda programar suta a su gusto. +-- +CREATE OR REPLACE VIEW `APC_LOAN_BY_USER_ORDER_PREFERENCE_VIEW` AS +SELECT + CONCAT(l.id, u.id) AS id, + u.id AS user_id, + CONCAT(cstmr.first_name,' ',IF(ISNULL(cstmr.second_name) ,'', CONCAT(cstmr.second_name, ' ')),cstmr.last_name,' ', cstmr.middle_name) AS customer_name, + cstmr.address_home AS customer_address_home, + cstmr.address_business AS customer_address_business, + lbu.order_in_list +FROM APC_LOAN_BY_USER lbu +INNER JOIN APC_LOAN l ON lbu.id_loan = l.id +INNER JOIN APC_PEOPLE cstmr ON l.id_customer = cstmr.id +INNER JOIN APC_USER u ON lbu.id_user = u.id +WHERE l.loan_status = 'APPROVED'; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_PERSON_SEARCH_VIEW` +-- Se utiliza para realizar busqueda por nombre. +-- +CREATE OR REPLACE VIEW `APC_PERSON_SEARCH_VIEW` AS +SELECT + id, + CONCAT( + CASE + WHEN first_name IS NOT NULL AND first_name != '' + THEN CONCAT(SUBSTR(UPPER(first_name), 1, 1),SUBSTR(LOWER(first_name), 2)) + ELSE '' + END, + CASE + WHEN second_name IS NOT NULL AND second_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(second_name), 1, 1),SUBSTR(LOWER(second_name), 2)) + ELSE '' + END, + CASE + WHEN last_name IS NOT NULL AND last_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(last_name), 1, 1),SUBSTR(LOWER(last_name), 2)) + ELSE '' + END, + CASE + WHEN middle_name IS NOT NULL AND middle_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(middle_name), 1, 1),SUBSTR(LOWER(middle_name), 2)) + ELSE '' + END + ) AS person_search +FROM APC_PEOPLE +WHERE active_status = 'ENEBLED' +ORDER BY person_search; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_PERSON_SEARCH_DETAIL_VIEW` +-- Busca los detalles de una persona en el sistema. +CREATE OR REPLACE VIEW `APC_PERSON_SEARCH_DETAIL_VIEW` AS +SELECT + p.id AS id, + CONCAT( + CASE + WHEN p.first_name IS NOT NULL AND p.first_name != '' + THEN CONCAT(SUBSTR(UPPER(p.first_name), 1, 1),SUBSTR(LOWER(p.first_name), 2), ' ') + ELSE '' + END, + CASE + WHEN p.second_name IS NOT NULL AND p.second_name != '' + THEN CONCAT(SUBSTR(UPPER(p.second_name), 1, 1),SUBSTR(LOWER(p.second_name), 2), ' ') + ELSE '' + END, + CASE + WHEN p.last_name IS NOT NULL AND p.last_name != '' + THEN CONCAT(SUBSTR(UPPER(p.last_name), 1, 1),SUBSTR(LOWER(p.last_name), 2), ' ') + ELSE '' + END, + CASE + WHEN p.middle_name IS NOT NULL AND p.middle_name != '' + THEN CONCAT(SUBSTR(UPPER(p.middle_name), 1, 1),SUBSTR(LOWER(p.middle_name), 2)) + ELSE '' + END + ) AS person_search, + p.thumbnail, + CASE + WHEN + 0 < ( + SELECT COUNT(ID) + FROM APC_LOAN + WHERE + id_customer = p.id AND + loan_status = 'APPROVED') + THEN + 'ENEBLED' + WHEN + 0 < ( + SELECT COUNT(ID) + FROM APC_LOAN + WHERE + id_endorsement = p.id AND + loan_status = 'APPROVED') + THEN + 'ENEBLED' + ELSE + 'DISABLED' + END AS loanStatus +FROM APC_PEOPLE p; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_PERSON_SEARCH_HISTORICAL_DETAILS_VIEW` +-- Busca los detalles historicos de una persona en el sistema móvil. +CREATE OR REPLACE VIEW `APC_PERSON_SEARCH_HISTORICAL_DETAILS_VIEW` AS +SELECT + l.id, + p.id AS id_person_search, + DATE_FORMAT(l.created_on,'%d-%m-%Y') AS format_date, + CASE + WHEN 0 < (SELECT COUNT(ID) FROM APC_LOAN WHERE id_customer = p.id) + THEN 'Cliente' + WHEN 0 < (SELECT COUNT(ID) FROM APC_LOAN WHERE id_endorsement = p.id) + THEN 'Aval' + ELSE + 'Indeterminado' + END AS person_type, + CASE + WHEN 0 < (SELECT COUNT(ID) FROM APC_LOAN WHERE id_customer = p.id) + THEN + (SELECT CONCAT(in_p.first_name,' ', in_p.last_name) + FROM APC_LOAN in_l + INNER JOIN APC_PEOPLE in_p ON in_l.id_endorsement = in_p.id + WHERE in_l.id = l.id) + WHEN 0 < (SELECT COUNT(ID) FROM APC_LOAN WHERE id_endorsement = p.id) + THEN (SELECT CONCAT(in_p.first_name,' ', in_p.last_name) + FROM APC_LOAN in_l + INNER JOIN APC_PEOPLE in_p ON in_l.id_customer = in_p.id + WHERE in_l.id = l.id) + ELSE + 'Indeterminado' + END AS relationship, + lt.payment AS loan, + CASE + WHEN l.loan_status = 'APPROVED' + THEN CONCAT(l.last_reference_number, ' de 22') + ELSE '' + END AS payment_number, + CASE + WHEN l.loan_status = 'APPROVED' + THEN (l.amount_to_pay - l.amount_paid) + ELSE 0 + END AS amount_to_pay, + (SELECT COUNT(id) FROM APC_LOAN_FEE_NOTIFICATION WHERE id_loan = l.id) AS total_fees, + CASE + WHEN l.loan_status = 'PENDING' + THEN 'Pendiente' + WHEN l.loan_status = 'FINISH' + THEN 'Terminado' + WHEN l.loan_status = 'BLACK_LIST' + THEN 'Lista negra' + WHEN l.loan_status = 'APPROVED' + THEN 'Activo' + WHEN l.loan_status = 'REJECTED' + THEN 'Rechazado' + WHEN l.loan_status = 'PENDING_RENOVATION' + THEN 'Pendiente renovación' + WHEN l.loan_status = 'TO_DELIVERY' + THEN 'Por recibir' + END AS loan_status +FROM APC_LOAN l +INNER JOIN APC_PEOPLE p ON (l.id_customer = p.id or l.id_endorsement = p.id) +INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +ORDER BY l.created_on DESC; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_AVAILABLE_CUSTOMERS_VIEW` +-- +-- Sirve para cargar todos los posibles clientes de una oficina +-- que puedan solicitar un prestamo nuevo. +-- +CREATE OR REPLACE VIEW `APC_AVAILABLE_CUSTOMERS_VIEW` AS +SELECT + p.id, + CONCAT(p.first_name,' ', IF(ISNULL(p.second_name) ,'', CONCAT(p.second_name,' ')) ,p.last_name, ' ', p.middle_name) AS available_person, + CASE + WHEN p.people_type = 'BOTH' + THEN + CASE + WHEN 0 < (SELECT COUNT(id) FROM APC_LOAN WHERE id_customer = p.id) + THEN (SELECT id_endorsement FROM APC_LOAN WHERE id_customer = p.id ORDER BY created_on DESC LIMIT 1 ) + ELSE '' + END + ELSE '' + END as cross_signature +FROM APC_PEOPLE p +WHERE + p.people_type IN ('CUSTOMER', 'BOTH') AND + p.active_status = 'ENEBLED' AND + CASE + WHEN 0 = ( + SELECT COUNT(id) + FROM APC_LOAN + WHERE + id_customer = p.id AND + loan_status IN ('PENDING', 'BLACK_LIST', 'APPROVED', 'PENDING_RENOVATION', 'TO_DELIVERY') + ) + THEN TRUE + ELSE FALSE + END +ORDER BY available_person; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_AVAILABLE_ENDORSEMENT_VIEW` +-- +-- Sirve para cargar todos los posibles avales de una oficina +-- que puedan solicitar un prestamo nuevo. +-- +CREATE OR REPLACE VIEW `APC_AVAILABLE_ENDORSEMENTS_VIEW` AS +SELECT + p.id, + CONCAT(p.first_name,' ', IF(ISNULL(p.second_name) ,'', CONCAT(p.second_name,' ')) ,p.last_name, ' ', p.middle_name) AS available_person, + CASE + WHEN p.people_type = 'BOTH' + THEN + CASE + WHEN 0 < (SELECT COUNT(id) FROM APC_LOAN WHERE id_endorsement = p.id) + THEN (SELECT id_customer FROM APC_LOAN WHERE id_endorsement = p.id ORDER BY created_on DESC LIMIT 1 ) + ELSE '' + END + ELSE '' + END as cross_signature +FROM APC_PEOPLE p +WHERE + p.people_type IN ('ENDORSEMENT', 'BOTH') AND + p.active_status = 'ENEBLED' AND + CASE + WHEN 0 = ( + SELECT COUNT(id) + FROM APC_LOAN + WHERE + id_endorsement = p.id AND + loan_status IN ('PENDING', 'BLACK_LIST', 'APPROVED', 'PENDING_RENOVATION', 'TO_DELIVERY') + ) + THEN TRUE + ELSE FALSE + END +ORDER BY available_person; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_CASH_REGISTER_CURDATE_BY_USER_VIEW` +-- +-- Sirve para obtener todos los pagos que recabo un asesor en el día. +-- +CREATE OR REPLACE VIEW `APC_CASH_REGISTER_CURDATE_BY_USER_VIEW` AS +SELECT + UUID() AS id, + lt.payment_amount AS payment, + CONCAT(p.first_name, ' ', p.last_name) AS customer_name, + lt.id_user AS id_user +FROM APC_LOAN_DETAIL lt +INNER JOIN APC_LOAN l ON lt.id_loan = l.id +INNER JOIN APC_PEOPLE p ON l.id_customer = p.id +WHERE + lt.loan_details_type = 'PAYMENT' AND + DATE(lt.created_on) = CURDATE() +ORDER BY lt.created_on; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_LOAN_TO_DELIVERY_BY_CERTIFIER_VIEW` +-- +-- Sirve para obtener todos los prestamos que un certificador tiene que entregar. +-- +CREATE OR REPLACE VIEW `APC_LOAN_TO_DELIVERY_BY_CERTIFIER_VIEW` AS +SELECT + l.id AS id_loan, + u.id AS id_user, + -- u.user_name, + -- hrhr.id_route, + -- l.loan_status, + CONCAT( + CASE + WHEN p.first_name IS NOT NULL + THEN CONCAT(SUBSTR(UPPER(p.first_name), 1, 1),SUBSTR(LOWER(p.first_name), 2)) + ELSE '' + END, + CASE + WHEN p.second_name IS NOT NULL + THEN CONCAT(' ',SUBSTR(UPPER(p.second_name), 1, 1),SUBSTR(LOWER(p.second_name), 2)) + ELSE '' + END, + CASE + WHEN p.last_name IS NOT NULL + THEN CONCAT(' ',SUBSTR(UPPER(p.last_name), 1, 1),SUBSTR(LOWER(p.last_name), 2)) + ELSE '' + END + ) AS customer_name, + CASE + WHEN p.address_business IS NOT NULL + THEN CONCAT(SUBSTR(UPPER(p.address_business), 1, 1),SUBSTR(LOWER(p.address_business), 2)) + ELSE '' + END AS customer_address, + p.thumbnail AS thumbnail, + CASE + WHEN (SELECT COUNT(id_loan_new) FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id) > 0 + THEN 'star' + ELSE 'new' + END AS icon, + CASE + WHEN (SELECT COUNT(id_loan_new) FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id) > 0 + THEN + CASE + WHEN -- (SELECT amount_to_pay - amount_paid FROM APC_LOAN WHERE id = l.id) > (lt.payment_daily * 2) + (SELECT innerL.amount_to_pay - innerL.amount_paid FROM APC_LOAN innerL + INNER JOIN APC_LOAN_TYPE innerLT ON innerL.id_loan_type = innerLT.id + WHERE innerL.id = (SELECT id_loan_old FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id)) + > + (SELECT innerLT.payment_daily FROM APC_LOAN innerL + INNER JOIN APC_LOAN_TYPE innerLT ON innerL.id_loan_type = innerLT.id + WHERE innerL.id = (SELECT id_loan_old FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id)) + THEN + CASE + WHEN + (SELECT (innerL.amount_to_pay - innerL.amount_paid) - (innerLT.payment_daily * 2) FROM APC_LOAN innerL + INNER JOIN APC_LOAN_TYPE innerLT ON innerL.id_loan_type = innerLT.id + WHERE innerL.id = (SELECT id_loan_old FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id)) > 0 + THEN + lt.payment - + (lt.opening_fee + + -- ((l.amount_to_pay - l.amount_paid) - (lt.payment_daily * 2)) + (SELECT (innerL.amount_to_pay - innerL.amount_paid) - (innerLT.payment_daily * 2) FROM APC_LOAN innerL + INNER JOIN APC_LOAN_TYPE innerLT ON innerL.id_loan_type = innerLT.id + WHERE innerL.id = (SELECT id_loan_old FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id))) + ELSE + lt.payment - + (lt.opening_fee + + -- ((l.amount_to_pay - l.amount_paid) - (lt.payment_daily * 2)) + (SELECT (innerLT.payment_daily * 2) - (innerL.amount_to_pay - innerL.amount_paid) FROM APC_LOAN innerL + INNER JOIN APC_LOAN_TYPE innerLT ON innerL.id_loan_type = innerLT.id + WHERE innerL.id = (SELECT id_loan_old FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id))) + END + ELSE lt.payment - lt.opening_fee + END + ELSE lt.payment - lt.opening_fee + END AS amount_to_delivery, + CASE + WHEN (SELECT COUNT(id_loan_new) FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id) > 0 + THEN + CASE + WHEN -- (SELECT amount_to_pay - amount_paid FROM APC_LOAN WHERE id = l.id) > (lt.payment_daily * 2) + (SELECT innerL.amount_to_pay - innerL.amount_paid FROM APC_LOAN innerL + INNER JOIN APC_LOAN_TYPE innerLT ON innerL.id_loan_type = innerLT.id + WHERE innerL.id = (SELECT id_loan_old FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id)) + > + (SELECT innerLT.payment_daily FROM APC_LOAN innerL + INNER JOIN APC_LOAN_TYPE innerLT ON innerL.id_loan_type = innerLT.id + WHERE innerL.id = (SELECT id_loan_old FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id)) + THEN -- ((l.amount_to_pay - l.amount_paid) - (lt.payment_daily * 2)) + CASE + WHEN + (SELECT (innerL.amount_to_pay - innerL.amount_paid) - (innerLT.payment_daily * 2) FROM APC_LOAN innerL + INNER JOIN APC_LOAN_TYPE innerLT ON innerL.id_loan_type = innerLT.id + WHERE innerL.id = (SELECT id_loan_old FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id)) + > 0 + THEN + (SELECT (innerL.amount_to_pay - innerL.amount_paid) - (innerLT.payment_daily * 2) FROM APC_LOAN innerL + INNER JOIN APC_LOAN_TYPE innerLT ON innerL.id_loan_type = innerLT.id + WHERE innerL.id = (SELECT id_loan_old FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id)) + ELSE + (SELECT (innerLT.payment_daily * 2) -(innerL.amount_to_pay - innerL.amount_paid) FROM APC_LOAN innerL + INNER JOIN APC_LOAN_TYPE innerLT ON innerL.id_loan_type = innerLT.id + WHERE innerL.id = (SELECT id_loan_old FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id)) + END + ELSE 0 + END + ELSE 0 + END AS discount, + lt.opening_fee AS opening, + lt.payment AS payment +FROM + APC_USER u + INNER JOIN APC_HUMAN_RESOURCE_HAS_ROUTE hrhr ON u.id_human_resource = hrhr.id_human_resource + INNER JOIN APC_HUMAN_RESOURCE hr ON hrhr.id_human_resource = hr.id + INNER JOIN APC_ROLE r ON hr.id_role = r.id + INNER JOIN APC_LOAN l ON hrhr.id_route = l.id_route + INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id + INNER JOIN APC_PEOPLE p ON l.id_customer = p.id +WHERE + u.certifier = 'ENEBLED' AND + l.loan_status = 'TO_DELIVERY' AND + DATE(l.created_on) <= CURDATE() +ORDER BY customer_name DESC; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_EXCHANGE_ENEBLED_USERS_VIEW` +-- +-- Sirve para obtener todos los usuarios disponibles para realizar traspasos. +-- +CREATE OR REPLACE VIEW `APC_EXCHANGE_ENEBLED_USERS_VIEW` AS +SELECT +u.id AS id_user, +CONCAT(hr.first_name, ' ', IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name,' ')), hr.second_name, ' ', hr.last_name) AS user_name, +hrbo.id_office AS id_office +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON u.id_human_resource = hr.id +INNER JOIN APC_HUMAN_RESOURCE_BY_OFFICE hrbo ON hr.id = hrbo.id_human_resource +WHERE u.user_status = 'ENEBLED' and +u.user_type IN ('MOBILE','BOTH'); +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_TOTAL_CASH_BY_CURDATE_VIEW` +-- +-- Sirve para obtener lo que tiene que entregar el asesor al final del día. +-- +CREATE OR REPLACE VIEW `APC_TOTAL_CASH_BY_CURDATE_VIEW` AS +SELECT + u.id, + ubo.id_office, + IF( + (SELECT COUNT(id) FROM APC_CLOSING_DAY WHERE id_user = u.id AND id_office = ubo.id_office AND active_status = 'ENEBLED' AND DATE(created_on) = CURDATE()) = 0 + ,(SELECT IF(ISNULL(SUM(ld.payment_amount)),0, SUM(ld.payment_amount)) + FROM APC_LOAN_DETAIL ld + WHERE + ld.id_user = u.id AND + ld.loan_details_type = 'PAYMENT' AND + DATE(ld.created_on) = CURDATE() + ) + ,0.0 + )AS total_amount_payment, + IF( + (SELECT COUNT(id) FROM APC_CLOSING_DAY WHERE id_user = u.id AND id_office = ubo.id_office AND active_status = 'ENEBLED' AND DATE(created_on) = CURDATE()) = 0 + ,(SELECT IF(ISNULL(SUM(ld.payment_amount)),0, SUM(ld.payment_amount)) + FROM APC_LOAN_DETAIL ld + WHERE + ld.id_user = u.id AND + ld.loan_details_type = 'TRANSFER' AND + DATE(ld.created_on) = CURDATE() + ) + ,0.0 + )AS total_amount_deposit, + IF( + (SELECT COUNT(id) FROM APC_CLOSING_DAY WHERE id_user = u.id AND id_office = ubo.id_office AND active_status = 'ENEBLED' AND DATE(created_on) = CURDATE()) = 0 + ,(SELECT IF(ISNULL(SUM(amount_to_transfer)),0, SUM(amount_to_transfer)) + FROM APC_TRANSFER + WHERE + id_user_transmitter = u.id AND + action_status = 'APPROVED' AND + active_status = 'ENEBLED' AND + DATE(last_updated_on) = CURDATE() + ) + ,0.0 + ) AS transfer_sender, + IF( + (SELECT COUNT(id) FROM APC_CLOSING_DAY WHERE id_user = u.id AND id_office = ubo.id_office AND active_status = 'ENEBLED' AND DATE(created_on) = CURDATE()) = 0 + ,(SELECT IF(ISNULL(SUM(amount_to_transfer)),0, SUM(amount_to_transfer)) + FROM APC_TRANSFER + WHERE + id_user_receiver = u.id AND + action_status = 'APPROVED' AND + active_status = 'ENEBLED' AND + DATE(last_updated_on) = CURDATE() + ) + ,0.0 + ) AS transfer_receiver, + IF( + (SELECT COUNT(id) FROM APC_CLOSING_DAY WHERE id_user = u.id AND id_office = ubo.id_office AND active_status = 'ENEBLED' AND DATE(created_on) = CURDATE()) = 0 + ,(SELECT IF(ISNULL(SUM(amount)),0, SUM(amount)) + FROM APC_MONEY_DAILY + WHERE + id_user = u.id AND + DATE(money_daily_date) = CURDATE() + ) + ,0.0 + ) AS money_daily, + IF( + (SELECT COUNT(id) FROM APC_CLOSING_DAY WHERE id_user = u.id AND id_office = ubo.id_office AND active_status = 'ENEBLED' AND DATE(created_on) = CURDATE()) = 0 + ,(SELECT IF(ISNULL(SUM(expense)),0, SUM(expense)) + FROM APC_OTHER_EXPENSE + WHERE + id_user = u.id AND + DATE(created_on) = CURDATE() + ) + ,0.0 + )AS other_expense, + IF( + (SELECT COUNT(id) FROM APC_CLOSING_DAY WHERE id_user = u.id AND id_office = ubo.id_office AND active_status = 'ENEBLED' AND DATE(created_on) = CURDATE()) = 0 + ,(SELECT IF(ISNULL(SUM(amount)),0, SUM(amount)) + FROM APC_DELIVERY + WHERE + id_user = u.id AND + DATE(created_on) = CURDATE() + ) + , 0.0 + ) as delivery, + IF( + (SELECT COUNT(id) FROM APC_CLOSING_DAY WHERE id_user = u.id AND id_office = ubo.id_office AND active_status = 'ENEBLED' AND DATE(created_on) = CURDATE()) = 0 + ,(SELECT IF(ISNULL(SUM(amount_to_transfer)),0, SUM(amount_to_transfer)) + FROM APC_TRANSFER + WHERE + id_user_receiver = u.id AND + action_status = 'PENDING' AND + active_status = 'ENEBLED' AND + DATE(created_on) = CURDATE() + ) + ,0.0 + ) AS transfer_pending +FROM APC_USER u +JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE + u.user_status = 'ENEBLED'; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_TOTAL_LOANS_BY_OFFICE` +-- +-- +CREATE OR REPLACE VIEW `APC_TOTAL_LOANS_BY_OFFICE` AS +SELECT + l.id, + l.loan_status, + r.id_office, + r.route_name, + l.id_route, + l.amount_to_pay, + l.amount_paid + FROM + APC_LOAN l + JOIN + APC_ROUTE r ON r.id = l.id_route + WHERE + l.loan_status in ('PENDING', 'FINISH', 'APPROVED','REJECTED','TO_DELIVERY') + AND r.active_status = 'ENEBLED'; +-- -------------------------------------------------------------------- +-- Estructura para la vista `APC_TOTAL_CLOSING_DAY_BY_CURDATE_VIEW` +-- +-- Sirve para obtener lo que tiene que entregar el asesor al final del día. +-- +CREATE OR REPLACE VIEW `APC_TOTAL_CLOSING_DAY_BY_CURDATE_VIEW` AS +SELECT + u.id, + u.id_office, + u.amount_paid +FROM APC_CLOSING_DAY u +WHERE + u.active_status = 'ENEBLED' AND + DATE(u.created_on) = CURDATE(); +-- -------------------------------------------------------------------- +-- Estructura para la vista `APC_CLOSING_DAILY_DETAIL_FROM_USER_BY_CURDATE_VIEW` +-- +-- Sirve para obtener los detalles del total de los cobros realizados por los asesores +-- estos pueden ser tanto pagos como multas. +-- +CREATE OR REPLACE VIEW `APC_CLOSING_DAILY_DETAIL_FROM_USER_BY_CURDATE_VIEW` AS +SELECT + ld.id, + CONCAT(p.first_name,' ',IF(ISNULL(p.second_name) ,'', CONCAT(p.second_name, ' ')),p.last_name,' ', p.middle_name) AS comments, + ld.payment_amount as amount, + CASE + WHEN ld.loan_details_type = 'PAYMENT' THEN 'Abono' + WHEN ld.loan_details_type = 'FEE' THEN 'Multa' + WHEN ld.loan_details_type = 'TRANSFER' THEN 'Depósito' + ELSE '' END as type, + ld.id_user, + ld.created_on, + l.created_on as fechaFiltro, + 'xxxx' as route, + (l.amount_to_pay - amount_paid) as saldo +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON ld.id_loan = l.id +INNER JOIN APC_PEOPLE p ON l.id_customer = p.id +WHERE DATE(ld.created_on) = CURDATE() +AND ld.loan_details_type in ('PAYMENT', 'FEE', 'TRANSFER' ) +UNION +SELECT + md.id, + DATE(md.money_daily_date) AS comments, + md.amount as amount, + 'Inicio' as type, + md.id_user, + md.created_on, + CURDATE() as fechaFiltro, + 'xxxx' as route, + 0 as saldo +FROM + APC_MONEY_DAILY md +WHERE DATE(md.money_daily_date) = CURDATE() +UNION +SELECT + oe.id, + oe.description, + oe.expense, + 'Gasto', + oe.id_user, + oe.created_on, + CURDATE() as fechaFiltro, + 'xxxx' as route, + 0 as saldo +FROM + APC_OTHER_EXPENSE oe +WHERE DATE(oe.created_on) = CURDATE() +UNION +SELECT + te.id, + CONCAT(hr.first_name,' ',IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name, ' ')),hr.last_name,' ', hr.middle_name), + te.amount_to_transfer, + 'Transferencia enviada', + te.id_user_transmitter, + te.created_on, + CURDATE() as fechaFiltro, + 'xxxx' as route, + 0 as saldo +FROM + APC_TRANSFER te +JOIN + APC_USER u on u.id = te.id_user_receiver +JOIN + APC_HUMAN_RESOURCE hr on hr.id = u.id_human_resource +WHERE DATE(te.created_on) = CURDATE() +UNION +SELECT + tr.id, + CONCAT(hr.first_name,' ',IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name, ' ')),hr.last_name,' ', hr.middle_name), + tr.amount_to_transfer, + 'Transferencia recibida', + tr.id_user_receiver, + tr.created_on, + CURDATE() as fechaFiltro, + 'xxxx' as route, + 0 as saldo +FROM + APC_TRANSFER tr +JOIN + APC_USER u on u.id = tr.id_user_transmitter +JOIN + APC_HUMAN_RESOURCE hr on hr.id = u.id_human_resource +WHERE DATE(tr.created_on) = CURDATE() +UNION +SELECT + d.id, + CONCAT(p.first_name,' ',IF(ISNULL(p.second_name) ,'', CONCAT(p.second_name, ' ')),p.last_name,' ', p.middle_name, ' - ', + r.route_name , ', Abono préstamo anterior : ', Case WHEN (SELECT CASE WHEN ld.payment_amount is null or 0 THEN 0 ELSE ld.payment_amount END FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l3 ON ld.id_loan = l3.id +WHERE ld.loan_details_type = 'RENOVATION_PAYMENT' +AND l3.id = (SELECT albr.id_loan_old FROM APC_LOAN_BY_RENOVATION albr WHERE albr.id_loan_new = l.id)) is null then 0 else (SELECT CASE WHEN ld.payment_amount is null or 0 THEN 0 ELSE ld.payment_amount END FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l3 ON ld.id_loan = l3.id +WHERE ld.loan_details_type = 'RENOVATION_PAYMENT' +AND l3.id = (SELECT albr.id_loan_old FROM APC_LOAN_BY_RENOVATION albr WHERE albr.id_loan_new = l.id)) end , ', Comisión por apertura: ', lt.opening_fee), + d.amount, + 'Entrega de préstamo', + d.id_user, + d.created_on, + CURDATE() as fechaFiltro, + r.route_name as route, + CASE WHEN (SELECT (l2.amount_to_pay - l2.amount_paid) FROM APC_LOAN_BY_RENOVATION lr + INNER JOIN APC_LOAN l2 ON l2.id = lr.id_loan_old + WHERE lr.id_loan_new = l.id) is null THEN 0 ELSE + (SELECT (l2.amount_to_pay - l2.amount_paid) FROM APC_LOAN_BY_RENOVATION lr + INNER JOIN APC_LOAN l2 ON l2.id = lr.id_loan_old + WHERE lr.id_loan_new = l.id) END as saldo +FROM APC_DELIVERY d +INNER JOIN APC_LOAN l ON d.id_loan = l.id +INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +INNER JOIN APC_PEOPLE p ON l.id_customer = p.id +INNER JOIN APC_ROUTE r ON r.id = l.id_route +WHERE DATE(d.created_on) = CURDATE(); +-- -------------------------------------------------------------------- +-- Estructura para la vista `APC_LOAN_APPROVED_DETAIL_VIEW` +-- +-- Sirve para obtener los detalles del total de los prestamos que estan +-- en estatus de APROBADO. +-- +CREATE OR REPLACE VIEW `APC_LOAN_APPROVED_DETAIL_VIEW` AS +SELECT + l.id, + l.amount_to_pay - l.amount_paid AS total_to_pay, + l.amount_to_pay - (l.amount_paid + (SELECT IF(ISNULL(SUM(payment_amount)),0,SUM(payment_amount)) FROM APC_LOAN_DETAIL WHERE id_loan = l.id AND loan_details_type = 'FEE')) AS loan_amount_to_pay, + ( + SELECT + IF(ISNULL(SUM(payment_amount)),0,SUM(payment_amount)) + FROM APC_LOAN_DETAIL + WHERE + id_loan = l.id AND + loan_details_type = 'FEE' + )AS total_fee +FROM APC_LOAN l +WHERE l.loan_status = 'APPROVED'; +-- -------------------------------------------------------------------- +-- Estructura para la vista `APC_GENERAL_BOX_VIEW` +-- +CREATE OR REPLACE VIEW `APC_GENERAL_BOX_VIEW` AS +SELECT + md.id, + CONCAT(hr.first_name,' ',IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name, ' ')),hr.last_name,' ', hr.middle_name) AS comments, + Date(md.money_daily_date) as fecha, + md.amount as amount, + md.id_office as office, + 'Inicio' as type +FROM APC_MONEY_DAILY md +JOIN + APC_USER u on u.id = md.id_user +JOIN + APC_HUMAN_RESOURCE hr on hr.id = u.id_human_resource +UNION +SELECT + cd.id, + CONCAT(hr.first_name,' ',IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name, ' ')),hr.last_name,' ', hr.middle_name) AS comments, + Date(cd.created_on), + cd.amount_paid, + cd.id_office, + 'Corte del día' +FROM APC_CLOSING_DAY cd +JOIN + APC_USER u on u.id = cd.id_user +JOIN + APC_HUMAN_RESOURCE hr on hr.id = u.id_human_resource +WHERE cd.active_status = 'ENEBLED' +UNION +SELECT + ecin.id, + ecin.description, + date(ecin.created_on), + ecin.amount, + ecin.id_office, + 'Entrada' +FROM APC_EXPENSE_COMPANY as ecin +WHERE ecin.expense_company_type = 'PAYMENT_IN' +AND ecin.active_status = 'ENEBLED' +UNION +SELECT + ecin.id, + ecin.description, + date(ecin.created_on), + ecin.amount, + ecin.id_office, + 'Salida' +FROM APC_EXPENSE_COMPANY as ecin +WHERE ecin.expense_company_type = 'PAYMENT_OUT' +AND ecin.active_status = 'ENEBLED' +UNION +SELECT + a.id, + CONCAT(hr.first_name,' ',IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name, ' ')),hr.last_name,' ', hr.middle_name) AS comments, + date(a.created_on), + a.amount, + a.id_office, + 'Adelanto' +FROM + APC_ADVANCE a +JOIN + APC_HUMAN_RESOURCE hr on hr.id = a.id_human_resource +WHERE + a.active_status = 'ENEBLED' +UNION +SELECT + pay.id, + CONCAT(hr.first_name,' ',IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name, ' ')),hr.last_name,' ', hr.middle_name) AS comments, + date(pay.created_on), + pay.total_payment, + pay.id_office, + 'Nomina' +FROM + APC_PAYROLL pay +JOIN + APC_HUMAN_RESOURCE hr on hr.id = pay.id_human_resource +WHERE + pay.active_status = 'ENEBLED'; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_LOAN` +-- +-- MODUFY COLUMN loan_status +-- +ALTER TABLE APC_LOAN +MODIFY COLUMN `loan_status` ENUM('PENDING', 'FINISH','BLACK_LIST', 'APPROVED','REJECTED', 'PENDING_RENOVATION', 'TO_DELIVERY', 'DELETED') NOT NULL DEFAULT 'PENDING'; + +ALTER TABLE APC_LOAN_BY_USER +MODIFY COLUMN `loan_by_user_status` ENUM('PENDING', 'FINISH','BLACK_LIST', 'APPROVED','REJECTED', 'PENDING_RENOVATION', 'TO_DELIVERY', 'DELETED') NOT NULL DEFAULT 'PENDING'; + +-- +-- Estructura para la vista `APC_LOAN_BY_USER_PAYMENT_ZERO_VIEW` +-- +-- Total de abonos en ceros por dia. +-- +CREATE OR REPLACE VIEW `APC_LOAN_BY_USER_PAYMENT_ZERO_VIEW` AS +SELECT + ald.id, + ald.id_user, + al.id_customer, + ald.loan_comments +FROM APC_LOAN_DETAIL ald +INNER JOIN APC_LOAN al ON ald.id_loan = al.id +WHERE + DATE(ald.created_on) = CURDATE() + AND ald.payment_amount = 0 + AND al.loan_status != 'DELETED' + AND ald.loan_details_type = 'PAYMENT'; +-- +-- Estructura para la tabla `APC_PAYROLL` +-- +-- Totales de la caja de APC. +-- +CREATE TABLE `APC_PAYROLL`( + `id` char(36) NOT NULL, + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `id_office` char(36) NOT NULL, + `id_human_resource` char(36) NOT NULL, + `salary` numeric(8,2) NOT NULL, + `imss` numeric(8,2) NOT NULL, + `advance` numeric(8,2) NOT NULL, + `total_bonus_new_customer` numeric(8,2) NOT NULL, + `total_bonus_colocation` numeric(8,2) NOT NULL, + `total_bonus_mora` numeric(8,2) NOT NULL, + `discounts` numeric(8,2) NOT NULL, + `increases` numeric(8,2) NOT NULL, + `total_payment` numeric(8,2) NOT NULL, + `total_days_salary` smallint NOT NULL DEFAULT 5, + `total_days_bonus` smallint NOT NULL DEFAULT 5, + `comments_discounts` varchar(200), + `comments_increases` varchar(200), + `observation` varchar(200), + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_payroll_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_payroll_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_payroll_to_apc_human_resource_fk` + FOREIGN KEY (`id_human_resource`) REFERENCES `APC_HUMAN_RESOURCE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +CREATE OR REPLACE VIEW `APC_ADVANCE_USER_DAILY_VIEW` AS +SELECT + ate.id, + CONCAT(ahr.first_name, ' ' , ahr.last_name) as user_name, + ate.total_expected, + (ate.total_expected - (SELECT COUNT(id) FROM APC_LOAN_BY_USER_VIEW where user_id = ate.id_user)) as total_now, + CASE WHEN (ate.total_expected - (SELECT COUNT(id) FROM APC_LOAN_BY_USER_VIEW where user_id = ate.id_user)) = 0 + THEN 0 + ELSE + ((ate.total_expected - (SELECT COUNT(id) FROM APC_LOAN_BY_USER_VIEW where user_id = ate.id_user)) * 100) / ate.total_expected + END + as porcentaje, + ate.id_office, + ate.id_user, + (SELECT IF(ISNULL(SUM(ate2.total_expected_payment)),0,SUM(ate2.total_expected_payment)) FROM APC_TOTAL_EXPECTED_PAYMENT_DAILY_BY_USER ate2 + where WEEK(DATE(ate2.created_on),1) = (Select WEEK(CURDATE(),1)) and YEAR(DATE(ate2.created_on)) = (SELECT YEAR(CURDATE())) AND ate2.id_user = ate.id_user) + as total_expected_week, + (SELECT IF(ISNULL(SUM(ald.payment_amount)),0,SUM(ald.payment_amount)) FROM APC_LOAN_DETAIL ald + where WEEK(Date(ald.created_on),1) = (Select WEEK(CURDATE(),1)) and YEAR(Date(ald.created_on)) = (SELECT YEAR(CURDATE())) AND ald.id_user = ate.id_user + AND ald.loan_details_type IN ('PAYMENT', 'RENOVATION_PAYMENT', 'TRANSFER')) + as total_reported_week, + (SELECT IF(ISNULL(SUM(ailwv.faltante)),0,SUM(ailwv.faltante)) FROM APC_INFORMATION_LOAN_WEEK_VIEW ailwv + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = ailwv.id + WHERE albu.id_user = ate.id_user) as faltante, + (SELECT IF(ISNULL(SUM(ald.payment_amount)),0,SUM(ald.payment_amount)) + FROM APC_LOAN_DETAIL ald + INNER JOIN APC_LOAN al ON ald.id_loan = al.id + INNER JOIN APC_LOAN_BY_USER albu ON al.id = albu.id_loan + where WEEK(Date(ald.created_on),1) = (Select WEEK(CURDATE(),1)) and YEAR(Date(ald.created_on)) = (SELECT YEAR(CURDATE())) + AND ald.loan_details_type IN ('RENOVATION_PAYMENT') AND albu.id_user = ate.id_user) as total_reported_renovation_week, + (SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) + FROM APC_LOAN al + INNER JOIN APC_LOAN_BY_USER albu ON al.id = albu.id_loan + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + WHERE albu.id_user = ate.id_user AND al.loan_status = 'APPROVED' AND + WEEK(Date(al.created_on),1) = (Select WEEK(CURDATE(),1)) and YEAR(Date(al.created_on)) = (SELECT YEAR(CURDATE())) + ) as total_comision_fee, + (SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = ate.id_user + AND WEEK(DATE(al.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(Date(al.created_on)) = (SELECT YEAR(CURDATE()))) + as colocation_approved, + (SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'TO_DELIVERY' AND albu.id_user = ate.id_user + AND WEEK(DATE(al.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(Date(al.created_on)) = (SELECT YEAR(CURDATE()))) + as colocation_to_delivery +FROM + APC_TOTAL_EXPECTED_PAYMENT_DAILY_BY_USER ate +INNER JOIN APC_USER au ON au.id = ate.id_user +INNER JOIN APC_HUMAN_RESOURCE ahr ON ahr.id = au.id_human_resource +WHERE + DATE(ate.created_on) = CURDATE() + AND ate.active_status = 'ENEBLED'; + +CREATE OR REPLACE VIEW `APC_CUSTOMERS_WITHOUT_RENOVATION_VIEW` AS +SELECT + p.id, + CONCAT(p.first_name,' ', IF(ISNULL(p.second_name) ,'', CONCAT(p.second_name,' ')) ,p.last_name, ' ', p.middle_name) AS available_person, + ar.route_name, + (SELECT MAX(l.created_on) FROM APC_LOAN l WHERE l.id_customer = p.id) as last_loan, + p.id_office +FROM APC_PEOPLE p +INNER JOIN APC_ROUTE ar ON ar.id = p.id_route +WHERE + p.people_type IN ('CUSTOMER', 'BOTH') AND + p.active_status = 'ENEBLED' AND + (SELECT COUNT(l.id) FROM APC_LOAN l WHERE l.id_customer = p.id) > 0 AND + CASE + WHEN 0 = ( + SELECT COUNT(id) + FROM APC_LOAN + WHERE + id_customer = p.id AND + loan_status IN ('PENDING', 'BLACK_LIST', 'APPROVED', 'PENDING_RENOVATION', 'TO_DELIVERY') + ) + THEN TRUE + ELSE FALSE + END +ORDER BY available_person; + +CREATE OR REPLACE VIEW `APC_ADVANCE_USER_DAILY_DETAIL_VIEW` AS +SELECT +ald.id, +ald.id_user, +CONCAT(ap.first_name, + ' ', + ap.last_name) AS customer_name, +ald.payment_amount, +ald.created_on, +ap.address_business, +CASE + WHEN ald.loan_details_type = 'PAYMENT' THEN 'Abono' + WHEN ald.loan_details_type = 'FEE' THEN 'Multa' + WHEN ald.loan_details_type = 'TRANSFER' THEN 'Depósito' + ELSE '' END as type_ayment +FROM APC_LOAN_DETAIL ald +INNER JOIN APC_LOAN al ON al.id = ald.id_loan +INNER JOIN APC_PEOPLE ap ON ap.id = al.id_customer +WHERE DATE(ald.created_on) = CURDATE() AND +al.loan_status != 'DELETED' AND +ald.loan_details_type IN ('PAYMENT','FEE','TRANSFER') +UNION +SELECT +id, +user_id, +customer_name, +'Sin visita', +CURDATE(), +customer_address_business, +'Sin visita' +FROM APC_LOAN_BY_USER_VIEW; + +CREATE TABLE `APC_CLOSING_DAY_DETAIL`( + `id` char(36) NOT NULL, + `id_closing_day` char(36) NOT NULL, + `comments` varchar(200) NOT NULL, + `amount` numeric(8,2) NOT NULL, + `type` varchar(200) NOT NULL, + `dateDetail` datetime, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_closing_day_detail_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_closing_day_detail_to_apc_closing_day_fk` + FOREIGN KEY (`id_closing_day`) REFERENCES `APC_CLOSING_DAY`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +CREATE OR REPLACE VIEW `APC_TOTAL_LOANS_APPROVED_BY_OFFICE` AS +SELECT + l.id, + l.loan_status, + r.id_office, + r.payment_daily + FROM + APC_LOAN l + JOIN + APC_LOAN_TYPE r ON r.id = l.id_loan_type + WHERE + l.loan_status in ('APPROVED'); + +CREATE OR REPLACE VIEW `APC_TOTAL_CASH_BY_CURDATE_DASHBOARD_VIEW` AS +SELECT + u.id, + ubo.id_office, + (SELECT IF(ISNULL(SUM(ld.payment_amount)),0, SUM(ld.payment_amount)) + FROM APC_LOAN_DETAIL ld + WHERE + ld.id_user = u.id AND + ld.loan_details_type = 'PAYMENT' AND + DATE(ld.created_on) = CURDATE() + + )AS total_amount_payment, + (SELECT IF(ISNULL(SUM(ld.payment_amount)),0, SUM(ld.payment_amount)) + FROM APC_LOAN_DETAIL ld + WHERE + ld.id_user = u.id AND + ld.loan_details_type = 'TRANSFER' AND + DATE(ld.created_on) = CURDATE() + + )AS total_amount_deposit, + (SELECT IF(ISNULL(SUM(amount_to_transfer)),0, SUM(amount_to_transfer)) + FROM APC_TRANSFER + WHERE + id_user_transmitter = u.id AND + action_status = 'APPROVED' AND + active_status = 'ENEBLED' AND + DATE(last_updated_on) = CURDATE() + )AS transfer_sender, + (SELECT IF(ISNULL(SUM(amount_to_transfer)),0, SUM(amount_to_transfer)) + FROM APC_TRANSFER + WHERE + id_user_receiver = u.id AND + action_status = 'APPROVED' AND + active_status = 'ENEBLED' AND + DATE(last_updated_on) = CURDATE() + ) AS transfer_receiver, + (SELECT IF(ISNULL(SUM(amount)),0, SUM(amount)) + FROM APC_MONEY_DAILY + WHERE + id_user = u.id AND + DATE(money_daily_date) = CURDATE() + ) AS money_daily, + (SELECT IF(ISNULL(SUM(expense)),0, SUM(expense)) + FROM APC_OTHER_EXPENSE + WHERE + id_user = u.id AND + DATE(created_on) = CURDATE() + ) AS other_expense, + (SELECT IF(ISNULL(SUM(amount)),0, SUM(amount)) + FROM APC_DELIVERY + WHERE + id_user = u.id AND + DATE(created_on) = CURDATE() + ) as delivery, + (SELECT IF(ISNULL(SUM(amount_to_transfer)),0, SUM(amount_to_transfer)) + FROM APC_TRANSFER + WHERE + id_user_receiver = u.id AND + action_status = 'PENDING' AND + active_status = 'ENEBLED' AND + DATE(created_on) = CURDATE() + ) AS transfer_pending +FROM APC_USER u +JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE + u.user_status = 'ENEBLED'; + +CREATE OR REPLACE VIEW `APC_MONEY_DAILY_BY_USER_CERTIFIER_VIEW` AS +SELECT + u.id, + u.user_name, + uo.id_office, + CONCAT(hr.first_name, ' ' , hr.last_name) as employee, + (SELECT SUM(ldc.amount_to_delivery) FROM APC_LOAN_TO_DELIVERY_BY_CERTIFIER_VIEW ldc + WHERE ldc.id_user = u.id) as amount +FROM + APC_USER u +INNER JOIN + APC_USER_BY_OFFICE uo ON u.id = uo.id_user +INNER JOIN + APC_HUMAN_RESOURCE hr ON u.id_human_resource = hr.id +WHERE + u.user_status = 'ENEBLED' +AND + u.certifier = 'ENEBLED'; +-- -------------------------------------------------------- +-- +-- Alter table to `APC_LOAN_DETAIL` +-- +-- Add new loan details status to save transfer payments. +-- +ALTER TABLE APC_LOAN_DETAIL +MODIFY COLUMN `loan_details_type` ENUM('CREDIT_PAYMENT', 'DEBIT_PAYMENT', 'PAYMENT', 'FEE','RENOVATION_PAYMENT', 'TRANSFER') NOT NULL; + +ALTER TABLE APC_TOTAL_EXPECTED_PAYMENT_DAILY_BY_USER +ADD COLUMN `total_expected_payment` numeric(8,2) default null; + +CREATE OR REPLACE VIEW `APC_INFORMATION_LOAN_WEEK_VIEW` AS +SELECT +l.id, +u.id as id_user, +r.id_office, +l.created_on as fecha, +lt.payment as apoyos, +lt.payment_total as apoyos_total, +lt.opening_fee as comision_apertura, +CONCAT(endor.first_name,' ', IF(ISNULL(endor.second_name) ,'', CONCAT(endor.second_name,' ')) ,endor.last_name, ' ', endor.middle_name) AS aval, +CONCAT(cus.first_name,' ', IF(ISNULL(cus.second_name) ,'', CONCAT(cus.second_name,' ')) ,cus.last_name, ' ', cus.middle_name) AS customer, +l.amount_to_pay as documento_por, +lt.payment_daily as abono_diario, +l.amount_paid, +(l.amount_to_pay - l.amount_paid) saldo_insoluto, +r.route_name, +CONCAT(hr.first_name,' ', IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name,' ')) ,hr.last_name, ' ', hr.middle_name) AS asesor, +(SELECT COUNT(lfn.id) FROM APC_LOAN_FEE_NOTIFICATION lfn WHERE lfn.id_loan = l.id) as num_fee, +-- Lunes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'monday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_monday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'monday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_monday, +-- Martes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'tuesday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_tuesday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'tuesday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_tuesday, +-- Miercoles +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) +AND YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'wednesday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_wednesday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'wednesday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_wednesday, +-- Jueves +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'thursday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_thursday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'thursday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_thursday, +-- Viernes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'friday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_friday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'friday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_friday, +-- Sabado +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'saturday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_saturday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'saturday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_saturday, + +((lt.payment_daily * (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) > 5, 5 , COUNT(DISTINCT(DATE(ldFaltante.created_on)))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE'))) +- (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) as faltante, + +CASE WHEN l.new_customer = 'ENEBLED' THEN 'Si' ELSE 'No' END as new_customer, +if((SELECT COUNT(id_loan_old) FROM APC_LOAN_BY_RENOVATION lbr +INNER JOIN APC_LOAN lRenovation ON lbr.id_loan_new = lRenovation.id +WHERE id_loan_old = l.id + AND loan_by_renovation_status = 'APPROVED' and WEEK(DATE(lRenovation.created_on),1) <= WEEK(CURDATE(),1) AND + YEAR(DATE(lRenovation.created_on)) = YEAR(CURDATE())) = 0 , 'No' , 'Si') as renovation, +l.loan_status as estatus_prestamo, +(SELECT COUNT(DISTINCT(DATE(ldFaltante.created_on))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) <= (WEEK(CURDATE(),1)) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE')) as num_pagos_all, +(SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) > 5, 5, COUNT(DISTINCT(DATE(ldFaltante.created_on)))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE')) as num_pagos_week, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) <= (WEEK(CURDATE(),1)) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('FEE')) as fee_todos +FROM +APC_LOAN l +INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +INNER JOIN APC_PEOPLE cus ON cus.id = l.id_customer +INNER JOIN APC_PEOPLE endor ON endor.id = l.id_endorsement +INNER JOIN APC_ROUTE r ON r.id = l.id_route +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +INNER JOIN APC_USER u ON u.id = lbu.id_user +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +WHERE +l.loan_status not in ('DELETED','REJECTED') AND +(SELECT COUNT(ld.id) FROM APC_LOAN_DETAIL ld WHERE WEEK(DATE(ld.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.id_loan = l.id) > 0; +-- -------------------------------------------------------- +-- +-- Estructura para la vista `APC_USER_BY_ROUTE_VIEW` +-- +-- Se utiliza para identificar a los usuarios por rutas. +-- +CREATE OR REPLACE VIEW `APC_USER_BY_ROUTE_VIEW` AS +SELECT +CONCAT(u.id,hrhr.id_route) AS id, +u.id AS id_user, +hrhr.id_route AS id_route, + CONCAT( + CASE + WHEN hr.first_name IS NOT NULL AND hr.first_name != '' + THEN CONCAT(SUBSTR(UPPER(hr.first_name), 1, 1),SUBSTR(LOWER(hr.first_name), 2)) + ELSE '' + END, + CASE + WHEN hr.second_name IS NOT NULL AND hr.second_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(hr.second_name), 1, 1),SUBSTR(LOWER(hr.second_name), 2)) + ELSE '' + END, + CASE + WHEN hr.last_name IS NOT NULL AND hr.last_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(hr.last_name), 1, 1),SUBSTR(LOWER(hr.last_name), 2)) + ELSE '' + END, + CASE + WHEN hr.middle_name IS NOT NULL AND hr.middle_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(hr.middle_name), 1, 1),SUBSTR(LOWER(hr.middle_name), 2)) + ELSE '' + END + ) AS employee_name +FROM APC_HUMAN_RESOURCE_HAS_ROUTE hrhr +INNER JOIN APC_HUMAN_RESOURCE hr ON hrhr.id_human_resource = hr.id +INNER JOIN APC_USER u ON hr.id = u.id_human_resource +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE','BOTH') +ORDER BY employee_name; + +CREATE OR REPLACE VIEW `APC_LOAN_DIFERENCES_BY_USER_LAST_WEEK_VIEW` AS +SELECT +l.id, +lbu.id_user, +((lt.payment_daily * 5) - (SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +WHERE ld.id_loan = l.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) +AND YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) + as faltante +FROM + APC_LOAN l +INNER JOIN + APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +INNER JOIN + APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE +l.loan_status not in ('DELETED','REJECTED') AND +(SELECT COUNT(ld2.id) FROM APC_LOAN_DETAIL ld2 WHERE WEEK(DATE(ld2.created_on),1) = (WEEK(CURDATE(),1)-1) +AND YEAR(DATE(ld2.created_on)) = YEAR(CURDATE()) AND ld2.id_loan = l.id) > 4; + +CREATE OR REPLACE VIEW `APC_INFORMATION_LOAN_LAST_WEEK_VIEW` AS +SELECT +l.id, +u.id as id_user, +r.id_office, +l.created_on as fecha, +lt.payment as apoyos, +lt.payment_total as apoyos_total, +lt.opening_fee as comision_apertura, +CONCAT(endor.first_name,' ', IF(ISNULL(endor.second_name) ,'', CONCAT(endor.second_name,' ')) ,endor.last_name, ' ', endor.middle_name) AS aval, +CONCAT(cus.first_name,' ', IF(ISNULL(cus.second_name) ,'', CONCAT(cus.second_name,' ')) ,cus.last_name, ' ', cus.middle_name) AS customer, +l.amount_to_pay as documento_por, +lt.payment_daily as abono_diario, +l.amount_paid, +(l.amount_to_pay - l.amount_paid) saldo_insoluto, +r.route_name, +CONCAT(hr.first_name,' ', IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name,' ')) ,hr.last_name, ' ', hr.middle_name) AS asesor, +(SELECT COUNT(lfn.id) FROM APC_LOAN_FEE_NOTIFICATION lfn WHERE lfn.id_loan = l.id) as num_fee, +-- Lunes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'monday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_monday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'monday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_monday, +-- Martes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'tuesday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_tuesday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'tuesday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_tuesday, +-- Miercoles +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'wednesday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_wednesday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'wednesday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_wednesday, +-- Jueves +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'thursday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_thursday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'thursday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_thursday, +-- Viernes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'friday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_friday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'friday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_friday, +-- Sabado +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'saturday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_saturday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'saturday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_saturday, + +((lt.payment_daily * (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) > 5, 5, COUNT(DISTINCT(DATE(ldFaltante.created_on)))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE'))) +- (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) as faltante, + +CASE WHEN l.new_customer = 'ENEBLED' THEN 'Si' ELSE 'No' END as new_customer, +(SELECT IF(COUNT(id_loan_old) = 0 , 'No' , 'Si') FROM APC_LOAN_BY_RENOVATION lbr +INNER JOIN APC_LOAN lRenovation ON lbr.id_loan_new = lRenovation.id +WHERE id_loan_old = l.id + AND loan_by_renovation_status = 'APPROVED' and WEEK(DATE(lRenovation.created_on),1) <= (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(lRenovation.created_on)) = YEAR(CURDATE())) as renovation, +l.loan_status as estatus_prestamo, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as abono_semana_actual, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('FEE')) as fee_semana_actual, +(SELECT COUNT(DISTINCT(DATE(ldFaltante.created_on))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) <= (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE')) as num_pagos_all, +(SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) > 5, 5, COUNT(DISTINCT(DATE(ldFaltante.created_on)))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE')) as num_pagos_week, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) <= (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('FEE')) as fee_todos +FROM +APC_LOAN l +INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +INNER JOIN APC_PEOPLE cus ON cus.id = l.id_customer +INNER JOIN APC_PEOPLE endor ON endor.id = l.id_endorsement +INNER JOIN APC_ROUTE r ON r.id = l.id_route +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +INNER JOIN APC_USER u ON u.id = lbu.id_user +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +WHERE +l.loan_status not in ('DELETED','REJECTED') AND +(SELECT COUNT(ld.id) FROM APC_LOAN_DETAIL ld WHERE WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) +AND YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.id_loan = l.id) > 0; + +CREATE OR REPLACE VIEW `APC_COLOCATION_WEEK_BY_USER_VIEW` AS +SELECT +u.id, +CONCAT(hr.first_name, ' ' , hr.last_name) as username, +ubo.id_office, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'monday') + as colocation_monday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'tuesday') + as colocation_tuesday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'wednesday') + as colocation_wednesday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'thursday') + as colocation_thursday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'friday') + as colocation_friday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'saturday') + as colocation_saturday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE())) + as colocation_total +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE') AND +u.certifier = 'DISABLED'; + +CREATE OR REPLACE VIEW `APC_COLOCATION_LAST_WEEK_BY_USER_VIEW` AS +SELECT +u.id, +CONCAT(hr.first_name, ' ' , hr.last_name) as username, +ubo.id_office, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'monday') + as colocation_monday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'tuesday') + as colocation_tuesday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'wednesday') + as colocation_wednesday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'thursday') + as colocation_thursday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'friday') + as colocation_friday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'saturday') + as colocation_saturday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE())) + as colocation_total +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE') AND +u.certifier = 'DISABLED'; + + +CREATE OR REPLACE VIEW `APC_SUBTOTAL_LAST_WEEK_BY_USER_VIEW` AS +SELECT +u.id, +CONCAT(hr.first_name, ' ' , hr.last_name) as username, +ubo.id_office, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'monday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_monday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'monday') + as opening_fee_monday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'tuesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_tuesday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'tuesday') + as opening_fee_tuesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'wednesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_wednesday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'wednesday') + as opening_fee_wednesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'thursday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_thursday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'thursday') + as opening_fee_thursday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'friday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_friday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'friday') + as opening_fee_friday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'saturday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_saturday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'saturday') + as opening_fee_saturday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_total, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) ) + as opening_fee_total +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE') AND +u.certifier = 'DISABLED'; + +CREATE OR REPLACE VIEW `APC_SUBTOTAL_WEEK_BY_USER_VIEW` AS +SELECT +u.id, +CONCAT(hr.first_name, ' ' , hr.last_name) as username, +ubo.id_office, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'monday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_monday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'monday') + as opening_fee_monday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'tuesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_tuesday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'tuesday') + as opening_fee_tuesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'wednesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_wednesday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'wednesday') + as opening_fee_wednesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'thursday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_thursday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'thursday') + as opening_fee_thursday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'friday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_friday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'friday') + as opening_fee_friday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'saturday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_saturday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'saturday') + as opening_fee_saturday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_total, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) ) + as opening_fee_total +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE') AND +u.certifier = 'DISABLED'; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_CURRENT_CUSTOMER_BY_LOAN_VIEW` +-- SIRVE PARA TRAER LOS PRESTAMOS CON SUS CLIENTES, AVALES Y ASESORES. +-- +-- -------------------------------------------------------------------- +CREATE OR REPLACE VIEW `APC_CURRENT_CUSTOMER_BY_LOAN_VIEW` AS +SELECT +loan.id AS id_loan, +usr.id AS id_user, +usr_by_office.id_office AS id_office, +loan_type.payment AS payment, +CONCAT( + CASE + WHEN customer.first_name IS NOT NULL AND customer.first_name != '' + THEN CONCAT(SUBSTR(UPPER(customer.first_name), 1, 1),SUBSTR(LOWER(customer.first_name), 2)) + ELSE '' + END, + CASE + WHEN customer.second_name IS NOT NULL AND customer.second_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(customer.second_name), 1, 1),SUBSTR(LOWER(customer.second_name), 2)) + ELSE '' + END, + CASE + WHEN customer.last_name IS NOT NULL AND customer.last_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(customer.last_name), 1, 1),SUBSTR(LOWER(customer.last_name), 2)) + ELSE '' + END, + CASE + WHEN customer.middle_name IS NOT NULL AND customer.middle_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(customer.middle_name), 1, 1),SUBSTR(LOWER(customer.middle_name), 2)) + ELSE '' + END + ) AS customer_name, + CONCAT( + CASE + WHEN endorsement.first_name IS NOT NULL AND endorsement.first_name != '' + THEN CONCAT(SUBSTR(UPPER(endorsement.first_name), 1, 1),SUBSTR(LOWER(endorsement.first_name), 2)) + ELSE '' + END, + CASE + WHEN endorsement.second_name IS NOT NULL AND endorsement.second_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(endorsement.second_name), 1, 1),SUBSTR(LOWER(endorsement.second_name), 2)) + ELSE '' + END, + CASE + WHEN endorsement.last_name IS NOT NULL AND endorsement.last_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(endorsement.last_name), 1, 1),SUBSTR(LOWER(endorsement.last_name), 2)) + ELSE '' + END, + CASE + WHEN endorsement.middle_name IS NOT NULL AND endorsement.middle_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(endorsement.middle_name), 1, 1),SUBSTR(LOWER(endorsement.middle_name), 2)) + ELSE '' + END + ) AS endorsement_name, + loan.loan_status AS loan_status, + loan.created_on AS created_on, + route.route_name AS route_name +FROM APC_LOAN loan +INNER JOIN APC_PEOPLE customer ON loan.id_customer = customer.id +INNER JOIN APC_PEOPLE endorsement ON loan.id_endorsement = endorsement.id +INNER JOIN APC_LOAN_TYPE loan_type ON loan.id_loan_type = loan_type.id +INNER JOIN APC_LOAN_BY_USER loan_by_user ON loan.id = loan_by_user.id_loan +INNER JOIN APC_USER usr ON loan_by_user.id_user = usr.id +INNER JOIN APC_USER_BY_OFFICE usr_by_office ON usr.id = usr_by_office.id_user +INNER JOIN APC_ROUTE route ON loan.id_route = route.id +WHERE loan.loan_status IN('APPROVED','PENDING','PENDING_RENOVATION','TO_DELIVERY') +ORDER BY usr.id, loan.created_on; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_AVAILABLES_OWNERS_VIEW` +-- REGRESA LOS USUARIOS ACTIVOS DE TIPO MOBILE AND BOTH. +-- +-- -------------------------------------------------------------------- +CREATE OR REPLACE VIEW `APC_AVAILABLES_OWNERS_VIEW` AS +SELECT +usr.id AS id_user, +usr_by_office.id_office AS id_office, +usr.user_name AS user_name, +CONCAT( + CASE + WHEN human_resource.first_name IS NOT NULL AND human_resource.first_name != '' + THEN CONCAT(SUBSTR(UPPER(human_resource.first_name), 1, 1),SUBSTR(LOWER(human_resource.first_name), 2)) + ELSE '' + END, + CASE + WHEN human_resource.second_name IS NOT NULL AND human_resource.second_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(human_resource.second_name), 1, 1),SUBSTR(LOWER(human_resource.second_name), 2)) + ELSE '' + END, + CASE + WHEN human_resource.last_name IS NOT NULL AND human_resource.last_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(human_resource.last_name), 1, 1),SUBSTR(LOWER(human_resource.last_name), 2)) + ELSE '' + END, + CASE + WHEN human_resource.middle_name IS NOT NULL AND human_resource.middle_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(human_resource.middle_name), 1, 1),SUBSTR(LOWER(human_resource.middle_name), 2)) + ELSE '' + END + ) AS full_name +FROM APC_USER usr +INNER JOIN APC_HUMAN_RESOURCE human_resource ON usr.id_human_resource = human_resource.id +INNER JOIN APC_USER_BY_OFFICE usr_by_office ON usr.id = usr_by_office.id_user +WHERE usr.user_status = 'ENEBLED' AND +usr.user_type IN ('MOBILE','BOTH') AND +usr.certifier = 'DISABLED'; + +CREATE OR REPLACE VIEW `APC_COBRANZA_LAST_WEEK_BY_USER_VIEW` AS +SELECT +u.id, +CONCAT(hr.first_name, ' ' , hr.last_name) as username, +ubo.id_office, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' AND ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'monday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_monday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'tuesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_tuesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'wednesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_wednesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'thursday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_thursday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'friday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_friday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'saturday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_saturday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_total +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE') AND +u.certifier = 'DISABLED'; + +CREATE OR REPLACE VIEW `APC_COBRANZA_WEEK_BY_USER_VIEW` AS +SELECT +u.id, +CONCAT(hr.first_name, ' ' , hr.last_name) as username, +ubo.id_office, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' AND ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'monday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_monday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'tuesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_tuesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'wednesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_wednesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'thursday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_thursday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'friday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_friday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'saturday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_saturday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_total +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE') AND +u.certifier = 'DISABLED'; + +CREATE OR REPLACE VIEW `APC_ADVANCE_USER_DAILY_DASHBOARD_VIEW` AS +SELECT + ate.id, + CONCAT(ahr.first_name, ' ' , ahr.last_name) as user_name, + ate.total_expected, + (ate.total_expected - (SELECT COUNT(id) FROM APC_LOAN_BY_USER_VIEW where user_id = ate.id_user)) as total_now, + CASE WHEN (ate.total_expected - (SELECT COUNT(id) FROM APC_LOAN_BY_USER_VIEW where user_id = ate.id_user)) = 0 + THEN 0 + ELSE + ((ate.total_expected - (SELECT COUNT(id) FROM APC_LOAN_BY_USER_VIEW where user_id = ate.id_user)) * 100) / ate.total_expected + END + as porcentaje, + ate.id_office, + ate.id_user, + (SELECT IF(ISNULL(SUM(ate2.total_expected_payment)),0,SUM(ate2.total_expected_payment)) FROM APC_TOTAL_EXPECTED_PAYMENT_DAILY_BY_USER ate2 + where WEEK(DATE(ate2.created_on),1) = (Select WEEK(CURDATE(),1)) and YEAR(DATE(ate2.created_on)) = (SELECT YEAR(CURDATE())) AND ate2.id_user = ate.id_user) + as total_expected_week, + (SELECT IF(ISNULL(SUM(ald.payment_amount)),0,SUM(ald.payment_amount)) FROM APC_LOAN_DETAIL ald + where WEEK(Date(ald.created_on),1) = (Select WEEK(CURDATE(),1)) and YEAR(Date(ald.created_on)) = (SELECT YEAR(CURDATE())) AND ald.id_user = ate.id_user + AND ald.loan_details_type IN ('PAYMENT', 'RENOVATION_PAYMENT', 'TRANSFER')) + as total_reported_week, +( + select + IF(ISNULL( + SUM( + CASE WHEN l.loan_status IN ('PENDING_RENOVATION', 'FINISH') then 0 ELSE + ((lt.payment_daily * (SELECT COUNT(ldFaltante.id) FROM APC_LOAN_DETAIL ldFaltante + WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) + AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE'))) + - (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) + FROM APC_LOAN_DETAIL ldLunes + WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) + AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) END + ) + ),0, + SUM( + CASE WHEN l.loan_status IN ('PENDING_RENOVATION', 'FINISH') then 0 ELSE + ((lt.payment_daily * (SELECT COUNT(ldFaltante.id) FROM APC_LOAN_DETAIL ldFaltante + WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) + AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE'))) + - (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) + FROM APC_LOAN_DETAIL ldLunes + WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) + AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) END + ) + ) + as faltante + + FROM + APC_LOAN l + INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id + INNER JOIN APC_LOAN_BY_USER albu ON l.id = albu.id_loan + WHERE albu.id_user = ate.id_user + AND albu.owner_loan = 'CURRENT_OWNER' + +) +as faltante, + (SELECT IF(ISNULL(SUM(ald.payment_amount)),0,SUM(ald.payment_amount)) + FROM APC_LOAN_DETAIL ald + INNER JOIN APC_LOAN al ON ald.id_loan = al.id + INNER JOIN APC_LOAN_BY_USER albu ON al.id = albu.id_loan + where WEEK(Date(ald.created_on),1) = (Select WEEK(CURDATE(),1)) and YEAR(Date(ald.created_on)) = (SELECT YEAR(CURDATE())) + AND ald.loan_details_type IN ('RENOVATION_PAYMENT') AND albu.id_user = ate.id_user) as total_reported_renovation_week, + (SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) + FROM APC_LOAN al + INNER JOIN APC_LOAN_BY_USER albu ON al.id = albu.id_loan + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + WHERE albu.id_user = ate.id_user AND al.loan_status = 'APPROVED' AND + WEEK(Date(al.created_on),1) = (Select WEEK(CURDATE(),1)) and YEAR(Date(al.created_on)) = (SELECT YEAR(CURDATE())) + ) as total_comision_fee, + (SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = ate.id_user + AND WEEK(DATE(al.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(Date(al.created_on)) = (SELECT YEAR(CURDATE()))) + as colocation_approved, + (SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'TO_DELIVERY' AND al.created_by = ate.id_user + AND WEEK(DATE(al.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(Date(al.created_on)) = (SELECT YEAR(CURDATE()))) + as colocation_to_delivery +FROM + APC_TOTAL_EXPECTED_PAYMENT_DAILY_BY_USER ate +INNER JOIN APC_USER au ON au.id = ate.id_user +INNER JOIN APC_HUMAN_RESOURCE ahr ON ahr.id = au.id_human_resource +WHERE + DATE(ate.created_on) = CURDATE() + AND ate.active_status = 'ENEBLED'; + +CREATE OR REPLACE VIEW `APC_SUBTOTAL_LAST_WEEK_BY_USER_VIEW` AS +SELECT +u.id, +CONCAT(hr.first_name, ' ' , hr.last_name) as username, +ubo.id_office, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'monday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_monday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'monday') + as opening_fee_monday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'tuesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_tuesday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'tuesday') + as opening_fee_tuesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'wednesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_wednesday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'wednesday') + as opening_fee_wednesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'thursday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_thursday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'thursday') + as opening_fee_thursday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'friday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_friday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'friday') + as opening_fee_friday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'saturday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_saturday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'saturday') + as opening_fee_saturday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_total, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) ) + as opening_fee_total, +( + select + IF(ISNULL( + SUM( + CASE WHEN l.loan_status IN ('PENDING_RENOVATION', 'FINISH') then 0 ELSE + ((lt.payment_daily * (SELECT COUNT(ldFaltante.id) FROM APC_LOAN_DETAIL ldFaltante + WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) + AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE'))) + - (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) + FROM APC_LOAN_DETAIL ldLunes + WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) + AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) END + ) + ),0, + SUM( + CASE WHEN l.loan_status IN ('PENDING_RENOVATION', 'FINISH') then 0 ELSE + ((lt.payment_daily * (SELECT COUNT(ldFaltante.id) FROM APC_LOAN_DETAIL ldFaltante + WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) + AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE'))) + - (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) + FROM APC_LOAN_DETAIL ldLunes + WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) + AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) END + ) + ) + as faltante + + FROM + APC_LOAN l + INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id + INNER JOIN APC_LOAN_BY_USER albu ON l.id = albu.id_loan + WHERE albu.id_user = u.id + AND albu.owner_loan = 'CURRENT_OWNER' + +) +as faltante +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE') AND +u.certifier = 'DISABLED'; + +-- -------------------------------------------------------------------- +-- +-- Estructura para la tabla `APC_STABLE_GENERAL_BOX` +-- +-- Totales de la caja de APC. +-- +CREATE TABLE `APC_STABLE_SMALL_BOX`( + `id` char(36) NOT NULL, + `total_small_box` numeric(8,2) NOT NULL, + `total_envelope` numeric(8,2) NOT NULL, + `total_bank_note` numeric(8,2) NOT NULL, + `total_coin` numeric(8,2) NOT NULL, + `total_stable` numeric(8,2) NOT NULL, + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `description` varchar(200), + `id_office` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_stable_small_box_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_stable_small_box_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +ALTER TABLE APC_LOAN_TYPE +ADD COLUMN `convenio` ENUM('ENEBLED','DISABLED') DEFAULT 'DISABLED' +AFTER `payment_sunday`; + +CREATE TABLE `APC_BITACORA`( + `id` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `comments_user` varchar(300) NOT NULL, + `action` varchar(50) NOT NULL, + `description` varchar(300) NOT NULL, + `name_user` varchar(200) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_bitacora_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_bitacora_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +CREATE OR REPLACE VIEW APC_HISTORY_LOAN_VIEW AS +SELECT +l.id, +CONCAT(pc.first_name, ' ', pc.last_name) customerName, +CONCAT(pa.first_name, ' ', pa.last_name) endorsementName, +r.route_name routeName, +o.office_name officeName, +lt.payment montoPrestado, +l.amount_to_pay montoAPagar, +l.amount_paid montoPagado, +(l.amount_to_pay - l.amount_paid) saldoInsoluto, +(SELECT count(lfn.id) FROM APC_LOAN_FEE_NOTIFICATION lfn WHERE lfn.id_loan = l.id) numMultas, +CASE WHEN l.loan_status = 'PENDING' THEN 'Pendiente' +WHEN l.loan_status = 'FINISH' THEN 'Terminado' +WHEN l.loan_status = 'APPROVED' THEN 'Aprobado' +WHEN l.loan_status = 'REJECTED' THEN 'Rechazado' +WHEN l.loan_status = 'PENDING_RENOVATION' THEN 'Pendiente de renovación' +WHEN l.loan_status = 'TO_DELIVERY' THEN 'Por liberar' +END as estatusPrestamo, +DATE(l.created_on) as fecha, +u.user_name nombreUsuario +FROM +APC_LOAN l +INNER JOIN APC_PEOPLE pc ON l.id_customer = pc.id +INNER JOIN APC_PEOPLE pa ON l.id_endorsement = pa.id +INNER JOIN APC_ROUTE r ON l.id_route = r.id +INNER JOIN APC_OFFICE o ON r.id_office = o.id +INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +INNER JOIN APC_USER u ON u.id = lbu.id_user +WHERE l.loan_status NOT IN ('DELETED') +ORDER BY l.created_on DESC +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_STATS_FEES_VIEW` +-- +CREATE OR REPLACE VIEW APC_FEES_VIEW AS +SELECT +LD.ID, +LD.id_user, +CONCAT(HR.first_name, ' ', HR.last_name) AS name, +LD.payment_amount AS total_fees, +LD.created_on +FROM apc_loan_detail LD +INNER JOIN apc_loan L ON LD.id_loan = L.id AND L.loan_status <> 'DELETED' +INNER JOIN apc_user U ON LD.id_user = U.id +INNER JOIN apc_human_resource HR ON U.id_human_resource = HR.id +WHERE loan_details_type = 'FEE' +-- -------------------------------------------------------- +-- +-- Estructura para la vista `APC_ADMINISTRATION_PERSON_SEARCH_VIEW` +-- +CREATE OR REPLACE VIEW `APC_ADMINISTRATION_PERSON_SEARCH_VIEW` AS +SELECT + people.id AS id, people.phone_home AS phone_home, people.address_home AS address_home, people.people_type AS people_type, + people.id_route AS id_route, route.route_name AS route_name, people.id_office AS id_office, office.office_name AS office_name, + CONCAT( + CASE + WHEN people.first_name IS NOT NULL AND people.first_name != '' + THEN CONCAT(SUBSTR(UPPER(people.first_name), 1, 1),SUBSTR(LOWER(people.first_name), 2)) + ELSE '' + END, + CASE + WHEN people.second_name IS NOT NULL AND people.second_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(people.second_name), 1, 1),SUBSTR(LOWER(people.second_name), 2)) + ELSE '' + END, + CASE + WHEN people.last_name IS NOT NULL AND people.last_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(people.last_name), 1, 1),SUBSTR(LOWER(people.last_name), 2)) + ELSE '' + END, + CASE + WHEN people.middle_name IS NOT NULL AND people.middle_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(people.middle_name), 1, 1),SUBSTR(LOWER(people.middle_name), 2)) + ELSE '' + END + ) AS person_search +FROM APC_PEOPLE people +INNER JOIN APC_OFFICE office ON people.id_office = office.id +INNER JOIN APC_ROUTE route ON people.id_route = route.id +WHERE + people.active_status = 'ENEBLED' +ORDER BY office_name, route_name, person_search; +-- -------------------------------------------------------- +-- +-- Estructura para la vista `APC_ADMINISTRATION_PERSON_SEARCH_VIEW` +-- +ALTER TABLE APC_USER +ADD COLUMN `management` ENUM('ENEBLED','DISABLED'); +-- -------------------------------------------------------------------- +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; + +-- Formula es: +-- monto_pagado >= a FLOOR(payment_total * .7728) +-- y +-- monto_pagado < a FLOOR(payment_total * .8182) +-- El pago puede renovarce segun las reglas y si se acpeta en este caso +-- se deberán condonar pago 21 y 22. +-- El pago 19 y 20 se cobrará cuando se entregue la renovación. +/* +SELECT + FLOOR(payment_total * .7728) as inicio, + + FLOOR(payment_total * .8182) as fin +FROM APC_LOAN_TYPE WHERE id_office = 'e0f1a2fc-7d1f-11ea-af3e-28f659da398e' ORDER BY payment; + + -- SEGUNDO CASO PAGO 20 se condona 21 y se deberá pagar el 22 + +SELECT + FLOOR(payment_total * 0.8637) as inicio, + + FLOOR(payment_total * 0.9091) as fin +FROM APC_LOAN_TYPE WHERE id_office = 'e0f1a2fc-7d1f-11ea-af3e-28f659da398e' ORDER BY payment; +*/ + + +-- VISTA RESPALDADA +-- CREATE ALGORITHM=UNDEFINED DEFINER=`AlphaCJZL`@`%` SQL SECURITY DEFINER VIEW `APC_LOAN_BY_USER_VIEW` AS select concat(`l`.`id`,`u`.`id`) AS `id`,`u`.`id` AS `user_id`,concat((case when ((`cstmr`.`first_name` is not null) and (`cstmr`.`first_name` <> '')) then concat(substr(upper(`cstmr`.`first_name`),1,1),substr(lower(`cstmr`.`first_name`),2),' ') else '' end),(case when ((`cstmr`.`second_name` is not null) and (`cstmr`.`second_name` <> '')) then concat(substr(upper(`cstmr`.`second_name`),1,1),substr(lower(`cstmr`.`second_name`),2),' ') else '' end),(case when ((`cstmr`.`last_name` is not null) and (`cstmr`.`last_name` <> '')) then concat(substr(upper(`cstmr`.`last_name`),1,1),substr(lower(`cstmr`.`last_name`),2)) else '' end)) AS `customer_name`,`cstmr`.`address_home` AS `customer_address_home`,`cstmr`.`address_business` AS `customer_address_business`,`cstmr`.`company_name` AS `company_name`,`cstmr`.`thumbnail` AS `customer_thumbnail`,concat((case when ((`ndrsmnt`.`first_name` is not null) and (`ndrsmnt`.`first_name` <> '')) then concat(substr(upper(`ndrsmnt`.`first_name`),1,1),substr(lower(`ndrsmnt`.`first_name`),2),' ') else '' end),(case when ((`ndrsmnt`.`second_name` is not null) and (`ndrsmnt`.`second_name` <> '')) then concat(substr(upper(`ndrsmnt`.`second_name`),1,1),substr(lower(`ndrsmnt`.`second_name`),2),' ') else '' end),(case when ((`ndrsmnt`.`last_name` is not null) and (`ndrsmnt`.`last_name` <> '')) then concat(substr(upper(`ndrsmnt`.`last_name`),1,1),substr(lower(`ndrsmnt`.`last_name`),2)) else '' end)) AS `endorsement_name`,`ndrsmnt`.`address_home` AS `endorsement_address_home`,`ndrsmnt`.`thumbnail` AS `endorsement_thumbnail`,`ndrsmnt`.`phone_home` AS `endorsement_phone_home`,if(((`l`.`amount_to_pay` - `l`.`amount_paid`) >= `lt`.`payment_daily`),`lt`.`payment_daily`,(`l`.`amount_to_pay` - `l`.`amount_paid`)) AS `payment_daily`,`lt`.`loan_fee` AS `loan_fee`,`lbu`.`order_in_list` AS `order_in_list`,(select count(`APC_LOAN_FEE_NOTIFICATION`.`notification_number`) from `APC_LOAN_FEE_NOTIFICATION` where (`APC_LOAN_FEE_NOTIFICATION`.`id_loan` = `l`.`id`)) AS `notification_number`,if((`l`.`amount_paid` >= (select floor((`lt`.`payment_total` * 0.6364)))),(case when ((select count(`APC_LOAN_FEE_NOTIFICATION`.`notification_number`) AS `total` from `APC_LOAN_FEE_NOTIFICATION` where (`APC_LOAN_FEE_NOTIFICATION`.`id_loan` = `l`.`id`)) < 4) then 'ENEBLED' when (((select count(`APC_LOAN_FEE_NOTIFICATION`.`notification_number`) AS `total` from `APC_LOAN_FEE_NOTIFICATION` where (`APC_LOAN_FEE_NOTIFICATION`.`id_loan` = `l`.`id`)) between 4 and 5) and (`lt`.`payment` > 1000)) then 'ENEBLED' else 'DISABLED' end),'DISABLED') AS `renovation`,(select (`APC_LOAN`.`amount_to_pay` - `APC_LOAN`.`amount_paid`) from `APC_LOAN` where (`APC_LOAN`.`id` = `l`.`id`)) AS `max_amount_to_pay` from (((((`APC_LOAN_BY_USER` `lbu` join `APC_LOAN` `l` on((`lbu`.`id_loan` = `l`.`id`))) join `APC_LOAN_TYPE` `lt` on((`l`.`id_loan_type` = `lt`.`id`))) join `APC_PEOPLE` `cstmr` on((`l`.`id_customer` = `cstmr`.`id`))) join `APC_PEOPLE` `ndrsmnt` on((`l`.`id_endorsement` = `ndrsmnt`.`id`))) join `APC_USER` `u` on((`lbu`.`id_user` = `u`.`id`))) where ((`l`.`loan_status` in ('APPROVED','PENDING','TO_DELIVERY')) and (`l`.`id` = (case when (((select count(`APC_LOAN_DETAIL`.`id`) from `APC_LOAN_DETAIL` where (`APC_LOAN_DETAIL`.`id_loan` = `l`.`id`)) = 0) and (cast(`l`.`last_updated_on` as date) < curdate())) then `l`.`id` when (((select count(`APC_LOAN_DETAIL`.`id`) from `APC_LOAN_DETAIL` where ((`APC_LOAN_DETAIL`.`id_loan` = `l`.`id`) and (`APC_LOAN_DETAIL`.`reference_number` = `l`.`last_reference_number`) and (cast(`APC_LOAN_DETAIL`.`created_on` as date) < curdate()))) > 0) and (cast(`l`.`last_updated_on` as date) < curdate())) then `l`.`id` else '' end)) and (`lbu`.`owner_loan` = 'CURRENT_OWNER') and (0 <> (case when (lower(dayname(curdate())) = 'monday') then ('monday' = `lt`.`payment_monday`) when (lower(dayname(curdate())) = 'tuesday') then ('tuesday' = lower(`lt`.`payment_tuesday`)) when (lower(dayname(curdate())) = 'wednesday') then ('wednesday' = lower(`lt`.`payment_wednesday`)) when (lower(dayname(curdate())) = 'thursday') then ('thursday' = lower(`lt`.`payment_thursday`)) when (lower(dayname(curdate())) = 'friday') then ('friday' = lower(`lt`.`payment_friday`)) when (lower(dayname(curdate())) = 'saturday') then ('saturday' = lower(`lt`.`payment_saturday`)) when (lower(dayname(curdate())) = 'sunday') then ('sunday' = lower(`lt`.`payment_sunday`)) else false end))); +-- NO BORRAR vista APC_LOAN_BY_USER_VIEW diff --git a/apc-db/src/apc-drop-tables-prod.sql b/apc-db/src/apc-drop-tables-prod.sql new file mode 100644 index 0000000..c0b0dde --- /dev/null +++ b/apc-db/src/apc-drop-tables-prod.sql @@ -0,0 +1,46 @@ +-- -------------------------------------------------------- +-- Arrebol Consuntancy +-- version 1.0.1 +-- http://www.arrebolconsultancy.com +-- -------------------------------------------------------- + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET AUTOCOMMIT = 0; +START TRANSACTION; +-- SET time_zone = "+00:00"; + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +USE `apo_pro_com_april_ten`; + +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_CASH_REGISTER_CURDATE_BY_USER_VIEW` +-- +-- Sirve para obtener todos los pagos que recabo un asesor en el día. +-- +DROP TABLE IF EXISTS APC_LOAN_BY_RENOVATION; +DROP TABLE IF EXISTS APC_USER_MOBILE_PREFERECE; +DROP TABLE IF EXISTS APC_USER_BY_OFFICE_HAS_PERMISSION; +DROP TABLE IF EXISTS APC_PERMISSION; +DROP TABLE IF EXISTS APC_USER_BY_OFFICE; +DROP TABLE IF EXISTS APC_LOAN_BY_USER; +DROP TABLE IF EXISTS APC_LOAN_FEE_NOTIFICATION; +DROP TABLE IF EXISTS APC_LOAN_DETAIL; +DROP TABLE IF EXISTS APC_USER; +DROP TABLE IF EXISTS APC_HUMAN_RESOURCE_BY_OFFICE; +DROP TABLE IF EXISTS APC_LOAN; +DROP TABLE IF EXISTS APC_LOAN_TYPE; +DROP TABLE IF EXISTS APC_PEOPLE; +DROP TABLE IF EXISTS APC_HUMAN_RESOURCE_HAS_ROUTE; +DROP TABLE IF EXISTS APC_HUMAN_RESOURCE; +DROP TABLE IF EXISTS APC_ROUTE; +DROP TABLE IF EXISTS APC_ROLE; +DROP TABLE IF EXISTS APC_OFFICE; +DROP TABLE IF EXISTS APC_ERROR_APP_LOG; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; \ No newline at end of file diff --git a/apc-db/src/cambio_de_anio.sql b/apc-db/src/cambio_de_anio.sql new file mode 100644 index 0000000..c18f0a6 --- /dev/null +++ b/apc-db/src/cambio_de_anio.sql @@ -0,0 +1,794 @@ +-- -------------------------------------------------------- +-- +-- Estructura para la vista `APC_INFORMATION_LOAN_LAST_WEEK_VIEW` +-- +CREATE OR REPLACE VIEW `APC_INFORMATION_LOAN_LAST_WEEK_VIEW` AS +SELECT +l.id, +u.id as id_user, +r.id_office, +l.created_on as fecha, +lt.payment as apoyos, +lt.payment_total as apoyos_total, +lt.opening_fee as comision_apertura, +CONCAT(endor.first_name,' ', IF(ISNULL(endor.second_name) ,'', CONCAT(endor.second_name,' ')) ,endor.last_name, ' ', endor.middle_name) AS aval, +CONCAT(cus.first_name,' ', IF(ISNULL(cus.second_name) ,'', CONCAT(cus.second_name,' ')) ,cus.last_name, ' ', cus.middle_name) AS customer, +l.amount_to_pay as documento_por, +lt.payment_daily as abono_diario, +l.amount_paid, +(l.amount_to_pay - l.amount_paid) saldo_insoluto, +r.route_name, +CONCAT(hr.first_name,' ', IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name,' ')) ,hr.last_name, ' ', hr.middle_name) AS asesor, +(SELECT COUNT(lfn.id) FROM APC_LOAN_FEE_NOTIFICATION lfn WHERE lfn.id_loan = l.id) as num_fee, +-- Lunes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'monday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_monday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'monday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_monday, +-- Martes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'tuesday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_tuesday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'tuesday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_tuesday, +-- Miercoles +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'wednesday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_wednesday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'wednesday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_wednesday, +-- Jueves +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'thursday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_thursday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'thursday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_thursday, +-- Viernes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'friday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_friday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'friday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_friday, +-- Sabado +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'saturday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_saturday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'saturday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_saturday, + +((lt.payment_daily * (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) > 5, 5, COUNT(DISTINCT(DATE(ldFaltante.created_on)))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE'))) +- (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) as faltante, + +CASE WHEN l.new_customer = 'ENEBLED' AND WEEK(DATE(l.created_on),1) = (WEEK(CURDATE(),1) - 1) THEN 'Si' ELSE 'No' END as new_customer, +(SELECT IF(COUNT(id_loan_old) = 0 , 'No' , 'Si') FROM APC_LOAN_BY_RENOVATION lbr +INNER JOIN APC_LOAN lRenovation ON lbr.id_loan_new = lRenovation.id +WHERE id_loan_old = l.id + AND loan_by_renovation_status = 'APPROVED' and WEEK(DATE(lRenovation.created_on),1) <= (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(lRenovation.created_on)) = YEAR(CURDATE())) as renovation, +l.loan_status as estatus_prestamo, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as abono_semana_actual, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('FEE')) as fee_semana_actual, +(SELECT COUNT(DISTINCT(DATE(ldFaltante.created_on))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) <= (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE')) as num_pagos_all, +(SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) > 5, 5, COUNT(DISTINCT(DATE(ldFaltante.created_on)))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE')) as num_pagos_week, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) <= (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('FEE')) as fee_todos +FROM +APC_LOAN l +INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +INNER JOIN APC_PEOPLE cus ON cus.id = l.id_customer +INNER JOIN APC_PEOPLE endor ON endor.id = l.id_endorsement +INNER JOIN APC_ROUTE r ON r.id = l.id_route +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +INNER JOIN APC_USER u ON u.id = lbu.id_user +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +WHERE +l.loan_status not in ('DELETED','REJECTED') AND +((SELECT COUNT(ld.id) FROM APC_LOAN_DETAIL ld WHERE WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.id_loan = l.id) > 0 OR + ((SELECT COUNT(ld.id) FROM APC_LOAN_DETAIL ld WHERE WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.id_loan = l.id) = 0 AND l.loan_status = 'APPROVED' AND + WEEK(DATE(l.created_on),1) <= (WEEK(CURDATE(),1) - 1))); +-- -------------------------------------------------------- +-- +-- Estructura para la vista `APC_COLOCATION_LAST_WEEK_BY_USER_VIEW` +-- +CREATE OR REPLACE VIEW `APC_COLOCATION_LAST_WEEK_BY_USER_VIEW` AS +SELECT +u.id, +CONCAT(hr.first_name, ' ' , hr.last_name) as username, +ubo.id_office, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'monday') + as colocation_monday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'tuesday') + as colocation_tuesday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'wednesday') + as colocation_wednesday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'thursday') + as colocation_thursday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'friday') + as colocation_friday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'saturday') + as colocation_saturday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE())) + as colocation_total +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE') AND +u.certifier = 'DISABLED'; +-- -------------------------------------------------------- +-- +-- Estructura para la vista `APC_RESUMEN_IN_OUT_LAST_WEEK_BY_USER_VIEW` +-- +CREATE OR REPLACE VIEW `APC_RESUMEN_IN_OUT_LAST_WEEK_BY_USER_VIEW` AS +SELECT +u.id, +CONCAT(hr.first_name, ' ' , hr.last_name) as username, +ubo.id_office, +-- Lunes +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'monday') as closing_monday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'monday') as expense_monday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'monday') as money_daily_today_monday, +-- Martes +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'tuesday') as closing_tuesday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'tuesday') as expense_tuesday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'tuesday') as money_daily_today_tuesday, +-- Miercoles +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'wednesday') as closing_wednesday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'wednesday') as expense_wednesday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'wednesday') as money_daily_today_wednesday, +-- Jueves +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'thursday') as closing_thursday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'thursday') as expense_thursday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'thursday') as money_daily_today_thursday, +-- Viernes +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'friday') as closing_friday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'friday') as expense_friday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'friday') as money_daily_today_friday, +-- Sabado +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'saturday') as closing_saturday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'saturday') as expense_saturday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'saturday') as money_daily_today_saturday +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE','BOTH'); +-- -------------------------------------------------------- +-- +-- Estructura para la vista `APC_LOAN_DIFERENCES_BY_USER_LAST_WEEK_VIEW` +-- +CREATE OR REPLACE VIEW `APC_LOAN_DIFERENCES_BY_USER_LAST_WEEK_VIEW` AS +SELECT +l.id, +lbu.id_user, +((lt.payment_daily * 5) - (SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +WHERE ld.id_loan = l.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) +AND YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) + as faltante +FROM + APC_LOAN l +INNER JOIN + APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +INNER JOIN + APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE +l.loan_status not in ('DELETED','REJECTED') AND +(SELECT COUNT(ld2.id) FROM APC_LOAN_DETAIL ld2 WHERE WEEK(DATE(ld2.created_on),1) = (WEEK(CURDATE(),1)-1) +AND YEAR(DATE(ld2.created_on)) = YEAR(CURDATE()) AND ld2.id_loan = l.id) > 4; +-- -------------------------------------------------------- +-- +-- Estructura para la vista `APC_SUBTOTAL_LAST_WEEK_BY_USER_VIEW` +-- +CREATE OR REPLACE VIEW `APC_SUBTOTAL_LAST_WEEK_BY_USER_VIEW` AS +SELECT +u.id, +CONCAT(hr.first_name, ' ' , hr.last_name) as username, +ubo.id_office, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'monday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_monday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'monday') + as opening_fee_monday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'tuesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_tuesday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'tuesday') + as opening_fee_tuesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'wednesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_wednesday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'wednesday') + as opening_fee_wednesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'thursday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_thursday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'thursday') + as opening_fee_thursday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'friday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_friday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'friday') + as opening_fee_friday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'saturday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_saturday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'saturday') + as opening_fee_saturday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_total, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) ) + as opening_fee_total, +( + select + IF(ISNULL( + SUM( + CASE WHEN l.loan_status IN ('PENDING_RENOVATION', 'FINISH') then 0 ELSE + ((lt.payment_daily * (SELECT COUNT(ldFaltante.id) FROM APC_LOAN_DETAIL ldFaltante + WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) + AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE'))) + - (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) + FROM APC_LOAN_DETAIL ldLunes + WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) + AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) END + ) + ),0, + SUM( + CASE WHEN l.loan_status IN ('PENDING_RENOVATION', 'FINISH') then 0 ELSE + ((lt.payment_daily * (SELECT COUNT(ldFaltante.id) FROM APC_LOAN_DETAIL ldFaltante + WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) + AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE'))) + - (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) + FROM APC_LOAN_DETAIL ldLunes + WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) + AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) END + ) + ) + as faltante + + FROM + APC_LOAN l + INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id + INNER JOIN APC_LOAN_BY_USER albu ON l.id = albu.id_loan + WHERE albu.id_user = u.id + AND albu.owner_loan = 'CURRENT_OWNER' + +) +as faltante +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE') AND +u.certifier = 'DISABLED'; +-- -------------------------------------------------------- +-- +-- Estructura para la vista `APC_COBRANZA_LAST_WEEK_BY_USER_VIEW` +-- +CREATE OR REPLACE VIEW `APC_COBRANZA_LAST_WEEK_BY_USER_VIEW` AS +SELECT +u.id, +CONCAT(hr.first_name, ' ' , hr.last_name) as username, +ubo.id_office, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' AND ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'monday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_monday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'tuesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_tuesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'wednesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_wednesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'thursday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_thursday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'friday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_friday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'saturday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_saturday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_total +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE') AND +u.certifier = 'DISABLED'; +-- -------------------------------------------------------- +-- +-- Estructura para la vista `APC_RESUMEN_TOTAL_LAST_WEEK_VIEW` +-- +CREATE OR REPLACE VIEW `APC_RESUMEN_TOTAL_LAST_WEEK_VIEW` AS +SELECT +u.id, +u.office_name, +-- Cortes +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND ld.id_office = u.id) as closing__day_total, +-- Inicios +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) AND md.id_office = u.id) as money_daily_today_total, +-- Subtotal +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_total, +-- comision por apertura +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE())) + as opening_fee_total, +-- cobranza +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) -1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_today, +-- colocacion +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) ) + as colocation_total, +-- nominas +(SELECT IF(ISNULL(SUM(ap.total_payment)),0,SUM(ap.total_payment)) FROM APC_PAYROLL ap +WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' +AND WEEK(DATE(ap.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(ap.created_on)) = YEAR(CURDATE())) as nomina_total, +-- adelantos +(SELECT IF(ISNULL(SUM(ap.amount)),0,SUM(ap.amount)) FROM APC_ADVANCE ap +WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' +AND WEEK(DATE(ap.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(ap.created_on)) = YEAR(CURDATE())) as adelantos_total, +-- entradas +(SELECT IF(ISNULL(SUM(ap.amount)),0,SUM(ap.amount)) FROM APC_EXPENSE_COMPANY ap +WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' AND +ap.expense_company_type = 'PAYMENT_IN' +AND WEEK(DATE(ap.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(ap.created_on)) = YEAR(CURDATE())) as entradas_total, +-- gastos admon +(SELECT IF(ISNULL(SUM(ap.amount)),0,SUM(ap.amount)) FROM APC_EXPENSE_COMPANY ap +WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' AND +ap.expense_company_type = 'PAYMENT_OUT' +AND WEEK(DATE(ap.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(ap.created_on)) = YEAR(CURDATE())) as gastos_admon_total +FROM APC_OFFICE u +WHERE u.office_status = 'ENEBLED'; +-- -------------------------------------------------------- +-- +-- Estructura para la vista `` +-- +CREATE OR REPLACE VIEW `APC_RESUMEN_TOTAL_LAST_WEEK_VIEW` AS +SELECT +u.id, +u.office_name, +-- Cortes +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND ld.id_office = u.id) as closing__day_total, +-- Inicios +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) AND md.id_office = u.id) as money_daily_today_total, +-- Subtotal +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_total, +-- comision por apertura +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE())) + as opening_fee_total, +-- cobranza +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) -1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_today, +-- colocacion +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) ) + as colocation_total, +-- nominas +(SELECT IF(ISNULL(SUM(ap.total_payment)),0,SUM(ap.total_payment)) FROM APC_PAYROLL ap +WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' +AND WEEK(DATE(ap.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(ap.created_on)) = YEAR(CURDATE())) as nomina_total, +-- adelantos +(SELECT IF(ISNULL(SUM(ap.amount)),0,SUM(ap.amount)) FROM APC_ADVANCE ap +WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' +AND WEEK(DATE(ap.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(ap.created_on)) = YEAR(CURDATE())) as adelantos_total, +-- entradas +(SELECT IF(ISNULL(SUM(ap.amount)),0,SUM(ap.amount)) FROM APC_EXPENSE_COMPANY ap +WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' AND +ap.expense_company_type = 'PAYMENT_IN' +AND WEEK(DATE(ap.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(ap.created_on)) = YEAR(CURDATE())) as entradas_total, +-- gastos admon +(SELECT IF(ISNULL(SUM(ap.amount)),0,SUM(ap.amount)) FROM APC_EXPENSE_COMPANY ap +WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' AND +ap.expense_company_type = 'PAYMENT_OUT' +AND WEEK(DATE(ap.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(ap.created_on)) = YEAR(CURDATE())) as gastos_admon_total +FROM APC_OFFICE u +WHERE u.office_status = 'ENEBLED'; +-- -------------------------------------------------------- +-- +-- Estructura para la vista `` +-- + +-- -------------------------------------------------------- +-- +-- Estructura para la vista `` +-- + +-- -------------------------------------------------------- +-- +-- Estructura para la vista `` +-- + +-- -------------------------------------------------------- +-- +-- Estructura para la vista `` +-- + +-- -------------------------------------------------------- +-- +-- Estructura para la vista `` +-- + +-- -------------------------------------------------------- +-- +-- Estructura para la vista `` +-- + +-- -------------------------------------------------------- +-- +-- Estructura para la vista `` +-- + +-- -------------------------------------------------------- +-- +-- Estructura para la vista `` +-- \ No newline at end of file diff --git a/apc-db/src/cocina-lore-db.sql b/apc-db/src/cocina-lore-db.sql new file mode 100644 index 0000000..d2c927f --- /dev/null +++ b/apc-db/src/cocina-lore-db.sql @@ -0,0 +1,412 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +/** + * Author: Oscar Armando Vargas Cardenas + * Created: 19/04/2021 + */ + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET AUTOCOMMIT = 0; +START TRANSACTION; +-- SET time_zone = "+00:00"; + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +DROP DATABASE IF EXISTS `cocina_lore_db_arrebol`; + +CREATE DATABASE IF NOT EXISTS `cocina_lore_db_arrebol` DEFAULT CHARACTER SET latin1 COLLATE latin1_spanish_ci; +USE `cocina_lore_db_arrebol`; + +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `CL_OFFICE` +-- +CREATE TABLE `CL_OFFICE`( + `id` char(36) NOT NULL, + `office_name` varchar(100) NOT NULL, + `address` varchar(250), + `office_status` ENUM('ENEBLED', 'DISABLED', 'DELETED') NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `cl_office_pk` PRIMARY KEY (`id`), + CONSTRAINT `cl_office_uk` UNIQUE KEY (`office_name`) +)ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `CL_ROLE` +-- +CREATE TABLE `CL_ROLE`( + `id` char(36) NOT NULL, + `role_name` varchar(100) NOT NULL, + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `cl_role_pk` PRIMARY KEY (`id`), + CONSTRAINT `cl_role_uk` UNIQUE KEY (`role_name`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `CL_ROUTE` +-- +CREATE TABLE `CL_ROUTE`( + `id` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `route_name` varchar(25) NOT NULL, + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `cl_route_pk` PRIMARY KEY (`id`), + CONSTRAINT `cl_route_uk` UNIQUE KEY (`id_office`,`route_name`), + CONSTRAINT `cl_route_to_cl_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `CL_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `CL_HUMAN_RESOURCES` +-- +CREATE TABLE `CL_HUMAN_RESOURCE` ( + `id` char(36) NOT NULL, + `first_name` varchar(25) NOT NULL, + `second_name` varchar(25) DEFAULT NULL, + `last_name` varchar(25) NOT NULL, + `middle_name` varchar(25) NOT NULL, + `birthdate` date DEFAULT NULL, + `avatar` varchar(150) NOT NULL, + `curp` varchar(20) DEFAULT NULL, + `rfc` varchar(13) DEFAULT NULL, + `ife` varchar(20) DEFAULT NULL, + `admission_date` date DEFAULT NULL, + `human_resource_status` ENUM('ENEBLED', 'DISABLED', 'DELETED') NOT NULL, + `id_role` char(36) NOT NULL, + `payment` numeric(8,2) DEFAULT NULL, + `imss` numeric(8,2) DEFAULT NULL, + `created_by` char(36) DEFAULT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `person_pk` PRIMARY KEY (`id`), + CONSTRAINT `cl_human_resource_to_cl_role_fk` + FOREIGN KEY (`id_role`) REFERENCES `CL_ROLE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `CL_HUMAN_RESOURCE_HAS_ROUTE` +-- +CREATE TABLE `CL_HUMAN_RESOURCE_HAS_ROUTE`( + `id_human_resource` char(36) NOT NULL, + `id_route` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `cl_human_resource_has_route_pk` PRIMARY KEY (`id_human_resource`, `id_route`), + CONSTRAINT `cl_human_resource_has_route_to_cl_human_resource_fk` + FOREIGN KEY (`id_human_resource`) REFERENCES `CL_HUMAN_RESOURCE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `cl_human_resource_has_route_to_cl_route_fk` + FOREIGN KEY (`id_route`) REFERENCES `CL_ROUTE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `CL_PEOPLE` +-- +CREATE TABLE `CL_PEOPLE`( + `id` char(36) NOT NULL, + `first_name` varchar(25) NOT NULL, + `second_name` varchar(25) DEFAULT NULL, + `last_name` varchar(25) NOT NULL, + `middle_name` varchar(25) NOT NULL, + `birthdate` date DEFAULT NULL, + `thumbnail` varchar(250) NOT NULL, + `phone_home` varchar(15) NOT NULL, + `address_home` varchar(150) NOT NULL, + `phone_business` varchar(15), + `address_business` varchar(150), + `company_name` varchar(150), + `people_type` ENUM('CUSTOMER') NOT NULL DEFAULT 'CUSTOMER', + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `id_office` char(36) NOT NULL, + `id_route` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `cl_people_pk` PRIMARY KEY (`id`), + CONSTRAINT `cl_people_to_cl_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `CL_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `cl_people_to_cl_route_fk` + FOREIGN KEY (`id_route`) REFERENCES `CL_ROUTE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `CL_ORDER` +-- +CREATE TABLE `CL_ORDER`( + `id` char(36) NOT NULL, + `id_customer` char(36) NOT NULL, + `id_route` char(36) NOT NULL, + `order_status` ENUM('PENDING', 'FINISH', 'REJECTED', 'TO_DELIVERY') NOT NULL DEFAULT 'PENDING', + `new_customer` ENUM('ENEBLED', 'DISABLED') DEFAULT 'DISABLED', + `amount_paid` numeric(8,2) NOT NULL, + `amount_to_pay` numeric(8,2) NOT NULL, + `comments` varchar(600), + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36), + `last_updated_on` datetime, + CONSTRAINT `cl_order_pk` PRIMARY KEY (`id`), + CONSTRAINT `cl_order_to_cl_person_as_customer_fk` + FOREIGN KEY (`id_customer`) REFERENCES `CL_PEOPLE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `cl_order_to_cl_route_fk` + FOREIGN KEY (`id_route`) REFERENCES `CL_ROUTE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `CL_HUMAN_RESOURCE_BY_OFFICE` +-- +CREATE TABLE `CL_HUMAN_RESOURCE_BY_OFFICE`( + `id` char(36) NOT NULL, + `id_human_resource` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `application_owner` ENUM('APP_OWNER', 'APP_USER') NOT NULL DEFAULT 'APP_USER', + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `cl_human_resource_by_office_pk` PRIMARY KEY (`id`), + CONSTRAINT `cl_human_resource_by_office_uk` UNIQUE KEY (`id_human_resource`, `id_office`), + CONSTRAINT `cl_human_resource_by_office_to_cl_human_resource_fk` + FOREIGN KEY (`id_human_resource`) REFERENCES `CL_HUMAN_RESOURCE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `cl_human_resource_by_office_to_cl_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `CL_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; + + +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `CL_USER` +-- +CREATE TABLE `CL_USER`( + `id` char(36) NOT NULL, + `id_human_resource` char(36) NOT NULL, + `user_name` varchar(100) NOT NULL, + `pwd` varchar(100)NOT NULL, + `user_type` ENUM('WEB', 'MOBILE', 'BOTH') NOT NULL, + `user_status` ENUM('ENEBLED', 'DISABLED', 'DELETED') NOT NULL, + `application_owner` ENUM('APP_OWNER', 'APP_USER') NOT NULL DEFAULT 'APP_USER', + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `cl_user_pk` PRIMARY KEY (`id`), + CONSTRAINT `cl_user_by_office_to_cl_human_resource_fk` + FOREIGN KEY (`id_human_resource`) REFERENCES `CL_HUMAN_RESOURCE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `CL_ORDER_BY_USER` +-- +CREATE TABLE `CL_ORDER_BY_USER`( + `id_order` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `loan_by_user_status` ENUM('PENDING', 'FINISH','REJECTED', 'TO_DELIVERY') NOT NULL DEFAULT 'PENDING', + `comments` varchar(150), + `owner_loan` ENUM('CURRENT_OWNER', 'OLD_OWNER') NOT NULL, + `order_in_list` smallint DEFAULT 0, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `cl_order_by_user_pk` PRIMARY KEY (`id_order`, `id_user`), + CONSTRAINT `cl_order_by_user_to_cl_order_fk` + FOREIGN KEY (`id_order`) REFERENCES `CL_ORDER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `cl_order_by_user_to_cl_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `CL_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `CL_USER_BY_OFFICE` +-- +CREATE TABLE `CL_USER_BY_OFFICE`( + `id` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `user_by_office_status` ENUM('ENEBLED', 'DISABLED', 'DELETED') NOT NULL, + `application_owner` ENUM('APP_OWNER', 'APP_USER')NOT NULL DEFAULT 'APP_USER', + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `cl_user_by_office_pk` PRIMARY KEY (`id`), + CONSTRAINT `cl_user_by_office_uk` UNIQUE KEY (`id_user`, `id_office`), + CONSTRAINT `cl_user_by_office_to_cl_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `CL_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `cl_user_by_office_to_cl_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `CL_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `CL_PERMISSION` +-- +CREATE TABLE `CL_PERMISSION` ( + `id` char(36) NOT NULL, + `permission` varchar(200) NOT NULL, -- dashboard.policy.to.expire.name + `description` varchar(200) NOT NULL, -- dashboard.policy.to.expire.description + `menu_path` varchar(200) NOT NULL, -- dashboard.policy.to.expire.path + `left_to_right_order` smallint NOT NULL, -- Orden en la que aparece el menu principal (Dashboard, Administración, Catálogo) + `top_to_bottom_order` smallint NOT NULL, -- Orden en la que aparece de arriba hacia abajo + `permission_type` ENUM('PUBLIC', 'PRIVATE', 'EXCLUSIVE') NOT NULL, + `parent_name` varchar(200), + `permission_status` ENUM('ENEBLED', 'DISABLED') NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `cl_permission_pk` PRIMARY KEY (`id`), + CONSTRAINT `cl_permission_uk` UNIQUE KEY (`permission`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `CL_USER_BY_OFFICE_HAS_PERMISSION` +-- +CREATE TABLE `CL_USER_BY_OFFICE_HAS_PERMISSION` ( + `id_user_by_office` char(36) NOT NULL, + `id_permission` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `cl_user_by_office_has_permission_pk` PRIMARY KEY (`id_user_by_office`,`id_permission`) , + CONSTRAINT `cl_user_by_office_has_permission_to_cl_user_by_office_fk` + FOREIGN KEY (`id_user_by_office`) REFERENCES `CL_USER_BY_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `cl_user_by_office_has_permission_to_cl_permission_fk` + FOREIGN KEY (`id_permission`) REFERENCES `CL_PERMISSION`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `CL_USER_MOBILE_PREFERECE` +-- +CREATE TABLE `CL_USER_MOBILE_PREFERECE`( + `id` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `preference_name` varchar(25) NOT NULL, + `preference_value` varchar(25) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `cl_user_mobile_preference_pk` PRIMARY KEY (`id`), + CONSTRAINT `cl_user_mobile_preference_uk` UNIQUE KEY (`id_user`,`preference_name`), + CONSTRAINT `cl_user_mobile_preference_to_cl_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `CL_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- + +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `CL_SECURITY_AUTHENTICATION` (USER) +-- +CREATE OR REPLACE VIEW `CL_SECURITY_AUTHENTICATION` AS +SELECT CONCAT(`usr`.`user_name`,`ubo`.`id_office`) AS `user_name`, `usr`.`pwd` AS `pwd` +FROM `CL_USER_BY_OFFICE` `ubo` +INNER JOIN `CL_USER` `usr` ON `ubo`.`id_user` = `usr`.`id` +INNER JOIN `CL_HUMAN_RESOURCE` `hr` ON `usr`.`id_human_resource` = `hr`.`id` +WHERE +`usr`.`user_status` = 'ENEBLED' AND +`usr`.`user_type` IN ('WEB', 'BOTH') AND +`ubo`.`user_by_office_status` = 'ENEBLED' AND +`hr`.`human_resource_status` = 'ENEBLED'; +-- ------------------------------------------------------------ +-- +-- Estructura para la vista `CL_SECURITY_AUTHORIZATION` (ROLE) +-- +CREATE OR REPLACE VIEW `CL_SECURITY_AUTHORIZATION` AS +SELECT CONCAT(`usr`.`user_name`,`ubo`.`id_office`) AS `user_name`, `perm`.`permission` AS `permission` +FROM `CL_PERMISSION` `perm` +INNER JOIN `CL_USER_BY_OFFICE_HAS_PERMISSION` `ubohp` ON `perm`.`id` = `ubohp`.`id_permission` +INNER JOIN `CL_USER_BY_OFFICE` `ubo` ON `ubohp`.`id_user_by_office` = `ubo`.`id` +INNER JOIN `CL_USER` `usr` ON `ubo`.`id_user` = `usr`.`id` +INNER JOIN `CL_HUMAN_RESOURCE` `hr` ON `usr`.`id_human_resource` = `hr`.`id` +WHERE +`perm`.`permission_status` = 'ENEBLED' AND +`ubo`.`user_by_office_status` = 'ENEBLED' AND +`usr`.`user_status` = 'ENEBLED' AND +`usr`.`user_type` IN ('WEB', 'BOTH') AND +`hr`.`human_resource_status` = 'ENEBLED' +ORDER BY `user_name`; +-- ------------------------------------------------------------------- +-- +-- Estructura para la vista `CL_SECURITY_AUTHENTICATION_MOBILE` (USER) +-- +CREATE OR REPLACE VIEW `CL_SECURITY_AUTHENTICATION_MOBILE` AS +SELECT +`usr`.`id` AS `id`, +`usr`.`user_name` AS `user_name`, +`usr`.`pwd` AS `pwd`, +`hr`.`avatar` AS `avatar`, +`ubo`.`id_office` AS `id_office`, +`hrhr`.`id_route` AS `id_route` +FROM `CL_USER_BY_OFFICE` `ubo` +INNER JOIN `CL_USER` `usr` ON `ubo`.`id_user` = `usr`.`id` +INNER JOIN `CL_HUMAN_RESOURCE` `hr` ON `usr`.`id_human_resource` = `hr`.`id` +INNER JOIN `CL_HUMAN_RESOURCE_HAS_ROUTE` `hrhr` ON `hr`.`id` = `hrhr`.`id_human_resource` +WHERE +`usr`.`user_status` = 'ENEBLED' AND +`usr`.`user_type` IN ('MOBILE', 'BOTH') AND +`ubo`.`user_by_office_status` = 'ENEBLED' AND +`hr`.`human_resource_status` = 'ENEBLED'; + diff --git a/apc-db/src/create/from/scratch/apc-config-db-aws.sql b/apc-db/src/create/from/scratch/apc-config-db-aws.sql new file mode 100644 index 0000000..2d082af --- /dev/null +++ b/apc-db/src/create/from/scratch/apc-config-db-aws.sql @@ -0,0 +1,134 @@ +-- -------------------------------------------------------- +-- Arrebol Consuntancy +-- version 1.0.1 +-- http://www.arrebolconsultancy.com +-- -------------------------------------------------------- + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET AUTOCOMMIT = 0; +START TRANSACTION; +-- SET time_zone = "+00:00"; + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- -------------------------------------------------------- + +-- +-- Base de datos: `apo_pro_com_april_ten` +-- +USE `apo_pro_com_april_ten`; + +-- -------------------------------------------------------- + +-- +-- Drop users: apoprocom & errortrace +-- +DROP USER IF EXISTS 'apoprocom'@'%'; +DROP USER IF EXISTS 'errortrace'@'%'; +DROP USER IF EXISTS 'apoprocommobile'@'%'; +DROP USER IF EXISTS 'apcreportdesktop'@'%'; +-- -------------------------------------------------------- + +-- +-- App user: `apoprocom` application user +-- + +CREATE USER 'apoprocom'@'%' + IDENTIFIED BY 'Yj$2Da0z!'; + +GRANT SELECT ON apo_pro_com_april_ten.* TO 'apoprocom'@'%'; +GRANT INSERT, UPDATE, DELETE ON apo_pro_com_april_ten.* TO 'apoprocom'@'%'; +GRANT EXECUTE ON apo_pro_com_april_ten.* TO 'apoprocom'@'%'; + +-- -------------------------------------------------------- + +-- +-- Error trace user: `errortrace` DB user +-- + +-- -------------------------------------------------------- + +CREATE USER 'errortrace'@'%' + IDENTIFIED BY 'zy61$Jql'; +GRANT ALL ON apo_pro_com_april_ten.APC_ERROR_APP_LOG TO 'errortrace'@'%'; + +-- -------------------------------------------------------- + +-- +-- Error trace user: `apoprocommobile` DB user +-- + +-- -------------------------------------------------------- + +CREATE USER 'apoprocommobile'@'%' + IDENTIFIED BY '0Ps$6%q8'; + +GRANT SELECT, INSERT ON apo_pro_com_april_ten.APC_LOAN_FEE_NOTIFICATION TO 'apoprocommobile'@'%'; +GRANT SELECT, INSERT ON apo_pro_com_april_ten.APC_DELIVERY TO 'apoprocommobile'@'%'; +GRANT SELECT, INSERT ON apo_pro_com_april_ten.APC_OTHER_EXPENSE TO 'apoprocommobile'@'%'; + +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_LOAN_DETAIL TO 'apoprocommobile'@'%'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_LOAN_BY_RENOVATION TO 'apoprocommobile'@'%'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_LOAN_BY_USER TO 'apoprocommobile'@'%'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_USER_MOBILE_PREFERECE TO 'apoprocommobile'@'%'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_PEOPLE TO 'apoprocommobile'@'%'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_LOAN TO 'apoprocommobile'@'%'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_TRANSFER TO 'apoprocommobile'@'%'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_GASOLINE TO 'apoprocommobile'@'%'; +-- SELECT +GRANT SELECT ON apo_pro_com_april_ten.APC_OFFICE TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_USER TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_TYPE TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_MONEY_DAILY TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_CLOSING_DAY TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_HUMAN_RESOURCE_HAS_ROUTE TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_ROUTE TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_USER_BY_OFFICE TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_HUMAN_RESOURCE TO 'apoprocommobile'@'%'; +GRANT SELECT, UPDATE ON apo_pro_com_april_ten.APC_STABLE_GENERAL_BOX TO 'apoprocommobile'@'%'; +GRANT SELECT, UPDATE ON apo_pro_com_april_ten.APC_STABLE_SMALL_BOX TO 'apoprocommobile'@'%'; +GRANT SELECT, UPDATE ON apo_pro_com_april_ten.APC_CLOSING_DAY TO 'apoprocommobile'@'%'; +GRANT SELECT, INSERT ON apo_pro_com_april_ten.APC_BITACORA TO 'apoprocommobile'@'%'; +-- Views +GRANT SELECT ON apo_pro_com_april_ten.APC_SECURITY_AUTHENTICATION_MOBILE TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_BY_USER_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_BY_USER_ORDER_PREFERENCE_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_PERSON_SEARCH_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_PERSON_SEARCH_DETAIL_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_AVAILABLE_CUSTOMERS_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_AVAILABLE_ENDORSEMENTS_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_CASH_REGISTER_CURDATE_BY_USER_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_TO_DELIVERY_BY_CERTIFIER_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_EXCHANGE_ENEBLED_USERS_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_TOTAL_CASH_BY_CURDATE_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_PERSON_SEARCH_HISTORICAL_DETAILS_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_APPROVED_DETAIL_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_USER_WEEK_REPORT_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_DETAIL_ZERO_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_FINISHED_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_ADVANCE_USER_DAILY_DASHBOARD_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_TRANSFER_IN_PENDING_STATUS_VIEW TO 'apoprocommobile'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_IN_PENDING_STATUS_TO_DELIVERY_VIEW TO 'apoprocommobile'@'%'; +-- ---------------------------------------------------------------------- +GRANT ALL ON apo_pro_com_april_ten.ARREBOL_TEST TO 'apoprocommobile'@'%'; +-- -------------------------------------------------------- + +-- +-- App user: `apcreportdesktop` report desktop user +-- + +CREATE USER 'apcreportdesktop'@'%' + IDENTIFIED BY 'hY5znQ8j'; + +GRANT SELECT ON apo_pro_com_april_ten.APC_USER TO 'apcreportdesktop'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_HUMAN_RESOURCE TO 'apcreportdesktop'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_TOTAL_CASH_BY_CURDATE_VIEW TO 'apcreportdesktop'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_CLOSING_DAILY_DETAIL_FROM_USER_BY_CURDATE_VIEW TO 'apcreportdesktop'@'%'; +GRANT SELECT ON apo_pro_com_april_ten.APC_CLOSING_DAILY_DETAIL_FROM_USER_BY_CURDATE_VIEW_REPORT TO 'apcreportdesktop'@'%'; +-- ---------------------------------------------------------------------- +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; \ No newline at end of file diff --git a/apc-db/src/create/from/scratch/apc-config-db-localhost.sql b/apc-db/src/create/from/scratch/apc-config-db-localhost.sql new file mode 100644 index 0000000..e03e3dc --- /dev/null +++ b/apc-db/src/create/from/scratch/apc-config-db-localhost.sql @@ -0,0 +1,136 @@ +-- -------------------------------------------------------- +-- Arrebol Consuntancy +-- version 1.0.1 +-- http://www.arrebolconsultancy.com +-- -------------------------------------------------------- + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET AUTOCOMMIT = 0; +START TRANSACTION; +-- SET time_zone = "+00:00"; + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- -------------------------------------------------------- + +-- +-- Base de datos: `apo_pro_com_april_ten` +-- +USE `apo_pro_com_april_ten`; + +-- -------------------------------------------------------- + +-- +-- Drop users: apoprocomlocalhost & errortracelocalhost +-- +DROP USER IF EXISTS 'apoprocomlocalhost'@'localhost'; +DROP USER IF EXISTS 'errortracelocalhost'@'localhost'; +DROP USER IF EXISTS 'apoprocommobilelocalhost'@'localhost'; +DROP USER IF EXISTS 'apcreportdesktop'@'localhost'; +-- -------------------------------------------------------- + +-- +-- App user: `apoprocomlocalhost` application user +-- + +CREATE USER 'apoprocomlocalhost'@'localhost' + IDENTIFIED BY 'Yj$2Da0z!'; + +GRANT SELECT ON apo_pro_com_april_ten.* TO 'apoprocomlocalhost'@'localhost'; +GRANT INSERT, UPDATE, DELETE ON apo_pro_com_april_ten.* TO 'apoprocomlocalhost'@'localhost'; +GRANT EXECUTE ON apo_pro_com_april_ten.* TO 'apoprocomlocalhost'@'localhost'; + +-- -------------------------------------------------------- + +-- +-- Error trace user: `errortracelocalhost` DB user +-- + +-- -------------------------------------------------------- + +CREATE USER 'errortracelocalhost'@'localhost' + IDENTIFIED BY 'zy61$Jql'; +GRANT ALL ON apo_pro_com_april_ten.APC_ERROR_APP_LOG TO 'errortracelocalhost'@'localhost'; + +-- -------------------------------------------------------- + +-- +-- Error trace user: `apoprocommobilelocalhost` DB user +-- + +-- -------------------------------------------------------- + +CREATE USER 'apoprocommobilelocalhost'@'localhost' + IDENTIFIED BY '0Ps$6%q8'; + + +GRANT SELECT, INSERT, DELETE ON apo_pro_com_april_ten.APC_LOAN_DETAIL TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, INSERT, DELETE ON apo_pro_com_april_ten.APC_LOAN_FEE_NOTIFICATION TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, INSERT ON apo_pro_com_april_ten.APC_DELIVERY TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, INSERT ON apo_pro_com_april_ten.APC_OTHER_EXPENSE TO 'apoprocommobilelocalhost'@'localhost'; + +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_LOAN_DETAIL TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_LOAN_BY_RENOVATION TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_LOAN_BY_USER TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_USER_MOBILE_PREFERECE TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_PEOPLE TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_LOAN TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_TRANSFER TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, INSERT, UPDATE ON apo_pro_com_april_ten.APC_GASOLINE TO 'apoprocommobilelocalhost'@'localhost'; +-- SELECT +GRANT SELECT ON apo_pro_com_april_ten.APC_OFFICE TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_USER TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_TYPE TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_MONEY_DAILY TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_CLOSING_DAY TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_HUMAN_RESOURCE_HAS_ROUTE TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_ROUTE TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_USER_BY_OFFICE TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_HUMAN_RESOURCE TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, UPDATE ON apo_pro_com_april_ten.APC_STABLE_GENERAL_BOX TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, UPDATE ON apo_pro_com_april_ten.APC_STABLE_SMALL_BOX TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, UPDATE ON apo_pro_com_april_ten.APC_CLOSING_DAY TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT, INSERT ON apo_pro_com_april_ten.APC_BITACORA TO 'apoprocommobilelocalhost'@'localhost'; +-- Views +GRANT SELECT ON apo_pro_com_april_ten.APC_SECURITY_AUTHENTICATION_MOBILE TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_BY_USER_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_BY_USER_ORDER_PREFERENCE_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_PERSON_SEARCH_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_PERSON_SEARCH_DETAIL_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_AVAILABLE_CUSTOMERS_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_AVAILABLE_ENDORSEMENTS_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_CASH_REGISTER_CURDATE_BY_USER_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_TO_DELIVERY_BY_CERTIFIER_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_EXCHANGE_ENEBLED_USERS_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_TOTAL_CASH_BY_CURDATE_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_PERSON_SEARCH_HISTORICAL_DETAILS_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_APPROVED_DETAIL_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_USER_WEEK_REPORT_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_DETAIL_ZERO_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_FINISHED_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_ADVANCE_USER_DAILY_DASHBOARD_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_TRANSFER_IN_PENDING_STATUS_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_LOAN_IN_PENDING_STATUS_TO_DELIVERY_VIEW TO 'apoprocommobilelocalhost'@'localhost'; +-- ------------------------------------------------------------------------------------- +GRANT ALL ON apo_pro_com_april_ten.ARREBOL_TEST TO'apoprocommobilelocalhost'@'localhost'; +-- -------------------------------------------------------- + +-- +-- App user: `apcreportdesktop` report desktop user +-- + +CREATE USER 'apcreportdesktop'@'localhost' + IDENTIFIED BY 'hY5znQ8j'; + +GRANT SELECT ON apo_pro_com_april_ten.APC_USER TO 'apcreportdesktop'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_HUMAN_RESOURCE TO 'apcreportdesktop'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_TOTAL_CASH_BY_CURDATE_VIEW TO 'apcreportdesktop'@'localhost'; +GRANT SELECT ON apo_pro_com_april_ten.APC_CLOSING_DAILY_DETAIL_FROM_USER_BY_CURDATE_VIEW TO 'apcreportdesktop'@'localhost'; + +-- ------------------------------------------------------------------------------------- +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; \ No newline at end of file diff --git a/apc-db/src/create/from/scratch/apc-db-init-populate.sql b/apc-db/src/create/from/scratch/apc-db-init-populate.sql new file mode 100644 index 0000000..66a297d --- /dev/null +++ b/apc-db/src/create/from/scratch/apc-db-init-populate.sql @@ -0,0 +1,293 @@ +-- -------------------------------------------------------- +-- Arrebol Consuntancy +-- version 1.0.1 +-- http://www.arrebolconsultancy.com +-- -------------------------------------------------------- + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET AUTOCOMMIT = 0; +START TRANSACTION; +-- SET time_zone = "+00:00"; + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- -------------------------------------------------------- + +-- +-- Base de datos: Select `apo_pro_com_april_ten` DB +-- +USE `apo_pro_com_april_ten`; +-- -------------------------------------------------------- +-- +-- Volcado de datos para la tabla `APC_ROLE` +-- +INSERT INTO APC_ROLE(id,role_name,active_status,created_by) +VALUES +('56dd386a-88c8-11ea-a6b0-82987069bf80','DIRECTOR GENERAL','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('b9c76e82-88c8-11ea-a6b0-82987069bf80','GERENCIA','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('e7fbf750-88c8-11ea-a6b0-82987069bf80','SUPERVISOR REGIONAL','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('ee39d1aa-88c8-11ea-a6b0-82987069bf80','CERTIFICADOR Y FACILITADOR DE CREDITO','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('3e07c998-a81e-11ea-aa38-77eb3547c70f','JEFE DE ASESORES','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('b5b506f9-3ca4-4ceb-b938-dc58da3f039b','ASESORES DE CREDITO Y COBRANZA','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('e67360db-5953-46ba-9fe1-d71e30ae9b59','JURIDICO','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('b691aea2-3ba5-4e4d-a256-37f749a310bd','JEFE DE PERSONAL PRO FAM','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('44cb12f9-19e6-439a-9cd9-abdf4af38651','EJECUTIVO DE RUTA PRO FAM','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('23259ba5-7a0e-4503-a470-b8bd900635e1','AUXILIAR DE RUTA PRO FAM.','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'); +-- -------------------------------------------------------- +-- +-- Volcado de datos para la tabla `APC_HUMAN_RESOURCE` +-- +INSERT INTO APC_HUMAN_RESOURCE(id,first_name,second_name,last_name,middle_name,birthdate,avatar,human_resource_status, id_role ,created_by) +VALUES +('13c588a6-7d1b-11ea-af3e-28f659da398e','Ruben','','Campos','Bueno',str_to_date('1977-03-02','%Y-%m-%d'),'images/avatar1.png','ENEBLED','b9c76e82-88c8-11ea-a6b0-82987069bf80','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('c021214a-8bc7-11ea-b45c-c7b846343364','Hector','Alonso','Ubaldo','Nolasco',str_to_date('1977-03-02','%Y-%m-%d'),'https://freisteller24.eu/wp-content/uploads/2017/11/26603674-1200x1200.jpg','ENEBLED','b5b506f9-3ca4-4ceb-b938-dc58da3f039b','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('d2869da6-8bc7-11ea-b45c-c7b846343364','Juan','Carlos','Campos','Campos',str_to_date('1977-03-02','%Y-%m-%d'),'https://freisteller24.eu/wp-content/uploads/2017/11/97783667-1200x1200.jpg','ENEBLED','b5b506f9-3ca4-4ceb-b938-dc58da3f039b','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('088d7268-8bc7-11ea-b45c-c7b846343364','Avatar 4','Avatar 4','Campos','Campos',str_to_date('1977-03-02','%Y-%m-%d'),'https://freisteller24.eu/wp-content/uploads/2017/10/573675226-1200x1200.jpg','ENEBLED','ee39d1aa-88c8-11ea-a6b0-82987069bf80','0dc7c246-7db8-11ea-9b1f-500320958bf8'); +-- -------------------------------------------------------- +-- +-- Volcado de datos para la tabla `APC_OFFICE` +-- +INSERT INTO APC_OFFICE(id,office_name,office_status,created_by) +VALUES +-- Tepic +('caef3a64-7d1f-11ea-af3e-28f659da398e','TEPIC','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8'); +-- -------------------------------------------------------- +-- +-- Add APC_HUMAN_RESOURCE_BY_OFFICE +-- +INSERT INTO APC_HUMAN_RESOURCE_BY_OFFICE(id,id_human_resource,id_office,application_owner,created_by) +VALUES +-- Ruben +('e540fd40-8246-11ea-9f9f-a9ab5ed40dc4','13c588a6-7d1b-11ea-af3e-28f659da398e','caef3a64-7d1f-11ea-af3e-28f659da398e','APP_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +-- Hector Tepic +('14affe8c-8247-11ea-9f9f-a9ab5ed40dc4','c021214a-8bc7-11ea-b45c-c7b846343364','caef3a64-7d1f-11ea-af3e-28f659da398e','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +-- Juan Tepic +('f41be05a-8246-11ea-9f9f-a9ab5ed40dc4','d2869da6-8bc7-11ea-b45c-c7b846343364','caef3a64-7d1f-11ea-af3e-28f659da398e','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +-- Certificador Tepic +('0a8cf342-8247-11ea-9f9f-a9ab5ed40dc4','088d7268-8bc7-11ea-b45c-c7b846343364','caef3a64-7d1f-11ea-af3e-28f659da398e','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8'); +-- -------------------------------------------------------- +-- +-- Volcado de datos para la tabla `APC_USER` +-- +INSERT INTO APC_USER(id,id_human_resource,user_name,pwd,user_type,user_status,application_owner,created_by,certifier) +VALUES +-- Ruben WEB +('5751074e-7d1b-11ea-af3e-28f659da398e','13c588a6-7d1b-11ea-af3e-28f659da398e','ejecutivo','8478A4A2819E9C06AB738123C5D04B4FA1AA67548EBA64EAD40B635EA8AA8D5B','WEB','ENEBLED','APP_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8','DISABLED'), +-- Hector MOBILE +('092a95d8-7db8-11ea-9b1f-500320958bf8','c021214a-8bc7-11ea-b45c-c7b846343364','ruta3','8478A4A2819E9C06AB738123C5D04B4FA1AA67548EBA64EAD40B635EA8AA8D5B','MOBILE','ENEBLED','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8','DISABLED'), +-- Juan MOBILE +('0dc7c246-7db8-11ea-9b1f-500320958bf8','d2869da6-8bc7-11ea-b45c-c7b846343364','ruta7','8478A4A2819E9C06AB738123C5D04B4FA1AA67548EBA64EAD40B635EA8AA8D5B','MOBILE','ENEBLED','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8','DISABLED'), +-- Certificador MOBILE +('67b3081e-8bc9-11ea-b45c-c7b846343364','088d7268-8bc7-11ea-b45c-c7b846343364','certificador','8478A4A2819E9C06AB738123C5D04B4FA1AA67548EBA64EAD40B635EA8AA8D5B','MOBILE','ENEBLED','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8','ENEBLED'); +-- -------------------------------------------------------- +-- +-- Add APC_USER_BY_OFFICE +-- +INSERT INTO APC_USER_BY_OFFICE(id,id_user,id_office,user_by_office_status,application_owner,created_by) +VALUES +-- Ruben Tepic +('a742dfe8-7d20-11ea-af3e-28f659da398e','5751074e-7d1b-11ea-af3e-28f659da398e','caef3a64-7d1f-11ea-af3e-28f659da398e','ENEBLED','APP_OWNER','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +-- Hector Tepic +('d855f570-7dbb-11ea-9b1f-500320958bf8','092a95d8-7db8-11ea-9b1f-500320958bf8','caef3a64-7d1f-11ea-af3e-28f659da398e','ENEBLED','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +-- Juan Tepic +('eca3f824-7dbb-11ea-9b1f-500320958bf8','0dc7c246-7db8-11ea-9b1f-500320958bf8','caef3a64-7d1f-11ea-af3e-28f659da398e','ENEBLED','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8'), +-- Certificador Tepic +('e5a44222-7dbb-11ea-9b1f-500320958bf8','67b3081e-8bc9-11ea-b45c-c7b846343364','caef3a64-7d1f-11ea-af3e-28f659da398e','ENEBLED','APP_USER','0dc7c246-7db8-11ea-9b1f-500320958bf8'); +-- -------------------------------------------------------- +-- +-- Add APC_PERMISSION +-- +INSERT INTO `APC_PERMISSION` (`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , `permission_type`, `permission_status`,`created_by`) +VALUES +('7a6cbba2-7dba-11ea-9b1f-500320958bf8','public.access', 'public.access.description', 'public.access.path', 0, 10,'PUBLIC', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('001055b6-804f-11ea-bd33-54754d23c678','system.employee', 'system.employee.description', 'system.employee.path', 10, 10,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('7f116c66-7dba-11ea-9b1f-500320958bf8','system.user.create', 'system.user.create.description', 'system.user.create.path', 10, 20,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('87d3d32a-7dba-11ea-9b1f-500320958bf8','system.user.admin', 'system.user.admin.description', 'system.user.admin.path', 10, 30,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('8c54a1f4-7dba-11ea-9b1f-500320958bf8','system.user.access', 'system.user.access.description', 'system.user.access.path', 10, 40,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('3697f4e3-6a7d-46df-9618-60c632e3e472','catalog.role', 'catalog.role.description', 'catalog.role.path', 10, 50,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('572bccc2-4848-4dad-b63c-ddf6f29c14f7','catalog.typeLoan', 'catalog.typeLoan.description', 'catalog.typeLoan.path', 10, 60,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('7f139dd9-a1fb-42a4-866c-e70b4d84587a','catalog.route', 'catalog.route.description', 'catalog.route.path', 10, 70,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('58ef9e12-13b3-4a7d-a5ad-fd0db3557d3c','admin.customer', 'admin.customer.description', 'admin.customer.path', 10, 80,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('45f2cd84-98df-4991-be77-3f22dfa7d4b2','admin.endorsement', 'admin.endorsement.description', 'admin.endorsement.path', 10, 90,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('e492bbf5-b25e-4ff2-b126-dc92a733e921','admin.loan', 'admin.loan.description', 'admin.loan.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('fee9d1d9-3961-4dfa-a8e2-56eccae1e347','admin.transfer', 'admin.transfer.description', 'admin.transfer.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('7a8d71b0-1d2b-43ae-b7f7-fd048929ae8e','admin.moneyDaily', 'admin.moneyDaily.description', 'admin.moneyDaily.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('55a79bce-9466-44f8-8a13-7b69f176b80b','admin.closingDay', 'admin.closingDay.description', 'admin.closingDay.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('04d9cf0f-b8e9-46fb-9b77-b301dec9c533','admin.otherExpense', 'admin.otherExpense.description', 'admin.otherExpense.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('f01aeaac-8b18-4eb5-95ae-d02ae5a0716d','admin.goal', 'admin.goal.description', 'admin.goal.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('6c2ec1ce-9163-42b4-bbf1-8448e3894d55','admin.bonus', 'admin.bonus.description', 'admin.bonus.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('9067f64e-b2eb-4361-9c9b-c6dccc29e67f','admin.advance', 'admin.advance.description', 'admin.advance.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'), +('de5d48ac-2242-4937-95e2-1140b987b8c2','system.office', 'system.office.description', 'system.office.path', 10, 110,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'); +-- Permission by role +INSERT INTO `APC_PERMISSION` (`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , `permission_type`, `permission_status`,`created_by`, `parent_name`) +VALUES +-- employee +('dcfafbee-82a1-11ea-a6b6-200fe86028a8','system.employee.add', 'system.employee.add.description', 'system.employee.add.path', 10, 11,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.employee'), +('e2ea92a8-82a1-11ea-a6b6-200fe86028a8','system.employee.enebled', 'system.employee.enebled.description', 'system.employee.enebled.path', 10, 12,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.employee'), +('eb530786-82a1-11ea-a6b6-200fe86028a8','system.employee.disabled', 'system.employee.disabled.description', 'system.employee.disabled.path', 10, 13,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.employee'), +('f2245ed4-82a1-11ea-a6b6-200fe86028a8','system.employee.deleted', 'system.employee.deleted.description', 'system.employee.deleted.path', 10, 14,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.employee'), +('fec3b7a2-82a1-11ea-a6b6-200fe86028a8','system.employee.updated', 'system.employee.updated.description', 'system.employee.updated.path', 10, 15,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.employee'), +-- user create +('065b2432-82a2-11ea-a6b6-200fe86028a8','system.user.create.permission', 'system.user.create.permission.description', 'system.user.create.permission.path', 10, 21,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.user.create'), +('10d740d0-82a2-11ea-a6b6-200fe86028a8','system.user.admin.enebled', 'system.user.admin.enebled.description', 'system.user.admin.enebled.path', 10, 31,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.user.admin'), +('36b619fe-82fa-11ea-a6b6-200fe86028a8','system.user.admin.disabled', 'system.user.admin.disabled.description', 'system.user.admin.disabled.path', 10, 32,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.user.admin'), +('2fcf2806-82fa-11ea-a6b6-200fe86028a8','system.user.admin.deleted', 'system.user.admin.deleted.description', 'system.user.admin.deleted.path', 10, 33,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.user.admin'), +('282079e8-82fa-11ea-a6b6-200fe86028a8','system.user.admin.updated', 'system.user.admin.updated.description', 'system.user.admin.updated.path', 10, 34,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.user.admin'), +('176d3744-82fa-11ea-a6b6-200fe86028a8','system.user.admin.pwd', 'system.user.admin.pwd.description', 'system.user.admin.pwd.path', 10, 35,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.user.admin'), +('1fecd260-82a2-11ea-a6b6-200fe86028a8','system.user.admin.avatar', 'system.user.admin.avatar.description', 'system.user.admin.avatar.path', 10, 36,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.user.admin'), +-- office +('c5ef3b18-6cc2-4d62-88ba-41304c6ae9c8','system.office.add', 'system.office.add.description', 'system.office.add.path', 10, 111,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.user.admin'), +('037ea752-c33f-4bfe-ae84-da867de0d7cd','system.office.updated', 'system.office.updated.description', 'system.office.updated.path', 10, 112,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.user.admin'), +('65399669-44da-4e17-9217-c6b89c1f0a61','system.office.deleted', 'system.office.deleted.description', 'system.office.deleted.path', 10, 113,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','system.user.admin'); + +INSERT INTO `APC_PERMISSION` (`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , `permission_type`, `permission_status`,`created_by`, `parent_name`) +VALUES +-- role +('96f78612-1e06-47cf-a282-f4f1a14f8e0d','catalog.role.add', 'catalog.role.add.description', 'catalog.role.add.path', 10, 51,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','catalog.role'), +('1c8175f5-dcde-4611-b2d7-9b79a68b3f0c','catalog.role.updated', 'catalog.role.updated.description', 'catalog.role.updated.path', 10, 52,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','catalog.role'), +('4c11f842-6c29-4d18-a58c-595df41afaa0','catalog.role.deleted', 'catalog.role.deleted.description', 'catalog.role.deleted.path', 10, 53,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','catalog.role'), +-- type loan +('29445731-3e36-427b-a14a-ee53b9699582','catalog.typeLoan.add', 'catalog.typeLoan.add.description', 'catalog.typeLoan.add.path', 10, 61,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','catalog.typeLoan'), +('39482063-a243-490b-bb78-0c0599bce30e','catalog.typeLoan.updated', 'catalog.typeLoan.updated.description', 'catalog.typeLoan.updated.path', 10, 62,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','catalog.typeLoan'), +('c573acd1-cb14-4464-8bbc-b962dbb0bc62','catalog.typeLoan.deleted', 'catalog.typeLoan.deleted.description', 'catalog.typeLoan.deleted.path', 10, 63,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','catalog.typeLoan'), +-- route +('ab812966-4df0-4462-a9e2-a2c364cf97f1','catalog.route.add', 'catalog.route.add.description', 'catalog.route.add.path', 10, 71,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','catalog.route'), +('886ab08d-9494-4ae4-8635-4a6b4363cdf7','catalog.route.updated', 'catalog.route.updated.description', 'catalog.route.updated.path', 10, 72,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','catalog.route'), +('629c0be7-b3a9-49f5-9c20-3f6681a4b6d3','catalog.route.deleted', 'catalog.route.deleted.description', 'catalog.route.deleted.path', 10, 73,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','catalog.route'); + +INSERT INTO `APC_PERMISSION` (`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , `permission_type`, `permission_status`,`created_by`, `parent_name`) +VALUES +-- customer +('65928cb3-f463-4266-9d29-bc29c560c891','admin.customer.add', 'admin.customer.add.description', 'admin.customer.add.path', 10, 81,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.customer'), +('b209327b-f568-4783-8da1-7d45b88fd65b','admin.customer.updated', 'admin.customer.updated.description', 'admin.customer.updated.path', 10, 82,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.customer'), +('6aeb69ff-bb96-4ab9-9d07-8a3b237cfc9e','admin.customer.deleted', 'admin.customer.deleted.description', 'admin.customer.deleted.path', 10, 83,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.customer'), +-- endorsement +('8bee00dc-199f-43c5-8e83-5d670502552b','admin.endorsement.add', 'admin.endorsement.add.description', 'admin.endorsement.add.path', 10, 91,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.endorsement'), +('d16b9b0b-7c4d-456a-a257-ed67586226b0','admin.endorsement.updated', 'admin.endorsement.updated.description', 'admin.endorsement.updated.path', 10, 92,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.endorsement'), +('b57da38c-ba69-4d1e-944f-0dd1f11d816f','admin.endorsement.deleted', 'admin.endorsement.deleted.description', 'admin.endorsement.deleted.path', 10, 93,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.endorsement'), +-- loan +('cca7b7e8-2d41-471b-bb81-c4ca518294dc','admin.loan.add', 'admin.loan.add.description', 'admin.loan.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.loan'), +('55fd99c6-8110-4604-901b-0ed95ca31132','admin.loan.updated', 'admin.loan.updated.description', 'admin.loan.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.loan'), +('1e98037f-1950-417e-be11-39b51203c409','admin.loan.deleted', 'admin.loan.deleted.description', 'admin.loan.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.loan'), +-- transfer +('0d582b8a-2820-4a58-95ca-37484daa8304','admin.transfer.add', 'admin.transfer.add.description', 'admin.transfer.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.transfer'), +('f8bb6db8-acd1-4c5e-845a-ef62f16c7b2d','admin.transfer.updated', 'admin.transfer.updated.description', 'admin.transfer.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.transfer'), +('ae782c52-1e20-40a3-88cf-28f2fb7d7583','admin.transfer.deleted', 'admin.transfer.deleted.description', 'admin.transfer.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.transfer'), +-- money daily +('d14f5077-ecd9-467e-b274-8674e1955667','admin.moneyDaily.add', 'admin.moneyDaily.add.description', 'admin.moneyDaily.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.moneyDaily'), +('a8f492bf-0a8b-4a4e-9d61-0de2b7153334','admin.moneyDaily.updated', 'admin.moneyDaily.updated.description', 'admin.moneyDaily.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.moneyDaily'), +('285860be-92fd-4c7a-bac2-eec1f530d6d9','admin.moneyDaily.deleted', 'admin.moneyDaily.deleted.description', 'admin.moneyDaily.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.moneyDaily'), +-- closing day +('8ab4bea2-3e00-4474-bf94-e01f1ed6b52c','admin.closingDay.add', 'admin.closingDay.add.description', 'admin.closingDay.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.closingDay'), +('89d55a97-8bc4-4430-8e8d-ce8d15851695','admin.closingDay.updated', 'admin.closingDay.updated.description', 'admin.closingDay.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.closingDay'), +('4e8ab1c5-1889-45b3-8550-101f300b2e70','admin.closingDay.deleted', 'admin.closingDay.deleted.description', 'admin.closingDay.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.closingDay'), +-- other expense +('f8b6306b-166d-48b8-8626-0e8a92970c17','admin.otherExpense.add', 'admin.otherExpense.add.description', 'admin.otherExpense.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.otherExpense'), +('2dbc0faa-2cd0-4490-a5af-e6a8eb4eb132','admin.otherExpense.updated', 'admin.otherExpense.updated.description', 'admin.otherExpense.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.otherExpense'), +('aa7c8eca-2117-45a0-b7ce-6d78599b0a66','admin.otherExpense.deleted', 'admin.otherExpense.deleted.description', 'admin.otherExpense.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.otherExpense'), +-- goal +('2e3e6bc1-6baf-4fde-9cc2-c60cd4c1d2f3','admin.goal.add', 'admin.goal.add.description', 'admin.goal.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.goal'), +('6add466f-4a1d-464a-a96c-2aecc67087ab','admin.goal.updated', 'admin.goal.updated.description', 'admin.goal.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.goal'), +('cd3306f9-b713-4995-a8bf-7585e42c2ca0','admin.goal.deleted', 'admin.goal.deleted.description', 'admin.goal.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.goal'), +-- bonus +('71e44e75-91e8-4a55-8d36-d24e2a645f10','admin.bonus.add', 'admin.bonus.add.description', 'admin.bonus.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.bonus'), +('14b6bf11-cc3b-41d9-b589-7c2aebc5dbeb','admin.bonus.updated', 'admin.bonus.updated.description', 'admin.bonus.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.bonus'), +('9f5d7c8d-2115-4114-82a6-5b7329c3efc7','admin.bonus.deleted', 'admin.bonus.deleted.description', 'admin.bonus.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.bonus'), +-- advance +('961193c0-754e-4444-b281-7c62aacb3987','admin.advance.add', 'admin.advance.add.description', 'admin.advance.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.advance'), +('0fa64abd-3e2a-4a42-96cf-1672bdd51086','admin.advance.updated', 'admin.advance.updated.description', 'admin.advance.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.advance'), +('6ee26a46-919b-4400-8837-31762892fa97','admin.advance.deleted', 'admin.advance.deleted.description', 'admin.advance.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.advance'); + +-- Entradas de caja general +INSERT INTO `APC_PERMISSION` (`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , `permission_type`, `permission_status`,`created_by`) +VALUES +('1bd221ee-bfd2-49e1-899a-8456cc05e559','admin.expenseCompanyIn', 'admin.expenseCompanyIn.description', 'admin.expenseCompanyIn.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'); + +INSERT INTO `APC_PERMISSION` (`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , `permission_type`, `permission_status`,`created_by`,`parent_name`) +VALUES +('b855fbbc-e25a-4051-8789-9ec9af62ce3a','admin.expenseCompanyIn.add', 'admin.expenseCompanyIn.add.description', 'admin.expenseCompanyIn.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.expenseCompanyIn'), +('8165c4e7-eb55-4eb7-bb07-98e14234ad8b','admin.expenseCompanyIn.updated', 'admin.expenseCompanyIn.updated.description', 'admin.expenseCompanyIn.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.expenseCompanyIn'), +('292e5385-1368-4b8d-895d-638181e05e0d','admin.expenseCompanyIn.deleted', 'admin.expenseCompanyIn.deleted.description', 'admin.expenseCompanyIn.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.expenseCompanyIn'); + +-- Salidas de caja general +INSERT INTO `APC_PERMISSION` (`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , `permission_type`, `permission_status`,`created_by`) +VALUES +('a5301073-05f2-4d80-bed9-e39e0739ee95','admin.expenseCompanyOut', 'admin.expenseCompanyOut.description', 'admin.expenseCompanyOut.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'); + +INSERT INTO `APC_PERMISSION` (`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , `permission_type`, `permission_status`,`created_by`,`parent_name`) +VALUES +('8d4985e8-c3e1-4534-9ebc-06d2f708398c','admin.expenseCompanyOut.add', 'admin.expenseCompanyOut.add.description', 'admin.expenseCompanyOut.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.expenseCompanyOut'), +('3d812774-98ec-4157-ab62-5a60a69f6ddd','admin.expenseCompanyOut.updated', 'admin.expenseCompanyOut.updated.description', 'admin.expenseCompanyOut.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.expenseCompanyOut'), +('c59fd63d-7658-40e9-82be-c2a75221e200','admin.expenseCompanyOut.deleted', 'admin.expenseCompanyOut.deleted.description', 'admin.expenseCompanyOut.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.expenseCompanyOut'); + +-- Cuadre de caja general +INSERT INTO `APC_PERMISSION` (`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , `permission_type`, `permission_status`,`created_by`) +VALUES +('a18072cb-ff92-4763-977c-c604828ff4c7','admin.stableGeneralBox', 'admin.stableGeneralBox.description', 'admin.stableGeneralBox.path', 10, 100,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8'); + +INSERT INTO `APC_PERMISSION` (`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , `permission_type`, `permission_status`,`created_by`,`parent_name`) +VALUES +('4273bd52-7435-483b-a185-d6686c8fb3e7','admin.stableGeneralBox.add', 'admin.stableGeneralBox.add.description', 'admin.stableGeneralBox.add.path', 10, 101,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.stableGeneralBox'), +('2cceb95d-6d3c-4c67-8c9f-cedc75d4e293','admin.stableGeneralBox.updated', 'admin.stableGeneralBox.updated.description', 'admin.stableGeneralBox.updated.path', 10, 102,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.stableGeneralBox'), +('c46ebab5-904c-4cc1-8c77-49a9fded0fba','admin.stableGeneralBox.deleted', 'admin.stableGeneralBox.deleted.description', 'admin.stableGeneralBox.deleted.path', 10, 103,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.stableGeneralBox'); + +INSERT INTO APC_USER_BY_OFFICE_HAS_PERMISSION (id_user_by_office,id_permission,created_by) +SELECT +-- Ruben Tepic +'a742dfe8-7d20-11ea-af3e-28f659da398e', +id, +'0dc7c246-7db8-11ea-9b1f-500320958bf8' +FROM APC_PERMISSION; + + +INSERT INTO APC_USER_MOBILE_PREFERECE(id,id_user,preference_name,preference_value,created_by,created_on) +VALUES +-- Hector +('235e819e-8bbe-11ea-8c0e-beeb61238d59','092a95d8-7db8-11ea-9b1f-500320958bf8','ORDER_LIST','ALPHABETICALLY','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +-- Juan +('e914e614-8bd0-11ea-b45c-c7b846343364','0dc7c246-7db8-11ea-9b1f-500320958bf8','ORDER_LIST','ALPHABETICALLY','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +-- Certificador +('ef48f296-8bd0-11ea-b45c-c7b846343364','67b3081e-8bc9-11ea-b45c-c7b846343364','ORDER_LIST','ALPHABETICALLY','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()); +-- ------------------------- +-- Logica de negocio de los +-- pagos de APC +-- ------------------------- +-- FALTA CREAR RUTA +INSERT INTO APC_ROUTE(id,id_office,route_name,active_status,created_by, created_on) +VALUES +-- Tepic +('51b207a2-8e19-11ea-b65e-4e1376171215','caef3a64-7d1f-11ea-af3e-28f659da398e','Ruta 3 Tepic','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('55baf3ae-8e19-11ea-b65e-4e1376171215','caef3a64-7d1f-11ea-af3e-28f659da398e','Ruta 7 Tepic','ENEBLED','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()); + +INSERT INTO APC_LOAN_TYPE(id,loan_type_name,total_days, loan_fee, payment,payment_daily,payment_total, id_office,created_by, created_on,opening_fee) +VALUES +-- Para tepic +('db833bf0-8e5e-11ea-8ee4-e54bc704beac','Prestamo $1000', 22,50,1000,60,1320,'caef3a64-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),20), +('c59e5bee-8dff-11ea-8745-07889553dd5f','Prestamo $2000', 22,50,2000,120,2640,'caef3a64-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),40), +('dc255a16-8dff-11ea-8745-07889553dd5f','Prestamo $3000', 22,50,3000,180,3960,'caef3a64-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),60), +('e7cc91c2-8dff-11ea-8745-07889553dd5f','Prestamo $4000', 22,50,4000,240,5280,'caef3a64-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),80), +('f0cb05ba-8dff-11ea-8745-07889553dd5f','Prestamo $5000', 22,50,5000,300,6600,'caef3a64-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),100), +('fdaa4318-8dff-11ea-8745-07889553dd5f','Prestamo $6000', 22,50,6000,360,7920,'caef3a64-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),120), + +('32af80cf-5961-4ed9-9bbb-c8c3d17151c0','Prestamo $7000', 22,50,7000,420,9240,'caef3a64-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),140), +('a436bf31-8229-4817-b014-3a1c76bffe9d','Prestamo $8000', 22,50,8000,480,10560,'caef3a64-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),160), +('f0f2fe2a-a7ec-45e6-80ea-f46a1e689584','Prestamo $9000', 22,50,9000,540,11880,'caef3a64-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),180), +('4015d73b-6d05-4f69-a5f3-d446e3870f40','Prestamo $10000', 22,50,10000,600,13200,'caef3a64-7d1f-11ea-af3e-28f659da398e','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW(),200); + +INSERT INTO APC_HUMAN_RESOURCE_HAS_ROUTE(id_human_resource,id_route,created_by,created_on) +VALUES +-- Hector +('c021214a-8bc7-11ea-b45c-c7b846343364','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +-- Juan +('d2869da6-8bc7-11ea-b45c-c7b846343364','55baf3ae-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +-- Certificador +('088d7268-8bc7-11ea-b45c-c7b846343364','51b207a2-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()), +('088d7268-8bc7-11ea-b45c-c7b846343364','55baf3ae-8e19-11ea-b65e-4e1376171215','0dc7c246-7db8-11ea-9b1f-500320958bf8',NOW()); + +COMMIT; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/apc-db/src/create/from/scratch/apc-db-tables.sql b/apc-db/src/create/from/scratch/apc-db-tables.sql new file mode 100644 index 0000000..518bcce --- /dev/null +++ b/apc-db/src/create/from/scratch/apc-db-tables.sql @@ -0,0 +1,1016 @@ +-- -------------------------------------------------------- +-- Arrebol Consuntancy +-- version 1.0.1 +-- http://www.arrebolconsultancy.com +-- -------------------------------------------------------- + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET AUTOCOMMIT = 0; +START TRANSACTION; +-- SET time_zone = "+00:00"; + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +DROP DATABASE IF EXISTS `apo_pro_com_april_ten`; + +CREATE DATABASE IF NOT EXISTS `apo_pro_com_april_ten` DEFAULT CHARACTER SET latin1 COLLATE latin1_spanish_ci; +USE `apo_pro_com_april_ten`; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_ERROR_APP_LOG` +-- +CREATE TABLE `APC_ERROR_APP_LOG` ( + `id_log` varchar(36) NOT NULL, + `log_entry_date` timestamp NULL DEFAULT NULL, + `log_logger` varchar(100) DEFAULT NULL, + `log_level` varchar(100) DEFAULT NULL, + `log_message` varchar(250) DEFAULT NULL, + `log_exception` varchar(4000) DEFAULT NULL, + PRIMARY KEY (`id_log`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_OFFICE` +-- +CREATE TABLE `APC_OFFICE` ( + `id` char(36) NOT NULL, + `office_name` varchar(100) NOT NULL, + `address` varchar(250) DEFAULT NULL, + `office_status` enum('ENEBLED','DISABLED','DELETED') NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_office_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_office_uk` UNIQUE KEY (`office_name`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_ROLE` +-- +CREATE TABLE `APC_ROLE` ( + `id` char(36) NOT NULL, + `role_name` varchar(100) NOT NULL, + `active_status` enum('ENEBLED','DISABLED') NOT NULL DEFAULT 'ENEBLED', + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_role_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_role_uk` UNIQUE KEY (`role_name`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_ROUTE` +-- +CREATE TABLE `APC_ROUTE`( + `id` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `route_name` varchar(25) NOT NULL, + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_route_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_route_uk` UNIQUE KEY (`id_office`,`route_name`), + CONSTRAINT `apc_route_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_BONUS` +-- +-- Dar de alta los bonos activos. +-- +CREATE TABLE `APC_BONUS`( + `id` char(36) NOT NULL, + `name` varchar(100) NOT NULL, + `loan_bonus` numeric(8,2) NOT NULL, + `mora_bonus` numeric(8,2) NOT NULL, + `new_customer_bonus` numeric(8,2) NOT NULL, + `administrative` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `id_office` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_bono_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_bono_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_HUMAN_RESOURCES` +-- +CREATE TABLE `APC_HUMAN_RESOURCE` ( + `id` char(36) NOT NULL, + `first_name` varchar(25) NOT NULL, + `second_name` varchar(25) DEFAULT NULL, + `last_name` varchar(25) NOT NULL, + `middle_name` varchar(25) NOT NULL, + `birthdate` date DEFAULT NULL, + `avatar` varchar(150) NOT NULL, + `curp` varchar(20) DEFAULT NULL, + `rfc` varchar(13) DEFAULT NULL, + `ife` varchar(20) DEFAULT NULL, + `admission_date` date DEFAULT NULL, + `human_resource_status` ENUM('ENEBLED', 'DISABLED', 'DELETED') NOT NULL, + `id_role` char(36) NOT NULL, + `id_bonus` char(36) DEFAULT NULL, + `payment` numeric(8,2) DEFAULT NULL, + `imss` numeric(8,2) DEFAULT NULL, + `balance` decimal(8,2) NOT NULL, + `employee_saving` DECIMAL(8,2) DEFAULT 0.00, + `created_by` char(36) DEFAULT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `person_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_human_resource_to_apc_role_fk` + FOREIGN KEY (`id_role`) REFERENCES `APC_ROLE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_human_resource_to_apc_bonus_fk` + FOREIGN KEY (`id_bonus`) REFERENCES `APC_BONUS`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_HUMAN_RESOURCE_HAS_ROUTE` +-- +CREATE TABLE `APC_HUMAN_RESOURCE_HAS_ROUTE`( + `id_human_resource` char(36) NOT NULL, + `id_route` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_human_resource_has_route_pk` PRIMARY KEY (`id_human_resource`, `id_route`), + CONSTRAINT `apc_human_resource_has_route_to_apc_human_resource_fk` + FOREIGN KEY (`id_human_resource`) REFERENCES `APC_HUMAN_RESOURCE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_human_resource_has_route_to_apc_office_fk` + FOREIGN KEY (`id_route`) REFERENCES `APC_ROUTE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_PEOPLE` +-- +CREATE TABLE `APC_PEOPLE`( + `id` char(36) NOT NULL, + `first_name` varchar(25) NOT NULL, + `second_name` varchar(25) DEFAULT NULL, + `last_name` varchar(25) NOT NULL, + `middle_name` varchar(25) NOT NULL, + `birthdate` date DEFAULT NULL, + `thumbnail` varchar(250) NOT NULL, + `phone_home` varchar(15) NOT NULL, + `address_home` varchar(150) NOT NULL, + `phone_business` varchar(15), + `address_business` varchar(150), + `company_name` varchar(150), + `people_type` ENUM('CUSTOMER', 'ENDORSEMENT', 'BOTH') NOT NULL DEFAULT 'CUSTOMER', + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `id_office` char(36) NOT NULL, + `id_route` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_people_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_people_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_people_to_apc_route_fk` + FOREIGN KEY (`id_route`) REFERENCES `APC_ROUTE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_LOAN_TYPE` +-- +CREATE TABLE `APC_LOAN_TYPE`( + `id` char(36) NOT NULL, + `loan_type_name` varchar(50) NOT NULL, + `total_days` smallint NOT NULL DEFAULT 22, + `loan_fee` numeric(8,2) NOT NULL,-- Multa + `opening_fee` int NOT NULL, -- Comisión + `payment` numeric(8,2) NOT NULL,-- Monte del prestamo + `payment_daily` numeric(8,2) NOT NULL,-- 60 x c/1000 + `payment_total` numeric(8,2) NOT NULL, -- Prestamo más intereses + `payment_monday` ENUM('MONDAY'), + `payment_tuesday` ENUM('TUESDAY'), + `payment_wednesday` ENUM('WEDNESDAY'), + `payment_thursday` ENUM('THURSDAY'), + `payment_friday` ENUM('FRIDAY'), + `payment_saturday` ENUM('SATURDAY'), + `payment_sunday` ENUM('SUNDAY'), + `convenio` ENUM('ENEBLED','DISABLED') DEFAULT 'DISABLED' + `id_office` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_loan_type_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_loan_type_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_LOAN` +-- +CREATE TABLE `APC_LOAN`( + `id` char(36) NOT NULL, + `id_loan_type` char(36) NOT NULL, + `id_customer` char(36) NOT NULL, + `id_endorsement` char(36) NOT NULL, + `id_route` char(36) NOT NULL, + `loan_status` ENUM('PENDING','FINISH','BLACK_LIST','APPROVED','REJECTED','PENDING_RENOVATION','TO_DELIVERY','DELETED') NOT NULL DEFAULT 'PENDING', + `new_customer` ENUM('ENEBLED', 'DISABLED') DEFAULT 'DISABLED', + `amount_paid` numeric(8,2) NOT NULL, + `amount_to_pay` numeric(8,2) NOT NULL, + `last_reference_number` smallint NOT NULL, + `comments` varchar(200), + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36), + `last_updated_on` datetime, + CONSTRAINT `apc_loan_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_loan_to_apc_loan_type_fk` + FOREIGN KEY (`id_loan_type`) REFERENCES `APC_LOAN_TYPE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_loan_to_apc_person_as_customer_fk` + FOREIGN KEY (`id_customer`) REFERENCES `APC_PEOPLE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_loan_to_apc_person_as_endorsement_fk` + FOREIGN KEY (`id_endorsement`) REFERENCES `APC_PEOPLE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_loan_to_apc_route_fk` + FOREIGN KEY (`id_route`) REFERENCES `APC_ROUTE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_HUMAN_RESOURCE_BY_OFFICE` +-- +CREATE TABLE `APC_HUMAN_RESOURCE_BY_OFFICE`( + `id` char(36) NOT NULL, + `id_human_resource` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `application_owner` ENUM('APP_OWNER', 'APP_USER') NOT NULL DEFAULT 'APP_USER', + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_human_resource_by_office_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_human_resource_by_office_uk` UNIQUE KEY (`id_human_resource`, `id_office`), + CONSTRAINT `apc_human_resource_by_office_to_apc_human_resource_fk` + FOREIGN KEY (`id_human_resource`) REFERENCES `APC_HUMAN_RESOURCE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_human_resource_by_office_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_USER` +-- +CREATE TABLE `APC_USER`( + `id` char(36) NOT NULL, + `id_human_resource` char(36) NOT NULL, + `user_name` varchar(100) NOT NULL, + `pwd` varchar(100)NOT NULL, + `user_type` ENUM('WEB', 'MOBILE', 'BOTH') NOT NULL, + `user_status` ENUM('ENEBLED', 'DISABLED', 'DELETED') NOT NULL, + `application_owner` ENUM('APP_OWNER', 'APP_USER') NOT NULL DEFAULT 'APP_USER', + `certifier` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'DISABLED', + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_user_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_user_by_office_to_apc_human_resource_fk` + FOREIGN KEY (`id_human_resource`) REFERENCES `APC_HUMAN_RESOURCE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_LOAN_DETAIL` +-- +CREATE TABLE `APC_LOAN_DETAIL`( + `id` char(36) NOT NULL, + `id_loan` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `people_type` ENUM('CUSTOMER', 'ENDORSEMENT') NOT NULL DEFAULT 'CUSTOMER', + `payment_amount` numeric(8,2) NOT NULL, + `reference_number` smallint NOT NULL, + `loan_details_type` ENUM('CREDIT_PAYMENT','DEBIT_PAYMENT','PAYMENT','FEE','RENOVATION_PAYMENT','TRANSFER') NOT NULL, + `loan_comments` varchar(150), + `fee_status` enum('TO_PAY','PAID') DEFAULT 'TO_PAY', + `transfer_status` enum('AUTHORIZED','PENDING','REJECTED') DEFAULT 'PENDING', + `transfer_number` varchar(100), + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_loan_details_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_loan_details_uk` UNIQUE KEY (`id`,`reference_number`), + CONSTRAINT `apc_loan_details_to_apc_loan_fk` + FOREIGN KEY (`id_loan`) REFERENCES +APC_LOAN`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_loan_details_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_LOAN_FEE_NOTIFICATION` +-- +CREATE TABLE `APC_LOAN_FEE_NOTIFICATION`( + `id` char(36) NOT NULL, + `id_loan` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `notification_number` smallint NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_loan_notification_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_loan_notification_to_apc_loan_fk` + FOREIGN KEY (`id_loan`) REFERENCES `APC_LOAN`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_loan_notification_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_LOAN_BY_USER` +-- +CREATE TABLE `APC_LOAN_BY_USER`( + `id_loan` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `loan_by_user_status` enum('PENDING','FINISH','BLACK_LIST','APPROVED','REJECTED','PENDING_RENOVATION','TO_DELIVERY','DELETED') NOT NULL DEFAULT 'PENDING', + `comments` varchar(150) DEFAULT NULL, + `owner_loan` enum('CURRENT_OWNER','OLD_OWNER') NOT NULL, + `order_in_list` smallint(6) DEFAULT '0', + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_loan_by_user_pk` PRIMARY KEY (`id_loan`, `id_user`), + CONSTRAINT `apc_loan_by_user_to_apc_loan_fk` + FOREIGN KEY (`id_loan`) REFERENCES `APC_LOAN`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_loan_by_user_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_LOAN_BY_RENOVATION` +-- +CREATE TABLE `APC_LOAN_BY_RENOVATION`( + `id_loan_old` char(36) NOT NULL, + `id_loan_new` char(36) NOT NULL, + `loan_by_renovation_status` ENUM('PENDING', 'APPROVED','REJECTED') NOT NULL DEFAULT 'PENDING', + `comments` varchar(150), + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_loan_by_renovation_pk` PRIMARY KEY (`id_loan_old`, `id_loan_new`), + CONSTRAINT `apc_loan_by_renovation_old_to_apc_loan_fk` + FOREIGN KEY (`id_loan_old`) REFERENCES `APC_LOAN`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_loan_by_renovation_new_to_apc_user_fk` + FOREIGN KEY (`id_loan_new`) REFERENCES `APC_LOAN`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_USER_BY_OFFICE` +-- +CREATE TABLE `APC_USER_BY_OFFICE`( + `id` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `user_by_office_status` ENUM('ENEBLED', 'DISABLED', 'DELETED') NOT NULL, + `application_owner` ENUM('APP_OWNER', 'APP_USER')NOT NULL DEFAULT 'APP_USER', + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_user_by_office_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_user_by_office_uk` UNIQUE KEY (`id_user`, `id_office`), + CONSTRAINT `apc_user_by_office_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_user_by_office_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_PERMISSION` +-- +CREATE TABLE `APC_PERMISSION` ( + `id` char(36) NOT NULL, + `permission` varchar(200) NOT NULL, -- dashboard.policy.to.expire.name + `description` varchar(200) NOT NULL, -- dashboard.policy.to.expire.description + `menu_path` varchar(200) NOT NULL, -- dashboard.policy.to.expire.path + `left_to_right_order` smallint NOT NULL, -- Orden en la que aparece el menu principal (Dashboard, Administración, Catálogo) + `top_to_bottom_order` smallint NOT NULL, -- Orden en la que aparece de arriba hacia abajo + `permission_type` ENUM('PUBLIC', 'PRIVATE', 'EXCLUSIVE') NOT NULL, + `parent_name` varchar(200), + `permission_status` ENUM('ENEBLED', 'DISABLED') NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_permission_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_permission_uk` UNIQUE KEY (`permission`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_USER_BY_OFFICE_HAS_PERMISSION` +-- +CREATE TABLE `APC_USER_BY_OFFICE_HAS_PERMISSION` ( + `id_user_by_office` char(36) NOT NULL, + `id_permission` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_user_by_office_has_permission_pk` PRIMARY KEY (`id_user_by_office`,`id_permission`) , + CONSTRAINT `apc_user_by_office_has_permission_to_apc_user_by_office_fk` + FOREIGN KEY (`id_user_by_office`) REFERENCES `APC_USER_BY_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_user_by_office_has_permission_to_apc_permission_fk` + FOREIGN KEY (`id_permission`) REFERENCES `APC_PERMISSION`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_USER_MOBILE_PREFERECE` +-- +CREATE TABLE `APC_USER_MOBILE_PREFERECE`( + `id` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `preference_name` varchar(25) NOT NULL, + `preference_value` varchar(25) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_user_mobile_preference_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_user_mobile_preference_uk` UNIQUE KEY (`id_user`,`preference_name`), + CONSTRAINT `apc_user_mobile_preference_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_TRANSFER` +-- +CREATE TABLE `APC_TRANSFER`( + `id` char(36) NOT NULL, + `id_user_transmitter` char(36) NOT NULL, + `id_user_receiver` char(36) NOT NULL, + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `action_status` ENUM('PENDING', 'APPROVED','REJECTED') NOT NULL DEFAULT 'PENDING', + `amount_to_transfer` numeric(8,2) NOT NULL, + `id_office` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_transfer_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_transfer_user_transmitter_to_apc_user_fk` + FOREIGN KEY (`id_user_transmitter`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_transfer_user_receiver_to_apc_user_fk` + FOREIGN KEY (`id_user_receiver`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_transfer_by_office_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_MONEY_DAILY` +-- +CREATE TABLE `APC_MONEY_DAILY`( + `id` char(36) NOT NULL, + `money_daily_date` datetime DEFAULT CURRENT_TIMESTAMP, + `amount` numeric(8,2) NOT NULL, + `id_user` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_money_daily_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_money_daily_by_id_user_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_money_daily_by_id_office_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de la tabla `APC_DELIVERY` +-- +CREATE TABLE `APC_DELIVERY`( + `id` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `id_loan` char(36) NOT NULL, + `amount` numeric(8,2) NOT NULL, + `comission` comission enum('INCLUDED','EXCLUDED') DEFAULT 'INCLUDED', + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_delivery_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_delivery_by_id_user_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_delivery_to_apc_loan_fk` + FOREIGN KEY (`id_loan`) REFERENCES `APC_LOAN`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- ------------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_CLOSING_DAY` +-- +CREATE TABLE `APC_CLOSING_DAY`( + `id` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `amount_paid` numeric(8,2) NOT NULL, + `amount_expected` numeric(8,2) NOT NULL, + `comments` varchar(250), + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_closing_day_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_closing_day_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_closing_day_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- ------------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_OTHER_EXPENSE` +-- +CREATE TABLE `APC_OTHER_EXPENSE`( + `id` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `expense` numeric(8,2) NOT NULL, + `description` varchar(200) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_other_expense_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_other_expense_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_other_expense_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_GOAL` +-- +-- Dar de alta las metas de los trabajadores. +-- +CREATE TABLE `APC_GOAL`( + `id` char(36) NOT NULL, + `start_date` date NOT NULL, + `end_date` date NOT NULL, + `amount` numeric(8,2) NOT NULL, + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `id_office` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_goal_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_goal_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_ADVANCE` +-- +-- Adelanto de nomina. +-- +CREATE TABLE `APC_ADVANCE`( + `id` char(36) NOT NULL, + `id_human_resource` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `amount` numeric(8,2) NOT NULL, + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_advance_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_advance_to_apc_human_resource_fk` + FOREIGN KEY (`id_human_resource`) REFERENCES `APC_HUMAN_RESOURCE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_advance_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------------------- +-- +-- Estructura para la tabla `APC_EXPENSE_COMPANY` +-- +-- Gastos de la compañia. +-- +CREATE TABLE `APC_EXPENSE_COMPANY`( + `id` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `amount` numeric(8,2) NOT NULL, + `description` varchar(200), + `expense_company_type` ENUM('PAYMENT_IN', 'PAYMENT_OUT') NOT NULL, + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_expense_company_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_expense_company_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------------------- +-- +-- Estructura para la tabla `APC_STABLE_GENERAL_BOX` +-- +-- Totales de la caja de APC. +-- +CREATE TABLE `APC_STABLE_GENERAL_BOX`( + `id` char(36) NOT NULL, + `total_general_box` decimal(8,2) NOT NULL, + `total_envelope` decimal(8,2) NOT NULL, + `total_bank_note` decimal(8,2) NOT NULL, + `total_coin` decimal(8,2) NOT NULL, + `total_stable` decimal(8,2) NOT NULL, + `active_status` enum('ENEBLED','DISABLED') NOT NULL DEFAULT 'ENEBLED', + `description` varchar(200) DEFAULT NULL, + `id_office` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_stable_general_box_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_stable_general_box_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------------------- +-- +-- Estructura para la tabla `APC_STABLE_GENERAL_BOX` +-- +-- Totales de la caja de APC. +-- +CREATE TABLE `APC_TOTAL_EXPECTED_PAYMENT_DAILY_BY_USER`( + `id` char(36) NOT NULL, + `total_expected` decimal(8,2) NOT NULL, + `active_status` enum('ENEBLED','DISABLED') NOT NULL DEFAULT 'ENEBLED', + `id_office` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + `total_expected_payment` decimal(8,2) DEFAULT NULL, + CONSTRAINT `apc_total_expected_payment_daily_by_user_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_total_expected_payment_daily_by_user_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_total_expected_payment_daily_by_user_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `ARREBOL_TEST` +-- +-- Solo para pruebas exclusivas. +-- +CREATE TABLE `ARREBOL_TEST`( + `id` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------------------- +-- +-- Estructura para la tabla `APC_PAYROLL` +-- +CREATE TABLE `APC_PAYROLL`( + `id` char(36) NOT NULL, + `active_status` enum('ENEBLED','DISABLED') NOT NULL DEFAULT 'ENEBLED', + `id_office` char(36) NOT NULL, + `id_human_resource` char(36) NOT NULL, + `salary` decimal(8,2) NOT NULL, + `imss` decimal(8,2) NOT NULL, + `advance` decimal(8,2) NOT NULL, + `total_bonus_new_customer` decimal(8,2) NOT NULL, + `total_bonus_colocation` decimal(8,2) NOT NULL, + `total_bonus_mora` decimal(8,2) NOT NULL, + `discounts` decimal(8,2) NOT NULL, + `increases` decimal(8,2) NOT NULL, + `total_payment` decimal(8,2) NOT NULL, + `total_days_salary` smallint(6) NOT NULL DEFAULT '5', + `total_days_bonus` smallint(6) NOT NULL DEFAULT '5', + `comments_discounts` varchar(200) DEFAULT NULL, + `comments_increases` varchar(200) DEFAULT NULL, + `observation` varchar(200) DEFAULT NULL, + `boxed` decimal(8,2) NOT NULL, + `saving` decimal(8,2) NOT NULL, + `payment_to_debt` decimal(8,2) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_payroll_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_payroll_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_payroll_to_apc_human_resource_fk` + FOREIGN KEY (`id_human_resource`) REFERENCES `APC_HUMAN_RESOURCE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------------------- +-- +-- Estructura para la tabla `APC_CLOSING_DAY_DETAIL` +-- +CREATE TABLE `APC_CLOSING_DAY_DETAIL`( + `id` char(36) NOT NULL, + `id_closing_day` char(36) NOT NULL, + `comments` varchar(200) NOT NULL, + `amount` decimal(8,2) NOT NULL, + `type` varchar(200) NOT NULL, + `dateDetail` datetime DEFAULT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_closing_day_detail_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_closing_day_detail_to_apc_closing_day_fk` + FOREIGN KEY (`id_closing_day`) REFERENCES `APC_CLOSING_DAY`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------------------- +-- +-- Estructura para la tabla `APC_STABLE_SMALL_BOX` +-- +-- Caja chica. +-- +CREATE TABLE `APC_STABLE_SMALL_BOX`( + `id` char(36) NOT NULL, + `total_small_box` numeric(8,2) NOT NULL, + `total_envelope` numeric(8,2) NOT NULL, + `total_bank_note` numeric(8,2) NOT NULL, + `total_coin` numeric(8,2) NOT NULL, + `total_stable` numeric(8,2) NOT NULL, + `active_status` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED', + `description` varchar(200), + `id_office` char(36) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_stable_small_box_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_stable_small_box_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------------------- +-- +-- Estructura para la tabla `APC_BITACORA` +-- +-- Bitacora de APC. +-- +CREATE TABLE `APC_BITACORA`( + `id` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `comments_user` varchar(300) NOT NULL, + `action` varchar(50) NOT NULL, + `description` varchar(300) NOT NULL, + `name_user` varchar(200) NOT NULL, + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_bitacora_pk` PRIMARY KEY (`id`), + CONSTRAINT `apc_bitacora_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------------------- +-- +-- Estructura para la tabla `APC_LOAN_EMPLOYEE` +-- +-- Crear tabla para préstamos de empleados +-- +CREATE TABLE `APC_LOAN_EMPLOYEE` ( + `id` CHAR(36) NOT NULL, + `id_employee` CHAR(36) NOT NULL, + `amount_loan` DECIMAL(8,2), + `amount_to_pay` DECIMAL(8,2), + `balance` DECIMAL(8,2), + `loan_employee_status` ENUM('ENEBLED', 'DISABLED', 'DELETED') NOT NULL, + `total_amount_to_pay` DECIMAL(8,2), + `created_by` CHAR(36) NOT NULL, + `created_on` DATETIME DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` CHAR(36) DEFAULT NULL, + `last_updated_on` DATETIME DEFAULT NULL, + + CONSTRAINT `apc_loan_employee_pk` PRIMARY KEY (id), + CONSTRAINT `apc_loan_to_apc_person_as_employee_fk` + FOREIGN KEY (`id_employee`) REFERENCES `APC_HUMAN_RESOURCE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------------------- +-- +-- Estructura para la tabla `APC_LOAN_EMPLOYEE_DETAIL` +-- +-- Crear tabla para detalles (abonos) +-- +CREATE TABLE `APC_LOAN_EMPLOYEE_DETAIL` ( + `id` char(36) NOT NULL, + `id_loan` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `payment_amount` DECIMAL(8,2), + `reference_number` SMALLINT NOT NULL, + `loan_employee_detail_status` ENUM('ENEBLED', 'DISABLED', 'DELETED') NOT NULL, + `created_by` CHAR(36) NOT NULL, + `created_on` DATETIME DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT `apc_loan_employee_detail_pk` PRIMARY KEY (id), + CONSTRAINT `apc_loan_employee_details_uk` UNIQUE KEY (`id`,`reference_number`), + CONSTRAINT `apc_loan_details_to_apc_loan_employee_fk` + FOREIGN KEY (`id_loan`) REFERENCES `APC_LOAN_EMPLOYEE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_loan_employee_details_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_HUMAN_RESOURCE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_GASOLINE` +-- +CREATE TABLE `APC_GASOLINE` ( + `id` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `id_office` char(36) NOT NULL, + `id_route` char(36) NOT NULL, + `quantity` DOUBLE DEFAULT 0.0, + `km_old` DOUBLE DEFAULT 0.0, + `km_new` DOUBLE DEFAULT 0.0, + `total` DOUBLE DEFAULT 0.0, + `status` ENUM('ENABLED', 'DISABLED', 'DELETED') NOT NULL, + `description` VARCHAR(500), + `created_by` char(36) NOT NULL, + `created_on` datetime DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` char(36) DEFAULT NULL, + `last_updated_on` datetime DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT `apc_gasoline_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_USER`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_gasoline_to_apc_office_fk` + FOREIGN KEY (`id_office`) REFERENCES `APC_OFFICE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT `apc_gasoline_to_apc_route_fk` + FOREIGN KEY (`id_route`) REFERENCES `APC_ROUTE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; + +CREATE TABLE `APC_EMPLOYEE_SAVING` ( + `id` char(36) NOT NULL, + -- `id_payroll` char(36) NOT NULL, + `id_user` char(36) NOT NULL, + `employee_saving` DECIMAL(8,2) default 0, + `created_by` CHAR(36) NOT NULL, + `created_on` DATETIME DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` CHAR(36) DEFAULT NULL, + `last_updated_on` DATETIME DEFAULT NULL, + + CONSTRAINT `apc_employee_saving_pk` PRIMARY KEY (id), + -- CONSTRAINT `apc_employee_saving_to_apc_payroll_fk` + -- FOREIGN KEY (`id_payroll`) REFERENCES `APC_PAYROLL`(`id`) + -- ON UPDATE CASCADE + -- ON DELETE RESTRICT, + CONSTRAINT `apc_employee_saving_to_apc_user_fk` + FOREIGN KEY (`id_user`) REFERENCES `APC_HUMAN_RESOURCE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +)ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- -------------------------------------------------------- +-- +-- Estructura de tabla para la tabla `APC_VEHICLES` +-- +CREATE TABLE `APC_VEHICLES` ( + `id` CHAR(36) NOT NULL, + `id_driver` CHAR(36) NOT NULL, + `license_plate` VARCHAR(50), + `economic_number` VARCHAR(50), + `serial_number` VARCHAR(50), + `engine_number` VARCHAR(50), + `mileage` DECIMAL(8,2), + `year` INTEGER, + `insurance_name` VARCHAR(150), + `insurance_number` VARCHAR(50), + `coverage_type` VARCHAR(50), + `model` VARCHAR(50), + `colour` VARCHAR(50), + `gps` BIT, + `gps_number` VARCHAR(50), + `comments` varchar(200), + `vehicle_status` ENUM('ENEBLED', 'DISABLED', 'DELETED') NOT NULL, + `created_by` CHAR(36) NOT NULL, + `created_on` DATETIME DEFAULT CURRENT_TIMESTAMP, + `last_updated_by` CHAR(36) DEFAULT NULL, + `last_updated_on` DATETIME DEFAULT NULL, + + CONSTRAINT `apc_vehicles_pk` PRIMARY KEY (id), + CONSTRAINT `apc_vehicles_to_apc_person_as_employee_fk` + FOREIGN KEY (`id_driver`) REFERENCES `APC_HUMAN_RESOURCE`(`id`) + ON UPDATE CASCADE + ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +-- -------------------------------------------------------------------- +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; \ No newline at end of file diff --git a/apc-db/src/create/from/scratch/apc-db-views.sql b/apc-db/src/create/from/scratch/apc-db-views.sql new file mode 100644 index 0000000..0b9ca08 --- /dev/null +++ b/apc-db/src/create/from/scratch/apc-db-views.sql @@ -0,0 +1,3847 @@ +-- -------------------------------------------------------- +-- Arrebol Consuntancy +-- version 1.0.1 +-- http://www.arrebolconsultancy.com +-- -------------------------------------------------------- + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET AUTOCOMMIT = 0; +START TRANSACTION; +-- SET time_zone = "+00:00"; + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; +USE `apo_pro_com_april_ten`; +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_SECURITY_AUTHENTICATION` (USER) +-- +CREATE OR REPLACE VIEW `APC_SECURITY_AUTHENTICATION` AS +SELECT CONCAT(`usr`.`user_name`,`ubo`.`id_office`) AS `user_name`, `usr`.`pwd` AS `pwd` +FROM `APC_USER_BY_OFFICE` `ubo` +INNER JOIN `APC_USER` `usr` ON `ubo`.`id_user` = `usr`.`id` +INNER JOIN `APC_HUMAN_RESOURCE` `hr` ON `usr`.`id_human_resource` = `hr`.`id` +WHERE +`usr`.`user_status` = 'ENEBLED' AND +`usr`.`user_type` IN ('WEB', 'BOTH') AND +`ubo`.`user_by_office_status` = 'ENEBLED' AND +`hr`.`human_resource_status` = 'ENEBLED'; +-- ------------------------------------------------------------ +-- +-- Estructura para la vista `APC_SECURITY_AUTHORIZATION` (ROLE) +-- +CREATE OR REPLACE VIEW `APC_SECURITY_AUTHORIZATION` AS +SELECT CONCAT(`usr`.`user_name`,`ubo`.`id_office`) AS `user_name`, `perm`.`permission` AS `permission` +FROM `APC_PERMISSION` `perm` +INNER JOIN `APC_USER_BY_OFFICE_HAS_PERMISSION` `ubohp` ON `perm`.`id` = `ubohp`.`id_permission` +INNER JOIN `APC_USER_BY_OFFICE` `ubo` ON `ubohp`.`id_user_by_office` = `ubo`.`id` +INNER JOIN `APC_USER` `usr` ON `ubo`.`id_user` = `usr`.`id` +INNER JOIN `APC_HUMAN_RESOURCE` `hr` ON `usr`.`id_human_resource` = `hr`.`id` +WHERE +`perm`.`permission_status` = 'ENEBLED' AND +`ubo`.`user_by_office_status` = 'ENEBLED' AND +`usr`.`user_status` = 'ENEBLED' AND +`usr`.`user_type` IN ('WEB', 'BOTH') AND +`hr`.`human_resource_status` = 'ENEBLED' +ORDER BY `user_name`; +-- ------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_SECURITY_AUTHENTICATION_MOBILE` (USER) +-- +CREATE OR REPLACE VIEW `APC_SECURITY_AUTHENTICATION_MOBILE` AS +SELECT +`usr`.`id` AS `id`, +`usr`.`user_name` AS `user_name`, +`usr`.`pwd` AS `pwd`, +`hr`.`avatar` AS `avatar`, +`ubo`.`id_office` AS `id_office`, +`hrhr`.`id_route` AS `id_route`, +`usr`.`certifier` AS `certifier`, +`usr`.`management` AS `management` +FROM `APC_USER_BY_OFFICE` `ubo` +INNER JOIN `APC_USER` `usr` ON `ubo`.`id_user` = `usr`.`id` +INNER JOIN `APC_HUMAN_RESOURCE` `hr` ON `usr`.`id_human_resource` = `hr`.`id` +INNER JOIN `APC_HUMAN_RESOURCE_HAS_ROUTE` `hrhr` ON `hr`.`id` = `hrhr`.`id_human_resource` +WHERE +`usr`.`user_status` = 'ENEBLED' AND +`usr`.`user_type` IN ('MOBILE', 'BOTH') AND +`ubo`.`user_by_office_status` = 'ENEBLED' AND +`hr`.`human_resource_status` = 'ENEBLED'; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_LOAN_BY_USER_VIEW` (USER) +-- Se utiliza para que un Asesor cargue todos los pretamos que tiene +-- que cobrar en el día actual. +-- +CREATE OR REPLACE VIEW `APC_LOAN_BY_USER_VIEW` AS +SELECT + CONCAT(l.id, u.id) AS id, + u.id AS user_id, + CONCAT( + CASE + WHEN cstmr.first_name IS NOT NULL AND cstmr.first_name != '' + THEN CONCAT(SUBSTR(UPPER(cstmr.first_name), 1, 1),SUBSTR(LOWER(cstmr.first_name), 2), ' ') + ELSE '' + END, + CASE + WHEN cstmr.second_name IS NOT NULL AND cstmr.second_name != '' + THEN CONCAT(SUBSTR(UPPER(cstmr.second_name), 1, 1),SUBSTR(LOWER(cstmr.second_name), 2), ' ') + ELSE '' + END, + CASE + WHEN cstmr.last_name IS NOT NULL AND cstmr.last_name != '' + THEN CONCAT(SUBSTR(UPPER(cstmr.last_name), 1, 1),SUBSTR(LOWER(cstmr.last_name), 2)) + ELSE '' + END + ) AS customer_name, + cstmr.address_home AS customer_address_home, + cstmr.address_business AS customer_address_business, + cstmr.company_name, + cstmr.thumbnail AS customer_thumbnail, + CONCAT( + CASE + WHEN ndrsmnt.first_name IS NOT NULL AND ndrsmnt.first_name != '' + THEN CONCAT(SUBSTR(UPPER(ndrsmnt.first_name), 1, 1),SUBSTR(LOWER(ndrsmnt.first_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ndrsmnt.second_name IS NOT NULL AND ndrsmnt.second_name != '' + THEN CONCAT(SUBSTR(UPPER(ndrsmnt.second_name), 1, 1),SUBSTR(LOWER(ndrsmnt.second_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ndrsmnt.last_name IS NOT NULL AND ndrsmnt.last_name != '' + THEN CONCAT(SUBSTR(UPPER(ndrsmnt.last_name), 1, 1),SUBSTR(LOWER(ndrsmnt.last_name), 2)) + ELSE '' + END + )AS endorsement_name, + ndrsmnt.address_home AS endorsement_address_home, + ndrsmnt.thumbnail AS endorsement_thumbnail, + ndrsmnt.phone_home AS endorsement_phone_home, + IF((l.amount_to_pay - l.amount_paid >= lt.payment_daily), lt.payment_daily, l.amount_to_pay - l.amount_paid) AS payment_daily, + lt.loan_fee, + lbu.order_in_list, + (SELECT count(notification_number) FROM APC_LOAN_FEE_NOTIFICATION WHERE id_loan = l.id) AS notification_number, +IF( + ( + l.amount_paid >= (SELECT FLOOR(lt.payment_total * .6364) FROM DUAL) + ), + CASE + WHEN + (SELECT count(notification_number) as total + FROM APC_LOAN_FEE_NOTIFICATION + WHERE id_loan = l.id + ) < 4 + THEN 'ENEBLED' + WHEN + (SELECT count(notification_number) as total + FROM APC_LOAN_FEE_NOTIFICATION + WHERE id_loan = l.id + ) BETWEEN 4 AND 5 + AND + lt.payment > 1000 + THEN 'ENEBLED' + ELSE 'DISABLED' + END + ,'DISABLED' +) as renovation, +(SELECT amount_to_pay - amount_paid FROM APC_LOAN WHERE id = l.id) AS max_amount_to_pay +FROM APC_LOAN_BY_USER lbu +INNER JOIN APC_LOAN l ON lbu.id_loan = l.id +INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +INNER JOIN APC_PEOPLE cstmr ON l.id_customer = cstmr.id +INNER JOIN APC_PEOPLE ndrsmnt ON l.id_endorsement = ndrsmnt.id +INNER JOIN APC_USER u ON lbu.id_user = u.id +WHERE + l.loan_status = 'APPROVED' AND + l.id = ( + CASE + -- WHEN IS NEW AND update created_on less equals to currentdate + WHEN ( + (SELECT count(id) FROM APC_LOAN_DETAIL WHERE id_loan = l.id ) = 0 AND + DATE(l.last_updated_on) < curdate() + ) THEN l.id + -- WHEN LOAN HAS PAYMENTS + WHEN ( + ( + SELECT count(id) + FROM APC_LOAN_DETAIL + WHERE + id_loan = l.id AND + reference_number = l.last_reference_number AND + DATE(created_on) < curdate() + ) > 0 AND + DATE(l.last_updated_on) < curdate() + ) THEN l.id + ELSE '' + END + ) AND + lbu.owner_loan = 'CURRENT_OWNER' AND + CASE + WHEN LOWER(DAYNAME(CURDATE())) = 'monday' + THEN ('monday' = lt.payment_monday) + WHEN LOWER(DAYNAME(CURDATE())) = 'tuesday' + THEN ('tuesday' = LOWER(lt.payment_tuesday)) + WHEN LOWER(DAYNAME(CURDATE())) = 'wednesday' + THEN ('wednesday' = LOWER(lt.payment_wednesday)) + WHEN LOWER(DAYNAME(CURDATE())) = 'thursday' + THEN ('thursday' =LOWER(lt.payment_thursday)) + WHEN LOWER(DAYNAME(CURDATE())) = 'friday' + THEN ('friday' = LOWER(lt.payment_friday)) + WHEN LOWER(DAYNAME(CURDATE())) = 'saturday' + THEN ('saturday' = LOWER(lt.payment_saturday)) + WHEN LOWER(DAYNAME(CURDATE())) = 'sunday' + THEN ('sunday' = LOWER(lt.payment_sunday)) + ELSE FALSE + END; +-- ------------------------------------------------------------- +-- COPY PRODUCTION 2022/JULY/16 +-- Estructura para la vista `APC_LOAN_BY_USER_VIEW` +-- LATEST VERSION WITH NO MARGING +-- IT WAS TAKEN FROM PRODUCTION +CREATE OR REPLACE VIEW `APC_LOAN_BY_USER_VIEW` AS +select concat(`l`.`id`,`u`.`id`) AS `id`, + `u`.`id` AS `user_id`, + concat((case when ((`cstmr`.`first_name` is not null) and (`cstmr`.`first_name` <> '')) then concat(substr(upper(`cstmr`.`first_name`),1,1),substr(lower(`cstmr`.`first_name`),2),' ') else '' end),(case when ((`cstmr`.`second_name` is not null) and (`cstmr`.`second_name` <> '')) then concat(substr(upper(`cstmr`.`second_name`),1,1),substr(lower(`cstmr`.`second_name`),2),' ') else '' end),(case when ((`cstmr`.`last_name` is not null) and (`cstmr`.`last_name` <> '')) then concat(substr(upper(`cstmr`.`last_name`),1,1),substr(lower(`cstmr`.`last_name`),2)) else '' end)) AS `customer_name`, + (case when (`cstmr`.`address_home` is null) then '' else `cstmr`.`address_home` end) AS `customer_address_home`, + (case when (`cstmr`.`address_business` is null) then '' else `cstmr`.`address_business` end) AS `customer_address_business`, + (case when (`cstmr`.`company_name` is null) then '' else `cstmr`.`company_name` end) AS `company_name`, + (case when (`cstmr`.`thumbnail` is null) then '' else `cstmr`.`thumbnail` end) AS `customer_thumbnail`, + concat((case when ((`ndrsmnt`.`first_name` is not null) and (`ndrsmnt`.`first_name` <> '')) then concat(substr(upper(`ndrsmnt`.`first_name`),1,1),substr(lower(`ndrsmnt`.`first_name`),2),' ') else '' end),(case when ((`ndrsmnt`.`second_name` is not null) and (`ndrsmnt`.`second_name` <> '')) then concat(substr(upper(`ndrsmnt`.`second_name`),1,1),substr(lower(`ndrsmnt`.`second_name`),2),' ') else '' end),(case when ((`ndrsmnt`.`last_name` is not null) and (`ndrsmnt`.`last_name` <> '')) then concat(substr(upper(`ndrsmnt`.`last_name`),1,1),substr(lower(`ndrsmnt`.`last_name`),2)) else '' end)) AS `endorsement_name`, + (case when (`ndrsmnt`.`address_home` is null) then '' else `ndrsmnt`.`address_home` end) AS `endorsement_address_home`,(case when (`ndrsmnt`.`thumbnail` is null) then '' else `ndrsmnt`.`thumbnail` end) AS `endorsement_thumbnail`, + (case when (`ndrsmnt`.`phone_home` is null) then '' else `ndrsmnt`.`phone_home` end) AS `endorsement_phone_home`, + if(((`l`.`amount_to_pay` - `l`.`amount_paid`) >= `lt`.`payment_daily`),`lt`.`payment_daily`,(`l`.`amount_to_pay` - `l`.`amount_paid`)) AS `payment_daily`, + `lt`.`loan_fee` AS `loan_fee`,`lbu`.`order_in_list` AS `order_in_list`, + (select count(`APC_LOAN_FEE_NOTIFICATION`.`notification_number`) from `APC_LOAN_FEE_NOTIFICATION` where (`APC_LOAN_FEE_NOTIFICATION`.`id_loan` = `l`.`id`)) AS `notification_number`, + if((`l`.`amount_paid` >= (select floor((`lt`.`payment_total` * 0.6364)))),(case when ((select count(`APC_LOAN_FEE_NOTIFICATION`.`notification_number`) AS `total` from `APC_LOAN_FEE_NOTIFICATION` where (`APC_LOAN_FEE_NOTIFICATION`.`id_loan` = `l`.`id`)) < 4) then 'ENEBLED' when (((select count(`APC_LOAN_FEE_NOTIFICATION`.`notification_number`) AS `total` from `APC_LOAN_FEE_NOTIFICATION` where (`APC_LOAN_FEE_NOTIFICATION`.`id_loan` = `l`.`id`)) between 4 and 5) and (`lt`.`payment` > 1000)) then 'ENEBLED' else 'DISABLED' end),'DISABLED') AS `renovation`, + (select (`APC_LOAN`.`amount_to_pay` - `APC_LOAN`.`amount_paid`) from `APC_LOAN` where (`APC_LOAN`.`id` = `l`.`id`)) AS `max_amount_to_pay`, + `cstmr`.`phone_home` AS `customer_phone_home` +from (((((`APC_LOAN_BY_USER` `lbu` join `APC_LOAN` `l` on((`lbu`.`id_loan` = `l`.`id`))) join `APC_LOAN_TYPE` `lt` on((`l`.`id_loan_type` = `lt`.`id`))) join `APC_PEOPLE` `cstmr` on((`l`.`id_customer` = `cstmr`.`id`))) join `APC_PEOPLE` `ndrsmnt` on((`l`.`id_endorsement` = `ndrsmnt`.`id`))) join `APC_USER` `u` on((`lbu`.`id_user` = `u`.`id`))) where ((`l`.`frozen` = 'DISABLED') and (`l`.`loan_status` = 'APPROVED') and (`l`.`id` = (case when (((select count(`APC_LOAN_DETAIL`.`id`) from `APC_LOAN_DETAIL` where (`APC_LOAN_DETAIL`.`id_loan` = `l`.`id`)) = 0) and (cast(`l`.`last_updated_on` as date) < curdate())) then `l`.`id` when (((select count(`APC_LOAN_DETAIL`.`id`) from `APC_LOAN_DETAIL` where ((`APC_LOAN_DETAIL`.`id_loan` = `l`.`id`) and (`APC_LOAN_DETAIL`.`reference_number` = `l`.`last_reference_number`) and (cast(`APC_LOAN_DETAIL`.`created_on` as date) < curdate()))) > 0) and (cast(`l`.`last_updated_on` as date) < curdate())) then `l`.`id` else '' end)) and (`lbu`.`owner_loan` = 'CURRENT_OWNER') + ); +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_LOAN_BY_USER_ORDER_PREFERENCE_VIEW` (USER) +-- Se utiliza para que un Asesor cargue todos los pretamos que tiene +-- que cobrar en el día actual y los pueda order por order de preferencia +-- para que pueda programar suta a su gusto. +-- +CREATE OR REPLACE VIEW `APC_LOAN_BY_USER_ORDER_PREFERENCE_VIEW` AS +SELECT + CONCAT(l.id, u.id) AS id, + u.id AS user_id, + CONCAT(cstmr.first_name,' ',IF(ISNULL(cstmr.second_name) ,'', CONCAT(cstmr.second_name, ' ')),cstmr.last_name,' ', cstmr.middle_name) AS customer_name, + cstmr.address_home AS customer_address_home, + cstmr.address_business AS customer_address_business, + lbu.order_in_list +FROM APC_LOAN_BY_USER lbu +INNER JOIN APC_LOAN l ON lbu.id_loan = l.id +INNER JOIN APC_PEOPLE cstmr ON l.id_customer = cstmr.id +INNER JOIN APC_USER u ON lbu.id_user = u.id +WHERE l.loan_status = 'APPROVED'; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_PERSON_SEARCH_VIEW` +-- Se utiliza para realizar busqueda por nombre. +-- +CREATE OR REPLACE VIEW `APC_PERSON_SEARCH_VIEW` AS +SELECT + id, + CONCAT( + CASE + WHEN first_name IS NOT NULL AND first_name != '' + THEN CONCAT(SUBSTR(UPPER(first_name), 1, 1),SUBSTR(LOWER(first_name), 2)) + ELSE '' + END, + CASE + WHEN second_name IS NOT NULL AND second_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(second_name), 1, 1),SUBSTR(LOWER(second_name), 2)) + ELSE '' + END, + CASE + WHEN last_name IS NOT NULL AND last_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(last_name), 1, 1),SUBSTR(LOWER(last_name), 2)) + ELSE '' + END, + CASE + WHEN middle_name IS NOT NULL AND middle_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(middle_name), 1, 1),SUBSTR(LOWER(middle_name), 2)) + ELSE '' + END + ) AS person_search +FROM APC_PEOPLE +WHERE active_status = 'ENEBLED' +ORDER BY person_search; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_PERSON_SEARCH_DETAIL_VIEW` +-- Busca los detalles de una persona en el sistema. +CREATE OR REPLACE VIEW `APC_PERSON_SEARCH_DETAIL_VIEW` AS +SELECT + p.id AS id, + CONCAT( + CASE + WHEN p.first_name IS NOT NULL AND p.first_name != '' + THEN CONCAT(SUBSTR(UPPER(p.first_name), 1, 1),SUBSTR(LOWER(p.first_name), 2), ' ') + ELSE '' + END, + CASE + WHEN p.second_name IS NOT NULL AND p.second_name != '' + THEN CONCAT(SUBSTR(UPPER(p.second_name), 1, 1),SUBSTR(LOWER(p.second_name), 2), ' ') + ELSE '' + END, + CASE + WHEN p.last_name IS NOT NULL AND p.last_name != '' + THEN CONCAT(SUBSTR(UPPER(p.last_name), 1, 1),SUBSTR(LOWER(p.last_name), 2), ' ') + ELSE '' + END, + CASE + WHEN p.middle_name IS NOT NULL AND p.middle_name != '' + THEN CONCAT(SUBSTR(UPPER(p.middle_name), 1, 1),SUBSTR(LOWER(p.middle_name), 2)) + ELSE '' + END + ) AS person_search, + p.thumbnail, + CASE + WHEN + 0 < ( + SELECT COUNT(ID) + FROM APC_LOAN + WHERE + id_customer = p.id AND + loan_status = 'APPROVED') + THEN + 'ENEBLED' + WHEN + 0 < ( + SELECT COUNT(ID) + FROM APC_LOAN + WHERE + id_endorsement = p.id AND + loan_status = 'APPROVED') + THEN + 'ENEBLED' + ELSE + 'DISABLED' + END AS loanStatus +FROM APC_PEOPLE p; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_PERSON_SEARCH_HISTORICAL_DETAILS_VIEW` +-- Busca los detalles historicos de una persona en el sistema móvil. +CREATE OR REPLACE VIEW `APC_PERSON_SEARCH_HISTORICAL_DETAILS_VIEW` AS +SELECT + l.id, + p.id AS id_person_search, + DATE_FORMAT(l.created_on,'%d-%m-%Y') AS format_date, + CASE + WHEN 0 < (SELECT COUNT(ID) FROM APC_LOAN WHERE id_customer = p.id AND id = l.id) + THEN 'Cliente' + WHEN 0 < (SELECT COUNT(ID) FROM APC_LOAN WHERE id_endorsement = p.id AND id = l.id) + THEN 'Aval' + ELSE + 'Indeterminado' + END AS person_type, + CASE + WHEN 0 < (SELECT COUNT(ID) FROM APC_LOAN WHERE id_customer = p.id AND id = l.id) + THEN + (SELECT CONCAT(in_p.first_name,' ', in_p.last_name) + FROM APC_LOAN in_l + INNER JOIN APC_PEOPLE in_p ON in_l.id_endorsement = in_p.id + WHERE in_l.id = l.id) + WHEN 0 < (SELECT COUNT(ID) FROM APC_LOAN WHERE id_endorsement = p.id AND id = l.id) + THEN (SELECT CONCAT(in_p.first_name,' ', in_p.last_name) + FROM APC_LOAN in_l + INNER JOIN APC_PEOPLE in_p ON in_l.id_customer = in_p.id + WHERE in_l.id = l.id) + ELSE + 'Indeterminado' + END AS relationship, + lt.payment AS loan, + CASE + WHEN l.loan_status = 'APPROVED' + THEN CONCAT(l.last_reference_number, ' de 22') + ELSE '' + END AS payment_number, + CASE + WHEN l.loan_status = 'APPROVED' + THEN (l.amount_to_pay - l.amount_paid) + ELSE 0 + END AS amount_to_pay, + (SELECT COUNT(id) FROM APC_LOAN_FEE_NOTIFICATION WHERE id_loan = l.id) AS total_fees, + CASE + WHEN l.loan_status = 'PENDING' + THEN 'Pendiente' + WHEN l.loan_status = 'FINISH' + THEN 'Terminado' + WHEN l.loan_status = 'BLACK_LIST' + THEN 'Lista negra' + WHEN l.loan_status = 'APPROVED' + THEN 'Activo' + WHEN l.loan_status = 'REJECTED' + THEN 'Rechazado' + WHEN l.loan_status = 'PENDING_RENOVATION' + THEN 'Pendiente renovación' + WHEN l.loan_status = 'TO_DELIVERY' + THEN 'Por recibir' + END AS loan_status +FROM APC_LOAN l +INNER JOIN APC_PEOPLE p ON (l.id_customer = p.id or l.id_endorsement = p.id) +INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +ORDER BY l.created_on DESC; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_AVAILABLE_CUSTOMERS_VIEW` +-- +-- Sirve para cargar todos los posibles clientes de una oficina +-- que puedan solicitar un prestamo nuevo. +-- +CREATE OR REPLACE VIEW `APC_AVAILABLE_CUSTOMERS_VIEW` AS +SELECT + p.id, + CONCAT(p.first_name,' ', IF(ISNULL(p.second_name) ,'', CONCAT(p.second_name,' ')) ,p.last_name, ' ', p.middle_name) AS available_person, + CASE + WHEN p.people_type = 'BOTH' + THEN + CASE + WHEN 0 < (SELECT COUNT(id) FROM APC_LOAN WHERE id_customer = p.id) + THEN (SELECT id_endorsement FROM APC_LOAN WHERE id_customer = p.id ORDER BY created_on DESC LIMIT 1 ) + ELSE '' + END + ELSE '' + END as cross_signature +FROM APC_PEOPLE p +WHERE + p.people_type IN ('CUSTOMER', 'BOTH') AND + p.active_status = 'ENEBLED' AND + CASE + WHEN 0 = ( + SELECT COUNT(id) + FROM APC_LOAN + WHERE + id_customer = p.id AND + loan_status IN ('PENDING', 'BLACK_LIST', 'APPROVED', 'PENDING_RENOVATION', 'TO_DELIVERY') + ) + THEN TRUE + ELSE FALSE + END +ORDER BY available_person; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_AVAILABLE_ENDORSEMENT_VIEW` +-- +-- Sirve para cargar todos los posibles avales de una oficina +-- que puedan solicitar un prestamo nuevo. +-- +CREATE OR REPLACE VIEW `APC_AVAILABLE_ENDORSEMENTS_VIEW` AS +SELECT + p.id, + CONCAT(p.first_name,' ', IF(ISNULL(p.second_name) ,'', CONCAT(p.second_name,' ')) ,p.last_name, ' ', p.middle_name) AS available_person, + CASE + WHEN p.people_type = 'BOTH' + THEN + CASE + WHEN 0 < (SELECT COUNT(id) FROM APC_LOAN WHERE id_endorsement = p.id) + THEN (SELECT id_customer FROM APC_LOAN WHERE id_endorsement = p.id ORDER BY created_on DESC LIMIT 1 ) + ELSE '' + END + ELSE '' + END as cross_signature +FROM APC_PEOPLE p +WHERE + p.people_type IN ('ENDORSEMENT', 'BOTH') AND + p.active_status = 'ENEBLED' AND + CASE + WHEN 0 = ( + SELECT COUNT(id) + FROM APC_LOAN + WHERE + id_endorsement = p.id AND + loan_status IN ('PENDING', 'BLACK_LIST', 'APPROVED', 'PENDING_RENOVATION', 'TO_DELIVERY') + ) + THEN TRUE + ELSE FALSE + END +ORDER BY available_person; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_CASH_REGISTER_CURDATE_BY_USER_VIEW` +-- +-- Sirve para obtener todos los pagos que recabo un asesor en el día. +-- +CREATE OR REPLACE VIEW `APC_CASH_REGISTER_CURDATE_BY_USER_VIEW` AS +SELECT + UUID() AS id, + lt.payment_amount AS payment, + CONCAT(p.first_name, ' ', p.last_name) AS customer_name, + lt.id_user AS id_user +FROM APC_LOAN_DETAIL lt +INNER JOIN APC_LOAN l ON lt.id_loan = l.id +INNER JOIN APC_PEOPLE p ON l.id_customer = p.id +WHERE + lt.loan_details_type = 'PAYMENT' AND + DATE(lt.created_on) = CURDATE() +ORDER BY lt.created_on; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_LOAN_TO_DELIVERY_BY_CERTIFIER_VIEW` +-- +-- Sirve para obtener todos los prestamos que un certificador tiene que entregar. +-- cambio no subido pero proximo a deployar, se espera autorizacion. +-- +CREATE OR REPLACE VIEW `APC_LOAN_TO_DELIVERY_BY_CERTIFIER_VIEW` AS +SELECT + l.id AS id_loan, + CASE + WHEN (SELECT COUNT(id_loan_new) FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id) = 1 + THEN (SELECT id_loan_old FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id) + ELSE 'N/A' + END AS id_old_loan, + u.id AS id_user, + -- u.user_name, + -- hrhr.id_route, + -- l.loan_status, + CONCAT( + CASE + WHEN p.first_name IS NOT NULL + THEN CONCAT(SUBSTR(UPPER(p.first_name), 1, 1),SUBSTR(LOWER(p.first_name), 2)) + ELSE '' + END, + CASE + WHEN p.second_name IS NOT NULL + THEN CONCAT(' ',SUBSTR(UPPER(p.second_name), 1, 1),SUBSTR(LOWER(p.second_name), 2)) + ELSE '' + END, + CASE + WHEN p.last_name IS NOT NULL + THEN CONCAT(' ',SUBSTR(UPPER(p.last_name), 1, 1),SUBSTR(LOWER(p.last_name), 2)) + ELSE '' + END + ) AS customer_name, + CASE + WHEN p.address_business IS NOT NULL + THEN CONCAT(SUBSTR(UPPER(p.address_business), 1, 1),SUBSTR(LOWER(p.address_business), 2)) + ELSE '' + END AS customer_address, + p.thumbnail AS thumbnail, + CASE + WHEN (SELECT COUNT(id_loan_new) FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id) > 0 + THEN 'star' + ELSE 'new' + END AS icon, + CASE + WHEN (SELECT COUNT(id_loan_new) FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id) > 0 + THEN + CASE + WHEN -- El monto del prestamo origen es almenos $1 mayor que el doble del pago diario + (SELECT (innerL.amount_to_pay - innerL.amount_paid) - (innerLT.payment_daily * 2) FROM APC_LOAN innerL + INNER JOIN APC_LOAN_TYPE innerLT ON innerL.id_loan_type = innerLT.id + WHERE innerL.id = (SELECT id_loan_old FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id)) > 0 + THEN + lt.payment - + (lt.opening_fee + + (SELECT (innerL.amount_to_pay - innerL.amount_paid) - (innerLT.payment_daily * 2) FROM APC_LOAN innerL + INNER JOIN APC_LOAN_TYPE innerLT ON innerL.id_loan_type = innerLT.id + WHERE innerL.id = (SELECT id_loan_old FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id))) + ELSE lt.payment - lt.opening_fee -- Es igual o menor al doble del pago diario, no se aplica descuento. + END + ELSE lt.payment - lt.opening_fee -- Es solo prestamo nuevo, no es renovacion + END AS amount_to_delivery, + CASE + WHEN (SELECT COUNT(id_loan_new) FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id) > 0 + THEN + CASE + WHEN -- (SELECT amount_to_pay - amount_paid FROM APC_LOAN WHERE id = l.id) > (lt.payment_daily * 2) + (SELECT innerL.amount_to_pay - innerL.amount_paid FROM APC_LOAN innerL + INNER JOIN APC_LOAN_TYPE innerLT ON innerL.id_loan_type = innerLT.id + WHERE innerL.id = (SELECT id_loan_old FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id)) + > + (SELECT innerLT.payment_daily FROM APC_LOAN innerL + INNER JOIN APC_LOAN_TYPE innerLT ON innerL.id_loan_type = innerLT.id + WHERE innerL.id = (SELECT id_loan_old FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id)) + THEN -- ((l.amount_to_pay - l.amount_paid) - (lt.payment_daily * 2)) + CASE + WHEN + (SELECT (innerL.amount_to_pay - innerL.amount_paid) - (innerLT.payment_daily * 2) FROM APC_LOAN innerL + INNER JOIN APC_LOAN_TYPE innerLT ON innerL.id_loan_type = innerLT.id + WHERE innerL.id = (SELECT id_loan_old FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id)) + > 0 + THEN + (SELECT (innerL.amount_to_pay - innerL.amount_paid) - (innerLT.payment_daily * 2) FROM APC_LOAN innerL + INNER JOIN APC_LOAN_TYPE innerLT ON innerL.id_loan_type = innerLT.id + WHERE innerL.id = (SELECT id_loan_old FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id)) + ELSE + 0 + END + ELSE 0 + END + ELSE 0 + END AS discount, + lt.opening_fee AS opening, + lt.payment AS payment, + CASE + WHEN (SELECT COUNT(id_loan_new) FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id) = 1 + THEN (SELECT amount_to_pay - amount_paid FROM APC_LOAN WHERE id = (SELECT id_loan_old FROM APC_LOAN_BY_RENOVATION WHERE id_loan_new = l.id)) + ELSE 0.0 + END AS 'total_last_loan' +FROM + APC_USER u + INNER JOIN APC_HUMAN_RESOURCE_HAS_ROUTE hrhr ON u.id_human_resource = hrhr.id_human_resource + INNER JOIN APC_HUMAN_RESOURCE hr ON hrhr.id_human_resource = hr.id + INNER JOIN APC_ROLE r ON hr.id_role = r.id + INNER JOIN APC_LOAN l ON hrhr.id_route = l.id_route + INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id + INNER JOIN APC_PEOPLE p ON l.id_customer = p.id +WHERE + u.certifier = 'ENEBLED' AND + l.loan_status = 'TO_DELIVERY' AND + DATE(l.created_on) <= CURDATE() +ORDER BY customer_name DESC; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_EXCHANGE_ENEBLED_USERS_VIEW` +-- +-- Sirve para obtener todos los usuarios disponibles para realizar traspasos. +-- +CREATE OR REPLACE VIEW `APC_EXCHANGE_ENEBLED_USERS_VIEW` AS +SELECT +u.id AS id_user, +CONCAT(hr.first_name, ' ', IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name,' ')), hr.second_name, ' ', hr.last_name) AS user_name, +hrbo.id_office AS id_office +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON u.id_human_resource = hr.id +INNER JOIN APC_HUMAN_RESOURCE_BY_OFFICE hrbo ON hr.id = hrbo.id_human_resource +WHERE u.user_status = 'ENEBLED' and +u.user_type IN ('MOBILE','BOTH'); +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_TOTAL_CASH_BY_CURDATE_VIEW` +-- +-- Sirve para obtener lo que tiene que entregar el asesor al final del día. +-- +CREATE OR REPLACE VIEW `APC_TOTAL_CASH_BY_CURDATE_VIEW` AS +SELECT + u.id, + ubo.id_office, + IF( + (SELECT COUNT(id) FROM APC_CLOSING_DAY WHERE id_user = u.id AND id_office = ubo.id_office AND active_status = 'ENEBLED' AND DATE(created_on) = CURDATE()) = 0 + ,(SELECT IF(ISNULL(SUM(ld.payment_amount)),0, SUM(ld.payment_amount)) + FROM APC_LOAN_DETAIL ld + WHERE + ld.id_user = u.id AND + ld.loan_details_type = 'PAYMENT' AND + DATE(ld.created_on) = CURDATE() + ) + ,0.0 + )AS total_amount_payment, + IF( + (SELECT COUNT(id) FROM APC_CLOSING_DAY WHERE id_user = u.id AND id_office = ubo.id_office AND active_status = 'ENEBLED' AND DATE(created_on) = CURDATE()) = 0 + ,(SELECT IF(ISNULL(SUM(ld.payment_amount)),0, SUM(ld.payment_amount)) + FROM APC_LOAN_DETAIL ld + WHERE + ld.id_user = u.id AND + ld.loan_details_type = 'TRANSFER' AND + DATE(ld.created_on) = CURDATE() + ) + ,0.0 + )AS total_amount_deposit, + IF( + (SELECT COUNT(id) FROM APC_CLOSING_DAY WHERE id_user = u.id AND id_office = ubo.id_office AND active_status = 'ENEBLED' AND DATE(created_on) = CURDATE()) = 0 + ,(SELECT IF(ISNULL(SUM(amount_to_transfer)),0, SUM(amount_to_transfer)) + FROM APC_TRANSFER + WHERE + id_user_transmitter = u.id AND + action_status = 'APPROVED' AND + active_status = 'ENEBLED' AND + DATE(last_updated_on) = CURDATE() + ) + ,0.0 + ) AS transfer_sender, + IF( + (SELECT COUNT(id) FROM APC_CLOSING_DAY WHERE id_user = u.id AND id_office = ubo.id_office AND active_status = 'ENEBLED' AND DATE(created_on) = CURDATE()) = 0 + ,(SELECT IF(ISNULL(SUM(amount_to_transfer)),0, SUM(amount_to_transfer)) + FROM APC_TRANSFER + WHERE + id_user_receiver = u.id AND + action_status = 'APPROVED' AND + active_status = 'ENEBLED' AND + DATE(last_updated_on) = CURDATE() + ) + ,0.0 + ) AS transfer_receiver, + IF( + (SELECT COUNT(id) FROM APC_CLOSING_DAY WHERE id_user = u.id AND id_office = ubo.id_office AND active_status = 'ENEBLED' AND DATE(created_on) = CURDATE()) = 0 + ,(SELECT IF(ISNULL(SUM(amount)),0, SUM(amount)) + FROM APC_MONEY_DAILY + WHERE + id_user = u.id AND + DATE(money_daily_date) = CURDATE() + ) + ,0.0 + ) AS money_daily, + IF( + (SELECT COUNT(id) FROM APC_CLOSING_DAY WHERE id_user = u.id AND id_office = ubo.id_office AND active_status = 'ENEBLED' AND DATE(created_on) = CURDATE()) = 0 + ,(SELECT IF(ISNULL(SUM(expense)),0, SUM(expense)) + FROM APC_OTHER_EXPENSE + WHERE + id_user = u.id AND + DATE(created_on) = CURDATE() + ) + ,0.0 + )AS other_expense, + IF( + (SELECT COUNT(id) FROM APC_CLOSING_DAY WHERE id_user = u.id AND id_office = ubo.id_office AND active_status = 'ENEBLED' AND DATE(created_on) = CURDATE()) = 0 + ,(SELECT IF(ISNULL(SUM(amount)),0, SUM(amount)) + FROM APC_DELIVERY + WHERE + id_user = u.id AND + DATE(created_on) = CURDATE() + ) + , 0.0 + ) as delivery, + IF( + (SELECT COUNT(id) FROM APC_CLOSING_DAY WHERE id_user = u.id AND id_office = ubo.id_office AND active_status = 'ENEBLED' AND DATE(created_on) = CURDATE()) = 0 + ,(SELECT IF(ISNULL(SUM(amount_to_transfer)),0, SUM(amount_to_transfer)) + FROM APC_TRANSFER + WHERE + id_user_receiver = u.id AND + action_status = 'PENDING' AND + active_status = 'ENEBLED' AND + DATE(created_on) = CURDATE() + ) + ,0.0 + ) AS transfer_pending +FROM APC_USER u +JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE + u.user_status = 'ENEBLED'; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_TOTAL_LOANS_BY_OFFICE` +-- +-- +CREATE OR REPLACE VIEW `APC_TOTAL_LOANS_BY_OFFICE` AS +SELECT + l.id, + l.loan_status, + r.id_office, + r.route_name, + l.id_route, + l.amount_to_pay, + l.amount_paid + FROM + APC_LOAN l + JOIN + APC_ROUTE r ON r.id = l.id_route + WHERE + l.loan_status in ('PENDING', 'FINISH', 'APPROVED','REJECTED','TO_DELIVERY') + AND r.active_status = 'ENEBLED'; +-- -------------------------------------------------------------------- +-- Estructura para la vista `APC_TOTAL_CLOSING_DAY_BY_CURDATE_VIEW` +-- +-- Sirve para obtener lo que tiene que entregar el asesor al final del día. +-- +CREATE OR REPLACE VIEW `APC_TOTAL_CLOSING_DAY_BY_CURDATE_VIEW` AS +SELECT + u.id, + u.id_office, + u.amount_paid +FROM APC_CLOSING_DAY u +WHERE + u.active_status = 'ENEBLED' AND + DATE(u.created_on) = CURDATE(); +-- -------------------------------------------------------------------- +-- Estructura para la vista `APC_CLOSING_DAILY_DETAIL_FROM_USER_BY_CURDATE_VIEW` +-- +-- Sirve para obtener los detalles del total de los cobros realizados por los asesores +-- estos pueden ser tanto pagos como multas. +-- +CREATE OR REPLACE VIEW `APC_CLOSING_DAILY_DETAIL_FROM_USER_BY_CURDATE_VIEW` AS +SELECT + ld.id, + CONCAT(p.first_name,' ',IF(ISNULL(p.second_name) ,'', CONCAT(p.second_name, ' ')),p.last_name,' ', p.middle_name) AS comments, + ld.payment_amount as amount, + CASE + WHEN ld.loan_details_type = 'PAYMENT' THEN 'Abono' + WHEN ld.loan_details_type = 'FEE' THEN 'Multa' + WHEN ld.loan_details_type = 'TRANSFER' THEN 'Depósito' + ELSE '' END as type, + ld.id_user, + ld.created_on, + l.created_on as fechaFiltro, + 'xxxx' as route, + (l.amount_to_pay - amount_paid) as saldo +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON ld.id_loan = l.id +INNER JOIN APC_PEOPLE p ON l.id_customer = p.id +WHERE DATE(ld.created_on) = CURDATE() +AND ld.loan_details_type in ('PAYMENT', 'FEE', 'TRANSFER' ) +UNION +SELECT + md.id, + DATE(md.money_daily_date) AS comments, + md.amount as amount, + 'Inicio' as type, + md.id_user, + md.created_on, + CURDATE() as fechaFiltro, + 'xxxx' as route, + 0 as saldo +FROM + APC_MONEY_DAILY md +WHERE DATE(md.money_daily_date) = CURDATE() +UNION +SELECT + oe.id, + oe.description, + oe.expense, + 'Gasto', + oe.id_user, + oe.created_on, + CURDATE() as fechaFiltro, + 'xxxx' as route, + 0 as saldo +FROM + APC_OTHER_EXPENSE oe +WHERE DATE(oe.created_on) = CURDATE() +UNION +SELECT + te.id, + CONCAT(hr.first_name,' ',IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name, ' ')),hr.last_name,' ', hr.middle_name), + te.amount_to_transfer, + 'Transferencia enviada', + te.id_user_transmitter, + te.created_on, + CURDATE() as fechaFiltro, + 'xxxx' as route, + 0 as saldo +FROM + APC_TRANSFER te +JOIN + APC_USER u on u.id = te.id_user_receiver +JOIN + APC_HUMAN_RESOURCE hr on hr.id = u.id_human_resource +WHERE DATE(te.created_on) = CURDATE() +UNION +SELECT + tr.id, + CONCAT(hr.first_name,' ',IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name, ' ')),hr.last_name,' ', hr.middle_name), + tr.amount_to_transfer, + 'Transferencia recibida', + tr.id_user_receiver, + tr.created_on, + CURDATE() as fechaFiltro, + 'xxxx' as route, + 0 as saldo +FROM + APC_TRANSFER tr +JOIN + APC_USER u on u.id = tr.id_user_transmitter +JOIN + APC_HUMAN_RESOURCE hr on hr.id = u.id_human_resource +WHERE DATE(tr.created_on) = CURDATE() +UNION +SELECT + d.id, + CONCAT(p.first_name,' ',IF(ISNULL(p.second_name) ,'', CONCAT(p.second_name, ' ')),p.last_name,' ', p.middle_name, ' - ', + r.route_name , ', Abono préstamo anterior : ', Case WHEN (SELECT CASE WHEN ld.payment_amount is null or 0 THEN 0 ELSE ld.payment_amount END FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l3 ON ld.id_loan = l3.id +WHERE ld.loan_details_type = 'RENOVATION_PAYMENT' +AND l3.id = (SELECT albr.id_loan_old FROM APC_LOAN_BY_RENOVATION albr WHERE albr.id_loan_new = l.id)) is null then 0 else (SELECT CASE WHEN ld.payment_amount is null or 0 THEN 0 ELSE ld.payment_amount END FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l3 ON ld.id_loan = l3.id +WHERE ld.loan_details_type = 'RENOVATION_PAYMENT' +AND l3.id = (SELECT albr.id_loan_old FROM APC_LOAN_BY_RENOVATION albr WHERE albr.id_loan_new = l.id)) end , ', Comisión por apertura: ', lt.opening_fee), + d.amount, + 'Entrega de préstamo', + d.id_user, + d.created_on, + CURDATE() as fechaFiltro, + r.route_name as route, + CASE WHEN (SELECT (l2.amount_to_pay - l2.amount_paid) FROM APC_LOAN_BY_RENOVATION lr + INNER JOIN APC_LOAN l2 ON l2.id = lr.id_loan_old + WHERE lr.id_loan_new = l.id) is null THEN 0 ELSE + (SELECT (l2.amount_to_pay - l2.amount_paid) FROM APC_LOAN_BY_RENOVATION lr + INNER JOIN APC_LOAN l2 ON l2.id = lr.id_loan_old + WHERE lr.id_loan_new = l.id) END as saldo +FROM APC_DELIVERY d +INNER JOIN APC_LOAN l ON d.id_loan = l.id +INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +INNER JOIN APC_PEOPLE p ON l.id_customer = p.id +INNER JOIN APC_ROUTE r ON r.id = l.id_route +WHERE DATE(d.created_on) = CURDATE(); +-- -------------------------------------------------------------------- +-- Estructura para la vista `APC_LOAN_APPROVED_DETAIL_VIEW` +-- +-- Sirve para obtener los detalles del total de los prestamos que estan +-- en estatus de APROBADO. +-- +CREATE OR REPLACE VIEW `APC_LOAN_APPROVED_DETAIL_VIEW` AS +SELECT + l.id, + l.amount_to_pay - l.amount_paid AS total_to_pay, + l.amount_to_pay - (l.amount_paid + (SELECT IF(ISNULL(SUM(payment_amount)),0,SUM(payment_amount)) FROM APC_LOAN_DETAIL WHERE id_loan = l.id AND loan_details_type = 'FEE')) AS loan_amount_to_pay, + ( + SELECT + IF(ISNULL(SUM(payment_amount)),0,SUM(payment_amount)) + FROM APC_LOAN_DETAIL + WHERE + id_loan = l.id AND + loan_details_type = 'FEE' + )AS total_fee +FROM APC_LOAN l +WHERE l.loan_status = 'APPROVED'; +-- -------------------------------------------------------------------- +-- Estructura para la vista `APC_GENERAL_BOX_VIEW` +-- +CREATE OR REPLACE VIEW `APC_GENERAL_BOX_VIEW` AS +SELECT + md.id, + CONCAT(hr.first_name,' ',IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name, ' ')),hr.last_name,' ', hr.middle_name) AS comments, + Date(md.money_daily_date) as fecha, + md.amount as amount, + md.id_office as office, + 'Inicio' as type +FROM APC_MONEY_DAILY md +JOIN + APC_USER u on u.id = md.id_user +JOIN + APC_HUMAN_RESOURCE hr on hr.id = u.id_human_resource +UNION +SELECT + cd.id, + CONCAT(hr.first_name,' ',IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name, ' ')),hr.last_name,' ', hr.middle_name) AS comments, + Date(cd.created_on), + cd.amount_paid, + cd.id_office, + 'Corte del día' +FROM APC_CLOSING_DAY cd +JOIN + APC_USER u on u.id = cd.id_user +JOIN + APC_HUMAN_RESOURCE hr on hr.id = u.id_human_resource +WHERE cd.active_status = 'ENEBLED' +UNION +SELECT + ecin.id, + ecin.description, + date(ecin.created_on), + ecin.amount, + ecin.id_office, + 'Entrada' +FROM APC_EXPENSE_COMPANY as ecin +WHERE ecin.expense_company_type = 'PAYMENT_IN' +AND ecin.active_status = 'ENEBLED' +UNION +SELECT + ecin.id, + ecin.description, + date(ecin.created_on), + ecin.amount, + ecin.id_office, + 'Salida' +FROM APC_EXPENSE_COMPANY as ecin +WHERE ecin.expense_company_type = 'PAYMENT_OUT' +AND ecin.active_status = 'ENEBLED' +UNION +SELECT + a.id, + CONCAT(hr.first_name,' ',IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name, ' ')),hr.last_name,' ', hr.middle_name) AS comments, + date(a.created_on), + a.amount, + a.id_office, + 'Adelanto' +FROM + APC_ADVANCE a +JOIN + APC_HUMAN_RESOURCE hr on hr.id = a.id_human_resource +WHERE + a.active_status = 'ENEBLED' +UNION +SELECT + pay.id, + CONCAT(hr.first_name,' ',IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name, ' ')),hr.last_name,' ', hr.middle_name) AS comments, + date(pay.created_on), + pay.total_payment, + pay.id_office, + 'Nomina' +FROM + APC_PAYROLL pay +JOIN + APC_HUMAN_RESOURCE hr on hr.id = pay.id_human_resource +WHERE + pay.active_status = 'ENEBLED' +UNION +SELECT + l.id, + CONCAT(hr.first_name,' ',IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name, ' ')),hr.last_name,' ', hr.middle_name) AS comments, + date(l.created_on), + l.amount_loan, + 'caef3a64-7d1f-11ea-af3e-28f659da398e' as office, + 'Préstamo Empleado' as type +FROM + APC_LOAN_EMPLOYEE l +JOIN + APC_HUMAN_RESOURCE hr on hr.id = l.id_employee +WHERE + l.loan_employee_status = 'ENEBLED'; + +-- -------------------------------------------------------- +-- +-- Estructura para la vista `APC_LOAN_BY_USER_PAYMENT_ZERO_VIEW` +-- +-- Total de abonos en ceros por dia. +-- +CREATE OR REPLACE VIEW `APC_LOAN_BY_USER_PAYMENT_ZERO_VIEW` AS +SELECT + ald.id, + ald.id_user, + al.id_customer, + ald.loan_comments +FROM APC_LOAN_DETAIL ald +INNER JOIN APC_LOAN al ON ald.id_loan = al.id +WHERE + DATE(ald.created_on) = CURDATE() + AND ald.payment_amount = 0 + AND al.loan_status != 'DELETED' + AND ald.loan_details_type = 'PAYMENT'; +-- ---------------------------------------------------------------- +-- +-- Estructura para la vista `APC_INFORMATION_LOAN_WEEK_VIEW` +-- +CREATE OR REPLACE VIEW `APC_INFORMATION_LOAN_WEEK_VIEW` AS +SELECT +l.id, +u.id as id_user, +r.id_office, +l.created_on as fecha, +lt.payment as apoyos, +lt.payment_total as apoyos_total, +lt.opening_fee as comision_apertura, +CONCAT(endor.first_name,' ', IF(ISNULL(endor.second_name) ,'', CONCAT(endor.second_name,' ')) ,endor.last_name, ' ', endor.middle_name) AS aval, +CONCAT(cus.first_name,' ', IF(ISNULL(cus.second_name) ,'', CONCAT(cus.second_name,' ')) ,cus.last_name, ' ', cus.middle_name) AS customer, +l.amount_to_pay as documento_por, +lt.payment_daily as abono_diario, +l.amount_paid, +(l.amount_to_pay - l.amount_paid) saldo_insoluto, +r.route_name, +CONCAT(hr.first_name,' ', IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name,' ')) ,hr.last_name, ' ', hr.middle_name) AS asesor, +(SELECT COUNT(lfn.id) FROM APC_LOAN_FEE_NOTIFICATION lfn WHERE lfn.id_loan = l.id) as num_fee, +-- Lunes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'monday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_monday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'monday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_monday, +-- Martes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'tuesday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_tuesday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'tuesday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_tuesday, +-- Miercoles +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) +AND YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'wednesday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_wednesday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'wednesday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_wednesday, +-- Jueves +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'thursday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_thursday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'thursday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_thursday, +-- Viernes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'friday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_friday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'friday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_friday, +-- Sabado +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'saturday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_saturday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'saturday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_saturday, + +((lt.payment_daily * (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) > 5, 5 , COUNT(DISTINCT(DATE(ldFaltante.created_on)))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE'))) +- (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) as faltante, + +CASE WHEN l.new_customer = 'ENEBLED' AND WEEK(DATE(l.created_on),1) = WEEK(CURDATE(),1) THEN 'Si' ELSE 'No' END as new_customer, +if((SELECT COUNT(id_loan_old) FROM APC_LOAN_BY_RENOVATION lbr +INNER JOIN APC_LOAN lRenovation ON lbr.id_loan_new = lRenovation.id +WHERE id_loan_old = l.id + AND loan_by_renovation_status = 'APPROVED' and WEEK(DATE(lRenovation.created_on),1) <= WEEK(CURDATE(),1) AND + YEAR(DATE(lRenovation.created_on)) = YEAR(CURDATE())) = 0 , 'No' , 'Si') as renovation, +l.loan_status as estatus_prestamo, +(SELECT COUNT(DISTINCT(DATE(ldFaltante.created_on))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) <= (WEEK(CURDATE(),1)) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE')) as num_pagos_all, +(SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) > 5, 5, COUNT(DISTINCT(DATE(ldFaltante.created_on)))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE')) as num_pagos_week, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) <= (WEEK(CURDATE(),1)) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('FEE')) as fee_todos +FROM +APC_LOAN l +INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +INNER JOIN APC_PEOPLE cus ON cus.id = l.id_customer +INNER JOIN APC_PEOPLE endor ON endor.id = l.id_endorsement +INNER JOIN APC_ROUTE r ON r.id = l.id_route +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +INNER JOIN APC_USER u ON u.id = lbu.id_user +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +WHERE +l.loan_status not in ('DELETED','REJECTED') AND +((SELECT COUNT(ld.id) FROM APC_LOAN_DETAIL ld WHERE WEEK(DATE(ld.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.id_loan = l.id) > 0 OR + ((SELECT COUNT(ld.id) FROM APC_LOAN_DETAIL ld WHERE WEEK(DATE(ld.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.id_loan = l.id) = 0 AND l.loan_status = 'APPROVED' AND + WEEK(DATE(l.created_on),1) <= (WEEK(CURDATE(),1)))); +-- ---------------------------------------------------------------- +-- +-- Estructura para la vista `APC_CUSTOMERS_WITHOUT_RENOVATION_VIEW` +-- +CREATE OR REPLACE VIEW `APC_CUSTOMERS_WITHOUT_RENOVATION_VIEW` AS +SELECT + p.id as id, + CONCAT(p.first_name,' ', IF(ISNULL(p.second_name) ,'', CONCAT(p.second_name,' ')) ,p.last_name, ' ', p.middle_name) AS available_person, + ar.route_name, + (SELECT MAX(l.created_on) FROM APC_LOAN l WHERE l.id_customer = p.id) as last_loan, + p.id_office AS office, +FROM APC_PEOPLE p +INNER JOIN APC_ROUTE ar ON ar.id = p.id_route +WHERE + p.people_type IN ('CUSTOMER', 'BOTH') AND + p.active_status = 'ENEBLED' AND + (SELECT COUNT(l.id) FROM APC_LOAN l WHERE l.id_customer = p.id) > 0 AND + CASE + WHEN 0 = ( + SELECT COUNT(id) + FROM APC_LOAN + WHERE + id_customer = p.id AND + loan_status IN ('PENDING', 'BLACK_LIST', 'APPROVED', 'PENDING_RENOVATION', 'TO_DELIVERY') + ) + THEN TRUE + ELSE FALSE + END +ORDER BY available_person; +-- ---------------------------------------------------------------- +-- +-- Estructura para la vista `APC_ADVANCE_USER_DAILY_DETAIL_VIEW` +-- +CREATE OR REPLACE VIEW `APC_ADVANCE_USER_DAILY_DETAIL_VIEW` AS +SELECT +ald.id, +ald.id_user, +CONCAT(ap.first_name, ' ', ap.last_name) AS customer_name, +ald.payment_amount, +ald.created_on, +ap.address_business, +CASE + WHEN ald.loan_details_type = 'PAYMENT' THEN 'Abono' + WHEN ald.loan_details_type = 'FEE' THEN 'Multa' + WHEN ald.loan_details_type = 'TRANSFER' THEN 'Depósito' + ELSE '' END as type_ayment +FROM APC_LOAN_DETAIL ald +INNER JOIN APC_LOAN al ON al.id = ald.id_loan +INNER JOIN APC_PEOPLE ap ON ap.id = al.id_customer +WHERE DATE(ald.created_on) = CURDATE() AND +al.loan_status != 'DELETED' AND +ald.loan_details_type IN ('PAYMENT','FEE','TRANSFER') +UNION +SELECT +id, +user_id, +customer_name, +'Sin visita', +CURDATE(), +customer_address_business, +'Sin visita' +FROM APC_LOAN_BY_USER_VIEW; +-- ---------------------------------------------------------------- +-- +-- Estructura para la vista `APC_TOTAL_LOANS_APPROVED_BY_OFFICE` +-- +CREATE OR REPLACE VIEW `APC_TOTAL_LOANS_APPROVED_BY_OFFICE` AS +SELECT + l.id, + l.loan_status, + r.id_office, + r.payment_daily + FROM + APC_LOAN l + JOIN + APC_LOAN_TYPE r ON r.id = l.id_loan_type + WHERE + l.loan_status in ('APPROVED'); +-- ---------------------------------------------------------------- +-- +-- Estructura para la vista `APC_TOTAL_CASH_BY_CURDATE_DASHBOARD_VIEW` +-- +CREATE OR REPLACE VIEW `APC_TOTAL_CASH_BY_CURDATE_DASHBOARD_VIEW` AS +SELECT + u.id, + ubo.id_office, + (SELECT IF(ISNULL(SUM(ld.payment_amount)),0, SUM(ld.payment_amount)) + FROM APC_LOAN_DETAIL ld + WHERE + ld.id_user = u.id AND + ld.loan_details_type = 'PAYMENT' AND + DATE(ld.created_on) = CURDATE() + + )AS total_amount_payment, + (SELECT IF(ISNULL(SUM(ld.payment_amount)),0, SUM(ld.payment_amount)) + FROM APC_LOAN_DETAIL ld + WHERE + ld.id_user = u.id AND + ld.loan_details_type = 'TRANSFER' AND + DATE(ld.created_on) = CURDATE() + + )AS total_amount_deposit, + (SELECT IF(ISNULL(SUM(amount_to_transfer)),0, SUM(amount_to_transfer)) + FROM APC_TRANSFER + WHERE + id_user_transmitter = u.id AND + action_status = 'APPROVED' AND + active_status = 'ENEBLED' AND + DATE(last_updated_on) = CURDATE() + )AS transfer_sender, + (SELECT IF(ISNULL(SUM(amount_to_transfer)),0, SUM(amount_to_transfer)) + FROM APC_TRANSFER + WHERE + id_user_receiver = u.id AND + action_status = 'APPROVED' AND + active_status = 'ENEBLED' AND + DATE(last_updated_on) = CURDATE() + ) AS transfer_receiver, + (SELECT IF(ISNULL(SUM(amount)),0, SUM(amount)) + FROM APC_MONEY_DAILY + WHERE + id_user = u.id AND + DATE(money_daily_date) = CURDATE() + ) AS money_daily, + (SELECT IF(ISNULL(SUM(expense)),0, SUM(expense)) + FROM APC_OTHER_EXPENSE + WHERE + id_user = u.id AND + DATE(created_on) = CURDATE() + ) AS other_expense, + (SELECT IF(ISNULL(SUM(amount)),0, SUM(amount)) + FROM APC_DELIVERY + WHERE + id_user = u.id AND + DATE(created_on) = CURDATE() + ) as delivery, + (SELECT IF(ISNULL(SUM(amount_to_transfer)),0, SUM(amount_to_transfer)) + FROM APC_TRANSFER + WHERE + id_user_receiver = u.id AND + action_status = 'PENDING' AND + active_status = 'ENEBLED' AND + DATE(created_on) = CURDATE() + ) AS transfer_pending +FROM APC_USER u +JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE + u.user_status = 'ENEBLED'; +-- ---------------------------------------------------------------- +-- +-- Estructura para la vista `APC_MONEY_DAILY_BY_USER_CERTIFIER_VIEW` +-- +CREATE OR REPLACE VIEW `APC_MONEY_DAILY_BY_USER_CERTIFIER_VIEW` AS +SELECT + u.id, + u.user_name, + uo.id_office, + CONCAT(hr.first_name, ' ' , hr.last_name) as employee, + (SELECT SUM(ldc.amount_to_delivery) FROM APC_LOAN_TO_DELIVERY_BY_CERTIFIER_VIEW ldc + WHERE ldc.id_user = u.id) as amount +FROM + APC_USER u +INNER JOIN + APC_USER_BY_OFFICE uo ON u.id = uo.id_user +INNER JOIN + APC_HUMAN_RESOURCE hr ON u.id_human_resource = hr.id +WHERE + u.user_status = 'ENEBLED' +AND + u.certifier = 'ENEBLED'; +-- -------------------------------------------------------- +-- +-- Estructura para la vista `APC_USER_BY_ROUTE_VIEW` +-- +-- Se utiliza para identificar a los usuarios por rutas. +-- +CREATE OR REPLACE VIEW `APC_USER_BY_ROUTE_VIEW` AS +SELECT +CONCAT(u.id,hrhr.id_route) AS id, +u.id AS id_user, +hrhr.id_route AS id_route, + CONCAT( + CASE + WHEN hr.first_name IS NOT NULL AND hr.first_name != '' + THEN CONCAT(SUBSTR(UPPER(hr.first_name), 1, 1),SUBSTR(LOWER(hr.first_name), 2)) + ELSE '' + END, + CASE + WHEN hr.second_name IS NOT NULL AND hr.second_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(hr.second_name), 1, 1),SUBSTR(LOWER(hr.second_name), 2)) + ELSE '' + END, + CASE + WHEN hr.last_name IS NOT NULL AND hr.last_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(hr.last_name), 1, 1),SUBSTR(LOWER(hr.last_name), 2)) + ELSE '' + END, + CASE + WHEN hr.middle_name IS NOT NULL AND hr.middle_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(hr.middle_name), 1, 1),SUBSTR(LOWER(hr.middle_name), 2)) + ELSE '' + END + ) AS employee_name +FROM APC_HUMAN_RESOURCE_HAS_ROUTE hrhr +INNER JOIN APC_HUMAN_RESOURCE hr ON hrhr.id_human_resource = hr.id +INNER JOIN APC_USER u ON hr.id = u.id_human_resource +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE','BOTH') +ORDER BY employee_name; +-- ---------------------------------------------------------------- +-- +-- Estructura para la vista `APC_LOAN_DIFERENCES_BY_USER_LAST_WEEK_VIEW` +-- +CREATE OR REPLACE VIEW `APC_LOAN_DIFERENCES_BY_USER_LAST_WEEK_VIEW` AS +SELECT +l.id, +lbu.id_user, +((lt.payment_daily * 5) - (SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +WHERE ld.id_loan = l.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) +AND YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) + as faltante +FROM + APC_LOAN l +INNER JOIN + APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +INNER JOIN + APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE +l.loan_status not in ('DELETED','REJECTED') AND +(SELECT COUNT(ld2.id) FROM APC_LOAN_DETAIL ld2 WHERE WEEK(DATE(ld2.created_on),1) = (WEEK(CURDATE(),1)-1) +AND YEAR(DATE(ld2.created_on)) = YEAR(CURDATE()) AND ld2.id_loan = l.id) > 4; +-- ---------------------------------------------------------------- +-- +-- Estructura para la vista `APC_INFORMATION_LOAN_LAST_WEEK_VIEW` +-- +CREATE OR REPLACE VIEW `APC_INFORMATION_LOAN_LAST_WEEK_VIEW` AS +SELECT +l.id, +u.id as id_user, +r.id_office, +l.created_on as fecha, +lt.payment as apoyos, +lt.payment_total as apoyos_total, +lt.opening_fee as comision_apertura, +CONCAT(endor.first_name,' ', IF(ISNULL(endor.second_name) ,'', CONCAT(endor.second_name,' ')) ,endor.last_name, ' ', endor.middle_name) AS aval, +CONCAT(cus.first_name,' ', IF(ISNULL(cus.second_name) ,'', CONCAT(cus.second_name,' ')) ,cus.last_name, ' ', cus.middle_name) AS customer, +l.amount_to_pay as documento_por, +lt.payment_daily as abono_diario, +l.amount_paid, +(l.amount_to_pay - l.amount_paid) saldo_insoluto, +r.route_name, +CONCAT(hr.first_name,' ', IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name,' ')) ,hr.last_name, ' ', hr.middle_name) AS asesor, +(SELECT COUNT(lfn.id) FROM APC_LOAN_FEE_NOTIFICATION lfn WHERE lfn.id_loan = l.id) as num_fee, +-- Lunes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'monday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_monday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'monday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_monday, +-- Martes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'tuesday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_tuesday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'tuesday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_tuesday, +-- Miercoles +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'wednesday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_wednesday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'wednesday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_wednesday, +-- Jueves +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'thursday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_thursday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'thursday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_thursday, +-- Viernes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'friday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_friday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'friday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_friday, +-- Sabado +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'saturday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_saturday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'saturday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_saturday, + +((lt.payment_daily * (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) > 5, 5, COUNT(DISTINCT(DATE(ldFaltante.created_on)))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE'))) +- (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) as faltante, + +CASE WHEN l.new_customer = 'ENEBLED' AND WEEK(DATE(l.created_on),1) = (WEEK(CURDATE(),1) - 1) THEN 'Si' ELSE 'No' END as new_customer, +(SELECT IF(COUNT(id_loan_old) = 0 , 'No' , 'Si') FROM APC_LOAN_BY_RENOVATION lbr +INNER JOIN APC_LOAN lRenovation ON lbr.id_loan_new = lRenovation.id +WHERE id_loan_old = l.id + AND loan_by_renovation_status = 'APPROVED' and WEEK(DATE(lRenovation.created_on),1) <= (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(lRenovation.created_on)) = YEAR(CURDATE())) as renovation, +l.loan_status as estatus_prestamo, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as abono_semana_actual, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('FEE')) as fee_semana_actual, +(SELECT COUNT(DISTINCT(DATE(ldFaltante.created_on))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) <= (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE')) as num_pagos_all, +(SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) > 5, 5, COUNT(DISTINCT(DATE(ldFaltante.created_on)))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE')) as num_pagos_week, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) <= (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('FEE')) as fee_todos +FROM +APC_LOAN l +INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +INNER JOIN APC_PEOPLE cus ON cus.id = l.id_customer +INNER JOIN APC_PEOPLE endor ON endor.id = l.id_endorsement +INNER JOIN APC_ROUTE r ON r.id = l.id_route +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +INNER JOIN APC_USER u ON u.id = lbu.id_user +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +WHERE +l.loan_status not in ('DELETED','REJECTED') AND +((SELECT COUNT(ld.id) FROM APC_LOAN_DETAIL ld WHERE WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.id_loan = l.id) > 0 OR + ((SELECT COUNT(ld.id) FROM APC_LOAN_DETAIL ld WHERE WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.id_loan = l.id) = 0 AND l.loan_status = 'APPROVED' AND + WEEK(DATE(l.created_on),1) <= (WEEK(CURDATE(),1) - 1))); +-- ---------------------------------------------------------------- +-- +-- Estructura para la vista `APC_COLOCATION_WEEK_BY_USER_VIEW` +-- +CREATE OR REPLACE VIEW `APC_COLOCATION_WEEK_BY_USER_VIEW` AS +SELECT +u.id, +CONCAT(hr.first_name, ' ' , hr.last_name) as username, +ubo.id_office, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'monday') + as colocation_monday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'tuesday') + as colocation_tuesday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'wednesday') + as colocation_wednesday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'thursday') + as colocation_thursday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'friday') + as colocation_friday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'saturday') + as colocation_saturday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE())) + as colocation_total +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource AND hr.human_resource_status = 'ENEBLED' +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE'); +-- ---------------------------------------------------------------- +-- +-- Estructura para la vista `APC_COLOCATION_LAST_WEEK_BY_USER_VIEW` +-- +CREATE OR REPLACE VIEW `APC_COLOCATION_LAST_WEEK_BY_USER_VIEW` AS +SELECT +u.id, +CONCAT(hr.first_name, ' ' , hr.last_name) as username, +ubo.id_office, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'monday') + as colocation_monday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'tuesday') + as colocation_tuesday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'wednesday') + as colocation_wednesday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'thursday') + as colocation_thursday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'friday') + as colocation_friday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'saturday') + as colocation_saturday, +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE())) + as colocation_total +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource AND hr.human_resource_status = 'ENEBLED' +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE'); +-- ---------------------------------------------------------------- +-- +-- Estructura para la vista `APC_SUBTOTAL_LAST_WEEK_BY_USER_VIEW` +-- +CREATE OR REPLACE VIEW `APC_SUBTOTAL_LAST_WEEK_BY_USER_VIEW` AS +SELECT +u.id, +CONCAT(hr.first_name, ' ' , hr.last_name) as username, +ubo.id_office, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'monday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_monday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'monday') + as opening_fee_monday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'tuesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_tuesday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'tuesday') + as opening_fee_tuesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'wednesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_wednesday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'wednesday') + as opening_fee_wednesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'thursday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_thursday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'thursday') + as opening_fee_thursday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'friday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_friday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'friday') + as opening_fee_friday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'saturday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_saturday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'saturday') + as opening_fee_saturday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_total, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) ) + as opening_fee_total, +( + select + IF(ISNULL( + SUM( + CASE WHEN l.loan_status IN ('PENDING_RENOVATION', 'FINISH') then 0 ELSE + ((lt.payment_daily * (SELECT COUNT(ldFaltante.id) FROM APC_LOAN_DETAIL ldFaltante + WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) + AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE'))) + - (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) + FROM APC_LOAN_DETAIL ldLunes + WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) + AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) END + ) + ),0, + SUM( + CASE WHEN l.loan_status IN ('PENDING_RENOVATION', 'FINISH') then 0 ELSE + ((lt.payment_daily * (SELECT COUNT(ldFaltante.id) FROM APC_LOAN_DETAIL ldFaltante + WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) + AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE'))) + - (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) + FROM APC_LOAN_DETAIL ldLunes + WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) + AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) END + ) + ) + as faltante + + FROM + APC_LOAN l + INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id + INNER JOIN APC_LOAN_BY_USER albu ON l.id = albu.id_loan + WHERE albu.id_user = u.id + AND albu.owner_loan = 'CURRENT_OWNER' + +) +as faltante +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource AND hr.human_resource_status = 'ENEBLED' +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE') AND +u.certifier = 'DISABLED'; +-- ---------------------------------------------------------------- +-- +-- Estructura para la vista `APC_SUBTOTAL_WEEK_BY_USER_VIEW` +-- +CREATE OR REPLACE VIEW `APC_SUBTOTAL_WEEK_BY_USER_VIEW` AS +SELECT +u.id, +CONCAT(hr.first_name, ' ' , hr.last_name) as username, +ubo.id_office, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'monday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_monday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'monday') + as opening_fee_monday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'tuesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_tuesday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'tuesday') + as opening_fee_tuesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'wednesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_wednesday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'wednesday') + as opening_fee_wednesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'thursday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_thursday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'thursday') + as opening_fee_thursday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'friday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_friday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'friday') + as opening_fee_friday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'saturday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_saturday, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) + AND LOWER(DAYNAME(DATE(al.created_on))) = 'saturday') + as opening_fee_saturday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_total, +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND albu.id_user = u.id + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) ) + as opening_fee_total +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource AND hr.human_resource_status = 'ENEBLED' +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE') AND +u.certifier = 'DISABLED'; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_CURRENT_CUSTOMER_BY_LOAN_VIEW` +-- SIRVE PARA TRAER LOS PRESTAMOS CON SUS CLIENTES, AVALES Y ASESORES. +-- +-- -------------------------------------------------------------------- +CREATE OR REPLACE VIEW `APC_CURRENT_CUSTOMER_BY_LOAN_VIEW` AS +SELECT +loan.id AS id_loan, +usr.id AS id_user, +usr_by_office.id_office AS id_office, +loan_type.payment AS payment, +CONCAT( + CASE + WHEN customer.first_name IS NOT NULL AND customer.first_name != '' + THEN CONCAT(SUBSTR(UPPER(customer.first_name), 1, 1),SUBSTR(LOWER(customer.first_name), 2)) + ELSE '' + END, + CASE + WHEN customer.second_name IS NOT NULL AND customer.second_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(customer.second_name), 1, 1),SUBSTR(LOWER(customer.second_name), 2)) + ELSE '' + END, + CASE + WHEN customer.last_name IS NOT NULL AND customer.last_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(customer.last_name), 1, 1),SUBSTR(LOWER(customer.last_name), 2)) + ELSE '' + END, + CASE + WHEN customer.middle_name IS NOT NULL AND customer.middle_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(customer.middle_name), 1, 1),SUBSTR(LOWER(customer.middle_name), 2)) + ELSE '' + END + ) AS customer_name, + CONCAT( + CASE + WHEN endorsement.first_name IS NOT NULL AND endorsement.first_name != '' + THEN CONCAT(SUBSTR(UPPER(endorsement.first_name), 1, 1),SUBSTR(LOWER(endorsement.first_name), 2)) + ELSE '' + END, + CASE + WHEN endorsement.second_name IS NOT NULL AND endorsement.second_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(endorsement.second_name), 1, 1),SUBSTR(LOWER(endorsement.second_name), 2)) + ELSE '' + END, + CASE + WHEN endorsement.last_name IS NOT NULL AND endorsement.last_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(endorsement.last_name), 1, 1),SUBSTR(LOWER(endorsement.last_name), 2)) + ELSE '' + END, + CASE + WHEN endorsement.middle_name IS NOT NULL AND endorsement.middle_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(endorsement.middle_name), 1, 1),SUBSTR(LOWER(endorsement.middle_name), 2)) + ELSE '' + END + ) AS endorsement_name, + loan.loan_status AS loan_status, + loan.created_on AS created_on, + route.route_name AS route_name +FROM APC_LOAN loan +INNER JOIN APC_PEOPLE customer ON loan.id_customer = customer.id +INNER JOIN APC_PEOPLE endorsement ON loan.id_endorsement = endorsement.id +INNER JOIN APC_LOAN_TYPE loan_type ON loan.id_loan_type = loan_type.id +INNER JOIN APC_LOAN_BY_USER loan_by_user ON loan.id = loan_by_user.id_loan +INNER JOIN APC_USER usr ON loan_by_user.id_user = usr.id +INNER JOIN APC_USER_BY_OFFICE usr_by_office ON usr.id = usr_by_office.id_user +INNER JOIN APC_ROUTE route ON loan.id_route = route.id +WHERE loan.loan_status IN('APPROVED','PENDING','PENDING_RENOVATION','TO_DELIVERY') +ORDER BY usr.id, loan.created_on; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_AVAILABLES_OWNERS_VIEW` +-- REGRESA LOS USUARIOS ACTIVOS DE TIPO MOBILE AND BOTH. +-- +-- -------------------------------------------------------------------- +CREATE OR REPLACE VIEW `APC_AVAILABLES_OWNERS_VIEW` AS +SELECT +usr.id AS id_user, +usr_by_office.id_office AS id_office, +usr.user_name AS user_name, +CONCAT( + CASE + WHEN human_resource.first_name IS NOT NULL AND human_resource.first_name != '' + THEN CONCAT(SUBSTR(UPPER(human_resource.first_name), 1, 1),SUBSTR(LOWER(human_resource.first_name), 2)) + ELSE '' + END, + CASE + WHEN human_resource.second_name IS NOT NULL AND human_resource.second_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(human_resource.second_name), 1, 1),SUBSTR(LOWER(human_resource.second_name), 2)) + ELSE '' + END, + CASE + WHEN human_resource.last_name IS NOT NULL AND human_resource.last_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(human_resource.last_name), 1, 1),SUBSTR(LOWER(human_resource.last_name), 2)) + ELSE '' + END, + CASE + WHEN human_resource.middle_name IS NOT NULL AND human_resource.middle_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(human_resource.middle_name), 1, 1),SUBSTR(LOWER(human_resource.middle_name), 2)) + ELSE '' + END + ) AS full_name +FROM APC_USER usr +INNER JOIN APC_HUMAN_RESOURCE human_resource ON usr.id_human_resource = human_resource.id +INNER JOIN APC_USER_BY_OFFICE usr_by_office ON usr.id = usr_by_office.id_user +WHERE usr.user_status = 'ENEBLED' AND +usr.user_type IN ('MOBILE','BOTH') AND +usr.certifier = 'DISABLED'; +-- ---------------------------------------------------------------- +-- +-- Estructura para la vista `APC_COBRANZA_LAST_WEEK_BY_USER_VIEW` +-- +CREATE OR REPLACE VIEW `APC_COBRANZA_LAST_WEEK_BY_USER_VIEW` AS +SELECT +u.id, +CONCAT(hr.first_name, ' ' , hr.last_name) as username, +ubo.id_office, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' AND ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'monday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_monday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'tuesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_tuesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'wednesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_wednesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'thursday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_thursday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'friday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_friday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'saturday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_saturday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_total +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource AND hr.human_resource_status = 'ENEBLED' +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE') AND +u.certifier = 'DISABLED'; +-- ---------------------------------------------------------------- +-- +-- Estructura para la vista `APC_COBRANZA_WEEK_BY_USER_VIEW` +-- +CREATE OR REPLACE VIEW `APC_COBRANZA_WEEK_BY_USER_VIEW` AS +SELECT +u.id, +CONCAT(hr.first_name, ' ' , hr.last_name) as username, +ubo.id_office, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' AND ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'monday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_monday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'tuesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_tuesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'wednesday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_wednesday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'thursday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_thursday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'friday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_friday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'saturday' +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_saturday, +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' and ld.id_user = u.id +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_total +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource AND hr.human_resource_status = 'ENEBLED' +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE') AND +u.certifier = 'DISABLED'; +-- ---------------------------------------------------------------- +-- +-- Estructura para la vista `APC_ADVANCE_USER_DAILY_DASHBOARD_VIEW` +-- +CREATE OR REPLACE VIEW `APC_ADVANCE_USER_DAILY_DASHBOARD_VIEW` AS +SELECT + ate.id, + CONCAT(ahr.first_name, ' ' , ahr.last_name) as user_name, + ate.total_expected, + (ate.total_expected - (SELECT COUNT(id) FROM APC_LOAN_BY_USER_VIEW where user_id = ate.id_user)) as total_now, + CASE WHEN (ate.total_expected - (SELECT COUNT(id) FROM APC_LOAN_BY_USER_VIEW where user_id = ate.id_user)) = 0 + THEN 0 + ELSE + ((ate.total_expected - (SELECT COUNT(id) FROM APC_LOAN_BY_USER_VIEW where user_id = ate.id_user)) * 100) / ate.total_expected + END + as porcentaje, + ate.id_office, + ate.id_user, + (SELECT IF(ISNULL(SUM(ate2.total_expected_payment)),0,SUM(ate2.total_expected_payment)) FROM APC_TOTAL_EXPECTED_PAYMENT_DAILY_BY_USER ate2 + where WEEK(DATE(ate2.created_on),1) = (Select WEEK(CURDATE(),1)) and YEAR(DATE(ate2.created_on)) = (SELECT YEAR(CURDATE())) AND ate2.id_user = ate.id_user) + as total_expected_week, + (SELECT IF(ISNULL(SUM(ald.payment_amount)),0,SUM(ald.payment_amount)) FROM APC_LOAN_DETAIL ald + where WEEK(Date(ald.created_on),1) = (Select WEEK(CURDATE(),1)) and YEAR(Date(ald.created_on)) = (SELECT YEAR(CURDATE())) AND ald.id_user = ate.id_user + AND ald.loan_details_type IN ('PAYMENT', 'RENOVATION_PAYMENT', 'TRANSFER')) + as total_reported_week, +( + select + IF(ISNULL( + SUM( + CASE WHEN l.loan_status IN ('PENDING_RENOVATION', 'FINISH') then 0 ELSE + ((lt.payment_daily * (SELECT COUNT(ldFaltante.id) FROM APC_LOAN_DETAIL ldFaltante + WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) + AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE'))) + - (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) + FROM APC_LOAN_DETAIL ldLunes + WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) + AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) END + ) + ),0, + SUM( + CASE WHEN l.loan_status IN ('PENDING_RENOVATION', 'FINISH') then 0 ELSE + ((lt.payment_daily * (SELECT COUNT(ldFaltante.id) FROM APC_LOAN_DETAIL ldFaltante + WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) + AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE'))) + - (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) + FROM APC_LOAN_DETAIL ldLunes + WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) + AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) END + ) + ) + as faltante + + FROM + APC_LOAN l + INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id + INNER JOIN APC_LOAN_BY_USER albu ON l.id = albu.id_loan + WHERE albu.id_user = ate.id_user + AND albu.owner_loan = 'CURRENT_OWNER' + +) +as faltante, + (SELECT IF(ISNULL(SUM(ald.payment_amount)),0,SUM(ald.payment_amount)) + FROM APC_LOAN_DETAIL ald + INNER JOIN APC_LOAN al ON ald.id_loan = al.id + INNER JOIN APC_LOAN_BY_USER albu ON al.id = albu.id_loan + where WEEK(Date(ald.created_on),1) = (Select WEEK(CURDATE(),1)) and YEAR(Date(ald.created_on)) = (SELECT YEAR(CURDATE())) + AND ald.loan_details_type IN ('RENOVATION_PAYMENT') AND albu.id_user = ate.id_user) as total_reported_renovation_week, + (SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) + FROM APC_LOAN al + INNER JOIN APC_LOAN_BY_USER albu ON al.id = albu.id_loan + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + WHERE albu.id_user = ate.id_user AND al.loan_status = 'APPROVED' AND + WEEK(Date(al.created_on),1) = (Select WEEK(CURDATE(),1)) and YEAR(Date(al.created_on)) = (SELECT YEAR(CURDATE())) + ) as total_comision_fee, + (SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = ate.id_user + AND WEEK(DATE(al.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(Date(al.created_on)) = (SELECT YEAR(CURDATE()))) + as colocation_approved, + (SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'TO_DELIVERY' AND al.created_by = ate.id_user + AND WEEK(DATE(al.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(Date(al.created_on)) = (SELECT YEAR(CURDATE()))) + as colocation_to_delivery +FROM + APC_TOTAL_EXPECTED_PAYMENT_DAILY_BY_USER ate +INNER JOIN APC_USER au ON au.id = ate.id_user +INNER JOIN APC_HUMAN_RESOURCE ahr ON ahr.id = au.id_human_resource +WHERE + DATE(ate.created_on) = CURDATE() + AND ate.active_status = 'ENEBLED'; +-- -------------------------------------------------------- +-- +-- Estructura para la vista `APC_CLOSING_DAILY_DETAIL_FROM_USER_BY_CURDATE_VIEW_REPORT` +-- +CREATE OR REPLACE VIEW `APC_CLOSING_DAILY_DETAIL_FROM_USER_BY_CURDATE_VIEW_REPORT` AS +SELECT + ld.id, + CONCAT(p.first_name,' ',IF(ISNULL(p.second_name) ,'', CONCAT(p.second_name, ' ')),p.last_name,' ', p.middle_name) AS comments, + ld.payment_amount as amount, + CASE + WHEN ld.loan_details_type = 'PAYMENT' THEN 'Abono' + WHEN ld.loan_details_type = 'FEE' THEN 'Multa' + WHEN ld.loan_details_type = 'TRANSFER' THEN 'Depósito' + ELSE '' END as type, + ld.id_user, + ld.created_on, + l.created_on as fechaFiltro, + 'xxxx' as route, + (l.amount_to_pay - amount_paid) as saldo, + 0 as comisionApertura, + 0 as prestamoAnterior +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON ld.id_loan = l.id +INNER JOIN APC_PEOPLE p ON l.id_customer = p.id +WHERE DATE(ld.created_on) = CURDATE() +AND ld.loan_details_type in ('PAYMENT', 'FEE', 'TRANSFER' ) +UNION +SELECT + md.id, + DATE(md.money_daily_date) AS comments, + md.amount as amount, + 'Inicio' as type, + md.id_user, + md.created_on, + CURDATE() as fechaFiltro, + 'xxxx' as route, + 0 as saldo, + 0 as comisionApertura, + 0 as prestamoAnterior +FROM + APC_MONEY_DAILY md +WHERE DATE(md.money_daily_date) = CURDATE() +UNION +SELECT + oe.id, + oe.description, + oe.expense, + 'Gasto', + oe.id_user, + oe.created_on, + CURDATE() as fechaFiltro, + 'xxxx' as route, + 0 as saldo, + 0 as comisionApertura, + 0 as prestamoAnterior +FROM + APC_OTHER_EXPENSE oe +WHERE DATE(oe.created_on) = CURDATE() +UNION +SELECT + te.id, + CONCAT(hr.first_name,' ',IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name, ' ')),hr.last_name,' ', hr.middle_name), + te.amount_to_transfer, + 'Transferencia enviada', + te.id_user_transmitter, + te.created_on, + CURDATE() as fechaFiltro, + 'xxxx' as route, + 0 as saldo, + 0 as comisionApertura, + 0 as prestamoAnterior +FROM + APC_TRANSFER te +JOIN + APC_USER u on u.id = te.id_user_receiver +JOIN + APC_HUMAN_RESOURCE hr on hr.id = u.id_human_resource +WHERE DATE(te.created_on) = CURDATE() +UNION +SELECT + tr.id, + CONCAT(hr.first_name,' ',IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name, ' ')),hr.last_name,' ', hr.middle_name), + tr.amount_to_transfer, + 'Transferencia recibida', + tr.id_user_receiver, + tr.created_on, + CURDATE() as fechaFiltro, + 'xxxx' as route, + 0 as saldo, + 0 as comisionApertura, + 0 as prestamoAnterior +FROM + APC_TRANSFER tr +JOIN + APC_USER u on u.id = tr.id_user_transmitter +JOIN + APC_HUMAN_RESOURCE hr on hr.id = u.id_human_resource +WHERE DATE(tr.created_on) = CURDATE() +UNION +SELECT + d.id, + CONCAT(p.first_name,' ',IF(ISNULL(p.second_name) ,'', CONCAT(p.second_name, ' ')),p.last_name,' ', p.middle_name), + d.amount, + 'Entrega de préstamo', + d.id_user, + d.created_on, + CURDATE() as fechaFiltro, + r.route_name as route, + CASE WHEN (SELECT (l2.amount_to_pay - l2.amount_paid) FROM APC_LOAN_BY_RENOVATION lr + INNER JOIN APC_LOAN l2 ON l2.id = lr.id_loan_old + WHERE lr.id_loan_new = l.id) is null THEN 0 ELSE + (SELECT (l2.amount_to_pay - l2.amount_paid) FROM APC_LOAN_BY_RENOVATION lr + INNER JOIN APC_LOAN l2 ON l2.id = lr.id_loan_old + WHERE lr.id_loan_new = l.id) END as saldo, + lt.opening_fee as comisionApertura, + (SELECT CASE WHEN ld.payment_amount is null or 0 THEN 0 ELSE ld.payment_amount END FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l3 ON ld.id_loan = l3.id +WHERE ld.loan_details_type = 'RENOVATION_PAYMENT' +AND l3.id = (SELECT albr.id_loan_old FROM APC_LOAN_BY_RENOVATION albr WHERE albr.id_loan_new = l.id)) as prestamoAnterior +FROM APC_DELIVERY d +INNER JOIN APC_LOAN l ON d.id_loan = l.id +INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +INNER JOIN APC_PEOPLE p ON l.id_customer = p.id +INNER JOIN APC_ROUTE r ON r.id = l.id_route +WHERE DATE(d.created_on) = CURDATE(); +-- -------------------------------------------------------- +-- +-- Estructura para la vista `APC_RESUMEN_IN_OUT_WEEK_BY_USER_VIEW` +-- +CREATE OR REPLACE VIEW `APC_RESUMEN_IN_OUT_WEEK_BY_USER_VIEW` AS +SELECT +u.id, +CONCAT(hr.first_name, ' ' , hr.last_name) as username, +ubo.id_office, +-- Lunes +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'monday') as closing_monday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'monday') as expense_monday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'monday') as money_daily_today_monday, +-- Martes +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'tuesday') as closing_tuesday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'tuesday') as expense_tuesday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'tuesday') as money_daily_today_tuesday, +-- Miercoles +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'wednesday') as closing_wednesday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'wednesday') as expense_wednesday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'wednesday') as money_daily_today_wednesday, +-- Jueves +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'thursday') as closing_thursday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'thursday') as expense_thursday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'thursday') as money_daily_today_thursday, +-- Viernes +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'friday') as closing_friday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'friday') as expense_friday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'friday') as money_daily_today_friday, +-- Sabado +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'saturday') as closing_saturday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'saturday') as expense_saturday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'saturday') as money_daily_today_saturday +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource AND hr.human_resource_status = 'ENEBLED' +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE','BOTH'); +-- -------------------------------------------------------- +-- +-- Estructura para la vista `APC_RESUMEN_IN_OUT_LAST_WEEK_BY_USER_VIEW` +-- +CREATE OR REPLACE VIEW `APC_RESUMEN_IN_OUT_LAST_WEEK_BY_USER_VIEW` AS +SELECT +u.id, +CONCAT(hr.first_name, ' ' , hr.last_name) as username, +ubo.id_office, +-- Lunes +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'monday') as closing_monday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'monday') as expense_monday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'monday') as money_daily_today_monday, +-- Martes +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'tuesday') as closing_tuesday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'tuesday') as expense_tuesday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'tuesday') as money_daily_today_tuesday, +-- Miercoles +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'wednesday') as closing_wednesday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'wednesday') as expense_wednesday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'wednesday') as money_daily_today_wednesday, +-- Jueves +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'thursday') as closing_thursday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'thursday') as expense_thursday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'thursday') as money_daily_today_thursday, +-- Viernes +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'friday') as closing_friday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'friday') as expense_friday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'friday') as money_daily_today_friday, +-- Sabado +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'saturday') as closing_saturday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'saturday') as expense_saturday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'saturday') as money_daily_today_saturday +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource AND hr.human_resource_status = 'ENEBLED' +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE','BOTH'); +-- -------------------------------------------------------- +-- +-- Estructura para la vista `APC_RESUMEN_TOTAL_LAST_WEEK_VIEW` +-- +CREATE OR REPLACE VIEW `APC_RESUMEN_TOTAL_LAST_WEEK_VIEW` AS +SELECT +u.id, +u.office_name, +-- Cortes +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND ld.id_office = u.id) as closing__day_total, +-- Inicios +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) AND md.id_office = u.id) as money_daily_today_total, +-- Subtotal +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_total, +-- comision por apertura +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE())) + as opening_fee_total, +-- cobranza +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) -1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_today, +-- colocacion +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) ) + as colocation_total, +-- nominas +(SELECT IF(ISNULL(SUM(ap.total_payment)),0,SUM(ap.total_payment)) FROM APC_PAYROLL ap +WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' +AND WEEK(DATE(ap.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(ap.created_on)) = YEAR(CURDATE())) as nomina_total, +-- adelantos +(SELECT IF(ISNULL(SUM(ap.amount)),0,SUM(ap.amount)) FROM APC_ADVANCE ap +WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' +AND WEEK(DATE(ap.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(ap.created_on)) = YEAR(CURDATE())) as adelantos_total, +-- entradas +(SELECT IF(ISNULL(SUM(ap.amount)),0,SUM(ap.amount)) FROM APC_EXPENSE_COMPANY ap +WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' AND +ap.expense_company_type = 'PAYMENT_IN' +AND WEEK(DATE(ap.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(ap.created_on)) = YEAR(CURDATE())) as entradas_total, +-- gastos admon +(SELECT IF(ISNULL(SUM(ap.amount)),0,SUM(ap.amount)) FROM APC_EXPENSE_COMPANY ap +WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' AND +ap.expense_company_type = 'PAYMENT_OUT' +AND WEEK(DATE(ap.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(ap.created_on)) = YEAR(CURDATE())) as gastos_admon_total +FROM APC_OFFICE u +WHERE u.office_status = 'ENEBLED'; +-- -------------------------------------------------------- +-- +-- Estructura para la vista `APC_HISTORY_LOAN_VIEW` +-- +CREATE OR REPLACE VIEW APC_HISTORY_LOAN_VIEW AS +SELECT +l.id, +CONCAT(pc.first_name, ' ', pc.last_name) customerName, +CONCAT(pa.first_name, ' ', pa.last_name) endorsementName, +r.route_name routeName, +o.office_name officeName, +lt.payment montoPrestado, +l.amount_to_pay montoAPagar, +l.amount_paid montoPagado, +(l.amount_to_pay - l.amount_paid) saldoInsoluto, +(SELECT count(lfn.id) FROM APC_LOAN_FEE_NOTIFICATION lfn WHERE lfn.id_loan = l.id) numMultas, +CASE WHEN l.loan_status = 'PENDING' THEN 'Pendiente' +WHEN l.loan_status = 'FINISH' THEN 'Terminado' +WHEN l.loan_status = 'APPROVED' THEN 'Aprobado' +WHEN l.loan_status = 'REJECTED' THEN 'Rechazado' +WHEN l.loan_status = 'PENDING_RENOVATION' THEN 'Pendiente de renovación' +WHEN l.loan_status = 'TO_DELIVERY' THEN 'Por liberar' +END as estatusPrestamo, +DATE(l.created_on) as fecha, +u.user_name nombreUsuario +FROM +APC_LOAN l +INNER JOIN APC_PEOPLE pc ON l.id_customer = pc.id +INNER JOIN APC_PEOPLE pa ON l.id_endorsement = pa.id +INNER JOIN APC_ROUTE r ON l.id_route = r.id +INNER JOIN APC_OFFICE o ON r.id_office = o.id +INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +INNER JOIN APC_USER u ON u.id = lbu.id_user +WHERE l.loan_status NOT IN ('DELETED') +ORDER BY l.created_on DESC; +-- -------------------------------------------------------- +-- +-- Estructura para la vista `APC_RESUMEN_TOTAL_LAST_WEEK_VIEW` +-- +CREATE OR REPLACE VIEW `APC_RESUMEN_TOTAL_LAST_WEEK_VIEW` AS +SELECT +u.id, +u.office_name, +-- Cortes +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND ld.id_office = u.id) as closing__day_total, +-- Inicios +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) AND md.id_office = u.id) as money_daily_today_total, +-- Subtotal +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_total, +-- comision por apertura +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1) - 1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE())) + as opening_fee_total, +-- cobranza +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) -1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_today, +-- colocacion +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) ) + as colocation_total, +-- nominas +(SELECT IF(ISNULL(SUM(ap.total_payment)),0,SUM(ap.total_payment)) FROM APC_PAYROLL ap +WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' +AND WEEK(DATE(ap.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(ap.created_on)) = YEAR(CURDATE())) as nomina_total, +-- adelantos +(SELECT IF(ISNULL(SUM(ap.amount)),0,SUM(ap.amount)) FROM APC_ADVANCE ap +WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' +AND WEEK(DATE(ap.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(ap.created_on)) = YEAR(CURDATE())) as adelantos_total, +-- entradas +(SELECT IF(ISNULL(SUM(ap.amount)),0,SUM(ap.amount)) FROM APC_EXPENSE_COMPANY ap +WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' AND +ap.expense_company_type = 'PAYMENT_IN' +AND WEEK(DATE(ap.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(ap.created_on)) = YEAR(CURDATE())) as entradas_total, +-- gastos admon +(SELECT IF(ISNULL(SUM(ap.amount)),0,SUM(ap.amount)) FROM APC_EXPENSE_COMPANY ap +WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' AND +ap.expense_company_type = 'PAYMENT_OUT' +AND WEEK(DATE(ap.created_on),1) = (WEEK(CURDATE(),1)-1) AND + YEAR(Date(ap.created_on)) = YEAR(CURDATE())) as gastos_admon_total +FROM APC_OFFICE u +WHERE u.office_status = 'ENEBLED'; +-- -------------------------------------------------------- +-- +-- Estructura para la vista `APC_RESUMEN_TOTAL_WEEK_VIEW` +-- +CREATE OR REPLACE VIEW `APC_RESUMEN_TOTAL_WEEK_VIEW` AS +SELECT +u.id, +u.office_name, +-- Cortes +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND ld.id_office = u.id) as closing__day_total, +-- Inicios +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) AND md.id_office = u.id) as money_daily_today_total, +-- Subtotal +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as subtotal_total, +-- comision por apertura +(SELECT IF(ISNULL(SUM(alt.opening_fee)),0,SUM(alt.opening_fee)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE())) + as opening_fee_total, +-- cobranza +(SELECT IF(ISNULL(SUM(ld.payment_amount)),0,SUM(ld.payment_amount)) +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON l.id = ld.id_loan +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +WHERE lbu.id_user = 'aad0c673-eb93-11ea-b7e1-02907d0fb4e6' +AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) +AND ld.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as cobranza_today, +-- colocacion +(SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' + AND WEEK(DATE(al.created_on),1) = (WEEK(CURDATE(),1)) AND + YEAR(Date(al.created_on)) = YEAR(CURDATE()) ) + as colocation_total, +-- nominas +(SELECT IF(ISNULL(SUM(ap.total_payment)),0,SUM(ap.total_payment)) FROM APC_PAYROLL ap +WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' +AND WEEK(DATE(ap.created_on),1) = (WEEK(CURDATE(),1)) AND + YEAR(Date(ap.created_on)) = YEAR(CURDATE())) as nomina_total, +-- adelantos +(SELECT IF(ISNULL(SUM(ap.amount)),0,SUM(ap.amount)) FROM APC_ADVANCE ap +WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' +AND WEEK(DATE(ap.created_on),1) = (WEEK(CURDATE(),1)) AND + YEAR(Date(ap.created_on)) = YEAR(CURDATE())) as adelantos_total, +-- entradas +(SELECT IF(ISNULL(SUM(ap.amount)),0,SUM(ap.amount)) FROM APC_EXPENSE_COMPANY ap +WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' AND +ap.expense_company_type = 'PAYMENT_IN' +AND WEEK(DATE(ap.created_on),1) = (WEEK(CURDATE(),1)) AND + YEAR(Date(ap.created_on)) = YEAR(CURDATE())) as entradas_total, +-- gastos admon +(SELECT IF(ISNULL(SUM(ap.amount)),0,SUM(ap.amount)) FROM APC_EXPENSE_COMPANY ap +WHERE ap.id_office = u.id AND ap.active_status = 'ENEBLED' AND +ap.expense_company_type = 'PAYMENT_OUT' +AND WEEK(DATE(ap.created_on),1) = (WEEK(CURDATE(),1)) AND + YEAR(Date(ap.created_on)) = YEAR(CURDATE())) as gastos_admon_total +FROM APC_OFFICE u +WHERE u.office_status = 'ENEBLED'; +-- -------------------------------------------------------- +-- +-- Estructura para la vista `APC_ADMINISTRATION_PERSON_SEARCH_VIEW` +-- +CREATE OR REPLACE VIEW `APC_ADMINISTRATION_PERSON_SEARCH_VIEW` AS +SELECT + people.id AS id, people.phone_home AS phone_home, people.address_home AS address_home, people.people_type AS people_type, + people.id_route AS id_route, route.route_name AS route_name, people.id_office AS id_office, office.office_name AS office_name, + CONCAT( + CASE + WHEN people.first_name IS NOT NULL AND people.first_name != '' + THEN CONCAT(SUBSTR(UPPER(people.first_name), 1, 1),SUBSTR(LOWER(people.first_name), 2)) + ELSE '' + END, + CASE + WHEN people.second_name IS NOT NULL AND people.second_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(people.second_name), 1, 1),SUBSTR(LOWER(people.second_name), 2)) + ELSE '' + END, + CASE + WHEN people.last_name IS NOT NULL AND people.last_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(people.last_name), 1, 1),SUBSTR(LOWER(people.last_name), 2)) + ELSE '' + END, + CASE + WHEN people.middle_name IS NOT NULL AND people.middle_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(people.middle_name), 1, 1),SUBSTR(LOWER(people.middle_name), 2)) + ELSE '' + END + ) AS person_search +FROM APC_PEOPLE people +INNER JOIN APC_OFFICE office ON people.id_office = office.id +INNER JOIN APC_ROUTE route ON people.id_route = route.id +WHERE + people.active_status = 'ENEBLED' +ORDER BY office_name, route_name, person_search; + +CREATE OR REPLACE VIEW APC_HISTORY_LOAN_VIEW AS +SELECT +l.id, +CONCAT(pc.first_name, ' ', pc.last_name) customerName, +CONCAT(pa.first_name, ' ', pa.last_name) endorsementName, +r.route_name routeName, +o.office_name officeName, +lt.payment montoPrestado, +l.amount_to_pay montoAPagar, +l.amount_paid montoPagado, +(l.amount_to_pay - l.amount_paid) saldoInsoluto, +(SELECT count(lfn.id) FROM APC_LOAN_FEE_NOTIFICATION lfn WHERE lfn.id_loan = l.id) numMultas, +CASE WHEN l.loan_status = 'PENDING' THEN 'Pendiente' +WHEN l.loan_status = 'FINISH' THEN 'Terminado' +WHEN l.loan_status = 'APPROVED' THEN 'Aprobado' +WHEN l.loan_status = 'REJECTED' THEN 'Rechazado' +WHEN l.loan_status = 'PENDING_RENOVATION' THEN 'Pendiente de renovación' +WHEN l.loan_status = 'TO_DELIVERY' THEN 'Por liberar' +END as estatusPrestamo, +DATE(l.created_on) as fecha, +u.user_name nombreUsuario +FROM +APC_LOAN l +INNER JOIN APC_PEOPLE pc ON l.id_customer = pc.id +INNER JOIN APC_PEOPLE pa ON l.id_endorsement = pa.id +INNER JOIN APC_ROUTE r ON l.id_route = r.id +INNER JOIN APC_OFFICE o ON r.id_office = o.id +INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +INNER JOIN APC_USER u ON u.id = lbu.id_user +WHERE l.loan_status NOT IN ('DELETED') +ORDER BY l.created_on DESC +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_STATS_FEES_VIEW` +-- +CREATE OR REPLACE VIEW APC_FEES_VIEW AS +SELECT + LD.ID, + LD.id_user, + R.id AS id_route, + R.route_name AS route_name, + CONCAT(HR.first_name, ' ', HR.last_name) AS name, + LD.payment_amount AS total_fees, + LD.fee_status AS fee_status, + 0.0 AS total_fee_paid, + LD.created_on +FROM APC_LOAN_DETAIL LD +INNER JOIN APC_LOAN L ON LD.id_loan = L.id AND L.loan_status <> 'DELETED' +INNER JOIN APC_USER U ON LD.id_user = U.id +INNER JOIN APC_ROUTE R ON L.id_route = R.id +INNER JOIN APC_HUMAN_RESOURCE HR ON U.id_human_resource = HR.id +WHERE loan_details_type = 'FEE' +-- -------------------------------------------------------- +-- +-- Estructura para la vista `APC_ADMINISTRATION_PERSON_SEARCH_VIEW` +-- +CREATE OR REPLACE VIEW `APC_ADMINISTRATION_PERSON_SEARCH_VIEW` AS +SELECT + people.id AS id, people.phone_home AS phone_home, people.address_home AS address_home, people.people_type AS people_type, + people.id_route AS id_route, route.route_name AS route_name, people.id_office AS id_office, office.office_name AS office_name, + CONCAT( + CASE + WHEN people.first_name IS NOT NULL AND people.first_name != '' + THEN CONCAT(SUBSTR(UPPER(people.first_name), 1, 1),SUBSTR(LOWER(people.first_name), 2)) + ELSE '' + END, + CASE + WHEN people.second_name IS NOT NULL AND people.second_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(people.second_name), 1, 1),SUBSTR(LOWER(people.second_name), 2)) + ELSE '' + END, + CASE + WHEN people.last_name IS NOT NULL AND people.last_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(people.last_name), 1, 1),SUBSTR(LOWER(people.last_name), 2)) + ELSE '' + END, + CASE + WHEN people.middle_name IS NOT NULL AND people.middle_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(people.middle_name), 1, 1),SUBSTR(LOWER(people.middle_name), 2)) + ELSE '' + END + ) AS person_search +FROM APC_PEOPLE people +INNER JOIN APC_OFFICE office ON people.id_office = office.id +INNER JOIN APC_ROUTE route ON people.id_route = route.id +WHERE + people.active_status = 'ENEBLED' +ORDER BY office_name, route_name, person_search; +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_CLOSING_DAY_VIEW` +-- +CREATE OR REPLACE VIEW APC_CLOSING_DAY_VIEW AS +SELECT + CD.ID, + CD.id_user, + CONCAT(HR.first_name, ' ', HR.last_name) AS name, + HRR.route_name AS route_name, + CD.amount_paid AS total_closing, + CD.created_on +FROM APC_CLOSING_DAY CD +INNER JOIN APC_USER U ON CD.id_user = U.id +INNER JOIN APC_HUMAN_RESOURCE HR ON U.id_human_resource = HR.id +INNER JOIN( + SELECT + HRR.id_human_resource, + GROUP_CONCAT(DISTINCT R.route_name SEPARATOR',') AS route_name + FROM APC_HUMAN_RESOURCE_HAS_ROUTE HRR + INNER JOIN APC_ROUTE R ON HRR.id_route = R.id + GROUP BY HRR.id_human_resource +) HRR ON HR.id = HRR.id_human_resource +WHERE CD.active_status <> 'DISABLED'; + +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_OPENING_FEES_VIEW` +-- +CREATE OR REPLACE VIEW `APC_OPENING_FEES_VIEW` AS +SELECT + L.id, + L.created_by AS id_user, + CONCAT(HR.first_name, ' ', HR.last_name) AS name, + R.route_name AS route_name, + LT.opening_fee, + L.created_on +FROM APC_LOAN L +INNER JOIN APC_LOAN_TYPE LT ON L.id_loan_type = LT.id +INNER JOIN APC_USER U ON L.created_by = U.id +INNER JOIN APC_HUMAN_RESOURCE HR ON U.id_human_resource = HR.id +INNER JOIN APC_HUMAN_RESOURCE_HAS_ROUTE HRR ON HR.id = HRR.id_human_resource +INNER JOIN APC_ROUTE R ON HRR.id_route = R.id; +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_PAYMENT_VIEW` +-- +CREATE OR REPLACE VIEW APC_PAYMENT_VIEW AS +SELECT + LD.id, + L.id AS id_loan, + LD.id_user, + CONCAT(HR.first_name, ' ', HR.last_name) AS name, + HRR.route_name, + LD.payment_amount AS total_payment, + LT.opening_fee, + LD.created_on +FROM APC_LOAN_DETAIL LD +INNER JOIN APC_LOAN L ON LD.id_loan = L.id AND L.loan_status <> 'DELETED' +INNER JOIN APC_LOAN_TYPE LT ON L.id_loan_type = LT.id +INNER JOIN APC_USER U ON LD.id_user = U.id +INNER JOIN APC_HUMAN_RESOURCE HR ON U.id_human_resource = HR.id +INNER JOIN( + SELECT + HRR.id_human_resource, + GROUP_CONCAT(DISTINCT R.route_name SEPARATOR',') AS route_name + FROM APC_HUMAN_RESOURCE_HAS_ROUTE HRR + INNER JOIN APC_ROUTE R ON HRR.id_route = R.id + GROUP BY HRR.id_human_resource +) HRR ON HR.id = HRR.id_human_resource +WHERE loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'); +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_PAYROLL_STATS_VIEW` +-- +CREATE OR REPLACE VIEW `APC_PAYROLL_STATS_VIEW` AS +SELECT + P.id, + P.id_human_resource AS id_user, + CONCAT(HR.first_name, ' ', HR.last_name) AS name, + P.salary + P.total_bonus_colocation + P.total_bonus_mora + P.total_bonus_new_customer + P.increases + P.boxed + P.saving + P.payment_to_debt + P.advance - P.imss AS total_payroll, + P.created_on +FROM APC_PAYROLL P +INNER JOIN APC_HUMAN_RESOURCE HR ON P.id_human_resource = HR.id; +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_PAYMENT_ROUTE_VIEW` +-- +CREATE OR REPLACE VIEW `APC_PAYMENT_ROUTE_VIEW` AS +SELECT + LD.id, + L.id AS id_loan, + R.id AS id_route, + R.route_name AS name, + CONCAT(HR.first_name, ' ', HR.last_name) AS user_name, + LD.payment_amount AS total_payment, + LT.opening_fee, + LD.created_on +FROM APC_LOAN_DETAIL LD +INNER JOIN APC_LOAN L ON LD.id_loan = L.id AND L.loan_status <> 'DELETED' +INNER JOIN APC_LOAN_TYPE LT ON L.id_loan_type = LT.id +INNER JOIN APC_ROUTE R ON L.id_route = R.id +INNER JOIN APC_USER U ON LD.id_user = U.id +INNER JOIN APC_HUMAN_RESOURCE HR ON U.id_human_resource = HR.id +WHERE loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'); +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_STATS_PAYMENT_RENOVATION_VIEW` +-- +CREATE OR REPLACE VIEW `APC_STATS_PAYMENT_RENOVATION_VIEW` AS +SELECT + LD.id, + LD.created_by AS id_user, + CONCAT(HR.first_name, ' ', HR.last_name) AS employee_name, + P.id AS id_customer, + CONCAT(P.first_name, ' ', P.second_name, ' ', P.last_name, ' ', P.middle_name) AS customer_name, + LD.payment_amount AS total_payment, + LD.created_on +FROM APC_LOAN_DETAIL LD +INNER JOIN APC_LOAN L ON LD.id_loan = L.id AND L.loan_status <> 'DELETED' +INNER JOIN APC_PEOPLE P ON L.id_customer = P.id +INNER JOIN APC_USER U ON LD.created_by = U.id +INNER JOIN APC_HUMAN_RESOURCE HR ON U.id_human_resource = HR.id +WHERE LD.loan_details_type IN ('RENOVATION_PAYMENT'); +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_STATS_DEPOSITS_VIEW` +-- +CREATE OR REPLACE VIEW `APC_STATS_DEPOSITS_VIEW` AS +SELECT + LD.id, + LD.id_user, + CONCAT(HR.first_name, ' ', HR.last_name) AS name, + HRR.route_name AS route_name, + LD.payment_amount AS total_deposits, + LD.created_on +FROM APC_LOAN_DETAIL LD +INNER JOIN APC_LOAN L ON LD.id_loan = L.id AND L.loan_status <> 'DELETED' +INNER JOIN APC_USER U ON LD.id_user = U.id +INNER JOIN APC_HUMAN_RESOURCE HR ON U.id_human_resource = HR.id +INNER JOIN( + SELECT + HRR.id_human_resource, + GROUP_CONCAT(DISTINCT R.route_name SEPARATOR',') AS route_name + FROM APC_HUMAN_RESOURCE_HAS_ROUTE HRR + INNER JOIN APC_ROUTE R ON HRR.id_route = R.id + GROUP BY HRR.id_human_resource +) HRR ON HR.id = HRR.id_human_resource +WHERE loan_details_type IN ('TRANSFER'); +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_STATS_ADVANCE_VIEW` +-- +CREATE OR REPLACE VIEW `APC_STATS_ADVANCE_VIEW` AS +SELECT + LD.ID, + R.id AS id_route, + R.route_name AS name, + LD.payment_amount AS total_advances, + LD.created_on +FROM APC_LOAN_DETAIL LD +INNER JOIN APC_LOAN L ON LD.id_loan = L.id AND L.loan_status <> 'DELETED' +INNER JOIN APC_USER U ON LD.id_user = U.id +INNER JOIN APC_ROUTE R ON L.id_route = R.id +INNER JOIN APC_HUMAN_RESOURCE HR ON U.id_human_resource = HR.id +WHERE loan_details_type IN ('RENOVATION_PAYMENT'); +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_LOAN_EMPLOYEE_VIEW` +-- +CREATE OR REPLACE VIEW `APC_LOAN_EMPLOYEE_VIEW` AS +SELECT + L.id, + CONCAT(HR.first_name, ' ', HR.last_name) AS name, + HR.id AS id_user, + L.amount_loan, + L.amount_to_pay, + L.balance, + L.total_amount_to_pay, + L.created_on, + L.loan_employee_status, + CONCAT(HRU.first_name, ' ', HRU.last_name) AS created_by_name, + (SELECT IFNULL(MAX(LD.reference_number), 0) FROM APC_LOAN_EMPLOYEE_DETAIL LD WHERE LD.id_loan = L.id) AS reference_number +FROM APC_LOAN_EMPLOYEE L +INNER JOIN APC_HUMAN_RESOURCE HR ON L.id_employee = HR.id +INNER JOIN APC_USER US ON L.created_by = US.id +INNER JOIN APC_HUMAN_RESOURCE HRU ON US.id_human_resource = HRU.id +ORDER BY name, created_on DESC; +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_LOAN_EMPLOYEE_ALL_DATA_VIEW` +-- +CREATE OR REPLACE VIEW `APC_LOAN_EMPLOYEE_ALL_DATA_VIEW` AS +SELECT + L.id, + CONCAT(HR.first_name, ' ', HR.last_name) AS name, + HR.id AS id_user, + L.amount_loan, + L.amount_to_pay, + L.balance, + L.created_on, + L.loan_employee_status +FROM APC_LOAN_EMPLOYEE L +INNER JOIN APC_HUMAN_RESOURCE HR ON L.id_employee = HR.id; +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_LOAN_EMPLOYEE_DETAIL_ALL_DATA_VIEW` +-- +CREATE OR REPLACE VIEW `APC_LOAN_EMPLOYEE_DETAIL_ALL_DATA_VIEW` AS +SELECT + id, + id_loan, + id_user, + payment_amount, + reference_number, + loan_employee_detail_status, + created_on +FROM APC_LOAN_EMPLOYEE_DETAIL +ORDER BY created_on ASC; +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_USER_WEEK_REPORT_VIEW` +-- +CREATE OR REPLACE VIEW `APC_USER_WEEK_REPORT_VIEW` AS +SELECT + u.id AS id_user, + (SELECT IF(ISNULL(SUM(alt.payment)),0,SUM(alt.payment)) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND DATE(al.created_on) + BETWEEN + DATE(DATE_SUB(CURDATE(),INTERVAL WEEKDAY(CURDATE()) DAY)) + AND + DATE(DATE_ADD(CURDATE(),INTERVAL (6 - WEEKDAY(CURDATE())) DAY)) + ) AS payment_week, + (SELECT COUNT(al.id) FROM APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_LOAN_BY_USER albu ON albu.id_loan = al.id + WHERE loan_status = 'APPROVED' AND al.created_by = u.id + AND al.new_customer = 'ENEBLED' + AND DATE(al.created_on) + BETWEEN + DATE(DATE_SUB(CURDATE(),INTERVAL WEEKDAY(CURDATE()) DAY)) + AND + DATE(DATE_ADD(CURDATE(),INTERVAL (6 - WEEKDAY(CURDATE())) DAY)) + ) AS total_new_customer_currweek, + 0.0 AS debit_week, + ( + SELECT COUNT(innerLBU.id_loan) + FROM APC_LOAN_BY_USER innerLBU + WHERE innerLBU.loan_by_user_status = 'APPROVED' AND innerLBU.id_user = u.id + ) AS total_approved_loan, + ( + SELECT + COUNT(innerLBU.id_loan) + FROM APC_LOAN_BY_USER innerLBU WHERE innerLBU.loan_by_user_status = 'TO_DELIVERY' AND innerLBU.id_user = u.id + ) AS total_to_delivery_loan +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE') AND +u.certifier = 'DISABLED'; +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_STATS_GASOLINE_VIEW` +-- +CREATE OR REPLACE VIEW `APC_STATS_GASOLINE_VIEW` AS +SELECT + G.ID, + R.id AS id_route, + R.route_name AS route_name, + G.id_user, + CONCAT(HR.first_name, ' ', HR.last_name) AS user_name, + (SELECT GAS.km_new FROM APC_GASOLINE GAS WHERE GAS.created_on < G.created_on AND GAS.id_user = G.id_user ORDER BY GAS.created_on DESC LIMIT 1) AS km_old, + G.km_new, + G.total AS total_gasoline, + G.Description AS description, + G.created_on, + G.quantity +FROM APC_GASOLINE G +INNER JOIN APC_USER U ON G.id_user = U.id +INNER JOIN APC_HUMAN_RESOURCE HR ON U.id_human_resource = HR.id +INNER JOIN APC_ROUTE R ON G.id_route = R.id +WHERE G.status = 'ENABLED'; + +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_STATS_ZERO_PAYMENTS_VIEW` +-- +CREATE OR REPLACE VIEW `APC_STATS_ZERO_PAYMENTS_VIEW` AS +SELECT + LD.id, + LD.id_user, + CONCAT(HR.first_name, ' ', HR.last_name) AS name, + R.route_name AS route_name, + LD.payment_amount AS total_zeroPayments, + LD.created_on +FROM APC_LOAN_DETAIL LD +INNER JOIN APC_LOAN L ON LD.id_loan = L.id AND L.loan_status <> 'DELETED' +INNER JOIN APC_USER U ON LD.id_user = U.id +INNER JOIN APC_HUMAN_RESOURCE HR ON U.id_human_resource = HR.id +INNER JOIN( + SELECT + HRR.id_human_resource, + GROUP_CONCAT(DISTINCT R.route_name SEPARATOR',') AS route_name + FROM APC_HUMAN_RESOURCE_HAS_ROUTE HRR + INNER JOIN APC_ROUTE R ON HRR.id_route = R.id + GROUP BY HRR.id_human_resource +) HRR ON HR.id = HRR.id_human_resource +WHERE loan_details_type IN ('PAYMENT') AND LD.payment_amount = 0; + +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_STATS_EMPLOYEE_SAVING_VIEW` +-- +CREATE OR REPLACE VIEW `APC_STATS_EMPLOYEE_SAVING_VIEW` AS +SELECT + ES.id, + ES.id_user, + CONCAT(HR.first_name, ' ', HR.last_name) AS name, + HRR.route_name AS route_name, + ES.employee_saving AS employee_saving, + ES.created_on, + ES.Type +FROM APC_EMPLOYEE_SAVING ES +INNER JOIN APC_HUMAN_RESOURCE HR ON ES.id_user = HR.id +INNER JOIN( + SELECT + HRR.id_human_resource, + GROUP_CONCAT(DISTINCT R.route_name SEPARATOR',') AS route_name + FROM APC_HUMAN_RESOURCE_HAS_ROUTE HRR + INNER JOIN APC_ROUTE R ON HRR.id_route = R.id + GROUP BY HRR.id_human_resource +) HRR ON HR.id = HRR.id_human_resource; +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_CUSTOMER_VIEW` +-- +CREATE OR REPLACE VIEW `APC_CUSTOMER_VIEW` AS +SELECT +ap.id AS id, +CONCAT( + CASE + WHEN ap.first_name IS NOT NULL AND ap.first_name != '' + THEN CONCAT(SUBSTR(UPPER(ap.first_name), 1, 1),SUBSTR(LOWER(ap.first_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ap.second_name IS NOT NULL AND ap.second_name != '' + THEN CONCAT(SUBSTR(UPPER(ap.second_name), 1, 1),SUBSTR(LOWER(ap.second_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ap.last_name IS NOT NULL AND ap.last_name != '' + THEN CONCAT(SUBSTR(UPPER(ap.last_name), 1, 1),SUBSTR(LOWER(ap.last_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ap.middle_name IS NOT NULL AND ap.middle_name != '' + THEN CONCAT(SUBSTR(UPPER(ap.middle_name), 1, 1),SUBSTR(LOWER(ap.middle_name), 2)) + ELSE '' + END +) AS full_name, +ap.company_name AS company_name, +ap.address_home AS address_home, +ap.address_business AS address_business, +ar.route_name, +ap.people_type AS people_type, +(CASE + WHEN ap.people_type = 'CUSTOMER' THEN 'Cliente' + WHEN ap.people_type = 'BOTH' THEN 'Cliente y aval' +END) AS str_people_type, +ao.office_name AS office_name, +(SELECT COUNT(id) FROM APC_LOAN WHERE id_customer = ap.id) AS total_of_loan, +ap.classification +FROM APC_PEOPLE ap +INNER JOIN APC_ROUTE ar ON ap.id_route = ar.id +INNER JOIN APC_OFFICE ao ON ap.id_office = ao.id +WHERE ap.active_status = 'ENEBLED' AND ap.people_type IN ('CUSTOMER','BOTH'); +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_TRANSFER_VIEW` +-- +CREATE OR REPLACE VIEW `APC_TRANSFER_VIEW` AS +SELECT +at.id AS id, +at.id_office AS id_office, +CONCAT( + CASE + WHEN ahr.first_name IS NOT NULL AND ahr.first_name != '' + THEN CONCAT(SUBSTR(UPPER(ahr.first_name), 1, 1),SUBSTR(LOWER(ahr.first_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ahr.second_name IS NOT NULL AND ahr.second_name != '' + THEN CONCAT(SUBSTR(UPPER(ahr.second_name), 1, 1),SUBSTR(LOWER(ahr.second_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ahr.last_name IS NOT NULL AND ahr.last_name != '' + THEN CONCAT(SUBSTR(UPPER(ahr.last_name), 1, 1),SUBSTR(LOWER(ahr.last_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ahr.middle_name IS NOT NULL AND ahr.middle_name != '' + THEN CONCAT(SUBSTR(UPPER(ahr.middle_name), 1, 1),SUBSTR(LOWER(ahr.middle_name), 2)) + ELSE '' + END +) AS full_name_transmitter, +( + SELECT GROUP_CONCAT(inner_ar.route_name) + FROM APC_HUMAN_RESOURCE_HAS_ROUTE inner_ahrhr + INNER JOIN APC_ROUTE inner_ar ON inner_ahrhr.id_route = inner_ar.id + WHERE id_human_resource = ahr.id +) AS transmitter_routes, +CONCAT( + CASE + WHEN ahrr.first_name IS NOT NULL AND ahrr.first_name != '' + THEN CONCAT(SUBSTR(UPPER(ahrr.first_name), 1, 1),SUBSTR(LOWER(ahrr.first_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ahrr.second_name IS NOT NULL AND ahrr.second_name != '' + THEN CONCAT(SUBSTR(UPPER(ahrr.second_name), 1, 1),SUBSTR(LOWER(ahrr.second_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ahrr.last_name IS NOT NULL AND ahrr.last_name != '' + THEN CONCAT(SUBSTR(UPPER(ahrr.last_name), 1, 1),SUBSTR(LOWER(ahrr.last_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ahrr.middle_name IS NOT NULL AND ahrr.middle_name != '' + THEN CONCAT(SUBSTR(UPPER(ahrr.middle_name), 1, 1),SUBSTR(LOWER(ahrr.middle_name), 2)) + ELSE '' + END +) AS full_name_receiver, +( + SELECT GROUP_CONCAT(inner_ar.route_name) + FROM APC_HUMAN_RESOURCE_HAS_ROUTE inner_ahrhr + INNER JOIN APC_ROUTE inner_ar ON inner_ahrhr.id_route = inner_ar.id + WHERE id_human_resource = ahrr.id +) AS receiver_routes, +at.amount_to_transfer AS amount_to_transfer, +at.action_status AS action_status, +( +CASE + WHEN at.action_status = 'PENDING' THEN 'Pendiente' + WHEN at.action_status = 'APPROVED' THEN 'Aprobada' + ELSE 'REJECTED' +END) AS str_action_status, +at.created_on AS created_on, +( +CASE + WHEN date_format(at.created_on,'%m') = '01' + THEN concat(date_format(at.created_on,'%d'),' - Enero - ',date_format(at.created_on,'%Y')) + WHEN date_format(at.created_on,'%m') = '02' + THEN concat(date_format(at.created_on,'%d'),' - Febrero - ',date_format(at.created_on,'%Y')) + WHEN date_format(at.created_on,'%m') = '03' + THEN concat(date_format(at.created_on,'%d'),' - Marzo - ',date_format(at.created_on,'%Y')) + WHEN date_format(at.created_on,'%m') = '04' + THEN concat(date_format(at.created_on,'%d'),' - Abril - ',date_format(at.created_on,'%Y')) + WHEN date_format(at.created_on,'%m') = '05' + THEN concat(date_format(at.created_on,'%d'),' - Mayo - ',date_format(at.created_on,'%Y')) + WHEN date_format(at.created_on,'%m') = '06' + THEN concat(date_format(at.created_on,'%d'),' - Junio - ',date_format(at.created_on,'%Y')) + WHEN date_format(at.created_on,'%m') = '07' + THEN concat(date_format(at.created_on,'%d'),' - Julio - ',date_format(at.created_on,'%Y')) + WHEN date_format(at.created_on,'%m') = '08' + THEN concat(date_format(at.created_on,'%d'),' - Agosto - ',date_format(at.created_on,'%Y')) + WHEN date_format(at.created_on,'%m') = '09' + THEN concat(date_format(at.created_on,'%d'),' - Septiembre - ',date_format(at.created_on,'%Y')) + WHEN date_format(at.created_on,'%m') = '10' + THEN concat(date_format(at.created_on,'%d'),' - Octubre - ',date_format(at.created_on,'%Y')) + WHEN date_format(at.created_on,'%m') = '11' + THEN concat(date_format(at.created_on,'%d'),' - Noviembre - ',date_format(at.created_on,'%Y')) + WHEN date_format(at.created_on,'%m') = '12' + THEN concat(date_format(at.created_on,'%d'),' - Diciembre - ',date_format(at.created_on,'%Y')) +END +) AS str_created_on, +( +CASE + WHEN at.active_status = 'DISABLED' THEN 'grayRow' + ELSE NULL +END +)AS style_class +FROM APC_TRANSFER at +INNER JOIN APC_USER au ON at.id_user_transmitter = au.id +INNER JOIN APC_HUMAN_RESOURCE ahr ON au.id_human_resource = ahr.id +INNER JOIN APC_USER aur ON at.id_user_receiver = aur.id +INNER JOIN APC_HUMAN_RESOURCE ahrr ON aur.id_human_resource = ahrr.id; +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_ENABLED_USER_DETAILS_VIEW` +-- +CREATE OR REPLACE VIEW `APC_ENABLED_USER_DETAILS_VIEW` AS +SELECT +au.id AS id_user, +CONCAT( + CASE + WHEN ahr.first_name IS NOT NULL AND ahr.first_name != '' + THEN CONCAT(SUBSTR(UPPER(ahr.first_name), 1, 1),SUBSTR(LOWER(ahr.first_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ahr.second_name IS NOT NULL AND ahr.second_name != '' + THEN CONCAT(SUBSTR(UPPER(ahr.second_name), 1, 1),SUBSTR(LOWER(ahr.second_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ahr.last_name IS NOT NULL AND ahr.last_name != '' + THEN CONCAT(SUBSTR(UPPER(ahr.last_name), 1, 1),SUBSTR(LOWER(ahr.last_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ahr.middle_name IS NOT NULL AND ahr.middle_name != '' + THEN CONCAT(SUBSTR(UPPER(ahr.middle_name), 1, 1),SUBSTR(LOWER(ahr.middle_name), 2)) + ELSE '' + END +) AS full_name, +aubo.id_office AS id_office +FROM APC_USER au +INNER JOIN APC_HUMAN_RESOURCE ahr ON au.id_human_resource = ahr.id +INNER JOIN APC_USER_BY_OFFICE aubo ON au.id = aubo.id_user +WHERE ahr.human_resource_status = 'ENEBLED' AND au.user_status = 'ENEBLED'; + +CREATE OR REPLACE VIEW `APC_LOAN_DETAIL_ZERO_VIEW` AS +SELECT + LD.id, + CONCAT(IFNULL(P.first_name, ''), ' ', IFNULL(P.second_name, ''), ' ', IFNULL(P.last_name, ''), ' ', IFNULL(P.middle_name, '')) AS customer_name, + P.address_home, + L.amount_to_pay, + LD.loan_comments, + CONCAT(HR.first_name, ' ', HR.last_name) AS user_name, + L.id_loan_type, + LT.payment +FROM APC_LOAN_DETAIL AS LD +INNER JOIN APC_LOAN AS L ON LD.id_loan = L.id +INNER JOIN APC_PEOPLE AS P ON L.id_customer = P.id +INNER JOIN APC_LOAN_TYPE LT ON L.id_loan_type = LT.id +INNER JOIN APC_USER U ON LD.id_user = U.id +INNER JOIN APC_HUMAN_RESOURCE HR ON U.id_human_resource = HR.id +WHERE LD.loan_details_type = 'PAYMENT' + AND DATE(LD.created_on) = DATE(CURDATE()) + AND LD.payment_amount = 0; +-- ------------------------------------------------------------- +-- +-- Estructura para la vista `APC_TRANSFER_IN_PENDING_STATUS_VIEW` +-- +CREATE OR REPLACE VIEW `APC_TRANSFER_IN_PENDING_STATUS_VIEW` AS +SELECT + ald.id AS id_loan_detail, + ald.payment_amount AS payment_amount, + ( +CASE + WHEN date_format(ald.created_on,'%m') = '01' + THEN concat(date_format(ald.created_on,'%d'),' - Enero - ',date_format(ald.created_on,'%Y')) + WHEN date_format(ald.created_on,'%m') = '02' + THEN concat(date_format(ald.created_on,'%d'),' - Febrero - ',date_format(ald.created_on,'%Y')) + WHEN date_format(ald.created_on,'%m') = '03' + THEN concat(date_format(ald.created_on,'%d'),' - Marzo - ',date_format(ald.created_on,'%Y')) + WHEN date_format(ald.created_on,'%m') = '04' + THEN concat(date_format(ald.created_on,'%d'),' - Abril - ',date_format(ald.created_on,'%Y')) + WHEN date_format(ald.created_on,'%m') = '05' + THEN concat(date_format(ald.created_on,'%d'),' - Mayo - ',date_format(ald.created_on,'%Y')) + WHEN date_format(ald.created_on,'%m') = '06' + THEN concat(date_format(ald.created_on,'%d'),' - Junio - ',date_format(ald.created_on,'%Y')) + WHEN date_format(ald.created_on,'%m') = '07' + THEN concat(date_format(ald.created_on,'%d'),' - Julio - ',date_format(ald.created_on,'%Y')) + WHEN date_format(ald.created_on,'%m') = '08' + THEN concat(date_format(ald.created_on,'%d'),' - Agosto - ',date_format(ald.created_on,'%Y')) + WHEN date_format(ald.created_on,'%m') = '09' + THEN concat(date_format(ald.created_on,'%d'),' - Septiembre - ',date_format(ald.created_on,'%Y')) + WHEN date_format(ald.created_on,'%m') = '10' + THEN concat(date_format(ald.created_on,'%d'),' - Octubre - ',date_format(ald.created_on,'%Y')) + WHEN date_format(ald.created_on,'%m') = '11' + THEN concat(date_format(ald.created_on,'%d'),' - Noviembre - ',date_format(ald.created_on,'%Y')) + WHEN date_format(ald.created_on,'%m') = '12' + THEN concat(date_format(ald.created_on,'%d'),' - Diciembre - ',date_format(ald.created_on,'%Y')) +END +) AS str_created_on, +CONCAT( + CASE + WHEN ap_customer.first_name IS NOT NULL AND ap_customer.first_name != '' + THEN CONCAT(SUBSTR(UPPER(ap_customer.first_name), 1, 1),SUBSTR(LOWER(ap_customer.first_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ap_customer.second_name IS NOT NULL AND ap_customer.second_name != '' + THEN CONCAT(SUBSTR(UPPER(ap_customer.second_name), 1, 1),SUBSTR(LOWER(ap_customer.second_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ap_customer.last_name IS NOT NULL AND ap_customer.last_name != '' + THEN CONCAT(SUBSTR(UPPER(ap_customer.last_name), 1, 1),SUBSTR(LOWER(ap_customer.last_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ap_customer.middle_name IS NOT NULL AND ap_customer.middle_name != '' + THEN CONCAT(SUBSTR(UPPER(ap_customer.middle_name), 1, 1),SUBSTR(LOWER(ap_customer.middle_name), 2)) + ELSE '' + END +) AS customer_name, +CONCAT( + CASE + WHEN ap_endorsement.first_name IS NOT NULL AND ap_endorsement.first_name != '' + THEN CONCAT(SUBSTR(UPPER(ap_endorsement.first_name), 1, 1),SUBSTR(LOWER(ap_endorsement.first_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ap_endorsement.second_name IS NOT NULL AND ap_endorsement.second_name != '' + THEN CONCAT(SUBSTR(UPPER(ap_endorsement.second_name), 1, 1),SUBSTR(LOWER(ap_endorsement.second_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ap_endorsement.last_name IS NOT NULL AND ap_endorsement.last_name != '' + THEN CONCAT(SUBSTR(UPPER(ap_endorsement.last_name), 1, 1),SUBSTR(LOWER(ap_endorsement.last_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ap_endorsement.middle_name IS NOT NULL AND ap_endorsement.middle_name != '' + THEN CONCAT(SUBSTR(UPPER(ap_endorsement.middle_name), 1, 1),SUBSTR(LOWER(ap_endorsement.middle_name), 2)) + ELSE '' + END +) AS endorsement_name, +CONCAT( + CASE + WHEN ahr.first_name IS NOT NULL AND ahr.first_name != '' + THEN CONCAT(SUBSTR(UPPER(ahr.first_name), 1, 1),SUBSTR(LOWER(ahr.first_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ahr.second_name IS NOT NULL AND ahr.second_name != '' + THEN CONCAT(SUBSTR(UPPER(ahr.second_name), 1, 1),SUBSTR(LOWER(ahr.second_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ahr.last_name IS NOT NULL AND ahr.last_name != '' + THEN CONCAT(SUBSTR(UPPER(ahr.last_name), 1, 1),SUBSTR(LOWER(ahr.last_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ahr.middle_name IS NOT NULL AND ahr.middle_name != '' + THEN CONCAT(SUBSTR(UPPER(ahr.middle_name), 1, 1),SUBSTR(LOWER(ahr.middle_name), 2)) + ELSE '' + END + ) AS user_name, + ald.loan_comments AS loan_comments, + ald.created_on AS created_on +FROM + APC_LOAN_DETAIL ald + INNER JOIN APC_LOAN al ON ald.id_loan = al.id + INNER JOIN APC_PEOPLE ap_customer ON al.id_customer = ap_customer.id + INNER JOIN APC_PEOPLE ap_endorsement ON al.id_endorsement = ap_endorsement.id + INNER JOIN APC_USER au ON ald.created_by = au.id + INNER JOIN APC_HUMAN_RESOURCE ahr ON au.id_human_resource = ahr.id +WHERE + ald.loan_details_type = 'TRANSFER' AND + ald.transfer_status = 'PENDING' +ORDER BY ald.created_on; +-- ---------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_LOAN_IN_PENDING_STATUS_TO_DELIVERY_VIEW` +-- +-- ---------------------------------------------------------------------- +CREATE OR REPLACE VIEW `APC_LOAN_IN_PENDING_STATUS_TO_DELIVERY_VIEW` AS +SELECT + al.id AS id_loan, + alt.payment AS payment, + ( +CASE + WHEN date_format(al.created_on,'%m') = '01' + THEN concat(date_format(al.created_on,'%d'),' - Enero - ',date_format(al.created_on,'%Y')) + WHEN date_format(al.created_on,'%m') = '02' + THEN concat(date_format(al.created_on,'%d'),' - Febrero - ',date_format(al.created_on,'%Y')) + WHEN date_format(al.created_on,'%m') = '03' + THEN concat(date_format(al.created_on,'%d'),' - Marzo - ',date_format(al.created_on,'%Y')) + WHEN date_format(al.created_on,'%m') = '04' + THEN concat(date_format(al.created_on,'%d'),' - Abril - ',date_format(al.created_on,'%Y')) + WHEN date_format(al.created_on,'%m') = '05' + THEN concat(date_format(al.created_on,'%d'),' - Mayo - ',date_format(al.created_on,'%Y')) + WHEN date_format(al.created_on,'%m') = '06' + THEN concat(date_format(al.created_on,'%d'),' - Junio - ',date_format(al.created_on,'%Y')) + WHEN date_format(al.created_on,'%m') = '07' + THEN concat(date_format(al.created_on,'%d'),' - Julio - ',date_format(al.created_on,'%Y')) + WHEN date_format(al.created_on,'%m') = '08' + THEN concat(date_format(al.created_on,'%d'),' - Agosto - ',date_format(al.created_on,'%Y')) + WHEN date_format(al.created_on,'%m') = '09' + THEN concat(date_format(al.created_on,'%d'),' - Septiembre - ',date_format(al.created_on,'%Y')) + WHEN date_format(al.created_on,'%m') = '10' + THEN concat(date_format(al.created_on,'%d'),' - Octubre - ',date_format(al.created_on,'%Y')) + WHEN date_format(al.created_on,'%m') = '11' + THEN concat(date_format(al.created_on,'%d'),' - Noviembre - ',date_format(al.created_on,'%Y')) + WHEN date_format(al.created_on,'%m') = '12' + THEN concat(date_format(al.created_on,'%d'),' - Diciembre - ',date_format(al.created_on,'%Y')) +END +) AS str_created_on, +CONCAT( + CASE + WHEN ap_customer.first_name IS NOT NULL AND ap_customer.first_name != '' + THEN CONCAT(SUBSTR(UPPER(ap_customer.first_name), 1, 1),SUBSTR(LOWER(ap_customer.first_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ap_customer.second_name IS NOT NULL AND ap_customer.second_name != '' + THEN CONCAT(SUBSTR(UPPER(ap_customer.second_name), 1, 1),SUBSTR(LOWER(ap_customer.second_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ap_customer.last_name IS NOT NULL AND ap_customer.last_name != '' + THEN CONCAT(SUBSTR(UPPER(ap_customer.last_name), 1, 1),SUBSTR(LOWER(ap_customer.last_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ap_customer.middle_name IS NOT NULL AND ap_customer.middle_name != '' + THEN CONCAT(SUBSTR(UPPER(ap_customer.middle_name), 1, 1),SUBSTR(LOWER(ap_customer.middle_name), 2)) + ELSE '' + END +) AS customer_name, +CONCAT( + CASE + WHEN ap_endorsement.first_name IS NOT NULL AND ap_endorsement.first_name != '' + THEN CONCAT(SUBSTR(UPPER(ap_endorsement.first_name), 1, 1),SUBSTR(LOWER(ap_endorsement.first_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ap_endorsement.second_name IS NOT NULL AND ap_endorsement.second_name != '' + THEN CONCAT(SUBSTR(UPPER(ap_endorsement.second_name), 1, 1),SUBSTR(LOWER(ap_endorsement.second_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ap_endorsement.last_name IS NOT NULL AND ap_endorsement.last_name != '' + THEN CONCAT(SUBSTR(UPPER(ap_endorsement.last_name), 1, 1),SUBSTR(LOWER(ap_endorsement.last_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ap_endorsement.middle_name IS NOT NULL AND ap_endorsement.middle_name != '' + THEN CONCAT(SUBSTR(UPPER(ap_endorsement.middle_name), 1, 1),SUBSTR(LOWER(ap_endorsement.middle_name), 2)) + ELSE '' + END +) AS endorsement_name, +CONCAT( + CASE + WHEN ahr.first_name IS NOT NULL AND ahr.first_name != '' + THEN CONCAT(SUBSTR(UPPER(ahr.first_name), 1, 1),SUBSTR(LOWER(ahr.first_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ahr.second_name IS NOT NULL AND ahr.second_name != '' + THEN CONCAT(SUBSTR(UPPER(ahr.second_name), 1, 1),SUBSTR(LOWER(ahr.second_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ahr.last_name IS NOT NULL AND ahr.last_name != '' + THEN CONCAT(SUBSTR(UPPER(ahr.last_name), 1, 1),SUBSTR(LOWER(ahr.last_name), 2), ' ') + ELSE '' + END, + CASE + WHEN ahr.middle_name IS NOT NULL AND ahr.middle_name != '' + THEN CONCAT(SUBSTR(UPPER(ahr.middle_name), 1, 1),SUBSTR(LOWER(ahr.middle_name), 2)) + ELSE '' + END + ) AS user_name, + al.created_on AS created_on +FROM + APC_LOAN al + INNER JOIN APC_LOAN_TYPE alt ON al.id_loan_type = alt.id + INNER JOIN APC_PEOPLE ap_customer ON al.id_customer = ap_customer.id + INNER JOIN APC_PEOPLE ap_endorsement ON al.id_endorsement = ap_endorsement.id + INNER JOIN APC_USER au ON al.created_by = au.id + INNER JOIN APC_HUMAN_RESOURCE ahr ON au.id_human_resource = ahr.id +WHERE al.loan_status = 'PENDING' +ORDER BY al.created_on ASC; +-- -------------------------------------------------------------------- +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/apc-db/src/create/from/scratch/mora/f1_isMobileEnabledUser.sql b/apc-db/src/create/from/scratch/mora/f1_isMobileEnabledUser.sql new file mode 100644 index 0000000..62fb424 --- /dev/null +++ b/apc-db/src/create/from/scratch/mora/f1_isMobileEnabledUser.sql @@ -0,0 +1,45 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +/** + * Author: Carlos Janitzio Zavala Lopez + * Created: 9 mar. 2022 + */ +DROP FUNCTION IF EXISTS `isMobileEnabledUser`; +-- -------------------------------------------------------- +-- +-- Estructura para la función `isMobileEnabledUser` +-- +-- Verifica que el usuario este activo y que no sea certificador +-- +DELIMITER // +CREATE FUNCTION `isMobileEnabledUser` ( + p_user_id VARCHAR(36) +) +RETURNS BOOL DETERMINISTIC +BEGIN + DECLARE v_is_mobile_enabled_user INT; + + SELECT + COUNT(u.id) INTO v_is_mobile_enabled_user + FROM APC_USER u + INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource + INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id + WHERE u.user_status = 'ENEBLED' AND + u.user_type IN ('MOBILE') AND + u.certifier = 'DISABLED' + AND u.id = CONVERT(p_user_id USING utf8mb4); + + IF v_is_mobile_enabled_user = 1 + THEN + RETURN TRUE; + ELSE + RETURN FALSE; + END IF; + +END; // +DELIMITER ; diff --git a/apc-db/src/janitzio.sql b/apc-db/src/janitzio.sql new file mode 100644 index 0000000..703cae9 --- /dev/null +++ b/apc-db/src/janitzio.sql @@ -0,0 +1,2 @@ +ALTER TABLE APC_DELIVERY +ADD COLUMN comission enum('INCLUDED','EXCLUDED') DEFAULT 'INCLUDED' AFTER amount; \ No newline at end of file diff --git a/apc-db/src/notes.txt b/apc-db/src/notes.txt new file mode 100644 index 0000000..80f752a --- /dev/null +++ b/apc-db/src/notes.txt @@ -0,0 +1,175 @@ +Path web +cd /Users/Picasso/Documents/workspace/arrebol/ApoyoProyectosComerciales/apc-web/ + +SASS command +sass --update src/main/webapp/resources:src/main/webapp/resources --no-source-map + +http://pdqcoders.com/font-based-icons.html +Font: Google Material Icons +-- prueba commit + +# +# Here, or in other properties files in this directory, you can define +# various properties that you want to make available to the template +# processor while creating various templates. +# Lo!Hx?w90$ +# D35aRr0Yad0R +# R1n0c3R0nT3= +# R1n0c3R0nT3= + +# uncomment the next line and specify your user name to be used in new templates +#user=Your Name (AlphaCJZL) +user=Carlos Janitzio Zavala Lopez + + + +<#if licenseFirst??> +${licenseFirst} + +${licensePrefix}Arrebol Consultancy copyright. +${licensePrefix} +${licensePrefix}This code belongs to Arrebol Consultancy +${licensePrefix}its use, redistribution or modification are prohibited +${licensePrefix}without written authorization from Arrebol Consultancy. +<#if licenseLast??> +${licenseLast} + + + +search/payment-details?user=83d2cd30-8e1d-11ea-b65e-4e1376171215&personSearch=67b3081e-8bc9-11ea-b45c-c7b846343364 + +Cambios para abono con transferencia bancaria. +alter table +web services y web deberan ser desplegados en prod. + + +-- EJECUTIVO 5751074e-7d1b-11ea-af3e-28f659da398e +-- recursos.humanos 564f976d-e869-11ea-b7e1-02907d0fb4e6 +-- gerencia 42e99ff0-e59c-11ea-b7e1-02907d0fb4e6 + + +INSERT INTO `APC_PERMISSION` +(`id`, `permission`, `description`, `menu_path`, `left_to_right_order`, `top_to_bottom_order` , + `permission_type`, `permission_status`,`created_by`, `parent_name`) +VALUES +('073fba18-2a8e-11eb-9de2-a30e5a9c0028','admin.loan.change.owner', 'admin.loan.change.owner.description', 'admin.loan.change.owner.path', 10, 110,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.loan'), +('50942348-2a8e-11eb-9de2-a30e5a9c0028','admin.loan.change.owner.update', 'admin.loan.change.owner.update.description', 'admin.loan.change.owner.update.path', 10, 111,'PRIVATE', 'ENEBLED', '0dc7c246-7db8-11ea-9b1f-500320958bf8','admin.loan'); + +INSERT INTO `APC_USER_BY_OFFICE_HAS_PERMISSION` +(`id_user_by_office`,`id_permission`,`created_by`,`created_on`) +VALUES +('bbb978f3-e59c-11ea-b7e1-02907d0fb4e6','073fba18-2a8e-11eb-9de2-a30e5a9c0028','42e99ff0-e59c-11ea-b7e1-02907d0fb4e6',NOW()), +('bbb978f3-e59c-11ea-b7e1-02907d0fb4e6','50942348-2a8e-11eb-9de2-a30e5a9c0028','42e99ff0-e59c-11ea-b7e1-02907d0fb4e6',NOW()), +('894b4e5c-e869-11ea-b7e1-02907d0fb4e6','073fba18-2a8e-11eb-9de2-a30e5a9c0028','42e99ff0-e59c-11ea-b7e1-02907d0fb4e6',NOW()), +('894b4e5c-e869-11ea-b7e1-02907d0fb4e6','50942348-2a8e-11eb-9de2-a30e5a9c0028','42e99ff0-e59c-11ea-b7e1-02907d0fb4e6',NOW()), +('a742dfe8-7d20-11ea-af3e-28f659da398e','073fba18-2a8e-11eb-9de2-a30e5a9c0028','42e99ff0-e59c-11ea-b7e1-02907d0fb4e6',NOW()), +('a742dfe8-7d20-11ea-af3e-28f659da398e','50942348-2a8e-11eb-9de2-a30e5a9c0028','42e99ff0-e59c-11ea-b7e1-02907d0fb4e6',NOW()),; +COMMIT; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_CURRENT_CUSTOMER_BY_LOAN_VIEW` +-- SIRVE PARA TRAER LOS PRESTAMOS CON SUS CLIENTES, AVALES Y ASESORES. +-- +-- -------------------------------------------------------------------- +CREATE OR REPLACE VIEW `APC_CURRENT_CUSTOMER_BY_LOAN_VIEW` AS +SELECT +loan.id AS id_loan, +usr.id AS id_user, +usr_by_office.id_office AS id_office, +loan_type.payment AS payment, +CONCAT( + CASE + WHEN customer.first_name IS NOT NULL AND customer.first_name != '' + THEN CONCAT(SUBSTR(UPPER(customer.first_name), 1, 1),SUBSTR(LOWER(customer.first_name), 2)) + ELSE '' + END, + CASE + WHEN customer.second_name IS NOT NULL AND customer.second_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(customer.second_name), 1, 1),SUBSTR(LOWER(customer.second_name), 2)) + ELSE '' + END, + CASE + WHEN customer.last_name IS NOT NULL AND customer.last_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(customer.last_name), 1, 1),SUBSTR(LOWER(customer.last_name), 2)) + ELSE '' + END, + CASE + WHEN customer.middle_name IS NOT NULL AND customer.middle_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(customer.middle_name), 1, 1),SUBSTR(LOWER(customer.middle_name), 2)) + ELSE '' + END + ) AS customer_name, + CONCAT( + CASE + WHEN endorsement.first_name IS NOT NULL AND endorsement.first_name != '' + THEN CONCAT(SUBSTR(UPPER(endorsement.first_name), 1, 1),SUBSTR(LOWER(endorsement.first_name), 2)) + ELSE '' + END, + CASE + WHEN endorsement.second_name IS NOT NULL AND endorsement.second_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(endorsement.second_name), 1, 1),SUBSTR(LOWER(endorsement.second_name), 2)) + ELSE '' + END, + CASE + WHEN endorsement.last_name IS NOT NULL AND endorsement.last_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(endorsement.last_name), 1, 1),SUBSTR(LOWER(endorsement.last_name), 2)) + ELSE '' + END, + CASE + WHEN endorsement.middle_name IS NOT NULL AND endorsement.middle_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(endorsement.middle_name), 1, 1),SUBSTR(LOWER(endorsement.middle_name), 2)) + ELSE '' + END + ) AS endorsement_name, + loan.loan_status AS loan_status, + loan.created_on AS created_on, + route.route_name AS route_name +FROM APC_LOAN loan +INNER JOIN APC_PEOPLE customer ON loan.id_customer = customer.id +INNER JOIN APC_PEOPLE endorsement ON loan.id_endorsement = endorsement.id +INNER JOIN APC_LOAN_TYPE loan_type ON loan.id_loan_type = loan_type.id +INNER JOIN APC_LOAN_BY_USER loan_by_user ON loan.id = loan_by_user.id_loan +INNER JOIN APC_USER usr ON loan_by_user.id_user = usr.id +INNER JOIN APC_USER_BY_OFFICE usr_by_office ON usr.id = usr_by_office.id_user +INNER JOIN APC_ROUTE route ON loan.id_route = route.id +WHERE loan.loan_status IN('APPROVED','PENDING','PENDING_RENOVATION','TO_DELIVERY') +ORDER BY usr.id, loan.created_on; +-- -------------------------------------------------------------------- +-- +-- Estructura para la vista `APC_AVAILABLES_OWNERS_VIEW` +-- REGRESA LOS USUARIOS ACTIVOS DE TIPO MOBILE AND BOTH. +-- +-- -------------------------------------------------------------------- +CREATE OR REPLACE VIEW `APC_AVAILABLES_OWNERS_VIEW` AS +SELECT +usr.id AS id_user, +usr_by_office.id_office AS id_office, +usr.user_name AS user_name, +CONCAT( + CASE + WHEN human_resource.first_name IS NOT NULL AND human_resource.first_name != '' + THEN CONCAT(SUBSTR(UPPER(human_resource.first_name), 1, 1),SUBSTR(LOWER(human_resource.first_name), 2)) + ELSE '' + END, + CASE + WHEN human_resource.second_name IS NOT NULL AND human_resource.second_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(human_resource.second_name), 1, 1),SUBSTR(LOWER(human_resource.second_name), 2)) + ELSE '' + END, + CASE + WHEN human_resource.last_name IS NOT NULL AND human_resource.last_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(human_resource.last_name), 1, 1),SUBSTR(LOWER(human_resource.last_name), 2)) + ELSE '' + END, + CASE + WHEN human_resource.middle_name IS NOT NULL AND human_resource.middle_name != '' + THEN CONCAT(' ',SUBSTR(UPPER(human_resource.middle_name), 1, 1),SUBSTR(LOWER(human_resource.middle_name), 2)) + ELSE '' + END + ) AS full_name +FROM APC_USER usr +INNER JOIN APC_HUMAN_RESOURCE human_resource ON usr.id_human_resource = human_resource.id +INNER JOIN APC_USER_BY_OFFICE usr_by_office ON usr.id = usr_by_office.id_user +WHERE usr.user_status = 'ENEBLED' AND +usr.user_type IN ('MOBILE','BOTH') AND +usr.certifier = 'DISABLED'; \ No newline at end of file diff --git a/apc-db/src/oscar.sql b/apc-db/src/oscar.sql new file mode 100644 index 0000000..cb1c81e --- /dev/null +++ b/apc-db/src/oscar.sql @@ -0,0 +1,493 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +/** + * Author: Oscar Armando Vargas Cardenas + * Created: 28/10/2020 + */ + +CREATE OR REPLACE VIEW `APC_CLOSING_DAILY_DETAIL_FROM_USER_BY_CURDATE_VIEW_REPORT` AS +SELECT + ld.id, + CONCAT(p.first_name,' ',IF(ISNULL(p.second_name) ,'', CONCAT(p.second_name, ' ')),p.last_name,' ', p.middle_name) AS comments, + ld.payment_amount as amount, + CASE + WHEN ld.loan_details_type = 'PAYMENT' THEN 'Abono' + WHEN ld.loan_details_type = 'FEE' THEN 'Multa' + WHEN ld.loan_details_type = 'TRANSFER' THEN 'Depósito' + ELSE '' END as type, + ld.id_user, + ld.created_on, + l.created_on as fechaFiltro, + 'xxxx' as route, + (l.amount_to_pay - amount_paid) as saldo, + 0 as comisionApertura, + 0 as prestamoAnterior +FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l ON ld.id_loan = l.id +INNER JOIN APC_PEOPLE p ON l.id_customer = p.id +WHERE DATE(ld.created_on) = CURDATE() +AND ld.loan_details_type in ('PAYMENT', 'FEE', 'TRANSFER' ) +UNION +SELECT + md.id, + DATE(md.money_daily_date) AS comments, + md.amount as amount, + 'Inicio' as type, + md.id_user, + md.created_on, + CURDATE() as fechaFiltro, + 'xxxx' as route, + 0 as saldo, + 0 as comisionApertura, + 0 as prestamoAnterior +FROM + APC_MONEY_DAILY md +WHERE DATE(md.money_daily_date) = CURDATE() +UNION +SELECT + oe.id, + oe.description, + oe.expense, + 'Gasto', + oe.id_user, + oe.created_on, + CURDATE() as fechaFiltro, + 'xxxx' as route, + 0 as saldo, + 0 as comisionApertura, + 0 as prestamoAnterior +FROM + APC_OTHER_EXPENSE oe +WHERE DATE(oe.created_on) = CURDATE() +UNION +SELECT + te.id, + CONCAT(hr.first_name,' ',IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name, ' ')),hr.last_name,' ', hr.middle_name), + te.amount_to_transfer, + 'Transferencia enviada', + te.id_user_transmitter, + te.created_on, + CURDATE() as fechaFiltro, + 'xxxx' as route, + 0 as saldo, + 0 as comisionApertura, + 0 as prestamoAnterior +FROM + APC_TRANSFER te +JOIN + APC_USER u on u.id = te.id_user_receiver +JOIN + APC_HUMAN_RESOURCE hr on hr.id = u.id_human_resource +WHERE DATE(te.created_on) = CURDATE() and te.action_status = 'APPROVED' +UNION +SELECT + tr.id, + CONCAT(hr.first_name,' ',IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name, ' ')),hr.last_name,' ', hr.middle_name), + tr.amount_to_transfer, + 'Transferencia recibida', + tr.id_user_receiver, + tr.created_on, + CURDATE() as fechaFiltro, + 'xxxx' as route, + 0 as saldo, + 0 as comisionApertura, + 0 as prestamoAnterior +FROM + APC_TRANSFER tr +JOIN + APC_USER u on u.id = tr.id_user_transmitter +JOIN + APC_HUMAN_RESOURCE hr on hr.id = u.id_human_resource +WHERE DATE(tr.created_on) = CURDATE() and tr.action_status = 'APPROVED' +UNION +SELECT + d.id, + CONCAT(p.first_name,' ',IF(ISNULL(p.second_name) ,'', CONCAT(p.second_name, ' ')),p.last_name,' ', p.middle_name), + d.amount, + 'Entrega de préstamo', + d.id_user, + d.created_on, + CURDATE() as fechaFiltro, + r.route_name as route, + CASE WHEN (SELECT (l2.amount_to_pay - l2.amount_paid) FROM APC_LOAN_BY_RENOVATION lr + INNER JOIN APC_LOAN l2 ON l2.id = lr.id_loan_old + WHERE lr.id_loan_new = l.id) is null THEN 0 ELSE + (SELECT (l2.amount_to_pay - l2.amount_paid) FROM APC_LOAN_BY_RENOVATION lr + INNER JOIN APC_LOAN l2 ON l2.id = lr.id_loan_old + WHERE lr.id_loan_new = l.id) END as saldo, + lt.opening_fee as comisionApertura, + (SELECT CASE WHEN ld.payment_amount is null or 0 THEN 0 ELSE ld.payment_amount END FROM APC_LOAN_DETAIL ld +INNER JOIN APC_LOAN l3 ON ld.id_loan = l3.id +WHERE ld.loan_details_type = 'RENOVATION_PAYMENT' +AND l3.id = (SELECT albr.id_loan_old FROM APC_LOAN_BY_RENOVATION albr WHERE albr.id_loan_new = l.id)) as prestamoAnterior +FROM APC_DELIVERY d +INNER JOIN APC_LOAN l ON d.id_loan = l.id +INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +INNER JOIN APC_PEOPLE p ON l.id_customer = p.id +INNER JOIN APC_ROUTE r ON r.id = l.id_route +WHERE DATE(d.created_on) = CURDATE(); + + +CREATE OR REPLACE VIEW `APC_RESUMEN_IN_OUT_WEEK_BY_USER_VIEW` AS +SELECT +u.id, +CONCAT(hr.first_name, ' ' , hr.last_name) as username, +ubo.id_office, +-- Lunes +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'monday') as closing_monday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'monday') as expense_monday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'monday') as money_daily_today_monday, +-- Martes +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'tuesday') as closing_tuesday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'tuesday') as expense_tuesday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'tuesday') as money_daily_today_tuesday, +-- Miercoles +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'wednesday') as closing_wednesday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'wednesday') as expense_wednesday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'wednesday') as money_daily_today_wednesday, +-- Jueves +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'thursday') as closing_thursday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'thursday') as expense_thursday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'thursday') as money_daily_today_thursday, +-- Viernes +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'friday') as closing_friday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'friday') as expense_friday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'friday') as money_daily_today_friday, +-- Sabado +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'saturday') as closing_saturday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'saturday') as expense_saturday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'saturday') as money_daily_today_saturday +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE','BOTH'); + +CREATE OR REPLACE VIEW `APC_RESUMEN_IN_OUT_LAST_WEEK_BY_USER_VIEW` AS +SELECT +u.id, +CONCAT(hr.first_name, ' ' , hr.last_name) as username, +ubo.id_office, +-- Lunes +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'monday') as closing_monday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'monday') as expense_monday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'monday') as money_daily_today_monday, +-- Martes +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'tuesday') as closing_tuesday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'tuesday') as expense_tuesday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'tuesday') as money_daily_today_tuesday, +-- Miercoles +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'wednesday') as closing_wednesday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'wednesday') as expense_wednesday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'wednesday') as money_daily_today_wednesday, +-- Jueves +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'thursday') as closing_thursday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'thursday') as expense_thursday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'thursday') as money_daily_today_thursday, +-- Viernes +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'friday') as closing_friday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'friday') as expense_friday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'friday') as money_daily_today_friday, +-- Sabado +(SELECT IF(ISNULL(SUM(ld.amount_paid)),0,SUM(ld.amount_paid)) +FROM APC_CLOSING_DAY ld +WHERE ld.id_user = u.id AND WEEK(DATE(ld.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.active_status = 'ENEBLED' +AND LOWER(DAYNAME(DATE(ld.created_on))) = 'saturday') as closing_saturday, +(SELECT IF(ISNULL(SUM(oe.expense)),0,SUM(oe.expense)) +FROM APC_OTHER_EXPENSE oe +WHERE oe.id_user = u.id AND WEEK(DATE(oe.created_on),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(oe.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(oe.created_on))) = 'saturday') as expense_saturday, +(SELECT IF(ISNULL(SUM(md.amount)),0,SUM(md.amount)) +FROM APC_MONEY_DAILY md +WHERE md.id_user = u.id AND WEEK(DATE(md.money_daily_date),1) = (WEEK(CURDATE(),1) - 1) AND +YEAR(DATE(md.money_daily_date)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(md.money_daily_date))) = 'saturday') as money_daily_today_saturday +FROM APC_USER u +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +INNER JOIN APC_USER_BY_OFFICE ubo ON ubo.id_user = u.id +WHERE u.user_status = 'ENEBLED' AND +u.user_type IN ('MOBILE','BOTH'); + + +CREATE OR REPLACE VIEW `APC_INFORMATION_LOAN_WEEK_VIEW` AS +SELECT +l.id, +u.id as id_user, +r.id_office, +l.created_on as fecha, +lt.payment as apoyos, +lt.payment_total as apoyos_total, +lt.opening_fee as comision_apertura, +CONCAT(endor.first_name,' ', IF(ISNULL(endor.second_name) ,'', CONCAT(endor.second_name,' ')) ,endor.last_name, ' ', endor.middle_name) AS aval, +CONCAT(cus.first_name,' ', IF(ISNULL(cus.second_name) ,'', CONCAT(cus.second_name,' ')) ,cus.last_name, ' ', cus.middle_name) AS customer, +l.amount_to_pay as documento_por, +lt.payment_daily as abono_diario, +l.amount_paid, +(l.amount_to_pay - l.amount_paid) saldo_insoluto, +r.route_name, +CONCAT(hr.first_name,' ', IF(ISNULL(hr.second_name) ,'', CONCAT(hr.second_name,' ')) ,hr.last_name, ' ', hr.middle_name) AS asesor, +(SELECT COUNT(lfn.id) FROM APC_LOAN_FEE_NOTIFICATION lfn WHERE lfn.id_loan = l.id) as num_fee, +-- Lunes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'monday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_monday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'monday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_monday, +-- Martes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'tuesday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_tuesday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'tuesday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_tuesday, +-- Miercoles +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) +AND YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'wednesday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_wednesday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'wednesday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_wednesday, +-- Jueves +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'thursday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_thursday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'thursday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_thursday, +-- Viernes +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'friday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_friday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'friday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_friday, +-- Sabado +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'saturday' +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')) as payment_saturday, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND LOWER(DAYNAME(DATE(ldLunes.created_on))) = 'saturday' +AND ldLunes.loan_details_type IN ('FEE')) as fee_saturday, + +((lt.payment_daily * (SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) > 5, 5 , COUNT(DISTINCT(DATE(ldFaltante.created_on)))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE'))) +- (SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) = WEEK(CURDATE(),1) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))) as faltante, + +CASE WHEN l.new_customer = 'ENEBLED' AND WEEK(DATE(l.created_on),1) = WEEK(CURDATE(),1) THEN 'Si' ELSE 'No' END as new_customer, +if((SELECT COUNT(id_loan_old) FROM APC_LOAN_BY_RENOVATION lbr +INNER JOIN APC_LOAN lRenovation ON lbr.id_loan_new = lRenovation.id +WHERE id_loan_old = l.id + AND loan_by_renovation_status = 'APPROVED' and WEEK(DATE(lRenovation.created_on),1) <= WEEK(CURDATE(),1) AND + YEAR(DATE(lRenovation.created_on)) = YEAR(CURDATE())) = 0 , 'No' , 'Si') as renovation, +l.loan_status as estatus_prestamo, +(SELECT COUNT(DISTINCT(DATE(ldFaltante.created_on))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) <= (WEEK(CURDATE(),1)) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE')) as num_pagos_all, +(SELECT IF(COUNT(DISTINCT(DATE(ldFaltante.created_on))) > 5, 5, COUNT(DISTINCT(DATE(ldFaltante.created_on)))) FROM APC_LOAN_DETAIL ldFaltante +WHERE ldFaltante.id_loan = l.id AND WEEK(DATE(ldFaltante.created_on),1) = (WEEK(CURDATE(),1)) AND +YEAR(DATE(ldFaltante.created_on)) = YEAR(CURDATE()) and LOWER(DAYNAME(DATE(ldFaltante.created_on))) NOT IN('saturday','sunday') +AND ldFaltante.loan_details_type IN ('PAYMENT','RENOVATION_PAYMENT','TRANSFER', 'FEE')) as num_pagos_week, +(SELECT IF(ISNULL(SUM(ldLunes.payment_amount)),0,SUM(ldLunes.payment_amount)) +FROM APC_LOAN_DETAIL ldLunes +WHERE ldLunes.id_loan = l.id AND WEEK(DATE(ldLunes.created_on),1) <= (WEEK(CURDATE(),1)) AND +YEAR(DATE(ldLunes.created_on)) = YEAR(CURDATE()) +AND ldLunes.loan_details_type IN ('FEE')) as fee_todos +FROM +APC_LOAN l +INNER JOIN APC_LOAN_TYPE lt ON l.id_loan_type = lt.id +INNER JOIN APC_PEOPLE cus ON cus.id = l.id_customer +INNER JOIN APC_PEOPLE endor ON endor.id = l.id_endorsement +INNER JOIN APC_ROUTE r ON r.id = l.id_route +INNER JOIN APC_LOAN_BY_USER lbu ON lbu.id_loan = l.id +INNER JOIN APC_USER u ON u.id = lbu.id_user +INNER JOIN APC_HUMAN_RESOURCE hr ON hr.id = u.id_human_resource +WHERE +l.loan_status not in ('DELETED','REJECTED') AND +((SELECT COUNT(ld.id) FROM APC_LOAN_DETAIL ld WHERE WEEK(DATE(ld.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.id_loan = l.id) > 0 OR + ((SELECT COUNT(ld.id) FROM APC_LOAN_DETAIL ld WHERE WEEK(DATE(ld.created_on),1) = WEEK(CURDATE(),1) AND + YEAR(DATE(ld.created_on)) = YEAR(CURDATE()) AND ld.id_loan = l.id) = 0 AND l.loan_status = 'APPROVED' AND + WEEK(DATE(l.created_on),1) <= (WEEK(CURDATE(),1)))); \ No newline at end of file diff --git a/apc-db/src/respaldo_xxxxxxxx.sql b/apc-db/src/respaldo_xxxxxxxx.sql new file mode 100644 index 0000000..e5ea235 --- /dev/null +++ b/apc-db/src/respaldo_xxxxxxxx.sql @@ -0,0 +1,3 @@ +CREATE OR REPLACE VIEW `APC_INFORMATION_LOAN_WEEK_VIEW` AS +select `l`.`id` AS `id`,`u`.`id` AS `id_user`,`r`.`id_office` AS `id_office`,`l`.`created_on` AS `fecha`,`lt`.`payment` AS `apoyos`,`lt`.`payment_total` AS `apoyos_total`,`lt`.`opening_fee` AS `comision_apertura`,concat(`endor`.`first_name`,' ',if((`endor`.`second_name` is null),'',concat(`endor`.`second_name`,' ')),`endor`.`last_name`,' ',`endor`.`middle_name`) AS `aval`,concat(`cus`.`first_name`,' ',if((`cus`.`second_name` is null),'',concat(`cus`.`second_name`,' ')),`cus`.`last_name`,' ',`cus`.`middle_name`) AS `customer`,`l`.`amount_to_pay` AS `documento_por`,`lt`.`payment_daily` AS `abono_diario`,`l`.`amount_paid` AS `amount_paid`,(`l`.`amount_to_pay` - `l`.`amount_paid`) AS `saldo_insoluto`,`r`.`route_name` AS `route_name`,concat(`hr`.`first_name`,' ',if((`hr`.`second_name` is null),'',concat(`hr`.`second_name`,' ')),`hr`.`last_name`,' ',`hr`.`middle_name`) AS `asesor`,(select count(`lfn`.`id`) from `APC_LOAN_FEE_NOTIFICATION` `lfn` where (`lfn`.`id_loan` = `l`.`id`)) AS `num_fee`,(select if((sum(`ldLunes`.`payment_amount`) is null),0,sum(`ldLunes`.`payment_amount`)) from `APC_LOAN_DETAIL` `ldLunes` where ((`ldLunes`.`id_loan` = `l`.`id`) and (week(cast(`ldLunes`.`created_on` as date),1) = week(curdate(),1)) and (year(cast(`ldLunes`.`created_on` as date)) = year(curdate())) and (lower(dayname(cast(`ldLunes`.`created_on` as date))) = 'monday') and (`ldLunes`.`loan_details_type` in ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')))) AS `payment_monday`,(select if((sum(`ldLunes`.`payment_amount`) is null),0,sum(`ldLunes`.`payment_amount`)) from `APC_LOAN_DETAIL` `ldLunes` where ((`ldLunes`.`id_loan` = `l`.`id`) and (week(cast(`ldLunes`.`created_on` as date),1) = week(curdate(),1)) and (year(cast(`ldLunes`.`created_on` as date)) = year(curdate())) and (lower(dayname(cast(`ldLunes`.`created_on` as date))) = 'monday') and (`ldLunes`.`loan_details_type` = 'FEE'))) AS `fee_monday`,(select if((sum(`ldLunes`.`payment_amount`) is null),0,sum(`ldLunes`.`payment_amount`)) from `APC_LOAN_DETAIL` `ldLunes` where ((`ldLunes`.`id_loan` = `l`.`id`) and (week(cast(`ldLunes`.`created_on` as date),1) = week(curdate(),1)) and (year(cast(`ldLunes`.`created_on` as date)) = year(curdate())) and (lower(dayname(cast(`ldLunes`.`created_on` as date))) = 'tuesday') and (`ldLunes`.`loan_details_type` in ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')))) AS `payment_tuesday`,(select if((sum(`ldLunes`.`payment_amount`) is null),0,sum(`ldLunes`.`payment_amount`)) from `APC_LOAN_DETAIL` `ldLunes` where ((`ldLunes`.`id_loan` = `l`.`id`) and (week(cast(`ldLunes`.`created_on` as date),1) = week(curdate(),1)) and (year(cast(`ldLunes`.`created_on` as date)) = year(curdate())) and (lower(dayname(cast(`ldLunes`.`created_on` as date))) = 'tuesday') and (`ldLunes`.`loan_details_type` = 'FEE'))) AS `fee_tuesday`,(select if((sum(`ldLunes`.`payment_amount`) is null),0,sum(`ldLunes`.`payment_amount`)) from `APC_LOAN_DETAIL` `ldLunes` where ((`ldLunes`.`id_loan` = `l`.`id`) and (week(cast(`ldLunes`.`created_on` as date),1) = week(curdate(),1)) and (year(cast(`ldLunes`.`created_on` as date)) = year(curdate())) and (lower(dayname(cast(`ldLunes`.`created_on` as date))) = 'wednesday') and (`ldLunes`.`loan_details_type` in ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')))) AS `payment_wednesday`,(select if((sum(`ldLunes`.`payment_amount`) is null),0,sum(`ldLunes`.`payment_amount`)) from `APC_LOAN_DETAIL` `ldLunes` where ((`ldLunes`.`id_loan` = `l`.`id`) and (week(cast(`ldLunes`.`created_on` as date),1) = week(curdate(),1)) and (year(cast(`ldLunes`.`created_on` as date)) = year(curdate())) and (lower(dayname(cast(`ldLunes`.`created_on` as date))) = 'wednesday') and (`ldLunes`.`loan_details_type` = 'FEE'))) AS `fee_wednesday`,(select if((sum(`ldLunes`.`payment_amount`) is null),0,sum(`ldLunes`.`payment_amount`)) from `APC_LOAN_DETAIL` `ldLunes` where ((`ldLunes`.`id_loan` = `l`.`id`) and (week(cast(`ldLunes`.`created_on` as date),1) = week(curdate(),1)) and (year(cast(`ldLunes`.`created_on` as date)) = year(curdate())) and (lower(dayname(cast(`ldLunes`.`created_on` as date))) = 'thursday') and (`ldLunes`.`loan_details_type` in ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')))) AS `payment_thursday`,(select if((sum(`ldLunes`.`payment_amount`) is null),0,sum(`ldLunes`.`payment_amount`)) from `APC_LOAN_DETAIL` `ldLunes` where ((`ldLunes`.`id_loan` = `l`.`id`) and (week(cast(`ldLunes`.`created_on` as date),1) = week(curdate(),1)) and (year(cast(`ldLunes`.`created_on` as date)) = year(curdate())) and (lower(dayname(cast(`ldLunes`.`created_on` as date))) = 'thursday') and (`ldLunes`.`loan_details_type` = 'FEE'))) AS `fee_thursday`,(select if((sum(`ldLunes`.`payment_amount`) is null),0,sum(`ldLunes`.`payment_amount`)) from `APC_LOAN_DETAIL` `ldLunes` where ((`ldLunes`.`id_loan` = `l`.`id`) and (week(cast(`ldLunes`.`created_on` as date),1) = week(curdate(),1)) and (year(cast(`ldLunes`.`created_on` as date)) = year(curdate())) and (lower(dayname(cast(`ldLunes`.`created_on` as date))) = 'friday') and (`ldLunes`.`loan_details_type` in ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')))) AS `payment_friday`,(select if((sum(`ldLunes`.`payment_amount`) is null),0,sum(`ldLunes`.`payment_amount`)) from `APC_LOAN_DETAIL` `ldLunes` where ((`ldLunes`.`id_loan` = `l`.`id`) and (week(cast(`ldLunes`.`created_on` as date),1) = week(curdate(),1)) and (year(cast(`ldLunes`.`created_on` as date)) = year(curdate())) and (lower(dayname(cast(`ldLunes`.`created_on` as date))) = 'friday') and (`ldLunes`.`loan_details_type` = 'FEE'))) AS `fee_friday`,(select if((sum(`ldLunes`.`payment_amount`) is null),0,sum(`ldLunes`.`payment_amount`)) from `APC_LOAN_DETAIL` `ldLunes` where ((`ldLunes`.`id_loan` = `l`.`id`) and (week(cast(`ldLunes`.`created_on` as date),1) = week(curdate(),1)) and (year(cast(`ldLunes`.`created_on` as date)) = year(curdate())) and (lower(dayname(cast(`ldLunes`.`created_on` as date))) = 'saturday') and (`ldLunes`.`loan_details_type` in ('PAYMENT','RENOVATION_PAYMENT','TRANSFER')))) AS `payment_saturday`,(select if((sum(`ldLunes`.`payment_amount`) is null),0,sum(`ldLunes`.`payment_amount`)) from `APC_LOAN_DETAIL` `ldLunes` where ((`ldLunes`.`id_loan` = `l`.`id`) and (week(cast(`ldLunes`.`created_on` as date),1) = week(curdate(),1)) and (year(cast(`ldLunes`.`created_on` as date)) = year(curdate())) and (lower(dayname(cast(`ldLunes`.`created_on` as date))) = 'saturday') and (`ldLunes`.`loan_details_type` = 'FEE'))) AS `fee_saturday`,((`lt`.`payment_daily` * (select if((count(distinct cast(`ldFaltante`.`created_on` as date)) > 5),5,count(distinct cast(`ldFaltante`.`created_on` as date))) from `APC_LOAN_DETAIL` `ldFaltante` where ((`ldFaltante`.`id_loan` = `l`.`id`) and (week(cast(`ldFaltante`.`created_on` as date),1) = week(curdate(),1)) and (year(cast(`ldFaltante`.`created_on` as date)) = year(curdate())) and (lower(dayname(cast(`ldFaltante`.`created_on` as date))) not in ('saturday','sunday')) and (`ldFaltante`.`loan_details_type` in ('PAYMENT','RENOVATION_PAYMENT','TRANSFER','FEE'))))) - (select if((sum(`ldLunes`.`payment_amount`) is null),0,sum(`ldLunes`.`payment_amount`)) from `APC_LOAN_DETAIL` `ldLunes` where ((`ldLunes`.`id_loan` = `l`.`id`) and (week(cast(`ldLunes`.`created_on` as date),1) = week(curdate(),1)) and (year(cast(`ldLunes`.`created_on` as date)) = year(curdate())) and (`ldLunes`.`loan_details_type` in ('PAYMENT','RENOVATION_PAYMENT','TRANSFER'))))) AS `faltante`,(case when ((`l`.`new_customer` = 'ENEBLED') and (week(cast(`l`.`created_on` as date),1) = week(curdate(),1))) then 'Si' else 'No' end) AS `new_customer`,if(((select count(`lbr`.`id_loan_old`) from (`APC_LOAN_BY_RENOVATION` `lbr` join `APC_LOAN` `lRenovation` on((`lbr`.`id_loan_new` = `lRenovation`.`id`))) where ((`lbr`.`id_loan_old` = `l`.`id`) and (`lbr`.`loan_by_renovation_status` = 'APPROVED') and (week(cast(`lRenovation`.`created_on` as date),1) <= week(curdate(),1)) and (year(cast(`lRenovation`.`created_on` as date)) = year(curdate())))) = 0),'No','Si') AS `renovation`,`l`.`loan_status` AS `estatus_prestamo`,(select count(distinct cast(`ldFaltante`.`created_on` as date)) from `APC_LOAN_DETAIL` `ldFaltante` where ((`ldFaltante`.`id_loan` = `l`.`id`) and (week(cast(`ldFaltante`.`created_on` as date),1) <= week(curdate(),1)) and (year(cast(`ldFaltante`.`created_on` as date)) = year(curdate())) and (lower(dayname(cast(`ldFaltante`.`created_on` as date))) not in ('saturday','sunday')) and (`ldFaltante`.`loan_details_type` in ('PAYMENT','RENOVATION_PAYMENT','TRANSFER','FEE')))) AS `num_pagos_all`,(select if((count(distinct cast(`ldFaltante`.`created_on` as date)) > 5),5,count(distinct cast(`ldFaltante`.`created_on` as date))) from `APC_LOAN_DETAIL` `ldFaltante` where ((`ldFaltante`.`id_loan` = `l`.`id`) and (week(cast(`ldFaltante`.`created_on` as date),1) = week(curdate(),1)) and (year(cast(`ldFaltante`.`created_on` as date)) = year(curdate())) and (lower(dayname(cast(`ldFaltante`.`created_on` as date))) not in ('saturday','sunday')) and (`ldFaltante`.`loan_details_type` in ('PAYMENT','RENOVATION_PAYMENT','TRANSFER','FEE')))) AS `num_pagos_week`,(select if((sum(`ldLunes`.`payment_amount`) is null),0,sum(`ldLunes`.`payment_amount`)) from `APC_LOAN_DETAIL` `ldLunes` where ((`ldLunes`.`id_loan` = `l`.`id`) and (week(cast(`ldLunes`.`created_on` as date),1) <= week(curdate(),1)) and (year(cast(`ldLunes`.`created_on` as date)) = year(curdate())) and (`ldLunes`.`loan_details_type` = 'FEE'))) AS `fee_todos` from (((((((`APC_LOAN` `l` join `APC_LOAN_TYPE` `lt` on((`l`.`id_loan_type` = `lt`.`id`))) join `APC_PEOPLE` `cus` on((`cus`.`id` = `l`.`id_customer`))) join `APC_PEOPLE` `endor` on((`endor`.`id` = `l`.`id_endorsement`))) join `APC_ROUTE` `r` on((`r`.`id` = `l`.`id_route`))) join `APC_LOAN_BY_USER` `lbu` on((`lbu`.`id_loan` = `l`.`id`))) join `APC_USER` `u` on((`u`.`id` = `lbu`.`id_user`))) join `APC_HUMAN_RESOURCE` `hr` on((`hr`.`id` = `u`.`id_human_resource`))) where ((`l`.`loan_status` not in ('DELETED','REJECTED')) and (((select count(`ld`.`id`) from `APC_LOAN_DETAIL` `ld` where ((week(cast(`ld`.`created_on` as date),1) = week(curdate(),1)) and (year(cast(`ld`.`created_on` as date)) = year(curdate())) and (`ld`.`id_loan` = `l`.`id`))) > 0) or (((select count(`ld`.`id`) from `APC_LOAN_DETAIL` `ld` where ((week(cast(`ld`.`created_on` as date),1) = week(curdate(),1)) and (year(cast(`ld`.`created_on` as date)) = year(curdate())) and (`ld`.`id_loan` = `l`.`id`))) = 0) and (`l`.`loan_status` = 'APPROVED') and (week(cast(`l`.`created_on` as date),1) <= week(curdate(),1))))); + diff --git a/apc-db/src/to_execute.sql b/apc-db/src/to_execute.sql new file mode 100644 index 0000000..0888b11 --- /dev/null +++ b/apc-db/src/to_execute.sql @@ -0,0 +1,11 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +/** + * Author: Oscar Armando Vargas Cardenas + * Created: 1/03/2021 + */ \ No newline at end of file diff --git a/apc-db/src/to_update.sql b/apc-db/src/to_update.sql new file mode 100644 index 0000000..a463898 --- /dev/null +++ b/apc-db/src/to_update.sql @@ -0,0 +1,44 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +/** + * Author: Oscar + * Created: 26/10/2021 + */ + +ALTER TABLE `apo_pro_com_april_ten`.`apc_loan_employee` +ADD COLUMN `payroll` ENUM('ENEBLED', 'DISABLED') NOT NULL AFTER `total_amount_to_pay`, +ADD COLUMN `active_status` ENUM('ENEBLED', 'DISABLED') NULL AFTER `payroll`; + + +/*Updates de donadony*/ +ALTER TABLE `apo_pro_com_april_ten`.`apc_loan_employee_detail` +ADD COLUMN `payroll` ENUM('ENEBLED', 'DISABLED') NOT NULL DEFAULT 'ENEBLED' AFTER `created_on`; + + +/*Update Base de datos saving view*/ +CREATE + OR REPLACE +VIEW `APC_STATS_EMPLOYEE_SAVING_VIEW` AS + SELECT + `es`.`id` AS `id`, + `es`.`id_user` AS `id_user`, + CONCAT(`hr`.`first_name`, ' ', `hr`.`last_name`) AS `name`, + `hrr`.`route_name` AS `route_name`, + `es`.`employee_saving` AS `employee_saving`, + `es`.`created_on` AS `created_on`, + `es`.`Type` AS `Type` + FROM + ((`APC_EMPLOYEE_SAVING` `es` + JOIN `APC_HUMAN_RESOURCE` `hr` ON ((`es`.`id_user` = `hr`.`id`))) + LEFT JOIN (SELECT + `hrr`.`id_human_resource` AS `id_human_resource`, + GROUP_CONCAT(DISTINCT `r`.`route_name` + SEPARATOR ',') AS `route_name` + FROM + (`APC_HUMAN_RESOURCE_HAS_ROUTE` `hrr` + LEFT JOIN `APC_ROUTE` `r` ON ((`hrr`.`id_route` = `r`.`id`))) + GROUP BY `hrr`.`id_human_resource`) `hrr` ON ((`hr`.`id` = `hrr`.`id_human_resource`))) + diff --git a/apc-layout/nb-configuration.xml b/apc-layout/nb-configuration.xml new file mode 100644 index 0000000..a65c451 --- /dev/null +++ b/apc-layout/nb-configuration.xml @@ -0,0 +1,18 @@ + + + + + + JDK_1.8 + + diff --git a/apc-layout/pom.xml b/apc-layout/pom.xml new file mode 100644 index 0000000..4c68c93 --- /dev/null +++ b/apc-layout/pom.xml @@ -0,0 +1,124 @@ + + + 4.0.0 + com.arrebol + apc-layout + 1.0.0 + jar + + UTF-8 + 1.8 + 1.8 + 2.0.20 + 2.3.14 + 1.3.24 + 5.0.0 + + + + org.primefaces + primefaces + 6.2 + + + + org.glassfish + jakarta.faces + ${mojarra.version} + + + javax.el + javax.el-api + 3.0.0 + provided + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + + + org.apache.geronimo.specs + geronimo-atinject_1.0_spec + 1.0 + + + org.apache.geronimo.specs + geronimo-jcdi_2.0_spec + 1.1 + + + org.apache.geronimo.specs + geronimo-interceptor_1.2_spec + 1.0 + + + org.apache.geronimo.specs + geronimo-annotation_1.3_spec + 1.0 + + + + + org.apache.openwebbeans + openwebbeans-impl + ${owb.version} + + + org.apache.openwebbeans + openwebbeans-web + ${owb.version} + + + org.apache.openwebbeans + openwebbeans-jsf + ${owb.version} + + + + + org.apache.poi + poi + ${poi.version} + + + org.apache.poi + poi-ooxml + ${poi.version} + + + org.apache.xmlgraphics + batik-all + + + de.rototor.pdfbox + graphics2d + + + org.apache.santuario + xmlsec + + + org.bouncycastle + bcpkix-jdk15on + + + com.github.virtuald + curvesapi + + + org.bouncycastle + bcprov-jdk15on + + + + + com.github.librepdf + openpdf + ${open-pdf.version} + + + \ No newline at end of file diff --git a/apc-layout/src/main/java/org/primefaces/serenity/component/SerenityMenu.java b/apc-layout/src/main/java/org/primefaces/serenity/component/SerenityMenu.java new file mode 100644 index 0000000..8b8f2b3 --- /dev/null +++ b/apc-layout/src/main/java/org/primefaces/serenity/component/SerenityMenu.java @@ -0,0 +1,130 @@ +package org.primefaces.serenity.component; + +import javax.faces.component.UIComponent; +import org.primefaces.component.menu.AbstractMenu; +import javax.faces.context.FacesContext; +import javax.faces.component.UINamingContainer; +import javax.faces.component.UIOutput; +import javax.faces.component.UIViewRoot; +import javax.faces.event.AbortProcessingException; +import javax.faces.event.ComponentSystemEvent; +import javax.faces.event.ComponentSystemEventListener; +import javax.faces.event.ListenerFor; +import javax.faces.event.PostAddToViewEvent; +import org.primefaces.component.api.Widget; + +@ListenerFor(sourceClass = SerenityMenu.class, systemEventClass = PostAddToViewEvent.class) +public class SerenityMenu extends AbstractMenu implements Widget,ComponentSystemEventListener { + + public static final String COMPONENT_TYPE = "org.primefaces.component.SerenityMenu"; + public static final String COMPONENT_FAMILY = "org.primefaces.component"; + private static final String DEFAULT_RENDERER = "org.primefaces.component.SerenityMenuRenderer"; + private static final String[] LEGACY_RESOURCES = new String[]{"primefaces.css","jquery/jquery.js","jquery/jquery-plugins.js","primefaces.js"}; + private static final String[] MODERN_RESOURCES = new String[]{"components.css","jquery/jquery.js","jquery/jquery-plugins.js","core.js"}; + + protected enum PropertyKeys { + + widgetVar, model, style, styleClass, closeDelay; + + String toString; + + PropertyKeys(String toString) { + this.toString = toString; + } + + PropertyKeys() { + } + + public String toString() { + return ((this.toString != null) ? this.toString : super.toString()); + } + } + + public SerenityMenu() { + setRendererType(DEFAULT_RENDERER); + } + + public String getFamily() { + return COMPONENT_FAMILY; + } + + public java.lang.String getWidgetVar() { + return (java.lang.String) getStateHelper().eval(PropertyKeys.widgetVar, null); + } + + public void setWidgetVar(java.lang.String _widgetVar) { + getStateHelper().put(PropertyKeys.widgetVar, _widgetVar); + } + + public org.primefaces.model.menu.MenuModel getModel() { + return (org.primefaces.model.menu.MenuModel) getStateHelper().eval(PropertyKeys.model, null); + } + + public void setModel(org.primefaces.model.menu.MenuModel _model) { + getStateHelper().put(PropertyKeys.model, _model); + } + + public java.lang.String getStyle() { + return (java.lang.String) getStateHelper().eval(PropertyKeys.style, null); + } + + public void setStyle(java.lang.String _style) { + getStateHelper().put(PropertyKeys.style, _style); + } + + public java.lang.String getStyleClass() { + return (java.lang.String) getStateHelper().eval(PropertyKeys.styleClass, null); + } + + public void setStyleClass(java.lang.String _styleClass) { + getStateHelper().put(PropertyKeys.styleClass, _styleClass); + } + + public int getCloseDelay() { + return (java.lang.Integer) getStateHelper().eval(PropertyKeys.closeDelay, 250); + } + public void setCloseDelay(int _closeDelay) { + getStateHelper().put(PropertyKeys.closeDelay, _closeDelay); + } + + public String resolveWidgetVar() { + FacesContext context = getFacesContext(); + String userWidgetVar = (String) getAttributes().get("widgetVar"); + + if (userWidgetVar != null) { + return userWidgetVar; + } else { + return "widget_" + getClientId(context).replaceAll("-|" + UINamingContainer.getSeparatorChar(context), "_"); + } + } + + @Override + public void processEvent(ComponentSystemEvent event) throws AbortProcessingException { + if(event instanceof PostAddToViewEvent) { + FacesContext context = getFacesContext(); + UIViewRoot root = context.getViewRoot(); + + boolean isPrimeConfig; + try { + isPrimeConfig = Class.forName("org.primefaces.config.PrimeConfiguration") != null; + } catch (ClassNotFoundException e) { + isPrimeConfig = false; + } + + String[] resources = (isPrimeConfig) ? MODERN_RESOURCES : LEGACY_RESOURCES; + + for(String res : resources) { + UIComponent component = context.getApplication().createComponent(UIOutput.COMPONENT_TYPE); + if(res.endsWith("css")) + component.setRendererType("javax.faces.resource.Stylesheet"); + else if(res.endsWith("js")) + component.setRendererType("javax.faces.resource.Script"); + + component.getAttributes().put("library", "primefaces"); + component.getAttributes().put("name", res); + + root.addComponentResource(context, component); + } + } + } +} diff --git a/apc-layout/src/main/java/org/primefaces/serenity/component/SerenityMenuRenderer.java b/apc-layout/src/main/java/org/primefaces/serenity/component/SerenityMenuRenderer.java new file mode 100644 index 0000000..50fa595 --- /dev/null +++ b/apc-layout/src/main/java/org/primefaces/serenity/component/SerenityMenuRenderer.java @@ -0,0 +1,295 @@ +package org.primefaces.serenity.component; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import javax.faces.FacesException; +import javax.faces.component.UIComponent; +import javax.faces.context.FacesContext; +import javax.faces.context.ResponseWriter; +import org.primefaces.component.api.AjaxSource; +import org.primefaces.component.api.UIOutcomeTarget; +import org.primefaces.component.menu.AbstractMenu; +import org.primefaces.component.menu.BaseMenuRenderer; +import org.primefaces.component.menuitem.UIMenuItem; +import org.primefaces.component.submenu.UISubmenu; +import org.primefaces.model.menu.MenuElement; +import org.primefaces.model.menu.MenuItem; +import org.primefaces.model.menu.Separator; +import org.primefaces.model.menu.Submenu; +import org.primefaces.util.ComponentUtils; +import org.primefaces.util.WidgetBuilder; + +public class SerenityMenuRenderer extends BaseMenuRenderer { + + @Override + protected void encodeMarkup(FacesContext context, AbstractMenu abstractMenu) throws IOException { + SerenityMenu menu = (SerenityMenu) abstractMenu; + ResponseWriter writer = context.getResponseWriter(); + String style = menu.getStyle(); + String styleClass = menu.getStyleClass(); + String defaultStyleClass = "layout-menu"; + styleClass = styleClass == null ? defaultStyleClass : defaultStyleClass + " " + styleClass; + + writer.startElement("ul", menu); + writer.writeAttribute("id", menu.getClientId(context), "id"); + writer.writeAttribute("class", styleClass, "styleClass"); + + if(style != null) { + writer.writeAttribute("style", style, "style"); + } + + if(menu.getElementsCount() > 0) { + encodeElements(context, menu, menu.getElements()); + } + + writer.endElement("ul"); + } + + protected void encodeElements(FacesContext context, AbstractMenu menu, List elements) throws IOException { + int size = elements.size(); + + for (int i = 0; i < size; i++) { + encodeElement(context, menu, elements.get(i)); + } + } + + protected void encodeElement(FacesContext context, AbstractMenu menu, MenuElement element) throws IOException { + ResponseWriter writer = context.getResponseWriter(); + + if(element.isRendered()) { + if(element instanceof MenuItem) { + MenuItem menuItem = (MenuItem) element; + String menuItemClientId = (menuItem instanceof UIComponent) ? menuItem.getClientId() : menu.getClientId(context) + "_" + menuItem.getClientId(); + String containerStyle = menuItem.getContainerStyle(); + String containerStyleClass = menuItem.getContainerStyleClass(); + + writer.startElement("li", null); + writer.writeAttribute("id", menuItemClientId, null); + writer.writeAttribute("role", "menuitem", null); + + if(containerStyle != null) writer.writeAttribute("style", containerStyle, null); + if(containerStyleClass != null) writer.writeAttribute("class", containerStyleClass, null); + + encodeMenuItem(context, menu, menuItem); + + writer.endElement("li"); + } + else if(element instanceof Submenu) { + Submenu submenu = (Submenu) element; + String submenuClientId = (submenu instanceof UIComponent) ? ((UIComponent) submenu).getClientId() : menu.getClientId(context) + "_" + submenu.getId(); + String style = submenu.getStyle(); + String styleClass = submenu.getStyleClass(); + + writer.startElement("li", null); + writer.writeAttribute("id", submenuClientId, null); + writer.writeAttribute("role", "menuitem", null); + + if(style != null) writer.writeAttribute("style", style, null); + if(styleClass != null) writer.writeAttribute("class", styleClass, null); + + encodeSubmenu(context, menu, submenu); + + writer.endElement("li"); + } + else if(element instanceof Separator) { + encodeSeparator(context, (Separator) element); + } + } + } + + protected void encodeSubmenu(FacesContext context, AbstractMenu menu, Submenu submenu) throws IOException{ + ResponseWriter writer = context.getResponseWriter(); + String icon = submenu.getIcon(); + String label = submenu.getLabel(); + int childrenElementsCount = submenu.getElementsCount(); + + writer.startElement("a", null); + writer.writeAttribute("href", "#", null); + writer.writeAttribute("class", "ripplelink", null); + + encodeItemIcon(context, icon); + + if(label != null) { + writer.startElement("span", null); + writer.writeAttribute("class", "menuitem-text", null); + writer.writeText(label, null); + writer.endElement("span"); + + encodeToggleIcon(context, submenu, childrenElementsCount); + + if(submenu instanceof UISubmenu) { + encodeBadge(context, ((UISubmenu) submenu).getAttributes().get("badge")); + } + } + + writer.endElement("a"); + + //submenus and menuitems + if(childrenElementsCount > 0) { + writer.startElement("ul", null); + writer.writeAttribute("role", "menu", null); + encodeElements(context, menu, submenu.getElements()); + writer.endElement("ul"); + } + } + + protected void encodeItemIcon(FacesContext context, String icon) throws IOException { + if(icon != null) { + ResponseWriter writer = context.getResponseWriter(); + + writer.startElement("i", null); + if(icon.contains("fa fa-") || icon.contains("ui-icon ui-icon-")) { + writer.writeAttribute("class", icon, null); + } + else { + writer.writeAttribute("class", "material-icons", null); + writer.writeText(icon, null); + } + + writer.endElement("i"); + } + } + + protected void encodeToggleIcon(FacesContext context, Submenu submenu, int childrenElementsCount) throws IOException { + if(childrenElementsCount > 0) { + ResponseWriter writer = context.getResponseWriter(); + + writer.startElement("i", null); + writer.writeAttribute("class", "material-icons layout-submenu-toggler", null); + writer.write(""); + writer.endElement("i"); + } + } + + protected void encodeBadge(FacesContext context, Object value) throws IOException { + if(value != null) { + ResponseWriter writer = context.getResponseWriter(); + + writer.startElement("span", null); + writer.writeAttribute("class", "menuitem-badge", null); + writer.writeText(value.toString(), null); + writer.endElement("span"); + } + } + + @Override + protected void encodeSeparator(FacesContext context, Separator separator) throws IOException { + ResponseWriter writer = context.getResponseWriter(); + String style = separator.getStyle(); + String styleClass = separator.getStyleClass(); + styleClass = styleClass == null ? "Separator" : "Separator " + styleClass; + + //title + writer.startElement("li", null); + writer.writeAttribute("class", styleClass, null); + if(style != null) { + writer.writeAttribute("style", style, null); + } + + writer.endElement("li"); + } + + @Override + protected void encodeMenuItem(FacesContext context, AbstractMenu menu, MenuItem menuitem) throws IOException { + ResponseWriter writer = context.getResponseWriter(); + String title = menuitem.getTitle(); + boolean disabled = menuitem.isDisabled(); + Object value = menuitem.getValue(); + String style = menuitem.getStyle(); + String styleClass = menuitem.getStyleClass(); + String defaultStyleClass = "ripplelink"; + styleClass = styleClass == null ? defaultStyleClass : defaultStyleClass + " " + styleClass; + + writer.startElement("a", null); + writer.writeAttribute("class", styleClass, null); + if(title != null) writer.writeAttribute("title", title, null); + if(style != null) writer.writeAttribute("style", style, null); + + if(disabled) { + writer.writeAttribute("href", "#", null); + writer.writeAttribute("onclick", "return false;", null); + } + else { + String onclick = menuitem.getOnclick(); + + //GET + if(menuitem.getUrl() != null || menuitem.getOutcome() != null) { + String targetURL = getTargetURL(context, (UIOutcomeTarget) menuitem); + writer.writeAttribute("href", targetURL, null); + + if(menuitem.getTarget() != null) { + writer.writeAttribute("target", menuitem.getTarget(), null); + } + } + //POST + else { + writer.writeAttribute("href", "#", null); + + UIComponent form = ComponentUtils.findParentForm(context, menu); + if(form == null) { + throw new FacesException("MenuItem must be inside a form element"); + } + + String command; + if(menuitem.isDynamic()) { + String menuClientId = menu.getClientId(context); + Map> params = menuitem.getParams(); + if(params == null) { + params = new LinkedHashMap>(); + } + List idParams = new ArrayList(); + idParams.add(menuitem.getId()); + params.put(menuClientId + "_menuid", idParams); + + command = menuitem.isAjax() ? buildAjaxRequest(context, menu, (AjaxSource) menuitem, form, params) : buildNonAjaxRequest(context, menu, form, menuClientId, params, true); + } + else { + command = menuitem.isAjax() ? buildAjaxRequest(context, (AjaxSource) menuitem, form) : buildNonAjaxRequest(context, ((UIComponent) menuitem), form, ((UIComponent) menuitem).getClientId(context), true); + } + + onclick = (onclick == null) ? command : onclick + ";" + command; + } + + if(onclick != null) { + writer.writeAttribute("onclick", onclick, null); + } + } + + encodeMenuItemContent(context, menu, menuitem); + + writer.endElement("a"); + } + + @Override + protected void encodeMenuItemContent(FacesContext context, AbstractMenu menu, MenuItem menuitem) throws IOException { + ResponseWriter writer = context.getResponseWriter(); + String icon = menuitem.getIcon(); + Object value = menuitem.getValue(); + + if(menuitem instanceof UIMenuItem) { + encodeBadge(context, ((UIMenuItem) menuitem).getAttributes().get("badge")); + } + encodeItemIcon(context, icon); + + if(value != null) { + writer.startElement("span", null); + writer.writeAttribute("class", "menuitem-text", null); + writer.writeText(value, "value"); + writer.endElement("span"); + } + } + + @Override + protected void encodeScript(FacesContext context, AbstractMenu abstractMenu) throws IOException { + SerenityMenu menu = (SerenityMenu) abstractMenu; + String clientId = menu.getClientId(context); + WidgetBuilder wb = getWidgetBuilder(context); + wb.init("Serenity", menu.resolveWidgetVar(), clientId) + .attr("closeDelay", menu.getCloseDelay()) + .finish(); + } + +} diff --git a/apc-layout/src/main/java/org/primefaces/serenity/filter/CharacterEncodingFilter.java b/apc-layout/src/main/java/org/primefaces/serenity/filter/CharacterEncodingFilter.java new file mode 100644 index 0000000..0cb3611 --- /dev/null +++ b/apc-layout/src/main/java/org/primefaces/serenity/filter/CharacterEncodingFilter.java @@ -0,0 +1,44 @@ +/* + * Copyright 2009-2014 PrimeTek. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.primefaces.serenity.filter; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +public class CharacterEncodingFilter implements Filter { + + public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { + req.setCharacterEncoding("UTF-8"); + resp.setCharacterEncoding("UTF-8"); + chain.doFilter(req, resp); + } + + public void init(FilterConfig filterConfig) throws ServletException { + + } + + public void destroy() { + + } + + +} diff --git a/apc-layout/src/main/java/org/primefaces/serenity/view/GuestPreferences.java b/apc-layout/src/main/java/org/primefaces/serenity/view/GuestPreferences.java new file mode 100644 index 0000000..e1245d4 --- /dev/null +++ b/apc-layout/src/main/java/org/primefaces/serenity/view/GuestPreferences.java @@ -0,0 +1,77 @@ +/* + * Copyright 2009-2014 PrimeTek. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.primefaces.serenity.view; + +import java.io.Serializable; +import javax.faces.bean.ManagedBean; +import javax.faces.bean.SessionScoped; + +@ManagedBean +@SessionScoped +public class GuestPreferences implements Serializable { + + private static final long serialVersionUID = 7356208868875521211L; + + private String layout = "lightblue"; + + private String theme = "bluegrey"; + + private boolean darkMenu; + + private boolean horizontal = false; + + private boolean orientationRTL; + + public String getTheme() { + return theme; + } + + public void setTheme(String theme) { + this.theme = theme; + } + + public String getLayout() { + return layout; + } + + public void setLayout(String layout) { + this.layout = layout; + } + + public boolean isDarkMenu() { + return darkMenu; + } + + public void setDarkMenu(boolean darkMenu) { + this.darkMenu = darkMenu; + } + + public boolean isOrientationRTL() { + return orientationRTL; + } + + public void setOrientationRTL(boolean orientationRTL) { + this.orientationRTL = orientationRTL; + } + + public boolean isHorizontal() { + return this.horizontal; + } + + public void setHorizontal(boolean value) { + this.horizontal = value; + } +} diff --git a/apc-model/nb-configuration.xml b/apc-model/nb-configuration.xml new file mode 100644 index 0000000..a65c451 --- /dev/null +++ b/apc-model/nb-configuration.xml @@ -0,0 +1,18 @@ + + + + + + JDK_1.8 + + diff --git a/apc-model/pom.xml b/apc-model/pom.xml new file mode 100644 index 0000000..7bd61f5 --- /dev/null +++ b/apc-model/pom.xml @@ -0,0 +1,160 @@ + + + 4.0.0 + com.arrebol + apc-model + 1.0.0 + jar + + UTF-8 + 1.8 + 1.8 + + + + + org.hibernate + hibernate-agroal + 5.4.14.Final + pom + + + org.hibernate + hibernate-c3p0 + 5.6.7.Final + + + c3p0 + c3p0 + 0.9.1.2 + + + + + Localhost + + jdbc:mysql://localhost:3306/apo_pro_com_april_ten?serverTimezone=GMT-5 + apoprocomlocalhost + Yj$2Da0z! + 10 + 40 + 1800 + 300 + + + + + src/main/resources + true + + + + + + Localhost-Mobile-APP + + jdbc:mysql://localhost:3306/apo_pro_com_april_ten?serverTimezone=GMT-5 + apoprocommobilelocalhost + 0Ps$6%q8 + 10 + 40 + 1800 + 300 + + + + + src/main/resources + true + + + + + + Amazon-Web-Services + + jdbc:mysql://apoyoaproyectoscomerciales.c9hicmk2emj3.us-east-2.rds.amazonaws.com:3306/apo_pro_com_april_ten?serverTimezone=GMT-6 + apoprocom + Yj$2Da0z! + 10 + 20 + 1800 + 300 + + + + + src/main/resources + true + + + + + + Amazon-Web-Services-Test + + jdbc:mysql://apc.clwlkknfqkjh.us-east-2.rds.amazonaws.com:3306/apo_pro_com_april_ten?serverTimezone=GMT-6 + apoprocom + Yj$2Da0z! + 10 + 20 + 1800 + 300 + + + + + src/main/resources + true + + + + + + Amazon-Web-Services-Mobile-APP + + jdbc:mysql://apoyoaproyectoscomerciales.c9hicmk2emj3.us-east-2.rds.amazonaws.com:3306/apo_pro_com_april_ten?serverTimezone=GMT-6 + apoprocommobile + 0Ps$6%q8 + 10 + 30 + 2000 + 1000 + + + + + src/main/resources + true + + + + + + Amazon-Web-Services-Mobile-APP-Test + + jdbc:mysql://apc.clwlkknfqkjh.us-east-2.rds.amazonaws.com:3306/apo_pro_com_april_ten?serverTimezone=GMT-6 + apoprocommobile + 0Ps$6%q8 + 10 + 30 + 2000 + 1000 + + + + + src/main/resources + true + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/java/com/arrebol/apc/model/DateFormatModel.java b/apc-model/src/main/java/com/arrebol/apc/model/DateFormatModel.java new file mode 100644 index 0000000..0fe4805 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/DateFormatModel.java @@ -0,0 +1,24 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +/** + * + * @author Oscar + */ +public class DateFormatModel { + + public String getDateFormat(Date date){ + Locale espanol = new Locale("es","MX"); + SimpleDateFormat format = new SimpleDateFormat("dd - MMMMM - yyyy",espanol); + String stringDate = format.format(date); + return stringDate; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/ModelParameter.java b/apc-model/src/main/java/com/arrebol/apc/model/ModelParameter.java new file mode 100644 index 0000000..7b5cfbe --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/ModelParameter.java @@ -0,0 +1,43 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class ModelParameter { + + private String parameter; + private Object value; + + public ModelParameter() { + } + + public ModelParameter(String parameter, Object value) { + this.parameter = parameter; + this.value = value; + } + + public String getParameter() { + return parameter; + } + + public void setParameter(String parameter) { + this.parameter = parameter; + } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/Advance.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/Advance.java new file mode 100644 index 0000000..6396f2f --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/Advance.java @@ -0,0 +1,201 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin; + +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_ADVANCE") +public class Advance implements Serializable { + + private static final long serialVersionUID = -4380548310735493011L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_human_resource", + referencedColumnName = "id", + nullable = false + ) + private HumanResource humanResource; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Column(name = "amount", nullable = false) + private BigDecimal amount; + + @Enumerated(EnumType.STRING) + @Column(name = "active_status", nullable = false) + private ActiveStatus activeStatus; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + public Advance() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public HumanResource getHumanResource() { + return humanResource; + } + + public void setHumanResource(HumanResource humanResource) { + this.humanResource = humanResource; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + public ActiveStatus getActiveStatus() { + return activeStatus; + } + + public void setActiveStatus(ActiveStatus activeStatus) { + this.activeStatus = activeStatus; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public boolean getActive() { + if (activeStatus == ActiveStatus.ENEBLED) { + return true; + } else { + return false; + } + + } + + public boolean getAction(Date lastStableGeneralBox) { + Date date = createdOn; + boolean action = true; + try { + SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); + + String dateStr = dt1.format(date); + date = dt1.parse(dateStr); + + action = date.after(lastStableGeneralBox); + + } catch (ParseException ex) { + Logger.getLogger(ExpenseCompany.class.getName()).log(Level.SEVERE, null, ex); + } + return action; + } + + public String conditionEnabled() { + if (activeStatus == ActiveStatus.DISABLED) { + return "grayRow"; + } else { + return null; + } + } + + @Override + public String toString() { + return "Advance{" + "active_status=" + activeStatus + ", createdOn=" + createdOn + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/Bonus.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/Bonus.java new file mode 100644 index 0000000..54f1d36 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/Bonus.java @@ -0,0 +1,209 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin; + +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_BONUS") +public class Bonus implements Serializable { + + private static final long serialVersionUID = 3584728331941248013L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "name", nullable = false, length = 100) + private String name; + + @Column(name = "loan_bonus", nullable = false) + private BigDecimal loanBonus; + + @Column(name = "mora_bonus", nullable = false) + private BigDecimal moraBonus; + + @Column(name = "new_customer_bonus", nullable = false) + private BigDecimal newCustomerBonus; + + @Enumerated(EnumType.STRING) + @Column(name = "administrative", nullable = false) + private ActiveStatus administrative; + + @Enumerated(EnumType.STRING) + @Column(name = "active_status", nullable = false) + private ActiveStatus activeStatus; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + public Bonus() { + } + + /** + * + * @param id + */ + public Bonus(String id) { + this.id = id; + } + + /** + * + * @param id + * @param name + */ + public Bonus(String id, String name) { + this.id = id; + this.name = name; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public BigDecimal getLoanBonus() { + return loanBonus; + } + + public void setLoanBonus(BigDecimal loanBonus) { + this.loanBonus = loanBonus; + } + + public BigDecimal getMoraBonus() { + return moraBonus; + } + + public void setMoraBonus(BigDecimal moraBonus) { + this.moraBonus = moraBonus; + } + + public BigDecimal getNewCustomerBonus() { + return newCustomerBonus; + } + + public void setNewCustomerBonus(BigDecimal newCustomerBonus) { + this.newCustomerBonus = newCustomerBonus; + } + + public ActiveStatus getAdministrative() { + return administrative; + } + + public void setAdministrative(ActiveStatus administrative) { + this.administrative = administrative; + } + + public ActiveStatus getActiveStatus() { + return activeStatus; + } + + public void setActiveStatus(ActiveStatus activeStatus) { + this.activeStatus = activeStatus; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + @Override + public String toString() { + return "Bonus{" + "name=" + name + ", createdOn=" + createdOn + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/ClosingDay.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/ClosingDay.java new file mode 100644 index 0000000..22387ad --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/ClosingDay.java @@ -0,0 +1,250 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin; + +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Table(name = "APC_CLOSING_DAY") +public class ClosingDay implements Serializable{ + + private static final long serialVersionUID = 347958707624227979L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_user", + referencedColumnName = "id", + nullable = false + ) + private User user; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Column(name = "amount_paid", nullable = false) + private BigDecimal amountPaid; + + @Column(name = "amount_expected", nullable = false) + private BigDecimal amountExpected; + + @Column(name = "comments", length = 250) + private String comments; + + @Enumerated(EnumType.STRING) + @Column(name = "active_status", nullable = false) + private ActiveStatus activeStatus; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_route", + referencedColumnName = "id", + nullable = true + ) + private RouteCtlg routeCtlg; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + public ClosingDay() { + } + + public ClosingDay(String id) { + this.id = id; + } + + public ClosingDay(String id, User user, Office office, BigDecimal amountPaid, BigDecimal amountExpected, ActiveStatus activeStatus, String comments, String createdBy, Date createdOn) { + this.id = id; + this.user = user; + this.office = office; + this.amountPaid = amountPaid; + this.amountExpected = amountExpected; + this.activeStatus = activeStatus; + this.createdBy = createdBy; + this.createdOn = createdOn; + this.comments = comments; + } + + public ClosingDay(String id, User user, Office office, BigDecimal amountPaid, BigDecimal amountExpected, String comments, ActiveStatus activeStatus, String createdBy) { + this.id = id; + this.user = user; + this.office = office; + this.amountPaid = amountPaid; + this.amountExpected = amountExpected; + this.activeStatus = activeStatus; + this.createdBy = createdBy; + this.createdOn = new Date(); + this.comments = comments; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public BigDecimal getAmountPaid() { + return amountPaid; + } + + public void setAmountPaid(BigDecimal amountPaid) { + this.amountPaid = amountPaid; + } + + public BigDecimal getAmountExpected() { + return amountExpected; + } + + public void setAmountExpected(BigDecimal amountExpected) { + this.amountExpected = amountExpected; + } + + public BigDecimal getDiferencia(){ + BigDecimal diferencia = amountPaid.subtract(amountExpected); + + return diferencia; + } + + public ActiveStatus getActiveStatus() { + return activeStatus; + } + + public void setActiveStatus(ActiveStatus activeStatus) { + this.activeStatus = activeStatus; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public RouteCtlg getRouteCtlg() { + return routeCtlg; + } + + public void setRouteCtlg(RouteCtlg routeCtlg) { + this.routeCtlg = routeCtlg; + } + + public String conditionEnabled() { + if(getActiveStatus() == ActiveStatus.DISABLED) + return "grayRow"; + else + return null; + } + + public boolean conditionEnabledBool() { + if (getActiveStatus() == ActiveStatus.DISABLED) { + return false; + } else { + return true; + } + } + + public boolean getActive() { + return activeStatus == ActiveStatus.ENEBLED; + + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/ClosingDayDetail.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/ClosingDayDetail.java new file mode 100644 index 0000000..788094d --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/ClosingDayDetail.java @@ -0,0 +1,154 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Table(name = "APC_CLOSING_DAY_DETAIL") +public class ClosingDayDetail implements Serializable{ + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_closing_day", + referencedColumnName = "id", + nullable = false + ) + private ClosingDay closingDay; + + @Column(name = "comments", length = 250) + private String comments; + + @Column(name = "amount", nullable = false) + private BigDecimal amount; + + @Column(name = "type", length = 250) + private String type; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "dateDetail", length = 19) + private Date dateDetail; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public ClosingDay getClosingDay() { + return closingDay; + } + + public void setClosingDay(ClosingDay closingDay) { + this.closingDay = closingDay; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public Date getDateDetail() { + return dateDetail; + } + + public void setDateDetail(Date dateDetail) { + this.dateDetail = dateDetail; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/EmployeeSaving.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/EmployeeSaving.java new file mode 100644 index 0000000..29902e8 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/EmployeeSaving.java @@ -0,0 +1,102 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.admin; + +import com.arrebol.apc.model.enums.EmployeeSavingType; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Administrador + */ +@Entity +@Table(name = "APC_EMPLOYEE_SAVING") +public class EmployeeSaving implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_user", length = 36) + private String idUser; + + @Column(name = "employee_saving", nullable = false) + private BigDecimal employeeSaving; + + @Column(name = "created_by", length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Enumerated(EnumType.STRING) + @Column(name = "type", nullable = false) + private EmployeeSavingType type; + + public EmployeeSavingType getType() { + return type; + } + + public void setType(EmployeeSavingType type) { + this.type = type; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public BigDecimal getEmployeeSaving() { + return employeeSaving; + } + + public void setEmployeeSaving(BigDecimal paymentAmount) { + this.employeeSaving = paymentAmount; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/ExpenseCompany.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/ExpenseCompany.java new file mode 100644 index 0000000..007a4f6 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/ExpenseCompany.java @@ -0,0 +1,242 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin; + +import com.arrebol.apc.model.DateFormatModel; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.ExpenseCompanyType; +import java.io.Serializable; +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_EXPENSE_COMPANY") +public class ExpenseCompany extends DateFormatModel implements Serializable { + + private static final long serialVersionUID = 7927698024624765461L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Column(name = "amount", nullable = false) + private BigDecimal amount; + + @Column(name = "description", length = 200) + private String description; + + @Enumerated(EnumType.STRING) + @Column(name = "expense_company_type", nullable = false) + private ExpenseCompanyType expenseCompanyType; + + @Enumerated(EnumType.STRING) + @Column(name = "active_status", nullable = false) + private ActiveStatus activeStatus; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "created_by", + referencedColumnName = "id", + insertable = false, + updatable = false, + nullable = false + ) + private User user; + + public ExpenseCompany() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public ExpenseCompanyType getExpenseCompanyType() { + return expenseCompanyType; + } + + public void setExpenseCompanyType(ExpenseCompanyType expenseCompanyType) { + this.expenseCompanyType = expenseCompanyType; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public boolean getAction(Date lastStableGeneralBox) { + Date date = createdOn; + boolean action = true; + try { + SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); + + String dateStr = dt1.format(date); + date = dt1.parse(dateStr); + Logger.getLogger(ExpenseCompany.class.getName()).log(Level.INFO, "@@@@@@@@@@@@@@@@@@@@@ CreatedOn - " + createdOn); + Logger.getLogger(ExpenseCompany.class.getName()).log(Level.INFO, "@@@@@@@@@@@@@@@@@@@@@ date - " + date); + Logger.getLogger(ExpenseCompany.class.getName()).log(Level.INFO, "@@@@@@@@@@@@@@@@@@@@@ lastStableGeneralBox - " + lastStableGeneralBox); + + + action = date.after(lastStableGeneralBox); + + Logger.getLogger(ExpenseCompany.class.getName()).log(Level.INFO, "@@@@@@@@@@@@@@@@@@@@@ Action - " + action); + + } catch (ParseException ex) { + Logger.getLogger(ExpenseCompany.class.getName()).log(Level.SEVERE, null, ex); + } + return action; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public ActiveStatus getActiveStatus() { + return activeStatus; + } + + public void setActiveStatus(ActiveStatus activeStatus) { + this.activeStatus = activeStatus; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public String getUserName() { + String lNombre = user.getHumanResource().getFirstName() + " " + user.getHumanResource().getSecondName() + " " + user.getHumanResource().getLastName(); + return lNombre; + } + + public String conditionEnabled() { + if(getActiveStatus() == ActiveStatus.DISABLED) + return "grayRow"; + else + return null; + } + + public boolean getActive() { + if (activeStatus == ActiveStatus.ENEBLED) { + return true; + } else { + return false; + } + + } + + public Date getLastStableGB(Date lastStableGeneralBox) { + return lastStableGeneralBox; + } + + @Override + public String toString() { + return "ExpenseCompany{" + "description=" + description + ", createdBy=" + createdBy + ", createdOn=" + createdOn + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/Goal.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/Goal.java new file mode 100644 index 0000000..5200627 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/Goal.java @@ -0,0 +1,170 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin; + +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_GOAL") +public class Goal implements Serializable { + + private static final long serialVersionUID = 2775085143559471536L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Temporal(TemporalType.DATE) + @Column(name = "start_date") + private Date startDate; + + @Temporal(TemporalType.DATE) + @Column(name = "end_date") + private Date endDate; + + @Column(name = "amount", nullable = false) + private BigDecimal amount; + + @Enumerated(EnumType.STRING) + @Column(name = "active_status", nullable = false) + private ActiveStatus activeStatus; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + public Goal() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Date getStartDate() { + return startDate; + } + + public void setStartDate(Date startDate) { + this.startDate = startDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + public ActiveStatus getActiveStatus() { + return activeStatus; + } + + public void setActiveStatus(ActiveStatus activeStatus) { + this.activeStatus = activeStatus; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + @Override + public String toString() { + return "Goal{" + "active_status=" + activeStatus + ", office=" + office + ", createdOn=" + createdOn + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/LoanEmployee.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/LoanEmployee.java new file mode 100644 index 0000000..5f3f970 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/LoanEmployee.java @@ -0,0 +1,159 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.admin; + +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.LoanStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Administrador + */ +@Entity +@Table(name = "APC_LOAN_EMPLOYEE") +public class LoanEmployee implements Serializable { + private static final long serialVersionUID = 2775085143559471537L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_employee", length = 36) + private String idEmployee; + + @Column(name = "amount_loan", nullable = false) + private BigDecimal amountLoan; + + @Column(name = "balance", nullable = false) + private BigDecimal balance; + + @Column(name = "amount_to_pay", nullable = false) + private BigDecimal amountToPay; + + @Column(name = "total_amount_to_pay", nullable = false) + private BigDecimal totalAmountToPay; + + @Enumerated(EnumType.STRING) + @Column(name = "loan_employee_status", nullable = false) + private ActiveStatus loanEmployeeStatus; + + @Column(name = "created_by", length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdEmployee() { + return idEmployee; + } + + public void setIdEmployee(String idEmployee) { + this.idEmployee = idEmployee; + } + + public BigDecimal getAmountLoan() { + return amountLoan; + } + + public void setAmountLoan(BigDecimal amountLoan) { + this.amountLoan = amountLoan; + } + + public BigDecimal getBalance() { + return balance; + } + + public void setBalance(BigDecimal balance) { + this.balance = balance; + } + + public BigDecimal getAmountToPay() { + return amountToPay; + } + + public void setAmountToPay(BigDecimal amountToPay) { + this.amountToPay = amountToPay; + } + + public ActiveStatus getLoanEmployeeStatus() { + return loanEmployeeStatus; + } + + public void setLoanEmployeeStatus(ActiveStatus loanEmployeeStatus) { + this.loanEmployeeStatus = loanEmployeeStatus; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public BigDecimal getTotalAmountToPay() { + return totalAmountToPay; + } + + public void setTotalAmountToPay(BigDecimal totalAmountToPay) { + this.totalAmountToPay = totalAmountToPay; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/LoanEmployeeDetails.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/LoanEmployeeDetails.java new file mode 100644 index 0000000..66da165 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/LoanEmployeeDetails.java @@ -0,0 +1,137 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.admin; + +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Administrador + */ +@Entity +@Table(name = "APC_LOAN_EMPLOYEE_DETAIL") +public class LoanEmployeeDetails implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_loan", length = 36) + private String idLoan; + + @Column(name = "id_user", length = 36) + private String idUser; + + @Column(name = "payment_amount", nullable = false) + private BigDecimal paymentAmount; + + @Column(name = "reference_number", nullable = false) + private int referenceNumber; + + @Enumerated(EnumType.STRING) + @Column(name = "loan_employee_detail_status", nullable = false) + private ActiveStatus loanEmployeeDetailStatus; + + @Column(name = "created_by", length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Enumerated(EnumType.STRING) + @Column(name = "payroll", nullable = false) + private ActiveStatus payroll; + + public ActiveStatus getPayroll() { + return payroll; + } + + public void setPayroll(ActiveStatus payroll) { + this.payroll = payroll; + } + + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdLoan() { + return idLoan; + } + + public void setIdLoan(String idLoan) { + this.idLoan = idLoan; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public BigDecimal getPaymentAmount() { + return paymentAmount; + } + + public void setPaymentAmount(BigDecimal paymentAmount) { + this.paymentAmount = paymentAmount; + } + + public int getReferenceNumber() { + return referenceNumber; + } + + public void setReferenceNumber(int referenceNumber) { + this.referenceNumber = referenceNumber; + } + + public ActiveStatus getLoanEmployeeDetailStatus() { + return loanEmployeeDetailStatus; + } + + public void setLoanEmployeeDetailStatus(ActiveStatus loanEmployeeDetailStatus) { + this.loanEmployeeDetailStatus = loanEmployeeDetailStatus; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/MoneyDaily.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/MoneyDaily.java new file mode 100644 index 0000000..c426651 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/MoneyDaily.java @@ -0,0 +1,164 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin; + +import com.arrebol.apc.model.DateFormatModel; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import java.io.Serializable; +import java.math.BigDecimal; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_MONEY_DAILY") +public class MoneyDaily extends DateFormatModel implements Serializable { + + private static final long serialVersionUID = 4622672186001211722L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "money_daily_date", length = 19) + private Date moneyDailyDate; + + @Column(name = "amount", nullable = false) + private BigDecimal amount; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_user", + referencedColumnName = "id", + nullable = false + ) + private User user; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + public MoneyDaily() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Date getMoneyDailyDate() { + return moneyDailyDate; + } + + public void setMoneyDailyDate(Date moneyDailyDate) { + this.moneyDailyDate = moneyDailyDate; + } + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + + + + public boolean getAction(Date lastStableGeneralBox) { + Date date = createdOn; + boolean action = true; + try { + SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); + + String dateStr = dt1.format(date); + date = dt1.parse(dateStr); + + action = date.after(lastStableGeneralBox); + + } catch (ParseException ex) { + Logger.getLogger(ExpenseCompany.class.getName()).log(Level.SEVERE, null, ex); + } + return action; + } + + @Override + public String toString() { + return "MoneyDaily{" + "moneyDailyDate=" + moneyDailyDate + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/OtherExpense.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/OtherExpense.java new file mode 100644 index 0000000..3698e7e --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/OtherExpense.java @@ -0,0 +1,256 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin; + +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import java.io.Serializable; +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.stream.Collectors; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Table(name = "APC_OTHER_EXPENSE") +@Entity +public class OtherExpense implements Serializable { + + private static final long serialVersionUID = 6233701552847217683L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn( + name = "id_user", + referencedColumnName = "id", + nullable = false + ) + private User user; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Column(name = "expense", nullable = false) + private BigDecimal expense; + + @Column(name = "description", length = 200, nullable = false) + private String description; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn( + name = "created_by", + referencedColumnName = "id", + nullable = false, + insertable = false, + updatable = false + + ) + private User userCreatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + public OtherExpense() { + } + + /** + * + * @param officeId + * @param userId + * @param expense + * @param description + */ + public OtherExpense(String officeId, String userId, BigDecimal expense, String description) { + this.office = new Office(officeId); + this.user = new User(userId); + this.expense = expense; + this.description = description; + this.createdBy = userId; + this.createdOn = new Date(); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public BigDecimal getExpense() { + return expense; + } + + public void setExpense(BigDecimal expense) { + this.expense = expense; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public String getUserRoutes() { + String routes = ""; + routes = user.getHumanResource().getHumanResourceHasRoutes().stream().map((py) -> py.getRouteCtlg().getRoute()).collect(Collectors.joining(", ")); + + return routes; + } + + public User getUserCreatedBy() { + return userCreatedBy; + } + + public void setUserCreatedBy(User userCreatedBy) { + this.userCreatedBy = userCreatedBy; + } + + public String getCreatedByName() { + String name = getUserCreatedBy().getHumanResource().getFirstName() + " " + getUserCreatedBy().getHumanResource().getLastName(); + + return name; + } + + public boolean getAction(Date lastStableSmallBox, List closingDayToday) { + Date date = createdOn; + String closingDayUser = null; + boolean action = true; + try { + SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); + + String dateStr = dt1.format(date); + date = dt1.parse(dateStr); + + action = date.after(lastStableSmallBox); + + // Busca el corte del día de este usuario + if (closingDayToday != null) { + Optional optUser = closingDayToday.stream().filter(p -> p.getUser().getId().equalsIgnoreCase(user.getId()) + && p.getCreatedOn().equals(createdOn)).findFirst(); + closingDayUser = optUser.isPresent() ? optUser.get().getId(): null; + + String dateStrCD; + Date dateCD; + for(ClosingDay dato : closingDayToday){ + dateStrCD = dt1.format(dato.getCreatedOn()); + dateCD = dt1.parse(dateStrCD); + + if(dato.getUser().getId().equalsIgnoreCase(getUser().getId()) && dateCD.equals(date)){ + closingDayUser = dato.getUser().getId(); + } + } + } + + if(action){ + if(closingDayUser != null){ + action = false; + } + } + + } catch (ParseException ex) { + Logger.getLogger(ExpenseCompany.class.getName()).log(Level.SEVERE, null, ex); + } + return action; + } + + @Override + public String toString() { + return "OtherExpense{" + "description=" + description + ", createdOn=" + createdOn + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/StableGeneralBox.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/StableGeneralBox.java new file mode 100644 index 0000000..51ba7cc --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/StableGeneralBox.java @@ -0,0 +1,241 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin; + +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_STABLE_GENERAL_BOX") +public class StableGeneralBox implements Serializable { + + private static final long serialVersionUID = -3501956555560463690L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "total_general_box", nullable = false) + private BigDecimal totalGeneralBox; + + @Column(name = "total_envelope", nullable = false) + private BigDecimal totalEnvelope; + + @Column(name = "total_bank_note", nullable = false) + private BigDecimal totalBankNote; + + @Column(name = "total_coin", nullable = false) + private BigDecimal totalCoin; + + @Column(name = "total_stable", nullable = false) + private BigDecimal totalStable; + + @Column(name = "description", length = 200) + private String description; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "created_by", + referencedColumnName = "id", + insertable = false, + updatable = false, + nullable = false + ) + private User user; + + @Enumerated(EnumType.STRING) + @Column(name = "active_status", nullable = false) + private ActiveStatus activeStatus; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + public StableGeneralBox() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public BigDecimal getTotalGeneralBox() { + return totalGeneralBox; + } + + public void setTotalGeneralBox(BigDecimal totalGeneralBox) { + this.totalGeneralBox = totalGeneralBox; + } + + public BigDecimal getTotalEnvelope() { + return totalEnvelope; + } + + public void setTotalEnvelope(BigDecimal totalEnvelope) { + this.totalEnvelope = totalEnvelope; + } + + public BigDecimal getTotalBankNote() { + return totalBankNote; + } + + public void setTotalBankNote(BigDecimal totalBankNote) { + this.totalBankNote = totalBankNote; + } + + public BigDecimal getTotalCoin() { + return totalCoin; + } + + public void setTotalCoin(BigDecimal totalCoin) { + this.totalCoin = totalCoin; + } + + public BigDecimal getTotalStable() { + return totalStable; + } + + public void setTotalStable(BigDecimal totalStable) { + this.totalStable = totalStable; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public ActiveStatus getActiveStatus() { + return activeStatus; + } + + public void setActiveStatus(ActiveStatus activeStatus) { + this.activeStatus = activeStatus; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public String getUserName() { + String lNombre = user.getHumanResource().getFirstName() + " " + user.getHumanResource().getSecondName() + " " + user.getHumanResource().getLastName(); + return lNombre; + } + + public String conditionEnabled() { + if(getActiveStatus() == ActiveStatus.DISABLED) + return "grayRow"; + else + return null; + } + + public boolean getActive() { + if (activeStatus == ActiveStatus.ENEBLED) { + return true; + } else { + return false; + } + + } + + @Override + public String toString() { + return "StableGeneralBox{" + "description=" + description + ", createdBy=" + createdBy + ", createdOn=" + createdOn + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/StableSmallBox.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/StableSmallBox.java new file mode 100644 index 0000000..dba6621 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/StableSmallBox.java @@ -0,0 +1,262 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin; + +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_STABLE_SMALL_BOX") +public class StableSmallBox implements Serializable { + + private static final long serialVersionUID = -3501956555560463690L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "total_small_box", nullable = false) + private BigDecimal totalSmallBox; + + @Column(name = "total_envelope", nullable = false) + private BigDecimal totalEnvelope; + + @Column(name = "total_bank_note", nullable = false) + private BigDecimal totalBankNote; + + @Column(name = "total_coin", nullable = false) + private BigDecimal totalCoin; + + @Column(name = "total_stable", nullable = false) + private BigDecimal totalStable; + + @Column(name = "description", length = 200) + private String description; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "created_by", + referencedColumnName = "id", + insertable = false, + updatable = false, + nullable = false + ) + private User user; + + @Enumerated(EnumType.STRING) + @Column(name = "active_status", nullable = false) + private ActiveStatus activeStatus; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + public StableSmallBox() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public BigDecimal getTotalSmallBox() { + return totalSmallBox; + } + + public void setTotalSmallBox(BigDecimal totalSmallBox) { + this.totalSmallBox = totalSmallBox; + } + + public BigDecimal getTotalEnvelope() { + return totalEnvelope; + } + + public void setTotalEnvelope(BigDecimal totalEnvelope) { + this.totalEnvelope = totalEnvelope; + } + + public BigDecimal getTotalBankNote() { + return totalBankNote; + } + + public void setTotalBankNote(BigDecimal totalBankNote) { + this.totalBankNote = totalBankNote; + } + + public BigDecimal getTotalCoin() { + return totalCoin; + } + + public void setTotalCoin(BigDecimal totalCoin) { + this.totalCoin = totalCoin; + } + + public BigDecimal getTotalStable() { + return totalStable; + } + + public void setTotalStable(BigDecimal totalStable) { + this.totalStable = totalStable; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public ActiveStatus getActiveStatus() { + return activeStatus; + } + + public void setActiveStatus(ActiveStatus activeStatus) { + this.activeStatus = activeStatus; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public String getUserName (){ + String lNombre = user.getHumanResource().getFirstName() +" "+ user.getHumanResource().getSecondName() +" "+ user.getHumanResource().getLastName(); + return lNombre; + } + + public String conditionEnabled() { + if(getActiveStatus() == ActiveStatus.DISABLED) + return "grayRow"; + else + return null; + } + + public boolean getActive() { + if (activeStatus == ActiveStatus.ENEBLED) { + return true; + } else { + return false; + } + + } + + public boolean getAction(Date lastStableGeneralBox) { + Date date = createdOn; + boolean action = true; + try { + SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); + + String dateStr = dt1.format(date); + date = dt1.parse(dateStr); + + action = date.after(lastStableGeneralBox); + + } catch (ParseException ex) { + Logger.getLogger(ExpenseCompany.class.getName()).log(Level.SEVERE, null, ex); + } + return action; + } + + @Override + public String toString() { + return "StableSmallBox{" + "description=" + description + ", createdBy=" + createdBy + ", createdOn=" + createdOn + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/Transfer.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/Transfer.java new file mode 100644 index 0000000..4df0815 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/Transfer.java @@ -0,0 +1,297 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin; + +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.ActionStatus; +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.stream.Collectors; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Table(name = "APC_TRANSFER") +public class Transfer implements Serializable { + + private static final long serialVersionUID = -1304758262604329766L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_user_transmitter", + referencedColumnName = "id", + nullable = false + ) + private User userTransmitter; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_user_receiver", + referencedColumnName = "id", + nullable = false + ) + private User userReceiver; + + @Enumerated(EnumType.STRING) + @Column(name = "active_status", nullable = false) + private ActiveStatus activeStatus; + + @Enumerated(EnumType.STRING) + @Column(name = "action_status", nullable = false) + private ActionStatus actionStatus; + + @Column(name = "amount_to_transfer", nullable = false) + private BigDecimal amountToTransfer; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + public Transfer() { + + } + + /** + * + * @param userTransmitter + * @param userReceiver + * @param activeStatus + * @param actionStatus + * @param amountToTransfer + * @param office + * @param createdBy + */ + public Transfer(User userTransmitter, User userReceiver, ActiveStatus activeStatus, ActionStatus actionStatus, BigDecimal amountToTransfer, Office office, String createdBy) { + this.userTransmitter = userTransmitter; + this.userReceiver = userReceiver; + this.activeStatus = activeStatus; + this.actionStatus = actionStatus; + this.amountToTransfer = amountToTransfer; + this.office = office; + this.createdBy = createdBy; + this.createdOn = new Date(); + } + + /** + * + * @param id + */ + public Transfer(String id) { + this.id = id; + } + + public Transfer(String id, User userTransmitter, User userReceiver, ActiveStatus activeStatus, ActionStatus actionStatus, BigDecimal amountToTransfer, Office office, String createdBy) { + this.id = id; + this.userTransmitter = userTransmitter; + this.userReceiver = userReceiver; + this.activeStatus = activeStatus; + this.actionStatus = actionStatus; + this.amountToTransfer = amountToTransfer; + this.office = office; + this.createdBy = createdBy; + this.createdOn = new Date(); + } + + public Transfer(String id, User userTransmitter, User userReceiver, ActiveStatus activeStatus, ActionStatus actionStatus, BigDecimal amountToTransfer, Office office, String createdBy, Date createdOn) { + this.id = id; + this.userTransmitter = userTransmitter; + this.userReceiver = userReceiver; + this.activeStatus = activeStatus; + this.actionStatus = actionStatus; + this.amountToTransfer = amountToTransfer; + this.office = office; + this.createdBy = createdBy; + this.createdOn = createdOn; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public User getUserTransmitter() { + return userTransmitter; + } + + public void setUserTransmitter(User userTransmitter) { + this.userTransmitter = userTransmitter; + } + + public User getUserReceiver() { + return userReceiver; + } + + public void setUserReceiver(User userReceiver) { + this.userReceiver = userReceiver; + } + + public ActiveStatus getActiveStatus() { + return activeStatus; + } + + public void setActiveStatus(ActiveStatus activeStatus) { + this.activeStatus = activeStatus; + } + + public ActionStatus getActionStatus() { + return actionStatus; + } + + public void setActionStatus(ActionStatus actionStatus) { + this.actionStatus = actionStatus; + } + + public BigDecimal getAmountToTransfer() { + return amountToTransfer; + } + + public void setAmountToTransfer(BigDecimal amountToTransfer) { + this.amountToTransfer = amountToTransfer; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public String getUserReceiverRoutes(){ + String routes = ""; + routes = userReceiver.getHumanResource().getHumanResourceHasRoutes().stream().map((py) -> py.getRouteCtlg().getRoute()).collect(Collectors.joining(", ")); + + return routes; + } + + public String getUserTransmitterRoutes(){ + String routes = ""; + routes = userTransmitter.getHumanResource().getHumanResourceHasRoutes().stream().map((py) -> py.getRouteCtlg().getRoute()).collect(Collectors.joining(", ")); + + return routes; + } + + public boolean getAction(Date lastStableSmallBox) { + Date date = createdOn; + boolean action = true; + try { + SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); + + String dateStr = dt1.format(date); + date = dt1.parse(dateStr); + + action = date.after(lastStableSmallBox); + + } catch (Exception ex) { + Logger.getLogger(ExpenseCompany.class.getName()).log(Level.SEVERE, null, ex); + } + return action; + } + + public boolean getActive() { + if (activeStatus == ActiveStatus.ENEBLED) { + return true; + } else { + return false; + } + } + + public String conditionEnabled() { + if(getActiveStatus() == ActiveStatus.DISABLED) + return "grayRow"; + else + return null; + } + + @Override + public String toString() { + return "Transfer{" + "activeStatus=" + activeStatus + ", actionStatus=" + actionStatus + ", createdOn=" + createdOn + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/AdvanceCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/AdvanceCfg.java new file mode 100644 index 0000000..abe6e45 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/AdvanceCfg.java @@ -0,0 +1,24 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface AdvanceCfg extends GenericCfg { + + String QUERY_FIND_ALL_ADVANCE_BY_OFFICE = "findAllAdvanceByOffice"; + String QUERY_FIND_ALL_ADVANCE_BY_OFFICE_BETWEEN_DATES = "findAllAdvanceByOfficeBetweenDates"; + String QUERY_UPDATE_ADVANCE_BY_STATUS = "updateAdvanceByStatus"; + + String FIELD_OFFICE = "office"; + String FIELD_ACTIVE_STATUS = "activeStatus"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/BitacoraCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/BitacoraCfg.java new file mode 100644 index 0000000..708cd4d --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/BitacoraCfg.java @@ -0,0 +1,22 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface BitacoraCfg extends GenericCfg { + + String QUERY_FIND_ALL_BITACORA_BY_OFFICE = "findAllBitacoraByOffice"; + String QUERY_FIND_ALL_BITACORA_BY_OFFICE_DATE = "findAllBitacoraByOfficeDate"; + + String FIELD_OFFICE = "office"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/BonusCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/BonusCfg.java new file mode 100644 index 0000000..378510d --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/BonusCfg.java @@ -0,0 +1,25 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface BonusCfg extends GenericCfg { + + String QUERY_FIND_ALL_ACTIVE_BONUS = "findAllActiveBonus"; + String QUERY_FIND_ALL_BONUS = "findAllBonus"; + String QUERY_FIND_ALL_BONUS_BETWEEN_DATES = "findAllBonusBetweenDates"; + String QUERY_UPDATE_BONUS_BY_STATUS = "updateBonusByStatus"; + + String FIELD_ACTIVE_STATUS = "activeStatus"; + String FIELD_OFFICE = "office"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/ClosingDayCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/ClosingDayCfg.java new file mode 100644 index 0000000..f3e0181 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/ClosingDayCfg.java @@ -0,0 +1,35 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface ClosingDayCfg extends GenericCfg { + + String QUERY_FIND_ALL_CLOSING_DAY_BY_OFFICE = "findAllClosingDayByOffice"; + String QUERY_FIND_ALL_CLOSING_DAY_BY_OFFICE_BETWEEN_DATES = "findAllClosingDayByOfficeBetweenCreatedOn"; + String QUERY_UPDATE_CLOSING_DAY_BY_STATUS = "updateClosingDayByStatus"; + String QUERY_FIND_TOTAL_BY_USER = "findAllTotalCashByCurdateByUserId"; + String QUERY_FIND_TOTAL_BY_OFFICE = "findAllTotalCashByCurdateByOffice"; + String QUERY_FIND_TOTAL_DASHBOARD_BY_OFFICE = "findAllTotalCashByCurdateDashboardByOffice"; + String QUERY_FIND_ALL_CLOSING_DAY_BY_CURDATE = "findAllViewTotalClosingDayByCurdateByOffice"; + String QUERY_COUNT_CLOSING_DATE_BY_USER_AND_OFFICE = "countClosingDateByUserAndOffice"; + String QUERY_SUM_CLOSING_DAY_BY_CURDATE_AND_OFFICE = "findSumClosingDayByCurdate"; + String QUERY_FIND_ID_BY_EMPLOYEE_AND_OFFICE_EQUALS_CURRDATE = "findIdByEmployeeAndOfficeEqualsToCurrdate"; + + String FIELD_USER = "user"; + String FIELD_OFFICE = "office"; + String FIELD_ACTIVE_STATUS = "activeStatus"; + String FIELD_VIEW_OFFICE = "idOffice"; + String FIELD_CREATED_ON = "createdOn"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/ClosingDayDetailCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/ClosingDayDetailCfg.java new file mode 100644 index 0000000..1478a55 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/ClosingDayDetailCfg.java @@ -0,0 +1,22 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface ClosingDayDetailCfg extends GenericCfg{ + + String QUERY_FIND_ALL_CLOSING_DAY_DETAIL_BY_ID = "findAllClosingDayDetailById"; + + String FIELD_CLOSING_DAY = "closingDay"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/ExpenseCompanyCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/ExpenseCompanyCfg.java new file mode 100644 index 0000000..8efdaa2 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/ExpenseCompanyCfg.java @@ -0,0 +1,26 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface ExpenseCompanyCfg extends GenericCfg { + + String QUERY_FIND_ALL_EXPENSE_COMPANY_BY_OFFICE = "findAllExpenseCompanyByOffice"; + String QUERY_FIND_ALL_EXPENSE_COMPANY_BY_OFFICE_BETWEEN_DATES = "findAllExpenseCompanyByOfficeBetweenDates"; + String QUERY_UPDATE_EXPENSE_COMPANY_BY_STATUS = "updateExpenseCompanyByStatus"; + + String FIELD_OFFICE = "office"; + String FIELD_ACTIVE_STATUS = "activeStatus"; + String FIELD_EXPENSE_COMPANY_TYPE = "expenseCompanyType"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/GoalCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/GoalCfg.java new file mode 100644 index 0000000..c19f302 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/GoalCfg.java @@ -0,0 +1,24 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface GoalCfg extends GenericCfg { + + String QUERY_FIND_ALL_GOALS_BY_OFFICE = "findAllGoalsByOffice"; + String QUERY_FIND_ALL_GOALS_BY_OFFICE_BETWEEN_DATES = "findAllGoalsByOfficeBetweenDates"; + String QUERY_UPDATE_GOAL_BY_STATUS = "updateGoalByStatus"; + + String FIELD_OFFICE = "office"; + String FIELD_ACTIVE_STATUS = "activeStatus"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/MoneyDailyCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/MoneyDailyCfg.java new file mode 100644 index 0000000..dab506d --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/MoneyDailyCfg.java @@ -0,0 +1,25 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface MoneyDailyCfg extends GenericCfg { + + String QUERY_FIND_ALL_MONEY_DAILY_BY_OFFICE = "findAllMoneyDailyByOffice"; + String QUERY_FIND_ALL_MONEY_DAILY_BY_OFFICE_BETWEEN_DATES = "findAllMoneyDailyByOfficeBetweenDates"; + String QUERY_FIND_ALL_MONEY_DAILY_BY_OFFICE_BETWEEN_DATES_USER = "findAllMoneyDailyByOfficeBetweenDatesUser"; + + String FIELD_OFFICE = "office"; + String FIELD_USER = "user"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/OtherExpenseCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/OtherExpenseCfg.java new file mode 100644 index 0000000..d44e5d6 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/OtherExpenseCfg.java @@ -0,0 +1,25 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface OtherExpenseCfg extends GenericCfg { + + String QUERY_FIND_ALL_OTHER_EXPENSE_BY_OFFICE = "findAllOtherExpensesByOffice"; + String QUERY_FIND_ALL_OTHER_EXPENSE_BY_OFFICE_BETWEEN_DATES = "findAllOtherExpensesByOfficeBetweenDates"; + String QUERY_FIND_ALL_OTHER_EXPENSE_BY_OFFICE_BETWEEN_DATES_USER = "findAllOtherExpensesByOfficeBetweenDatesUser"; + + String FIELD_OFFICE = "office"; + String FIELD_USER = "user"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/StableGeneralBoxCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/StableGeneralBoxCfg.java new file mode 100644 index 0000000..db41be2 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/StableGeneralBoxCfg.java @@ -0,0 +1,34 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface StableGeneralBoxCfg extends GenericCfg { + + String QUERY_FIND_ALL_STABLE_GENERAL_BOX_BY_OFFICE = "findAllStableGeneralBoxByOffice"; + String QUERY_FIND_ALL_STABLE_GENERAL_BOX_BY_OFFICE_BETWEEN_DATES = "findAllStableGeneralBoxByOfficeBetweenDates"; + String QUERY_UPDATE_STABLE_GENERAL_BOX_BY_STATUS = "updateStableGeneralBoxByStatus"; + String QUERY_COUNT_STABLE_GENERAL_BOX_BY_OFFICE_AND_DATE = "countStableGeneralBoxByOfficeAndDate"; + String QUERY_COUNT_STABLE_GENERAL_BOX_BY_OFFICE_EQUALS_TO_CURRENT_DATE = "countStableGeneralBoxByOfficeEqualsToCurrentDate"; + + String QUERY_MAX_STABLE_GENERAL_BOX_BY_OFFICE = "verifyStableGeneralBoxCreatedByOffice"; + String QUERY_MAX_CLOSING_DAY_BY_OFFICE = "verifyClosingDayCreatedByOffice"; + + String QUERY_SUM_PENDING_CLOSING_BY_OFFICE = "sumAdvancesUserDailyByOffice"; + + String FIELD_OFFICE = "office"; + String FIELD_OFFICE_VIEW = "idOffice"; + String FIELD_ACTIVE_STATUS = "activeStatus"; + String FIELD_CREATEDON = "createdOn"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/StableSmallBoxCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/StableSmallBoxCfg.java new file mode 100644 index 0000000..159217f --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/StableSmallBoxCfg.java @@ -0,0 +1,32 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface StableSmallBoxCfg extends GenericCfg { + + String QUERY_FIND_ALL_STABLE_SMALL_BOX_BY_OFFICE = "findAllStableSmallBoxByOffice"; + String QUERY_FIND_ALL_STABLE_SMALL_BOX_BY_OFFICE_BETWEEN_DATES = "findAllStableSmallBoxByOfficeBetweenDates"; + String QUERY_UPDATE_STABLE_SMALL_BOX_BY_STATUS = "updateStableSmallBoxByStatus"; + String QUERY_COUNT_STABLE_SMALL_BOX_BY_OFFICE_AND_DATE = "countStableSmallBoxByOfficeAndDate"; + String QUERY_COUNT_STABLE_SMALL_BOX_BY_OFFICE_EQUALS_TO_CURDATE = "countStableSmallBoxByOfficeEqualsToCurrentDate"; + String QUERY_FIND_STABLE_SMALL_BOX_BY_OFFICE_EQUALS_TO_CURRENT_DATE = "findStableSmallBoxByOfficeEqualsToCurrrentDate"; + + String QUERY_SUM_PENDING_CLOSING_BY_OFFICE = "sumAdvancesUserDailyByOffice"; + + String FIELD_OFFICE = "office"; + String FIELD_OFFICE_VIEW = "idOffice"; + String FIELD_ACTIVE_STATUS = "activeStatus"; + String FIELD_CREATEDON = "createdOn"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/TransferCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/TransferCfg.java new file mode 100644 index 0000000..362c39d --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/admin/constance/TransferCfg.java @@ -0,0 +1,31 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.admin.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface TransferCfg extends GenericCfg { + + String QUERY_FIND_ALL_TRANFERS_BY_OFFICE = "findAllTransferByOffice"; + String QUERY_FIND_ALL_TRANFERS_BY_OFFICE_BETWEEN_DATES = "findAllTransferByOfficeBetweenDates"; + String QUERY_FIND_ALL_TRANFERS_BY_USER_TRANSMITTER = "findAllTransferByUserTransmitter"; + String QUERY_FIND_ALL_TRANFERS_BY_USER_RECEIVER = "findAllTransferByUserReceiver"; + String QUERY_UPDATE_TRANSFER_BY_ACTION = "updateTransferByAction"; + String QUERY_UPDATE_TRANSFER_BY_ACTIVE_STATUS = "updateTransferByActive"; + String QUERY_FIND_ALL_TRANSFER_BY_USER_ID_AND_CURDATE = "findAllTransferByUserIdAndCurdate"; + + String FIELD_USER_TRANSMITTER = "userTransmitter"; + String FIELD_USER_RECEIVER = "userReceiver"; + String FIELD_OFFICE = "office"; + String FIELD_ACTION_STATUS = "actionStatus"; + String FIELD_ACTIVE_STATUS = "activeStatus"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/catalog/HumanResourceHasRoute.java b/apc-model/src/main/java/com/arrebol/apc/model/catalog/HumanResourceHasRoute.java new file mode 100644 index 0000000..d1ed3ab --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/catalog/HumanResourceHasRoute.java @@ -0,0 +1,172 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.catalog; + +import com.arrebol.apc.model.core.HumanResource; +import java.io.Serializable; +import java.util.Date; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_HUMAN_RESOURCE_HAS_ROUTE") +public class HumanResourceHasRoute implements Serializable { + + private static final long serialVersionUID = -8746549036588217517L; + + @EmbeddedId + private HumanResourceHasRouteId id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn( + name = "id_human_resource", + referencedColumnName = "id", + insertable = false, + updatable = false + ) + private HumanResource humanResource; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn( + name = "id_route", + referencedColumnName = "id", + insertable = false, + updatable = false + ) + private RouteCtlg routeCtlg; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + public HumanResourceHasRoute() { + } + + /** + * + * @param id + */ + public HumanResourceHasRoute(HumanResourceHasRouteId id) { + this.id = id; + } + + /** + * + * @param id + * @param createdBy + */ + public HumanResourceHasRoute(HumanResourceHasRouteId id, String createdBy) { + this.id = id; + this.createdBy = createdBy; + createdOn = new Date(); + } + + public HumanResourceHasRouteId getId() { + return id; + } + + public void setId(HumanResourceHasRouteId id) { + this.id = id; + } + + public HumanResource getHumanResource() { + return humanResource; + } + + public void setHumanResource(HumanResource humanResource) { + this.humanResource = humanResource; + } + + public RouteCtlg getRouteCtlg() { + return routeCtlg; + } + + public void setRouteCtlg(RouteCtlg routeCtlg) { + this.routeCtlg = routeCtlg; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + @Override + public int hashCode() { + int hash = 3; + hash = 71 * hash + Objects.hashCode(this.id); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final HumanResourceHasRoute other = (HumanResourceHasRoute) obj; + if (!Objects.equals(this.id, other.id)) { + return false; + } + return true; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/catalog/HumanResourceHasRouteId.java b/apc-model/src/main/java/com/arrebol/apc/model/catalog/HumanResourceHasRouteId.java new file mode 100644 index 0000000..9237e89 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/catalog/HumanResourceHasRouteId.java @@ -0,0 +1,88 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.catalog; + +import java.io.Serializable; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Embeddable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Embeddable +public class HumanResourceHasRouteId implements Serializable { + + private static final long serialVersionUID = -2805382610552215637L; + + @Column(name = "id_human_resource", length = 36, nullable = true) + private String idHumanResource; + + @Column(name = "id_route", length = 36, nullable = true) + private String idRoute; + + public HumanResourceHasRouteId() { + } + + /** + * + * @param idHumanResource + * @param idRoute + */ + public HumanResourceHasRouteId(String idHumanResource, String idRoute) { + this.idHumanResource = idHumanResource; + this.idRoute = idRoute; + } + + public String getIdHumanResource() { + return idHumanResource; + } + + public void setIdHumanResource(String idHumanResource) { + this.idHumanResource = idHumanResource; + } + + public String getIdRoute() { + return idRoute; + } + + public void setIdRoute(String idRoute) { + this.idRoute = idRoute; + } + + @Override + public int hashCode() { + int hash = 5; + hash = 17 * hash + Objects.hashCode(this.idHumanResource); + hash = 17 * hash + Objects.hashCode(this.idRoute); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final HumanResourceHasRouteId other = (HumanResourceHasRouteId) obj; + if (!Objects.equals(this.idHumanResource, other.idHumanResource)) { + return false; + } + if (!Objects.equals(this.idRoute, other.idRoute)) { + return false; + } + return true; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/catalog/MovimientosInventario.java b/apc-model/src/main/java/com/arrebol/apc/model/catalog/MovimientosInventario.java new file mode 100644 index 0000000..3941a03 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/catalog/MovimientosInventario.java @@ -0,0 +1,188 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.arrebol.apc.model.catalog; + +import com.arrebol.apc.model.enums.GenericEnumType; +import com.arrebol.apc.model.enums.TipoMovimiento; +import com.arrebol.apc.model.loan.LoanType; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Oscar + */ +@Entity +@Table(name = "APC_MOVIMIENTOS_INVENTARIO") +public class MovimientosInventario implements Serializable { + + private static final long serialVersionUID = -3628564854853325265L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_loan_type", + referencedColumnName = "id", + nullable = false + ) + private LoanType loanType; + + @Column(name = "tipo", length = 10) + @Enumerated(EnumType.STRING) + private TipoMovimiento tipo; + + @Column(name = "cantidad_movimiento", nullable = false) + private BigDecimal cantidadMovimiento; + + @Column(name = "inventario_antiguo", nullable = false) + private BigDecimal inventarioAntiguo; + + @Column(name = "inventario_nuevo", nullable = false) + private BigDecimal inventarioNuevo; + + @Column(name = "comentario", nullable = false) + private String comentario; + + @Enumerated(EnumType.STRING) + @Column(name = "estatus_activo", nullable = false) + private GenericEnumType estatusActivo; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + public MovimientosInventario(String id) { + this.id = id; + } + + public MovimientosInventario() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public LoanType getLoanType() { + return loanType; + } + + public void setLoanType(LoanType loanType) { + this.loanType = loanType; + } + + public TipoMovimiento getTipo() { + return tipo; + } + + public void setTipo(TipoMovimiento tipo) { + this.tipo = tipo; + } + + public BigDecimal getCantidadMovimiento() { + return cantidadMovimiento; + } + + public void setCantidadMovimiento(BigDecimal cantidadMovimiento) { + this.cantidadMovimiento = cantidadMovimiento; + } + + public BigDecimal getInventarioAntiguo() { + return inventarioAntiguo; + } + + public void setInventarioAntiguo(BigDecimal inventarioAntiguo) { + this.inventarioAntiguo = inventarioAntiguo; + } + + public BigDecimal getInventarioNuevo() { + return inventarioNuevo; + } + + public void setInventarioNuevo(BigDecimal inventarioNuevo) { + this.inventarioNuevo = inventarioNuevo; + } + + public String getComentario() { + return comentario; + } + + public void setComentario(String comentario) { + this.comentario = comentario; + } + + public GenericEnumType getEstatusActivo() { + return estatusActivo; + } + + public void setEstatusActivo(GenericEnumType estatusActivo) { + this.estatusActivo = estatusActivo; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/catalog/People.java b/apc-model/src/main/java/com/arrebol/apc/model/catalog/People.java new file mode 100644 index 0000000..739035a --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/catalog/People.java @@ -0,0 +1,1212 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.catalog; + +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.CustomerClassification; +import com.arrebol.apc.model.enums.FormaPago; +import com.arrebol.apc.model.enums.LugarDeCobro; +import com.arrebol.apc.model.enums.PeopleType; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.ws.parsed.PersonJaxb; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_PEOPLE") +public class People implements Serializable { + + private static final long serialVersionUID = -3628564854853325265L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "first_name", length = 25, nullable = false) + private String firstName; + + @Column(name = "second_name", length = 25) + private String secondName; + + @Column(name = "last_name", length = 25, nullable = false) + private String lastName; + + @Column(name = "middle_name", length = 25, nullable = false) + private String middleName; + + @Temporal(TemporalType.DATE) + @Column(name = "birthdate") + private Date birthdate; + + @Column(name = "thumbnail", length = 250, nullable = false) + private String thumbnail; + + @Column(name = "phone_home", length = 15, nullable = false) + private String phoneHome; + + @Column(name = "address_home", length = 150, nullable = false) + private String addressHome; + + @Column(name = "phone_business", length = 15) + private String phoneBusiness; + + @Column(name = "address_business", length = 150) + private String addressBusiness; + + @Column(name = "company_name", length = 150) + private String companyName; + + @Enumerated(EnumType.STRING) + @Column(name = "people_type", nullable = false) + private PeopleType peopleType; + + @Enumerated(EnumType.STRING) + @Column(name = "active_status", nullable = false) + private ActiveStatus activeStatus; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_route", + referencedColumnName = "id", + nullable = false + ) + private RouteCtlg routeCtlg; + + @Column(name = "letra_cuenta", length = 10) + private String letraCuenta; + + @Column(name = "contrato", length = 50) + private String contrato; + + @Column(name = "celular_personal", length = 15) + private String personalCelular; + + @Column(name = "cruzamientos_personal", length = 150) + private String personalCruzamientos; + + @Column(name = "colonia_personal", length = 100) + private String personalColonia; + + @Column(name = "ciudad_personal", length = 100) + private String personalCiudad; + + @Column(name = "estado_personal", length = 100) + private String personalEstado; + + @Column(name = "codigo_postal_personal", length = 10) + private String personalCodigoPostal; + + @Column(name = "email_personal", length = 150) + private String personalEmail; + + @Column(name = "edad_personal") + private Integer personalEdad; + + @Column(name = "celular_negocio", length = 15) + private String negocioCelular; + + @Column(name = "cruzamientos_negocio", length = 150) + private String negocioCruzamientos; + + @Column(name = "colonia_negocio", length = 100) + private String negocioColonia; + + @Column(name = "ciudad_negocio", length = 100) + private String negocioCiudad; + + @Column(name = "estado_negocio", length = 100) + private String negocioEstado; + + @Column(name = "codigo_postal_negocio", length = 10) + private String negocioCodigoPostal; + + @Column(name = "email_negocio", length = 150) + private String negocioEmail; + + // Datos fachada + @Column(name = "fachada_color_fachada", length = 255) + private String fachadaColorFachada; + + @Column(name = "fachada_decision_fachada", length = 255) + private String fachadaDecisionFachada; + + @Column(name = "fachada_descripcion_puerta", length = 255) + private String fachadaDescripcionPuerta; + + @Column(name = "fachada_descripcion_ventanas", length = 255) + private String fachadaDescripcionVentanas; + + @Column(name = "fachada_frente_numero", length = 255) + private String fachadaFrenteNumero; + + @Column(name = "fachada_entre_numero_1") + private Integer fachadaEntreNumero1; + + @Column(name = "fachada_entre_numero_2") + private Integer fachadaEntreNumero2; + + @Column(name = "fachada_senas_vivienda", length = 255) + private String fachadaSenasVivienda; + + @Column(name = "fachada_observaciones_para_cobrador", length = 255) + private String fachadaObservacionesParaCobrador; + + // Datos trabajo + @Column(name = "trabajo", length = 255) + private String trabajo; + + @Column(name = "trabajo_domicilio", length = 255) + private String trabajoDomicilio; + + @Column(name = "trabajo_cruzamientos", length = 255) + private String trabajoCruzamientos; + + @Column(name = "trabajo_colonia", length = 255) + private String trabajoColonia; + + @Column(name = "trabajo_ciudad", length = 255) + private String trabajoCiudad; + + @Column(name = "trabajo_estado", length = 255) + private String trabajoEstado; + + @Column(name = "trabajo_codigo_postal") + private Integer trabajoCodigoPostal; + + @Column(name = "trabajo_turno", length = 255) + private String trabajoTurno; + + @Column(name = "trabajo_departamento", length = 255) + private String trabajoDepartamento; + + @Column(name = "trabajo_telefono_1", length = 255) + private String trabajoTelefono1; + + @Column(name = "trabajo_telefono_extra_1", length = 255) + private String trabajoTelefonoExtra1; + + @Column(name = "trabajo_telefono_2", length = 255) + private String trabajoTelefono2; + + @Column(name = "trabajo_telefono_extra_2", length = 255) + private String trabajoTelefonoExtra2; + + // Referencia 1 + @Column(name = "referencia_1_nombre", length = 255) + private String referencia1Nombre; + + @Column(name = "referencia_1_referencia_1_domicilio", length = 255) + private String referencia1Domicilio; + + @Column(name = "referencia_1_cruzamientos", length = 255) + private String referencia1Cruzamientos; + + @Column(name = "referencia_1_colonia", length = 255) + private String referencia1Colonia; + + @Column(name = "referencia_1_ciudad", length = 255) + private String referencia1Ciudad; + + @Column(name = "referencia_1_estado", length = 255) + private String referencia1Estado; + + @Column(name = "referencia_1_codigo_postal") + private Integer referencia1CodigoPostal; + + @Column(name = "referencia_1_telefono_particular", length = 255) + private String referencia1TelefonoParticular; + + @Column(name = "referencia_1_celular_particular", length = 255) + private String referencia1CelularParticular; + + @Column(name = "referencia_1_telefono_trabajo", length = 255) + private String referencia1TelefonoTrabajo; + + @Column(name = "referencia_1_extra_telefono_trabajo", length = 255) + private String referencia1ExtraTelefonoTrabajo; + + @Column(name = "referencia_1_parentesco", length = 255) + private String referencia1Parentesco; + + // Referencia 2 + @Column(name = "referencia_2_nombre", length = 255) + private String referencia2Nombre; + + @Column(name = "referencia_2_referencia_domicilio", length = 255) + private String referencia2Domicilio; + + @Column(name = "referencia_2_cruzamientos", length = 255) + private String referencia2Cruzamientos; + + @Column(name = "referencia_2_colonia", length = 255) + private String referencia2Colonia; + + @Column(name = "referencia_2_ciudad", length = 255) + private String referencia2Ciudad; + + @Column(name = "referencia_2_estado", length = 255) + private String referencia2Estado; + + @Column(name = "referencia_2_codigo_postal") + private Integer referencia2CodigoPostal; + + @Column(name = "referencia_2_telefono_particular", length = 255) + private String referencia2TelefonoParticular; + + @Column(name = "referencia_2_celular_particular", length = 255) + private String referencia2CelularParticular; + + @Column(name = "referencia_2_telefono_trabajo", length = 255) + private String referencia2TelefonoTrabajo; + + @Column(name = "referencia_2_extra_telefono_trabajo", length = 255) + private String referencia2ExtraTelefonoTrabajo; + + @Column(name = "referencia_2_parentesco", length = 255) + private String referencia2Parentesco; + + // Datos crédito + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "datos_credito_fecha_compra", length = 19) + private Date datosCreditoFechaCompra; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "datos_credito_primer_pago", length = 19) + private Date datosCreditoPrimerPago; + + @Column(name = "datos_credito_entrega_en", length = 10) + @Enumerated(EnumType.STRING) + private LugarDeCobro datosCreditoEntradaEn; + + @Column(name = "datos_credito_cobrar_en", length = 10) + @Enumerated(EnumType.STRING) + private LugarDeCobro datosCreditoCobrarEn; + + @Column(name = "datos_credito_forma_pago", length = 10) + @Enumerated(EnumType.STRING) + private FormaPago datosCreditoFormaPago; + + @Column(name = "datos_credito_pagos_de") + private Double datosCreditoPagosDe; + + @Column(name = "datos_credito_numero_pagos") + private Integer datosCreditoNumeroPagos; + + @Column(name = "datos_credito_vendedor", length = 36) + private String datosCreditoVendedor; + + @Column(name = "datos_credito_investigador", length = 36) + private String datosCreditoInvestigador; + + @Column(name = "datos_credito_asignado", length = 36) + private String datosCreditoAsignado; + + @Column(name = "datos_credito_zona") + private Integer datosCreditoZona; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + @Enumerated(EnumType.STRING) + @Column(name = "classification", nullable = false) + private CustomerClassification classification; + + @OneToMany( + mappedBy = "customer", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List customerLoans; + + @OneToMany( + mappedBy = "endorsement", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List endorsementLoans; + + public People() { + } + + public People(String id) { + this.id = id; + } + + /** + * + * @param jaxb + * @param isCustomer + * @param officeId + * @param userId + * @param routeId + */ + public People(PersonJaxb jaxb, boolean isCustomer, String officeId, String userId, String routeId) { + this.firstName = jaxb.getFirstName(); + this.secondName = jaxb.getSecondName(); + this.lastName = jaxb.getLastName(); + this.middleName = jaxb.getMiddleName(); + this.phoneHome = jaxb.getPhoneHome(); + this.addressHome = jaxb.getAddressHome(); + + if (isCustomer) { + this.phoneBusiness = jaxb.getPhoneWork(); + this.addressBusiness = jaxb.getAddressWork(); + this.companyName = jaxb.getCompanyName(); + this.peopleType = PeopleType.CUSTOMER; + } else { + this.peopleType = PeopleType.ENDORSEMENT; + } + + this.activeStatus = ActiveStatus.ENEBLED; + this.office = new Office(officeId); + this.routeCtlg = new RouteCtlg(routeId); + this.thumbnail = jaxb.getThumbnail(); + this.createdBy = userId; + this.createdOn = new Date(); + this.classification = CustomerClassification.WHITE; + + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getSecondName() { + return secondName; + } + + public void setSecondName(String secondName) { + this.secondName = secondName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getMiddleName() { + return middleName; + } + + public void setMiddleName(String middleName) { + this.middleName = middleName; + } + + public Date getBirthdate() { + return birthdate; + } + + public void setBirthdate(Date birthdate) { + this.birthdate = birthdate; + } + + public String getThumbnail() { + return thumbnail; + } + + public void setThumbnail(String thumbnail) { + this.thumbnail = thumbnail; + } + + public String getPhoneHome() { + return phoneHome; + } + + public void setPhoneHome(String phoneHome) { + this.phoneHome = phoneHome; + } + + public String getAddressHome() { + return addressHome; + } + + public void setAddressHome(String addressHome) { + this.addressHome = addressHome; + } + + public String getPhoneBusiness() { + return phoneBusiness; + } + + public void setPhoneBusiness(String phoneBusiness) { + this.phoneBusiness = phoneBusiness; + } + + public String getAddressBusiness() { + return addressBusiness; + } + + public void setAddressBusiness(String addressBusiness) { + this.addressBusiness = addressBusiness; + } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public PeopleType getPeopleType() { + return peopleType; + } + + public void setPeopleType(PeopleType peopleType) { + this.peopleType = peopleType; + } + + public ActiveStatus getActiveStatus() { + return activeStatus; + } + + public void setActiveStatus(ActiveStatus activeStatus) { + this.activeStatus = activeStatus; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public RouteCtlg getRouteCtlg() { + return routeCtlg; + } + + public void setRouteCtlg(RouteCtlg routeCtlg) { + this.routeCtlg = routeCtlg; + } + + public String getLetraCuenta() { + return letraCuenta; + } + + public void setLetraCuenta(String letraCuenta) { + this.letraCuenta = letraCuenta; + } + + public String getContrato() { + return contrato; + } + + public void setContrato(String contrato) { + this.contrato = contrato; + } + + public String getPersonalCelular() { + return personalCelular; + } + + public void setPersonalCelular(String personalCelular) { + this.personalCelular = personalCelular; + } + + public String getPersonalCruzamientos() { + return personalCruzamientos; + } + + public void setPersonalCruzamientos(String personalCruzamientos) { + this.personalCruzamientos = personalCruzamientos; + } + + public String getPersonalColonia() { + return personalColonia; + } + + public void setPersonalColonia(String personalColonia) { + this.personalColonia = personalColonia; + } + + public String getPersonalCiudad() { + return personalCiudad; + } + + public void setPersonalCiudad(String personalCiudad) { + this.personalCiudad = personalCiudad; + } + + public String getPersonalEstado() { + return personalEstado; + } + + public void setPersonalEstado(String personalEstado) { + this.personalEstado = personalEstado; + } + + public String getPersonalCodigoPostal() { + return personalCodigoPostal; + } + + public void setPersonalCodigoPostal(String personalCodigoPostal) { + this.personalCodigoPostal = personalCodigoPostal; + } + + public String getPersonalEmail() { + return personalEmail; + } + + public void setPersonalEmail(String personalEmail) { + this.personalEmail = personalEmail; + } + + public Integer getPersonalEdad() { + return personalEdad; + } + + public void setPersonalEdad(Integer personalEdad) { + this.personalEdad = personalEdad; + } + + public String getNegocioCelular() { + return negocioCelular; + } + + public void setNegocioCelular(String negocioCelular) { + this.negocioCelular = negocioCelular; + } + + public String getNegocioCruzamientos() { + return negocioCruzamientos; + } + + public void setNegocioCruzamientos(String negocioCruzamientos) { + this.negocioCruzamientos = negocioCruzamientos; + } + + public String getNegocioColonia() { + return negocioColonia; + } + + public void setNegocioColonia(String negocioColonia) { + this.negocioColonia = negocioColonia; + } + + public String getNegocioCiudad() { + return negocioCiudad; + } + + public void setNegocioCiudad(String negocioCiudad) { + this.negocioCiudad = negocioCiudad; + } + + public String getNegocioEstado() { + return negocioEstado; + } + + public void setNegocioEstado(String negocioEstado) { + this.negocioEstado = negocioEstado; + } + + public String getNegocioCodigoPostal() { + return negocioCodigoPostal; + } + + public void setNegocioCodigoPostal(String negocioCodigoPostal) { + this.negocioCodigoPostal = negocioCodigoPostal; + } + + public String getNegocioEmail() { + return negocioEmail; + } + + public void setNegocioEmail(String negocioEmail) { + this.negocioEmail = negocioEmail; + } + + public String getFachadaColorFachada() { + return fachadaColorFachada; + } + + public void setFachadaColorFachada(String fachadaColorFachada) { + this.fachadaColorFachada = fachadaColorFachada; + } + + public String getFachadaDecisionFachada() { + return fachadaDecisionFachada; + } + + public void setFachadaDecisionFachada(String fachadaDecisionFachada) { + this.fachadaDecisionFachada = fachadaDecisionFachada; + } + + public String getFachadaDescripcionPuerta() { + return fachadaDescripcionPuerta; + } + + public void setFachadaDescripcionPuerta(String fachadaDescripcionPuerta) { + this.fachadaDescripcionPuerta = fachadaDescripcionPuerta; + } + + public String getFachadaDescripcionVentanas() { + return fachadaDescripcionVentanas; + } + + public void setFachadaDescripcionVentanas(String fachadaDescripcionVentanas) { + this.fachadaDescripcionVentanas = fachadaDescripcionVentanas; + } + + public String getFachadaFrenteNumero() { + return fachadaFrenteNumero; + } + + public void setFachadaFrenteNumero(String fachadaFrenteNumero) { + this.fachadaFrenteNumero = fachadaFrenteNumero; + } + + public Integer getFachadaEntreNumero1() { + return fachadaEntreNumero1; + } + + public void setFachadaEntreNumero1(Integer fachadaEntreNumero1) { + this.fachadaEntreNumero1 = fachadaEntreNumero1; + } + + public Integer getFachadaEntreNumero2() { + return fachadaEntreNumero2; + } + + public void setFachadaEntreNumero2(Integer fachadaEntreNumero2) { + this.fachadaEntreNumero2 = fachadaEntreNumero2; + } + + public String getFachadaSenasVivienda() { + return fachadaSenasVivienda; + } + + public void setFachadaSenasVivienda(String fachadaSenasVivienda) { + this.fachadaSenasVivienda = fachadaSenasVivienda; + } + + public String getFachadaObservacionesParaCobrador() { + return fachadaObservacionesParaCobrador; + } + + public void setFachadaObservacionesParaCobrador(String fachadaObservacionesParaCobrador) { + this.fachadaObservacionesParaCobrador = fachadaObservacionesParaCobrador; + } + + public String getTrabajo() { + return trabajo; + } + + public void setTrabajo(String trabajo) { + this.trabajo = trabajo; + } + + public String getTrabajoDomicilio() { + return trabajoDomicilio; + } + + public void setTrabajoDomicilio(String trabajoDomicilio) { + this.trabajoDomicilio = trabajoDomicilio; + } + + public String getTrabajoCruzamientos() { + return trabajoCruzamientos; + } + + public void setTrabajoCruzamientos(String trabajoCruzamientos) { + this.trabajoCruzamientos = trabajoCruzamientos; + } + + public String getTrabajoColonia() { + return trabajoColonia; + } + + public void setTrabajoColonia(String trabajoColonia) { + this.trabajoColonia = trabajoColonia; + } + + public String getTrabajoCiudad() { + return trabajoCiudad; + } + + public void setTrabajoCiudad(String trabajoCiudad) { + this.trabajoCiudad = trabajoCiudad; + } + + public String getTrabajoEstado() { + return trabajoEstado; + } + + public void setTrabajoEstado(String trabajoEstado) { + this.trabajoEstado = trabajoEstado; + } + + public Integer getTrabajoCodigoPostal() { + return trabajoCodigoPostal; + } + + public void setTrabajoCodigoPostal(Integer trabajoCodigoPostal) { + this.trabajoCodigoPostal = trabajoCodigoPostal; + } + + public String getTrabajoTurno() { + return trabajoTurno; + } + + public void setTrabajoTurno(String trabajoTurno) { + this.trabajoTurno = trabajoTurno; + } + + public String getTrabajoDepartamento() { + return trabajoDepartamento; + } + + public void setTrabajoDepartamento(String trabajoDepartamento) { + this.trabajoDepartamento = trabajoDepartamento; + } + + public String getTrabajoTelefono1() { + return trabajoTelefono1; + } + + public void setTrabajoTelefono1(String trabajoTelefono1) { + this.trabajoTelefono1 = trabajoTelefono1; + } + + public String getTrabajoTelefonoExtra1() { + return trabajoTelefonoExtra1; + } + + public void setTrabajoTelefonoExtra1(String trabajoTelefonoExtra1) { + this.trabajoTelefonoExtra1 = trabajoTelefonoExtra1; + } + + public String getTrabajoTelefono2() { + return trabajoTelefono2; + } + + public void setTrabajoTelefono2(String trabajoTelefono2) { + this.trabajoTelefono2 = trabajoTelefono2; + } + + public String getTrabajoTelefonoExtra2() { + return trabajoTelefonoExtra2; + } + + public void setTrabajoTelefonoExtra2(String trabajoTelefonoExtra2) { + this.trabajoTelefonoExtra2 = trabajoTelefonoExtra2; + } + + public String getReferencia1Nombre() { + return referencia1Nombre; + } + + public void setReferencia1Nombre(String referencia1Nombre) { + this.referencia1Nombre = referencia1Nombre; + } + + public String getReferencia1Domicilio() { + return referencia1Domicilio; + } + + public void setReferencia1Domicilio(String referencia1Domicilio) { + this.referencia1Domicilio = referencia1Domicilio; + } + + public String getReferencia1Cruzamientos() { + return referencia1Cruzamientos; + } + + public void setReferencia1Cruzamientos(String referencia1Cruzamientos) { + this.referencia1Cruzamientos = referencia1Cruzamientos; + } + + public String getReferencia1Colonia() { + return referencia1Colonia; + } + + public void setReferencia1Colonia(String referencia1Colonia) { + this.referencia1Colonia = referencia1Colonia; + } + + public String getReferencia1Ciudad() { + return referencia1Ciudad; + } + + public void setReferencia1Ciudad(String referencia1Ciudad) { + this.referencia1Ciudad = referencia1Ciudad; + } + + public String getReferencia1Estado() { + return referencia1Estado; + } + + public void setReferencia1Estado(String referencia1Estado) { + this.referencia1Estado = referencia1Estado; + } + + public Integer getReferencia1CodigoPostal() { + return referencia1CodigoPostal; + } + + public void setReferencia1CodigoPostal(Integer referencia1CodigoPostal) { + this.referencia1CodigoPostal = referencia1CodigoPostal; + } + + public String getReferencia1TelefonoParticular() { + return referencia1TelefonoParticular; + } + + public void setReferencia1TelefonoParticular(String referencia1TelefonoParticular) { + this.referencia1TelefonoParticular = referencia1TelefonoParticular; + } + + public String getReferencia1CelularParticular() { + return referencia1CelularParticular; + } + + public void setReferencia1CelularParticular(String referencia1CelularParticular) { + this.referencia1CelularParticular = referencia1CelularParticular; + } + + public String getReferencia1TelefonoTrabajo() { + return referencia1TelefonoTrabajo; + } + + public void setReferencia1TelefonoTrabajo(String referencia1TelefonoTrabajo) { + this.referencia1TelefonoTrabajo = referencia1TelefonoTrabajo; + } + + public String getReferencia1ExtraTelefonoTrabajo() { + return referencia1ExtraTelefonoTrabajo; + } + + public void setReferencia1ExtraTelefonoTrabajo(String referencia1ExtraTelefonoTrabajo) { + this.referencia1ExtraTelefonoTrabajo = referencia1ExtraTelefonoTrabajo; + } + + public String getReferencia1Parentesco() { + return referencia1Parentesco; + } + + public void setReferencia1Parentesco(String referencia1Parentesco) { + this.referencia1Parentesco = referencia1Parentesco; + } + + public String getReferencia2Nombre() { + return referencia2Nombre; + } + + public void setReferencia2Nombre(String referencia2Nombre) { + this.referencia2Nombre = referencia2Nombre; + } + + public String getReferencia2Domicilio() { + return referencia2Domicilio; + } + + public void setReferencia2Domicilio(String referencia2Domicilio) { + this.referencia2Domicilio = referencia2Domicilio; + } + + public String getReferencia2Cruzamientos() { + return referencia2Cruzamientos; + } + + public void setReferencia2Cruzamientos(String referencia2Cruzamientos) { + this.referencia2Cruzamientos = referencia2Cruzamientos; + } + + public String getReferencia2Colonia() { + return referencia2Colonia; + } + + public void setReferencia2Colonia(String referencia2Colonia) { + this.referencia2Colonia = referencia2Colonia; + } + + public String getReferencia2Ciudad() { + return referencia2Ciudad; + } + + public void setReferencia2Ciudad(String referencia2Ciudad) { + this.referencia2Ciudad = referencia2Ciudad; + } + + public String getReferencia2Estado() { + return referencia2Estado; + } + + public void setReferencia2Estado(String referencia2Estado) { + this.referencia2Estado = referencia2Estado; + } + + public Integer getReferencia2CodigoPostal() { + return referencia2CodigoPostal; + } + + public void setReferencia2CodigoPostal(Integer referencia2CodigoPostal) { + this.referencia2CodigoPostal = referencia2CodigoPostal; + } + + public String getReferencia2TelefonoParticular() { + return referencia2TelefonoParticular; + } + + public void setReferencia2TelefonoParticular(String referencia2TelefonoParticular) { + this.referencia2TelefonoParticular = referencia2TelefonoParticular; + } + + public String getReferencia2CelularParticular() { + return referencia2CelularParticular; + } + + public void setReferencia2CelularParticular(String referencia2CelularParticular) { + this.referencia2CelularParticular = referencia2CelularParticular; + } + + public String getReferencia2TelefonoTrabajo() { + return referencia2TelefonoTrabajo; + } + + public void setReferencia2TelefonoTrabajo(String referencia2TelefonoTrabajo) { + this.referencia2TelefonoTrabajo = referencia2TelefonoTrabajo; + } + + public String getReferencia2ExtraTelefonoTrabajo() { + return referencia2ExtraTelefonoTrabajo; + } + + public void setReferencia2ExtraTelefonoTrabajo(String referencia2ExtraTelefonoTrabajo) { + this.referencia2ExtraTelefonoTrabajo = referencia2ExtraTelefonoTrabajo; + } + + public String getReferencia2Parentesco() { + return referencia2Parentesco; + } + + public void setReferencia2Parentesco(String referencia2Parentesco) { + this.referencia2Parentesco = referencia2Parentesco; + } + + public Date getDatosCreditoFechaCompra() { + return datosCreditoFechaCompra; + } + + public void setDatosCreditoFechaCompra(Date datosCreditoFechaCompra) { + this.datosCreditoFechaCompra = datosCreditoFechaCompra; + } + + public Date getDatosCreditoPrimerPago() { + return datosCreditoPrimerPago; + } + + public void setDatosCreditoPrimerPago(Date datosCreditoPrimerPago) { + this.datosCreditoPrimerPago = datosCreditoPrimerPago; + } + + public LugarDeCobro getDatosCreditoEntradaEn() { + return datosCreditoEntradaEn; + } + + public void setDatosCreditoEntradaEn(LugarDeCobro datosCreditoEntradaEn) { + this.datosCreditoEntradaEn = datosCreditoEntradaEn; + } + + public LugarDeCobro getDatosCreditoCobrarEn() { + return datosCreditoCobrarEn; + } + + public void setDatosCreditoCobrarEn(LugarDeCobro datosCreditoCobrarEn) { + this.datosCreditoCobrarEn = datosCreditoCobrarEn; + } + + public FormaPago getDatosCreditoFormaPago() { + return datosCreditoFormaPago; + } + + public void setDatosCreditoFormaPago(FormaPago datosCreditoFormaPago) { + this.datosCreditoFormaPago = datosCreditoFormaPago; + } + + public Double getDatosCreditoPagosDe() { + return datosCreditoPagosDe; + } + + public void setDatosCreditoPagosDe(Double datosCreditoPagosDe) { + this.datosCreditoPagosDe = datosCreditoPagosDe; + } + + public Integer getDatosCreditoNumeroPagos() { + return datosCreditoNumeroPagos; + } + + public void setDatosCreditoNumeroPagos(Integer datosCreditoNumeroPagos) { + this.datosCreditoNumeroPagos = datosCreditoNumeroPagos; + } + + public String getDatosCreditoVendedor() { + return datosCreditoVendedor; + } + + public void setDatosCreditoVendedor(String datosCreditoVendedor) { + this.datosCreditoVendedor = datosCreditoVendedor; + } + + public String getDatosCreditoInvestigador() { + return datosCreditoInvestigador; + } + + public void setDatosCreditoInvestigador(String datosCreditoInvestigador) { + this.datosCreditoInvestigador = datosCreditoInvestigador; + } + + public String getDatosCreditoAsignado() { + return datosCreditoAsignado; + } + + public void setDatosCreditoAsignado(String datosCreditoAsignado) { + this.datosCreditoAsignado = datosCreditoAsignado; + } + + public Integer getDatosCreditoZona() { + return datosCreditoZona; + } + + public void setDatosCreditoZona(Integer datosCreditoZona) { + this.datosCreditoZona = datosCreditoZona; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public List getCustomerLoans() { + return customerLoans; + } + + public void setCustomerLoans(List customerLoans) { + this.customerLoans = customerLoans; + } + + public List getEndorsementLoans() { + return endorsementLoans; + } + + public void setEndorsementLoans(List endorsementLoans) { + this.endorsementLoans = endorsementLoans; + } + + public Integer getTotalLoan() { + if (getCustomerLoans() != null) { + return getCustomerLoans().size(); + } else { + return 0; + } + } + + public CustomerClassification getClassification() { + return classification; + } + + public void setClassification(CustomerClassification classification) { + this.classification = classification; + } + + public String getFullName() { + String name = ""; + if (secondName == null || secondName.equalsIgnoreCase("null") || secondName.isEmpty()) { + return firstName.trim() + " " + lastName.trim() + " " + middleName.trim(); + } else { + return firstName.trim() + " " + secondName.trim() + " " + lastName.trim() + " " + middleName.trim(); + } + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/catalog/RoleCtlg.java b/apc-model/src/main/java/com/arrebol/apc/model/catalog/RoleCtlg.java new file mode 100644 index 0000000..99591e8 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/catalog/RoleCtlg.java @@ -0,0 +1,180 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.catalog; + +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.UniqueConstraint; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_ROLE", + uniqueConstraints = { + @UniqueConstraint(columnNames = {"role_name"}) + } +) +public class RoleCtlg implements Serializable { + + private static final long serialVersionUID = -7005571878079681478L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "role_name", length = 100, nullable = false) + private String role; + + @Enumerated(EnumType.STRING) + @Column(name = "active_status", nullable = false) + private ActiveStatus activeStatus; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + @OneToMany( + mappedBy = "roleCtlg", + fetch = FetchType.LAZY, + cascade = CascadeType.ALL, + orphanRemoval = true + ) + private List humanResources; + + public RoleCtlg() { + } + + public RoleCtlg(String id, String role) { + this.id = id; + this.role = role; + } + + public RoleCtlg(String id) { + this.id = id; + } + /** + * Complete constructor. + * + * @param id + * @param role + * @param activeStatus + * @param createdBy + * @param createdOn + * @param lastUpdatedBy + * @param lastUpdatedOn + */ + public RoleCtlg(String id, String role, ActiveStatus activeStatus, String createdBy, Date createdOn, String lastUpdatedBy, Date lastUpdatedOn) { + this.id = id; + this.role = role; + this.activeStatus = activeStatus; + this.createdBy = createdBy; + this.createdOn = createdOn; + this.lastUpdatedBy = lastUpdatedBy; + this.lastUpdatedOn = lastUpdatedOn; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + public ActiveStatus getActiveStatus() { + return activeStatus; + } + + public void setActiveStatus(ActiveStatus activeStatus) { + this.activeStatus = activeStatus; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public List getHumanResources() { + return humanResources; + } + + public void setHumanResources(List humanResources) { + this.humanResources = humanResources; + } + + @Override + public String toString() { + return "RoleCtlg{" + "role=" + role + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/catalog/RouteCtlg.java b/apc-model/src/main/java/com/arrebol/apc/model/catalog/RouteCtlg.java new file mode 100644 index 0000000..77392e5 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/catalog/RouteCtlg.java @@ -0,0 +1,262 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.catalog; + +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.gasoline.Gasoline; +import com.arrebol.apc.model.loan.Loan; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.UniqueConstraint; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_ROUTE", + uniqueConstraints = { + @UniqueConstraint(columnNames = {"id_office", "route_name"}, name = "apc_route_uk") + } +) +public class RouteCtlg implements Serializable { + + private static final long serialVersionUID = -903631618997045859L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Column(name = "route_name", length = 25, nullable = false) + private String route; + + @Enumerated(EnumType.STRING) + @Column(name = "active_status", nullable = false) + private ActiveStatus activeStatus; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + @OneToMany( + fetch = FetchType.LAZY, + mappedBy = "routeCtlg", + orphanRemoval = true, + cascade = CascadeType.ALL + ) + private List humanResourceHasRoutes; + + @OneToMany( + mappedBy = "office", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List peoples; + + @OneToMany( + mappedBy = "routeCtlg", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List loans; + + @OneToMany( + fetch = FetchType.LAZY, + mappedBy = "routeCtlg", + orphanRemoval = true, + cascade = CascadeType.ALL + ) + private List gasolines; + + public RouteCtlg() { + } + + /** + * + * @param id + */ + public RouteCtlg(String id) { + this.id = id; + } + + /** + * + * @param id + * @param route + */ + public RouteCtlg(String id, String route) { + this.id = id; + this.route = route; + } + + /** + * Complete constructor. + * + * @param id + * @param office + * @param route + * @param activeStatus + * @param createdBy + * @param createdOn + * @param lastUpdatedBy + * @param lastUpdatedOn + * @param humanResourceHasRoutes + */ + public RouteCtlg(String id, Office office, String route, ActiveStatus activeStatus, String createdBy, Date createdOn, String lastUpdatedBy, Date lastUpdatedOn, List humanResourceHasRoutes) { + this.id = id; + this.office = office; + this.route = route; + this.activeStatus = activeStatus; + this.createdBy = createdBy; + this.createdOn = createdOn; + this.lastUpdatedBy = lastUpdatedBy; + this.lastUpdatedOn = lastUpdatedOn; + this.humanResourceHasRoutes = humanResourceHasRoutes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public String getRoute() { + return route; + } + + public void setRoute(String route) { + this.route = route; + } + + public ActiveStatus getActiveStatus() { + return activeStatus; + } + + public void setActiveStatus(ActiveStatus activeStatus) { + this.activeStatus = activeStatus; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public List getHumanResourceHasRoutes() { + return humanResourceHasRoutes; + } + + public void setHumanResourceHasRoutes(List humanResourceHasRoutes) { + this.humanResourceHasRoutes = humanResourceHasRoutes; + } + + public List getPeoples() { + return peoples; + } + + public void setPeoples(List peoples) { + this.peoples = peoples; + } + + public List getLoans() { + return loans; + } + + public void setLoans(List loans) { + this.loans = loans; + } + + public List getGasolines() { + return gasolines; + } + + public void setGasolines(List gasolines) { + this.gasolines = gasolines; + } + + @Override + public String toString() { + return "RouteCtlg{" + "route=" + route + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/catalog/Vehicle.java b/apc-model/src/main/java/com/arrebol/apc/model/catalog/Vehicle.java new file mode 100644 index 0000000..3fabcf9 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/catalog/Vehicle.java @@ -0,0 +1,323 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.catalog; + +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author David Rodriguez + */ +@Entity +@Table(name = "APC_VEHICLES") +public class Vehicle implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_driver", length = 36) + private String idDriver; + + @Column(name = "license_plate") + private String licensePlate; + + @Column(name = "economic_number") + private String economicNumber; + + @Column(name = "serial_number") + private String serialNumber; + + @Column(name = "engine_number") + private String engineNumber; + + @Column(name = "mileage") + private BigDecimal mileage; + + @Column(name = "year") + private int year; + + @Column(name = "insurance_name") + private String insuranceName; + + @Column(name = "insurance_number") + private String insuranceNumber; + + @Column(name = "coverage_type") + private String coverageType; + + @Column(name = "colour") + private String colour; + + @Column(name = "model") + private String model; + + @Column(name = "gps") + private boolean gps; + + @Column(name = "gps_number") + private String gpsNumber; + + @Column(name = "comments") + private String comments; + + @Enumerated(EnumType.STRING) + @Column(name = "vehicle_status", nullable = false) + private ActiveStatus vehicleStatus; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + @Column(name = "type") + private String type; + + @Column(name = "brand") + private String brand; + + @OneToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_driver", + referencedColumnName = "id", + nullable = false, + insertable = false, + updatable = false + ) + private HumanResource humanResource; + + public HumanResource getHumanResource() { + return humanResource; + } + + public void setHumanResource(HumanResource humanResource) { + this.humanResource = humanResource; + } + + public String getBrand() { + return brand; + } + + public void setBrand(String brand) { + this.brand = brand; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdDriver() { + return idDriver; + } + + public void setIdDriver(String idDriver) { + this.idDriver = idDriver; + } + + public String getLicensePlate() { + return licensePlate; + } + + public void setLicensePlate(String licensePlate) { + this.licensePlate = licensePlate; + } + + public String getEconomicNumber() { + return economicNumber; + } + + public void setEconomicNumber(String economicNumber) { + this.economicNumber = economicNumber; + } + + public String getSerialNumber() { + return serialNumber; + } + + public void setSerialNumber(String serialNumber) { + this.serialNumber = serialNumber; + } + + public String getEngineNumber() { + return engineNumber; + } + + public void setEngineNumber(String engineNumber) { + this.engineNumber = engineNumber; + } + + public BigDecimal getMileage() { + return mileage; + } + + public void setMileage(BigDecimal mileage) { + this.mileage = mileage; + } + + public int getYear() { + return year; + } + + public void setYear(int year) { + this.year = year; + } + + public String getInsuranceName() { + return insuranceName; + } + + public void setInsuranceName(String insuranceName) { + this.insuranceName = insuranceName; + } + + public String getInsuranceNumber() { + return insuranceNumber; + } + + public void setInsuranceNumber(String insuranceNumber) { + this.insuranceNumber = insuranceNumber; + } + + public String getCoverageType() { + return coverageType; + } + + public void setCoverageType(String coverageType) { + this.coverageType = coverageType; + } + + public String getColour() { + return colour; + } + + public void setColour(String colour) { + this.colour = colour; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public boolean isGps() { + return gps; + } + + public void setGps(boolean gps) { + this.gps = gps; + } + + public String getGpsNumber() { + return gpsNumber; + } + + public void setGpsNumber(String gpsNumber) { + this.gpsNumber = gpsNumber; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public ActiveStatus getVehicleStatus() { + return vehicleStatus; + } + + public void setVehicleStatus(ActiveStatus vehicleStatus) { + this.vehicleStatus = vehicleStatus; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public String getDriver() { + String name = humanResource.getFirstName() + " " + humanResource.getLastName(); + return name; + } + + @Override + public String toString() { + return "Vehícle: "; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/catalog/constance/PeopleCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/catalog/constance/PeopleCfg.java new file mode 100644 index 0000000..4b19d05 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/catalog/constance/PeopleCfg.java @@ -0,0 +1,33 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.catalog.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface PeopleCfg extends GenericCfg { + + String UPDATE_PEOPLE_BY_STATUS = "updateByPeopleId"; + String UPDATE_PEOPLE_TYPE_BY_STATUS = "updateTypeByPeopleId"; + String UPDATE_ROUTE_BY_PEOPLE = "updateRouteByPeopleId"; + String UPDATE_PEOPLE_BY_CLASSIFICATION = "updateByPeopleClassification"; + String QUERY_FIND_ALL_CUSTOMER = "findAllCustomerPeople"; + String QUERY_FIND_ALL_ENDORSEMENT = "findAllEndorsementPeople"; + String QUERY_FIND_PEOPLE_BY_ID = "findPeopleById"; + String QUERY_UPDATE_PHONE_HOME_BY_PEOPLE_ID = "updatePhoneHomeByPeopleId"; + + String FIELD_PEOPLE_TYPE = "peopleType"; + String FIELD_ACTIVE_STATUS = "activeStatus"; + String FIELD_OFFICE = "office"; + String FIELD_ROUTE = "routeCtlg"; + String FIELD_CLASSIFICATION = "classification"; + String FIELD_PHONE_HOME = "phoneHome"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/catalog/constance/RoleCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/catalog/constance/RoleCfg.java new file mode 100644 index 0000000..816ea99 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/catalog/constance/RoleCfg.java @@ -0,0 +1,24 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.catalog.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface RoleCfg extends GenericCfg { + + String UPDATE_ROLE_BY_STATUS = "updateByRoleId"; + String QUERY_FIND_ALL_ROLES = "findAllRoles"; + + String FIELD_NAME = "role"; + String FIELD_ACTIVE_STATUS = "activeStatus"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/catalog/constance/RouteCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/catalog/constance/RouteCfg.java new file mode 100644 index 0000000..f3246e1 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/catalog/constance/RouteCfg.java @@ -0,0 +1,29 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.catalog.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface RouteCfg extends GenericCfg { + + String UPDATE_ROUTE_BY_STATUS = "updateByRouteId"; + String QUERY_FIND_ALL_ROUTES = "findAllRoutes"; + String QUERY_FIND_ROUTES_WITH_NO_CERTIFIER_USER = "findRoutesWithNoCertifierUser"; + String QUERY_FIND_ALL_ROUTES_BY_HRHR = "findAllRoutesByHRHR"; + String QUERY_FIND_ALL_NOT_ROUTES_BY_HRHR = "findAllNotRoutesByHRHR"; + String QUERY_FIND_ALL_AVAILABLES_ROUTES = "findAllAvailablesRoutes"; + + String FIELD_NAME = "route"; + String FIELD_ACTIVE_STATUS = "activeStatus"; + String FIELD_OFFICE = "office"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/HumanResource.java b/apc-model/src/main/java/com/arrebol/apc/model/core/HumanResource.java new file mode 100644 index 0000000..355978e --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/HumanResource.java @@ -0,0 +1,428 @@ +/* + * Arrebol Consultancy copyright + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core; + +import com.arrebol.apc.model.admin.Advance; +import com.arrebol.apc.model.admin.Bonus; +import com.arrebol.apc.model.catalog.HumanResourceHasRoute; +import com.arrebol.apc.model.catalog.RoleCtlg; +import com.arrebol.apc.model.enums.HumanResourceStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.OneToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_HUMAN_RESOURCE") +public class HumanResource implements Serializable { + + private static final long serialVersionUID = -7296859753095844932L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "first_name", length = 25, nullable = false) + private String firstName; + + @Column(name = "second_name", length = 25) + private String secondName; + + @Column(name = "last_name", length = 25, nullable = false) + private String lastName; + + @Column(name = "middle_name", length = 25, nullable = false) + private String middleName; + + @Temporal(TemporalType.DATE) + @Column(name = "birthdate") + private Date birthdate; + + @Column(name = "avatar", length = 150, nullable = false) + private String avatar; + + @Column(name = "curp", length = 20) + private String curp; + + @Column(name = "rfc", length = 13) + private String rfc; + + @Column(name = "ife", length = 20) + private String ife; + + @Temporal(TemporalType.DATE) + @Column(name = "admission_date") + private Date admissionDate; + + @Enumerated(EnumType.STRING) + @Column(name = "human_resource_status", nullable = false) + private HumanResourceStatus humanResourceStatus; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_role", + referencedColumnName = "id", + nullable = false + ) + private RoleCtlg roleCtlg; + + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn( + name = "id_bonus", + referencedColumnName = "id" + ) + private Bonus bonus; + + @Column(name = "payment") + private BigDecimal payment; + + @Column(name = "balance", nullable = false) + private BigDecimal balance; + + @Column(name = "imss") + private BigDecimal imss; + + @Column(name = "employee_saving") + private BigDecimal employeeSaving; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + @OneToOne( + mappedBy = "humanResource", + cascade = CascadeType.ALL, + orphanRemoval = true, + fetch = FetchType.LAZY + ) + private User user; + + @OneToMany( + mappedBy = "humanResource", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List humanResourceByOffices; + + @OneToMany( + fetch = FetchType.LAZY, + mappedBy = "humanResource", + orphanRemoval = true, + cascade = CascadeType.ALL + ) + private List humanResourceHasRoutes; + + @OneToMany( + fetch = FetchType.LAZY, + mappedBy = "humanResource", + orphanRemoval = true, + cascade = CascadeType.ALL + ) + private List advances; + + @Transient + private String fullName; + + public HumanResource() { + } + + public HumanResource(String id) { + this.id = id; + } + + /** + * + * @param id + * @param fullName + */ + public HumanResource(String id, String fullName) { + this.id = id; + this.fullName = fullName; + } + + /** + * + * @param id + * @param firstName + * @param lastName + * @param avatar + */ + public HumanResource(String id, String firstName, String lastName, String avatar) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + this.avatar = avatar; + } + + /** + * + * @param firstName + * @param lastName + * @param avatar + */ + public HumanResource(String firstName, String lastName, String avatar) { + this.firstName = firstName; + this.lastName = lastName; + this.avatar = avatar; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getSecondName() { + return secondName; + } + + public void setSecondName(String secondName) { + this.secondName = secondName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getMiddleName() { + return middleName; + } + + public void setMiddleName(String middleName) { + this.middleName = middleName; + } + + public Date getBirthdate() { + return birthdate; + } + + public void setBirthdate(Date birthdate) { + this.birthdate = birthdate; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getCurp() { + return curp; + } + + public void setCurp(String curp) { + this.curp = curp; + } + + public String getRfc() { + return rfc; + } + + public void setRfc(String rfc) { + this.rfc = rfc; + } + + public String getIfe() { + return ife; + } + + public void setIfe(String ife) { + this.ife = ife; + } + + public Date getAdmissionDate() { + return admissionDate; + } + + public void setAdmissionDate(Date admissionDate) { + this.admissionDate = admissionDate; + } + + public HumanResourceStatus getHumanResourceStatus() { + return humanResourceStatus; + } + + public void setHumanResourceStatus(HumanResourceStatus humanResourceStatus) { + this.humanResourceStatus = humanResourceStatus; + } + + public RoleCtlg getRoleCtlg() { + return roleCtlg; + } + + public void setRoleCtlg(RoleCtlg roleCtlg) { + this.roleCtlg = roleCtlg; + } + + public Bonus getBonus() { + return bonus; + } + + public void setBonus(Bonus bonus) { + this.bonus = bonus; + } + + public BigDecimal getBalance() { + return balance; + } + + public void setBalance(BigDecimal balance) { + this.balance = balance; + } + + public BigDecimal getEmployeeSaving() { + return employeeSaving; + } + + public void setEmployeeSaving(BigDecimal employeeSaving) { + this.employeeSaving = employeeSaving; + } + + public BigDecimal getPayment() { + return payment; + } + + public void setPayment(BigDecimal payment) { + this.payment = payment; + } + + public BigDecimal getImss() { + return imss; + } + + public void setImss(BigDecimal imss) { + this.imss = imss; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public List getHumanResourceByOffices() { + return humanResourceByOffices; + } + + public void setHumanResourceByOffices(List humanResourceByOffices) { + this.humanResourceByOffices = humanResourceByOffices; + } + + public List getHumanResourceHasRoutes() { + return humanResourceHasRoutes; + } + + public void setHumanResourceHasRoutes(List humanResourceHasRoutes) { + this.humanResourceHasRoutes = humanResourceHasRoutes; + } + + public List getAdvances() { + return advances; + } + + public void setAdvances(List advances) { + this.advances = advances; + } + + public String getFullName() { + return fullName; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + @Override + public String toString() { + return "HumanResource{" + "firstName=" + firstName + ", secondName=" + secondName + ", lastName=" + lastName + ", middleName=" + middleName + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/HumanResourceByOffice.java b/apc-model/src/main/java/com/arrebol/apc/model/core/HumanResourceByOffice.java new file mode 100644 index 0000000..fbc5c06 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/HumanResourceByOffice.java @@ -0,0 +1,179 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core; + +import com.arrebol.apc.model.enums.ApplicationOwner; +import java.io.Serializable; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.UniqueConstraint; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_HUMAN_RESOURCE_BY_OFFICE", + uniqueConstraints = { + @UniqueConstraint(columnNames = {"id_human_resource", "id_office"}, name = "apc_human_resource_by_office_uk") + }) +public class HumanResourceByOffice implements Serializable { + + private static final long serialVersionUID = -2892820400055813543L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_human_resource", + referencedColumnName = "id", + nullable = false + ) + private HumanResource humanResource; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Enumerated(EnumType.STRING) + @Column(name = "application_owner", nullable = false) + private ApplicationOwner applicationOwner; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + public HumanResourceByOffice() { + } + + /** + * + * @param id + * @param humanResource + * @param office + */ + public HumanResourceByOffice(String id, HumanResource humanResource, Office office) { + this.id = id; + this.humanResource = humanResource; + this.office = office; + } + + /** + * + * @param office + * @param createdBy + * @param createdOn + * @param applicationOwner + */ + public HumanResourceByOffice(Office office, String createdBy, Date createdOn, ApplicationOwner applicationOwner) { + this.office = office; + this.createdBy = createdBy; + this.createdOn = createdOn; + this.applicationOwner = applicationOwner; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public HumanResource getHumanResource() { + return humanResource; + } + + public void setHumanResource(HumanResource humanResource) { + this.humanResource = humanResource; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public ApplicationOwner getApplicationOwner() { + return applicationOwner; + } + + public void setApplicationOwner(ApplicationOwner applicationOwner) { + this.applicationOwner = applicationOwner; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + @Override + public String toString() { + return "HumanResourceByOffice{" + "humanResource=" + humanResource + ", office=" + office + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/Office.java b/apc-model/src/main/java/com/arrebol/apc/model/core/Office.java new file mode 100644 index 0000000..d21fe4a --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/Office.java @@ -0,0 +1,421 @@ +/* + * Arrebol Consultancy copyright + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core; + +import com.arrebol.apc.model.admin.Advance; +import com.arrebol.apc.model.admin.Bonus; +import com.arrebol.apc.model.admin.ExpenseCompany; +import com.arrebol.apc.model.admin.Goal; +import com.arrebol.apc.model.admin.MoneyDaily; +import com.arrebol.apc.model.admin.OtherExpense; +import com.arrebol.apc.model.admin.StableGeneralBox; +import com.arrebol.apc.model.admin.Transfer; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.enums.OfficeStatus; +import com.arrebol.apc.model.gasoline.Gasoline; +import com.arrebol.apc.model.loan.LoanType; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.UniqueConstraint; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_OFFICE", + uniqueConstraints = { + @UniqueConstraint(columnNames = {"office_name"})} +) +public class Office implements Serializable { + + private static final long serialVersionUID = -141661123746446879L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "office_name", length = 100, nullable = false) + private String officeName; + + @Column(name = "address", length = 250) + private String address; + + @Enumerated(EnumType.STRING) + @Column(name = "office_status", nullable = false) + private OfficeStatus officeStatus; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + @OneToMany( + mappedBy = "office", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List userByOffices; + + @OneToMany( + mappedBy = "office", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List humanResourceByOffices; + + @OneToMany( + mappedBy = "office", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List routeCtlgs; + + @OneToMany( + mappedBy = "office", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List peoples; + + @OneToMany( + mappedBy = "office", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List loanTypes; + + @OneToMany( + mappedBy = "office", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List transfers; + + @OneToMany( + mappedBy = "office", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List moneyDailys; + + @OneToMany( + mappedBy = "office", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List otherExpenses; + + @OneToMany( + mappedBy = "office", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List goals; + + @OneToMany( + fetch = FetchType.LAZY, + mappedBy = "office", + orphanRemoval = true, + cascade = CascadeType.ALL + ) + private List advances; + + @OneToMany( + fetch = FetchType.LAZY, + mappedBy = "office", + orphanRemoval = true, + cascade = CascadeType.ALL + ) + private List bonuses; + + @OneToMany( + fetch = FetchType.LAZY, + mappedBy = "office", + orphanRemoval = true, + cascade = CascadeType.ALL + ) + private List expenseCompanies; + + @OneToMany( + fetch = FetchType.LAZY, + mappedBy = "office", + orphanRemoval = true, + cascade = CascadeType.ALL + ) + private List stableGeneralBoxes; + + @OneToMany( + fetch = FetchType.LAZY, + mappedBy = "office", + orphanRemoval = true, + cascade = CascadeType.ALL + ) + private List gasolines; + + public Office() { + } + + /** + * + * @param id + */ + public Office(String id) { + this.id = id; + } + + /** + * + * @param id + * @param officeName + */ + public Office(String id, String officeName) { + this.id = id; + this.officeName = officeName; + } + + public Office(String id, String officeName, String address) { + this.id = id; + this.officeName = officeName; + this.address = address; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getOfficeName() { + return officeName; + } + + public void setOfficeName(String officeName) { + this.officeName = officeName; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public OfficeStatus getOfficeStatus() { + return officeStatus; + } + + public void setOfficeStatus(OfficeStatus officeStatus) { + this.officeStatus = officeStatus; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public List getUserByOffices() { + return userByOffices; + } + + public void setUserByOffices(List userByOffices) { + this.userByOffices = userByOffices; + } + + public List getHumanResourceByOffices() { + return humanResourceByOffices; + } + + public void setHumanResourceByOffices(List humanResourceByOffices) { + this.humanResourceByOffices = humanResourceByOffices; + } + + public List getRouteCtlgs() { + return routeCtlgs; + } + + public void setRouteCtlgs(List routeCtlgs) { + this.routeCtlgs = routeCtlgs; + } + + public List getPeoples() { + return peoples; + } + + public void setPeoples(List peoples) { + this.peoples = peoples; + } + + public List getLoanTypes() { + return loanTypes; + } + + public void setLoanTypes(List loanTypes) { + this.loanTypes = loanTypes; + } + + public List getTransfers() { + return transfers; + } + + public void setTransfers(List transfers) { + this.transfers = transfers; + } + + public List getMoneyDailys() { + return moneyDailys; + } + + public void setMoneyDailys(List moneyDailys) { + this.moneyDailys = moneyDailys; + } + + public List getOtherExpenses() { + return otherExpenses; + } + + public void setOtherExpenses(List otherExpenses) { + this.otherExpenses = otherExpenses; + } + + public List getGoals() { + return goals; + } + + public void setGoals(List goals) { + this.goals = goals; + } + + public List getAdvances() { + return advances; + } + + public void setAdvances(List advances) { + this.advances = advances; + } + + public List getBonuses() { + return bonuses; + } + + public void setBonuses(List bonuses) { + this.bonuses = bonuses; + } + + public List getExpenseCompanies() { + return expenseCompanies; + } + + public void setExpenseCompanies(List expenseCompanies) { + this.expenseCompanies = expenseCompanies; + } + + public List getStableGeneralBoxes() { + return stableGeneralBoxes; + } + + public void setStableGeneralBoxes(List stableGeneralBoxes) { + this.stableGeneralBoxes = stableGeneralBoxes; + } + + @Override + public int hashCode() { + int hash = 3; + hash = 97 * hash + Objects.hashCode(this.id); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final Office other = (Office) obj; + if (!Objects.equals(this.id, other.id)) { + return false; + } + return true; + } + + @Override + public String toString() { + return "Office{" + "officeName=" + officeName + ", address=" + address + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/Permission.java b/apc-model/src/main/java/com/arrebol/apc/model/core/Permission.java new file mode 100644 index 0000000..b981610 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/Permission.java @@ -0,0 +1,257 @@ +/* + * Arrebol Consultancy copyright + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core; + +import com.arrebol.apc.model.enums.PermissionStatus; +import com.arrebol.apc.model.enums.PermissionType; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.UniqueConstraint; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_PERMISSION", + uniqueConstraints = { + @UniqueConstraint(columnNames = {"permission"}) + } +) +public class Permission implements Serializable { + + private static final long serialVersionUID = -4259020491787578065L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "permission", length = 200, nullable = false) + private String permission; + + @Column(name = "description", length = 200, nullable = false) + private String description; + + @Column(name = "menu_path", length = 200, nullable = false) + private String menuPath; + + @Column(name = "left_to_right_order", nullable = false) + private Integer leftToRightOrder; + + @Column(name = "top_to_bottom_order", nullable = false) + private Integer topToBottomOrder; + + @Enumerated(EnumType.STRING) + @Column(name = "permission_type", nullable = false) + private PermissionType permissionType; + + @Column(name = "parent_name", length = 200) + private String parentName; + + @Enumerated(EnumType.STRING) + @Column(name = "permission_status", nullable = false) + private PermissionStatus permissionStatus; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + @OneToMany( + fetch = FetchType.LAZY, + mappedBy = "permission", + orphanRemoval = true, + cascade = CascadeType.ALL + ) + private List userByOfficeHasPermissions; + + public Permission() { + } + + /** + * + * @param id + * @param permission + * @param description + * @param menuPath + */ + public Permission(String id, String permission, String description, String menuPath) { + this.id = id; + this.permission = permission; + this.description = description; + this.menuPath = menuPath; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getPermission() { + return permission; + } + + public void setPermission(String permission) { + this.permission = permission; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getMenuPath() { + return menuPath; + } + + public void setMenuPath(String menuPath) { + this.menuPath = menuPath; + } + + public Integer getLeftToRightOrder() { + return leftToRightOrder; + } + + public void setLeftToRightOrder(Integer leftToRightOrder) { + this.leftToRightOrder = leftToRightOrder; + } + + public Integer getTopToBottomOrder() { + return topToBottomOrder; + } + + public void setTopToBottomOrder(Integer topToBottomOrder) { + this.topToBottomOrder = topToBottomOrder; + } + + public PermissionType getPermissionType() { + return permissionType; + } + + public void setPermissionType(PermissionType permissionType) { + this.permissionType = permissionType; + } + + public String getParentName() { + return parentName; + } + + public void setParentName(String parentName) { + this.parentName = parentName; + } + + public PermissionStatus getPermissionStatus() { + return permissionStatus; + } + + public void setPermissionStatus(PermissionStatus permissionStatus) { + this.permissionStatus = permissionStatus; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public List getUserByOfficeHasPermissions() { + return userByOfficeHasPermissions; + } + + public void setUserByOfficeHasPermissions(List userByOfficeHasPermissions) { + this.userByOfficeHasPermissions = userByOfficeHasPermissions; + } + + @Override + public int hashCode() { + int hash = 5; + hash = 89 * hash + Objects.hashCode(this.id); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final Permission other = (Permission) obj; + if (!Objects.equals(this.id, other.id)) { + return false; + } + return true; + } + + @Override + public String toString() { + return "Permission{" + "description=" + description + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/User.java b/apc-model/src/main/java/com/arrebol/apc/model/core/User.java new file mode 100644 index 0000000..64033c2 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/User.java @@ -0,0 +1,435 @@ +/* + * Arrebol Consultancy copyright + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core; + +import com.arrebol.apc.model.admin.MoneyDaily; +import com.arrebol.apc.model.admin.OtherExpense; +import com.arrebol.apc.model.admin.Transfer; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.ApplicationOwner; +import com.arrebol.apc.model.enums.UserStatus; +import com.arrebol.apc.model.enums.UserType; +import com.arrebol.apc.model.gasoline.Gasoline; +import com.arrebol.apc.model.loan.Delivery; +import com.arrebol.apc.model.loan.LoanByUser; +import com.arrebol.apc.model.loan.LoanDetails; +import com.arrebol.apc.model.loan.LoanFeeNotification; +import com.arrebol.apc.model.mobile.preference.UserMobilePreference; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.OneToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_USER") +public class User implements Serializable { + + private static final long serialVersionUID = 5293919946950359645L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @OneToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_human_resource", + referencedColumnName = "id", + nullable = false + ) + private HumanResource humanResource; + + @Column(name = "user_name", length = 100, nullable = false) + private String userName; + + @Column(name = "pwd", length = 100, nullable = false) + private String password; + + @Enumerated(EnumType.STRING) + @Column(name = "user_type", nullable = false) + private UserType userType; + + @Enumerated(EnumType.STRING) + @Column(name = "user_status", nullable = false) + private UserStatus userStatus; + + @Enumerated(EnumType.STRING) + @Column(name = "application_owner", nullable = false) + private ApplicationOwner applicationOwner; + + @Enumerated(EnumType.STRING) + @Column(name = "certifier", nullable = false) + private ActiveStatus certifier; + + @Enumerated(EnumType.STRING) + @Column(name = "management", nullable = false) + private ActiveStatus management; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + @OneToMany( + mappedBy = "user", + fetch = FetchType.LAZY, + cascade = CascadeType.ALL, + orphanRemoval = true + ) + private List userByOffices; + + @OneToMany( + mappedBy = "user", + fetch = FetchType.LAZY, + cascade = CascadeType.ALL, + orphanRemoval = true + ) + private List userMobilePreferences; + + @OneToMany( + mappedBy = "user", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List loanDetailses; + + @OneToMany( + mappedBy = "user", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List loanByUsers; + + @OneToMany( + mappedBy = "user", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List loanFeeNotifications; + + @OneToMany( + mappedBy = "userTransmitter", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List userTransmitters; + + @OneToMany( + mappedBy = "userReceiver", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List userReceivers; + + @OneToMany( + mappedBy = "user", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List moneyDailys; + + @OneToMany( + mappedBy = "user", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List deliverys; + + @OneToMany( + mappedBy = "user", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List otherExpenses; + + @OneToMany( + fetch = FetchType.LAZY, + mappedBy = "user", + orphanRemoval = true, + cascade = CascadeType.ALL + ) + private List gasolines; + + public User() { + } + + public User(String id) { + this.id = id; + } + + /** + * + * @param id + * @param userName + */ + public User(String id, String userName) { + this.id = id; + this.userName = userName; + } + + /** + * + * @param id + * @param userName + * @param humanResource + */ + public User(String id, String userName, HumanResource humanResource) { + this.id = id; + this.userName = userName; + this.humanResource = humanResource; + } + + /** + * + * @param id + * @param humanResource + * @param userName + * @param certifier + * @param userType + */ + public User(String id, HumanResource humanResource, String userName, ActiveStatus certifier, UserType userType,ActiveStatus management) { + this.id = id; + this.humanResource = humanResource; + this.userName = userName; + this.certifier = certifier; + this.userType = userType; + this.management = management; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public HumanResource getHumanResource() { + return humanResource; + } + + public void setHumanResource(HumanResource humanResource) { + this.humanResource = humanResource; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public UserType getUserType() { + return userType; + } + + public void setUserType(UserType userType) { + this.userType = userType; + } + + public UserStatus getUserStatus() { + return userStatus; + } + + public void setUserStatus(UserStatus userStatus) { + this.userStatus = userStatus; + } + + public ApplicationOwner getApplicationOwner() { + return applicationOwner; + } + + public void setApplicationOwner(ApplicationOwner applicationOwner) { + this.applicationOwner = applicationOwner; + } + + public ActiveStatus getCertifier() { + return certifier; + } + + public void setCertifier(ActiveStatus certifier) { + this.certifier = certifier; + } + + public ActiveStatus getManagement() { + return management; + } + + public void setManagement(ActiveStatus management) { + this.management = management; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public List getUserByOffices() { + return userByOffices; + } + + public void setUserByOffices(List userByOffices) { + this.userByOffices = userByOffices; + } + + public List getUserMobilePreferences() { + return userMobilePreferences; + } + + public void setUserMobilePreferences(List userMobilePreferences) { + this.userMobilePreferences = userMobilePreferences; + } + + public List getLoanDetailses() { + return loanDetailses; + } + + public void setLoanDetailses(List loanDetailses) { + this.loanDetailses = loanDetailses; + } + + public List getLoanByUsers() { + return loanByUsers; + } + + public void setLoanByUsers(List loanByUsers) { + this.loanByUsers = loanByUsers; + } + + public List getLoanFeeNotifications() { + return loanFeeNotifications; + } + + public void setLoanFeeNotifications(List loanFeeNotifications) { + this.loanFeeNotifications = loanFeeNotifications; + } + + public List getUserTransmitters() { + return userTransmitters; + } + + public void setUserTransmitters(List userTransmitters) { + this.userTransmitters = userTransmitters; + } + + public List getUserReceivers() { + return userReceivers; + } + + public void setUserReceivers(List userReceivers) { + this.userReceivers = userReceivers; + } + + public List getMoneyDailys() { + return moneyDailys; + } + + public void setMoneyDailys(List moneyDailys) { + this.moneyDailys = moneyDailys; + } + + public List getDeliverys() { + return deliverys; + } + + public void setDeliverys(List deliverys) { + this.deliverys = deliverys; + } + + public List getOtherExpenses() { + return otherExpenses; + } + + public void setOtherExpenses(List otherExpenses) { + this.otherExpenses = otherExpenses; + } + + public List getGasolines() { + return gasolines; + } + + public void setGasolines(List gasolines) { + this.gasolines = gasolines; + } + + @Override + public String toString() { + return "User{" + "userName=" + userName + '}'; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/UserByOffice.java b/apc-model/src/main/java/com/arrebol/apc/model/core/UserByOffice.java new file mode 100644 index 0000000..bb71205 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/UserByOffice.java @@ -0,0 +1,268 @@ +/* + * Arrebol Consultancy copyright + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core; + +import com.arrebol.apc.model.enums.ApplicationOwner; +import com.arrebol.apc.model.enums.UserByOfficeStatus; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.UniqueConstraint; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_USER_BY_OFFICE", + uniqueConstraints = { + @UniqueConstraint(columnNames = {"id_user", "id_office"}, name = "apc_user_by_office_uk")} +) +public class UserByOffice implements Serializable { + + private static final long serialVersionUID = -8206398520981509425L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_user", + referencedColumnName = "id", + nullable = false + ) + private User user; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Enumerated(EnumType.STRING) + @Column(name = "user_by_office_status", nullable = true) + private UserByOfficeStatus userByOfficeStatus; + + @Enumerated(EnumType.STRING) + @Column(name = "application_owner", nullable = false) + private ApplicationOwner applicationOwner; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + @OneToMany( + fetch = FetchType.LAZY, + mappedBy = "userByOffice", + orphanRemoval = true, + cascade = CascadeType.ALL + ) + private List userByOfficeHasPermissions; + + public UserByOffice() { + } + + /** + * + * @param id + */ + public UserByOffice(String id) { + this.id = id; + } + + /** + * + * @param user + * @param office + */ + public UserByOffice(User user, Office office) { + this.user = user; + this.office = office; + } + + /** + * + * @param office + * @param userByOfficeStatus + * @param createdBy + * @param createdOn + */ + public UserByOffice(Office office, UserByOfficeStatus userByOfficeStatus, String createdBy, Date createdOn) { + this.office = office; + this.userByOfficeStatus = userByOfficeStatus; + this.createdBy = createdBy; + this.createdOn = createdOn; + } + + /** + * + * @param office + * @param userByOfficeStatus + * @param applicationOwner + * @param createdBy + * @param createdOn + */ + public UserByOffice(Office office, UserByOfficeStatus userByOfficeStatus, ApplicationOwner applicationOwner, String createdBy, Date createdOn) { + this.office = office; + this.userByOfficeStatus = userByOfficeStatus; + this.applicationOwner = applicationOwner; + this.createdBy = createdBy; + this.createdOn = createdOn; + } + + /** + * + * @param id + * @param user + */ + public UserByOffice(String id, User user) { + this.id = id; + this.user = user; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public UserByOfficeStatus getUserByOfficeStatus() { + return userByOfficeStatus; + } + + public void setUserByOfficeStatus(UserByOfficeStatus userByOfficeStatus) { + this.userByOfficeStatus = userByOfficeStatus; + } + + public ApplicationOwner getApplicationOwner() { + return applicationOwner; + } + + public void setApplicationOwner(ApplicationOwner applicationOwner) { + this.applicationOwner = applicationOwner; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public List getUserByOfficeHasPermissions() { + return userByOfficeHasPermissions; + } + + public void setUserByOfficeHasPermissions(List userByOfficeHasPermissions) { + this.userByOfficeHasPermissions = userByOfficeHasPermissions; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 37 * hash + Objects.hashCode(this.id); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final UserByOffice other = (UserByOffice) obj; + if (!Objects.equals(this.id, other.id)) { + return false; + } + return true; + } + + @Override + public String toString() { + return "UserByOffice{" + "user=" + user + ", office=" + office + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/UserByOfficeHasPermission.java b/apc-model/src/main/java/com/arrebol/apc/model/core/UserByOfficeHasPermission.java new file mode 100644 index 0000000..49ee290 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/UserByOfficeHasPermission.java @@ -0,0 +1,177 @@ +/* + * Arrebol Consultancy copyright + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core; + +import java.io.Serializable; +import java.util.Date; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_USER_BY_OFFICE_HAS_PERMISSION") +public class UserByOfficeHasPermission implements Serializable { + + private static final long serialVersionUID = -4218581013559259950L; + + @EmbeddedId + private UserByOfficeHasPermissionId id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn( + name = "id_user_by_office", + referencedColumnName = "id", + insertable = false, + updatable = false + ) + private UserByOffice userByOffice; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn( + name = "id_permission", + referencedColumnName = "id", + insertable = false, + updatable = false + ) + private Permission permission; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + public UserByOfficeHasPermission() { + } + + /** + * + * @param id + * @param createdBy + */ + public UserByOfficeHasPermission(UserByOfficeHasPermissionId id, String createdBy) { + this.id = id; + this.createdBy = createdBy; + this.createdOn = new Date(); + } + + /** + * + * @param userByOffice + * @param createdBy + */ + public UserByOfficeHasPermission(UserByOffice userByOffice, String createdBy) { + this.userByOffice = userByOffice; + this.createdBy = createdBy; + } + + public UserByOfficeHasPermissionId getId() { + return id; + } + + public void setId(UserByOfficeHasPermissionId id) { + this.id = id; + } + + public UserByOffice getUserByOffice() { + return userByOffice; + } + + public void setUserByOffice(UserByOffice userByOffice) { + this.userByOffice = userByOffice; + } + + public Permission getPermission() { + return permission; + } + + public void setPermission(Permission permission) { + this.permission = permission; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + @Override + public int hashCode() { + int hash = 3; + hash = 97 * hash + Objects.hashCode(this.id); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final UserByOfficeHasPermission other = (UserByOfficeHasPermission) obj; + if (!Objects.equals(this.id, other.id)) { + return false; + } + return true; + } + + @Override + public String toString() { + return "UserByOfficeHasPermission{" + "userByOffice=" + userByOffice + ", permission=" + permission + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/UserByOfficeHasPermissionId.java b/apc-model/src/main/java/com/arrebol/apc/model/core/UserByOfficeHasPermissionId.java new file mode 100644 index 0000000..fb4e68a --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/UserByOfficeHasPermissionId.java @@ -0,0 +1,82 @@ +/* + * Arrebol Consultancy copyright + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core; + +import java.io.Serializable; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Embeddable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Embeddable +public class UserByOfficeHasPermissionId implements Serializable { + + private static final long serialVersionUID = -7541179490083208294L; + + @Column(name = "id_user_by_office", length = 36, nullable = true) + private String idUserByOffice; + + @Column(name = "id_permission", length = 36, nullable = true) + private String idPermission; + + public UserByOfficeHasPermissionId() { + } + + public UserByOfficeHasPermissionId(String idUserByOffice, String idPermission) { + this.idUserByOffice = idUserByOffice; + this.idPermission = idPermission; + } + + public String getIdUserByOffice() { + return idUserByOffice; + } + + public void setIdUserByOffice(String idUserByOffice) { + this.idUserByOffice = idUserByOffice; + } + + public String getIdPermission() { + return idPermission; + } + + public void setIdPermission(String idPermission) { + this.idPermission = idPermission; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 29 * hash + Objects.hashCode(this.idUserByOffice); + hash = 29 * hash + Objects.hashCode(this.idPermission); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final UserByOfficeHasPermissionId other = (UserByOfficeHasPermissionId) obj; + if (!Objects.equals(this.idUserByOffice, other.idUserByOffice)) { + return false; + } + if (!Objects.equals(this.idPermission, other.idPermission)) { + return false; + } + return true; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/AvailableCustomersViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/AvailableCustomersViewCfg.java new file mode 100644 index 0000000..f94fd72 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/AvailableCustomersViewCfg.java @@ -0,0 +1,18 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface AvailableCustomersViewCfg extends GenericCfg { + + String QUERY_FIND_AVAILABLE_CUSTOMERS = "findAllAvailableCustomersByType"; + String FIELD_AVAILABLE_PERSON = "availablePerson"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/AvailableEndorsementsViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/AvailableEndorsementsViewCfg.java new file mode 100644 index 0000000..c9ae46c --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/AvailableEndorsementsViewCfg.java @@ -0,0 +1,18 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface AvailableEndorsementsViewCfg extends GenericCfg { + + String QUERY_FIND_AVAILABLE_ENDORSEMENTS = "findAllAvailableEndorsementsByType"; + String FIELD_AVAILABLE_PERSON = "availablePerson"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/CashRegisterCurdateByUserViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/CashRegisterCurdateByUserViewCfg.java new file mode 100644 index 0000000..f5588d2 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/CashRegisterCurdateByUserViewCfg.java @@ -0,0 +1,18 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface CashRegisterCurdateByUserViewCfg extends GenericCfg { + + String QUERY_FIND_CASH_REGISTER = "findAllCashRegisterCurdateByUserId"; + String FIELD_USER_ID = "userId"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/ExchangeEnebledUsersViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/ExchangeEnebledUsersViewCfg.java new file mode 100644 index 0000000..429c5a1 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/ExchangeEnebledUsersViewCfg.java @@ -0,0 +1,19 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface ExchangeEnebledUsersViewCfg extends GenericCfg{ + + String QUERY_FIND_ENEBLED_USERS_TO_USER_ID = "findEnebledUsersToUserId"; + String FIELD_VIEW_ID = "userId"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/GenericCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/GenericCfg.java new file mode 100644 index 0000000..45ed495 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/GenericCfg.java @@ -0,0 +1,26 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface GenericCfg { + + String FIELD_ID = "id"; + String FIELD_LAST_UPDATED_BY = "lastUpdatedBy"; + String FIELD_LAST_UPDATED_ON = "lastUpdatedOn"; + + String PARAM_USER_NAME = "userName"; + String PARAM_OFFICE_ID = "officeId"; + String PARAM_USER_IDS = "userIds"; + String PARAM_OWNER_ID = "ownerId"; + String PARAM_START_DATE = "startDate"; + String PARAM_END_DATE = "endDate"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/HumanResourceByOfficeCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/HumanResourceByOfficeCfg.java new file mode 100644 index 0000000..3d6d49f --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/HumanResourceByOfficeCfg.java @@ -0,0 +1,17 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface HumanResourceByOfficeCfg extends GenericCfg { + + String HUMAN_RESOURCE = "humanResource"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/HumanResourceCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/HumanResourceCfg.java new file mode 100644 index 0000000..28b042c --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/HumanResourceCfg.java @@ -0,0 +1,37 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface HumanResourceCfg extends GenericCfg { + + String QUERY_FIND_ALL_HRS_WITHOUT_USER = "findAllHRWithoutUser"; + String QUERY_FIND_ALL_BY_STATUS = "findAllHByStatus"; + String QUERY_FIND_ALL_IN_STATUS = "findAllHRInStatus"; + String QUERY_FIND_ALL_HR_BY_OFFICE = "findAllHRByOffice"; + String UPDATE_HR_BY_STATUS = "updateHRByStatus"; + + String FIELD_FIRST_NAME = "firstName"; + String FIELD_SECOND_NAME = "secondName"; + String FIELD_LAST_NAME = "lastName"; + String FIELD_MIDDLE_NAME = "middleName"; + String FIELD_BIRTHDATE = "birthdate"; + String FIELD_AVATAR = "AVATAR"; + String FIELD_HR_TYPE = "humanResourceType"; + String FIELD_ADMISSION_DATE = "admissionDate"; + String FIELD_HR_STATUS = "humanResourceStatus"; + String FIELD_OFFICE = "office"; + String FIELD_PAYMENT = "payment"; + String FIELD_IMSS = "imss"; + String FIELD_ROLE = "roleCtlg"; + String FIELD_BONUS = "bonus"; + String FIELD_EMPLOYEE_SAVING = "employeeSaving"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/HumanResourceHasRouteCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/HumanResourceHasRouteCfg.java new file mode 100644 index 0000000..45ff174 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/HumanResourceHasRouteCfg.java @@ -0,0 +1,19 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface HumanResourceHasRouteCfg extends GenericCfg { + + String QUERY_DELETE_ALL_HR_HAS_ROUTE_BY_HR = "deleteAllHRHasRouteByHR"; + + String FIELD_HUMAN_RESOURCE = "humanResource"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanApprovedDetailViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanApprovedDetailViewCfg.java new file mode 100644 index 0000000..79b0b95 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanApprovedDetailViewCfg.java @@ -0,0 +1,16 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface LoanApprovedDetailViewCfg extends GenericCfg{ + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanByRenovationCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanByRenovationCfg.java new file mode 100644 index 0000000..de71b2a --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanByRenovationCfg.java @@ -0,0 +1,23 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface LoanByRenovationCfg extends GenericCfg { + + String QUERY_FIND_LOAN_RENOVATION_BY_NEW_LOAN_ID = "findLoanRenovationByNewLoanId"; + String QUERY_UPDATE_LOAN_RENOVATION = "updateLoanRenovation"; + String QUERY_UPDATE_LOAN_RENOVATION_WEB = "updateLoanRenovationWeb"; + + String FIELD_LOAN_NEW = "loanNew"; + String FIELD_LOAN_RENOVATION_STATUS = "loanRenovationStatus"; + String FIELD_COMMENTS = "comments"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanByUserCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanByUserCfg.java new file mode 100644 index 0000000..4ed4543 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanByUserCfg.java @@ -0,0 +1,29 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface LoanByUserCfg extends GenericCfg { + + String QUERY_UPDATE_ORDER_IN_LIST = "updateOrderInList"; + String QUERY_UPDATE_LOAN_BY_USER_BY_LOAND_ID = "updateLoandByUserByLoanId"; + String QUERY_UPDATE_LOAN_BY_USER_STATUS_WHERE_LOAN_IN = "updateLoanByUserStatusWhereLoanIn"; + String QUERY_UPDATE_LOAN_BY_USER_BU_USER_ID = "updateLoandByUserByUserId"; + String QUERY_FIND_LOAN_BY_USER_BY_LOAND_ID = "findLoandByUserByLoanId"; + String QUERY_CHANGE_LOANS_BETWEEN_USERS_IN_LOAN_IDS = "changeLoansBetweenUsersInLoanIds"; + + String FIELD_ORDER_IN_LIST = "orderInList"; + String FIELD_LOAN = "loan"; + String FIELD_LOAN_BY_USER_STATUS = "loanByUserStatus"; + String FIELD_USER = "user"; + + String PARAMS_LOAN = "loans"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanByUserOrderPreferenceViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanByUserOrderPreferenceViewCfg.java new file mode 100644 index 0000000..4844f75 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanByUserOrderPreferenceViewCfg.java @@ -0,0 +1,25 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface LoanByUserOrderPreferenceViewCfg extends GenericCfg { + + /** + * + */ + String QUERY_FIND_ALL_LOAN_BY_USER_ORDER_PREFERENCE = "findAllLoanByUserOrderPreference"; + + /** + * + */ + String FIELD_ORDER_USER_ID = "userId"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanByUserViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanByUserViewCfg.java new file mode 100644 index 0000000..b098bdc --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanByUserViewCfg.java @@ -0,0 +1,45 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface LoanByUserViewCfg extends GenericCfg { + + /** + * + */ + String QUERY_FIND_ALL_LOAN_BY_USER_ID_BY_ORDER_LIST = "findAllLoansByUserIdOrderByOrderList"; + + /** + * + */ + String QUERY_FIND_ALL_LOAN_BY_USER_ID_BY_CUSTOMER_NAME = "findAllLoansByUserIdOrderByCustomerName"; + + /** + * + */ + String FIELD_USER_ID = "userId"; + + /** + * + */ + String FIELD_ORDER_IN_LIST = "orderInList"; + + /** + * + */ + String FIELD_CUSTOMER_NAME = "customerName"; + + /** + * + */ + String PARAM_PREFERENCE_ORDER = "preferenceOrder"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanCfg.java new file mode 100644 index 0000000..021d3a3 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanCfg.java @@ -0,0 +1,63 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface LoanCfg extends GenericCfg { + + String QUERY_UPDATE_LOAN_BY_ID = "updateLoanById"; + String QUERY_UPDATE_LOAN_FROM_RENOVATION = "updateLoanFromRenovation"; + String QUERY_UPDATE_LOAN_STATUS_WHERE_ID_IN = "updateLoanStatusWhereIdIn"; + String QUERY_UPDATE_LOAN_FROM_WEB = "updateLoanFromWeb"; + String QUERY_FIND_LOAN_BY_CUSTOMER = "findLoansByCustomer"; + String QUERY_FIND_LOAN_JURIDICAL = "findLoansJuridical"; + String QUERY_FIND_LOAN_ZERO = "findLoansZero"; + String QUERY_FIND_LOAN_FINISHED = "findLoansFinished"; + String QUERY_FIND_LOAN_BY_ENDORSEMENT = "findLoansByEndorsement"; + String QUERY_UPDATE_LOAN_BY_ID_FROM_CERTIFIER_VIEW = "updateLoanByIdFromCertifiedView"; + String QUERY_UPDATE_LOAN_WITH_CREATED_ON_BY_ID_FROM_CERTIFIER_VIEW = "updateLoanWithCreatedOnByIdFromCertifiedView"; + String QUERY_UPDATE_AND_FINISH_LOAN_BY_ID = "updateAndFinishLoanById"; + String QUERY_UPDATE_DISCOUNT_AND_LOAN_BY_ID_FROM_CERTIFIER_VIEW = "updateDiscountAndLoanByIdFromCertifiedView"; + String QUERY_FIND_LOAN_DETAILS_CURDATE_BY_LOAN = "findLoanDetailsPaymentCurdateByLoan"; + String QUERY_DELETE_LOAN_DETAILS_CURDATE_BY_LOAN = "deleteLoanDetailsPaymentCurdateByLoan"; + String QUERY_SEARCH_PAYMENT_DETAILS = "searchPaymentDetails"; + String QUERY_UPDATE_ROUTE_BY_ID = "updateRouteFromLoan"; + String QUERY_FIND_LOAN_DETAILS_FEE_CURDATE_BY_LOAN = "findLoanDetailsFeeCurdateByLoan"; + String QUERY_DELETE_LOAN_DETAILS_FEE_CURDATE_BY_LOAN = "deleteLoanDetailsFeeCurdateByLoan"; + String QUERY_DELETE_LOAN_FEE_NOTIFICATION_CURDATE_BY_LOAN = "deleteLoanFeeNotificationCurdateByLoan"; + String QUERY_DELETE_LOAN_FEE_NOTIFICATION_BY_LOAN = "deleteLoanFeeNotificationByLoan"; + String QUERY_UPDATE_LOAN_BONUS_NEW_CUSTOMER = "updateBonusNewCustomer"; + String QUERY_FIND_LAST_REFERENCE_NUMBER_BY_LOAN = "findLastReferenceNumberByLoan"; + String QUERY_COUNT_LOAN_IN_STATUSES = "countLoanInStatuses"; + String QUERY_COUNT_LOAN_BY_CUSTOMER_IN_STATUSES = "countLoanByCustomerInStatuses"; + String QUERY_SELECT_LOAN_ID_BY_CUSTOMER_IN_STATUSES = "selectLoanIdByCustomerInStatuses"; + + String QUERY_FIND_LOAN_BY_STATUS_PENDING = "findLoansByStatusPending"; + String QUERY_FIND_ALL_LOANS = "findAllLoans"; + String QUERY_FIND_ALL_LOANS_VIEW = "findAllLoansView"; + String QUERY_FIND_ALL_LOANS_VIEW_BY_START_AND_END_DATE = "findAllLoansViewByStartAndEndDate"; + String QUERY_FIND_ALL_LOANS_JURIDICAL_VIEW_BY_START_AND_END_DATE = "findAllLoansJuridicalViewByStartAndEndDate"; + String QUERY_FIND_LOAN_DETAILS_BY_ID = "findLoansDetailById"; + String FIELD_AMOUNT_PAID = "amountPaid"; + String FIELD_AMOUNT_TO_PAY = "amountToPay"; + String FIELD_LAST_REFERENCE_NUMBER = "lastReferenceNumber"; + String FIELD_LOAN_STATUS = "loanStatus"; + String FIELD_NEW_CUSTOMER = "newCustomer"; + String FIELD_CUSTOMER = "customer"; + String FIELD_ENDORSEMENT = "endorsement"; + String FIELD_CUSTOMER_OFFICE = "customer.office"; + String FIELD_DETAILS_LOAN = "loan"; + String FIELD_COMMENTS = "comments"; + String FIELD_ROUTE = "routeCtlg"; + String FIELD_CREATED_ON = "createdOn"; + String FIELD_USER = "idUser"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanDetailsCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanDetailsCfg.java new file mode 100644 index 0000000..315d892 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanDetailsCfg.java @@ -0,0 +1,34 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface LoanDetailsCfg extends GenericCfg { + + String QUERY_FIND_LOAN_DETAILS_BY_LOAN = "findLoanDetailsByLoan"; + String QUERY_FIND_FEES_TO_PAY_BY_LOAN_ID = "findFeesToPayByLoanId"; + String QUERY_FIND_ALL_FEES_BY_LOAN_ID = "findAllFeesByLoanId"; + String QUERY_UPDATE_PAID_FEES_STATUS_IN_LOAN_DETAILS_IDS = "updatePaidFeesStatusInLoanDetailIds"; + String QUERY_COUNT_LOAN_DETAILS_IN_CURRDATE = "countLoanDetailsInCurrdate"; + String QUERY_FIND_ALL_TRANSFERS_LOAN_DETAIL = "findAllTransfersLoanDetail"; + String UPDATE_AUTHORIZE_LOAN_DETAIL = "updateAuthorizeTransferStatusInLoanDetailIds"; + String UPDATE_TRANSFER_STATUS_WHERE_ID_IN = "updateTransferStatusWhereIdIn"; + String UPDATE_REJECT_LOAN_DETAIL = "updateRejectTransferStatusInLoanDetailIds"; + String COUNT_LOAN_DETAILS_AUTHORIZE = "countLoanDetailsAuthorize"; + + String FIELD_ID_LOAN = "loan"; + String FIELD_LOAN_DETAILS_TYPE = "loanDetailsType"; + String FIELD_FEE_STATUS = "feeStatus"; + String FIELD_USER = "user"; + String FIELD_COMMENS = "comments"; + String FIELD_TRANSFER_STATUS = "transferStatus"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanFeeNotificationCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanFeeNotificationCfg.java new file mode 100644 index 0000000..4b5896c --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanFeeNotificationCfg.java @@ -0,0 +1,19 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface LoanFeeNotificationCfg extends GenericCfg { + + String QUERY_COUNT_NOTIFICATION_BY_LOAN_ID = "countNotificationByLoanId"; + + String FIELD_LOAN = "loan"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanToDeliveryByCertifierViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanToDeliveryByCertifierViewCfg.java new file mode 100644 index 0000000..a22f695 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanToDeliveryByCertifierViewCfg.java @@ -0,0 +1,17 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface LoanToDeliveryByCertifierViewCfg extends GenericCfg{ + String QUERY_FIND_LOANS_BY_CERTIFIER = "findLoansByCertifier"; + String FIELD_USER_ID = "userId"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanTypeCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanTypeCfg.java new file mode 100644 index 0000000..c691519 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/LoanTypeCfg.java @@ -0,0 +1,26 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface LoanTypeCfg extends GenericCfg { + + String QUERY_FIND_ALL_LOAN_TYPE_BY_OFFICE = "findAllLoanTypeByOffice"; + String QUERY_FIND_ALL_LOAN_TYPE_WITH_DESCRIPTION_BY_OFFICE = "findAllLoanTypeWithDescrpitionByOffice"; + String QUERY_FIND_NEW_CREDIT_LINE_BY_LOAN_ID = "findNewCreditLineByLoanId"; + + String QUERY_FIND_ALL_DATA_LOAN_TYPE_BY_OFFICE = "findAllDataLoanTypeByOffice"; + + String FIELD_OFFICE = "office"; + + String PARAM_LOAN = "loan"; + String PARAM_LOAN_ID = "loanId"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/MobileUserCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/MobileUserCfg.java new file mode 100644 index 0000000..6bd10ee --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/MobileUserCfg.java @@ -0,0 +1,20 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface MobileUserCfg extends GenericCfg { + + String QUERY_FIND_MOBILE_USER_FROM_LOGIN = "findMobileUserFromLogin"; + + String FIELD_USER_NAME = "userName"; + String FIELD_PASSWORD = "password"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/OfficeCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/OfficeCfg.java new file mode 100644 index 0000000..a35ee3c --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/OfficeCfg.java @@ -0,0 +1,41 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface OfficeCfg extends GenericCfg { + + /** + * + */ + String QUERY_TUPLE_FIND_ALL_OFFICES_BY_USER = "findAllOfficesByUser"; + String QUERY_FIND_ALL_OFFICES_ACTIVES = "findAllOfficesActives"; + String UPDATE_OFFICES_BY_ID = "updateByOfficeId"; + + /** + * Fields + */ + String FIELD_PERMISSION = "officeName"; + String FIELD_OFFICE_STATUS = "officeStatus"; + String FIELD_ADDRESS = "address"; + /** + * Query string + */ + String QUERY_AS_STRING_TUPLE_FIND_ALL_OFFICES_BY_USER = "SELECT \n" + + " o.id,\n" + + " o.officeName\n" + + " FROM Office o\n" + + " INNER JOIN UserByOffice ubo ON o.id = ubo.office\n" + + " WHERE\n" + + " ubo.user = :user AND\n" + + " ubo.userByOfficeStatus = 'ENEBLED' AND\n" + + " o.officeStatus = 'ENEBLED'"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/PermissionCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/PermissionCfg.java new file mode 100644 index 0000000..f53dcd5 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/PermissionCfg.java @@ -0,0 +1,32 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface PermissionCfg extends GenericCfg { + + String QUERY_FIND_PERMISSION_THAT_USER_HAS_ASSIGNED = "finPermissionThatUserHasAssigned"; + String QUERY_FIND_MISSING_PERMISSION_UBO = "findMissingPermissionByUserByOffice"; + String QUERY_FIND_ENEBLED_PERMISSIONS = "findAllEnebledPermissions"; + String QUERY_FIND_PERMISSION_BY_TYPE_AND_STATUS = "findPermissionByTypeAndStatus"; + String QUERY_FIND_ALL_PERMISSIONS_BY_UBO = "findAllPermissionsByUBO"; + String QUERY_FIND_ALL_NOT_PERMISSIONS_BY_UBO = "findAllNotPermissionsByUBO"; + String QUERY_FIND_ALL_PERMISSION_BY_TYPE_AND_STATUS = "findAllPermissionByTypeAndStatus"; + + String FIELD_PERMISSION = "permission"; + String FIELD_DESCRIPTION = "description"; + String FIELD_MENU_PATH = "menuPath"; + String FIELD_LEFT_TO_RIGHT = "leftToRightOrder"; + String FIELD_TOP_TO_BOTTOM = "topToBottomOrder"; + String FIELD_PERMISSION_STATUS = "permissionStatus"; + String FIELD_PERMISSION_TYPE = "permissionType"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/PersonSearchDetailViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/PersonSearchDetailViewCfg.java new file mode 100644 index 0000000..9cb27f3 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/PersonSearchDetailViewCfg.java @@ -0,0 +1,17 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface PersonSearchDetailViewCfg extends GenericCfg{ + + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/PersonSearchHistoricalDetailsViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/PersonSearchHistoricalDetailsViewCfg.java new file mode 100644 index 0000000..cc90071 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/PersonSearchHistoricalDetailsViewCfg.java @@ -0,0 +1,18 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface PersonSearchHistoricalDetailsViewCfg { + + String QUERY_FIND_PERSON_SEARCH_HISTORICAL_DETAILS_BY_PERSON_ID = "findPersonHistoricalDetailsByPersonId"; + String FIELD_PERSON_SEARCH_ID = "personSearchId"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/PersonSearchViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/PersonSearchViewCfg.java new file mode 100644 index 0000000..2d6bc6c --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/PersonSearchViewCfg.java @@ -0,0 +1,20 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface PersonSearchViewCfg extends GenericCfg { + + String QUERY_LIKE_BY_PERSON_SEARCH = "likePersonSearchViewByPersonSearch"; + String QUERY_FULL_NAME_EQUALS_TO_PERSON_SEARCH = "fullNameEqualsToPersonSearch"; + + String FIELD_PERSON_SEARCH = "personSearch"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/UserByOfficeCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/UserByOfficeCfg.java new file mode 100644 index 0000000..1e06b3d --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/UserByOfficeCfg.java @@ -0,0 +1,25 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface UserByOfficeCfg extends GenericCfg { + + String QUERY_FIND_USER_LOGGED = "findIdsFromUserLogged"; + String QUERY_FIND_USERS_IN_OFFICE_IN_STATUSES = "findUsersInOfficeInStatuses"; + String QUERY_FIND_ID_OF_USER_BY_OFFICE = "findIdOfUserByOffice"; + + String FIELD_USER = "user"; + String FIELD_OFFICE = "office"; + + String PARAM_USER_BY_OFFICE_ID = "userByOfficeId"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/UserByOfficeHasPermissionCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/UserByOfficeHasPermissionCfg.java new file mode 100644 index 0000000..5984e61 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/UserByOfficeHasPermissionCfg.java @@ -0,0 +1,20 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface UserByOfficeHasPermissionCfg extends GenericCfg { + + String XML_QUERY_DELETE_PERMISSION_BY_USER_ID_AND_OFFICE_ID = "deletePermissionByUserIdAndOfficeId"; + String QUERY_DELETE_ALL_PERMISSION_BY_UBO = "deleteAllPermissionByUBO"; + + String FIELD_USER_BY_OFFICE = "userByOffice"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/UserCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/UserCfg.java new file mode 100644 index 0000000..391eaf0 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/UserCfg.java @@ -0,0 +1,40 @@ +/* + * Arrebol Consultancy copyright + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface UserCfg extends GenericCfg { + + /** + * Queries + */ + String QUERY_FIND_ALL_USERS_BY_OFFICE = "findAllUsersByOffice"; + String QUERY_IS_USERNAME_AVAILABLE = "isUsernameAvailable"; + String QUERY_FIND_ALL_USERS_COMPLETE = "findAllUsersCompleteByOffice"; + String QUERY_UPDATE_PASSWORD_BY_USER_ID = "updatePasswordByUserId"; + String QUERY_UPDATE_CERTIFIER_AND_USER_TYPE_BY_ID = "updateCertifierAndUserTypeById"; + String QUERY_UPDATE_USER_NAME_BY_USER_ID = "updateUserNameById"; + String QUERY_UPDATE_USER_STATUS_BY_USER_ID = "updateUserStatusById"; + String QUERY_VERIFY_USER_STATUS_BY_ID = "verifyUserStatusById"; + String QUERY_IS_USER_MANAGMENT = "isUserManagement"; + String QUERY_LIST_OF_USERS_BY_OFFICE = "listOfUsersByOffice"; + + /** + * Field + */ + String FIELD_USER_NAME = "userName"; + String FIELD_PASSWORD = "password"; + String FIELD_HUMAN_RESOURCE = "humanResource"; + String FIELD_USER_STATUS = "userStatus"; + String FIELD_OFFICE = "office"; + String FIELD_CERTIFIER = "certifier"; + String FIELD_USER_TYPE = "userType"; + String FIELD_MANAGMENT = "managements"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/core/constance/UserMobilePreferenceCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/UserMobilePreferenceCfg.java new file mode 100644 index 0000000..b75207f --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/core/constance/UserMobilePreferenceCfg.java @@ -0,0 +1,23 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.core.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface UserMobilePreferenceCfg extends GenericCfg { + + String QUERY_FIND_ALL_MOBILE_PREFERENCES_BY_USER = "findAllMobilePreferenceByUser"; + String QUERY_FIND_MOBILE_PREFERENCE_BY_USER_AND_PREFERENCE_NAME = "findMobilePreferenceByUserAndPreferenceName"; + String QUERY_UPDATE_PREFERENCE_VALUE = "updatePreferenceValueInUserMobilePreferenceById"; + + String FIELD_USER = "user"; + String FIELD_PREFERENCE_NAME = "preferenceName"; + String FIELD_PREFERENCE_VALUE = "preferenceValue"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/ActionStatus.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/ActionStatus.java new file mode 100644 index 0000000..3795ef5 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/ActionStatus.java @@ -0,0 +1,26 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public enum ActionStatus { + PENDING("Pendiente"), APPROVED("Aprobado"), REJECTED("Rechazado"); + + private final String value; + + private ActionStatus(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/ActiveStatus.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/ActiveStatus.java new file mode 100644 index 0000000..0fde7f4 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/ActiveStatus.java @@ -0,0 +1,26 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum ActiveStatus { + ENEBLED("ENEBLED"), DISABLED("DISABLED"); + + private final String value; + + private ActiveStatus(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/ApplicationOwner.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/ApplicationOwner.java new file mode 100644 index 0000000..808bc4c --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/ApplicationOwner.java @@ -0,0 +1,19 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * APP_OWNER (Application Owner) Is an exclusive value from the root, all other + * users must be created as APP_USER (Application user like secretary, adviser, + * ceo, for web or mobile). + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum ApplicationOwner { + APP_OWNER, APP_USER +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/ComissionType.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/ComissionType.java new file mode 100644 index 0000000..823d230 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/ComissionType.java @@ -0,0 +1,37 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum ComissionType { + INCLUDED("INCLUDED") { + @Override + public String toString() { + return "INCLUDED"; + } + }, EXCLUDED("EXCLUDED") { + @Override + public String toString() { + return "EXCLUDED"; + } + }; + + private final String type; + + private ComissionType(String type) { + this.type = type; + } + + public String getType() { + return type; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/CustomerClassification.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/CustomerClassification.java new file mode 100644 index 0000000..d057643 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/CustomerClassification.java @@ -0,0 +1,26 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author David Rodríguez Huaracha + */ +public enum CustomerClassification { + WHITE("WHITE"), RED("RED"), YELLOW("YELLOW"); + + private final String value; + + private CustomerClassification(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/DaysInWeekend.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/DaysInWeekend.java new file mode 100644 index 0000000..1e438f1 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/DaysInWeekend.java @@ -0,0 +1,16 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum DaysInWeekend { + MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/EmployeeSavingType.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/EmployeeSavingType.java new file mode 100644 index 0000000..12c370a --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/EmployeeSavingType.java @@ -0,0 +1,16 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author David Rodríguez Huaracha + */ +public enum EmployeeSavingType { + SAVING, DISPOSAL, CANCEL +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/ExpenseCompanyType.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/ExpenseCompanyType.java new file mode 100644 index 0000000..c788bdf --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/ExpenseCompanyType.java @@ -0,0 +1,37 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum ExpenseCompanyType { + PAYMENT_IN("Entrada") { + @Override + public String toString() { + return "PAYMENT_IN"; + } + }, PAYMENT_OUT("Salida") { + @Override + public String toString() { + return "PAYMENT_OUT"; + } + }; + + private final String label; + + private ExpenseCompanyType(String label) { + this.label = label; + } + + public String getLabel() { + return label; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/FeeStatus.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/FeeStatus.java new file mode 100644 index 0000000..5495fe7 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/FeeStatus.java @@ -0,0 +1,16 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum FeeStatus { + TO_PAY, PAID +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/FormaPago.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/FormaPago.java new file mode 100644 index 0000000..e64f573 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/FormaPago.java @@ -0,0 +1,13 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Oscar + */ +public enum FormaPago { + SEMANAL, QUINCENA, MENSUAL +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/GenericEnumType.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/GenericEnumType.java new file mode 100644 index 0000000..a61baae --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/GenericEnumType.java @@ -0,0 +1,13 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Oscar + */ +public enum GenericEnumType { + ENABLED, DISABLED +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/GenericStatus.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/GenericStatus.java new file mode 100644 index 0000000..53febdd --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/GenericStatus.java @@ -0,0 +1,16 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum GenericStatus { + ENABLED, DISABLED, DELETED +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/HumanResourceStatus.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/HumanResourceStatus.java new file mode 100644 index 0000000..1f5da3e --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/HumanResourceStatus.java @@ -0,0 +1,41 @@ +/* + * Arrebol Consultancy copyright + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum HumanResourceStatus { + ENEBLED("enebled") { + @Override + public String toString() { + return "ENEBLED"; + } + }, DISABLED("disabled") { + @Override + public String toString() { + return "DISABLED"; + } + }, DELETED("deleted") { + @Override + public String toString() { + return "DELETED"; + } + }; + + private final String status; + + private HumanResourceStatus(String status) { + this.status = status; + } + + public String getStatus() { + return status; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/LoanDetailsType.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/LoanDetailsType.java new file mode 100644 index 0000000..fab567a --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/LoanDetailsType.java @@ -0,0 +1,31 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum LoanDetailsType { + CREDIT_PAYMENT("Tarjeta de crédito"), + DEBIT_PAYMENT("Efectivo"), + PAYMENT("Abono"), + FEE("Multa"), + RENOVATION_PAYMENT("Cobro en entrega de renovación"), + TRANSFER("Transferencia bancaria"); + + private final String value; + + private LoanDetailsType(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/LoanRenovationStatus.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/LoanRenovationStatus.java new file mode 100644 index 0000000..324758c --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/LoanRenovationStatus.java @@ -0,0 +1,16 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum LoanRenovationStatus { + PENDING, APPROVED, REJECTED +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/LoanStatus.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/LoanStatus.java new file mode 100644 index 0000000..ad9b0cc --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/LoanStatus.java @@ -0,0 +1,26 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum LoanStatus { + PENDING("Pendiente"), FINISH("Terminado"), BLACK_LIST("Lista negra"), APPROVED("Aprobado"), REJECTED("Rechazado"), PENDING_RENOVATION("Pendiente de renovación"), TO_DELIVERY("Por liberar"), DELETED("Borrado"); + + private final String value; + + private LoanStatus(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/LugarDeCobro.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/LugarDeCobro.java new file mode 100644 index 0000000..734644e --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/LugarDeCobro.java @@ -0,0 +1,13 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Oscar + */ +public enum LugarDeCobro { + CASA, TRABAJO +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/OfficeStatus.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/OfficeStatus.java new file mode 100644 index 0000000..7a50517 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/OfficeStatus.java @@ -0,0 +1,42 @@ +/* + * Arrebol Consultancy copyright + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum OfficeStatus { + ENEBLED("enebled") { + @Override + public String toString() { + return "ENEBLED"; + } + }, DISABLED("disabled") { + @Override + public String toString() { + return "DISABLED"; + } + }, + DELETED("deleted") { + @Override + public String toString() { + return "DELETED"; + } + }; + + private final String status; + + private OfficeStatus(String status) { + this.status = status; + } + + public String getStatus() { + return status; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/OwnerLoan.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/OwnerLoan.java new file mode 100644 index 0000000..0d63203 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/OwnerLoan.java @@ -0,0 +1,16 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum OwnerLoan { + CURRENT_OWNER, OLD_OWNER +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/PeopleType.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/PeopleType.java new file mode 100644 index 0000000..db948ae --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/PeopleType.java @@ -0,0 +1,26 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum PeopleType { + CUSTOMER("Cliente"), ENDORSEMENT("Aval"), BOTH("Cliente y aval"); + + private final String value; + + private PeopleType(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/PermissionStatus.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/PermissionStatus.java new file mode 100644 index 0000000..e184415 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/PermissionStatus.java @@ -0,0 +1,36 @@ +/* + * Arrebol Consultancy copyright + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum PermissionStatus { + ENEBLED("enebled") { + @Override + public String toString() { + return "ENEBLED"; + } + }, DISABLED("disabled") { + @Override + public String toString() { + return "DISABLED"; + } + }; + + private final String status; + + private PermissionStatus(String status) { + this.status = status; + } + + public String getStatus() { + return status; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/PermissionType.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/PermissionType.java new file mode 100644 index 0000000..edfa64d --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/PermissionType.java @@ -0,0 +1,41 @@ +/* + * Arrebol Consultancy copyright + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum PermissionType { + PUBLIC("public") { + @Override + public String toString() { + return "PUBLIC"; + } + }, PRIVATE("private") { + @Override + public String toString() { + return "PRIVATE"; + } + }, EXCLUSIVE("exclusive") { + @Override + public String toString() { + return "EXCLUSIVE"; + } + }; + + private final String type; + + private PermissionType(String type) { + this.type = type; + } + + public String getType() { + return type; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/PreferenceName.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/PreferenceName.java new file mode 100644 index 0000000..b470766 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/PreferenceName.java @@ -0,0 +1,16 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum PreferenceName { + ORDER_LIST +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/PreferenceValue.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/PreferenceValue.java new file mode 100644 index 0000000..9d5046b --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/PreferenceValue.java @@ -0,0 +1,16 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum PreferenceValue { + ALPHABETICALLY, ORDER_IN_LIST +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/TipoMovimiento.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/TipoMovimiento.java new file mode 100644 index 0000000..8d32cf4 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/TipoMovimiento.java @@ -0,0 +1,13 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Oscar + */ +public enum TipoMovimiento { + ENTRADA, SALIDA, AJUSTE +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/TransferStatus.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/TransferStatus.java new file mode 100644 index 0000000..e9b1a95 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/TransferStatus.java @@ -0,0 +1,27 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum TransferStatus { + PENDING("Pendiente"), AUTHORIZED("Autorizado"), REJECTED("Rechazado"); + + private final String status; + + private TransferStatus(String status) { + this.status = status; + } + + public String getStatus() { + return status; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/UserByOfficeStatus.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/UserByOfficeStatus.java new file mode 100644 index 0000000..d32912b --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/UserByOfficeStatus.java @@ -0,0 +1,42 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum UserByOfficeStatus { + ENEBLED("enebled") { + @Override + public String toString() { + return "ENEBLED"; + } + }, DISABLED("disabled") { + @Override + public String toString() { + return "DISABLED"; + } + }, DELETED("deleted") { + @Override + public String toString() { + return "DELETED"; + } + }; + + private final String status; + + private UserByOfficeStatus(String status) { + this.status = status; + } + + public String getStatus() { + return status; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/UserStatus.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/UserStatus.java new file mode 100644 index 0000000..28899cd --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/UserStatus.java @@ -0,0 +1,41 @@ +/* + * Arrebol Consultancy copyright + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum UserStatus { + ENEBLED("enebled") { + @Override + public String toString() { + return "ENEBLED"; + } + }, DISABLED("disabled") { + @Override + public String toString() { + return "DISABLED"; + } + }, DELETED("deleted") { + @Override + public String toString() { + return "DELETED"; + } + }; + + private final String status; + + private UserStatus(String status) { + this.status = status; + } + + public String getStatus() { + return status; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/enums/UserType.java b/apc-model/src/main/java/com/arrebol/apc/model/enums/UserType.java new file mode 100644 index 0000000..75615ef --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/enums/UserType.java @@ -0,0 +1,46 @@ +/* + * Arrebol Consultancy copyright + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.enums; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public enum UserType { + WEB("web") { + @Override + public String toString() { + return "WEB"; + } + }, MOBILE("mobile") { + @Override + public String toString() { + return "MOBILE"; + } + }, BOTH("both") { + @Override + public String toString() { + return "BOTH"; + } + }, ROOT("root") { + @Override + public String toString() { + return "ROOT"; + } + }; + + private final String type; + + private UserType(String type) { + this.type = type; + } + + public String getType() { + return type; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/gasoline/Gasoline.java b/apc-model/src/main/java/com/arrebol/apc/model/gasoline/Gasoline.java new file mode 100644 index 0000000..dfc1288 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/gasoline/Gasoline.java @@ -0,0 +1,264 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.gasoline; + +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.GenericStatus; +import java.io.Serializable; +import java.util.Date; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_GASOLINE") +public class Gasoline implements Serializable { + + private static final long serialVersionUID = -1257291916093653466L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_user", + referencedColumnName = "id", + nullable = false + ) + private User user; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_route", + referencedColumnName = "id", + nullable = false + ) + private RouteCtlg routeCtlg; + + @Column(name = "quantity") + private Double quantity; + + @Column(name = "km_old") + private Double kmOld; + + @Column(name = "km_new") + private Double kmNew; + + @Column(name = "total") + private Double total; + + @Enumerated(EnumType.STRING) + @Column(name = "status", nullable = false) + private GenericStatus status; + + @Column(name = "description", length = 500) + private String description; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + public Gasoline() { + } + + /** + * + * @param id + * @param user + * @param office + * @param routeCtlg + * @param kmNew + * @param total + * @param status + * @param description + * @param createdBy + * @param createdOn + */ + public Gasoline(String id, User user, Office office, RouteCtlg routeCtlg, Double quantity,Double kmNew, Double total, GenericStatus status, String description, String createdBy, Date createdOn) { + this.id = id; + this.user = user; + this.office = office; + this.routeCtlg = routeCtlg; + this.quantity = quantity; + this.kmNew = kmNew; + this.total = total; + this.status = status; + this.description = description; + this.createdBy = createdBy; + this.createdOn = createdOn; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public RouteCtlg getRouteCtlg() { + return routeCtlg; + } + + public void setRouteCtlg(RouteCtlg routeCtlg) { + this.routeCtlg = routeCtlg; + } + + public Double getQuantity() { + return quantity; + } + + public void setQuantity(Double quantity) { + this.quantity = quantity; + } + + public Double getKmOld() { + return kmOld; + } + + public void setKmOld(Double kmOld) { + this.kmOld = kmOld; + } + + public Double getKmNew() { + return kmNew; + } + + public void setKmNew(Double kmNew) { + this.kmNew = kmNew; + } + + public Double getTotal() { + return total; + } + + public void setTotal(Double total) { + this.total = total; + } + + public GenericStatus getStatus() { + return status; + } + + public void setStatus(GenericStatus status) { + this.status = status; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 79 * hash + Objects.hashCode(this.id); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final Gasoline other = (Gasoline) obj; + if (!Objects.equals(this.id, other.id)) { + return false; + } + return true; + } + + @Override + public String toString() { + return "Gasoline{" + "id=" + id + ", createdBy=" + createdBy + ", createdOn=" + createdOn + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/gasoline/constance/GasolineCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/gasoline/constance/GasolineCfg.java new file mode 100644 index 0000000..7335ac2 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/gasoline/constance/GasolineCfg.java @@ -0,0 +1,23 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.gasoline.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface GasolineCfg extends GenericCfg { + + String QUERY_FIND_LATEST_GASOLINE_PAYMENT_BY_USER_AND_ROUTE_AND_STATUS = "findLatestGasolinePaymentByuserAndRouteAndStatus"; + + String FIELD_USER = "user"; + String FIELD_ROUTE = "route"; + String FIELD_STATUS = "status"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/loan/Delivery.java b/apc-model/src/main/java/com/arrebol/apc/model/loan/Delivery.java new file mode 100644 index 0000000..6a771a6 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/loan/Delivery.java @@ -0,0 +1,176 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.loan; + +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.ComissionType; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_DELIVERY") +public class Delivery implements Serializable { + + private static final long serialVersionUID = 7580350030712936070L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_user", + referencedColumnName = "id", + nullable = false + ) + private User user; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_loan", + referencedColumnName = "id", + nullable = false + ) + private Loan loan; + + @Column(name = "amount", nullable = false) + private BigDecimal amount; + + @Enumerated(EnumType.STRING) + @Column(name = "comission") + private ComissionType comission; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + public Delivery() { + } + + /** + * + * @param user + * @param loan + * @param amount + * @param createdBy + * @param createdOn + */ + public Delivery(User user, Loan loan, BigDecimal amount, String createdBy, Date createdOn) { + this.user = user; + this.loan = loan; + this.amount = amount; + this.createdBy = createdBy; + this.createdOn = createdOn; + } + + /** + * + * @param user + * @param loan + * @param amount + * @param createdBy + * @param createdOn + * @param comission + */ + public Delivery(User user, Loan loan, BigDecimal amount, String createdBy, Date createdOn, ComissionType comission) { + this.user = user; + this.loan = loan; + this.amount = amount; + this.createdBy = createdBy; + this.createdOn = createdOn; + this.comission = comission; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public Loan getLoan() { + return loan; + } + + public void setLoan(Loan loan) { + this.loan = loan; + } + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + public ComissionType getComission() { + if (null == comission) { + comission = ComissionType.INCLUDED; + } + return comission; + } + + public void setComission(ComissionType comission) { + this.comission = comission; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + @Override + public String toString() { + return "Delivery{" + "user=" + user + ", createdOn=" + createdOn + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/loan/Loan.java b/apc-model/src/main/java/com/arrebol/apc/model/loan/Loan.java new file mode 100644 index 0000000..2543c99 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/loan/Loan.java @@ -0,0 +1,524 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.loan; + +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.LoanStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_LOAN") +public class Loan implements Serializable { + + private static final long serialVersionUID = -601238781806641208L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_loan_type", + referencedColumnName = "id", + nullable = false + ) + private LoanType loanType; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_customer", + referencedColumnName = "id", + nullable = false + ) + private People customer; + + @ManyToOne(fetch = FetchType.LAZY, optional = true) + @JoinColumn( + name = "id_endorsement", + referencedColumnName = "id", + nullable = true + ) + private People endorsement; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_route", + referencedColumnName = "id", + nullable = false + ) + private RouteCtlg routeCtlg; + + @Enumerated(EnumType.STRING) + @Column(name = "loan_status", nullable = false) + private LoanStatus loanStatus; + + @Enumerated(EnumType.STRING) + @Column(name = "new_customer") + private ActiveStatus newCustomer; + + @Column(name = "amount_paid", nullable = false) + private BigDecimal amountPaid; + + @Column(name = "amount_to_pay", nullable = false) + private BigDecimal amountToPay; + + @Column(name = "last_reference_number", nullable = false) + private Integer lastReferenceNumber; + + @Column(name = "comments", length = 200) + private String comments; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "juridical_date", length = 19) + private Date juridicalDate; + + @Enumerated(EnumType.STRING) + @Column(name = "frozen") + private ActiveStatus frozen; + + @OneToMany( + mappedBy = "loan", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List loanDetailses; + + @OneToMany( + mappedBy = "loan", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List loanByUsers; + + @OneToMany( + mappedBy = "loan", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List loanFeeNotifications; + + @OneToMany( + mappedBy = "loanOld", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List loanOldByRenovations; + + @OneToMany( + mappedBy = "loanNew", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List loanNewByRenovations; + + @OneToMany( + mappedBy = "loan", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List deliverys; + + public Loan() { + } + + /** + * + * @param loanType + * @param customer + * @param endorsement + * @param routeCtlg + * @param loanStatus + * @param amountPaid + * @param amountToPay + * @param lastReferenceNumber + * @param createdBy + * @param createdOn + * @param newCustomer + */ + public Loan(LoanType loanType, People customer, People endorsement, RouteCtlg routeCtlg, LoanStatus loanStatus, BigDecimal amountPaid, BigDecimal amountToPay, Integer lastReferenceNumber, String createdBy, Date createdOn, ActiveStatus newCustomer) { + this.loanType = loanType; + this.customer = customer; + this.endorsement = endorsement; + this.routeCtlg = routeCtlg; + this.loanStatus = loanStatus; + this.amountPaid = amountPaid; + this.amountToPay = amountToPay; + this.lastReferenceNumber = lastReferenceNumber; + this.createdBy = createdBy; + this.createdOn = createdOn; + this.newCustomer = newCustomer; + } + + /** + * + * @param loanType + * @param customer + * @param endorsement + * @param routeCtlg + * @param loanStatus + * @param amountPaid + * @param amountToPay + * @param lastReferenceNumber + * @param createdBy + * @param createdOn + * @param newCustomer + * @param frozen + */ + public Loan(LoanType loanType, People customer, People endorsement, RouteCtlg routeCtlg, LoanStatus loanStatus, BigDecimal amountPaid, BigDecimal amountToPay, Integer lastReferenceNumber, String createdBy, Date createdOn, ActiveStatus newCustomer, ActiveStatus frozen) { + this.loanType = loanType; + this.customer = customer; + this.endorsement = endorsement; + this.routeCtlg = routeCtlg; + this.loanStatus = loanStatus; + this.amountPaid = amountPaid; + this.amountToPay = amountToPay; + this.lastReferenceNumber = lastReferenceNumber; + this.createdBy = createdBy; + this.createdOn = createdOn; + this.newCustomer = newCustomer; + this.frozen = frozen; + } + + /** + * + * @param id + */ + public Loan(String id) { + this.id = id; + } + + /** + * + * @param loanType + * @param customer + * @param endorsement + * @param routeCtlg + * @param loanStatus + * @param amountPaid + * @param amountToPay + * @param lastReferenceNumber + * @param comments + * @param createdBy + */ + public Loan(LoanType loanType, People customer, People endorsement, RouteCtlg routeCtlg, LoanStatus loanStatus, BigDecimal amountPaid, BigDecimal amountToPay, Integer lastReferenceNumber, String comments, String createdBy) { + this.loanType = loanType; + this.customer = customer; + this.endorsement = endorsement; + this.routeCtlg = routeCtlg; + this.loanStatus = loanStatus; + this.amountPaid = amountPaid; + this.amountToPay = amountToPay; + this.lastReferenceNumber = lastReferenceNumber; + this.comments = comments; + this.createdBy = createdBy; + this.createdOn = new Date(); + } + + public Loan(LoanType loanType, People customer, People endorsement, RouteCtlg routeCtlg, LoanStatus loanStatus, BigDecimal amountPaid, BigDecimal amountToPay, Integer lastReferenceNumber, String createdBy) { + this.loanType = loanType; + this.customer = customer; + this.endorsement = endorsement; + this.routeCtlg = routeCtlg; + this.loanStatus = loanStatus; + this.amountPaid = amountPaid; + this.amountToPay = amountToPay; + this.lastReferenceNumber = lastReferenceNumber; + this.createdBy = createdBy; + this.createdOn = new Date(); + } + + /** + * Save create on from mobile devices. + * + * @param loanType + * @param customer + * @param endorsement + * @param routeCtlg + * @param loanStatus + * @param amountPaid + * @param amountToPay + * @param lastReferenceNumber + * @param createdBy + * @param createdOn + */ + public Loan(LoanType loanType, People customer, People endorsement, RouteCtlg routeCtlg, LoanStatus loanStatus, BigDecimal amountPaid, BigDecimal amountToPay, Integer lastReferenceNumber, String comments, String createdBy, Date createdOn) { + this.loanType = loanType; + this.customer = customer; + this.endorsement = endorsement; + this.routeCtlg = routeCtlg; + this.loanStatus = loanStatus; + this.amountPaid = amountPaid; + this.amountToPay = amountToPay; + this.lastReferenceNumber = lastReferenceNumber; + this.comments = comments; + this.createdBy = createdBy; + this.createdOn = createdOn; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public LoanType getLoanType() { + return loanType; + } + + public void setLoanType(LoanType loanType) { + this.loanType = loanType; + } + + public People getCustomer() { + return customer; + } + + public void setCustomer(People customer) { + this.customer = customer; + } + + public People getEndorsement() { + return endorsement; + } + + public void setEndorsement(People endorsement) { + this.endorsement = endorsement; + } + + public RouteCtlg getRouteCtlg() { + return routeCtlg; + } + + public void setRouteCtlg(RouteCtlg routeCtlg) { + this.routeCtlg = routeCtlg; + } + + public LoanStatus getLoanStatus() { + return loanStatus; + } + + public void setLoanStatus(LoanStatus loanStatus) { + this.loanStatus = loanStatus; + } + + public ActiveStatus getNewCustomer() { + return newCustomer; + } + + public void setNewCustomer(ActiveStatus newCustomer) { + this.newCustomer = newCustomer; + } + + public BigDecimal getAmountPaid() { + return amountPaid; + } + + public void setAmountPaid(BigDecimal amountPaid) { + this.amountPaid = amountPaid; + } + + public BigDecimal getAmountToPay() { + return amountToPay; + } + + public void setAmountToPay(BigDecimal amountToPay) { + this.amountToPay = amountToPay; + } + + public Integer getLastReferenceNumber() { + return lastReferenceNumber; + } + + public void setLastReferenceNumber(Integer lastReferenceNumber) { + this.lastReferenceNumber = lastReferenceNumber; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public List getLoanDetailses() { + return loanDetailses; + } + + public void setLoanDetailses(List loanDetailses) { + this.loanDetailses = loanDetailses; + } + + public List getLoanByUsers() { + return loanByUsers; + } + + public void setLoanByUsers(List loanByUsers) { + this.loanByUsers = loanByUsers; + } + + public List getLoanFeeNotifications() { + return loanFeeNotifications; + } + + public void setLoanFeeNotifications(List loanFeeNotifications) { + this.loanFeeNotifications = loanFeeNotifications; + } + + public List getLoanOldByRenovations() { + return loanOldByRenovations; + } + + public void setLoanOldByRenovations(List loanOldByRenovations) { + this.loanOldByRenovations = loanOldByRenovations; + } + + public List getLoanNewByRenovations() { + return loanNewByRenovations; + } + + public void setLoanNewByRenovations(List loanNewByRenovations) { + this.loanNewByRenovations = loanNewByRenovations; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public Integer getTotalFeeByLoan() { + if (getLoanFeeNotifications() != null) { + return getLoanFeeNotifications().size(); + } else { + return 0; + } + } + + public String getAsesor() { + if (getLoanByUsers() != null && !getLoanByUsers().isEmpty()) { + return getLoanByUsers().get(0).getUser().getHumanResource().getFirstName() + " " + + getLoanByUsers().get(0).getUser().getHumanResource().getLastName(); + } else { + return ""; + } + } + + public List getDeliverys() { + return deliverys; + } + + public void setDeliverys(List deliverys) { + this.deliverys = deliverys; + } + + public Date getJuridicalDate() { + return juridicalDate; + } + + public void setJuridicalDate(Date juridicalDate) { + this.juridicalDate = juridicalDate; + } + + public ActiveStatus getFrozen() { + if (frozen == null) { + frozen = ActiveStatus.DISABLED; + } + + return frozen; + } + + public void setFrozen(ActiveStatus frozen) { + this.frozen = frozen; + } + + @Override + public String toString() { + return "Loan{" + "loanType=" + loanType + ", createdBy=" + createdBy + '}'; + } + + public String getLoanTypeByDays() { + + return getLoanType().getLoanTypeName() + " a " + getLoanType().getTotalDays() + " dias"; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/loan/LoanByRenovation.java b/apc-model/src/main/java/com/arrebol/apc/model/loan/LoanByRenovation.java new file mode 100644 index 0000000..9de339d --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/loan/LoanByRenovation.java @@ -0,0 +1,168 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.loan; + +import com.arrebol.apc.model.enums.LoanRenovationStatus; +import java.io.Serializable; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_LOAN_BY_RENOVATION") +public class LoanByRenovation implements Serializable { + + private static final long serialVersionUID = 6330391021926685986L; + + @EmbeddedId + LoanByRenovationId id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn( + name = "id_loan_old", + referencedColumnName = "id", + insertable = false, + updatable = false + ) + private Loan loanOld; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn( + name = "id_loan_new", + referencedColumnName = "id", + insertable = false, + updatable = false + ) + private Loan loanNew; + + @Enumerated(EnumType.STRING) + @Column(name = "loan_by_renovation_status", nullable = false) + private LoanRenovationStatus loanRenovationStatus; + + @Column(name = "comments", length = 150) + private String comments; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + public LoanByRenovation() { + } + + public LoanByRenovation(LoanByRenovationId id) { + this.id = id; + } + + public LoanByRenovation(LoanByRenovationId id, LoanRenovationStatus loanRenovationStatus, String createdBy, Date createdOn) { + this.id = id; + this.loanRenovationStatus = loanRenovationStatus; + this.createdBy = createdBy; + this.createdOn = createdOn; + } + + public LoanByRenovationId getId() { + return id; + } + + public void setId(LoanByRenovationId id) { + this.id = id; + } + + public Loan getLoanOld() { + return loanOld; + } + + public void setLoanOld(Loan loanOld) { + this.loanOld = loanOld; + } + + public Loan getLoanNew() { + return loanNew; + } + + public void setLoanNew(Loan loanNew) { + this.loanNew = loanNew; + } + + public LoanRenovationStatus getLoanRenovationStatus() { + return loanRenovationStatus; + } + + public void setLoanRenovationStatus(LoanRenovationStatus loanRenovationStatus) { + this.loanRenovationStatus = loanRenovationStatus; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + @Override + public String toString() { + return "LoanByRenovation{" + "loanOld=" + loanOld + ", loanNew=" + loanNew + ", loanRenovationStatus=" + loanRenovationStatus + ", comments=" + comments + ", createdOn=" + createdOn + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/loan/LoanByRenovationId.java b/apc-model/src/main/java/com/arrebol/apc/model/loan/LoanByRenovationId.java new file mode 100644 index 0000000..db27630 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/loan/LoanByRenovationId.java @@ -0,0 +1,88 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.loan; + +import java.io.Serializable; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Embeddable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Embeddable +public class LoanByRenovationId implements Serializable { + + private static final long serialVersionUID = 5820034171440805154L; + + @Column(name = "id_loan_old", length = 36, nullable = true) + private String idLoanOld; + + @Column(name = "id_loan_new", length = 36, nullable = true) + private String idUserNew; + + public LoanByRenovationId() { + } + + /** + * + * @param idLoanOld + * @param idUserNew + */ + public LoanByRenovationId(String idLoanOld, String idUserNew) { + this.idLoanOld = idLoanOld; + this.idUserNew = idUserNew; + } + + public String getIdLoanOld() { + return idLoanOld; + } + + public void setIdLoanOld(String idLoanOld) { + this.idLoanOld = idLoanOld; + } + + public String getIdUserNew() { + return idUserNew; + } + + public void setIdUserNew(String idUserNew) { + this.idUserNew = idUserNew; + } + + @Override + public int hashCode() { + int hash = 5; + hash = 41 * hash + Objects.hashCode(this.idLoanOld); + hash = 41 * hash + Objects.hashCode(this.idUserNew); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final LoanByRenovationId other = (LoanByRenovationId) obj; + if (!Objects.equals(this.idLoanOld, other.idLoanOld)) { + return false; + } + if (!Objects.equals(this.idUserNew, other.idUserNew)) { + return false; + } + return true; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/loan/LoanByUser.java b/apc-model/src/main/java/com/arrebol/apc/model/loan/LoanByUser.java new file mode 100644 index 0000000..8d334e0 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/loan/LoanByUser.java @@ -0,0 +1,179 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.loan; + +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.LoanStatus; +import com.arrebol.apc.model.enums.OwnerLoan; +import java.io.Serializable; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_LOAN_BY_USER") +public class LoanByUser implements Serializable { + + private static final long serialVersionUID = 6101775548154917785L; + + @EmbeddedId + private LoanByUserId id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn( + name = "id_loan", + referencedColumnName = "id", + insertable = false, + updatable = false + ) + private Loan loan; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn( + name = "id_user", + referencedColumnName = "id", + insertable = false, + updatable = false + ) + private User user; + + @Enumerated(EnumType.STRING) + @Column(name = "loan_by_user_status", nullable = false) + private LoanStatus loanByUserStatus; + + @Column(name = "order_in_list") + private Integer orderInList; + + @Column(name = "comments", length = 150) + private String comments; + + @Enumerated(EnumType.STRING) + @Column(name = "owner_loan", nullable = false) + private OwnerLoan ownerLoan; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + public LoanByUser() { + } + + /** + * + * @param id + * @param loanByUserStatus + * @param ownerLoan + * @param createdBy + */ + public LoanByUser(LoanByUserId id, LoanStatus loanByUserStatus, OwnerLoan ownerLoan, String createdBy) { + this.id = id; + this.loanByUserStatus = loanByUserStatus; + this.ownerLoan = ownerLoan; + this.createdBy = createdBy; + this.createdOn = new Date(); + } + + /** + * + * @param id + * @param orderInList + */ + public LoanByUser(LoanByUserId id, Integer orderInList) { + this.id = id; + this.orderInList = orderInList; + } + + public LoanByUserId getId() { + return id; + } + + public void setId(LoanByUserId id) { + this.id = id; + } + + public Loan getLoan() { + return loan; + } + + public void setLoan(Loan loan) { + this.loan = loan; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public LoanStatus getLoanByUserStatus() { + return loanByUserStatus; + } + + public void setLoanByUserStatus(LoanStatus loanByUserStatus) { + this.loanByUserStatus = loanByUserStatus; + } + + public Integer getOrderInList() { + return orderInList; + } + + public void setOrderInList(Integer orderInList) { + this.orderInList = orderInList; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public OwnerLoan getOwnerLoan() { + return ownerLoan; + } + + public void setOwnerLoan(OwnerLoan ownerLoan) { + this.ownerLoan = ownerLoan; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/loan/LoanByUserId.java b/apc-model/src/main/java/com/arrebol/apc/model/loan/LoanByUserId.java new file mode 100644 index 0000000..6c807f4 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/loan/LoanByUserId.java @@ -0,0 +1,88 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.loan; + +import java.io.Serializable; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Embeddable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Embeddable +public class LoanByUserId implements Serializable { + + private static final long serialVersionUID = -8533525004902104723L; + + @Column(name = "id_loan", length = 36, nullable = true) + private String idLoan; + + @Column(name = "id_user", length = 36, nullable = true) + private String idUser; + + public LoanByUserId() { + } + + /** + * + * @param idLoan + * @param idUser + */ + public LoanByUserId(String idLoan, String idUser) { + this.idLoan = idLoan; + this.idUser = idUser; + } + + public String getIdLoan() { + return idLoan; + } + + public void setIdLoan(String idLoan) { + this.idLoan = idLoan; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 47 * hash + Objects.hashCode(this.idLoan); + hash = 47 * hash + Objects.hashCode(this.idUser); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final LoanByUserId other = (LoanByUserId) obj; + if (!Objects.equals(this.idLoan, other.idLoan)) { + return false; + } + if (!Objects.equals(this.idUser, other.idUser)) { + return false; + } + return true; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/loan/LoanDetails.java b/apc-model/src/main/java/com/arrebol/apc/model/loan/LoanDetails.java new file mode 100644 index 0000000..9dc0695 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/loan/LoanDetails.java @@ -0,0 +1,345 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.loan; + +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.FeeStatus; +import com.arrebol.apc.model.enums.LoanDetailsType; +import com.arrebol.apc.model.enums.PeopleType; +import com.arrebol.apc.model.enums.TransferStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; +import javax.persistence.UniqueConstraint; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_LOAN_DETAIL", + uniqueConstraints = { + @UniqueConstraint(columnNames = {"id", "reference_number"}, name = "apc_loan_details_uk") + }) +public class LoanDetails implements Serializable { + + private static final long serialVersionUID = -6757564734339598051L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_loan", + referencedColumnName = "id", + nullable = false + ) + private Loan loan; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_user", + referencedColumnName = "id", + nullable = false + ) + private User user; + + @Enumerated(EnumType.STRING) + @Column(name = "people_type", nullable = false) + private PeopleType peopleType; + + @Column(name = "payment_amount", nullable = false) + private BigDecimal paymentAmount; + + @Column(name = "reference_number") + private Integer referenceNumber; + + @Enumerated(EnumType.STRING) + @Column(name = "loan_details_type", nullable = false) + private LoanDetailsType loanDetailsType; + + @Column(name = "loan_comments", length = 150) + private String comments; + + @Enumerated(EnumType.STRING) + @Column(name = "fee_status") + private FeeStatus feeStatus; + + @Enumerated(EnumType.STRING) + @Column(name = "transfer_status") + private TransferStatus transferStatus; + + @Column(name = "transfer_number", length = 150) + private String transferNumber; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Transient + private BigDecimal saldoInsoluto; + + public LoanDetails() { + } + + /** + * + * @param id + * @param createdOn + * @param feeStatus + */ + public LoanDetails(String id, Date createdOn, FeeStatus feeStatus) { + this.id = id; + this.createdOn = createdOn; + this.feeStatus = feeStatus; + } + + /** + * Complete constructor. + * + * @param id + * @param loan + * @param peopleType + * @param paymentAmount + * @param loanDetailsType + * @param comments + * @param createdBy + * @param createdOn + */ + public LoanDetails(String id, Loan loan, PeopleType peopleType, BigDecimal paymentAmount, LoanDetailsType loanDetailsType, String comments, String createdBy, Date createdOn) { + this.id = id; + this.loan = loan; + this.peopleType = peopleType; + this.paymentAmount = paymentAmount; + this.loanDetailsType = loanDetailsType; + this.comments = comments; + this.createdBy = createdBy; + this.createdOn = createdOn; + } + + /** + * + * @param id + * @param loan + * @param user + * @param peopleType + * @param referenceNumber + * @param paymentAmount + * @param loanDetailsType + * @param comments + * @param createdBy + * @param createdOn + */ + public LoanDetails(String id, Loan loan, User user, PeopleType peopleType, Integer referenceNumber, BigDecimal paymentAmount, LoanDetailsType loanDetailsType, String comments, String createdBy, Date createdOn) { + this.id = id; + this.loan = loan; + this.user = user; + this.peopleType = peopleType; + this.referenceNumber = referenceNumber; + this.paymentAmount = paymentAmount; + this.loanDetailsType = loanDetailsType; + this.comments = comments; + this.createdBy = createdBy; + this.createdOn = createdOn; + } + + /** + * Add new amount. + * + * @param loan + * @param user + * @param peopleType + * @param paymentAmount + * @param referenceNumber + * @param loanDetailsType + * @param createdBy + * @param createdOn + * @param comments + */ + public LoanDetails(Loan loan, User user, PeopleType peopleType, BigDecimal paymentAmount, Integer referenceNumber, LoanDetailsType loanDetailsType, String createdBy, Date createdOn, String comments) { + this.loan = loan; + this.user = user; + this.peopleType = peopleType; + this.paymentAmount = paymentAmount; + this.referenceNumber = referenceNumber; + this.loanDetailsType = loanDetailsType; + this.createdBy = createdBy; + this.createdOn = createdOn; + this.comments = comments; + } + + /** + * + * @param loan + * @param user + * @param peopleType + * @param paymentAmount + * @param referenceNumber + * @param loanDetailsType + * @param createdBy + * @param createdOn + * @param comments + * @param transferNumber + * @param transferStatus + */ + public LoanDetails(Loan loan, User user, PeopleType peopleType, BigDecimal paymentAmount, Integer referenceNumber, LoanDetailsType loanDetailsType, String createdBy, Date createdOn, String comments, String transferNumber, TransferStatus transferStatus) { + this.loan = loan; + this.user = user; + this.peopleType = peopleType; + this.paymentAmount = paymentAmount; + this.referenceNumber = referenceNumber; + this.loanDetailsType = loanDetailsType; + this.createdBy = createdBy; + this.createdOn = createdOn; + this.comments = comments; + this.transferNumber = transferNumber; + this.transferStatus = transferStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Loan getLoan() { + return loan; + } + + public void setLoan(Loan loan) { + this.loan = loan; + } + + public PeopleType getPeopleType() { + return peopleType; + } + + public void setPeopleType(PeopleType peopleType) { + this.peopleType = peopleType; + } + + public BigDecimal getPaymentAmount() { + return paymentAmount; + } + + public void setPaymentAmount(BigDecimal paymentAmount) { + this.paymentAmount = paymentAmount; + } + + public Integer getReferenceNumber() { + return referenceNumber; + } + + public void setReferenceNumber(Integer referenceNumber) { + this.referenceNumber = referenceNumber; + } + + public LoanDetailsType getLoanDetailsType() { + return loanDetailsType; + } + + public void setLoanDetailsType(LoanDetailsType loanDetailsType) { + this.loanDetailsType = loanDetailsType; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public FeeStatus getFeeStatus() { + return feeStatus; + } + + public void setFeeStatus(FeeStatus feeStatus) { + this.feeStatus = feeStatus; + } + + public TransferStatus getTransferStatus() { + return transferStatus; + } + + public void setTransferStatus(TransferStatus transferStatus) { + this.transferStatus = transferStatus; + } + + public String getTransferNumber() { + return transferNumber; + } + + public void setTransferNumber(String transferNumber) { + this.transferNumber = transferNumber; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public BigDecimal getSaldoInsoluto() { + return saldoInsoluto; + } + + public void setSaldoInsoluto(BigDecimal saldoInsoluto) { + this.saldoInsoluto = saldoInsoluto; + } + + public Double getAbonoD() { + return getPaymentAmount().doubleValue(); + } + + @Override + public String toString() { + return "LoanDetails{" + "referenceNumber=" + referenceNumber + ", comments=" + comments + ", createdBy=" + createdBy + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/loan/LoanFeeNotification.java b/apc-model/src/main/java/com/arrebol/apc/model/loan/LoanFeeNotification.java new file mode 100644 index 0000000..d696d61 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/loan/LoanFeeNotification.java @@ -0,0 +1,139 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.loan; + +import com.arrebol.apc.model.core.User; +import java.io.Serializable; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_LOAN_FEE_NOTIFICATION") +public class LoanFeeNotification implements Serializable { + + private static final long serialVersionUID = -6178422651111540801L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_loan", + referencedColumnName = "id", + nullable = false + ) + private Loan loan; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_user", + referencedColumnName = "id", + nullable = false + ) + private User user; + + @Column(name = "notification_number", nullable = false, length = 36) + private Integer notificationNumber; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + public LoanFeeNotification() { + } + + /** + * + * @param loan + * @param user + * @param notificationNumber + * @param createdBy + * @param createdOn + */ + public LoanFeeNotification(Loan loan, User user, Integer notificationNumber, String createdBy, Date createdOn) { + this.loan = loan; + this.user = user; + this.notificationNumber = notificationNumber; + this.createdBy = createdBy; + this.createdOn = createdOn; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Loan getLoan() { + return loan; + } + + public void setLoan(Loan loan) { + this.loan = loan; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public Integer getNotificationNumber() { + return notificationNumber; + } + + public void setNotificationNumber(Integer notificationNumber) { + this.notificationNumber = notificationNumber; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + @Override + public String toString() { + return "LoanFeeNotification{" + "notificationNumber=" + notificationNumber + ", createdBy=" + createdBy + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/loan/LoanType.java b/apc-model/src/main/java/com/arrebol/apc/model/loan/LoanType.java new file mode 100644 index 0000000..9181bd0 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/loan/LoanType.java @@ -0,0 +1,357 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.loan; + +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.DaysInWeekend; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_LOAN_TYPE") +public class LoanType implements Serializable { + + private static final long serialVersionUID = 1286109384972738375L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "loan_type_name", length = 50, nullable = false) + private String loanTypeName; + + @Column(name = "total_days", nullable = false) + private Integer totalDays; + + @Column(name = "loan_fee", nullable = false) + private BigDecimal fee; + + @Column(name = "opening_fee", nullable = false) + private Integer openingFee; + + @Column(name = "payment", nullable = false) + private BigDecimal payment; + + @Column(name = "payment_daily", nullable = false) + private BigDecimal paymentDaily; + + @Column(name = "payment_total", nullable = false) + private BigDecimal paymentTotal; + + @Column(name = "cantidad_existente", nullable = false) + private BigDecimal cantidadExistente; + + @Enumerated(EnumType.STRING) + @Column(name = "payment_monday") + private DaysInWeekend monday; + + @Enumerated(EnumType.STRING) + @Column(name = "payment_tuesday") + private DaysInWeekend tuesday; + + @Enumerated(EnumType.STRING) + @Column(name = "payment_wednesday") + private DaysInWeekend wednesday; + + @Enumerated(EnumType.STRING) + @Column(name = "payment_thursday") + private DaysInWeekend thursday; + + @Enumerated(EnumType.STRING) + @Column(name = "payment_friday") + private DaysInWeekend friday; + + @Enumerated(EnumType.STRING) + @Column(name = "payment_saturday") + private DaysInWeekend saturday; + + @Enumerated(EnumType.STRING) + @Column(name = "payment_sunday") + private DaysInWeekend sunday; + + @Enumerated(EnumType.STRING) + @Column(name = "convenio", nullable = false) + private ActiveStatus convenio; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + @OneToMany( + mappedBy = "loanType", + cascade = CascadeType.ALL, + fetch = FetchType.LAZY, + orphanRemoval = true + ) + private List loans; + + public LoanType() { + } + + /** + * + * @param id + */ + public LoanType(String id) { + this.id = id; + } + + /** + * + * @param id + * @param payment + */ + public LoanType(String id, BigDecimal payment) { + this.id = id; + this.payment = payment; + } + + /** + * + * @param id + * @param payment + * @param loanTypeName + */ + public LoanType(String id, BigDecimal payment, String loanTypeName) { + this.id = id; + this.payment = payment; + this.loanTypeName = loanTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLoanTypeName() { + return loanTypeName; + } + + public void setLoanTypeName(String loanTypeName) { + this.loanTypeName = loanTypeName; + } + + public Integer getTotalDays() { + return totalDays; + } + + public void setTotalDays(Integer totalDays) { + this.totalDays = totalDays; + } + + public BigDecimal getFee() { + return fee; + } + + public void setFee(BigDecimal fee) { + this.fee = fee; + } + + public Integer getOpeningFee() { + return openingFee; + } + + public void setOpeningFee(Integer openingFee) { + this.openingFee = openingFee; + } + + public BigDecimal getPayment() { + return payment; + } + + public void setPayment(BigDecimal payment) { + this.payment = payment; + } + + public BigDecimal getPaymentDaily() { + return paymentDaily; + } + + public void setPaymentDaily(BigDecimal paymentDaily) { + this.paymentDaily = paymentDaily; + } + + public BigDecimal getPaymentTotal() { + return paymentTotal; + } + + public void setPaymentTotal(BigDecimal paymentTotal) { + this.paymentTotal = paymentTotal; + } + + public BigDecimal getCantidadExistente() { + return cantidadExistente; + } + + public void setCantidadExistente(BigDecimal cantidadExistente) { + this.cantidadExistente = cantidadExistente; + } + + public DaysInWeekend getMonday() { + return monday; + } + + public void setMonday(DaysInWeekend monday) { + this.monday = monday; + } + + public DaysInWeekend getTuesday() { + return tuesday; + } + + public void setTuesday(DaysInWeekend tuesday) { + this.tuesday = tuesday; + } + + public DaysInWeekend getWednesday() { + return wednesday; + } + + public void setWednesday(DaysInWeekend wednesday) { + this.wednesday = wednesday; + } + + public DaysInWeekend getThursday() { + return thursday; + } + + public void setThursday(DaysInWeekend thursday) { + this.thursday = thursday; + } + + public DaysInWeekend getFriday() { + return friday; + } + + public void setFriday(DaysInWeekend friday) { + this.friday = friday; + } + + public DaysInWeekend getSaturday() { + return saturday; + } + + public void setSaturday(DaysInWeekend saturday) { + this.saturday = saturday; + } + + public DaysInWeekend getSunday() { + return sunday; + } + + public void setSunday(DaysInWeekend sunday) { + this.sunday = sunday; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public List getLoans() { + return loans; + } + + public void setLoans(List loans) { + this.loans = loans; + } + + public ActiveStatus getConvenio() { + return convenio; + } + + public void setConvenio(ActiveStatus convenio) { + this.convenio = convenio; + } + + @Override + public String toString() { + return "LoanType{" + "loanTypeName=" + loanTypeName + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/mobile/access/MobileUser.java b/apc-model/src/main/java/com/arrebol/apc/model/mobile/access/MobileUser.java new file mode 100644 index 0000000..1de0578 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/mobile/access/MobileUser.java @@ -0,0 +1,134 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.mobile.access; + +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_SECURITY_AUTHENTICATION_MOBILE") +public class MobileUser implements Serializable { + + private static final long serialVersionUID = -6025180801746858060L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "user_name", length = 36) + private String userName; + + @Column(name = "pwd", length = 100) + private String password; + + @Column(name = "avatar", length = 150) + private String avatar; + + @Column(name = "id_office", length = 36) + private String officeId; + + @Column(name = "id_route", length = 36) + private String routeId; + + @Column(name = "certifier", length = 25) + private String certifier; + + @Enumerated(EnumType.STRING) + @Column(name = "management", nullable = false) + private ActiveStatus management; + + public MobileUser() { + } + + public MobileUser(String userName, String password) { + this.userName = userName; + this.password = password; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getOfficeId() { + return officeId; + } + + public void setOfficeId(String officeId) { + this.officeId = officeId; + } + + public String getRouteId() { + return routeId; + } + + public void setRouteId(String routeId) { + this.routeId = routeId; + } + + public String getCertifier() { + return certifier; + } + + public void setCertifier(String certifier) { + this.certifier = certifier; + } + + public ActiveStatus getManagement() { + return management; + } + + public void setManagement(ActiveStatus management) { + this.management = management; + } + + @Override + public String toString() { + return "Authentication{" + "userName=" + userName + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/mobile/preference/UserMobilePreference.java b/apc-model/src/main/java/com/arrebol/apc/model/mobile/preference/UserMobilePreference.java new file mode 100644 index 0000000..6ae13bd --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/mobile/preference/UserMobilePreference.java @@ -0,0 +1,186 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.mobile.preference; + +import com.arrebol.apc.model.core.User; +import java.io.Serializable; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.UniqueConstraint; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_USER_MOBILE_PREFERECE", + uniqueConstraints = { + @UniqueConstraint( + columnNames = {"id_user", "preference_name"}, + name = "apc_user_mobile_preference_uk") + } +) +public class UserMobilePreference implements Serializable { + + private static final long serialVersionUID = -7248171471566169076L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_user", + referencedColumnName = "id", + nullable = false + ) + private User user; + + @Column(name = "preference_name", nullable = false, length = 25) + private String preferenceName; + + @Column(name = "preference_value", nullable = false, length = 25) + private String preferenceValue; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + public UserMobilePreference() { + } + + /** + * Complete constructor. + * + * @param id + * @param user + * @param preferenceName + * @param preferenceValue + * @param createdBy + * @param createdOn + * @param lastUpdatedBy + * @param lastUpdatedOn + */ + public UserMobilePreference(String id, User user, String preferenceName, String preferenceValue, String createdBy, Date createdOn, String lastUpdatedBy, Date lastUpdatedOn) { + this.id = id; + this.user = user; + this.preferenceName = preferenceName; + this.preferenceValue = preferenceValue; + this.createdBy = createdBy; + this.createdOn = createdOn; + this.lastUpdatedBy = lastUpdatedBy; + this.lastUpdatedOn = lastUpdatedOn; + } + + /** + * + * @param user + * @param preferenceName + * @param preferenceValue + * @param createdBy + */ + public UserMobilePreference(User user, String preferenceName, String preferenceValue, String createdBy) { + this.user = user; + this.preferenceName = preferenceName; + this.preferenceValue = preferenceValue; + this.createdBy = createdBy; + this.createdOn = new Date(); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public String getPreferenceName() { + return preferenceName; + } + + public void setPreferenceName(String preferenceName) { + this.preferenceName = preferenceName; + } + + public String getPreferenceValue() { + return preferenceValue; + } + + public void setPreferenceValue(String preferenceValue) { + this.preferenceValue = preferenceValue; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + @Override + public String toString() { + return "UserMobilePreference{" + "user=" + user + ", preferenceName=" + preferenceName + ", preferenceValue=" + preferenceValue + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/payroll/Payroll.java b/apc-model/src/main/java/com/arrebol/apc/model/payroll/Payroll.java new file mode 100644 index 0000000..9004371 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/payroll/Payroll.java @@ -0,0 +1,371 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.payroll; + +import com.arrebol.apc.model.admin.ExpenseCompany; +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Table(name = "APC_PAYROLL") +public class Payroll implements Serializable { + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_human_resource", + referencedColumnName = "id", + nullable = false + ) + private HumanResource humanResource; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Enumerated(EnumType.STRING) + @Column(name = "active_status", nullable = false) + private ActiveStatus activeStatus; + + @Column(name = "salary", nullable = false) + private BigDecimal salary; + + @Column(name = "imss", nullable = false) + private BigDecimal imss; + + @Column(name = "advance", nullable = false) + private BigDecimal advance; + + @Column(name = "total_bonus_new_customer", nullable = false) + private BigDecimal totalBonusNewCustomer; + + @Column(name = "total_bonus_colocation", nullable = false) + private BigDecimal totalBonusColocation; + + @Column(name = "total_bonus_mora", nullable = false) + private BigDecimal totalBonusMora; + + @Column(name = "discounts", nullable = false) + private BigDecimal discounts; + + @Column(name = "increases", nullable = false) + private BigDecimal increases; + + @Column(name = "total_payment", nullable = false) + private BigDecimal totalPayment; + + @Column(name = "total_days_salary", nullable = false) + private Integer totalDaysSalary; + + @Column(name = "total_days_bonus", nullable = false) + private Integer totalDaysBonus; + + @Column(name = "comments_discounts", length = 200) + private String commentsDiscounts; + + @Column(name = "comments_increases", length = 200) + private String commentsIncreases; + + @Column(name = "observation", length = 200) + private String observation; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + @Column(name = "boxed", nullable = false) + private BigDecimal boxed; + + @Column(name = "saving", nullable = false) + private BigDecimal saving; + + @Column(name = "payment_to_debt", nullable = false) + private BigDecimal paymentToDebt; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public HumanResource getHumanResource() { + return humanResource; + } + + public void setHumanResource(HumanResource humanResource) { + this.humanResource = humanResource; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public ActiveStatus getActiveStatus() { + return activeStatus; + } + + public void setActiveStatus(ActiveStatus activeStatus) { + this.activeStatus = activeStatus; + } + + public BigDecimal getSalary() { + return salary; + } + + public void setSalary(BigDecimal salary) { + this.salary = salary; + } + + public BigDecimal getImss() { + return imss; + } + + public void setImss(BigDecimal imss) { + this.imss = imss; + } + + public BigDecimal getAdvance() { + return advance; + } + + public void setAdvance(BigDecimal advance) { + this.advance = advance; + } + + public BigDecimal getTotalBonusNewCustomer() { + return totalBonusNewCustomer; + } + + public void setTotalBonusNewCustomer(BigDecimal totalBonusNewCustomer) { + this.totalBonusNewCustomer = totalBonusNewCustomer; + } + + public BigDecimal getTotalBonusColocation() { + return totalBonusColocation; + } + + public void setTotalBonusColocation(BigDecimal totalBonusColocation) { + this.totalBonusColocation = totalBonusColocation; + } + + public BigDecimal getTotalBonusMora() { + return totalBonusMora; + } + + public void setTotalBonusMora(BigDecimal totalBonusMora) { + this.totalBonusMora = totalBonusMora; + } + + public BigDecimal getDiscounts() { + return discounts; + } + + public void setDiscounts(BigDecimal discounts) { + this.discounts = discounts; + } + + public BigDecimal getIncreases() { + return increases; + } + + public void setIncreases(BigDecimal increases) { + this.increases = increases; + } + + public BigDecimal getTotalPayment() { + return totalPayment; + } + + public void setTotalPayment(BigDecimal totalPayment) { + this.totalPayment = totalPayment; + } + + public Integer getTotalDaysSalary() { + return totalDaysSalary; + } + + public void setTotalDaysSalary(Integer totalDaysSalary) { + this.totalDaysSalary = totalDaysSalary; + } + + public Integer getTotalDaysBonus() { + return totalDaysBonus; + } + + public void setTotalDaysBonus(Integer totalDaysBonus) { + this.totalDaysBonus = totalDaysBonus; + } + + public String getCommentsDiscounts() { + return commentsDiscounts; + } + + public void setCommentsDiscounts(String commentsDiscounts) { + this.commentsDiscounts = commentsDiscounts; + } + + public String getCommentsIncreases() { + return commentsIncreases; + } + + public void setCommentsIncreases(String commentsIncreases) { + this.commentsIncreases = commentsIncreases; + } + + public String getObservation() { + return observation; + } + + public void setObservation(String observation) { + this.observation = observation; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public boolean getAction(Date lastStableGeneralBox) { + Date date = createdOn; + boolean action = true; + try { + SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); + + String dateStr = dt1.format(date); + date = dt1.parse(dateStr); + + action = date.after(lastStableGeneralBox); + + } catch (ParseException ex) { + Logger.getLogger(ExpenseCompany.class.getName()).log(Level.SEVERE, null, ex); + } + return action; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public BigDecimal getBoxed() { + return boxed; + } + + public void setBoxed(BigDecimal boxed) { + this.boxed = boxed; + } + + public BigDecimal getSaving() { + return saving; + } + + public void setSaving(BigDecimal saving) { + this.saving = saving; + } + + public BigDecimal getPaymentToDebt() { + return paymentToDebt; + } + + public void setPaymentToDebt(BigDecimal paymentToDebt) { + this.paymentToDebt = paymentToDebt; + } + + public BigDecimal summaryPerceptions() { + return salary.add(totalBonusNewCustomer).add(totalBonusColocation).add(totalBonusMora).add(increases); + } + + public String conditionEnabled() { + if (getActiveStatus() == ActiveStatus.DISABLED) { + return "grayRow"; + } else { + return null; + } + } + + public boolean getActive() { + if (activeStatus == ActiveStatus.ENEBLED) { + return true; + } else { + return false; + } + + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/payroll/TotalExpectedPaymentDailyByUser.java b/apc-model/src/main/java/com/arrebol/apc/model/payroll/TotalExpectedPaymentDailyByUser.java new file mode 100644 index 0000000..29140e3 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/payroll/TotalExpectedPaymentDailyByUser.java @@ -0,0 +1,169 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.payroll; + +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Oscar Vargas + */ +@Entity +@Table(name = "APC_TOTAL_EXPECTED_PAYMENT_DAILY_BY_USER") +public class TotalExpectedPaymentDailyByUser implements Serializable { + + private static final long serialVersionUID = -4380548310735493011L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_user", + referencedColumnName = "id", + nullable = false + ) + private User user; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Column(name = "total_expected", nullable = false) + private BigDecimal totalExpected; + + @Column(name = "total_expected_payment") + private BigDecimal totalExpectedPayment; + + @Enumerated(EnumType.STRING) + @Column(name = "active_status", nullable = false) + private ActiveStatus activeStatus; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + public TotalExpectedPaymentDailyByUser() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public BigDecimal getTotalExpected() { + return totalExpected; + } + + public void setTotalExpected(BigDecimal totalExpected) { + this.totalExpected = totalExpected; + } + + public ActiveStatus getActiveStatus() { + return activeStatus; + } + + public void setActiveStatus(ActiveStatus activeStatus) { + this.activeStatus = activeStatus; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + public BigDecimal getTotalExpectedPayment() { + return totalExpectedPayment; + } + + public void setTotalExpectedPayment(BigDecimal totalExpectedPayment) { + this.totalExpectedPayment = totalExpectedPayment; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/payroll/constance/PayRollCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/payroll/constance/PayRollCfg.java new file mode 100644 index 0000000..d4067c0 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/payroll/constance/PayRollCfg.java @@ -0,0 +1,40 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.payroll.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface PayRollCfg extends GenericCfg { + + String QUERY_SUM_ALL_ADVANCE_BY_USER = "totalAdvanceForDatesByUser"; + String QUERY_COUNT_NEW_CUSTOMER_FOR_LOANS_BY_USER = "totalNewCustomerLoansByUser"; + String QUERY_SUM_FOR_LOANS_BY_USER = "totalLoansByUserForDates"; + String QUERY_FIND_GOAL_BY_DATES = "getGoalByDates"; + String QUERY_FIND_LAST_GOAL = "getLastGoal"; + String QUERY_SUM_LOAN_DETAILS_PAYMENT_BY_USER = "getLoanDetailsByUserForDates"; + String QUERY_SUM_LOAN_DETAILS_FEE_BY_USER = "getFeeByUserForDates"; + String QUERY_FIND_PAYROLL_BY_OFFICE = "findAllPayrollByOffice"; + String QUERY_FIND_PAYROLL_BY_OFFICE_BETWEEN_DATES = "findAllPayrollByOfficeBetweenDates"; + String QUERY_UPDATE_PAYROLL_BY_STATUS = "updatePayrollByStatus"; + String QUERY_SUM_DIFERENCES_BETWEEN_CLOSING_DAY_BY_USER = "getDiscountByUserThisWeek"; + String QUERY_SUM_DIFERENCES_BY_USER = "sumAllDiferencesByUser"; + String QUERY_SUM_OPENING_FEE_BY_USER = "totalComisionAperturaByUserForDates"; + String QUERY_SUM_TOTAL_EXPECTED_FOR_WEEK_BY_USER = "totalExpectedWeekByUser"; + + String FIELD_OFFICE = "office"; + String FIELD_USER = "user"; + String FIELD_USER_ID = "idUser"; + String FIELD_ACTIVE_STATUS = "activeStatus"; + String FIELD_HUMAN_RESOURCE = "humanResource"; + String FIELD_DATE_INIT = "dateInit"; + String FIELD_DATE_END = "dateEnd"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/payroll/constance/TotalExpectedPaymentDailyByUserCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/payroll/constance/TotalExpectedPaymentDailyByUserCfg.java new file mode 100644 index 0000000..6111ba3 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/payroll/constance/TotalExpectedPaymentDailyByUserCfg.java @@ -0,0 +1,25 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.payroll.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface TotalExpectedPaymentDailyByUserCfg extends GenericCfg{ + + String QUERY_FIND_ALL_BY_OFFICE = "findAllTotalExpectedPaymentDailyByUserByOffice"; + String QUERY_UPDATE_BY_STATUS = "updateTotalExpectedPaymentDailyByUserByStatus"; + String QUERY_SELECT_MAX_DATE_BY_CURDATE = "verifyTotalExpectedPaymentDailyByUserCreatedByOffice"; + + String FIELD_OFFICE = "office"; + String FIELD_ACTIVE_STATUS = "activeStatus"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/reports/UserWeekReport.java b/apc-model/src/main/java/com/arrebol/apc/model/reports/UserWeekReport.java new file mode 100644 index 0000000..b217e94 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/reports/UserWeekReport.java @@ -0,0 +1,129 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.reports; + +import java.io.Serializable; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_USER_WEEK_REPORT_VIEW") +public class UserWeekReport implements Serializable { + + private static final long serialVersionUID = -1257291916093653466L; + + @Id + @Column(name = "id_user", length = 36) + private String id; + + @Column(name = "payment_week") + private Double paymentWeek; + + @Column(name = "total_new_customer_currweek") + private Integer totalNewCustomerCurrweek; + + @Column(name = "debit_week") + private Double debitWeek; + + @Column(name = "total_approved_loan") + private Long totalApprovedLoan; + + @Column(name = "total_to_delivery_loan") + private Long totalToDeliveryLoan; + + public UserWeekReport() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Double getPaymentWeek() { + return paymentWeek; + } + + public void setPaymentWeek(Double paymentWeek) { + this.paymentWeek = paymentWeek; + } + + public Integer getTotalNewCustomerCurrweek() { + return totalNewCustomerCurrweek; + } + + public void setTotalNewCustomerCurrweek(Integer totalNewCustomerCurrweek) { + this.totalNewCustomerCurrweek = totalNewCustomerCurrweek; + } + + public Double getDebitWeek() { + return debitWeek; + } + + public void setDebitWeek(Double debitWeek) { + this.debitWeek = debitWeek; + } + + public Long getTotalApprovedLoan() { + return totalApprovedLoan; + } + + public void setTotalApprovedLoan(Long totalApprovedLoan) { + this.totalApprovedLoan = totalApprovedLoan; + } + + public Long getTotalToDeliveryLoan() { + return totalToDeliveryLoan; + } + + public void setTotalToDeliveryLoan(Long totalToDeliveryLoan) { + this.totalToDeliveryLoan = totalToDeliveryLoan; + } + + @Override + public String toString() { + return "UserWeekReport{" + "id=" + id + '}'; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 89 * hash + Objects.hashCode(this.id); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final UserWeekReport other = (UserWeekReport) obj; + if (!Objects.equals(this.id, other.id)) { + return false; + } + return true; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/reports/constance/UserWeekReportCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/reports/constance/UserWeekReportCfg.java new file mode 100644 index 0000000..8c523e9 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/reports/constance/UserWeekReportCfg.java @@ -0,0 +1,19 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.reports.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface UserWeekReportCfg extends GenericCfg { + + String QUERY_FIND_USER_WEEK_REPORT_BY_USER = "findUserWeekReportDetailsByUser"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/system/logs/Bitacora.java b/apc-model/src/main/java/com/arrebol/apc/model/system/logs/Bitacora.java new file mode 100644 index 0000000..b87f7f7 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/system/logs/Bitacora.java @@ -0,0 +1,155 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.system.logs; + +import com.arrebol.apc.model.core.Office; +import java.io.Serializable; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Table(name = "APC_BITACORA") +public class Bitacora implements Serializable{ + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Column(name = "comments_user", length = 300) + private String commentsUser; + + @Column(name = "action", length = 50) + private String action; + + @Column(name = "description", length = 300) + private String description; + + @Column(name = "name_user", length = 200) + private String nameUser; + + @Column(name = "created_by", nullable = false, length = 36) + private String createdBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "last_updated_by", length = 36) + private String lastUpdatedBy; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public String getCommentsUser() { + return commentsUser; + } + + public void setCommentsUser(String commentsUser) { + this.commentsUser = commentsUser; + } + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getNameUser() { + return nameUser; + } + + public void setNameUser(String nameUser) { + this.nameUser = nameUser; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getLastUpdatedBy() { + return lastUpdatedBy; + } + + public void setLastUpdatedBy(String lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/system/logs/ErrorAppLog.java b/apc-model/src/main/java/com/arrebol/apc/model/system/logs/ErrorAppLog.java new file mode 100644 index 0000000..d3fb40f --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/system/logs/ErrorAppLog.java @@ -0,0 +1,122 @@ +/* + * Arrebol Consultancy copyright + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.system.logs; + +import java.io.Serializable; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.NamedQueries; +import org.hibernate.annotations.NamedQuery; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "APC_ERROR_APP_LOG") +@NamedQueries({ + @NamedQuery(name = "get_all_error_app_log", query = "FROM ErrorAppLog") +}) +public class ErrorAppLog implements Serializable { + + private static final long serialVersionUID = -9099186680609371679L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id_log", length = 36) + private String id; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "log_entry_date", length = 19) + private Date logEntryDate; + + @Column(name = "log_logger", length = 100) + private String logLogger; + + @Column(name = "log_level", length = 100) + private String logLevel; + + @Column(name = "log_message", length = 250) + private String logMessage; + + @Column(name = "log_exception", length = 4000) + private String logException; + + public ErrorAppLog() { + } + + public ErrorAppLog(String id, Date logEntryDate, String logLogger, String logLevel, String logMessage, String logException) { + this.id = id; + this.logEntryDate = logEntryDate; + this.logLogger = logLogger; + this.logLevel = logLevel; + this.logMessage = logMessage; + this.logException = logException; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Date getLogEntryDate() { + return logEntryDate; + } + + public void setLogEntryDate(Date logEntryDate) { + this.logEntryDate = logEntryDate; + } + + public String getLogLogger() { + return logLogger; + } + + public void setLogLogger(String logLogger) { + this.logLogger = logLogger; + } + + public String getLogLevel() { + return logLevel; + } + + public void setLogLevel(String logLevel) { + this.logLevel = logLevel; + } + + public String getLogMessage() { + return logMessage; + } + + public void setLogMessage(String logMessage) { + this.logMessage = logMessage; + } + + public String getLogException() { + return logException; + } + + public void setLogException(String logException) { + this.logException = logException; + } + + @Override + public String toString() { + return "ErrorAppLog{" + "id=" + id + ", logEntryDate=" + logEntryDate + ", logLogger=" + logLogger + ", logLevel=" + logLevel + ", logMessage=" + logMessage + ", logException=" + logException + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/AdministrationPersonSerchView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/AdministrationPersonSerchView.java new file mode 100644 index 0000000..ca979e7 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/AdministrationPersonSerchView.java @@ -0,0 +1,198 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.enums.PeopleType; +import java.io.Serializable; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_ADMINISTRATION_PERSON_SEARCH_VIEW") +public class AdministrationPersonSerchView implements Serializable { + + private static final long serialVersionUID = 3055231364366461069L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "phone_home", length = 15) + private String phoneHome; + + @Column(name = "address_home", length = 150) + private String addressHome; + + @Enumerated(EnumType.STRING) + @Column(name = "people_type") + private PeopleType peopleType; + + @Column(name = "id_route", length = 36) + private String idRoute; + + @Column(name = "route_name", length = 25) + private String routeName; + + @Column(name = "id_office", length = 36) + private String idOffice; + + @Column(name = "office_name", length = 100) + private String officeName; + + @Column(name = "person_search", length = 103) + private String personSearch; + + public AdministrationPersonSerchView() { + } + + /** + * + * @param id + */ + public AdministrationPersonSerchView(String id) { + this.id = id; + } + + /** + * + * @param id + * @param phoneHome + * @param addressHome + * @param peopleType + * @param idRoute + * @param routeName + * @param idOffice + * @param officeName + * @param personSearch + */ + public AdministrationPersonSerchView(String id, String phoneHome, String addressHome, PeopleType peopleType, String idRoute, String routeName, String idOffice, String officeName, String personSearch) { + this.id = id; + this.phoneHome = phoneHome; + this.addressHome = addressHome; + this.peopleType = peopleType; + this.idRoute = idRoute; + this.routeName = routeName; + this.idOffice = idOffice; + this.officeName = officeName; + this.personSearch = personSearch; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getPhoneHome() { + return phoneHome; + } + + public void setPhoneHome(String phoneHome) { + this.phoneHome = phoneHome; + } + + public String getAddressHome() { + return addressHome; + } + + public void setAddressHome(String addressHome) { + this.addressHome = addressHome; + } + + public PeopleType getPeopleType() { + return peopleType; + } + + public void setPeopleType(PeopleType peopleType) { + this.peopleType = peopleType; + } + + public String getIdRoute() { + return idRoute; + } + + public void setIdRoute(String idRoute) { + this.idRoute = idRoute; + } + + public String getRouteName() { + return routeName; + } + + public void setRouteName(String routeName) { + this.routeName = routeName; + } + + public String getIdOffice() { + return idOffice; + } + + public void setIdOffice(String idOffice) { + this.idOffice = idOffice; + } + + public String getOfficeName() { + return officeName; + } + + public void setOfficeName(String officeName) { + this.officeName = officeName; + } + + public String getPersonSearch() { + return personSearch; + } + + public void setPersonSearch(String personSearch) { + this.personSearch = personSearch; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 79 * hash + Objects.hashCode(this.id); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final AdministrationPersonSerchView other = (AdministrationPersonSerchView) obj; + if (!Objects.equals(this.id, other.id)) { + return false; + } + return true; + } + + @Override + public String toString() { + return "AdministrationPersonSerchView{" + "routeName=" + routeName + ", officeName=" + officeName + ", personSearch=" + personSearch + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/AdvanceUserDailyDetail.java b/apc-model/src/main/java/com/arrebol/apc/model/views/AdvanceUserDailyDetail.java new file mode 100644 index 0000000..98a0ad5 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/AdvanceUserDailyDetail.java @@ -0,0 +1,188 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_ADVANCE_USER_DAILY_DETAIL_VIEW") +public class AdvanceUserDailyDetail implements Serializable{ + + private static final long serialVersionUID = -4849944622024557288L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_user") + private String idUser; + + @Column(name = "customer_name") + private String customerName; + + @Column(name = "payment_amount") + private String paymentAmount; + + @Column(name = "created_on") + private Date createdOn; + + @Column(name = "address_business") + private String address; + + @Column(name = "type_ayment") + private String typePayment; + + @Column(name = "amount_paid") + private String amountPaid; + + @Column(name = "amount_to_pay") + private String amountToPay; + + @Column(name = "last_reference_number") + private String lastReference; + + @Column(name = "loan_status") + private String loanStatus; + + @Column(name = "num_fee") + private String numFee; + + @Column(name = "saldo_insoluto") + private String saldoInsoluto; + + @Column(name = "amount_loan") + private String amountLoan; + + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + public String getPaymentAmount() { + return paymentAmount; + } + + public void setPaymentAmount(String paymentAmount) { + this.paymentAmount = paymentAmount; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getTypePayment() { + return typePayment; + } + + public void setTypePayment(String typePayment) { + this.typePayment = typePayment; + } + + public String getAmountPaid() { + return amountPaid; + } + + public void setAmountPaid(String amountPaid) { + this.amountPaid = amountPaid; + } + + public String getAmountToPay() { + return amountToPay; + } + + public void setAmountToPay(String amountToPay) { + this.amountToPay = amountToPay; + } + + public String getLastReference() { + return lastReference; + } + + public void setLastReference(String lastReference) { + this.lastReference = lastReference; + } + + public String getLoanStatus() { + return loanStatus; + } + + public void setLoanStatus(String loanStatus) { + this.loanStatus = loanStatus; + } + + public String getNumFee() { + return numFee; + } + + public void setNumFee(String numFee) { + this.numFee = numFee; + } + + public String getSaldoInsoluto() { + return saldoInsoluto; + } + + public void setSaldoInsoluto(String saldoInsoluto) { + this.saldoInsoluto = saldoInsoluto; + } + + public String getAmountLoan() { + return amountLoan; + } + + public void setAmountLoan(String amountLoan) { + this.amountLoan = amountLoan; + } + + + + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/AdvanceUserDailyView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/AdvanceUserDailyView.java new file mode 100644 index 0000000..0e7b8f3 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/AdvanceUserDailyView.java @@ -0,0 +1,229 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import java.io.Serializable; +import java.math.BigDecimal; +import java.math.RoundingMode; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Transient; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_ADVANCE_USER_DAILY_DASHBOARD_VIEW") +public class AdvanceUserDailyView implements Serializable{ + + private static final long serialVersionUID = 3055231364366461069L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "user_name") + private String userName; + + @Column(name = "total_expected") + private Integer totalExpected; + + @Column(name = "total_now") + private Integer totalNow; + + @Column(name = "porcentaje") + private BigDecimal porcentaje; + + @Column(name = "faltante") + private BigDecimal faltante; + + @Column(name = "total_expected_week") + private BigDecimal totalExpectedWeek; + + @Column(name = "total_reported_week") + private BigDecimal totalReportedWeek; + + @Column(name = "total_reported_renovation_week") + private BigDecimal totalReportedRenovationWeek; + + @Column(name = "total_comision_fee") + private BigDecimal totalComisionFee; + + @Column(name = "colocation_approved") + private BigDecimal colocationApproved; + + @Column(name = "colocation_to_delivery") + private BigDecimal colocationToDelivery; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_user", + referencedColumnName = "id", + nullable = false + ) + private User user; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Transient + private BigDecimal diferencePaymentWeek; + + @Transient + private BigDecimal porcentajePaymentWeek; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Integer getTotalExpected() { + return totalExpected; + } + + public void setTotalExpected(Integer totalExpected) { + this.totalExpected = totalExpected; + } + + public Integer getTotalNow() { + return totalNow; + } + + public void setTotalNow(Integer totalNow) { + this.totalNow = totalNow; + } + + public BigDecimal getPorcentaje() { + return porcentaje; + } + + public void setPorcentaje(BigDecimal porcentaje) { + this.porcentaje = porcentaje; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public BigDecimal getTotalExpectedWeek() { + return totalExpectedWeek; + } + + public void setTotalExpectedWeek(BigDecimal totalExpectedWeek) { + this.totalExpectedWeek = totalExpectedWeek; + } + + public BigDecimal getTotalReportedWeek() { + return totalReportedWeek.add(totalReportedRenovationWeek).add(totalComisionFee); + } + + public void setTotalReportedWeek(BigDecimal totalReportedWeek) { + this.totalReportedWeek = totalReportedWeek; + } + + public BigDecimal getColocationApproved() { + return colocationApproved; + } + + public void setColocationApproved(BigDecimal colocationApproved) { + this.colocationApproved = colocationApproved; + } + + public BigDecimal getColocationToDelivery() { + return colocationToDelivery; + } + + public void setColocationToDelivery(BigDecimal colocationToDelivery) { + this.colocationToDelivery = colocationToDelivery; + } + + public BigDecimal getDiferencePaymentWeek() { + diferencePaymentWeek = (totalReportedWeek.add(totalReportedRenovationWeek).add(totalComisionFee)).subtract(totalExpectedWeek); + return diferencePaymentWeek; + } + + public void setDiferencePaymentWeek(BigDecimal diferencePaymentWeek) { + this.diferencePaymentWeek = diferencePaymentWeek; + } + + public BigDecimal getPorcentajePaymentWeek() { + if(totalReportedWeek.compareTo(BigDecimal.ZERO) == 1) + porcentajePaymentWeek = (faltante + .multiply(new BigDecimal(100))).divide(totalReportedWeek, 2, RoundingMode.HALF_UP); + else + porcentajePaymentWeek = BigDecimal.ZERO; + return porcentajePaymentWeek; + } + + public void setPorcentajePaymentWeek(BigDecimal porcentajePaymentWeek) { + this.porcentajePaymentWeek = porcentajePaymentWeek; + } + + public BigDecimal getTotalReportedRenovationWeek() { + return totalReportedRenovationWeek; + } + + public void setTotalReportedRenovationWeek(BigDecimal totalReportedRenovationWeek) { + this.totalReportedRenovationWeek = totalReportedRenovationWeek; + } + + public BigDecimal getTotalComisionFee() { + return totalComisionFee; + } + + public void setTotalComisionFee(BigDecimal totalComisionFee) { + this.totalComisionFee = totalComisionFee; + } + + public BigDecimal getFaltante() { + return faltante; + } + + public void setFaltante(BigDecimal faltante) { + this.faltante = faltante; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/AvailableCustomersView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/AvailableCustomersView.java new file mode 100644 index 0000000..c7da83a --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/AvailableCustomersView.java @@ -0,0 +1,70 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_AVAILABLE_CUSTOMERS_VIEW") +public class AvailableCustomersView implements Serializable { + + private static final long serialVersionUID = 6772440079893425786L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "available_person", length = 103) + private String availablePerson; + + @Column(name = "cross_signature", length = 36) + private String crossSignature; + + public AvailableCustomersView() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getAvailablePerson() { + return availablePerson; + } + + public void setAvailablePerson(String availablePerson) { + this.availablePerson = availablePerson; + } + + public String getCrossSignature() { + return crossSignature; + } + + public void setCrossSignature(String crossSignature) { + this.crossSignature = crossSignature; + } + + @Override + public String toString() { + return "AvailableCustomersView{" + "availablePerson=" + availablePerson + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/AvailableEndorsementsView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/AvailableEndorsementsView.java new file mode 100644 index 0000000..649fabb --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/AvailableEndorsementsView.java @@ -0,0 +1,70 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_AVAILABLE_ENDORSEMENTS_VIEW") +public class AvailableEndorsementsView implements Serializable { + + private static final long serialVersionUID = -8420465639155493835L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "available_person", length = 103) + private String availablePerson; + + @Column(name = "cross_signature", length = 36) + private String crossSignature; + + public AvailableEndorsementsView() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getAvailablePerson() { + return availablePerson; + } + + public void setAvailablePerson(String availablePerson) { + this.availablePerson = availablePerson; + } + + public String getCrossSignature() { + return crossSignature; + } + + public void setCrossSignature(String crossSignature) { + this.crossSignature = crossSignature; + } + + @Override + public String toString() { + return "AvailableEndorsementsView{" + "availablePerson=" + availablePerson + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/AvailablesOwnersView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/AvailablesOwnersView.java new file mode 100644 index 0000000..bbc12a5 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/AvailablesOwnersView.java @@ -0,0 +1,96 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_AVAILABLES_OWNERS_VIEW") +public class AvailablesOwnersView implements Serializable { + + private static final long serialVersionUID = -7094684754461793727L; + + @Id + @Column(name = "id_user", length = 36) + private String userId; + + @Column(name = "id_office", length = 36) + private String officeId; + + @Column(name = "user_name", length = 100) + private String userName; + + @Column(name = "full_name", length = 103) + private String fullName; + + public AvailablesOwnersView() { + } + + /** + * Complete constructor. + * + * @param userId + * @param officeId + * @param userName + * @param fullName + */ + public AvailablesOwnersView(String userId, String officeId, String userName, String fullName) { + this.userId = userId; + this.officeId = officeId; + this.userName = userName; + this.fullName = fullName; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getOfficeId() { + return officeId; + } + + public void setOfficeId(String officeId) { + this.officeId = officeId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getFullName() { + return fullName; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + @Override + public String toString() { + return "AvailablesOwnersView{" + "userName=" + userName + ", fullName=" + fullName + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/CashRegisterCurdateByUserView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/CashRegisterCurdateByUserView.java new file mode 100644 index 0000000..24399f4 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/CashRegisterCurdateByUserView.java @@ -0,0 +1,89 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_CASH_REGISTER_CURDATE_BY_USER_VIEW") +public class CashRegisterCurdateByUserView implements Serializable { + + private static final long serialVersionUID = -3932800670151972950L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "payment") + private BigDecimal payment; + + @Column(name = "customer_name", length = 51) + private String customerName; + + @Column(name = "id_user", length = 36) + private String userId; + + public CashRegisterCurdateByUserView() { + } + + public CashRegisterCurdateByUserView(String id, BigDecimal payment, String customerName, String userId) { + this.id = id; + this.payment = payment; + this.customerName = customerName; + this.userId = userId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public BigDecimal getPayment() { + return payment; + } + + public void setPayment(BigDecimal payment) { + this.payment = payment; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "CashRegisterCurdateByUserView{" + "customerName=" + customerName + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/ClosingDailyDetailFromUserByCurdateView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/ClosingDailyDetailFromUserByCurdateView.java new file mode 100644 index 0000000..9c57c0a --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/ClosingDailyDetailFromUserByCurdateView.java @@ -0,0 +1,134 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_CLOSING_DAILY_DETAIL_FROM_USER_BY_CURDATE_VIEW") +public class ClosingDailyDetailFromUserByCurdateView implements Serializable{ + + private static final long serialVersionUID = -4593609182109393813L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "comments") + private String comments; + + @Column(name = "amount") + private BigDecimal amount; + + @Column(name = "type") + private String type; + + @Column(name = "created_on") + private Date createdOn; + + @Column(name = "id_user") + private String idUser; + + @Column(name = "route") + private String route; + + @Column(name = "fechaFiltro") + private Date fechaFiltro; + + @Column(name = "saldo") + private BigDecimal saldo; + + public ClosingDailyDetailFromUserByCurdateView(){ + + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getRoute() { + return route; + } + + public void setRoute(String route) { + this.route = route; + } + + public Date getFechaFiltro() { + return fechaFiltro; + } + + public void setFechaFiltro(Date fechaFiltro) { + this.fechaFiltro = fechaFiltro; + } + + public BigDecimal getSaldo() { + return saldo; + } + + public void setSaldo(BigDecimal saldo) { + this.saldo = saldo; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/CobranzaLastWeekByUserView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/CobranzaLastWeekByUserView.java new file mode 100644 index 0000000..819f0c2 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/CobranzaLastWeekByUserView.java @@ -0,0 +1,150 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.core.Office; +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_COBRANZA_LAST_WEEK_BY_USER_VIEW") +public class CobranzaLastWeekByUserView implements Serializable{ + + private static final long serialVersionUID = 3055231364366461069L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "username") + private String userName; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Column(name = "cobranza_monday") + private BigDecimal cobranzaMonday; + + @Column(name = "cobranza_tuesday") + private BigDecimal cobranzaTuesday; + + @Column(name = "cobranza_wednesday") + private BigDecimal cobranzaWednesday; + + @Column(name = "cobranza_thursday") + private BigDecimal cobranzaThursday; + + @Column(name = "cobranza_friday") + private BigDecimal cobranzaFriday; + + @Column(name = "cobranza_saturday") + private BigDecimal cobranzaSaturday; + + @Column(name = "cobranza_total") + private BigDecimal cobranzaTotal; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public BigDecimal getCobranzaMonday() { + return cobranzaMonday; + } + + public void setCobranzaMonday(BigDecimal cobranzaMonday) { + this.cobranzaMonday = cobranzaMonday; + } + + public BigDecimal getCobranzaTuesday() { + return cobranzaTuesday; + } + + public void setCobranzaTuesday(BigDecimal cobranzaTuesday) { + this.cobranzaTuesday = cobranzaTuesday; + } + + public BigDecimal getCobranzaWednesday() { + return cobranzaWednesday; + } + + public void setCobranzaWednesday(BigDecimal cobranzaWednesday) { + this.cobranzaWednesday = cobranzaWednesday; + } + + public BigDecimal getCobranzaThursday() { + return cobranzaThursday; + } + + public void setCobranzaThursday(BigDecimal cobranzaThursday) { + this.cobranzaThursday = cobranzaThursday; + } + + public BigDecimal getCobranzaFriday() { + return cobranzaFriday; + } + + public void setCobranzaFriday(BigDecimal cobranzaFriday) { + this.cobranzaFriday = cobranzaFriday; + } + + public BigDecimal getCobranzaSaturday() { + return cobranzaSaturday; + } + + public void setCobranzaSaturday(BigDecimal cobranzaSaturday) { + this.cobranzaSaturday = cobranzaSaturday; + } + + public BigDecimal getCobranzaTotal() { + return cobranzaTotal; + } + + public void setCobranzaTotal(BigDecimal cobranzaTotal) { + this.cobranzaTotal = cobranzaTotal; + } + + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/CobranzaWeekByUserView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/CobranzaWeekByUserView.java new file mode 100644 index 0000000..927cf50 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/CobranzaWeekByUserView.java @@ -0,0 +1,150 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.core.Office; +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_COBRANZA_WEEK_BY_USER_VIEW") +public class CobranzaWeekByUserView implements Serializable{ + + private static final long serialVersionUID = 3055231364366461069L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "username") + private String userName; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Column(name = "cobranza_monday") + private BigDecimal cobranzaMonday; + + @Column(name = "cobranza_tuesday") + private BigDecimal cobranzaTuesday; + + @Column(name = "cobranza_wednesday") + private BigDecimal cobranzaWednesday; + + @Column(name = "cobranza_thursday") + private BigDecimal cobranzaThursday; + + @Column(name = "cobranza_friday") + private BigDecimal cobranzaFriday; + + @Column(name = "cobranza_saturday") + private BigDecimal cobranzaSaturday; + + @Column(name = "cobranza_total") + private BigDecimal cobranzaTotal; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public BigDecimal getCobranzaMonday() { + return cobranzaMonday; + } + + public void setCobranzaMonday(BigDecimal cobranzaMonday) { + this.cobranzaMonday = cobranzaMonday; + } + + public BigDecimal getCobranzaTuesday() { + return cobranzaTuesday; + } + + public void setCobranzaTuesday(BigDecimal cobranzaTuesday) { + this.cobranzaTuesday = cobranzaTuesday; + } + + public BigDecimal getCobranzaWednesday() { + return cobranzaWednesday; + } + + public void setCobranzaWednesday(BigDecimal cobranzaWednesday) { + this.cobranzaWednesday = cobranzaWednesday; + } + + public BigDecimal getCobranzaThursday() { + return cobranzaThursday; + } + + public void setCobranzaThursday(BigDecimal cobranzaThursday) { + this.cobranzaThursday = cobranzaThursday; + } + + public BigDecimal getCobranzaFriday() { + return cobranzaFriday; + } + + public void setCobranzaFriday(BigDecimal cobranzaFriday) { + this.cobranzaFriday = cobranzaFriday; + } + + public BigDecimal getCobranzaSaturday() { + return cobranzaSaturday; + } + + public void setCobranzaSaturday(BigDecimal cobranzaSaturday) { + this.cobranzaSaturday = cobranzaSaturday; + } + + public BigDecimal getCobranzaTotal() { + return cobranzaTotal; + } + + public void setCobranzaTotal(BigDecimal cobranzaTotal) { + this.cobranzaTotal = cobranzaTotal; + } + + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/ColocationLastWeekByUserView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/ColocationLastWeekByUserView.java new file mode 100644 index 0000000..aa4ccc0 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/ColocationLastWeekByUserView.java @@ -0,0 +1,149 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.core.Office; +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_COLOCATION_LAST_WEEK_BY_USER_VIEW") +public class ColocationLastWeekByUserView implements Serializable{ + + private static final long serialVersionUID = 3055231364366461069L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "username") + private String userName; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Column(name = "colocation_monday") + private BigDecimal colocationMonday; + + @Column(name = "colocation_tuesday") + private BigDecimal colocationTuesday; + + @Column(name = "colocation_wednesday") + private BigDecimal colocationWednesday; + + @Column(name = "colocation_thursday") + private BigDecimal colocationThursday; + + @Column(name = "colocation_friday") + private BigDecimal colocationFriday; + + @Column(name = "colocation_saturday") + private BigDecimal colocationSaturday; + + @Column(name = "colocation_total") + private BigDecimal colocationTotal; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public BigDecimal getColocationMonday() { + return colocationMonday; + } + + public void setColocationMonday(BigDecimal colocationMonday) { + this.colocationMonday = colocationMonday; + } + + public BigDecimal getColocationTuesday() { + return colocationTuesday; + } + + public void setColocationTuesday(BigDecimal colocationTuesday) { + this.colocationTuesday = colocationTuesday; + } + + public BigDecimal getColocationWednesday() { + return colocationWednesday; + } + + public void setColocationWednesday(BigDecimal colocationWednesday) { + this.colocationWednesday = colocationWednesday; + } + + public BigDecimal getColocationThursday() { + return colocationThursday; + } + + public void setColocationThursday(BigDecimal colocationThursday) { + this.colocationThursday = colocationThursday; + } + + public BigDecimal getColocationFriday() { + return colocationFriday; + } + + public void setColocationFriday(BigDecimal colocationFriday) { + this.colocationFriday = colocationFriday; + } + + public BigDecimal getColocationSaturday() { + return colocationSaturday; + } + + public void setColocationSaturday(BigDecimal colocationSaturday) { + this.colocationSaturday = colocationSaturday; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public BigDecimal getColocationTotal() { + return colocationTotal; + } + + public void setColocationTotal(BigDecimal colocationTotal) { + this.colocationTotal = colocationTotal; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/ColocationWeekByUserView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/ColocationWeekByUserView.java new file mode 100644 index 0000000..d310536 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/ColocationWeekByUserView.java @@ -0,0 +1,149 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.core.Office; +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_COLOCATION_WEEK_BY_USER_VIEW") +public class ColocationWeekByUserView implements Serializable{ + + private static final long serialVersionUID = 3055231364366461069L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "username") + private String userName; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Column(name = "colocation_monday") + private BigDecimal colocationMonday; + + @Column(name = "colocation_tuesday") + private BigDecimal colocationTuesday; + + @Column(name = "colocation_wednesday") + private BigDecimal colocationWednesday; + + @Column(name = "colocation_thursday") + private BigDecimal colocationThursday; + + @Column(name = "colocation_friday") + private BigDecimal colocationFriday; + + @Column(name = "colocation_saturday") + private BigDecimal colocationSaturday; + + @Column(name = "colocation_total") + private BigDecimal colocationTotal; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public BigDecimal getColocationMonday() { + return colocationMonday; + } + + public void setColocationMonday(BigDecimal colocationMonday) { + this.colocationMonday = colocationMonday; + } + + public BigDecimal getColocationTuesday() { + return colocationTuesday; + } + + public void setColocationTuesday(BigDecimal colocationTuesday) { + this.colocationTuesday = colocationTuesday; + } + + public BigDecimal getColocationWednesday() { + return colocationWednesday; + } + + public void setColocationWednesday(BigDecimal colocationWednesday) { + this.colocationWednesday = colocationWednesday; + } + + public BigDecimal getColocationThursday() { + return colocationThursday; + } + + public void setColocationThursday(BigDecimal colocationThursday) { + this.colocationThursday = colocationThursday; + } + + public BigDecimal getColocationFriday() { + return colocationFriday; + } + + public void setColocationFriday(BigDecimal colocationFriday) { + this.colocationFriday = colocationFriday; + } + + public BigDecimal getColocationSaturday() { + return colocationSaturday; + } + + public void setColocationSaturday(BigDecimal colocationSaturday) { + this.colocationSaturday = colocationSaturday; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public BigDecimal getColocationTotal() { + return colocationTotal; + } + + public void setColocationTotal(BigDecimal colocationTotal) { + this.colocationTotal = colocationTotal; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/CurrentCustomerByLoanView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/CurrentCustomerByLoanView.java new file mode 100644 index 0000000..1cda077 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/CurrentCustomerByLoanView.java @@ -0,0 +1,168 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.enums.LoanStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_CURRENT_CUSTOMER_BY_LOAN_VIEW") +public class CurrentCustomerByLoanView implements Serializable { + + private static final long serialVersionUID = 1867076380925130820L; + + @Id + @Column(name = "id_loan", length = 36) + private String loanId; + + @Column(name = "id_user", length = 36) + private String userId; + + @Column(name = "id_office", length = 36) + private String officeId; + + @Column(name = "payment", nullable = false) + private BigDecimal payment; + + @Column(name = "customer_name", length = 100) + private String customerName; + + @Column(name = "endorsement_name", length = 103) + private String endorsementName; + + @Enumerated(EnumType.STRING) + @Column(name = "loan_status") + private LoanStatus loanStatus; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "route_name", length = 25) + private String route; + + public CurrentCustomerByLoanView() { + } + + /** + * Complete Constructor. + * + * @param loanId + * @param userId + * @param officeId + * @param payment + * @param customerName + * @param endorsementName + * @param loanStatus + * @param createdOn + */ + public CurrentCustomerByLoanView(String loanId, String userId, String officeId, BigDecimal payment, String customerName, String endorsementName, LoanStatus loanStatus, Date createdOn) { + this.loanId = loanId; + this.userId = userId; + this.officeId = officeId; + this.payment = payment; + this.customerName = customerName; + this.endorsementName = endorsementName; + this.loanStatus = loanStatus; + this.createdOn = createdOn; + } + + public String getLoanId() { + return loanId; + } + + public void setLoanId(String loanId) { + this.loanId = loanId; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getOfficeId() { + return officeId; + } + + public void setOfficeId(String officeId) { + this.officeId = officeId; + } + + public BigDecimal getPayment() { + return payment; + } + + public void setPayment(BigDecimal payment) { + this.payment = payment; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + public String getEndorsementName() { + return endorsementName; + } + + public void setEndorsementName(String endorsementName) { + this.endorsementName = endorsementName; + } + + public LoanStatus getLoanStatus() { + return loanStatus; + } + + public void setLoanStatus(LoanStatus loanStatus) { + this.loanStatus = loanStatus; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getRoute() { + return route; + } + + public void setRoute(String route) { + this.route = route; + } + + @Override + public String toString() { + return "CurrentCustomerByLoanView{" + "customerName=" + customerName + ", endorsementName=" + endorsementName + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/CustomerView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/CustomerView.java new file mode 100644 index 0000000..e847a27 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/CustomerView.java @@ -0,0 +1,230 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.enums.CustomerClassification; +import com.arrebol.apc.model.enums.PeopleType; +import java.io.Serializable; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_CUSTOMER_VIEW") +public class CustomerView implements Serializable { + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "full_name", length = 103) + private String fullName; + + @Column(name = "company_name", length = 150) + private String companyName; + + @Column(name = "address_home", length = 150) + private String addressHome; + + @Column(name = "address_business", length = 150) + private String addressBusiness; + + @Column(name = "route_name", length = 25) + private String routeName; + + @Enumerated(EnumType.STRING) + @Column(name = "people_type", nullable = false) + private PeopleType peopleType; + + @Column(name = "str_people_type", length = 14) + private String strPeopleType; + + @Enumerated(EnumType.STRING) + @Column(name = "classification", nullable = false) + private CustomerClassification classification; + + @Column(name = "office_name", length = 100) + private String officeName; + + @Column(name = "total_of_loan") + private Integer totalOfLoan; + + @Column(name = "celular", length = 150) + private String celular; + + @Column(name = "t_creditos", length = 150) + private String totalCreditos; + + @Column(name = "colonia", length = 150) + private String colonia; + + public CustomerView() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getFullName() { + return fullName; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public String getAddressHome() { + return addressHome; + } + + public void setAddressHome(String addressHome) { + this.addressHome = addressHome; + } + + public String getAddressBusiness() { + return addressBusiness; + } + + public void setAddressBusiness(String addressBusiness) { + this.addressBusiness = addressBusiness; + } + + public String getRouteName() { + return routeName; + } + + public void setRouteName(String routeName) { + this.routeName = routeName; + } + + public PeopleType getPeopleType() { + return peopleType; + } + + public void setPeopleType(PeopleType peopleType) { + this.peopleType = peopleType; + } + + public String getStrPeopleType() { + return strPeopleType; + } + + public void setStrPeopleType(String strPeopleType) { + this.strPeopleType = strPeopleType; + } + + public String getOfficeName() { + return officeName; + } + + public void setOfficeName(String officeName) { + this.officeName = officeName; + } + + public Integer getTotalOfLoan() { + return totalOfLoan; + } + + public void setTotalOfLoan(Integer totalOfLoan) { + this.totalOfLoan = totalOfLoan; + } + + public String getCelular() { + return celular; + } + + public void setCelular(String celular) { + this.celular = celular; + } + + public String getTotalCreditos() { + return totalCreditos; + } + + public void setTotalCreditos(String totalCreditos) { + this.totalCreditos = totalCreditos; + } + + public String getColonia() { + return colonia; + } + + public void setColonia(String colonia) { + this.colonia = colonia; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 97 * hash + Objects.hashCode(this.id); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final CustomerView other = (CustomerView) obj; + if (!Objects.equals(this.id, other.id)) { + return false; + } + return true; + } + + public CustomerClassification getClassification() { + return classification; + } + + public void setClassification(CustomerClassification classification) { + this.classification = classification; + } + + public String conditionStyle() { + if (getClassification().equals(classification.RED)) { + return "redRow"; + } else if (getClassification().equals(classification.YELLOW)) { + return "yellowRow"; + } + return null; + } + + @Override + public String toString() { + return "CustomerView{" + "fullName=" + fullName + ", routeName=" + routeName + ", officeName=" + officeName + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/CustomerWithoutRenovationView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/CustomerWithoutRenovationView.java new file mode 100644 index 0000000..06ac9aa --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/CustomerWithoutRenovationView.java @@ -0,0 +1,226 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.core.Office; +import java.io.Serializable; +import java.util.Date; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_CUSTOMERS_WITHOUT_RENOVATION_VIEW") +public class CustomerWithoutRenovationView implements Serializable { + + private static final long serialVersionUID = 3731003393000465083L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "available_person") + private String personName; + + @Column(name = "route_name") + private String routeName; + + @Column(name = "last_loan") + @Temporal(javax.persistence.TemporalType.DATE) + private Date lastLoan; + + @Column(name = "amount_paid") + private String amountPaid; + + @Column(name = "amount_to_pay") + private String amountToPay; + + @Column(name = "saldo_insoluto") + private String saldoInsoluto; + + @Column(name = "action_number") + private String actionNumber; + + @Column(name = "num_fee") + private String numFee; + + @Column(name = "address_home") + private String addressHome; + + @Column(name = "address_business") + private String addressBusiness; + + @Column(name = "company_name") + private String companyName; + + + + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Column(name = "str_payment_date", length = 22) + private String strPaymentDate; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getPersonName() { + return personName; + } + + public void setPersonName(String personName) { + this.personName = personName; + } + + public String getRouteName() { + return routeName; + } + + public void setRouteName(String routeName) { + this.routeName = routeName; + } + + public Date getLastLoan() { + return lastLoan; + } + + public void setLastLoan(Date lastLoan) { + this.lastLoan = lastLoan; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public String getStrPaymentDate() { + return strPaymentDate; + } + + public void setStrPaymentDate(String strPaymentDate) { + this.strPaymentDate = strPaymentDate; + } + + public String getAmountPaid() { + return amountPaid; + } + + public void setAmountPaid(String amountPaid) { + this.amountPaid = amountPaid; + } + + public String getAmountToPay() { + return amountToPay; + } + + public void setAmountToPay(String amountToPay) { + this.amountToPay = amountToPay; + } + + public String getSaldoInsoluto() { + return saldoInsoluto; + } + + public void setSaldoInsoluto(String saldoInsoluto) { + this.saldoInsoluto = saldoInsoluto; + } + + public String getActionNumber() { + return actionNumber; + } + + public void setActionNumber(String actionNumber) { + this.actionNumber = actionNumber; + } + + public String getNumFee() { + return numFee; + } + + public void setNumFee(String numFee) { + this.numFee = numFee; + } + + public String getAddressHome() { + return addressHome; + } + + public void setAddressHome(String addressHome) { + this.addressHome = addressHome; + } + + public String getAddressBusiness() { + return addressBusiness; + } + + public void setAddressBusiness(String addressBusiness) { + this.addressBusiness = addressBusiness; + } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + + + @Override + public int hashCode() { + int hash = 7; + hash = 61 * hash + Objects.hashCode(this.id); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final CustomerWithoutRenovationView other = (CustomerWithoutRenovationView) obj; + if (!Objects.equals(this.id, other.id)) { + return false; + } + return true; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/EnabledUserDetailsView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/EnabledUserDetailsView.java new file mode 100644 index 0000000..40246f8 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/EnabledUserDetailsView.java @@ -0,0 +1,89 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_ENABLED_USER_DETAILS_VIEW") +public class EnabledUserDetailsView implements Serializable { + + @Id + @Column(name = "id_user", length = 36) + private String idUser; + + @Column(name = "full_name", length = 103) + private String fullName; + + @Column(name = "id_office", length = 36) + private String idOffice; + + public EnabledUserDetailsView() { + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public String getFullName() { + return fullName; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public String getIdOffice() { + return idOffice; + } + + public void setIdOffice(String idOffice) { + this.idOffice = idOffice; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 43 * hash + Objects.hashCode(this.idUser); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final EnabledUserDetailsView other = (EnabledUserDetailsView) obj; + if (!Objects.equals(this.idUser, other.idUser)) { + return false; + } + return true; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/ExchangeEnebledUsersView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/ExchangeEnebledUsersView.java new file mode 100644 index 0000000..93a3720 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/ExchangeEnebledUsersView.java @@ -0,0 +1,70 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_EXCHANGE_ENEBLED_USERS_VIEW") +public class ExchangeEnebledUsersView implements Serializable { + + private static final long serialVersionUID = -1257291916093653466L; + + @Id + @Column(name = "id_user", length = 36) + private String userId; + + @Column(name = "user_name", length = 51) + private String userName; + + @Column(name = "id_office", length = 36) + private String officeId; + + public ExchangeEnebledUsersView() { + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getOfficeId() { + return officeId; + } + + public void setOfficeId(String officeId) { + this.officeId = officeId; + } + + @Override + public String toString() { + return "ExchangeEnebledUsersView{" + "userName=" + userName + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/FaltanteInDates.java b/apc-model/src/main/java/com/arrebol/apc/model/views/FaltanteInDates.java new file mode 100644 index 0000000..d012219 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/FaltanteInDates.java @@ -0,0 +1,170 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * + * @author Oscar + */ +public class FaltanteInDates implements Serializable { + + private static final long serialVersionUID = 3731003393000465083L; + + private String id; + private String idUser; + private String userName; + private String customerName; + private String routeName; + private BigDecimal amountPaid; + private BigDecimal amountToPay; + private BigDecimal amountToPayNoFee; + private BigDecimal paymentDaily; + private BigDecimal expectedPayment; + private BigDecimal amountPaidDetails; + private BigDecimal fee; + private Long feeNumber; + private Long numPagosAll; + private Date lastDate; + private Date createdOn; + + public FaltanteInDates() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + public String getRouteName() { + return routeName; + } + + public void setRouteName(String routeName) { + this.routeName = routeName; + } + + public BigDecimal getAmountPaid() { + return amountPaid; + } + + public void setAmountPaid(BigDecimal amountPaid) { + this.amountPaid = amountPaid; + } + + public BigDecimal getAmountToPay() { + return amountToPay; + } + + public void setAmountToPay(BigDecimal amountToPay) { + this.amountToPay = amountToPay; + } + + public BigDecimal getAmountToPayNoFee() { + return amountToPayNoFee; + } + + public void setAmountToPayNoFee(BigDecimal amountToPayNoFee) { + this.amountToPayNoFee = amountToPayNoFee; + } + + public BigDecimal getPaymentDaily() { + return paymentDaily; + } + + public void setPaymentDaily(BigDecimal paymentDaily) { + this.paymentDaily = paymentDaily; + } + + public BigDecimal getExpectedPayment() { + return expectedPayment; + } + + public void setExpectedPayment(BigDecimal expectedPayment) { + this.expectedPayment = expectedPayment; + } + + public BigDecimal getAmountPaidDetails() { + return amountPaidDetails; + } + + public void setAmountPaidDetails(BigDecimal amountPaidDetails) { + this.amountPaidDetails = amountPaidDetails; + } + + public BigDecimal getFee() { + return fee; + } + + public void setFee(BigDecimal fee) { + this.fee = fee; + } + + public Long getFeeNumber() { + return feeNumber; + } + + public void setFeeNumber(Long feeNumber) { + this.feeNumber = feeNumber; + } + + public Long getNumPagosAll() { + return numPagosAll; + } + + public void setNumPagosAll(Long numPagosAll) { + this.numPagosAll = numPagosAll; + } + + public Date getLastDate() { + return lastDate; + } + + public void setLastDate(Date lastDate) { + this.lastDate = lastDate; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/FeesView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/FeesView.java new file mode 100644 index 0000000..361c33b --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/FeesView.java @@ -0,0 +1,137 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.enums.FeeStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author David Rodriguez + */ +@Entity +@Table(name = "APC_FEES_VIEW") +public class FeesView implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_user", length = 36) + private String idUser; + + @Column(name = "name") + private String userName; + + @Column(name = "id_route", length = 36) + private String idRoute; + + @Column(name = "route_name") + private String routeName; + + @Column(name = "total_fees") + private BigDecimal totalFees; + + @Enumerated(EnumType.STRING) + @Column(name = "fee_status") + FeeStatus feeStatus; + + @Column(name = "created_on") + private Date createdOn; + + @Column(name = "total_fee_paid") + private BigDecimal totalFeePaid; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public BigDecimal getTotalFees() { + return totalFees; + } + + public void setTotalFees(BigDecimal totalFees) { + this.totalFees = totalFees; + } + public String getIdRoute() { + return idRoute; + } + + public void setIdRoute(String idRoute) { + this.idRoute = idRoute; + } + + public String getRouteName() { + return routeName; + } + + public void setRouteName(String routeName) { + this.routeName = routeName; + } + + public FeeStatus getFeeStatus() { + return feeStatus; + } + + public void setFeeStatus(FeeStatus feeStatus) { + this.feeStatus = feeStatus; + } + + public BigDecimal getTotalFeePaid() { + return totalFeePaid; + } + + public void setTotalFeePaid(BigDecimal totalFeePaid) { + this.totalFeePaid = totalFeePaid; + } + + @Override + public String toString() { + return "FeesView{" + "idUser=" + idUser + ", userName=" + userName + ", totalFees=" + totalFees + ", createdOn=" + createdOn + '}'; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/GeneralBoxView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/GeneralBoxView.java new file mode 100644 index 0000000..20f5f15 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/GeneralBoxView.java @@ -0,0 +1,97 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_GENERAL_BOX_VIEW") +public class GeneralBoxView implements Serializable{ + + private static final long serialVersionUID = 5393585318267139926L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "office") + private String office; + + @Column(name = "comments") + private String comments; + + @Column(name = "fecha") + private Date fecha; + + @Column(name = "amount") + private BigDecimal amount; + + @Column(name = "type") + private String type; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getOffice() { + return office; + } + + public void setOffice(String office) { + this.office = office; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public Date getFecha() { + return fecha; + } + + public void setFecha(Date fecha) { + this.fecha = fecha; + } + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/HistoryLoanView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/HistoryLoanView.java new file mode 100644 index 0000000..e0a001c --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/HistoryLoanView.java @@ -0,0 +1,183 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar + */ +@Entity +@Immutable +@Table(name = "APC_HISTORY_LOAN_VIEW") +public class HistoryLoanView implements Serializable{ + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "customerName") + private String customerName; + + @Column(name = "endorsementName") + private String endorsementName; + + @Column(name = "routeName") + private String routeName; + + @Column(name = "officeName") + private String officeName; + + @Column(name = "montoPrestado") + private String montoPrestado; + + @Column(name = "montoAPagar") + private BigDecimal montoAPagar; + + @Column(name = "montoPagado") + private BigDecimal montoPagado; + + @Column(name = "saldoInsoluto") + private BigDecimal saldoInsoluto; + + @Column(name = "numMultas") + private long numMultas; + + @Column(name = "estatusPrestamo") + private String estatusPrestamo; + + @Column(name = "fecha") + private Date fecha; + + @Column(name = "juridical_date") + private Date fechaJuridico; + + @Column(name = "nombreUsuario") + private String nombreUsuario; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + public String getEndorsementName() { + return endorsementName; + } + + public void setEndorsementName(String endorsementName) { + this.endorsementName = endorsementName; + } + + public String getRouteName() { + return routeName; + } + + public void setRouteName(String routeName) { + this.routeName = routeName; + } + + public String getOfficeName() { + return officeName; + } + + public void setOfficeName(String officeName) { + this.officeName = officeName; + } + + public String getMontoPrestado() { + return montoPrestado; + } + + public void setMontoPrestado(String montoPrestado) { + this.montoPrestado = montoPrestado; + } + + public BigDecimal getMontoAPagar() { + return montoAPagar; + } + + public void setMontoAPagar(BigDecimal montoAPagar) { + this.montoAPagar = montoAPagar; + } + + public BigDecimal getMontoPagado() { + return montoPagado; + } + + public void setMontoPagado(BigDecimal montoPagado) { + this.montoPagado = montoPagado; + } + + public BigDecimal getSaldoInsoluto() { + return saldoInsoluto; + } + + public void setSaldoInsoluto(BigDecimal saldoInsoluto) { + this.saldoInsoluto = saldoInsoluto; + } + + public long getNumMultas() { + return numMultas; + } + + public void setNumMultas(long numMultas) { + this.numMultas = numMultas; + } + + public String getEstatusPrestamo() { + return estatusPrestamo; + } + + public void setEstatusPrestamo(String estatusPrestamo) { + this.estatusPrestamo = estatusPrestamo; + } + + public Date getFecha() { + return fecha; + } + + public void setFecha(Date fecha) { + this.fecha = fecha; + } + + public Date getFechaJuridico() { + return fechaJuridico; + } + + public void setFechaJuridico(Date fechaJuridico) { + this.fechaJuridico = fechaJuridico; + } + + public String getNombreUsuario() { + return nombreUsuario; + } + + public void setNombreUsuario(String nombreUsuario) { + this.nombreUsuario = nombreUsuario; + } + + + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/InformationLoanLastWeekView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/InformationLoanLastWeekView.java new file mode 100644 index 0000000..00ff8e7 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/InformationLoanLastWeekView.java @@ -0,0 +1,751 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_INFORMATION_LOAN_LAST_WEEK_VIEW") +public class InformationLoanLastWeekView implements Serializable{ + + private static final long serialVersionUID = -6384789811291615117L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "loan_type_name") + private String loanTypeName; + + @Column(name = "id_office") + private String idOffice; + + @Column(name = "id_user") + private String idUser; + + @Column(name = "estatus_prestamo") + private String estatusPrestamo; + + @Column(name = "fecha") + private Date fecha; + + @Column(name = "apoyos") + private BigDecimal apoyos; + + @Column(name = "apoyos_total") + private BigDecimal apoyosTotal; + + @Column(name = "comision_apertura") + private BigDecimal comisionApertura; + + @Column(name = "aval") + private String aval; + + @Column(name = "customer") + private String customer; + + @Column(name = "documento_por") + private BigDecimal documentoPor; + + @Column(name = "abono_diario") + private BigDecimal abonoDiario; + + @Column(name = "amount_paid") + private BigDecimal amountPaid; + + @Column(name = "saldo_insoluto") + private BigDecimal saldoInsoluto; + + @Column(name = "route_name") + private String routeName; + + @Column(name = "asesor") + private String asesor; + + @Column(name = "num_fee") + private int numFee; + + @Column(name = "payment_monday") + private BigDecimal paymentMonday; + + @Column(name = "fee_monday") + private BigDecimal feeMonday; + + @Column(name = "payment_tuesday") + private BigDecimal paymentTuesday; + + @Column(name = "fee_tuesday") + private BigDecimal feeTuesday; + + @Column(name = "payment_wednesday") + private BigDecimal paymentWednesday; + + @Column(name = "fee_wednesday") + private BigDecimal feeWednesday; + + @Column(name = "payment_thursday") + private BigDecimal paymentThursday; + + @Column(name = "fee_thursday") + private BigDecimal feeThursday; + + @Column(name = "payment_friday") + private BigDecimal paymentFriday; + + @Column(name = "fee_friday") + private BigDecimal feeFriday; + + @Column(name = "payment_saturday") + private BigDecimal paymentSaturday; + + @Column(name = "fee_saturday") + private BigDecimal feeSaturday; + + @Column(name = "faltante") + private BigDecimal faltante; + + @Column(name = "new_customer") + private String newCustomer; + + @Column(name = "renovation") + private String renovation; + + @Column(name = "abono_semana_actual") + private BigDecimal abonoSemanaActual; + + @Column(name = "fee_semana_actual") + private BigDecimal feeSemanaActual; + + @Column(name = "num_pagos_all") + private BigDecimal numPagosAll; + + @Column(name = "num_pagos_week") + private BigDecimal numPagosWeek; + + @Column(name = "fee_todos") + private BigDecimal feeTodos; + + @Enumerated(EnumType.STRING) + @Column(name = "frozen") + private ActiveStatus frozen; + + public ActiveStatus getFrozen() { + if (frozen == null) { + frozen = ActiveStatus.DISABLED; + } + return frozen; + } + + public void setFrozen(ActiveStatus frozen) { + this.frozen = frozen; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLoanTypeName() { + return loanTypeName; + } + + public void setLoanTypeName(String loanTypeName) { + this.loanTypeName = loanTypeName; + } + + public String getEstatusPrestamo() { + return estatusPrestamo; + } + + public void setEstatusPrestamo(String estatusPrestamo) { + this.estatusPrestamo = estatusPrestamo; + } + + public String getIdOffice() { + return idOffice; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public void setIdOffice(String idOffice) { + this.idOffice = idOffice; + } + + public Date getFecha() { + return fecha; + } + + public void setFecha(Date fecha) { + this.fecha = fecha; + } + + public BigDecimal getApoyos() { + return apoyos; + } + + public void setApoyos(BigDecimal apoyos) { + this.apoyos = apoyos; + } + + public BigDecimal getApoyosTotal() { + return apoyosTotal; + } + + public void setApoyosTotal(BigDecimal apoyosTotal) { + this.apoyosTotal = apoyosTotal; + } + + public BigDecimal getComisionApertura() { + return comisionApertura; + } + + public void setComisionApertura(BigDecimal comisionApertura) { + this.comisionApertura = comisionApertura; + } + + public String getAval() { + return aval; + } + + public void setAval(String aval) { + this.aval = aval; + } + + public String getCustomer() { + return customer; + } + + public void setCustomer(String customer) { + this.customer = customer; + } + + public BigDecimal getDocumentoPor() { + return documentoPor.subtract(feeSemanaActual); + } + + public void setDocumentoPor(BigDecimal documentoPor) { + this.documentoPor = documentoPor; + } + + public BigDecimal getAbonoDiario() { + return abonoDiario; + } + + public void setAbonoDiario(BigDecimal abonoDiario) { + this.abonoDiario = abonoDiario; + } + + public BigDecimal getAmountPaid() { + return amountPaid.subtract(abonoSemanaActual); + } + + public void setAmountPaid(BigDecimal amountPaid) { + this.amountPaid = amountPaid; + } + + public BigDecimal getSaldoInsoluto() { + return (documentoPor.subtract(feeSemanaActual)).subtract((amountPaid.subtract(abonoSemanaActual))); + } + + public void setSaldoInsoluto(BigDecimal saldoInsoluto) { + this.saldoInsoluto = saldoInsoluto; + } + + public String getRouteName() { + return routeName; + } + + public void setRouteName(String routeName) { + this.routeName = routeName; + } + + public String getAsesor() { + return asesor; + } + + public void setAsesor(String asesor) { + this.asesor = asesor; + } + + public int getNumFee() { + return numFee; + } + + public void setNumFee(int numFee) { + this.numFee = numFee; + } + + public BigDecimal getPaymentMonday() { + return paymentMonday; + } + + public void setPaymentMonday(BigDecimal paymentMonday) { + this.paymentMonday = paymentMonday; + } + + public BigDecimal getFeeMonday() { + return feeMonday; + } + + public void setFeeMonday(BigDecimal feeMonday) { + this.feeMonday = feeMonday; + } + + public BigDecimal getPaymentTuesday() { + return paymentTuesday; + } + + public void setPaymentTuesday(BigDecimal paymentTuesday) { + this.paymentTuesday = paymentTuesday; + } + + public BigDecimal getFeeTuesday() { + return feeTuesday; + } + + public void setFeeTuesday(BigDecimal feeTuesday) { + this.feeTuesday = feeTuesday; + } + + public BigDecimal getPaymentWednesday() { + return paymentWednesday; + } + + public void setPaymentWednesday(BigDecimal paymentWednesday) { + this.paymentWednesday = paymentWednesday; + } + + public BigDecimal getFeeWednesday() { + return feeWednesday; + } + + public void setFeeWednesday(BigDecimal feeWednesday) { + this.feeWednesday = feeWednesday; + } + + public BigDecimal getPaymentThursday() { + return paymentThursday; + } + + public void setPaymentThursday(BigDecimal paymentThursday) { + this.paymentThursday = paymentThursday; + } + + public BigDecimal getFeeThursday() { + return feeThursday; + } + + public void setFeeThursday(BigDecimal feeThursday) { + this.feeThursday = feeThursday; + } + + public BigDecimal getPaymentFriday() { + return paymentFriday; + } + + public void setPaymentFriday(BigDecimal paymentFriday) { + this.paymentFriday = paymentFriday; + } + + public BigDecimal getFeeFriday() { + return feeFriday; + } + + public void setFeeFriday(BigDecimal feeFriday) { + this.feeFriday = feeFriday; + } + + public BigDecimal getPaymentSaturday() { + return paymentSaturday; + } + + public void setPaymentSaturday(BigDecimal paymentSaturday) { + this.paymentSaturday = paymentSaturday; + } + + public BigDecimal getFeeSaturday() { + return feeSaturday; + } + + public void setFeeSaturday(BigDecimal feeSaturday) { + this.feeSaturday = feeSaturday; + } + + public BigDecimal getFeeTodos() { + return feeTodos; + } + + public void setFeeTodos(BigDecimal feeTodos) { + this.feeTodos = feeTodos; + } + + public BigDecimal getFaltante() { + + BigDecimal montoPagadoTotalEsperado = (numPagosAll.subtract(numPagosWeek)).multiply(abonoDiario); + + BigDecimal montoPagadoSemana = paymentFriday.add(paymentMonday).add(paymentSaturday).add(paymentThursday).add(paymentTuesday).add(paymentWednesday); + BigDecimal montoPagadoTotal = getAmountPaid().subtract(montoPagadoSemana); + + BigDecimal faltanteAcomulado = (montoPagadoTotalEsperado.add(feeTodos)).subtract(montoPagadoTotal); + + + BigDecimal montoEsperadoSemana = numPagosWeek.multiply(abonoDiario); + + BigDecimal feeSemana = feeFriday.add(feeMonday).add(feeSaturday).add(feeThursday).add(feeTuesday).add(feeWednesday); + + //RN1 + //Si el pago esperado por semana es igual al total de abonos en la semana, entonces faltante 0 + if(montoPagadoSemana.compareTo(montoEsperadoSemana) == 0) + { + return BigDecimal.ZERO; + } + + // RN4 + if(renovation.equalsIgnoreCase("Si") && faltante.compareTo(BigDecimal.ZERO) > 0){ + return BigDecimal.ZERO; + } + + // RN5 + if (numPagosAll.compareTo(BigDecimal.valueOf(22)) > 0 && faltante.compareTo(BigDecimal.ZERO) > 0) { + return BigDecimal.ZERO; + } + + // RN6 + if (loanTypeName.toLowerCase().contains("con") || loanTypeName.toLowerCase().contains("conv") + || loanTypeName.toLowerCase().contains("conve") || loanTypeName.toLowerCase().contains("convenio")) { + return BigDecimal.ZERO; + } + + //RN7 + if(getFrozen().equals(ActiveStatus.ENEBLED)){ + return BigDecimal.ZERO; + } + + if(numPagosAll.compareTo(BigDecimal.valueOf(22)) > 0) + { + if((numPagosAll.subtract(numPagosWeek)).compareTo(BigDecimal.valueOf(22)) > 0) + { + return montoPagadoSemana.negate(); + } + BigDecimal temp = numPagosAll.subtract(BigDecimal.valueOf(22)); + if(temp.compareTo(BigDecimal.ONE) == 0) + { + return (paymentFriday.add(paymentSaturday)).negate(); + } + if(temp.compareTo(BigDecimal.valueOf(2)) == 0) + { + return (paymentFriday.add(paymentSaturday).add(paymentThursday)).negate(); + } + if(temp.compareTo(BigDecimal.valueOf(3)) == 0) + { + return (paymentFriday.add(paymentSaturday).add(paymentThursday).add(paymentWednesday)).negate(); + } + if(temp.compareTo(BigDecimal.valueOf(4)) == 0) + { + return (paymentFriday.add(paymentSaturday).add(paymentThursday).add(paymentWednesday).add(paymentTuesday)).negate(); + } + } + + //RN2 + //Si el total de abonos por semana es menor al total de abonos esperado, entonces se muestra la diferencia + if(montoPagadoSemana.compareTo(montoEsperadoSemana) < 0) + { + if(getSaldoInsoluto().compareTo(BigDecimal.ZERO) == 0) + { + if(apoyosTotal.compareTo(getAmountPaid()) < 0) + { + BigDecimal esperadoAntesDe = (numPagosAll.subtract(numPagosWeek)).multiply(abonoDiario); + BigDecimal pagadoAntesDe = getAmountPaid().subtract(montoPagadoSemana); + BigDecimal faltanteAntesDe = feeTodos.subtract(feeSemana); + BigDecimal faltanteAcomuladoAntesDe = (esperadoAntesDe.add(faltanteAntesDe)).subtract(pagadoAntesDe); + if(faltanteAcomuladoAntesDe.compareTo(BigDecimal.ZERO) > 0) + { + if(faltanteAcomuladoAntesDe.compareTo(montoPagadoSemana) == 0) + { + return montoPagadoSemana.negate(); + } + if(faltanteAcomuladoAntesDe.compareTo(montoPagadoSemana) < 0) + { + return faltanteAcomuladoAntesDe.negate(); + } + if(faltanteAcomuladoAntesDe.compareTo(montoPagadoSemana) > 0) + { + return montoPagadoSemana.negate(); + } + } + } + return BigDecimal.ZERO; + } + if(faltanteAcomulado.compareTo(BigDecimal.ZERO) < 0) + { + if(faltanteAcomulado.abs().compareTo((montoEsperadoSemana.subtract(montoPagadoSemana))) == 0) + { + return BigDecimal.ZERO; + } + if(faltanteAcomulado.abs().compareTo((montoEsperadoSemana.subtract(montoPagadoSemana))) < 0) + { + return (montoEsperadoSemana.subtract(montoPagadoSemana)).subtract(faltanteAcomulado.abs()); + } + if(faltanteAcomulado.abs().compareTo((montoEsperadoSemana.subtract(montoPagadoSemana))) > 0) + { + return BigDecimal.ZERO; + } + } + + if(getSaldoInsoluto().compareTo((montoEsperadoSemana.subtract(montoPagadoSemana))) == 0) + { + return montoEsperadoSemana.subtract(montoPagadoSemana); + } + + if(getSaldoInsoluto().compareTo((montoEsperadoSemana.subtract(montoPagadoSemana))) < 0) + { + return getSaldoInsoluto(); + } + + if(getSaldoInsoluto().compareTo((montoEsperadoSemana.subtract(montoPagadoSemana))) > 0) + { + return montoEsperadoSemana.subtract(montoPagadoSemana); + } + } + + //RN3 + //Si el total de abonos por semana es mayor al total de abonos esperado, + if(montoPagadoSemana.compareTo(montoEsperadoSemana) > 0) + { + if(faltanteAcomulado.compareTo(BigDecimal.ZERO) < 0) + { + return BigDecimal.ZERO; + } + + if(faltanteAcomulado.compareTo(BigDecimal.ZERO) == 0) + { + if(feeSemana.compareTo(BigDecimal.ZERO) > 0) + { + if(feeSemana.compareTo(montoPagadoSemana.subtract(montoEsperadoSemana)) > 0) + { + return (montoPagadoSemana.subtract(montoEsperadoSemana)).negate(); + } + else + { + return feeSemana.negate(); + } + } + return BigDecimal.ZERO; + } + + if(faltanteAcomulado.compareTo(BigDecimal.ZERO) > 0) + { + if(faltanteAcomulado.compareTo((montoPagadoSemana.subtract(montoEsperadoSemana))) == 0) + { + return faltanteAcomulado.negate(); + } + if(faltanteAcomulado.compareTo((montoPagadoSemana.subtract(montoEsperadoSemana))) > 0) + { + return (montoPagadoSemana.subtract(montoEsperadoSemana)).negate(); + } + if(faltanteAcomulado.compareTo((montoPagadoSemana.subtract(montoEsperadoSemana))) < 0) + { + return faltanteAcomulado.negate(); + } + } + } + return faltante; + } + + public void setFaltante(BigDecimal faltante) { + this.faltante = faltante; + } + + public String getNewCustomer() { + return newCustomer; + } + + public void setNewCustomer(String newCustomer) { + this.newCustomer = newCustomer; + } + + public String getRenovation() { + return renovation; + } + + public void setRenovation(String renovation) { + this.renovation = renovation; + } + + public BigDecimal getAbonoSemanaActual() { + return abonoSemanaActual; + } + + public void setAbonoSemanaActual(BigDecimal abonoSemanaActual) { + this.abonoSemanaActual = abonoSemanaActual; + } + + public BigDecimal getFeeSemanaActual() { + return feeSemanaActual; + } + + public void setFeeSemanaActual(BigDecimal feeSemanaActual) { + this.feeSemanaActual = feeSemanaActual; + } + + public BigDecimal getNumPagosAll() { + return numPagosAll; + } + + public void setNumPagosAll(BigDecimal numPagosAll) { + this.numPagosAll = numPagosAll; + } + + public BigDecimal getNumPagosWeek() { + return numPagosWeek; + } + + public void setNumPagosWeek(BigDecimal numPagosWeek) { + this.numPagosWeek = numPagosWeek; + } + + public String getConditionLunes() { + if(feeMonday.compareTo(BigDecimal.ZERO) > 0) + return "redRow"; + else if(paymentMonday.compareTo(BigDecimal.ZERO) == 0 && feeMonday.compareTo(BigDecimal.ZERO) == 0) + return "greenRow"; + else if(feeMonday.compareTo(BigDecimal.ZERO) == 0 && paymentMonday.compareTo(BigDecimal.ZERO) > 0 && (paymentMonday.compareTo(abonoDiario) < 0)) + return "yellowRow"; + else if(feeMonday.compareTo(BigDecimal.ZERO) == 0 && paymentMonday.compareTo(BigDecimal.ZERO) > 0 && (paymentMonday.compareTo(abonoDiario) > 0)) + return "blueRow"; + else + return null; + } + + public String getConditionMartes() { + if(feeTuesday.compareTo(BigDecimal.ZERO) > 0) + return "redRow"; + else if(paymentTuesday.compareTo(BigDecimal.ZERO) == 0 && feeTuesday.compareTo(BigDecimal.ZERO) == 0) + return "greenRow"; + else if(feeTuesday.compareTo(BigDecimal.ZERO) == 0 && paymentTuesday.compareTo(BigDecimal.ZERO) > 0 && (paymentTuesday.compareTo(abonoDiario) < 0)) + return "yellowRow"; + else if(feeTuesday.compareTo(BigDecimal.ZERO) == 0 && paymentTuesday.compareTo(BigDecimal.ZERO) > 0 && (paymentTuesday.compareTo(abonoDiario) > 0)) + return "blueRow"; + else + return null; + } + + public String getConditionMiercoles() { + if(feeWednesday.compareTo(BigDecimal.ZERO) > 0) + return "redRow"; + else if(paymentWednesday.compareTo(BigDecimal.ZERO) == 0 && feeWednesday.compareTo(BigDecimal.ZERO) == 0) + return "greenRow"; + else if(feeWednesday.compareTo(BigDecimal.ZERO) == 0 && paymentWednesday.compareTo(BigDecimal.ZERO) > 0 && (paymentWednesday.compareTo(abonoDiario) < 0)) + return "yellowRow"; + else if(feeWednesday.compareTo(BigDecimal.ZERO) == 0 && paymentWednesday.compareTo(BigDecimal.ZERO) > 0 && (paymentWednesday.compareTo(abonoDiario) > 0)) + return "blueRow"; + else + return null; + } + + public String getConditionJueves() { + if(feeThursday.compareTo(BigDecimal.ZERO) > 0) + return "redRow"; + else if(paymentThursday.compareTo(BigDecimal.ZERO) == 0 && feeThursday.compareTo(BigDecimal.ZERO) == 0) + return "greenRow"; + else if(feeThursday.compareTo(BigDecimal.ZERO) == 0 && paymentThursday.compareTo(BigDecimal.ZERO) > 0 && (paymentThursday.compareTo(abonoDiario) < 0)) + return "yellowRow"; + else if(feeThursday.compareTo(BigDecimal.ZERO) == 0 && paymentThursday.compareTo(BigDecimal.ZERO) > 0 && (paymentThursday.compareTo(abonoDiario) > 0)) + return "blueRow"; + else + return null; + } + + public String getConditionViernes() { + if(feeFriday.compareTo(BigDecimal.ZERO) > 0) + return "redRow"; + else if(paymentFriday.compareTo(BigDecimal.ZERO) == 0 && feeFriday.compareTo(BigDecimal.ZERO) == 0) + return "greenRow"; + else if(feeFriday.compareTo(BigDecimal.ZERO) == 0 && paymentFriday.compareTo(BigDecimal.ZERO) > 0 && (paymentFriday.compareTo(abonoDiario) < 0)) + return "yellowRow"; + else if(feeFriday.compareTo(BigDecimal.ZERO) == 0 && paymentFriday.compareTo(BigDecimal.ZERO) > 0 && (paymentFriday.compareTo(abonoDiario) > 0)) + return "blueRow"; + else + return null; + } + + public String getConditionSabado() { + if(feeSaturday.compareTo(BigDecimal.ZERO) > 0) + return "redRow"; + else if(paymentSaturday.compareTo(BigDecimal.ZERO) == 0 && feeSaturday.compareTo(BigDecimal.ZERO) == 0) + return "greenRow"; + else if(feeSaturday.compareTo(BigDecimal.ZERO) == 0 && paymentSaturday.compareTo(BigDecimal.ZERO) > 0 && (paymentSaturday.compareTo(abonoDiario) < 0)) + return "yellowRow"; + else if(feeSaturday.compareTo(BigDecimal.ZERO) == 0 && paymentSaturday.compareTo(BigDecimal.ZERO) > 0 && (paymentSaturday.compareTo(abonoDiario) > 0)) + return "blueRow"; + else + return null; + } + + public String getConditionNewCustomer() { + if(newCustomer.equalsIgnoreCase("Si")) + return "greenRow"; + else + return null; + } + + public String getConditionRenovation() { + if (getFrozen().equals(ActiveStatus.ENEBLED)) { + return "blueLightRow"; + } + if (newCustomer.equalsIgnoreCase("Si")) + return "orangeRow"; + else if(renovation.equalsIgnoreCase("Si")) + return "greenLigthRow"; + else if(getSaldoInsoluto().compareTo(BigDecimal.ZERO) == 0) + return "greenStrongRow"; + else + return null; + } + + public int getWeekLoanDate() { + Calendar c2 = Calendar.getInstance(); + c2.setTime(getFecha()); + int weekLoanDate = c2.get(Calendar.WEEK_OF_YEAR); + + return weekLoanDate; + } + + public int getWeekCurrentDate() { + Calendar c2 = Calendar.getInstance(); + int weekCurrentDate = c2.get(Calendar.WEEK_OF_YEAR); + weekCurrentDate = weekCurrentDate - 1; + return weekCurrentDate; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/InformationLoanWeekView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/InformationLoanWeekView.java new file mode 100644 index 0000000..cce9f16 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/InformationLoanWeekView.java @@ -0,0 +1,1150 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.math.MathContext; +import java.util.Calendar; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_INFORMATION_LOAN_WEEK_VIEW") +public class InformationLoanWeekView implements Serializable { + + private static final long serialVersionUID = -6384789811291615117L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_office") + private String idOffice; + + @Column(name = "loan_type_name") + private String loanTypeName; + + @Column(name = "id_user") + private String idUser; + + @Column(name = "estatus_prestamo") + private String estatusPrestamo; + + @Column(name = "fecha") + private Date fecha; + + @Column(name = "apoyos") + private BigDecimal apoyos; + + @Column(name = "apoyos_total") + private BigDecimal apoyosTotal; + + @Column(name = "comision_apertura") + private BigDecimal comisionApertura; + + @Column(name = "aval") + private String aval; + + @Column(name = "customer") + private String customer; + + @Column(name = "documento_por") + private BigDecimal documentoPor; + + @Column(name = "abono_diario") + private BigDecimal abonoDiario; + + @Column(name = "amount_paid") + private BigDecimal amountPaid; + + @Column(name = "saldo_insoluto") + private BigDecimal saldoInsoluto; + + @Column(name = "route_name") + private String routeName; + + @Column(name = "asesor") + private String asesor; + + @Column(name = "num_fee") + private int numFee; + + @Column(name = "payment_monday") + private BigDecimal paymentMonday; + + @Column(name = "fee_monday") + private BigDecimal feeMonday; + + @Column(name = "payment_tuesday") + private BigDecimal paymentTuesday; + + @Column(name = "fee_tuesday") + private BigDecimal feeTuesday; + + @Column(name = "payment_wednesday") + private BigDecimal paymentWednesday; + + @Column(name = "fee_wednesday") + private BigDecimal feeWednesday; + + @Column(name = "payment_thursday") + private BigDecimal paymentThursday; + + @Column(name = "fee_thursday") + private BigDecimal feeThursday; + + @Column(name = "payment_friday") + private BigDecimal paymentFriday; + + @Column(name = "fee_friday") + private BigDecimal feeFriday; + + @Column(name = "payment_saturday") + private BigDecimal paymentSaturday; + + @Column(name = "fee_saturday") + private BigDecimal feeSaturday; + + @Column(name = "faltante") + private BigDecimal faltante; + + @Column(name = "new_customer") + private String newCustomer; + + @Column(name = "renovation") + private String renovation; + + @Column(name = "num_pagos_all") + private BigDecimal numPagosAll; + + @Column(name = "num_pagos_week") + private BigDecimal numPagosWeek; + + @Column(name = "fee_todos") + private BigDecimal feeTodos; + + @Enumerated(EnumType.STRING) + @Column(name = "frozen") + private ActiveStatus frozen; + + @Transient + private BigDecimal totalPaid; + + @Transient + private BigDecimal numPagosLoanType; + + @Transient + private String movimientosMonday; + + @Transient + private String movimientosTuesday; + + @Transient + private String movimientosWednesday; + + @Transient + private String movimientosThursday; + + @Transient + private String movimientosFriday; + + @Transient + private String movimientosSaturday; + + @Transient + private String renovationMonday; + + @Transient + private String renovationTuesday; + + @Transient + private String renovationWednesday; + + @Transient + private String renovationThursday; + + @Transient + private String renovationFriday; + + @Transient + private String renovationSaturday; + + @Transient + private String reactivation; + + @Transient + private String weekOfCreation; + + private BigDecimal faltanteHistorico; + + private BigDecimal recuperado; + + private BigDecimal faltanteSemana; + + private BigDecimal feeSemana; + + public ActiveStatus getFrozen() { + if (frozen == null) { + frozen = ActiveStatus.DISABLED; + } + return frozen; + } + + public void setFrozen(ActiveStatus frozen) { + this.frozen = frozen; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLoanTypeName() { + return loanTypeName; + } + + public void setLoanTypeName(String loanTypeName) { + this.loanTypeName = loanTypeName; + } + + public String getEstatusPrestamo() { + return estatusPrestamo; + } + + public void setEstatusPrestamo(String estatusPrestamo) { + this.estatusPrestamo = estatusPrestamo; + } + + public String getIdOffice() { + return idOffice; + } + + public void setIdOffice(String idOffice) { + this.idOffice = idOffice; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public Date getFecha() { + return fecha; + } + + public void setFecha(Date fecha) { + this.fecha = fecha; + } + + public BigDecimal getApoyos() { + return apoyos; + } + + public void setApoyos(BigDecimal apoyos) { + this.apoyos = apoyos; + } + + public BigDecimal getApoyosTotal() { + return apoyosTotal; + } + + public void setApoyosTotal(BigDecimal apoyosTotal) { + this.apoyosTotal = apoyosTotal; + } + + public BigDecimal getComisionApertura() { + return comisionApertura; + } + + public void setComisionApertura(BigDecimal comisionApertura) { + this.comisionApertura = comisionApertura; + } + + public String getAval() { + return aval; + } + + public void setAval(String aval) { + this.aval = aval; + } + + public String getCustomer() { + return customer; + } + + public void setCustomer(String customer) { + this.customer = customer; + } + + public BigDecimal getDocumentoPor() { + return documentoPor; + } + + public void setDocumentoPor(BigDecimal documentoPor) { + this.documentoPor = documentoPor; + } + + public BigDecimal getAbonoDiario() { + return abonoDiario; + } + + public void setAbonoDiario(BigDecimal abonoDiario) { + this.abonoDiario = abonoDiario; + } + + public BigDecimal getAmountPaid() { + return amountPaid; + } + + public void setAmountPaid(BigDecimal amountPaid) { + this.amountPaid = amountPaid; + } + + public BigDecimal getSaldoInsoluto() { + return saldoInsoluto; + } + + public void setSaldoInsoluto(BigDecimal saldoInsoluto) { + this.saldoInsoluto = saldoInsoluto; + } + + public String getRouteName() { + return routeName; + } + + public void setRouteName(String routeName) { + this.routeName = routeName; + } + + public String getAsesor() { + return asesor; + } + + public void setAsesor(String asesor) { + this.asesor = asesor; + } + + public int getNumFee() { + return numFee; + } + + public void setNumFee(int numFee) { + this.numFee = numFee; + } + + public BigDecimal getPaymentMonday() { + return paymentMonday; + } + + public void setPaymentMonday(BigDecimal paymentMonday) { + this.paymentMonday = paymentMonday; + } + + public BigDecimal getFeeMonday() { + return feeMonday; + } + + public void setFeeMonday(BigDecimal feeMonday) { + this.feeMonday = feeMonday; + } + + public BigDecimal getPaymentTuesday() { + return paymentTuesday; + } + + public void setPaymentTuesday(BigDecimal paymentTuesday) { + this.paymentTuesday = paymentTuesday; + } + + public BigDecimal getFeeTuesday() { + return feeTuesday; + } + + public void setFeeTuesday(BigDecimal feeTuesday) { + this.feeTuesday = feeTuesday; + } + + public BigDecimal getPaymentWednesday() { + return paymentWednesday; + } + + public void setPaymentWednesday(BigDecimal paymentWednesday) { + this.paymentWednesday = paymentWednesday; + } + + public BigDecimal getFeeWednesday() { + return feeWednesday; + } + + public void setFeeWednesday(BigDecimal feeWednesday) { + this.feeWednesday = feeWednesday; + } + + public BigDecimal getPaymentThursday() { + return paymentThursday; + } + + public void setPaymentThursday(BigDecimal paymentThursday) { + this.paymentThursday = paymentThursday; + } + + public BigDecimal getFeeThursday() { + return feeThursday; + } + + public void setFeeThursday(BigDecimal feeThursday) { + this.feeThursday = feeThursday; + } + + public BigDecimal getPaymentFriday() { + return paymentFriday; + } + + public void setPaymentFriday(BigDecimal paymentFriday) { + this.paymentFriday = paymentFriday; + } + + public BigDecimal getFeeFriday() { + return feeFriday; + } + + public void setFeeFriday(BigDecimal feeFriday) { + this.feeFriday = feeFriday; + } + + public BigDecimal getPaymentSaturday() { + return paymentSaturday; + } + + public void setPaymentSaturday(BigDecimal paymentSaturday) { + this.paymentSaturday = paymentSaturday; + } + + public BigDecimal getFeeSaturday() { + return feeSaturday; + } + + public void setFeeSaturday(BigDecimal feeSaturday) { + this.feeSaturday = feeSaturday; + } + + public BigDecimal getNumPagosAll() { + return numPagosAll; + } + + public void setNumPagosAll(BigDecimal numPagosAll) { + this.numPagosAll = numPagosAll; + } + + public BigDecimal getNumPagosWeek() { + return numPagosWeek; + } + + public void setNumPagosWeek(BigDecimal numPagosWeek) { + this.numPagosWeek = numPagosWeek; + } + + public BigDecimal getFeeTodos() { + return feeTodos; + } + + public void setFeeTodos(BigDecimal feeTodos) { + this.feeTodos = feeTodos; + } + + public BigDecimal getTotalPaid() { + return totalPaid; + } + + public void setTotalPaid(BigDecimal totalPaid) { + this.totalPaid = totalPaid; + } + + public BigDecimal getNumPagosLoanType() { + return numPagosLoanType; + } + + public void setNumPagosLoanType(BigDecimal numPagosLoanType) { + this.numPagosLoanType = numPagosLoanType; + } + + public BigDecimal getFaltante() { + + //if(id.equals("f911ef4c-b6f2-4ecf-91b6-3d6d6bcf9faa")){ + BigDecimal montoPagadoTotalEsperado = (numPagosAll.subtract(numPagosWeek)).multiply(abonoDiario); + + if (numPagosAll.subtract(numPagosWeek).compareTo(numPagosLoanType) >= 0) { + + montoPagadoTotalEsperado = (numPagosLoanType).multiply(abonoDiario); + } + + BigDecimal montoPagadoSemana = paymentFriday.add(paymentMonday).add(paymentSaturday).add(paymentThursday).add(paymentTuesday).add(paymentWednesday); + + BigDecimal montoPagadoTotalPasado = totalPaid.subtract(montoPagadoSemana); + + BigDecimal faltanteAcomulado = (montoPagadoTotalEsperado.add(feeTodos)).subtract(montoPagadoTotalPasado); + + BigDecimal faltanteSemanaCalculo = getFaltanteSemana(); + + BigDecimal recuperadoSemana = getRecuperado(); + + BigDecimal montoEsperadoSemana = numPagosWeek.multiply(abonoDiario); + + BigDecimal feeSemana = feeFriday.add(feeMonday).add(feeSaturday).add(feeThursday).add(feeTuesday).add(feeWednesday); + + //montoPagadoTotalEsperado.add(feeSemana).add(feeTodos); + //RN1 + //Si el pago esperado por semana es igual al total de abonos en la semana, entonces faltante 0 + if (montoPagadoSemana.compareTo(montoEsperadoSemana) == 0) { + return BigDecimal.ZERO; + } + + // RN4 + /*if(renovation.equalsIgnoreCase("Si") && faltante.compareTo(BigDecimal.ZERO) > 0){ + return BigDecimal.ZERO; + }*/ + if (renovationMonday.equalsIgnoreCase("Si") || renovationTuesday.equalsIgnoreCase("Si") + || renovationThursday.equalsIgnoreCase("Si") || renovationWednesday.equalsIgnoreCase("Si") + || renovationFriday.equalsIgnoreCase("Si") || renovationSaturday.equalsIgnoreCase("Si")) { + + if (faltanteAcomulado.compareTo(BigDecimal.ZERO) <= 0) { + return BigDecimal.ZERO; + } + + return faltanteAcomulado.negate(); + } + + // RN5 + // if (numPagosAll.compareTo(BigDecimal.valueOf(22)) > 0 && faltante.compareTo(BigDecimal.ZERO) > 0) { + // return BigDecimal.ZERO; + //} + // RN6 + if (loanTypeName.toLowerCase().contains("con") || loanTypeName.toLowerCase().contains("conv") + || loanTypeName.toLowerCase().contains("conve") || loanTypeName.toLowerCase().contains("convenio")) { + return BigDecimal.ZERO; + } + + //RN7 + if (getFrozen().equals(ActiveStatus.ENEBLED)) { + return BigDecimal.ZERO; + } + + if (numPagosAll.compareTo(BigDecimal.valueOf(22)) > 0) { + + return montoPagadoSemana.negate(); + + } + + //RN2 + //Si el total de abonos por semana es menor al total de abonos esperado, entonces se muestra la diferencia + if (montoPagadoSemana.compareTo(montoEsperadoSemana) < 0) { + if (faltanteAcomulado.compareTo(BigDecimal.ZERO) < 0) { + + faltanteAcomulado = faltanteAcomulado.negate(); + + switch ((faltanteAcomulado).compareTo(faltanteSemanaCalculo)) { + case (-1): + return montoEsperadoSemana.subtract(montoPagadoSemana).subtract(faltanteAcomulado); + case (0): + return BigDecimal.ZERO; + case (1): + return BigDecimal.ZERO; + } + + } + + return montoEsperadoSemana.subtract(montoPagadoSemana); + + } + + //RN3 + //Si el total de abonos por semana es mayor al total de abonos esperado, + if (montoPagadoSemana.compareTo(montoEsperadoSemana) > 0) { + if (faltanteAcomulado.compareTo(BigDecimal.ZERO) < 0) { + return BigDecimal.ZERO; + } + + if (faltanteAcomulado.compareTo(BigDecimal.ZERO) > 0) { + if (faltanteAcomulado.compareTo((recuperadoSemana)) == 0) { + + return faltanteAcomulado.negate(); + } + if (faltanteAcomulado.compareTo(recuperadoSemana) > 0) { + return montoPagadoSemana.subtract(montoEsperadoSemana).negate(); + } + if (faltanteAcomulado.compareTo(recuperadoSemana) < 0) { + + if ((feeSemana).compareTo(BigDecimal.ZERO) == 0) { + return faltanteAcomulado.negate(); + } + + switch ((faltanteAcomulado.add(feeSemana)).compareTo((recuperadoSemana))) { + case (-1): + return (feeSemana.add(faltanteAcomulado)).negate(); + case (0): + return BigDecimal.ZERO; + case (1): + return (montoPagadoSemana.subtract(montoEsperadoSemana)).negate(); + } + + } + } + } + //return faltante; + //} + + return BigDecimal.ZERO; + } + + public void setFaltante(BigDecimal faltante) { + this.faltante = faltante; + } + + public BigDecimal getFaltanteHistorico() { + BigDecimal montoPagadoTotalEsperado = (numPagosAll.subtract(numPagosWeek)).multiply(abonoDiario); + + if (numPagosAll.subtract(numPagosWeek).compareTo(numPagosLoanType) >= 0) { + + montoPagadoTotalEsperado = (numPagosLoanType).multiply(abonoDiario); + } + BigDecimal montoPagadoSemana = paymentFriday.add(paymentMonday).add(paymentSaturday).add(paymentThursday).add(paymentTuesday).add(paymentWednesday); + BigDecimal montoPagadoTotal = totalPaid; + BigDecimal montoPagadoTotalPasado = montoPagadoTotal.subtract(montoPagadoSemana); + + return montoPagadoTotalEsperado.add(feeTodos).subtract(montoPagadoTotalPasado); + } + + public void setFaltanteHistorico(BigDecimal faltanteHistorico) { + this.faltanteHistorico = faltanteHistorico; + } + + public BigDecimal getRecuperado() { + BigDecimal recuperadoSemanaPorDia = BigDecimal.ZERO; + + //if(id.equals("4177c7d0-46ee-4862-aa5f-d0526798cc41")){ + if ((numPagosAll.subtract(numPagosWeek)).compareTo(BigDecimal.valueOf(22)) >= 0) { + + return paymentMonday.add(paymentThursday).add(paymentWednesday).add(paymentTuesday).add(paymentFriday).add(paymentSaturday); + + } + + /*if(getFaltanteHistorico().compareTo(BigDecimal.ZERO)<0) + { + return BigDecimal.ZERO; + }*/ + if (renovationMonday.equalsIgnoreCase("Si")) { + return recuperadoSemanaPorDia; + + } + + if (movimientosMonday.equalsIgnoreCase("Si")) { + recuperadoSemanaPorDia = ((paymentMonday.subtract(abonoDiario).compareTo(BigDecimal.ZERO)) > 0) ? recuperadoSemanaPorDia.add(paymentMonday.subtract(abonoDiario)) : recuperadoSemanaPorDia; + } + + if (renovationTuesday.equalsIgnoreCase("Si")) { + return recuperadoSemanaPorDia; + + } + + if (movimientosTuesday.equalsIgnoreCase("Si")) { + recuperadoSemanaPorDia = ((paymentTuesday.subtract(abonoDiario).compareTo(BigDecimal.ZERO)) > 0) ? recuperadoSemanaPorDia.add(paymentTuesday.subtract(abonoDiario)) : recuperadoSemanaPorDia; + } + + if (renovationWednesday.equalsIgnoreCase("Si")) { + return recuperadoSemanaPorDia; + + } + if (movimientosWednesday.equalsIgnoreCase("Si")) { + recuperadoSemanaPorDia = ((paymentWednesday.subtract(abonoDiario).compareTo(BigDecimal.ZERO)) > 0) ? recuperadoSemanaPorDia.add(paymentWednesday.subtract(abonoDiario)) : recuperadoSemanaPorDia; + + } + + if (renovationThursday.equalsIgnoreCase("Si")) { + return recuperadoSemanaPorDia; + + } + + if (movimientosThursday.equalsIgnoreCase("Si")) { + recuperadoSemanaPorDia = ((paymentThursday.subtract(abonoDiario).compareTo(BigDecimal.ZERO)) > 0) ? recuperadoSemanaPorDia.add(paymentThursday.subtract(abonoDiario)) : recuperadoSemanaPorDia; + + } + + if (renovationFriday.equalsIgnoreCase("Si")) { + return recuperadoSemanaPorDia; + + } + + if (movimientosFriday.equalsIgnoreCase("Si")) { + recuperadoSemanaPorDia = ((paymentFriday.subtract(abonoDiario).compareTo(BigDecimal.ZERO)) > 0) ? recuperadoSemanaPorDia.add(paymentFriday.subtract(abonoDiario)) : recuperadoSemanaPorDia; + + } + + if (renovationSaturday.equalsIgnoreCase("Si")) { + return recuperadoSemanaPorDia; + + } + + if (movimientosSaturday.equalsIgnoreCase("Si")) { + recuperadoSemanaPorDia = ((paymentSaturday.subtract(abonoDiario).compareTo(BigDecimal.ZERO)) > 0) ? recuperadoSemanaPorDia.add(paymentSaturday.subtract(abonoDiario)) : recuperadoSemanaPorDia; + + } + //} + + BigDecimal faltanteTotal = getFaltanteHistorico().add(getFaltanteSemana()); + + if (faltanteTotal.compareTo(BigDecimal.ZERO) > 0) { + + switch (recuperadoSemanaPorDia.compareTo(faltanteTotal)) { + case (-1): + return recuperadoSemanaPorDia; + case (0): + return recuperadoSemanaPorDia; + case (1): + return faltanteTotal; + + } + } else { + return BigDecimal.ZERO; + } + + return recuperadoSemanaPorDia; + + } + + public void setRecuperado(BigDecimal recuperado) { + this.recuperado = recuperado; + } + + public BigDecimal getFaltanteSemana() { + getId(); + + BigDecimal faltanteSemanaPorDia = BigDecimal.ZERO; + //if(id.equals("93ad8123-9b0d-4087-a85b-3216af2bacbf")){ + + if ((numPagosAll.subtract(numPagosWeek)).compareTo(BigDecimal.valueOf(22)) >= 0) { + + return faltanteSemanaPorDia; + + } + + if (renovationMonday.equalsIgnoreCase("Si")) { + return faltanteSemanaPorDia; + + } + if ((numPagosAll.subtract(numPagosWeek).add(BigDecimal.valueOf(1))).compareTo(BigDecimal.valueOf(22)) <= 0) { + if (movimientosMonday.equalsIgnoreCase("Si")) { + + if (feeMonday.compareTo(BigDecimal.ZERO) > 0) { + faltanteSemanaPorDia = ((abonoDiario.subtract(paymentMonday).compareTo(BigDecimal.ZERO)) > 0) ? faltanteSemanaPorDia.add(abonoDiario.subtract(paymentMonday)) : faltanteSemanaPorDia; + + } else if (paymentMonday.compareTo(BigDecimal.ZERO) == 0) { + + } else { + faltanteSemanaPorDia = ((abonoDiario.subtract(paymentMonday).compareTo(BigDecimal.ZERO)) > 0) ? faltanteSemanaPorDia.add(abonoDiario.subtract(paymentMonday)) : faltanteSemanaPorDia; + } + + } + } + + if (renovationTuesday.equalsIgnoreCase("Si")) { + return faltanteSemanaPorDia; + + } + + if ((numPagosAll.subtract(numPagosWeek).add(BigDecimal.valueOf(2))).compareTo(BigDecimal.valueOf(22)) <= 0) { + if (movimientosTuesday.equalsIgnoreCase("Si")) { + + if (feeTuesday.compareTo(BigDecimal.ZERO) > 0) { + faltanteSemanaPorDia = ((abonoDiario.subtract(paymentTuesday).compareTo(BigDecimal.ZERO)) > 0) ? faltanteSemanaPorDia.add(abonoDiario.subtract(paymentTuesday)) : faltanteSemanaPorDia; + + } else if (paymentTuesday.compareTo(BigDecimal.ZERO) == 0) { + + } else { + faltanteSemanaPorDia = ((abonoDiario.subtract(paymentTuesday).compareTo(BigDecimal.ZERO)) > 0) ? faltanteSemanaPorDia.add(abonoDiario.subtract(paymentTuesday)) : faltanteSemanaPorDia; + } + + } + } + + if (renovationWednesday.equalsIgnoreCase("Si")) { + return faltanteSemanaPorDia; + + } + if ((numPagosAll.subtract(numPagosWeek).add(BigDecimal.valueOf(3))).compareTo(BigDecimal.valueOf(22)) <= 0) { + if (movimientosWednesday.equalsIgnoreCase("Si")) { + + if (feeWednesday.compareTo(BigDecimal.ZERO) > 0) { + faltanteSemanaPorDia = ((abonoDiario.subtract(paymentWednesday).compareTo(BigDecimal.ZERO)) > 0) ? faltanteSemanaPorDia.add(abonoDiario.subtract(paymentWednesday)) : faltanteSemanaPorDia; + + } else if (paymentWednesday.compareTo(BigDecimal.ZERO) == 0) { + + } else { + faltanteSemanaPorDia = ((abonoDiario.subtract(paymentWednesday).compareTo(BigDecimal.ZERO)) > 0) ? faltanteSemanaPorDia.add(abonoDiario.subtract(paymentWednesday)) : faltanteSemanaPorDia; + } + + } + } + + if (renovationThursday.equalsIgnoreCase("Si")) { + return faltanteSemanaPorDia; + + } + if ((numPagosAll.subtract(numPagosWeek).add(BigDecimal.valueOf(4))).compareTo(BigDecimal.valueOf(22)) <= 0) { + if (movimientosThursday.equalsIgnoreCase("Si")) { + + if (feeThursday.compareTo(BigDecimal.ZERO) > 0) { + faltanteSemanaPorDia = ((abonoDiario.subtract(paymentThursday).compareTo(BigDecimal.ZERO)) > 0) ? faltanteSemanaPorDia.add(abonoDiario.subtract(paymentThursday)) : faltanteSemanaPorDia; + + } else if (paymentThursday.compareTo(BigDecimal.ZERO) == 0) { + + } else { + faltanteSemanaPorDia = ((abonoDiario.subtract(paymentThursday).compareTo(BigDecimal.ZERO)) > 0) ? faltanteSemanaPorDia.add(abonoDiario.subtract(paymentThursday)) : faltanteSemanaPorDia; + } + } + } + + if (renovationFriday.equalsIgnoreCase("Si")) { + return faltanteSemanaPorDia; + + } + if ((numPagosAll.subtract(numPagosWeek).add(BigDecimal.valueOf(5))).compareTo(BigDecimal.valueOf(22)) <= 0) { + if (movimientosFriday.equalsIgnoreCase("Si")) { + + if (feeFriday.compareTo(BigDecimal.ZERO) > 0) { + faltanteSemanaPorDia = ((abonoDiario.subtract(paymentFriday).compareTo(BigDecimal.ZERO)) > 0) ? faltanteSemanaPorDia.add(abonoDiario.subtract(paymentFriday)) : faltanteSemanaPorDia; + + } else if (paymentFriday.compareTo(BigDecimal.ZERO) == 0) { + + } else { + faltanteSemanaPorDia = ((abonoDiario.subtract(paymentFriday).compareTo(BigDecimal.ZERO)) > 0) ? faltanteSemanaPorDia.add(abonoDiario.subtract(paymentFriday)) : faltanteSemanaPorDia; + } + } + } + + if (renovationSaturday.equalsIgnoreCase("Si")) { + return faltanteSemanaPorDia; + + } + if ((numPagosAll.subtract(numPagosWeek).add(BigDecimal.valueOf(6))).compareTo(BigDecimal.valueOf(22)) <= 0) { + if (movimientosSaturday.equalsIgnoreCase("Si")) { + + if (feeSaturday.compareTo(BigDecimal.ZERO) > 0) { + faltanteSemanaPorDia = ((abonoDiario.subtract(paymentSaturday).compareTo(BigDecimal.ZERO)) > 0) ? faltanteSemanaPorDia.add(abonoDiario.subtract(paymentSaturday)) : faltanteSemanaPorDia; + + } else if (paymentSaturday.compareTo(BigDecimal.ZERO) == 0) { + + } else { + faltanteSemanaPorDia = ((abonoDiario.subtract(paymentSaturday).compareTo(BigDecimal.ZERO)) > 0) ? faltanteSemanaPorDia.add(abonoDiario.subtract(paymentSaturday)) : faltanteSemanaPorDia; + } + } + } + // } + + /* + if(getFaltanteHistorico().compareTo(BigDecimal.ZERO)<0) + { + BigDecimal faltanteHistoricoAbsoluto = getFaltanteHistorico().abs(); + switch(faltanteHistoricoAbsoluto.compareTo(faltanteSemanaPorDia)){ + case (-1): return faltanteSemanaPorDia.subtract(faltanteHistoricoAbsoluto); + case (0): return BigDecimal.ZERO; + case (1): return BigDecimal.ZERO; + } + }*/ + return faltanteSemanaPorDia; + } + + public void setFaltanteSemana(BigDecimal faltanteSemana) { + this.faltanteSemana = faltanteSemana; + } + + public String getNewCustomer() { + return newCustomer; + } + + public void setNewCustomer(String newCustomer) { + this.newCustomer = newCustomer; + } + + public String getRenovation() { + return renovation; + } + + public void setRenovation(String renovation) { + this.renovation = renovation; + } + + public String getConditionLunes() { + if (feeMonday.compareTo(BigDecimal.ZERO) > 0) { + return "redRow"; + } else if (paymentMonday.compareTo(BigDecimal.ZERO) == 0 && feeMonday.compareTo(BigDecimal.ZERO) == 0) { + return "greenRow"; + } else if (feeMonday.compareTo(BigDecimal.ZERO) == 0 && paymentMonday.compareTo(BigDecimal.ZERO) > 0 && (paymentMonday.compareTo(abonoDiario) < 0)) { + return "yellowRow"; + } else if (feeMonday.compareTo(BigDecimal.ZERO) == 0 && paymentMonday.compareTo(BigDecimal.ZERO) > 0 && (paymentMonday.compareTo(abonoDiario) > 0)) { + return "blueRow"; + } else { + return null; + } + } + + public String getConditionMartes() { + if (feeTuesday.compareTo(BigDecimal.ZERO) > 0) { + return "redRow"; + } else if (paymentTuesday.compareTo(BigDecimal.ZERO) == 0 && feeTuesday.compareTo(BigDecimal.ZERO) == 0) { + return "greenRow"; + } else if (feeTuesday.compareTo(BigDecimal.ZERO) == 0 && paymentTuesday.compareTo(BigDecimal.ZERO) > 0 && (paymentTuesday.compareTo(abonoDiario) < 0)) { + return "yellowRow"; + } else if (feeTuesday.compareTo(BigDecimal.ZERO) == 0 && paymentTuesday.compareTo(BigDecimal.ZERO) > 0 && (paymentTuesday.compareTo(abonoDiario) > 0)) { + return "blueRow"; + } else { + return null; + } + } + + public String getConditionMiercoles() { + if (feeWednesday.compareTo(BigDecimal.ZERO) > 0) { + return "redRow"; + } else if (paymentWednesday.compareTo(BigDecimal.ZERO) == 0 && feeWednesday.compareTo(BigDecimal.ZERO) == 0) { + return "greenRow"; + } else if (feeWednesday.compareTo(BigDecimal.ZERO) == 0 && paymentWednesday.compareTo(BigDecimal.ZERO) > 0 && (paymentWednesday.compareTo(abonoDiario) < 0)) { + return "yellowRow"; + } else if (feeWednesday.compareTo(BigDecimal.ZERO) == 0 && paymentWednesday.compareTo(BigDecimal.ZERO) > 0 && (paymentWednesday.compareTo(abonoDiario) > 0)) { + return "blueRow"; + } else { + return null; + } + } + + public String getConditionJueves() { + if (feeThursday.compareTo(BigDecimal.ZERO) > 0) { + return "redRow"; + } else if (paymentThursday.compareTo(BigDecimal.ZERO) == 0 && feeThursday.compareTo(BigDecimal.ZERO) == 0) { + return "greenRow"; + } else if (feeThursday.compareTo(BigDecimal.ZERO) == 0 && paymentThursday.compareTo(BigDecimal.ZERO) > 0 && (paymentThursday.compareTo(abonoDiario) < 0)) { + return "yellowRow"; + } else if (feeThursday.compareTo(BigDecimal.ZERO) == 0 && paymentThursday.compareTo(BigDecimal.ZERO) > 0 && (paymentThursday.compareTo(abonoDiario) > 0)) { + return "blueRow"; + } else { + return null; + } + } + + public String getConditionViernes() { + if (feeFriday.compareTo(BigDecimal.ZERO) > 0) { + return "redRow"; + } else if (paymentFriday.compareTo(BigDecimal.ZERO) == 0 && feeFriday.compareTo(BigDecimal.ZERO) == 0) { + return "greenRow"; + } else if (feeFriday.compareTo(BigDecimal.ZERO) == 0 && paymentFriday.compareTo(BigDecimal.ZERO) > 0 && (paymentFriday.compareTo(abonoDiario) < 0)) { + return "yellowRow"; + } else if (feeFriday.compareTo(BigDecimal.ZERO) == 0 && paymentFriday.compareTo(BigDecimal.ZERO) > 0 && (paymentFriday.compareTo(abonoDiario) > 0)) { + return "blueRow"; + } else if (feeSaturday.compareTo(BigDecimal.ZERO) == 0 && paymentSaturday.compareTo(BigDecimal.ZERO) > 0 && (paymentSaturday.compareTo(abonoDiario) > 0)) { + return "blueRow"; + } else { + return null; + } + } + + public String getConditionSabado() { + if (feeSaturday.compareTo(BigDecimal.ZERO) > 0) { + return "redRow"; + } else if (paymentSaturday.compareTo(BigDecimal.ZERO) == 0 && feeSaturday.compareTo(BigDecimal.ZERO) == 0) { + return "greenRow"; + } else if (feeSaturday.compareTo(BigDecimal.ZERO) == 0 && paymentSaturday.compareTo(BigDecimal.ZERO) > 0 && (paymentSaturday.compareTo(abonoDiario) < 0)) { + return "yellowRow"; + } else { + return null; + } + } + + public String getConditionNewCustomer() { + if (newCustomer.equalsIgnoreCase("Si")) { + return "greenRow"; + } else { + return null; + } + } + + public String getConditionRenovation() { + if (getFrozen().equals(ActiveStatus.ENEBLED)) { + return "blueLightRow"; + } + + if (newCustomer.equalsIgnoreCase("Si")) { + return "orangeRow"; + } else if (renovation.equalsIgnoreCase("Si")) { + return "greenLigthRow"; + } else if (getReactivation().equalsIgnoreCase("Si") && getWeekOfCreation().equalsIgnoreCase("Si")) { + return "limeGreenRow"; + } else if (getSaldoInsoluto().compareTo(BigDecimal.ZERO) == 0) { + return "greenStrongRow"; + } else { + return null; + } + + } + + public int getWeekLoanDate() { + Calendar c2 = Calendar.getInstance(); + c2.setTime(getFecha()); + int weekLoanDate = c2.get(Calendar.WEEK_OF_YEAR); + + return weekLoanDate; + } + + public int getWeekCurrentDate() { + Calendar c2 = Calendar.getInstance(); + int weekCurrentDate = c2.get(Calendar.WEEK_OF_YEAR); + + return weekCurrentDate; + } + + public BigDecimal getFeeSemana() { + + feeSemana = feeMonday.add(feeThursday).add(feeWednesday).add(feeTuesday).add(feeFriday).add(feeSaturday); + return feeSemana; + } + + public void setFeeSemana(BigDecimal feeSemana) { + this.feeSemana = feeSemana; + } + + public String getMovimientosMonday() { + return movimientosMonday; + } + + public void setMovimientosMonday(String movimientosMonday) { + this.movimientosMonday = movimientosMonday; + } + + public String getMovimientosTuesday() { + return movimientosTuesday; + } + + public void setMovimientosTuesday(String movimientosTuesday) { + this.movimientosTuesday = movimientosTuesday; + } + + public String getMovimientosWednesday() { + return movimientosWednesday; + } + + public void setMovimientosWednesday(String movimientosWednesday) { + this.movimientosWednesday = movimientosWednesday; + } + + public String getMovimientosThursday() { + return movimientosThursday; + } + + public void setMovimientosThursday(String movimientosThursday) { + this.movimientosThursday = movimientosThursday; + } + + public String getMovimientosFriday() { + return movimientosFriday; + } + + public void setMovimientosFriday(String movimientosFriday) { + this.movimientosFriday = movimientosFriday; + } + + public String getMovimientosSaturday() { + return movimientosSaturday; + } + + public void setMovimientosSaturday(String movimientosSaturday) { + this.movimientosSaturday = movimientosSaturday; + } + + public String getRenovationMonday() { + return renovationMonday; + } + + public void setRenovationMonday(String renovationMonday) { + this.renovationMonday = renovationMonday; + } + + public String getRenovationTuesday() { + return renovationTuesday; + } + + public void setRenovationTuesday(String renovationTuesday) { + this.renovationTuesday = renovationTuesday; + } + + public String getRenovationWednesday() { + return renovationWednesday; + } + + public void setRenovationWednesday(String renovationWednesday) { + this.renovationWednesday = renovationWednesday; + } + + public String getRenovationThursday() { + return renovationThursday; + } + + public void setRenovationThursday(String renovationThursday) { + this.renovationThursday = renovationThursday; + } + + public String getRenovationFriday() { + return renovationFriday; + } + + public void setRenovationFriday(String renovationFriday) { + this.renovationFriday = renovationFriday; + } + + public String getRenovationSaturday() { + return renovationSaturday; + } + + public void setRenovationSaturday(String renovationSaturday) { + this.renovationSaturday = renovationSaturday; + } + + public String getReactivation() { + + return reactivation; + } + + public void setReactivation(String reactivation) { + this.reactivation = reactivation; + } + + public String getWeekOfCreation() { + return weekOfCreation; + } + + public void setWeekOfCreation(String weekOfCreation) { + this.weekOfCreation = weekOfCreation; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/LoanApprovedDetailView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanApprovedDetailView.java new file mode 100644 index 0000000..f9bba34 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanApprovedDetailView.java @@ -0,0 +1,82 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_LOAN_APPROVED_DETAIL_VIEW") +public class LoanApprovedDetailView implements Serializable { + + private static final long serialVersionUID = 2303382936160293905L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "total_to_pay") + private BigDecimal totalToPay; + + @Column(name = "loan_amount_to_pay") + private BigDecimal loanAmountToPay; + + @Column(name = "total_fee") + private BigDecimal totalFee; + + public LoanApprovedDetailView() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public BigDecimal getTotalToPay() { + return totalToPay; + } + + public void setTotalToPay(BigDecimal totalToPay) { + this.totalToPay = totalToPay; + } + + public BigDecimal getLoanAmountToPay() { + return loanAmountToPay; + } + + public void setLoanAmountToPay(BigDecimal loanAmountToPay) { + this.loanAmountToPay = loanAmountToPay; + } + + public BigDecimal getTotalFee() { + return totalFee; + } + + public void setTotalFee(BigDecimal totalFee) { + this.totalFee = totalFee; + } + + @Override + public String toString() { + return "LoanApprovedDetailView{" + "totalToPay=" + totalToPay + ", loanAmountToPay=" + loanAmountToPay + ", totalFee=" + totalFee + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/LoanByUserOrderPreferenceView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanByUserOrderPreferenceView.java new file mode 100644 index 0000000..c946334 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanByUserOrderPreferenceView.java @@ -0,0 +1,108 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_LOAN_BY_USER_ORDER_PREFERENCE_VIEW") +public class LoanByUserOrderPreferenceView implements Serializable { + + private static final long serialVersionUID = -349196411929756764L; + + @Id + @Column(name = "id", length = 72) + private String id; + + @Column(name = "user_id", length = 36) + private String userId; + + @Column(name = "customer_name") + private String customerName; + + @Column(name = "customer_address_home", length = 150) + private String customerAddressHome; + + @Column(name = "customer_address_business", length = 150) + private String customerAddressBusiness; + + @Column(name = "order_in_list") + private Integer orderInList; + + public LoanByUserOrderPreferenceView() { + } + + public LoanByUserOrderPreferenceView(String customerName, Integer orderInList) { + this.customerName = customerName; + this.orderInList = orderInList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + public String getCustomerAddressHome() { + return customerAddressHome; + } + + public void setCustomerAddressHome(String customerAddressHome) { + this.customerAddressHome = customerAddressHome; + } + + public String getCustomerAddressBusiness() { + return customerAddressBusiness; + } + + public void setCustomerAddressBusiness(String customerAddressBusiness) { + this.customerAddressBusiness = customerAddressBusiness; + } + + public Integer getOrderInList() { + return orderInList; + } + + public void setOrderInList(Integer orderInList) { + this.orderInList = orderInList; + } + + @Override + public String toString() { + return "LoanByUserOrderPreferenceView{" + "customerName=" + customerName + ", orderInList=" + orderInList + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/LoanByUserPaymentZeroView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanByUserPaymentZeroView.java new file mode 100644 index 0000000..6d84967 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanByUserPaymentZeroView.java @@ -0,0 +1,90 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.core.User; +import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_LOAN_BY_USER_PAYMENT_ZERO_VIEW") +public class LoanByUserPaymentZeroView implements Serializable{ + + private static final long serialVersionUID = -6446049391530159926L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_user", + referencedColumnName = "id", + nullable = false + ) + private User user; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_customer", + referencedColumnName = "id", + nullable = false + ) + private People customer; + + @Column(name = "loan_comments") + private String comments; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public People getCustomer() { + return customer; + } + + public void setCustomer(People customer) { + this.customer = customer; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/LoanByUserView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanByUserView.java new file mode 100644 index 0000000..2210dfa --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanByUserView.java @@ -0,0 +1,322 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_LOAN_BY_USER_VIEW") +public class LoanByUserView implements Serializable { + + private static final long serialVersionUID = -6868707427254694418L; + + @Id + @Column(name = "id", length = 72) + private String id; + + @Column(name = "user_id", length = 36) + private String userId; + + @Column(name = "customer_name") + private String customerName; + + @Column(name = "customer_address_home", length = 150) + private String customerAddressHome; + + @Column(name = "customer_address_business", length = 150) + private String customerAddressBusiness; + + @Column(name = "company_name", length = 150) + private String companyName; + + @Column(name = "customer_thumbnail", length = 250) + private String customerThumbnail; + + @Column(name = "endorsement_name") + private String endorsementName; + + @Column(name = "endorsement_address_home", length = 150) + private String endorsementAddressHome; + + @Column(name = "endorsement_thumbnail", length = 250) + private String endorsementThumbnail; + + @Column(name = "endorsement_phone_home", length = 15) + private String endorsementPhoneHome; + + @Column(name = "payment_daily") + private BigDecimal paymentDaily; + + @Column(name = "loan_fee") + private BigDecimal loanFee; + + @Column(name = "order_in_list") + private Integer orderInList; + + @Column(name = "notification_number") + private Integer notificationNumber; + + @Column(name = "renovation") + private String renovation; + + @Column(name = "max_amount_to_pay") + private BigDecimal maxAmountToPay; + + @Column(name = "customer_phone_home", length = 15) + private String customerPhoneHome; + + @Transient + private boolean hasPaymentToday; + + @Transient + private String loanId; + + @Transient + private String currentOwner; + + @Transient + private boolean result; + + public LoanByUserView() { + } + + /** + * + * @param customerName + * @param customerAddressHome + * @param customerAddressBusiness + * @param companyName + * @param customerThumbnail + * @param endorsementName + * @param endorsementAddressHome + * @param endorsementThumbnail + * @param endorsementPhoneHome + * @param paymentDaily + * @param loanFee + * @param notificationNumber + * @param renovation + * @param maxAmountToPay + * @param hasPaymentToday + * @param loanId + * @param currentOwner + */ + public LoanByUserView(String customerName, String customerAddressHome, String customerAddressBusiness, String companyName, String customerThumbnail, String endorsementName, String endorsementAddressHome, String endorsementThumbnail, String endorsementPhoneHome, BigDecimal paymentDaily, BigDecimal loanFee, Integer notificationNumber, String renovation, BigDecimal maxAmountToPay, boolean hasPaymentToday, String loanId, String currentOwner) { + this.customerName = customerName; + this.customerAddressHome = customerAddressHome; + this.customerAddressBusiness = customerAddressBusiness; + this.companyName = companyName; + this.customerThumbnail = customerThumbnail; + this.endorsementName = endorsementName; + this.endorsementAddressHome = endorsementAddressHome; + this.endorsementThumbnail = endorsementThumbnail; + this.endorsementPhoneHome = endorsementPhoneHome; + this.paymentDaily = paymentDaily; + this.loanFee = loanFee; + this.notificationNumber = notificationNumber; + this.renovation = renovation; + this.maxAmountToPay = maxAmountToPay; + this.hasPaymentToday = hasPaymentToday; + this.result = true; + this.loanId = loanId; + this.currentOwner = currentOwner; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + public String getCustomerAddressHome() { + return customerAddressHome; + } + + public void setCustomerAddressHome(String customerAddressHome) { + this.customerAddressHome = customerAddressHome; + } + + public String getCustomerAddressBusiness() { + return customerAddressBusiness; + } + + public void setCustomerAddressBusiness(String customerAddressBusiness) { + this.customerAddressBusiness = customerAddressBusiness; + } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public String getCustomerThumbnail() { + return customerThumbnail; + } + + public void setCustomerThumbnail(String customerThumbnail) { + this.customerThumbnail = customerThumbnail; + } + + public String getEndorsementName() { + return endorsementName; + } + + public void setEndorsementName(String endorsementName) { + this.endorsementName = endorsementName; + } + + public String getEndorsementAddressHome() { + return endorsementAddressHome; + } + + public void setEndorsementAddressHome(String endorsementAddressHome) { + this.endorsementAddressHome = endorsementAddressHome; + } + + public String getEndorsementThumbnail() { + return endorsementThumbnail; + } + + public void setEndorsementThumbnail(String endorsementThumbnail) { + this.endorsementThumbnail = endorsementThumbnail; + } + + public String getEndorsementPhoneHome() { + return endorsementPhoneHome; + } + + public void setEndorsementPhoneHome(String endorsementPhoneHome) { + this.endorsementPhoneHome = endorsementPhoneHome; + } + + public BigDecimal getPaymentDaily() { + return paymentDaily; + } + + public void setPaymentDaily(BigDecimal paymentDaily) { + this.paymentDaily = paymentDaily; + } + + public BigDecimal getLoanFee() { + return loanFee; + } + + public void setLoanFee(BigDecimal loanFee) { + this.loanFee = loanFee; + } + + public Integer getOrderInList() { + return orderInList; + } + + public void setOrderInList(Integer orderInList) { + this.orderInList = orderInList; + } + + public Integer getNotificationNumber() { + return notificationNumber; + } + + public void setNotificationNumber(Integer notificationNumber) { + this.notificationNumber = notificationNumber; + } + + public String getRenovation() { + return renovation; + } + + public void setRenovation(String renovation) { + this.renovation = renovation; + } + + public BigDecimal getMaxAmountToPay() { + return maxAmountToPay; + } + + public void setMaxAmountToPay(BigDecimal maxAmountToPay) { + this.maxAmountToPay = maxAmountToPay; + } + + public boolean isHasPaymentToday() { + return hasPaymentToday; + } + + public void setHasPaymentToday(boolean hasPaymentToday) { + this.hasPaymentToday = hasPaymentToday; + } + + public String getLoanId() { + return loanId; + } + + public void setLoanId(String loanId) { + this.loanId = loanId; + } + + public String getCurrentOwner() { + return currentOwner; + } + + public void setCurrentOwner(String currentOwner) { + this.currentOwner = currentOwner; + } + + public boolean isResult() { + return result; + } + + public void setResult(boolean result) { + this.result = result; + } + + public String getCustomerPhoneHome() { + return customerPhoneHome; + } + + public void setCustomerPhoneHome(String customerPhoneHome) { + this.customerPhoneHome = customerPhoneHome; + } + + @Override + public String toString() { + return "LoanByUserView{" + "customerName=" + customerName + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/LoanDetailZeroView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanDetailZeroView.java new file mode 100644 index 0000000..eb6a93f --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanDetailZeroView.java @@ -0,0 +1,127 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author David Rodríguez Huaracha + */ +@Entity +@Table(name = "APC_LOAN_DETAIL_ZERO_VIEW") +public class LoanDetailZeroView implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "customer_name", length = 300) + private String customerName; + + @Column(name = "address_home", length = 300) + private String addressHome; + + @Column(name = "user_name", length = 300) + private String userName; + + @Column(name = "amount_to_pay", nullable = true) + private BigDecimal amountToPay; + + @Column(name = "id_loan_type", length = 36) + private String loanType; + + @Column(name = "payment", nullable = true) + private BigDecimal payment; + + @Column(name = "loan_comments", length = 200) + private String loanComments; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLoanType() { + return loanType; + } + + public void setLoanType(String loanType) { + this.loanType = loanType; + } + + public BigDecimal getPayment() { + return payment; + } + + public void setPayment(BigDecimal payment) { + this.payment = payment; + } + + public BigDecimal getAmountToPay() { + return amountToPay; + } + + public void setAmountToPay(BigDecimal amountToPay) { + this.amountToPay = amountToPay; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + public String getAddressHome() { + return addressHome; + } + + public void setAddressHome(String addressHome) { + this.addressHome = addressHome; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getLoanComments() { + return loanComments; + } + + public void setLoanComments(String loanComments) { + this.loanComments = loanComments; + } + + + + @Override + public String toString() { + return ""; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/LoanDiferencesByUserLastWeekView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanDiferencesByUserLastWeekView.java new file mode 100644 index 0000000..bf37a9a --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanDiferencesByUserLastWeekView.java @@ -0,0 +1,63 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_LOAN_DIFERENCES_BY_USER_LAST_WEEK_VIEW") +public class LoanDiferencesByUserLastWeekView implements Serializable { + + private static final long serialVersionUID = -8442702932177478721L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_user") + private String idUser; + + @Column(name = "faltante") + private BigDecimal faltante; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public BigDecimal getFaltante() { + return faltante; + } + + public void setFaltante(BigDecimal faltante) { + this.faltante = faltante; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/LoanEmployeeAllDataView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanEmployeeAllDataView.java new file mode 100644 index 0000000..639ba15 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanEmployeeAllDataView.java @@ -0,0 +1,143 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Administrador + */ +@Entity +@Table(name = "APC_LOAN_EMPLOYEE_ALL_DATA_VIEW") +public class LoanEmployeeAllDataView implements Serializable { + + private static final long serialVersionUID = 1L; + + public LoanEmployeeAllDataView() { + } + + public LoanEmployeeAllDataView(String id, String name, String idUser, BigDecimal amountLoan, BigDecimal amountToPay, BigDecimal balance, Date createdOn) { + this.id = id; + this.name = name; + this.amountLoan = amountLoan; + this.amountToPay = amountToPay; + this.balance = balance; + this.createdOn = createdOn; + this.idUser = idUser; + } + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "name") + private String name; + + @Column(name = "id_user", length = 36) + private String idUser; + + @Column(name = "amount_loan", nullable = false) + private BigDecimal amountLoan; + + @Column(name = "amount_to_pay", nullable = false) + private BigDecimal amountToPay; + + @Column(name = "balance", nullable = false) + private BigDecimal balance; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Enumerated(EnumType.STRING) + @Column(name = "loan_employee_status", nullable = false) + private ActiveStatus loanEmployeeStatus; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdUser() { + return idUser; + } + + public void setIdIser(String idUser) { + this.idUser = idUser; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public BigDecimal getAmountLoan() { + return amountLoan; + } + + public void setAmountLoan(BigDecimal amountLoan) { + this.amountLoan = amountLoan; + } + + public BigDecimal getAmountToPay() { + return amountToPay; + } + + public void setAmountToPay(BigDecimal amountToPay) { + this.amountToPay = amountToPay; + } + + public BigDecimal getBalance() { + return balance; + } + + public void setBalance(BigDecimal balance) { + this.balance = balance; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public ActiveStatus getLoanEmployeeStatus() { + return loanEmployeeStatus; + } + + public void setLoanEmployeeStatus(ActiveStatus loanEmployeeStatus) { + this.loanEmployeeStatus = loanEmployeeStatus; + } + + @Override + public String toString() { + return "LoanEmployeeView{" + "id=" + id + ", name=" + name + "idUser=" + idUser + ", amountLoan=" + amountLoan + ", amountToPay=" + amountToPay + ", balance=" + balance + ", createdOn=" + createdOn + ", loanEmployeeStatus=" + loanEmployeeStatus + '}'; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/LoanEmployeeDetailAllDataView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanEmployeeDetailAllDataView.java new file mode 100644 index 0000000..3ec0bc6 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanEmployeeDetailAllDataView.java @@ -0,0 +1,114 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Administrador + */ +@Entity +@Table(name = "APC_LOAN_EMPLOYEE_DETAIL_ALL_DATA_VIEW") +public class LoanEmployeeDetailAllDataView implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_loan", length = 36) + private String idLoan; + + @Column(name = "id_user", length = 36) + private String idUser; + + @Column(name = "payment_amount", nullable = false) + private BigDecimal paymentAmount; + + @Column(name = "reference_number", nullable = false) + private int referenceNumber; + + @Enumerated(EnumType.STRING) + @Column(name = "loan_employee_detail_status", nullable = false) + private ActiveStatus loanEmployeeDetailStatus; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdLoan() { + return idLoan; + } + + public void setIdLoan(String idLoan) { + this.idLoan = idLoan; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public BigDecimal getPaymentAmount() { + return paymentAmount; + } + + public void setPaymentAmount(BigDecimal paymentAmount) { + this.paymentAmount = paymentAmount; + } + + public int getReferenceNumber() { + return referenceNumber; + } + + public void setReferenceNumber(int referenceNumber) { + this.referenceNumber = referenceNumber; + } + + public ActiveStatus getLoanEmployeeDetailStatus() { + return loanEmployeeDetailStatus; + } + + public void setLoanEmployeeDetailStatus(ActiveStatus loanEmployeeDetailStatus) { + this.loanEmployeeDetailStatus = loanEmployeeDetailStatus; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/LoanEmployeeView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanEmployeeView.java new file mode 100644 index 0000000..52051e6 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanEmployeeView.java @@ -0,0 +1,217 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.admin.ExpenseCompany; +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Administrador + */ +@Entity +@Table(name = "APC_LOAN_EMPLOYEE_VIEW") +public class LoanEmployeeView implements Serializable { + + private static final long serialVersionUID = 1L; + + public LoanEmployeeView() { + } + + public LoanEmployeeView(String id, String name, String createdByName, String idUser, BigDecimal amountLoan, BigDecimal amountToPay, BigDecimal balance, BigDecimal totalAmountToPay, Date createdOn, int referenceNumber) { + this.id = id; + this.name = name; + this.amountLoan = amountLoan; + this.amountToPay = amountToPay; + this.balance = balance; + this.totalAmountToPay = totalAmountToPay; + this.createdOn = createdOn; + this.idUser = idUser; + this.referenceNumber = referenceNumber; + this.createdByName = createdByName; + } + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "name") + private String name; + + @Column(name = "created_by_name") + private String createdByName; + + @Column(name = "id_user", length = 36) + private String idUser; + + @Column(name = "amount_loan", nullable = false) + private BigDecimal amountLoan; + + @Column(name = "amount_to_pay", nullable = false) + private BigDecimal amountToPay; + + @Column(name = "balance", nullable = false) + private BigDecimal balance; + + @Column(name = "total_amount_to_pay", nullable = false) + private BigDecimal totalAmountToPay; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "reference_number") + private int referenceNumber; + + @Enumerated(EnumType.STRING) + @Column(name = "loan_employee_status", nullable = false) + private ActiveStatus loanEmployeeStatus; + + public ActiveStatus getLoanEmployeeStatus() { + return loanEmployeeStatus; + } + + public void setLoanEmployeeStatus(ActiveStatus loanEmployeeStatus) { + this.loanEmployeeStatus = loanEmployeeStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdUser() { + return idUser; + } + + public void setIdIser(String idUser) { + this.idUser = idUser; + } + + public String getCreatedByName() { + return createdByName; + } + + public void setCreatedByName(String createdByName) { + this.createdByName = createdByName; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public BigDecimal getAmountLoan() { + return amountLoan; + } + + public void setAmountLoan(BigDecimal amountLoan) { + this.amountLoan = amountLoan; + } + + public BigDecimal getAmountToPay() { + return amountToPay; + } + + public void setAmountToPay(BigDecimal amountToPay) { + this.amountToPay = amountToPay; + } + + public BigDecimal getBalance() { + return balance; + } + + public void setBalance(BigDecimal balance) { + this.balance = balance; + } + + public BigDecimal getTotalAmountToPay() { + return totalAmountToPay; + } + + public void setTotalAmountToPay(BigDecimal totalAmountToPay) { + this.totalAmountToPay = totalAmountToPay; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public int getReferenceNumber() { + return referenceNumber; + } + + public void setReferenceNumber(int referenceNumber) { + this.referenceNumber = referenceNumber; + } + + public String conditionEnabled() { + if (getLoanEmployeeStatus() == ActiveStatus.DISABLED) { + return "grayRow"; + } else { + return null; + } + } + + public boolean getActive() { + if (loanEmployeeStatus == ActiveStatus.ENEBLED) { + return true; + } else { + return false; + } + } + + public boolean getAction(Date lastStableGeneralBox) { + Date date = createdOn; + boolean action = true; + try { + SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); + + String dateStr = dt1.format(date); + date = dt1.parse(dateStr); + + action = date.after(lastStableGeneralBox); + + } catch (ParseException ex) { + Logger.getLogger(ExpenseCompany.class.getName()).log(Level.SEVERE, null, ex); + } + return action; + } + + @Override + public String toString() { + return "LoanEmployeeView{" + "id=" + id + ", name=" + name + "idUser=" + idUser + ", amountLoan=" + amountLoan + ", amountToPay=" + amountToPay + ", balance=" + balance + ", createdOn=" + createdOn + ", referenceNumber=" + referenceNumber + '}'; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/LoanFinishedView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanFinishedView.java new file mode 100644 index 0000000..409fc92 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanFinishedView.java @@ -0,0 +1,168 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.enums.CustomerClassification; +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author David Rodríguez Huaracha + */ +@Entity +@Table(name = "APC_LOAN_FINISHED_VIEW") +public class LoanFinishedView implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "customer_id", length = 36) + private String customerId; + + @Column(name = "customer_name", length = 300) + private String customerName; + + @Column(name = "address_home", length = 300) + private String addressHome; + + @Column(name = "classification", length = 10) + private String classification; + + @Column(name = "user_name", length = 300) + private String userName; + + @Column(name = "amount_to_pay", nullable = true) + private BigDecimal amountToPay; + + @Column(name = "loan_status", length = 10) + private String loan_status; + + @Column(name = "id_loan_type", length = 36) + private String loanType; + + @Column(name = "payment", nullable = true) + private BigDecimal payment; + + @Column(name = "comments", length = 200) + private String loanComments; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLoanType() { + return loanType; + } + + public void setLoanType(String loanType) { + this.loanType = loanType; + } + + public BigDecimal getPayment() { + return payment; + } + + public void setPayment(BigDecimal payment) { + this.payment = payment; + } + + public BigDecimal getAmountToPay() { + return amountToPay; + } + + public void setAmountToPay(BigDecimal amountToPay) { + this.amountToPay = amountToPay; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + public String getAddressHome() { + return addressHome; + } + + public void setAddressHome(String addressHome) { + this.addressHome = addressHome; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getLoanComments() { + return loanComments; + } + + public void setLoanComments(String loanComments) { + this.loanComments = loanComments; + } + + public String getCustomerId() { + return customerId; + } + + public void setCustomerId(String customerId) { + this.customerId = customerId; + } + + public String getClassification() { + return classification; + } + + public void setClassification(String classification) { + this.classification = classification; + } + + public String getLoan_status() { + return loan_status; + } + + public void setLoan_status(String loan_status) { + this.loan_status = loan_status; + } + + @Override + public String toString() { + return ""; + } + + public String conditionStyle() + { + if(getClassification().equals(CustomerClassification.RED.getValue())) + return "redRow"; + else if(getClassification().equals(CustomerClassification.YELLOW.getValue())) + return "yellowRow"; + return null; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/LoanInPendingStatusToDeliveryView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanInPendingStatusToDeliveryView.java new file mode 100644 index 0000000..183096b --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanInPendingStatusToDeliveryView.java @@ -0,0 +1,162 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.util.Date; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_LOAN_IN_PENDING_STATUS_TO_DELIVERY_VIEW") +public class LoanInPendingStatusToDeliveryView implements Serializable { + + private static final long serialVersionUID = 6435962914845336418L; + + @Id + @Column(name = "id_loan", length = 36) + private String idLoan; + + @Column(name = "payment") + private Double payment; + + @Column(name = "str_created_on", length = 22) + private String strCreatedOn; + + @Column(name = "customer_name", length = 103) + private String customerName; + + @Column(name = "endorsement_name", length = 103) + private String endorsementName; + + @Column(name = "user_name", length = 103) + private String userName; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + /** + * + */ + public LoanInPendingStatusToDeliveryView() { + } + + /** + * + * @param idLoan + * @param payment + * @param strCreatedOn + * @param customerName + * @param endorsementName + * @param userName + * @param createdOn + */ + public LoanInPendingStatusToDeliveryView(String idLoan, Double payment, String strCreatedOn, String customerName, String endorsementName, String userName, Date createdOn) { + this.idLoan = idLoan; + this.payment = payment; + this.strCreatedOn = strCreatedOn; + this.customerName = customerName; + this.endorsementName = endorsementName; + this.userName = userName; + this.createdOn = createdOn; + } + + public String getIdLoan() { + return idLoan; + } + + public void setIdLoan(String idLoan) { + this.idLoan = idLoan; + } + + public Double getPayment() { + return payment; + } + + public void setPayment(Double payment) { + this.payment = payment; + } + + public String getStrCreatedOn() { + return strCreatedOn; + } + + public void setStrCreatedOn(String strCreatedOn) { + this.strCreatedOn = strCreatedOn; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + public String getEndorsementName() { + return endorsementName; + } + + public void setEndorsementName(String endorsementName) { + this.endorsementName = endorsementName; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + @Override + public int hashCode() { + int hash = 5; + hash = 41 * hash + Objects.hashCode(this.idLoan); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final LoanInPendingStatusToDeliveryView other = (LoanInPendingStatusToDeliveryView) obj; + if (!Objects.equals(this.idLoan, other.idLoan)) { + return false; + } + return true; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/LoanRenovationDeliveryWeeklyView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanRenovationDeliveryWeeklyView.java new file mode 100644 index 0000000..7798b39 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanRenovationDeliveryWeeklyView.java @@ -0,0 +1,221 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.core.Office; +import java.io.Serializable; +import java.util.Date; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_LOAN_RENOVATION_DELIVERY_WEEKLY_VIEW") +public class LoanRenovationDeliveryWeeklyView implements Serializable { + + private static final long serialVersionUID = 3731003393000465083L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_user", length = 36) + private String id_user; + + @Column(name = "user_name") + private String userName; + + @Column(name = "customer_name") + private String customerName; + + @Column(name = "loan_status") + private String loasStatus; + + @Column(name = "amount_loan") + private String amountLoan; + + @Column(name = "amount_to_pay") + private String amountToPay; + + @Column(name = "amount_paid") + private String amountPaid; + + @Column(name = "saldo_insoluto") + private String saldoInsoluto; + + @Column(name = "route_name") + private String routeName; + + @Column(name = "payment_daily") + private String paymentDaily; + + @Column(name = "num_pagos_all") + private String numPagosAll; + + @Column(name = "num_fee") + private String numFee; + + @Column(name = "renovation") + private String renovation; + + + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getId_user() { + return id_user; + } + + public void setId_user(String id_user) { + this.id_user = id_user; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + public String getLoasStatus() { + return loasStatus; + } + + public void setLoasStatus(String loasStatus) { + this.loasStatus = loasStatus; + } + + public String getAmountToPay() { + return amountToPay; + } + + public void setAmountToPay(String amountToPay) { + this.amountToPay = amountToPay; + } + + public String getAmountPaid() { + return amountPaid; + } + + public void setAmountPaid(String amountPaid) { + this.amountPaid = amountPaid; + } + + public String getSaldoInsoluto() { + return saldoInsoluto; + } + + public void setSaldoInsoluto(String saldoInsoluto) { + this.saldoInsoluto = saldoInsoluto; + } + + public String getRouteName() { + return routeName; + } + + public void setRouteName(String routeName) { + this.routeName = routeName; + } + + public String getPaymentDaily() { + return paymentDaily; + } + + public void setPaymentDaily(String paymentDaily) { + this.paymentDaily = paymentDaily; + } + + public String getNumPagosAll() { + return numPagosAll; + } + + public void setNumPagosAll(String numPagosAll) { + this.numPagosAll = numPagosAll; + } + + public String getNumFee() { + return numFee; + } + + public void setNumFee(String numFee) { + this.numFee = numFee; + } + + public String getAmountLoan() { + return amountLoan; + } + + public void setAmountLoan(String amountLoan) { + this.amountLoan = amountLoan; + } + + public String getRenovation() { + return renovation; + } + + public void setRenovation(String renovation) { + this.renovation = renovation; + } + + + + + + @Override + public int hashCode() { + int hash = 7; + hash = 61 * hash + Objects.hashCode(this.id); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final LoanRenovationDeliveryWeeklyView other = (LoanRenovationDeliveryWeeklyView) obj; + if (!Objects.equals(this.id, other.id)) { + return false; + } + return true; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/LoanToDeliveryByCertifierView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanToDeliveryByCertifierView.java new file mode 100644 index 0000000..33ec5ac --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/LoanToDeliveryByCertifierView.java @@ -0,0 +1,197 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_LOAN_TO_DELIVERY_BY_CERTIFIER_VIEW") +public class LoanToDeliveryByCertifierView implements Serializable { + + private static final long serialVersionUID = 8450662914845336486L; + + @Id + @Column(name = "id_loan", length = 36) + private String id; + + @Id + @Column(name = "id_old_loan", length = 36) + private String idOldLoan; + + @Column(name = "id_user", length = 36) + private String userId; + + @Column(name = "customer_name", length = 51) + private String customerName; + + @Column(name = "customer_address", length = 150) + private String customerAddress; + + @Column(name = "thumbnail", length = 250) + private String thumbnail; + + @Column(name = "icon", length = 5) + private String icon; + + @Column(name = "amount_to_delivery") + private BigDecimal amountToDelivery; + + @Column(name = "discount") + private BigDecimal discount; + + @Column(name = "opening") + private Integer opening; + + @Column(name = "payment") + private BigDecimal payment; + + @Column(name = "total_last_loan") + private BigDecimal totalLastLoan; + + public LoanToDeliveryByCertifierView() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdOldLoan() { + return idOldLoan; + } + + public void setIdOldLoan(String idOldLoan) { + this.idOldLoan = idOldLoan; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + public String getCustomerAddress() { + return customerAddress; + } + + public void setCustomerAddress(String customerAddress) { + this.customerAddress = customerAddress; + } + + public String getThumbnail() { + return thumbnail; + } + + public void setThumbnail(String thumbnail) { + this.thumbnail = thumbnail; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public BigDecimal getAmountToDelivery() { + return amountToDelivery; + } + + public void setAmountToDelivery(BigDecimal amountToDelivery) { + this.amountToDelivery = amountToDelivery; + } + + public BigDecimal getDiscount() { + return discount; + } + + public void setDiscount(BigDecimal discount) { + this.discount = discount; + } + + public Integer getOpening() { + return opening; + } + + public void setOpening(Integer opening) { + this.opening = opening; + } + + public BigDecimal getPayment() { + return payment; + } + + public void setPayment(BigDecimal payment) { + this.payment = payment; + } + + public BigDecimal getTotalLastLoan() { + return totalLastLoan; + } + + public void setTotalLastLoan(BigDecimal totalLastLoan) { + this.totalLastLoan = totalLastLoan; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 59 * hash + Objects.hashCode(this.id); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final LoanToDeliveryByCertifierView other = (LoanToDeliveryByCertifierView) obj; + if (!Objects.equals(this.id, other.id)) { + return false; + } + return true; + } + + @Override + public String toString() { + return "LoanToDeliveryByCertifierView{" + "customerName=" + customerName + ", icon=" + icon + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/MoneyDailyByUserCertifier.java b/apc-model/src/main/java/com/arrebol/apc/model/views/MoneyDailyByUserCertifier.java new file mode 100644 index 0000000..bb2fc97 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/MoneyDailyByUserCertifier.java @@ -0,0 +1,88 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_MONEY_DAILY_BY_USER_CERTIFIER_VIEW") +public class MoneyDailyByUserCertifier implements Serializable{ + + private static final long serialVersionUID = -6757597615364853923L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_office") + private String idOffice; + + @Column(name = "user_name") + private String userName; + + @Column(name = "employee") + private String employee; + + @Column(name = "amount") + private BigDecimal amount; + + public MoneyDailyByUserCertifier() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdOffice() { + return idOffice; + } + + public void setIdOffice(String idOffice) { + this.idOffice = idOffice; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getEmployee() { + return employee; + } + + public void setEmployee(String employee) { + this.employee = employee; + } + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/PaymentDetailFromUserByCurdateView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/PaymentDetailFromUserByCurdateView.java new file mode 100644 index 0000000..19a7312 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/PaymentDetailFromUserByCurdateView.java @@ -0,0 +1,97 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.enums.LoanDetailsType; +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_PAYMENT_DETAILS_FROM_USER_BY_CURDATE_VIEW") +public class PaymentDetailFromUserByCurdateView implements Serializable { + + private static final long serialVersionUID = 7069230798097192215L; + + @Id + @Column(name = "id_loan_detail", length = 36) + private String id; + + @Column(name = "customer_name", length = 103) + private String customerName; + + @Column(name = "payment_amount") + private BigDecimal amount; + + @Enumerated(EnumType.STRING) + @Column(name = "loan_details_type") + private LoanDetailsType loanDetailsType; + + @Column(name = "user_id", length = 36) + private String userId; + + public PaymentDetailFromUserByCurdateView() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + public LoanDetailsType getLoanDetailsType() { + return loanDetailsType; + } + + public void setLoanDetailsType(LoanDetailsType loanDetailsType) { + this.loanDetailsType = loanDetailsType; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + @Override + public String toString() { + return "PaymentDetailFromUserByCurdateView{" + "customerName=" + customerName + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/PersonSearchDetailView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/PersonSearchDetailView.java new file mode 100644 index 0000000..1a5acf2 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/PersonSearchDetailView.java @@ -0,0 +1,81 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_PERSON_SEARCH_DETAIL_VIEW") +public class PersonSearchDetailView implements Serializable { + + private static final long serialVersionUID = 4608137238616026580L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "person_search", length = 103) + private String personSearch; + + @Column(name = "thumbnail", length = 250) + private String thumbnail; + + @Column(name = "loanStatus", length = 8) + private String loanStatus; + + public PersonSearchDetailView() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getPersonSearch() { + return personSearch; + } + + public void setPersonSearch(String personSearch) { + this.personSearch = personSearch; + } + + public String getThumbnail() { + return thumbnail; + } + + public void setThumbnail(String thumbnail) { + this.thumbnail = thumbnail; + } + + public String getLoanStatus() { + return loanStatus; + } + + public void setLoanStatus(String loanStatus) { + this.loanStatus = loanStatus; + } + + @Override + public String toString() { + return "PersonSearchDetailView{" + "personSearch=" + personSearch + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/PersonSearchHistoricalDetailsView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/PersonSearchHistoricalDetailsView.java new file mode 100644 index 0000000..4f7165a --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/PersonSearchHistoricalDetailsView.java @@ -0,0 +1,147 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_PERSON_SEARCH_HISTORICAL_DETAILS_VIEW") +public class PersonSearchHistoricalDetailsView implements Serializable { + + private static final long serialVersionUID = 6263674846643349142L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_person_search", length = 36) + private String personSearchId; + + @Column(name = "format_date", length = 10) + private String createdOn; + + @Column(name = "person_type", length = 7) + private String personType; + + @Column(name = "relationship", length = 51) + private String relationShip; + + @Column(name = "loan") + private Double loan; + + @Column(name = "payment_number", length = 8) + private String paymentNumber; + + @Column(name = "amount_to_pay") + private Double amountToPay; + + @Column(name = "total_fees", length = 2) + private String totalFees; + + @Column(name = "loan_status", length = 25) + private String status; + + public PersonSearchHistoricalDetailsView() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getPersonSearchId() { + return personSearchId; + } + + public void setPersonSearchId(String personSearchId) { + this.personSearchId = personSearchId; + } + + public String getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(String createdOn) { + this.createdOn = createdOn; + } + + public String getPersonType() { + return personType; + } + + public void setPersonType(String personType) { + this.personType = personType; + } + + public String getRelationShip() { + return relationShip; + } + + public void setRelationShip(String relationShip) { + this.relationShip = relationShip; + } + + public Double getLoan() { + return loan; + } + + public void setLoan(Double loan) { + this.loan = loan; + } + + public String getPaymentNumber() { + return paymentNumber; + } + + public void setPaymentNumber(String paymentNumber) { + this.paymentNumber = paymentNumber; + } + + public Double getAmountToPay() { + return amountToPay; + } + + public void setAmountToPay(Double amountToPay) { + this.amountToPay = amountToPay; + } + + public String getTotalFees() { + return totalFees; + } + + public void setTotalFees(String totalFees) { + this.totalFees = totalFees; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + @Override + public String toString() { + return "PersonSearchHistoricalDetailsView{" + "createdOn=" + createdOn + ", personType=" + personType + ", status=" + status + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/PersonSearchView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/PersonSearchView.java new file mode 100644 index 0000000..6c56924 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/PersonSearchView.java @@ -0,0 +1,64 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_PERSON_SEARCH_VIEW") +public class PersonSearchView implements Serializable { + + private static final long serialVersionUID = 8659713229201178299L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "person_search", length = 103) + private String personSearch; + + public PersonSearchView() { + } + + public PersonSearchView(String id, String personSearch) { + this.id = id; + this.personSearch = personSearch; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getPersonSearch() { + return personSearch; + } + + public void setPersonSearch(String personSearch) { + this.personSearch = personSearch; + } + + @Override + public String toString() { + return "PersonSearchView{" + "personSearch=" + personSearch + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/ResumeNewCustomerLastWeekView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/ResumeNewCustomerLastWeekView.java new file mode 100644 index 0000000..ad593d6 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/ResumeNewCustomerLastWeekView.java @@ -0,0 +1,73 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author David Rodríguez Huaracha + */ +@Entity +@Immutable +@Table(name = "APC_LOAN_NEW_CUSTOMER_LAST_WEEK_VIEW") +public class ResumeNewCustomerLastWeekView implements Serializable{ + + private static final long serialVersionUID = -6384789811291615117L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "name") + private String name; + + @Column(name = "new_customer") + private int newCustomer; + + @Column(name = "total_new_customer") + private BigDecimal totalNewCustomer; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNewCustomer() { + return newCustomer; + } + + public void setNewCustomer(int newCustomer) { + this.newCustomer = newCustomer; + } + + public BigDecimal getTotalNewCustomer() { + return totalNewCustomer; + } + + public void setTotalNewCustomer(BigDecimal totalNewCustomer) { + this.totalNewCustomer = totalNewCustomer; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/ResumeNewCustomerWeekView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/ResumeNewCustomerWeekView.java new file mode 100644 index 0000000..a96cd3d --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/ResumeNewCustomerWeekView.java @@ -0,0 +1,73 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author David Rodríguez Huaracha + */ +@Entity +@Immutable +@Table(name = "APC_LOAN_NEW_CUSTOMER_WEEK_VIEW") +public class ResumeNewCustomerWeekView implements Serializable{ + + private static final long serialVersionUID = -6384789811291615117L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "name") + private String name; + + @Column(name = "new_customer") + private int newCustomer; + + @Column(name = "total_new_customer") + private BigDecimal totalNewCustomer; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNewCustomer() { + return newCustomer; + } + + public void setNewCustomer(int newCustomer) { + this.newCustomer = newCustomer; + } + + public BigDecimal getTotalNewCustomer() { + return totalNewCustomer; + } + + public void setTotalNewCustomer(BigDecimal totalNewCustomer) { + this.totalNewCustomer = totalNewCustomer; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/ResumenInOutLastWeekByUserView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/ResumenInOutLastWeekByUserView.java new file mode 100644 index 0000000..0a728b8 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/ResumenInOutLastWeekByUserView.java @@ -0,0 +1,285 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.core.Office; +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_RESUMEN_IN_OUT_LAST_WEEK_BY_USER_VIEW") +public class ResumenInOutLastWeekByUserView implements Serializable{ + + private static final long serialVersionUID = 3055231364366461069L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "username") + private String userName; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Column(name = "closing_monday") + private BigDecimal closingMonday; + + @Column(name = "expense_monday") + private BigDecimal expenseMonday; + + @Column(name = "money_daily_today_monday") + private BigDecimal moneyDailyTodayMonday; + + @Column(name = "closing_tuesday") + private BigDecimal closingTuesday; + + @Column(name = "expense_tuesday") + private BigDecimal expenseTuesday; + + @Column(name = "money_daily_today_tuesday") + private BigDecimal moneyDailyTodayTuesday; + + @Column(name = "closing_wednesday") + private BigDecimal closingWednesday; + + @Column(name = "expense_wednesday") + private BigDecimal expenseWednesday; + + @Column(name = "money_daily_today_wednesday") + private BigDecimal moneyDailyTodayWednesday; + + @Column(name = "closing_thursday") + private BigDecimal closingThursday; + + @Column(name = "expense_thursday") + private BigDecimal expenseThursday; + + @Column(name = "money_daily_today_thursday") + private BigDecimal moneyDailyTodayThursday; + + @Column(name = "closing_friday") + private BigDecimal closingFriday; + + @Column(name = "expense_friday") + private BigDecimal expenseFriday; + + @Column(name = "money_daily_today_friday") + private BigDecimal moneyDailyTodayFriday; + + @Column(name = "closing_saturday") + private BigDecimal closingSaturday; + + @Column(name = "expense_saturday") + private BigDecimal expenseSaturday; + + @Column(name = "money_daily_today_saturday") + private BigDecimal moneyDailyTodaySaturday; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public BigDecimal getClosingMonday() { + return closingMonday; + } + + public void setClosingMonday(BigDecimal closingMonday) { + this.closingMonday = closingMonday; + } + + public BigDecimal getExpenseMonday() { + return expenseMonday; + } + + public void setExpenseMonday(BigDecimal expenseMonday) { + this.expenseMonday = expenseMonday; + } + + public BigDecimal getMoneyDailyTodayMonday() { + return moneyDailyTodayMonday; + } + + public void setMoneyDailyTodayMonday(BigDecimal moneyDailyTodayMonday) { + this.moneyDailyTodayMonday = moneyDailyTodayMonday; + } + + public BigDecimal getClosingTuesday() { + return closingTuesday; + } + + public void setClosingTuesday(BigDecimal closingTuesday) { + this.closingTuesday = closingTuesday; + } + + public BigDecimal getExpenseTuesday() { + return expenseTuesday; + } + + public void setExpenseTuesday(BigDecimal expenseTuesday) { + this.expenseTuesday = expenseTuesday; + } + + public BigDecimal getMoneyDailyTodayTuesday() { + return moneyDailyTodayTuesday; + } + + public void setMoneyDailyTodayTuesday(BigDecimal moneyDailyTodayTuesday) { + this.moneyDailyTodayTuesday = moneyDailyTodayTuesday; + } + + public BigDecimal getClosingWednesday() { + return closingWednesday; + } + + public void setClosingWednesday(BigDecimal closingWednesday) { + this.closingWednesday = closingWednesday; + } + + public BigDecimal getExpenseWednesday() { + return expenseWednesday; + } + + public void setExpenseWednesday(BigDecimal expenseWednesday) { + this.expenseWednesday = expenseWednesday; + } + + public BigDecimal getMoneyDailyTodayWednesday() { + return moneyDailyTodayWednesday; + } + + public void setMoneyDailyTodayWednesday(BigDecimal moneyDailyTodayWednesday) { + this.moneyDailyTodayWednesday = moneyDailyTodayWednesday; + } + + public BigDecimal getClosingThursday() { + return closingThursday; + } + + public void setClosingThursday(BigDecimal closingThursday) { + this.closingThursday = closingThursday; + } + + public BigDecimal getExpenseThursday() { + return expenseThursday; + } + + public void setExpenseThursday(BigDecimal expenseThursday) { + this.expenseThursday = expenseThursday; + } + + public BigDecimal getMoneyDailyTodayThursday() { + return moneyDailyTodayThursday; + } + + public void setMoneyDailyTodayThursday(BigDecimal moneyDailyTodayThursday) { + this.moneyDailyTodayThursday = moneyDailyTodayThursday; + } + + public BigDecimal getClosingFriday() { + return closingFriday; + } + + public void setClosingFriday(BigDecimal closingFriday) { + this.closingFriday = closingFriday; + } + + public BigDecimal getExpenseFriday() { + return expenseFriday; + } + + public void setExpenseFriday(BigDecimal expenseFriday) { + this.expenseFriday = expenseFriday; + } + + public BigDecimal getMoneyDailyTodayFriday() { + return moneyDailyTodayFriday; + } + + public void setMoneyDailyTodayFriday(BigDecimal moneyDailyTodayFriday) { + this.moneyDailyTodayFriday = moneyDailyTodayFriday; + } + + public BigDecimal getClosingSaturday() { + return closingSaturday; + } + + public void setClosingSaturday(BigDecimal closingSaturday) { + this.closingSaturday = closingSaturday; + } + + public BigDecimal getExpenseSaturday() { + return expenseSaturday; + } + + public void setExpenseSaturday(BigDecimal expenseSaturday) { + this.expenseSaturday = expenseSaturday; + } + + public BigDecimal getMoneyDailyTodaySaturday() { + return moneyDailyTodaySaturday; + } + + public void setMoneyDailyTodaySaturday(BigDecimal moneyDailyTodaySaturday) { + this.moneyDailyTodaySaturday = moneyDailyTodaySaturday; + } + + public BigDecimal getTotalInicios() { + return moneyDailyTodayMonday.add(moneyDailyTodayThursday).add(moneyDailyTodayWednesday). + add(moneyDailyTodayTuesday).add(moneyDailyTodayFriday).add(moneyDailyTodaySaturday); + } + + public BigDecimal getTotalGastos() { + return expenseMonday.add(expenseThursday).add(expenseWednesday). + add(expenseTuesday).add(expenseFriday).add(expenseSaturday); + } + + public BigDecimal getTotalCortes() { + return closingMonday.add(closingThursday).add(closingWednesday). + add(closingTuesday).add(closingFriday).add(closingSaturday); + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/ResumenInOutWeekByUserView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/ResumenInOutWeekByUserView.java new file mode 100644 index 0000000..940c1b2 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/ResumenInOutWeekByUserView.java @@ -0,0 +1,284 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.core.Office; +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_RESUMEN_IN_OUT_WEEK_BY_USER_VIEW") +public class ResumenInOutWeekByUserView implements Serializable{ + + private static final long serialVersionUID = 3055231364366461069L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "username") + private String userName; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Column(name = "closing_monday") + private BigDecimal closingMonday; + + @Column(name = "expense_monday") + private BigDecimal expenseMonday; + + @Column(name = "money_daily_today_monday") + private BigDecimal moneyDailyTodayMonday; + + @Column(name = "closing_tuesday") + private BigDecimal closingTuesday; + + @Column(name = "expense_tuesday") + private BigDecimal expenseTuesday; + + @Column(name = "money_daily_today_tuesday") + private BigDecimal moneyDailyTodayTuesday; + + @Column(name = "closing_wednesday") + private BigDecimal closingWednesday; + + @Column(name = "expense_wednesday") + private BigDecimal expenseWednesday; + + @Column(name = "money_daily_today_wednesday") + private BigDecimal moneyDailyTodayWednesday; + + @Column(name = "closing_thursday") + private BigDecimal closingThursday; + + @Column(name = "expense_thursday") + private BigDecimal expenseThursday; + + @Column(name = "money_daily_today_thursday") + private BigDecimal moneyDailyTodayThursday; + + @Column(name = "closing_friday") + private BigDecimal closingFriday; + + @Column(name = "expense_friday") + private BigDecimal expenseFriday; + + @Column(name = "money_daily_today_friday") + private BigDecimal moneyDailyTodayFriday; + + @Column(name = "closing_saturday") + private BigDecimal closingSaturday; + + @Column(name = "expense_saturday") + private BigDecimal expenseSaturday; + + @Column(name = "money_daily_today_saturday") + private BigDecimal moneyDailyTodaySaturday; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public BigDecimal getClosingMonday() { + return closingMonday; + } + + public void setClosingMonday(BigDecimal closingMonday) { + this.closingMonday = closingMonday; + } + + public BigDecimal getExpenseMonday() { + return expenseMonday; + } + + public void setExpenseMonday(BigDecimal expenseMonday) { + this.expenseMonday = expenseMonday; + } + + public BigDecimal getMoneyDailyTodayMonday() { + return moneyDailyTodayMonday; + } + + public void setMoneyDailyTodayMonday(BigDecimal moneyDailyTodayMonday) { + this.moneyDailyTodayMonday = moneyDailyTodayMonday; + } + + public BigDecimal getClosingTuesday() { + return closingTuesday; + } + + public void setClosingTuesday(BigDecimal closingTuesday) { + this.closingTuesday = closingTuesday; + } + + public BigDecimal getExpenseTuesday() { + return expenseTuesday; + } + + public void setExpenseTuesday(BigDecimal expenseTuesday) { + this.expenseTuesday = expenseTuesday; + } + + public BigDecimal getMoneyDailyTodayTuesday() { + return moneyDailyTodayTuesday; + } + + public void setMoneyDailyTodayTuesday(BigDecimal moneyDailyTodayTuesday) { + this.moneyDailyTodayTuesday = moneyDailyTodayTuesday; + } + + public BigDecimal getClosingWednesday() { + return closingWednesday; + } + + public void setClosingWednesday(BigDecimal closingWednesday) { + this.closingWednesday = closingWednesday; + } + + public BigDecimal getExpenseWednesday() { + return expenseWednesday; + } + + public void setExpenseWednesday(BigDecimal expenseWednesday) { + this.expenseWednesday = expenseWednesday; + } + + public BigDecimal getMoneyDailyTodayWednesday() { + return moneyDailyTodayWednesday; + } + + public void setMoneyDailyTodayWednesday(BigDecimal moneyDailyTodayWednesday) { + this.moneyDailyTodayWednesday = moneyDailyTodayWednesday; + } + + public BigDecimal getClosingThursday() { + return closingThursday; + } + + public void setClosingThursday(BigDecimal closingThursday) { + this.closingThursday = closingThursday; + } + + public BigDecimal getExpenseThursday() { + return expenseThursday; + } + + public void setExpenseThursday(BigDecimal expenseThursday) { + this.expenseThursday = expenseThursday; + } + + public BigDecimal getMoneyDailyTodayThursday() { + return moneyDailyTodayThursday; + } + + public void setMoneyDailyTodayThursday(BigDecimal moneyDailyTodayThursday) { + this.moneyDailyTodayThursday = moneyDailyTodayThursday; + } + + public BigDecimal getClosingFriday() { + return closingFriday; + } + + public void setClosingFriday(BigDecimal closingFriday) { + this.closingFriday = closingFriday; + } + + public BigDecimal getExpenseFriday() { + return expenseFriday; + } + + public void setExpenseFriday(BigDecimal expenseFriday) { + this.expenseFriday = expenseFriday; + } + + public BigDecimal getMoneyDailyTodayFriday() { + return moneyDailyTodayFriday; + } + + public void setMoneyDailyTodayFriday(BigDecimal moneyDailyTodayFriday) { + this.moneyDailyTodayFriday = moneyDailyTodayFriday; + } + + public BigDecimal getClosingSaturday() { + return closingSaturday; + } + + public void setClosingSaturday(BigDecimal closingSaturday) { + this.closingSaturday = closingSaturday; + } + + public BigDecimal getExpenseSaturday() { + return expenseSaturday; + } + + public void setExpenseSaturday(BigDecimal expenseSaturday) { + this.expenseSaturday = expenseSaturday; + } + + public BigDecimal getMoneyDailyTodaySaturday() { + return moneyDailyTodaySaturday; + } + + public void setMoneyDailyTodaySaturday(BigDecimal moneyDailyTodaySaturday) { + this.moneyDailyTodaySaturday = moneyDailyTodaySaturday; + } + + public BigDecimal getTotalInicios() { + return moneyDailyTodayMonday.add(moneyDailyTodayThursday).add(moneyDailyTodayWednesday). + add(moneyDailyTodayTuesday).add(moneyDailyTodayFriday).add(moneyDailyTodaySaturday); + } + + public BigDecimal getTotalGastos() { + return expenseMonday.add(expenseThursday).add(expenseWednesday). + add(expenseTuesday).add(expenseFriday).add(expenseSaturday); + } + + public BigDecimal getTotalCortes() { + return closingMonday.add(closingThursday).add(closingWednesday). + add(closingTuesday).add(closingFriday).add(closingSaturday); + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/ResumenTotalLastWeekView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/ResumenTotalLastWeekView.java new file mode 100644 index 0000000..9f7bca7 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/ResumenTotalLastWeekView.java @@ -0,0 +1,162 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_RESUMEN_TOTAL_LAST_WEEK_VIEW") +public class ResumenTotalLastWeekView implements Serializable{ + + private static final long serialVersionUID = -6384789811291615117L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "office_name") + private String officeName; + + @Column(name = "closing__day_total") + private BigDecimal closingDayTotal; + + @Column(name = "money_daily_today_total") + private BigDecimal moneyDailyTodayTotal; + + @Column(name = "subtotal_total") + private BigDecimal subtotalTotal; + + @Column(name = "opening_fee_total") + private BigDecimal openingFeeTotal; + + @Column(name = "cobranza_today") + private BigDecimal cobranzaToday; + + @Column(name = "colocation_total") + private BigDecimal colocationTotal; + + @Column(name = "nomina_total") + private BigDecimal nominaTotal; + + @Column(name = "adelantos_total") + private BigDecimal adelantosTotal; + + @Column(name = "entradas_total") + private BigDecimal entradasTotal; + + @Column(name = "gastos_admon_total") + private BigDecimal gastosAdmonTotal; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getOfficeName() { + return officeName; + } + + public void setOfficeName(String officeName) { + this.officeName = officeName; + } + + public BigDecimal getClosingDayTotal() { + return closingDayTotal; + } + + public void setClosingDayTotal(BigDecimal closingDayTotal) { + this.closingDayTotal = closingDayTotal; + } + + public BigDecimal getMoneyDailyTodayTotal() { + return moneyDailyTodayTotal; + } + + public void setMoneyDailyTodayTotal(BigDecimal moneyDailyTodayTotal) { + this.moneyDailyTodayTotal = moneyDailyTodayTotal; + } + + public BigDecimal getSubtotalTotal() { + return subtotalTotal; + } + + public void setSubtotalTotal(BigDecimal subtotalTotal) { + this.subtotalTotal = subtotalTotal; + } + + public BigDecimal getOpeningFeeTotal() { + return openingFeeTotal; + } + + public void setOpeningFeeTotal(BigDecimal openingFeeTotal) { + this.openingFeeTotal = openingFeeTotal; + } + + public BigDecimal getCobranzaToday() { + return cobranzaToday; + } + + public void setCobranzaToday(BigDecimal cobranzaToday) { + this.cobranzaToday = cobranzaToday; + } + + public BigDecimal getColocationTotal() { + return colocationTotal; + } + + public void setColocationTotal(BigDecimal colocationTotal) { + this.colocationTotal = colocationTotal; + } + + public BigDecimal getNominaTotal() { + return nominaTotal; + } + + public void setNominaTotal(BigDecimal nominaTotal) { + this.nominaTotal = nominaTotal; + } + + public BigDecimal getAdelantosTotal() { + return adelantosTotal; + } + + public void setAdelantosTotal(BigDecimal adelantosTotal) { + this.adelantosTotal = adelantosTotal; + } + + public BigDecimal getEntradasTotal() { + return entradasTotal; + } + + public void setEntradasTotal(BigDecimal entradasTotal) { + this.entradasTotal = entradasTotal; + } + + public BigDecimal getGastosAdmonTotal() { + return gastosAdmonTotal; + } + + public void setGastosAdmonTotal(BigDecimal gastosAdmonTotal) { + this.gastosAdmonTotal = gastosAdmonTotal; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/ResumenTotalWeekView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/ResumenTotalWeekView.java new file mode 100644 index 0000000..61d0501 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/ResumenTotalWeekView.java @@ -0,0 +1,162 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_RESUMEN_TOTAL_WEEK_VIEW") +public class ResumenTotalWeekView implements Serializable{ + + private static final long serialVersionUID = -6384789811291615117L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "office_name") + private String officeName; + + @Column(name = "closing__day_total") + private BigDecimal closingDayTotal; + + @Column(name = "money_daily_today_total") + private BigDecimal moneyDailyTodayTotal; + + @Column(name = "subtotal_total") + private BigDecimal subtotalTotal; + + @Column(name = "opening_fee_total") + private BigDecimal openingFeeTotal; + + @Column(name = "cobranza_today") + private BigDecimal cobranzaToday; + + @Column(name = "colocation_total") + private BigDecimal colocationTotal; + + @Column(name = "nomina_total") + private BigDecimal nominaTotal; + + @Column(name = "adelantos_total") + private BigDecimal adelantosTotal; + + @Column(name = "entradas_total") + private BigDecimal entradasTotal; + + @Column(name = "gastos_admon_total") + private BigDecimal gastosAdmonTotal; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getOfficeName() { + return officeName; + } + + public void setOfficeName(String officeName) { + this.officeName = officeName; + } + + public BigDecimal getClosingDayTotal() { + return closingDayTotal; + } + + public void setClosingDayTotal(BigDecimal closingDayTotal) { + this.closingDayTotal = closingDayTotal; + } + + public BigDecimal getMoneyDailyTodayTotal() { + return moneyDailyTodayTotal; + } + + public void setMoneyDailyTodayTotal(BigDecimal moneyDailyTodayTotal) { + this.moneyDailyTodayTotal = moneyDailyTodayTotal; + } + + public BigDecimal getSubtotalTotal() { + return subtotalTotal; + } + + public void setSubtotalTotal(BigDecimal subtotalTotal) { + this.subtotalTotal = subtotalTotal; + } + + public BigDecimal getOpeningFeeTotal() { + return openingFeeTotal; + } + + public void setOpeningFeeTotal(BigDecimal openingFeeTotal) { + this.openingFeeTotal = openingFeeTotal; + } + + public BigDecimal getCobranzaToday() { + return cobranzaToday; + } + + public void setCobranzaToday(BigDecimal cobranzaToday) { + this.cobranzaToday = cobranzaToday; + } + + public BigDecimal getColocationTotal() { + return colocationTotal; + } + + public void setColocationTotal(BigDecimal colocationTotal) { + this.colocationTotal = colocationTotal; + } + + public BigDecimal getNominaTotal() { + return nominaTotal; + } + + public void setNominaTotal(BigDecimal nominaTotal) { + this.nominaTotal = nominaTotal; + } + + public BigDecimal getAdelantosTotal() { + return adelantosTotal; + } + + public void setAdelantosTotal(BigDecimal adelantosTotal) { + this.adelantosTotal = adelantosTotal; + } + + public BigDecimal getEntradasTotal() { + return entradasTotal; + } + + public void setEntradasTotal(BigDecimal entradasTotal) { + this.entradasTotal = entradasTotal; + } + + public BigDecimal getGastosAdmonTotal() { + return gastosAdmonTotal; + } + + public void setGastosAdmonTotal(BigDecimal gastosAdmonTotal) { + this.gastosAdmonTotal = gastosAdmonTotal; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/StatsAdvancesView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsAdvancesView.java new file mode 100644 index 0000000..7e2040f --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsAdvancesView.java @@ -0,0 +1,90 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author David Rodriguez + */ +@Entity +@Table(name = "APC_STATS_ADVANCE_VIEW") +public class StatsAdvancesView implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_route", length = 36) + private String idRoute; + + @Column(name = "name") + private String routeName; + + @Column(name = "total_advances") + private BigDecimal totalAdvances; + + @Column(name = "created_on") + private Date createdOn; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getIdRoute() { + return idRoute; + } + + public void setIdRoute(String idRoute) { + this.idRoute = idRoute; + } + + public String getRouteName() { + return routeName; + } + + public void setRouteName(String routeName) { + this.routeName = routeName; + } + + public BigDecimal getTotalAdvances() { + return totalAdvances; + } + + public void setTotalAdvances(BigDecimal totalAdvances) { + this.totalAdvances = totalAdvances; + } + + @Override + public String toString() { + return "AdvancesView{" + "idRoute=" + idRoute + ", routeName=" + routeName + ", totalAdvances=" + totalAdvances + ", createdOn=" + createdOn + '}'; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/StatsClosingDayView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsClosingDayView.java new file mode 100644 index 0000000..ec0c55c --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsClosingDayView.java @@ -0,0 +1,101 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author David Rodriguez + */ +@Entity +@Table(name = "APC_CLOSING_DAY_VIEW") +public class StatsClosingDayView implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_user", length = 36) + private String idUser; + + @Column(name = "name") + private String userName; + + @Column(name = "total_closing") + private BigDecimal totalClosingDay; + + @Column(name = "created_on") + private Date createdOn; + + @Column(name = "route_name") + private String routeName; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public BigDecimal getTotalClosingDay() { + return totalClosingDay; + } + + public void setTotalClosingDay(BigDecimal totalClosingDay) { + this.totalClosingDay = totalClosingDay; + } + + public String getRouteName() { + return routeName; + } + + public void setRouteName(String routeName) { + this.routeName = routeName; + } + + @Override + public String toString() { + return "FeesView{" + "idUser=" + idUser + ", userName=" + userName + ", totalClosingDay=" + totalClosingDay + ", createdOn=" + createdOn + '}'; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/StatsDepositsView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsDepositsView.java new file mode 100644 index 0000000..c0f5347 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsDepositsView.java @@ -0,0 +1,145 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author David Rodriguez + */ +@Entity +@Table(name = "APC_STATS_DEPOSITS_VIEW") +public class StatsDepositsView implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_user", length = 36) + private String idUser; + + @Column(name = "id_customer", length = 36) + private String idCustomer; + + @Column(name ="coment") + private String coment; + + @Column(name="transfer_number") + private String transferNumber; + + @Column(name = "name") + private String userName; + + @Column(name = "name_customer") + private String customerName; + + @Column(name = "total_deposits") + private BigDecimal totalDeposits; + + @Column(name = "created_on") + private Date createdOn; + + @Column(name = "route_name") + private String routeName; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getComent() { + return coment; + } + + public void setComent(String coment) { + this.coment = coment; + } + + public String getTransferNumber() { + return transferNumber; + } + + public void setTransferNumber(String transferNumber) { + this.transferNumber = transferNumber; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public BigDecimal getTotalDeposits() { + return totalDeposits; + } + + public void setTotalDeposits(BigDecimal totalDeposits) { + this.totalDeposits = totalDeposits; + } + + public String getRouteName() { + return routeName; + } + + public void setRouteName(String routeName) { + this.routeName = routeName; + } + + public String getIdCustomer() { + return idCustomer; + } + + public void setIdCustomer(String idCustomer) { + this.idCustomer = idCustomer; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + @Override + public String toString() { + return "Deposits{" + "idUser=" + idUser + ", userName=" + userName + ", totalDeposits=" + totalDeposits + ", createdOn=" + createdOn + '}'; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/StatsEmployeeSavingView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsEmployeeSavingView.java new file mode 100644 index 0000000..f3d5147 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsEmployeeSavingView.java @@ -0,0 +1,126 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.enums.EmployeeSavingType; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author David Rodriguez + */ +@Entity +@Table(name = "APC_STATS_EMPLOYEE_SAVING_VIEW") +public class StatsEmployeeSavingView implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_user", length = 36) + private String idUser; + + @Column(name = "name") + private String userName; + + @Column(name = "employee_saving") + private BigDecimal employeeSaving; + + @Column(name = "created_on") + private Date createdOn; + + @Column(name = "route_name") + private String routeName; + + public String getId() { + return id; + } + + @Enumerated(EnumType.STRING) + @Column(name = "type") + private EmployeeSavingType type; + + public String getTypeText() { + if(getType().equals(EmployeeSavingType.DISPOSAL)) + return "Disposición de ahorro"; + else if(getType().equals(EmployeeSavingType.CANCEL)){ + return "Ahorro Cancelado";} + else{ + return "Ahorro"; + } + } + + public EmployeeSavingType getType() { + return type; + } + + public void setType(EmployeeSavingType type) { + this.type = type; + } + + public void setId(String id) { + this.id = id; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public BigDecimal getEmployeeSaving() { + return employeeSaving; + } + + public void setEmployeeSaving(BigDecimal employeeSaving) { + this.employeeSaving = employeeSaving; + } + + public String getRouteName() { + return routeName; + } + + public void setRouteName(String routeName) { + this.routeName = routeName; + } + + @Override + public String toString() { + return "EmployeeSaving{" + "idUser=" + idUser + ", userName=" + userName + ", employeeSaving=" + employeeSaving + ", createdOn=" + createdOn + '}'; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/StatsGasolineView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsGasolineView.java new file mode 100644 index 0000000..1bdbb22 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsGasolineView.java @@ -0,0 +1,158 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author David Rodriguez + */ +@Entity +@Table(name = "APC_STATS_GASOLINE_VIEW") +public class StatsGasolineView implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_user", length = 36) + private String idUser; + + @Column(name = "id_route", length = 36) + private String idRoute; + + @Column(name = "route_name") + private String routeName; + + @Column(name = "user_name") + private String userName; + + @Column(name = "km_old") + private Double kmOld; + + @Column(name = "km_new") + private Double kmNew; + + @Column(name = "total_gasoline") + private Double totalGasoline; + + @Column(name = "description", length = 36) + private String description; + + @Column(name = "created_on") + private Date createdOn; + + @Column(name = "quantity") + private Double quantity; + + public Double getQuantity() { + return quantity; + } + + public void setQuantity(Double quantity) { + this.quantity = quantity; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public String getIdRoute() { + return idRoute; + } + + public void setIdRoute(String idRoute) { + this.idRoute = idRoute; + } + + public String getRouteName() { + return routeName; + } + + public void setRouteName(String routeName) { + this.routeName = routeName; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Double getKmOld() { + return kmOld; + } + + public void setKmOld(Double kmOld) { + this.kmOld = kmOld; + } + + public Double getKmNew() { + return kmNew; + } + + public void setKmNew(Double kmNew) { + this.kmNew = kmNew; + } + + public Double getTotalGasoline() { + return totalGasoline; + } + + public void setTotalGasoline(Double totalGasoline) { + this.totalGasoline = totalGasoline; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public Double getKmRecorridos(){ + return getKmNew() - (getKmOld() != null ? getKmOld() : 0D ); + } + + public Double getRendimiento(){ + return getKmRecorridos()/getQuantity(); + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/StatsOpeningFeesView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsOpeningFeesView.java new file mode 100644 index 0000000..f631d7e --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsOpeningFeesView.java @@ -0,0 +1,101 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author David Rodriguez + */ +@Entity +@Table(name = "APC_OPENING_FEES_VIEW") +public class StatsOpeningFeesView implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_user", length = 36) + private String idUser; + + @Column(name = "name") + private String userName; + + @Column(name = "opening_fee") + private BigDecimal totalOpeningFees; + + @Column(name = "created_on") + private Date createdOn; + + @Column(name = "route_name") + private String routeName; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public BigDecimal getTotalOpeningFees() { + return totalOpeningFees; + } + + public void setTotaltotalOpeningFees(BigDecimal totalOpeningFees) { + this.totalOpeningFees = totalOpeningFees; + } + + public String getRouteName() { + return routeName; + } + + public void setRouteName(String routeName) { + this.routeName = routeName; + } + + @Override + public String toString() { + return "FeesView{" + "idUser=" + idUser + ", userName=" + userName + ", totalOpeningFees=" + totalOpeningFees + ", createdOn=" + createdOn + '}'; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/StatsPaymentRenovationView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsPaymentRenovationView.java new file mode 100644 index 0000000..b3192d9 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsPaymentRenovationView.java @@ -0,0 +1,112 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author David Rodriguez + */ +@Entity +@Table(name = "APC_STATS_PAYMENT_RENOVATION_VIEW") +public class StatsPaymentRenovationView implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_user", length = 36) + private String idUser; + + @Column(name = "employee_name") + private String userName; + + @Column(name = "id_customer", length = 36) + private String idCustomer; + + @Column(name = "customer_name") + private String customerName; + + @Column(name = "total_payment") + private BigDecimal totalPayment; + + @Column(name = "created_on") + private Date createdOn; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getIdCustomer() { + return idCustomer; + } + + public void setIdCustomer(String idCustomer) { + this.idCustomer = idCustomer; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + public BigDecimal getTotalPayment() { + return totalPayment; + } + + public void setTotalPayment(BigDecimal totalPayment) { + this.totalPayment = totalPayment; + } + + @Override + public String toString() { + return "FeesView{" + "idUser=" + idUser + ", userName=" + userName + ", totalPayment=" + totalPayment + ", createdOn=" + createdOn + '}'; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/StatsPaymentRouteView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsPaymentRouteView.java new file mode 100644 index 0000000..1bdb0d7 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsPaymentRouteView.java @@ -0,0 +1,123 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author David Rodriguez + */ +@Entity +@Table(name = "APC_PAYMENT_ROUTE_VIEW") +public class StatsPaymentRouteView implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_loan", length = 36) + private String idLoan; + + @Column(name = "id_route", length = 36) + private String idRoute; + + @Column(name = "name") + private String routeName; + + @Column(name = "user_name") + private String userName; + + @Column(name = "total_payment") + private BigDecimal totalPayment; + + @Column(name = "opening_fee") + private BigDecimal openingFee; + + @Column(name = "created_on") + private Date createdOn; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getIdRoute() { + return idRoute; + } + + public void setIdRoute(String idRoute) { + this.idRoute = idRoute; + } + + public String getRouteName() { + return routeName; + } + + public void setRouteName(String routeName) { + this.routeName = routeName; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public BigDecimal getTotalPayment() { + return totalPayment; + } + + public void setTotalPayment(BigDecimal totalPayment) { + this.totalPayment = totalPayment; + } + + public BigDecimal getOpeningFee() { + return openingFee; + } + + public void setOpeningFee(BigDecimal openingFee) { + this.openingFee = openingFee; + } + + public String getIdLoan() { + return idLoan; + } + + public void setIdLoan(String idLoan) { + this.idLoan = idLoan; + } + + @Override + public String toString() { + return "FeesView{" + "idRoute=" + idRoute + ", routeName=" + routeName + ", totalPayment=" + totalPayment + ", createdOn=" + createdOn + '}'; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/StatsPaymentView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsPaymentView.java new file mode 100644 index 0000000..b657f0e --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsPaymentView.java @@ -0,0 +1,123 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author David Rodriguez + */ +@Entity +@Table(name = "APC_PAYMENT_VIEW") +public class StatsPaymentView implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_loan", length = 36) + private String idLoan; + + @Column(name = "id_user", length = 36) + private String idUser; + + @Column(name = "name") + private String userName; + + @Column(name = "route_name") + private String routeName; + + @Column(name = "total_payment") + private BigDecimal totalPayment; + + @Column(name = "opening_fee") + private BigDecimal openingFee; + + @Column(name = "created_on") + private Date createdOn; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public String getIdLoan() { + return idLoan; + } + + public void setIdLoan(String idLoan) { + this.idLoan = idLoan; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getRouteName() { + return routeName; + } + + public void setRouteName(String routeName) { + this.routeName = routeName; + } + + public BigDecimal getTotalPayment() { + return totalPayment; + } + + public void setTotalPayment(BigDecimal totalPayment) { + this.totalPayment = totalPayment; + } + + public BigDecimal getOpeningFee() { + return openingFee; + } + + public void setOpeningFee(BigDecimal openingFee) { + this.openingFee = openingFee; + } + + @Override + public String toString() { + return "FeesView{" + "idUser=" + idUser + ", userName=" + userName + ", totalPayment=" + totalPayment + ", createdOn=" + createdOn + '}'; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/StatsPayrollView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsPayrollView.java new file mode 100644 index 0000000..16155f7 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsPayrollView.java @@ -0,0 +1,90 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author David Rodriguez + */ +@Entity +@Table(name = "APC_PAYROLL_STATS_VIEW") +public class StatsPayrollView implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_user", length = 36) + private String idUser; + + @Column(name = "name") + private String userName; + + @Column(name = "total_payroll") + private BigDecimal totalPayroll; + + @Column(name = "created_on") + private Date createdOn; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public BigDecimal getTotalPayroll() { + return totalPayroll; + } + + public void setTotalPayroll(BigDecimal totalPayroll) { + this.totalPayroll = totalPayroll; + } + + @Override + public String toString() { + return "FeesView{" + "idUser=" + idUser + ", userName=" + userName + ", totalPayroll=" + totalPayroll + ", createdOn=" + createdOn + '}'; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/StatsSummaryView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsSummaryView.java new file mode 100644 index 0000000..00bc3d1 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsSummaryView.java @@ -0,0 +1,168 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author David Rodriguez + */ +// @Entity +// @Table(name = "APC_PAYROLL_STATS_VIEW") +public class StatsSummaryView implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_user", length = 36) + private String idUser; + + @Column(name = "Name") + private String userName; + + @Column(name = "opening_fee") + private BigDecimal openingFee; + + @Column(name = "deposits") + private BigDecimal deposits; + + @Column(name = "payment") + private BigDecimal payment; + + @Column(name = "payroll") + private BigDecimal payroll; + + @Column(name = "gasoline") + private BigDecimal gasoline; + + @Column(name = "advances") + private BigDecimal advances; + + @Column(name = "expenses") + private BigDecimal expenses; + + @Column(name = "trasfer_transmitter") + private BigDecimal trasferTransmitter; + + @Column(name = "trasfer_receiver") + private BigDecimal trasferReceiver; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public BigDecimal getOpeningFee() { + return openingFee; + } + + public void setOpeningFee(BigDecimal openingFee) { + this.openingFee = openingFee; + } + + public BigDecimal getDeposits() { + return deposits; + } + + public void setDeposits(BigDecimal deposits) { + this.deposits = deposits; + } + + public BigDecimal getPayment() { + return payment; + } + + public void setPayment(BigDecimal payment) { + this.payment = payment; + } + + public BigDecimal getPayroll() { + return payroll; + } + + public void setPayroll(BigDecimal payroll) { + this.payroll = payroll; + } + + public BigDecimal getGasoline() { + return gasoline; + } + + public void setGasoline(BigDecimal gasoline) { + this.gasoline = gasoline; + } + + public BigDecimal getAdvances() { + return advances; + } + + public void setAdvances(BigDecimal advances) { + this.advances = advances; + } + + public BigDecimal getExpenses() { + return expenses; + } + + public void setExpenses(BigDecimal expenses) { + this.expenses = expenses; + } + + public BigDecimal getTrasferTransmitter() { + return trasferTransmitter; + } + + public void setTrasferTransmitter(BigDecimal trasferTransmitter) { + this.trasferTransmitter = trasferTransmitter; + } + + public BigDecimal getTrasferReceiver() { + return trasferReceiver; + } + + public void setTrasferReceiver(BigDecimal trasferReceiver) { + this.trasferReceiver = trasferReceiver; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public BigDecimal getTotalCobros(){ + return advances.add(payment).add(deposits).add(openingFee); + } + + @Override + public String toString() { + return ""; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/StatsZeroPaymentsView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsZeroPaymentsView.java new file mode 100644 index 0000000..edd6808 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/StatsZeroPaymentsView.java @@ -0,0 +1,101 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author David Rodriguez + */ +@Entity +@Table(name = "APC_STATS_ZERO_PAYMENTS_VIEW") +public class StatsZeroPaymentsView implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_user", length = 36) + private String idUser; + + @Column(name = "name") + private String userName; + + @Column(name = "total_zeroPayments") + private BigDecimal totalZeroPayments; + + @Column(name = "created_on") + private Date createdOn; + + @Column(name = "route_name") + private String routeName; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public BigDecimal getTotalZeroPayments() { + return totalZeroPayments; + } + + public void setTotalZeroPayments(BigDecimal totalZeroPayments) { + this.totalZeroPayments = totalZeroPayments; + } + + public String getRouteName() { + return routeName; + } + + public void setRouteName(String routeName) { + this.routeName = routeName; + } + + @Override + public String toString() { + return "ZeroPayments{" + "idUser=" + idUser + ", userName=" + userName + ", totalZeroPayments=" + totalZeroPayments + ", createdOn=" + createdOn + '}'; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/SubtotalLastWeekByUserView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/SubtotalLastWeekByUserView.java new file mode 100644 index 0000000..c486fd8 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/SubtotalLastWeekByUserView.java @@ -0,0 +1,252 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.core.Office; +import java.io.Serializable; +import java.math.BigDecimal; +import java.math.RoundingMode; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Transient; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_SUBTOTAL_LAST_WEEK_BY_USER_VIEW") +public class SubtotalLastWeekByUserView implements Serializable{ + + private static final long serialVersionUID = 3055231364366461069L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "username") + private String userName; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Column(name = "subtotal_monday") + private BigDecimal subtotalMonday; + + @Column(name = "subtotal_tuesday") + private BigDecimal subtotalTuesday; + + @Column(name = "subtotal_wednesday") + private BigDecimal subtotalWednesday; + + @Column(name = "subtotal_thursday") + private BigDecimal subtotalThursday; + + @Column(name = "subtotal_friday") + private BigDecimal subtotalFriday; + + @Column(name = "subtotal_saturday") + private BigDecimal subtotalSaturday; + + @Column(name = "subtotal_total") + private BigDecimal subtotalTotal; + + @Column(name = "opening_fee_monday") + private BigDecimal openingFeeMonday; + + @Column(name = "opening_fee_tuesday") + private BigDecimal openingFeeTuesday; + + @Column(name = "opening_fee_wednesday") + private BigDecimal openingFeeWednesday; + + @Column(name = "opening_fee_thursday") + private BigDecimal openingFeeThursday; + + @Column(name = "opening_fee_friday") + private BigDecimal openingFeeFriday; + + @Column(name = "opening_fee_saturday") + private BigDecimal openingFeeSaturday; + + @Column(name = "opening_fee_total") + private BigDecimal openingFeeTotal; + + @Column(name = "faltante") + private BigDecimal faltante; + + @Transient + private BigDecimal porcentajeFaltante; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public BigDecimal getSubtotalMonday() { + return subtotalMonday; + } + + public void setSubtotalMonday(BigDecimal subtotalMonday) { + this.subtotalMonday = subtotalMonday; + } + + public BigDecimal getSubtotalTuesday() { + return subtotalTuesday; + } + + public void setSubtotalTuesday(BigDecimal subtotalTuesday) { + this.subtotalTuesday = subtotalTuesday; + } + + public BigDecimal getSubtotalWednesday() { + return subtotalWednesday; + } + + public void setSubtotalWednesday(BigDecimal subtotalWednesday) { + this.subtotalWednesday = subtotalWednesday; + } + + public BigDecimal getSubtotalThursday() { + return subtotalThursday; + } + + public void setSubtotalThursday(BigDecimal subtotalThursday) { + this.subtotalThursday = subtotalThursday; + } + + public BigDecimal getSubtotalFriday() { + return subtotalFriday; + } + + public void setSubtotalFriday(BigDecimal subtotalFriday) { + this.subtotalFriday = subtotalFriday; + } + + public BigDecimal getSubtotalSaturday() { + return subtotalSaturday; + } + + public void setSubtotalSaturday(BigDecimal subtotalSaturday) { + this.subtotalSaturday = subtotalSaturday; + } + + public BigDecimal getSubtotalTotal() { + return subtotalTotal; + } + + public void setSubtotalTotal(BigDecimal subtotalTotal) { + this.subtotalTotal = subtotalTotal; + } + + public BigDecimal getOpeningFeeMonday() { + return openingFeeMonday; + } + + public void setOpeningFeeMonday(BigDecimal openingFeeMonday) { + this.openingFeeMonday = openingFeeMonday; + } + + public BigDecimal getOpeningFeeTuesday() { + return openingFeeTuesday; + } + + public void setOpeningFeeTuesday(BigDecimal openingFeeTuesday) { + this.openingFeeTuesday = openingFeeTuesday; + } + + public BigDecimal getOpeningFeeWednesday() { + return openingFeeWednesday; + } + + public void setOpeningFeeWednesday(BigDecimal openingFeeWednesday) { + this.openingFeeWednesday = openingFeeWednesday; + } + + public BigDecimal getOpeningFeeThursday() { + return openingFeeThursday; + } + + public void setOpeningFeeThursday(BigDecimal openingFeeThursday) { + this.openingFeeThursday = openingFeeThursday; + } + + public BigDecimal getOpeningFeeFriday() { + return openingFeeFriday; + } + + public void setOpeningFeeFriday(BigDecimal openingFeeFriday) { + this.openingFeeFriday = openingFeeFriday; + } + + public BigDecimal getOpeningFeeSaturday() { + return openingFeeSaturday; + } + + public void setOpeningFeeSaturday(BigDecimal openingFeeSaturday) { + this.openingFeeSaturday = openingFeeSaturday; + } + + public BigDecimal getOpeningFeeTotal() { + return openingFeeTotal; + } + + public void setOpeningFeeTotal(BigDecimal openingFeeTotal) { + this.openingFeeTotal = openingFeeTotal; + } + + public BigDecimal getFaltante() { + return faltante; + } + + public void setFaltante(BigDecimal faltante) { + this.faltante = faltante; + } + + public BigDecimal getPorcentajeFaltante() { + BigDecimal totalReportedWeek = openingFeeTotal.add(subtotalTotal); + if(totalReportedWeek.compareTo(BigDecimal.ZERO) == 1) + porcentajeFaltante = (faltante + .multiply(new BigDecimal(100))).divide(totalReportedWeek, 2, RoundingMode.HALF_UP); + else + porcentajeFaltante = BigDecimal.ZERO; + return porcentajeFaltante; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/SubtotalWeekByUserView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/SubtotalWeekByUserView.java new file mode 100644 index 0000000..9eabbad --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/SubtotalWeekByUserView.java @@ -0,0 +1,227 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.core.Office; +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_SUBTOTAL_WEEK_BY_USER_VIEW") +public class SubtotalWeekByUserView implements Serializable{ + + private static final long serialVersionUID = 3055231364366461069L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "username") + private String userName; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn( + name = "id_office", + referencedColumnName = "id", + nullable = false + ) + private Office office; + + @Column(name = "subtotal_monday") + private BigDecimal subtotalMonday; + + @Column(name = "subtotal_tuesday") + private BigDecimal subtotalTuesday; + + @Column(name = "subtotal_wednesday") + private BigDecimal subtotalWednesday; + + @Column(name = "subtotal_thursday") + private BigDecimal subtotalThursday; + + @Column(name = "subtotal_friday") + private BigDecimal subtotalFriday; + + @Column(name = "subtotal_saturday") + private BigDecimal subtotalSaturday; + + @Column(name = "subtotal_total") + private BigDecimal subtotalTotal; + + @Column(name = "opening_fee_monday") + private BigDecimal openingFeeMonday; + + @Column(name = "opening_fee_tuesday") + private BigDecimal openingFeeTuesday; + + @Column(name = "opening_fee_wednesday") + private BigDecimal openingFeeWednesday; + + @Column(name = "opening_fee_thursday") + private BigDecimal openingFeeThursday; + + @Column(name = "opening_fee_friday") + private BigDecimal openingFeeFriday; + + @Column(name = "opening_fee_saturday") + private BigDecimal openingFeeSaturday; + + @Column(name = "opening_fee_total") + private BigDecimal openingFeeTotal; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Office getOffice() { + return office; + } + + public void setOffice(Office office) { + this.office = office; + } + + public BigDecimal getSubtotalMonday() { + return subtotalMonday; + } + + public void setSubtotalMonday(BigDecimal subtotalMonday) { + this.subtotalMonday = subtotalMonday; + } + + public BigDecimal getSubtotalTuesday() { + return subtotalTuesday; + } + + public void setSubtotalTuesday(BigDecimal subtotalTuesday) { + this.subtotalTuesday = subtotalTuesday; + } + + public BigDecimal getSubtotalWednesday() { + return subtotalWednesday; + } + + public void setSubtotalWednesday(BigDecimal subtotalWednesday) { + this.subtotalWednesday = subtotalWednesday; + } + + public BigDecimal getSubtotalThursday() { + return subtotalThursday; + } + + public void setSubtotalThursday(BigDecimal subtotalThursday) { + this.subtotalThursday = subtotalThursday; + } + + public BigDecimal getSubtotalFriday() { + return subtotalFriday; + } + + public void setSubtotalFriday(BigDecimal subtotalFriday) { + this.subtotalFriday = subtotalFriday; + } + + public BigDecimal getSubtotalSaturday() { + return subtotalSaturday; + } + + public void setSubtotalSaturday(BigDecimal subtotalSaturday) { + this.subtotalSaturday = subtotalSaturday; + } + + public BigDecimal getSubtotalTotal() { + return subtotalTotal; + } + + public void setSubtotalTotal(BigDecimal subtotalTotal) { + this.subtotalTotal = subtotalTotal; + } + + public BigDecimal getOpeningFeeMonday() { + return openingFeeMonday; + } + + public void setOpeningFeeMonday(BigDecimal openingFeeMonday) { + this.openingFeeMonday = openingFeeMonday; + } + + public BigDecimal getOpeningFeeTuesday() { + return openingFeeTuesday; + } + + public void setOpeningFeeTuesday(BigDecimal openingFeeTuesday) { + this.openingFeeTuesday = openingFeeTuesday; + } + + public BigDecimal getOpeningFeeWednesday() { + return openingFeeWednesday; + } + + public void setOpeningFeeWednesday(BigDecimal openingFeeWednesday) { + this.openingFeeWednesday = openingFeeWednesday; + } + + public BigDecimal getOpeningFeeThursday() { + return openingFeeThursday; + } + + public void setOpeningFeeThursday(BigDecimal openingFeeThursday) { + this.openingFeeThursday = openingFeeThursday; + } + + public BigDecimal getOpeningFeeFriday() { + return openingFeeFriday; + } + + public void setOpeningFeeFriday(BigDecimal openingFeeFriday) { + this.openingFeeFriday = openingFeeFriday; + } + + public BigDecimal getOpeningFeeSaturday() { + return openingFeeSaturday; + } + + public void setOpeningFeeSaturday(BigDecimal openingFeeSaturday) { + this.openingFeeSaturday = openingFeeSaturday; + } + + public BigDecimal getOpeningFeeTotal() { + return openingFeeTotal; + } + + public void setOpeningFeeTotal(BigDecimal openingFeeTotal) { + this.openingFeeTotal = openingFeeTotal; + } + + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/TotalCashByCurdateDashboardView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/TotalCashByCurdateDashboardView.java new file mode 100644 index 0000000..728547e --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/TotalCashByCurdateDashboardView.java @@ -0,0 +1,173 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_TOTAL_CASH_BY_CURDATE_DASHBOARD_VIEW") +public class TotalCashByCurdateDashboardView implements Serializable { + + private static final long serialVersionUID = 617629469188727880L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_office") + private String idOffice; + + @Column(name = "total_amount_payment") + private BigDecimal paymentDaily; + + @Column(name = "total_amount_deposit") + private BigDecimal depositDaily; + + @Column(name = "transfer_sender") + private BigDecimal transferSender; + + @Column(name = "transfer_receiver") + private BigDecimal transferReceiver; + + @Column(name = "money_daily") + private BigDecimal moneyDaily; + + @Column(name = "other_expense") + private BigDecimal otherExpense; + + @Column(name = "delivery") + private BigDecimal delivery; + + @Column(name = "transfer_pending") + private BigDecimal transferPending; + + @Transient + private BigDecimal total; + + public TotalCashByCurdateDashboardView() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public BigDecimal getPaymentDaily() { + return paymentDaily; + } + + public void setPaymentDaily(BigDecimal paymentDaily) { + this.paymentDaily = paymentDaily; + } + + public BigDecimal getTransferSender() { + return transferSender; + } + + public void setTransferSender(BigDecimal transferSender) { + this.transferSender = transferSender; + } + + public BigDecimal getTransferReceiver() { + return transferReceiver; + } + + public void setTransferReceiver(BigDecimal transferReceiver) { + this.transferReceiver = transferReceiver; + } + + public BigDecimal getMoneyDaily() { + return moneyDaily; + } + + public void setMoneyDaily(BigDecimal moneyDaily) { + this.moneyDaily = moneyDaily; + } + + public BigDecimal getOtherExpense() { + return otherExpense; + } + + public void setOtherExpense(BigDecimal otherExpense) { + this.otherExpense = otherExpense; + } + + public BigDecimal getDelivery() { + return delivery; + } + + public void setDelivery(BigDecimal delivery) { + this.delivery = delivery; + } + + public String getIdOffice() { + return idOffice; + } + + public void setIdOffice(String idOffice) { + this.idOffice = idOffice; + } + + public BigDecimal getTransferPending() { + return transferPending; + } + + public void setTransferPending(BigDecimal transferPending) { + this.transferPending = transferPending; + } + + public BigDecimal getDepositDaily() { + return depositDaily; + } + + public void setDepositDaily(BigDecimal depositDaily) { + this.depositDaily = depositDaily; + } + + public BigDecimal getTotal() { + if (null == total) { + total = BigDecimal.ZERO; + } + total = BigDecimal.ZERO; + total = total + .add(getPaymentDaily()) + .add(getDepositDaily()) + .add(getTransferReceiver()) + .subtract(getTransferSender()) + .add(getMoneyDaily()) + .subtract(getOtherExpense()) + .subtract(getDelivery()); + + return total; + } + + public void setTotal(BigDecimal total) { + this.total = total; + } + + @Override + public String toString() { + return "TotalCashByCurdateView{" + "id=" + id + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/TotalCashByCurdateView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/TotalCashByCurdateView.java new file mode 100644 index 0000000..6bc7379 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/TotalCashByCurdateView.java @@ -0,0 +1,172 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_TOTAL_CASH_BY_CURDATE_VIEW") +public class TotalCashByCurdateView implements Serializable { + + private static final long serialVersionUID = 617629469188727880L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_office") + private String idOffice; + + @Column(name = "total_amount_payment") + private BigDecimal paymentDaily; + + @Column(name = "total_amount_deposit") + private BigDecimal depositDaily; + + @Column(name = "transfer_sender") + private BigDecimal transferSender; + + @Column(name = "transfer_receiver") + private BigDecimal transferReceiver; + + @Column(name = "money_daily") + private BigDecimal moneyDaily; + + @Column(name = "other_expense") + private BigDecimal otherExpense; + + @Column(name = "delivery") + private BigDecimal delivery; + + @Column(name = "transfer_pending") + private BigDecimal transferPending; + + @Transient + private BigDecimal total; + + public TotalCashByCurdateView() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public BigDecimal getPaymentDaily() { + return paymentDaily; + } + + public void setPaymentDaily(BigDecimal paymentDaily) { + this.paymentDaily = paymentDaily; + } + + public BigDecimal getTransferSender() { + return transferSender; + } + + public void setTransferSender(BigDecimal transferSender) { + this.transferSender = transferSender; + } + + public BigDecimal getTransferReceiver() { + return transferReceiver; + } + + public void setTransferReceiver(BigDecimal transferReceiver) { + this.transferReceiver = transferReceiver; + } + + public BigDecimal getMoneyDaily() { + return moneyDaily; + } + + public void setMoneyDaily(BigDecimal moneyDaily) { + this.moneyDaily = moneyDaily; + } + + public BigDecimal getOtherExpense() { + return otherExpense; + } + + public void setOtherExpense(BigDecimal otherExpense) { + this.otherExpense = otherExpense; + } + + public BigDecimal getDelivery() { + return delivery; + } + + public void setDelivery(BigDecimal delivery) { + this.delivery = delivery; + } + + public String getIdOffice() { + return idOffice; + } + + public void setIdOffice(String idOffice) { + this.idOffice = idOffice; + } + + public BigDecimal getTransferPending() { + return transferPending; + } + + public void setTransferPending(BigDecimal transferPending) { + this.transferPending = transferPending; + } + + public BigDecimal getDepositDaily() { + return depositDaily; + } + + public void setDepositDaily(BigDecimal depositDaily) { + this.depositDaily = depositDaily; + } + + public BigDecimal getTotal() { + if (null == total) { + total = BigDecimal.ZERO; + } + total = BigDecimal.ZERO; + total = total + .add(getPaymentDaily()) + .add(getTransferReceiver()) + .subtract(getTransferSender()) + .add(getMoneyDaily()) + .subtract(getOtherExpense()) + .subtract(getDelivery()); + + return total; + } + + public void setTotal(BigDecimal total) { + this.total = total; + } + + @Override + public String toString() { + return "TotalCashByCurdateView{" + "id=" + id + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/TotalClosingDayByCurdateView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/TotalClosingDayByCurdateView.java new file mode 100644 index 0000000..102bcea --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/TotalClosingDayByCurdateView.java @@ -0,0 +1,71 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_TOTAL_CLOSING_DAY_BY_CURDATE_VIEW") +public class TotalClosingDayByCurdateView implements Serializable { + + private static final long serialVersionUID = -2806905948351437216L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_office") + private String idOffice; + + @Column(name = "amount_paid") + private BigDecimal amountPaid; + + public TotalClosingDayByCurdateView() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public BigDecimal getAmountPaid() { + return amountPaid; + } + + public void setAmountPaid(BigDecimal amountPaid) { + this.amountPaid = amountPaid; + } + + public String getIdOffice() { + return idOffice; + } + + public void setIdOffice(String idOffice) { + this.idOffice = idOffice; + } + + @Override + public String toString() { + return "TotalClosingDayByCurdateView{" + "id=" + id + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/TotalLoansApprovedByOfficeView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/TotalLoansApprovedByOfficeView.java new file mode 100644 index 0000000..e17c18a --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/TotalLoansApprovedByOfficeView.java @@ -0,0 +1,64 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_TOTAL_LOANS_APPROVED_BY_OFFICE") +public class TotalLoansApprovedByOfficeView implements Serializable{ + + private static final long serialVersionUID = -6505276469507406194L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_office") + private String idOffice; + + @Column(name = "payment_daily") + private BigDecimal payment; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdOffice() { + return idOffice; + } + + public void setIdOffice(String idOffice) { + this.idOffice = idOffice; + } + + public BigDecimal getPayment() { + return payment; + } + + public void setPayment(BigDecimal payment) { + this.payment = payment; + } + + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/TotalLoansByOfficeView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/TotalLoansByOfficeView.java new file mode 100644 index 0000000..086efa2 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/TotalLoansByOfficeView.java @@ -0,0 +1,114 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.enums.LoanStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Entity +@Immutable +@Table(name = "APC_TOTAL_LOANS_BY_OFFICE") +public class TotalLoansByOfficeView implements Serializable{ + + private static final long serialVersionUID = 1072887428747040106L; + + @Id + @Column(name = "id", length = 36) + private String id; + + @Column(name = "id_office") + private String idOffice; + + @Enumerated(EnumType.STRING) + @Column(name = "loan_status") + private LoanStatus loanStatus; + + @Column(name = "id_route") + private String idRoute; + + @Column(name = "route_name") + private String routeName; + + @Column(name = "amount_to_pay") + private BigDecimal amountToPay; + + @Column(name = "amount_paid") + private BigDecimal amountPaid; + + public TotalLoansByOfficeView() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdOffice() { + return idOffice; + } + + public void setIdOffice(String idOffice) { + this.idOffice = idOffice; + } + + public LoanStatus getLoanStatus() { + return loanStatus; + } + + public void setLoanStatus(LoanStatus loanStatus) { + this.loanStatus = loanStatus; + } + + public String getIdRoute() { + return idRoute; + } + + public void setIdRoute(String idRoute) { + this.idRoute = idRoute; + } + + public String getRouteName() { + return routeName; + } + + public void setRouteName(String routeName) { + this.routeName = routeName; + } + + public BigDecimal getAmountToPay() { + return amountToPay; + } + + public void setAmountToPay(BigDecimal amountToPay) { + this.amountToPay = amountToPay; + } + + public BigDecimal getAmountPaid() { + return amountPaid; + } + + public void setAmountPaid(BigDecimal amountPaid) { + this.amountPaid = amountPaid; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/TransferInPendingStatusView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/TransferInPendingStatusView.java new file mode 100644 index 0000000..4ddc8e4 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/TransferInPendingStatusView.java @@ -0,0 +1,175 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import java.util.Date; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_TRANSFER_IN_PENDING_STATUS_VIEW") +public class TransferInPendingStatusView implements Serializable { + + private static final long serialVersionUID = 7430662914845336484L; + + @Id + @Column(name = "id_loan_detail", length = 36) + private String idLoanDetail; + + @Column(name = "payment_amount") + private Double paymentAmount; + + @Column(name = "str_created_on", length = 22) + private String strCreatedOn; + + @Column(name = "customer_name", length = 103) + private String customerName; + + @Column(name = "endorsement_name", length = 103) + private String endorsementName; + + @Column(name = "user_name", length = 103) + private String userName; + + @Column(name = "loan_comments", length = 150) + private String loanComments; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + /** + * + */ + public TransferInPendingStatusView() { + } + + /** + * + * @param idLoanDetail + * @param paymentAmount + * @param strCreatedOn + * @param customerName + * @param endorsementName + * @param userName + * @param loanComments + * @param createdOn + */ + public TransferInPendingStatusView(String idLoanDetail, Double paymentAmount, String strCreatedOn, String customerName, String endorsementName, String userName, String loanComments, Date createdOn) { + this.idLoanDetail = idLoanDetail; + this.paymentAmount = paymentAmount; + this.strCreatedOn = strCreatedOn; + this.customerName = customerName; + this.endorsementName = endorsementName; + this.userName = userName; + this.loanComments = loanComments; + this.createdOn = createdOn; + } + + public String getIdLoanDetail() { + return idLoanDetail; + } + + public void setIdLoanDetail(String idLoanDetail) { + this.idLoanDetail = idLoanDetail; + } + + public Double getPaymentAmount() { + return paymentAmount; + } + + public void setPaymentAmount(Double paymentAmount) { + this.paymentAmount = paymentAmount; + } + + public String getStrCreatedOn() { + return strCreatedOn; + } + + public void setStrCreatedOn(String strCreatedOn) { + this.strCreatedOn = strCreatedOn; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + public String getEndorsementName() { + return endorsementName; + } + + public void setEndorsementName(String endorsementName) { + this.endorsementName = endorsementName; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getLoanComments() { + return loanComments; + } + + public void setLoanComments(String loanComments) { + this.loanComments = loanComments; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 61 * hash + Objects.hashCode(this.idLoanDetail); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final TransferInPendingStatusView other = (TransferInPendingStatusView) obj; + if (!Objects.equals(this.idLoanDetail, other.idLoanDetail)) { + return false; + } + return true; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/TransferView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/TransferView.java new file mode 100644 index 0000000..0f75817 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/TransferView.java @@ -0,0 +1,219 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import com.arrebol.apc.model.enums.ActionStatus; +import com.arrebol.apc.model.enums.ActiveStatus; +import java.io.Serializable; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_TRANSFER_VIEW") +public class TransferView implements Serializable { + + @Id + @Column(name = "id", length = 36) + private String id; + + @Id + @Column(name = "id_office", length = 36) + private String idOffice; + + @Column(name = "full_name_transmitter", length = 103) + private String fullNameTransmitter; + + @Column(name = "transmitter_routes") + private String transmitterRoutes; + + @Column(name = "full_name_receiver", length = 103) + private String fullNameReceiver; + + @Column(name = "receiver_routes") + private String receiverRoutes; + + @Column(name = "amount_to_transfer") + private BigDecimal amountToTransfer; + + @Enumerated(EnumType.STRING) + @Column(name = "action_status") + private ActionStatus actionStatus; + + @Column(name = "str_action_status", length = 9) + private String strActionStatus; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Column(name = "str_created_on", length = 22) + private String strCreatedOn; + + @Column(name = "style_class", length = 7) + private String styleClass; + + public TransferView() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdOffice() { + return idOffice; + } + + public void setIdOffice(String idOffice) { + this.idOffice = idOffice; + } + + public String getFullNameTransmitter() { + return fullNameTransmitter; + } + + public void setFullNameTransmitter(String fullNameTransmitter) { + this.fullNameTransmitter = fullNameTransmitter; + } + + public String getTransmitterRoutes() { + return transmitterRoutes; + } + + public void setTransmitterRoutes(String transmitterRoutes) { + this.transmitterRoutes = transmitterRoutes; + } + + public String getFullNameReceiver() { + return fullNameReceiver; + } + + public void setFullNameReceiver(String fullNameReceiver) { + this.fullNameReceiver = fullNameReceiver; + } + + public String getReceiverRoutes() { + return receiverRoutes; + } + + public void setReceiverRoutes(String receiverRoutes) { + this.receiverRoutes = receiverRoutes; + } + + public BigDecimal getAmountToTransfer() { + return amountToTransfer; + } + + public void setAmountToTransfer(BigDecimal amountToTransfer) { + this.amountToTransfer = amountToTransfer; + } + + public ActionStatus getActionStatus() { + return actionStatus; + } + + public void setActionStatus(ActionStatus actionStatus) { + this.actionStatus = actionStatus; + } + + public String getStrActionStatus() { + return strActionStatus; + } + + public void setStrActionStatus(String strActionStatus) { + this.strActionStatus = strActionStatus; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getStrCreatedOn() { + return strCreatedOn; + } + + public void setStrCreatedOn(String strCreatedOn) { + this.strCreatedOn = strCreatedOn; + } + + public String getStyleClass() { + return styleClass; + } + + public void setStyleClass(String styleClass) { + this.styleClass = styleClass; + } + + public boolean getActive() { + return null == getStyleClass(); + } + + public boolean getAction(Date lastStableSmallBox) { + Date date = createdOn; + boolean action = true; + try { + SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); + + String dateStr = dt1.format(date); + date = dt1.parse(dateStr); + + action = date.after(lastStableSmallBox); + } catch (Exception ex) { + } + return action; + } + + @Override + public int hashCode() { + int hash = 5; + hash = 79 * hash + Objects.hashCode(this.id); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final TransferView other = (TransferView) obj; + if (!Objects.equals(this.id, other.id)) { + return false; + } + return true; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/UserByRouteView.java b/apc-model/src/main/java/com/arrebol/apc/model/views/UserByRouteView.java new file mode 100644 index 0000000..e6e01f3 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/UserByRouteView.java @@ -0,0 +1,81 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views; + +import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import org.hibernate.annotations.Immutable; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Immutable +@Table(name = "APC_USER_BY_ROUTE_VIEW") +public class UserByRouteView implements Serializable { + + private static final long serialVersionUID = -4547463041660221310L; + + @Id + @Column(name = "id", length = 72) + private String id; + + @Column(name = "id_user", length = 36) + private String idUser; + + @Column(name = "id_route", length = 36) + private String idRoute; + + @Column(name = "employee_name", length = 103) + private String employeeName; + + public UserByRouteView() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + public String getIdRoute() { + return idRoute; + } + + public void setIdRoute(String idRoute) { + this.idRoute = idRoute; + } + + public String getEmployeeName() { + return employeeName; + } + + public void setEmployeeName(String employeeName) { + this.employeeName = employeeName; + } + + @Override + public String toString() { + return "UserByRouteView{" + "employeeName=" + employeeName + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/AdministrationPersonSerchViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/AdministrationPersonSerchViewCfg.java new file mode 100644 index 0000000..f191b53 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/AdministrationPersonSerchViewCfg.java @@ -0,0 +1,24 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface AdministrationPersonSerchViewCfg { + + String QUERY_FIND_PERSON_BY_TYPE_ROUTE_OFFICE = "findPersonByPersonTypeAndRouteAndOffice"; + String QUERY_LIKE_PERSON_NAME_IN_PERSON_TYPE_IN_ROUTES_AND_OFFICE = "likePersonNameInPersonTypeInRoutesAndOffice"; + String QUERY_LIKE_PERSON_NAME_IN_PERSON_TYPE_ALL_ROUTES_BY_OFFICE = "likePersonNameInPersonTypeAllRoutesByOffice"; + + String FIELD_PEOPLE_TYPE = "peopleType"; + String FIELD_ID_ROUTE = "idRoute"; + String FIELD_ID_OFFICE = "idOffice"; + String FIELD_PERSON_SEARCH = "personSearch"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/AdvanceUserDailyDetailViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/AdvanceUserDailyDetailViewCfg.java new file mode 100644 index 0000000..22e32b9 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/AdvanceUserDailyDetailViewCfg.java @@ -0,0 +1,22 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface AdvanceUserDailyDetailViewCfg extends GenericCfg { + + String QUERY_FIND_ALL_ADVANCE_USER_DAILY_DETAIL_BY_USER = "findAllAdvancesUserDailyDetailByUser"; + + String FIELD_VIEW_USER = "idUser"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/AdvanceUserDailyViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/AdvanceUserDailyViewCfg.java new file mode 100644 index 0000000..55f6da1 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/AdvanceUserDailyViewCfg.java @@ -0,0 +1,23 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface AdvanceUserDailyViewCfg extends GenericCfg { + + String QUERY_FIND_ALL_ADVANCE_USER_DAILY_BY_OFFICE = "findAllAdvancesUserDailyByOffice"; + String QUERY_PAYMENT_TRACKING_BY_IDS = "findPaymentTrackingByIds"; + + String FIELD_VIEW_USER = "user"; + String FIELD_VIEW_OFFICE = "office"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/AvailablesOwnersViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/AvailablesOwnersViewCfg.java new file mode 100644 index 0000000..4cfa2b3 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/AvailablesOwnersViewCfg.java @@ -0,0 +1,22 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface AvailablesOwnersViewCfg extends GenericCfg { + + String QUERY_FIND_ALL_CURRENT_OWNERS = "findAllCurrentOwners"; + String QUERY_FIND_ALL_NEW_OWNERS = "findAllNewOwners"; + + String USER_ID = "userId"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/ClosingDailyDetailFromUserByCurdateCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/ClosingDailyDetailFromUserByCurdateCfg.java new file mode 100644 index 0000000..a4efa98 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/ClosingDailyDetailFromUserByCurdateCfg.java @@ -0,0 +1,23 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface ClosingDailyDetailFromUserByCurdateCfg extends GenericCfg{ + + String QUERY_FIND_ALL_DETAILS = "findAllClosingDailyDetailFromUserByCurdateView"; + String QUERY_FIND_ALL_DETAILS_CERTIFIER = "findAllClosingDailyDetailFromUserCertifierByCurdateView"; + + String FIELD_VIEW_USER = "idUser"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/CurrentCustomerByLoanViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/CurrentCustomerByLoanViewCfg.java new file mode 100644 index 0000000..0854c43 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/CurrentCustomerByLoanViewCfg.java @@ -0,0 +1,21 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface CurrentCustomerByLoanViewCfg extends GenericCfg { + + String QUERY_FIND_ALL_LOANS_BY_CURRENT_OWNER = "findAllLoansByCurrentOwner"; + + String USER_ID = "userId"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/CustomerWithoutRenovationViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/CustomerWithoutRenovationViewCfg.java new file mode 100644 index 0000000..8373fbb --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/CustomerWithoutRenovationViewCfg.java @@ -0,0 +1,21 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface CustomerWithoutRenovationViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_CUSTOMER_WITHOUT_RENOVATION_BY_OFFICE = "findAllCustomerWithOutRenovationByOffice"; + + String FIELD_VIEW_OFFICE = "office"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/EnabledUserDetailsViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/EnabledUserDetailsViewCfg.java new file mode 100644 index 0000000..fb889c8 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/EnabledUserDetailsViewCfg.java @@ -0,0 +1,20 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface EnabledUserDetailsViewCfg extends GenericCfg{ + + String QUERY_FIND_ENABLED_USERS_BY_OFFICE = "findEnabledUsersByOffice"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/FeesViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/FeesViewCfg.java new file mode 100644 index 0000000..375ff31 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/FeesViewCfg.java @@ -0,0 +1,24 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author David Rodriguez + */ +public interface FeesViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_FEES_BETWEEN_DATES = "findAllFeesBetweenDates"; + String QUERY_FIND_ALL_FEES_BETWEEN_DATES_USER = "findAllFeesBetweenDatesUser"; + String QUERY_FIND_ALL_FEES_BETWEEN_DATES_ROUTE = "findAllFeesBetweenDatesRoute"; + + String FIELD_USER = "user"; + String FIELD_ROUTE = "route"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/GeneralBoxViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/GeneralBoxViewCfg.java new file mode 100644 index 0000000..586055f --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/GeneralBoxViewCfg.java @@ -0,0 +1,22 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface GeneralBoxViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_DETAILS = "findAllGeneralBoxByOffice"; + + String FIELD_OFFICE = "office"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/InformationLoanWeekViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/InformationLoanWeekViewCfg.java new file mode 100644 index 0000000..34acdae --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/InformationLoanWeekViewCfg.java @@ -0,0 +1,36 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface InformationLoanWeekViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_LOANS_THIS_WEEK_BY_OFFICE = "findAllLoanInformationThisWeekByOffice"; + String QUERY_FIND_ALL_LOANS_LAST_WEEK_BY_OFFICE = "findAllLoanInformationLastWeekByOffice"; + + String QUERY_FIND_ALL_COLOCATION_WEEK_BY_OFFICE = "findAllColocationThisWeekByOffice"; + String QUERY_FIND_ALL_COLOCATION_LAST_WEEK_BY_OFFICE = "findAllColocationLastWeekByOffice"; + + String QUERY_FIND_ALL_SUBTOTAL_WEEK_BY_OFFICE = "findAllSubtotalThisWeekByOffice"; + String QUERY_FIND_ALL_SUBTOTAL_LAST_WEEK_BY_OFFICE = "findAllSubtotalLastWeekByOffice"; + + String QUERY_FIND_ALL_RESUMEN_IN_OUT_WEEK_BY_OFFICE = "findAllResumenInOutThisWeekByOffice"; + String QUERY_FIND_ALL_RESUMEN_IN_OUT_LAST_WEEK_BY_OFFICE = "findAllResumenInOutLastWeekByOffice"; + + String QUERY_FIND_ALL_COBRANZA_WEEK_BY_OFFICE = "findAllCobranzaThisWeekByOffice"; + String QUERY_FIND_ALL_COBRANZA_LAST_WEEK_BY_OFFICE = "findAllCobranzaLastWeekByOffice"; + + String FIELD_VIEW_OFFICE = "idOffice"; + String FIELD_VIEW_OFFICE_COLOCATION = "office"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanByUserPaymentZeroViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanByUserPaymentZeroViewCfg.java new file mode 100644 index 0000000..a59e9cf --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanByUserPaymentZeroViewCfg.java @@ -0,0 +1,22 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface LoanByUserPaymentZeroViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_LOANS_PAYMENT_ZERO_BY_USER = "findAllLoansByUserPaymentZero"; + + String FIELD_VIEW_USER = "user"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanEmployeeAllDataCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanEmployeeAllDataCfg.java new file mode 100644 index 0000000..4a362b3 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanEmployeeAllDataCfg.java @@ -0,0 +1,22 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author David Rodriguez + */ +public interface LoanEmployeeAllDataCfg extends GenericCfg{ + + String QUERY_FIND_ALL_LOAN_EMPLOYEE_BY_ID = "findAllLoanEmployeeById"; + String QUERY_UPDATE_LOAN_EMPLOYEE_BY_STATUS = "updateLoanEmployeeByStatus"; + String FIELD_ID_LOAN = "idLoanEmployee"; + String FIELD_ACTIVE_STATUS = "loanEmployeeStatus"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanEmployeeDetailAllDataViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanEmployeeDetailAllDataViewCfg.java new file mode 100644 index 0000000..6188d18 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanEmployeeDetailAllDataViewCfg.java @@ -0,0 +1,29 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author David Rodriguez + */ +public interface LoanEmployeeDetailAllDataViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_LOAN_EMPLOYEE_DETAIL_BY_ID_LOAN = "findAllLoanEmployeeDetailByIdLoan"; + String QUERY_UPDATE_LOAN_EMPLOYEE_DETAIL_BY_STATUS = "updateLoanEmployeeDetailByStatus"; + String QUERY_FIND_LOAN_DETAL_TO_UPDATE = "findLoanDetailToUpdate"; + String FIELD_ID_LOAN = "idLoanEmployee"; + String FIELD_ACTIVE_STATUS = "loanEmployeeDetailStatus"; + + //LoanDetail Delete + + String FIELD_ID_USER = "idUser"; + String FIELD_CREATED_ON = "createdOn"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanEmployeeViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanEmployeeViewCfg.java new file mode 100644 index 0000000..f2eabd5 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanEmployeeViewCfg.java @@ -0,0 +1,22 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author David Rodriguez + */ +public interface LoanEmployeeViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_LOAN_EMPLOYEE_HIST = "findAllLoanEmployeeHist"; + String QUERY_FIND_ALL_LOAN_EMPLOYEE_BY_ID = "findAllLoanEmployeeByIdEmp"; + + String FIEL_LOAN_EMPLOYEE_USERID = "idUser"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanInPendingStatusToDeliveryViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanInPendingStatusToDeliveryViewCfg.java new file mode 100644 index 0000000..dd877d9 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanInPendingStatusToDeliveryViewCfg.java @@ -0,0 +1,17 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface LoanInPendingStatusToDeliveryViewCfg { + + String QUERY_FIND_ALL_LOAN_IN_PENDING_STATUS_TO_DELIVERY_VIEW = "findAllLoanInPendingStatusToDeliveryView"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanRenovationDeliveryWeeklyViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanRenovationDeliveryWeeklyViewCfg.java new file mode 100644 index 0000000..1aa07bd --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/LoanRenovationDeliveryWeeklyViewCfg.java @@ -0,0 +1,21 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface LoanRenovationDeliveryWeeklyViewCfg { + + String QUERY_FIND_LOAN_RENOVATION_DELIVERY_WEEKLY = "findAllLoanRenovationDeliveryWeekly"; + String QUERY_FIND_LOAN_RENOVATION_TOTAL_RENOVATION = "findAllLoanRenovationDeliveryWeeklyTotalRenovable"; + String QUERY_FIND_LOAN_RENOVATION_TOTAL_RENOVATION_AMOUNT = "findAllLoanRenovationDeliveryWeeklyTotalRenovableAmount"; + + String FIELD_RENOVATION= "renovation"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/MoneyDailyByUserCertifierViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/MoneyDailyByUserCertifierViewCfg.java new file mode 100644 index 0000000..9529fcf --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/MoneyDailyByUserCertifierViewCfg.java @@ -0,0 +1,22 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface MoneyDailyByUserCertifierViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_MONEY_DAILY_BY_CERTIFIER_BY_OFFICE = "findAllAmountByUserCertifierView"; + + String FIELD_VIEW_OFFICE = "idOffice"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/ResumenNewCustomerLastWeekViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/ResumenNewCustomerLastWeekViewCfg.java new file mode 100644 index 0000000..b928c29 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/ResumenNewCustomerLastWeekViewCfg.java @@ -0,0 +1,22 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author David Rodríguez Huaracha + */ +public interface ResumenNewCustomerLastWeekViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_RESUMEN_NEW_CUSTOMER = "findAllResumenNewCustomerLastWeek"; + + String FIELD_VIEW_OFFICE = "idOffice"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/ResumenNewCustomerWeekViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/ResumenNewCustomerWeekViewCfg.java new file mode 100644 index 0000000..78e96b0 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/ResumenNewCustomerWeekViewCfg.java @@ -0,0 +1,22 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author David Rodríguez Huaracha + */ +public interface ResumenNewCustomerWeekViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_RESUMEN_NEW_CUSTOMER = "findAllResumenNewCustomerWeek"; + + String FIELD_VIEW_OFFICE = "idOffice"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/ResumenTotalLastWeekViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/ResumenTotalLastWeekViewCfg.java new file mode 100644 index 0000000..e531688 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/ResumenTotalLastWeekViewCfg.java @@ -0,0 +1,22 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface ResumenTotalLastWeekViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_RESUMEN_TOTAL = "findAllResumenTotalLastWeek"; + + String FIELD_VIEW_OFFICE = "idOffice"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/ResumenTotalWeekViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/ResumenTotalWeekViewCfg.java new file mode 100644 index 0000000..91bd882 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/ResumenTotalWeekViewCfg.java @@ -0,0 +1,22 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface ResumenTotalWeekViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_RESUMEN_TOTAL = "findAllResumenTotalWeek"; + + String FIELD_VIEW_OFFICE = "idOffice"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsAdvancesViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsAdvancesViewCfg.java new file mode 100644 index 0000000..9b25416 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsAdvancesViewCfg.java @@ -0,0 +1,22 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author David Rodriguez + */ +public interface StatsAdvancesViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_ADVANCES_BETWEEN_DATES = "findAllAdvancesBetweenDates"; + String QUERY_FIND_ALL_ADVANCES_BETWEEN_DATES_ROUTE = "findAllAdvancesBetweenDatesRoute"; + + String FIELD_ROUTE = "route"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsClosingDayViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsClosingDayViewCfg.java new file mode 100644 index 0000000..4fa52ed --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsClosingDayViewCfg.java @@ -0,0 +1,22 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author David Rodriguez + */ +public interface StatsClosingDayViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_CLOSING_DAY_BETWEEN_DATES = "findAllClosingDayBetweenDates"; + String QUERY_FIND_ALL_CLOSING_DAY_BETWEEN_DATES_USER = "findAllClosingDayBetweenDatesUser"; + + String FIELD_USER = "user"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsDepositsViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsDepositsViewCfg.java new file mode 100644 index 0000000..a5a2deb --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsDepositsViewCfg.java @@ -0,0 +1,21 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author David Rodriguez + */ +public interface StatsDepositsViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_DEPOSITS_BETWEEN_DATES = "findAllDepositsBetweenDates"; + String QUERY_FIND_ALL_DEPOSITS_BETWEEN_DATES_USER = "findAllDepositsBetweenDatesUser"; + String FIELD_USER = "user"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsEmployeeSavingViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsEmployeeSavingViewCfg.java new file mode 100644 index 0000000..bce608f --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsEmployeeSavingViewCfg.java @@ -0,0 +1,22 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author David Rodriguez + */ +public interface StatsEmployeeSavingViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_EMPLOYEE_SAVING_BETWEEN_DATES = "findAllEmployeeSavingBetweenDates"; + String QUERY_FIND_ALL_EMPLOYEE_SAVING_BY_ID_BETWEEN_DATES = "findAllEmployeeSavingByIdBetweenDates"; + + String USER_ID = "idUser"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsGasolineViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsGasolineViewCfg.java new file mode 100644 index 0000000..1c79834 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsGasolineViewCfg.java @@ -0,0 +1,19 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author David Rodriguez + */ +public interface StatsGasolineViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_GASOLINE_BETWEEN_DATES = "findAllGasolineBetweenDates"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsOpeningFeesViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsOpeningFeesViewCfg.java new file mode 100644 index 0000000..5f3287a --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsOpeningFeesViewCfg.java @@ -0,0 +1,21 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author David Rodriguez + */ +public interface StatsOpeningFeesViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_OPENING_FEES_BETWEEN_DATES = "findAllOpeningFeesBetweenDates"; + String QUERY_FIND_ALL_OPENING_FEES_BETWEEN_DATES_USER = "findAllOpeningFeesBetweenDatesUser"; + String FIELD_USER = "user"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsPaymentRenovationViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsPaymentRenovationViewCfg.java new file mode 100644 index 0000000..2974203 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsPaymentRenovationViewCfg.java @@ -0,0 +1,21 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author David Rodriguez + */ +public interface StatsPaymentRenovationViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_PAYMENT_RENOVATION_BETWEEN_DATES = "findAllPaymentRenovationBetweenDates"; + String QUERY_FIND_ALL_PAYMENT_RENOVATION_BETWEEN_DATES_USER = "findAllPaymentRenovationBetweenDatesUser"; + String FIELD_USER = "user"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsPaymentRouteViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsPaymentRouteViewCfg.java new file mode 100644 index 0000000..b0b0c73 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsPaymentRouteViewCfg.java @@ -0,0 +1,22 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author David Rodriguez + */ +public interface StatsPaymentRouteViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_PAYMENT_ROUTE_BETWEEN_DATES = "findAllPaymentRouteBetweenDates"; + String QUERY_FIND_ALL_PAYMENT_ROUTE_BETWEEN_DATES_ROUTE = "findAllPaymentRouteBetweenDatesRoute"; + + String FIELD_ROUTE = "route"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsPaymentViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsPaymentViewCfg.java new file mode 100644 index 0000000..484fb7a --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsPaymentViewCfg.java @@ -0,0 +1,22 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author David Rodriguez + */ +public interface StatsPaymentViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_PAYMENT_BETWEEN_DATES = "findAllPaymentBetweenDates"; + String QUERY_FIND_ALL_PAYMENT_BETWEEN_DATES_USER = "findAllPaymentBetweenDatesUser"; + + String FIELD_USER = "user"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsPayrollViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsPayrollViewCfg.java new file mode 100644 index 0000000..125a917 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsPayrollViewCfg.java @@ -0,0 +1,22 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author David Rodriguez + */ +public interface StatsPayrollViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_PAYROLL_BETWEEN_DATES = "findAllPayrollBetweenDates"; + String QUERY_FIND_ALL_PAYROLL_BETWEEN_DATES_USER = "findAllPayrollBetweenDatesUser"; + + String FIELD_USER = "user"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsVehicleCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsVehicleCfg.java new file mode 100644 index 0000000..34fa452 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsVehicleCfg.java @@ -0,0 +1,19 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author David Rodriguez + */ +public interface StatsVehicleCfg extends GenericCfg{ + + String QUERY_FIND_ALL_VEHICLES = "findAllVehicles"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsZeroPaymentsViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsZeroPaymentsViewCfg.java new file mode 100644 index 0000000..cae2d8f --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/StatsZeroPaymentsViewCfg.java @@ -0,0 +1,21 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author David Rodriguez + */ +public interface StatsZeroPaymentsViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_ZERO_PAYMENTS_BETWEEN_DATES = "findAllZeroPaymentsBetweenDates"; + String QUERY_FIND_ALL_ZERO_PAYMENTS_BETWEEN_DATES_USER = "findAllZeroPaymentsBetweenDatesUser"; + String FIELD_USER = "user"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/TotalLoansApprovedByOfficeViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/TotalLoansApprovedByOfficeViewCfg.java new file mode 100644 index 0000000..98cdfc2 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/TotalLoansApprovedByOfficeViewCfg.java @@ -0,0 +1,22 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface TotalLoansApprovedByOfficeViewCfg extends GenericCfg{ + + String QUERY_SUM_ALL_LOANS_BY_OFFICE = "sumLoansApprovedByOffice"; + + String FIELD_VIEW_OFFICE = "idOffice"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/TotalLoansByOfficeViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/TotalLoansByOfficeViewCfg.java new file mode 100644 index 0000000..02de056 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/TotalLoansByOfficeViewCfg.java @@ -0,0 +1,25 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +import com.arrebol.apc.model.core.constance.GenericCfg; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface TotalLoansByOfficeViewCfg extends GenericCfg{ + + String QUERY_FIND_ALL_LOANS_BY_OFFICE = "findAllLoansByOfficeView"; + String QUERY_FIND_ALL_LOANS_BY_USER = "findAllLoansByUserIdSumPaymentDaily"; + String QUERY_COUNT_ALL_LOANS_BY_USER = "countAllLoansByUserIdDaily"; + + String FIELD_VIEW_OFFICE = "idOffice"; + String FIELD_VIEW_USER = "userId"; + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/views/constance/TransferInPendingStatusViewCfg.java b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/TransferInPendingStatusViewCfg.java new file mode 100644 index 0000000..a8049c2 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/views/constance/TransferInPendingStatusViewCfg.java @@ -0,0 +1,17 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.views.constance; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public interface TransferInPendingStatusViewCfg { + + String QUERY_FIND_ALL_TRANSFER_IN_PENDING_STATUS = "findAllTransferInPendingStatus"; +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/AmountJaxb.java b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/AmountJaxb.java new file mode 100644 index 0000000..4b9ab4a --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/AmountJaxb.java @@ -0,0 +1,54 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.ws.parsed; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "amount") +public class AmountJaxb { + + private String customerName; + private Double payment; + + public AmountJaxb() { + } + + public AmountJaxb(String customerName, Double payment) { + this.customerName = customerName; + this.payment = payment; + } + + @XmlElement(name = "customerName") + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + @XmlElement(name = "payment") + public Double getPayment() { + return payment; + } + + public void setPayment(Double payment) { + this.payment = payment; + } + + @Override + public String toString() { + return "AmountJaxb{" + "customerName=" + customerName + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/CashRegisterJaxb.java b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/CashRegisterJaxb.java new file mode 100644 index 0000000..5edeec9 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/CashRegisterJaxb.java @@ -0,0 +1,55 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.ws.parsed; + +import java.util.List; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "cashRegister") +public class CashRegisterJaxb { + + private Double totalCash; + private List amounts; + + public CashRegisterJaxb() { + } + + public CashRegisterJaxb(Double totalCash, List amounts) { + this.totalCash = totalCash; + this.amounts = amounts; + } + + @XmlElement(name = "totalCash") + public Double getTotalCash() { + return totalCash; + } + + public void setTotalCash(Double totalCash) { + this.totalCash = totalCash; + } + + @XmlElement(name = "amounts") + public List getAmounts() { + return amounts; + } + + public void setAmounts(List amounts) { + this.amounts = amounts; + } + + @Override + public String toString() { + return "CashRegisterJaxb{" + "amounts=" + amounts + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/ConfigurationJaxb.java b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/ConfigurationJaxb.java new file mode 100644 index 0000000..00101d5 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/ConfigurationJaxb.java @@ -0,0 +1,39 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.ws.parsed; + +import java.io.Serializable; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "configuration") +public class ConfigurationJaxb implements Serializable { + + private static final long serialVersionUID = -9152601421411768287L; + + private boolean activeButton; + + public ConfigurationJaxb() { + } + + public ConfigurationJaxb(boolean activeButton) { + this.activeButton = activeButton; + } + + public boolean isActiveButton() { + return activeButton; + } + + public void setActiveButton(boolean activeButton) { + this.activeButton = activeButton; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/Exchange.java b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/Exchange.java new file mode 100644 index 0000000..02c578f --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/Exchange.java @@ -0,0 +1,65 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.ws.parsed; + +import java.math.BigDecimal; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public class Exchange { + + private String id; + private boolean owner; + private BigDecimal amount; + private String action; + + public Exchange() { + } + + public Exchange(String id, boolean owner, BigDecimal amount, String action) { + this.id = id; + this.owner = owner; + this.amount = amount; + this.action = action; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public boolean isOwner() { + return owner; + } + + public void setOwner(boolean owner) { + this.owner = owner; + } + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/ExchangeJaxb.java b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/ExchangeJaxb.java new file mode 100644 index 0000000..a430a14 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/ExchangeJaxb.java @@ -0,0 +1,65 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.ws.parsed; + +import java.math.BigDecimal; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "exchange") +public class ExchangeJaxb { + + private String senderId; + private String receiverId; + private String officeId; + private BigDecimal amount; + + public ExchangeJaxb() { + } + + @XmlElement(name = "senderId") + public String getSenderId() { + return senderId; + } + + public void setSenderId(String senderId) { + this.senderId = senderId; + } + + @XmlElement(name = "receiverId") + public String getReceiverId() { + return receiverId; + } + + public void setReceiverId(String receiverId) { + this.receiverId = receiverId; + } + + @XmlElement(name = "officeId") + public String getOfficeId() { + return officeId; + } + + public void setOfficeId(String officeId) { + this.officeId = officeId; + } + + @XmlElement(name = "amount") + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/FeeToPayRequestJaxb.java b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/FeeToPayRequestJaxb.java new file mode 100644 index 0000000..eb77471 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/FeeToPayRequestJaxb.java @@ -0,0 +1,44 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.ws.parsed; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "feeToPay") +public class FeeToPayRequestJaxb { + + String id; + String strDateToPay; + + public FeeToPayRequestJaxb() { + } + + @XmlElement(name = "id") + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @XmlElement(name = "strDateToPay") + public String getStrDateToPay() { + return strDateToPay; + } + + public void setStrDateToPay(String strDateToPay) { + this.strDateToPay = strDateToPay; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/FeesToPayByLoanRequestJaxb.java b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/FeesToPayByLoanRequestJaxb.java new file mode 100644 index 0000000..f72070f --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/FeesToPayByLoanRequestJaxb.java @@ -0,0 +1,55 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.ws.parsed; + +import java.util.List; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "feesToPayByLoan") +public class FeesToPayByLoanRequestJaxb { + + String idLoan; + String idUser; + List feeToPayList; + + public FeesToPayByLoanRequestJaxb() { + } + + @XmlElement(name = "idLoan") + public String getIdLoan() { + return idLoan; + } + + public void setIdLoan(String idLoan) { + this.idLoan = idLoan; + } + + @XmlElement(name = "idUser") + public String getIdUser() { + return idUser; + } + + public void setIdUser(String idUser) { + this.idUser = idUser; + } + + @XmlElement(name = "feeToPayList") + public List getFeeToPayList() { + return feeToPayList; + } + + public void setFeeToPayList(List feeToPayList) { + this.feeToPayList = feeToPayList; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/LoanDetailJaxb.java b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/LoanDetailJaxb.java new file mode 100644 index 0000000..1743a64 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/LoanDetailJaxb.java @@ -0,0 +1,122 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.ws.parsed; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "loanDetail") +public class LoanDetailJaxb { + + private String paymentDate; + private double paymentOfDay; + private double toPay; + private boolean payment; + private String comment; + private String paymentType; + + public LoanDetailJaxb() { + } + + /** + * Created for add transfer accoutn payments. + * + * @param paymentDate + * @param paymentOfDay + * @param toPay + * @param comment + * @param paymentType + */ + public LoanDetailJaxb(String paymentDate, double paymentOfDay, double toPay, String comment, String paymentType) { + this.paymentDate = paymentDate; + this.paymentOfDay = paymentOfDay; + this.toPay = toPay; + this.comment = comment; + this.paymentType = paymentType; + } + + /** + * + * @param paymentDate + * @param paymentOfDay + * @param toPay + * @param payment true eq payment, false eq fee. + * @param comment + */ + public LoanDetailJaxb(String paymentDate, double paymentOfDay, double toPay, boolean payment, String comment) { + this.paymentDate = paymentDate; + this.paymentOfDay = paymentOfDay; + this.toPay = toPay; + this.payment = payment; + this.comment = comment; + } + + @XmlElement(name = "paymentDate") + public String getPaymentDate() { + return paymentDate; + } + + public void setPaymentDate(String paymentDate) { + this.paymentDate = paymentDate; + } + + @XmlElement(name = "paymentOfDay") + public double getPaymentOfDay() { + return paymentOfDay; + } + + public void setPaymentOfDay(double paymentOfDay) { + this.paymentOfDay = paymentOfDay; + } + + @XmlElement(name = "toPay") + public double getToPay() { + return toPay; + } + + public void setToPay(double toPay) { + this.toPay = toPay; + } + + @XmlElement(name = "payment") + public boolean isPayment() { + return payment; + } + + public void setPayment(boolean payment) { + this.payment = payment; + } + + @XmlElement(name = "comment") + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + @XmlElement(name = "paymentType") + public String getPaymentType() { + return paymentType; + } + + public void setPaymentType(String paymentType) { + this.paymentType = paymentType; + } + + @Override + public String toString() { + return "LoanDetailJaxb{" + "paymentDate=" + paymentDate + ", paymentOfDay=" + paymentOfDay + ", toPay=" + toPay + ", payment=" + payment + '}'; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/LoanJaxb.java b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/LoanJaxb.java new file mode 100644 index 0000000..36dfdc9 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/LoanJaxb.java @@ -0,0 +1,44 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.ws.parsed; + +import java.util.List; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "loan") +public class LoanJaxb { + + private List loanDetails; + + public LoanJaxb() { + } + + public LoanJaxb(List loanDetails) { + this.loanDetails = loanDetails; + } + + @XmlElement(name = "loanDetails") + public List getLoanDetails() { + return loanDetails; + } + + public void setLoanDetails(List loanDetails) { + this.loanDetails = loanDetails; + } + + @Override + public String toString() { + return "LoanJaxb{" + "loanDetails=" + loanDetails + '}'; + } +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/LoanRequestedJaxb.java b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/LoanRequestedJaxb.java new file mode 100644 index 0000000..0baa5f9 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/LoanRequestedJaxb.java @@ -0,0 +1,112 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.ws.parsed; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "loanRequested") +public class LoanRequestedJaxb { + + private String loanTypeId; + private String officeId; + private String userId; + private String routeId; + private PersonJaxb customer; + private PersonJaxb endorsement; + private String strDate; + private String routeIdNewClient; + + public LoanRequestedJaxb() { + } + + @XmlElement(name = "loanTypeId") + public String getLoanTypeId() { + return loanTypeId; + } + + public void setLoanTypeId(String loanTypeId) { + this.loanTypeId = loanTypeId; + } + + @XmlElement(name = "officeId") + public String getOfficeId() { + return officeId; + } + + public void setOfficeId(String officeId) { + this.officeId = officeId; + } + + @XmlElement(name = "userId") + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + @XmlElement(name = "routeId") + public String getRouteId() { + return routeId; + } + + public void setRouteId(String routeId) { + this.routeId = routeId; + } + + @XmlElement(name = "customer") + public PersonJaxb getCustomer() { + return customer; + } + + public void setCustomer(PersonJaxb customer) { + this.customer = customer; + } + + @XmlElement(name = "endorsement") + public PersonJaxb getEndorsement() { + return endorsement; + } + + public void setEndorsement(PersonJaxb endorsement) { + this.endorsement = endorsement; + } + + @XmlElement(name = "strDate") + public String getStrDate() { + return strDate; + } + + public void setStrDate(String strDate) { + this.strDate = strDate; + } + + @XmlElement(name = "routeIdNewClient") + public String getRouteIdNewClient() { + return routeIdNewClient; + } + + public String chooseRouteId() { + try { + return null == getRouteIdNewClient() || "".equals(getRouteIdNewClient()) ? getRouteId() : getRouteIdNewClient(); + } catch (Exception e) { + return getRouteId(); + } + } + + public void setRouteIdNewClient(String routeIdNewClient) { + this.routeIdNewClient = routeIdNewClient; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/NewAmountJaxb.java b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/NewAmountJaxb.java new file mode 100644 index 0000000..6b0b013 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/NewAmountJaxb.java @@ -0,0 +1,118 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.ws.parsed; + +import java.math.BigDecimal; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "newAmount") +public class NewAmountJaxb { + + private String loanId; + private String userId; + private String officeId; + private boolean customer; + private BigDecimal amount; + private String strDate; + private boolean fee; + private String comments; + private Boolean manager; + + public NewAmountJaxb() { + } + + @XmlAttribute(name = "loanId") + public String getLoanId() { + return loanId; + } + + public void setLoanId(String loanId) { + this.loanId = loanId; + } + + @XmlAttribute(name = "userId") + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + @XmlAttribute(name = "officeId") + public String getOfficeId() { + return officeId; + } + + public void setOfficeId(String officeId) { + this.officeId = officeId; + } + + @XmlAttribute(name = "customer") + public boolean isCustomer() { + return customer; + } + + public void setCustomer(boolean customer) { + this.customer = customer; + } + + @XmlAttribute(name = "amount") + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + @XmlAttribute(name = "strDate") + public String getStrDate() { + return strDate; + } + + public void setStrDate(String strDate) { + this.strDate = strDate; + } + + @XmlAttribute(name = "fee") + public boolean isFee() { + return fee; + } + + public void setFee(boolean fee) { + this.fee = fee; + } + + @XmlAttribute(name = "comments") + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + @XmlAttribute(name = "manager") + public Boolean getManager() { + if (null == manager) { + manager = false; + } + return manager; + } + + public void setManager(Boolean manager) { + this.manager = manager; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/NewTransferAccountJaxb.java b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/NewTransferAccountJaxb.java new file mode 100644 index 0000000..a765d16 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/NewTransferAccountJaxb.java @@ -0,0 +1,98 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.ws.parsed; + +import java.math.BigDecimal; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "newTransferAccount") +public class NewTransferAccountJaxb { + + private String loanId; + private String userId; + private String officeId; + private BigDecimal amount; + private String comments; + private String transferReference; + private Boolean manager; + + public NewTransferAccountJaxb() { + } + + @XmlAttribute(name = "loanId") + public String getLoanId() { + return loanId; + } + + public void setLoanId(String loanId) { + this.loanId = loanId; + } + + @XmlAttribute(name = "userId") + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + @XmlAttribute(name = "officeId") + public String getOfficeId() { + return officeId; + } + + public void setOfficeId(String officeId) { + this.officeId = officeId; + } + + @XmlAttribute(name = "amount") + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + @XmlAttribute(name = "comments") + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + @XmlAttribute(name = "transferReference") + public String getTransferReference() { + return transferReference; + } + + public void setTransferReference(String transferReference) { + this.transferReference = transferReference; + } + + @XmlAttribute(name = "manager") + public Boolean getManager() { + if (null == manager) { + manager = false; + } + return manager; + } + + public void setManager(Boolean manager) { + this.manager = manager; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/PersonJaxb.java b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/PersonJaxb.java new file mode 100644 index 0000000..679ce08 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/PersonJaxb.java @@ -0,0 +1,144 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.ws.parsed; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "person") +public class PersonJaxb { + + private String id; + private String firstName; + private String secondName; + private String lastName; + private String middleName; + private String addressHome; + private String addressWork; + private String phoneHome; + private String phoneWork; + private String thumbnail; + private String companyName; + private boolean createPerson; + + public PersonJaxb() { + } + + @XmlElement(name = "id") + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @XmlElement(name = "firstName") + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + @XmlElement(name = "secondName") + public String getSecondName() { + return secondName; + } + + public void setSecondName(String secondName) { + this.secondName = secondName; + } + + @XmlElement(name = "lastName") + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + @XmlElement(name = "middleName") + public String getMiddleName() { + return middleName; + } + + public void setMiddleName(String middleName) { + this.middleName = middleName; + } + + @XmlElement(name = "addressHome") + public String getAddressHome() { + return addressHome; + } + + public void setAddressHome(String addressHome) { + this.addressHome = addressHome; + } + + @XmlElement(name = "addressWork") + public String getAddressWork() { + return addressWork; + } + + public void setAddressWork(String addressWork) { + this.addressWork = addressWork; + } + + @XmlElement(name = "phoneHome") + public String getPhoneHome() { + return phoneHome; + } + + public void setPhoneHome(String phoneHome) { + this.phoneHome = phoneHome; + } + + @XmlElement(name = "phoneWork") + public String getPhoneWork() { + return phoneWork; + } + + public void setPhoneWork(String phoneWork) { + this.phoneWork = phoneWork; + } + + @XmlElement(name = "thumbnail") + public String getThumbnail() { + return thumbnail; + } + + public void setThumbnail(String thumbnail) { + this.thumbnail = thumbnail; + } + + @XmlElement(name = "companyName") + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + @XmlElement(name = "createPerson") + public boolean isCreatePerson() { + return createPerson; + } + + public void setCreatePerson(boolean createPerson) { + this.createPerson = createPerson; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/RenovationWithEndorsementJaxb.java b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/RenovationWithEndorsementJaxb.java new file mode 100644 index 0000000..8be9909 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/RenovationWithEndorsementJaxb.java @@ -0,0 +1,104 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.ws.parsed; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "renovationWithEndorsement") +public class RenovationWithEndorsementJaxb { + + private String loan; + private String credit; + private String user; + private String office; + private double amount; + private String currentOwner; + private PersonJaxb endorsement; + private boolean hasPaymentToday; + + public RenovationWithEndorsementJaxb() { + } + + @XmlElement(name = "loan") + public String getLoan() { + return loan; + } + + public void setLoan(String loan) { + this.loan = loan; + } + + @XmlElement(name = "credit") + public String getCredit() { + return credit; + } + + public void setCredit(String credit) { + this.credit = credit; + } + + @XmlElement(name = "user") + public String getUser() { + return user; + } + + public void setUser(String user) { + this.user = user; + } + + @XmlElement(name = "office") + public String getOffice() { + return office; + } + + public void setOffice(String office) { + this.office = office; + } + + @XmlElement(name = "amount") + public double getAmount() { + return amount; + } + + public void setAmount(double amount) { + this.amount = amount; + } + + @XmlElement(name = "currentOwner") + public String getCurrentOwner() { + return currentOwner; + } + + public void setCurrentOwner(String currentOwner) { + this.currentOwner = currentOwner; + } + + @XmlElement(name = "endorsement") + public PersonJaxb getEndorsement() { + return endorsement; + } + + public void setEndorsement(PersonJaxb endorsement) { + this.endorsement = endorsement; + } + + @XmlElement(name = "hasPaymentToday") + public boolean isHasPaymentToday() { + return hasPaymentToday; + } + + public void setHasPaymentToday(boolean hasPaymentToday) { + this.hasPaymentToday = hasPaymentToday; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/ThumbnailJaxb.java b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/ThumbnailJaxb.java new file mode 100644 index 0000000..fc29062 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/model/ws/parsed/ThumbnailJaxb.java @@ -0,0 +1,48 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.model.ws.parsed; + +import java.io.InputStream; +import java.io.Serializable; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@XmlRootElement(name = "thumbnail") +public class ThumbnailJaxb implements Serializable { + + private static final long serialVersionUID = -2300144785732796661L; + + private String name; + private InputStream file; + + public ThumbnailJaxb() { + } + + @XmlElement(name = "name") + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @XmlElement(name = "file") + public InputStream getFile() { + return file; + } + + public void setFile(InputStream file) { + this.file = file; + } + +} diff --git a/apc-model/src/main/java/com/arrebol/apc/test/ArrebolTest.java b/apc-model/src/main/java/com/arrebol/apc/test/ArrebolTest.java new file mode 100644 index 0000000..dd64d12 --- /dev/null +++ b/apc-model/src/main/java/com/arrebol/apc/test/ArrebolTest.java @@ -0,0 +1,82 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.test; + +import java.io.Serializable; +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.GenericGenerator; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Entity +@Table(name = "ARREBOL_TEST") +public class ArrebolTest implements Serializable { + + private static final long serialVersionUID = -4942816498584779625L; + + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + @Column(name = "id", length = 36) + private String id; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "created_on", length = 19) + private Date createdOn; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_updated_on", length = 19) + private Date lastUpdatedOn; + + public ArrebolTest() { + } + + public ArrebolTest(Date createdOn, Date lastUpdatedOn) { + this.createdOn = createdOn; + this.lastUpdatedOn = lastUpdatedOn; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public Date getLastUpdatedOn() { + return lastUpdatedOn; + } + + public void setLastUpdatedOn(Date lastUpdatedOn) { + this.lastUpdatedOn = lastUpdatedOn; + } + + @Override + public String toString() { + return "ArrebolTest{" + "id=" + id + ", createdOn=" + createdOn + ", lastUpdatedOn=" + lastUpdatedOn + '}'; + } + +} diff --git a/apc-model/src/main/resources/apc.cfg.xml b/apc-model/src/main/resources/apc.cfg.xml new file mode 100644 index 0000000..6216683 --- /dev/null +++ b/apc-model/src/main/resources/apc.cfg.xml @@ -0,0 +1,227 @@ + + + + + org.hibernate.dialect.MySQLDialect + com.mysql.cj.jdbc.Driver + ${hibernate.connection.url} + ${hibernate.connection.username} + ${hibernate.connection.password} + ${hibernate.connection.min_size} + ${hibernate.connection.max_size} + ${hibernate.connection.timeout} + ${hibernate.connection.max_statements} + 3000 + false + false + true + thread + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/catalog/queries/people.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/catalog/queries/people.queries.hbm.xml new file mode 100644 index 0000000..52cf937 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/catalog/queries/people.queries.hbm.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/catalog/queries/roles.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/catalog/queries/roles.queries.hbm.xml new file mode 100644 index 0000000..7c1fb14 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/catalog/queries/roles.queries.hbm.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/catalog/queries/routes.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/catalog/queries/routes.queries.hbm.xml new file mode 100644 index 0000000..01f6252 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/catalog/queries/routes.queries.hbm.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/advance.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/advance.queries.hbm.xml new file mode 100644 index 0000000..c593942 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/advance.queries.hbm.xml @@ -0,0 +1,41 @@ + + + + + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(createdOn) + ORDER BY createdOn + ]]> + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/bitacora.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/bitacora.queries.hbm.xml new file mode 100644 index 0000000..c2bf3e5 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/bitacora.queries.hbm.xml @@ -0,0 +1,28 @@ + + + + + + + + + + = DATE(:startDate) + AND DATE(:endDate) >= DATE(created_on) + ORDER BY createdOn DESC + ]]> + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/bonus.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/bonus.queries.hbm.xml new file mode 100644 index 0000000..c18cce4 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/bonus.queries.hbm.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(b.createdOn) + ORDER BY b.createdOn + ]]> + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/closing.day.detail.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/closing.day.detail.queries.hbm.xml new file mode 100644 index 0000000..c4f6ed0 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/closing.day.detail.queries.hbm.xml @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/closing_day.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/closing_day.queries.hbm.xml new file mode 100644 index 0000000..96cc9ba --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/closing_day.queries.hbm.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/expense.company.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/expense.company.queries.hbm.xml new file mode 100644 index 0000000..418c214 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/expense.company.queries.hbm.xml @@ -0,0 +1,43 @@ + + + + + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(createdOn) + ORDER BY createdOn DESC + ]]> + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/goal.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/goal.queries.hbm.xml new file mode 100644 index 0000000..e6a9f5a --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/goal.queries.hbm.xml @@ -0,0 +1,42 @@ + + + + + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(createdOn) + ORDER BY createdOn + ]]> + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/money.daily.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/money.daily.queries.hbm.xml new file mode 100644 index 0000000..d080173 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/money.daily.queries.hbm.xml @@ -0,0 +1,43 @@ + + + + + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(m.createdOn) + ORDER BY m.createdOn DESC + ]]> + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(m.createdOn) AND + m.user = :user + ORDER BY m.createdOn DESC + ]]> + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/other.expense.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/other.expense.queries.hbm.xml new file mode 100644 index 0000000..ae3183a --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/other.expense.queries.hbm.xml @@ -0,0 +1,43 @@ + + + + + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(e.createdOn) + ORDER BY e.createdOn DESC + ]]> + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(e.createdOn) AND + user = :user + ORDER BY e.createdOn DESC + ]]> + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/stable.general.box.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/stable.general.box.queries.hbm.xml new file mode 100644 index 0000000..b4aee08 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/stable.general.box.queries.hbm.xml @@ -0,0 +1,92 @@ + + + + + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(createdOn) AND + active_status = 'ENEBLED' + ORDER BY createdOn DESC + ]]> + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/stable.small.box.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/stable.small.box.queries.hbm.xml new file mode 100644 index 0000000..3552dc6 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/stable.small.box.queries.hbm.xml @@ -0,0 +1,80 @@ + + + + + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(createdOn) + ORDER BY createdOn DESC + ]]> + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/transfer.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/transfer.queries.hbm.xml new file mode 100644 index 0000000..fe07a98 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/admin/transfer.queries.hbm.xml @@ -0,0 +1,100 @@ + + + + + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(createdOn) + ORDER BY createdOn + ]]> + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/core/human.resource.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/core/human.resource.queries.hbm.xml new file mode 100644 index 0000000..2dd9a27 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/core/human.resource.queries.hbm.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/core/mobile.user.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/core/mobile.user.queries.hbm.xml new file mode 100644 index 0000000..620a689 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/core/mobile.user.queries.hbm.xml @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/core/office.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/core/office.queries.hbm.xml new file mode 100644 index 0000000..1e299d7 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/core/office.queries.hbm.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/core/permission.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/core/permission.queries.hbm.xml new file mode 100644 index 0000000..0b4d8c7 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/core/permission.queries.hbm.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/core/user.by.office.has.permission.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/core/user.by.office.has.permission.queries.hbm.xml new file mode 100644 index 0000000..8841c93 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/core/user.by.office.has.permission.queries.hbm.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/core/user.by.office.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/core/user.by.office.queries.hbm.xml new file mode 100644 index 0000000..446e1fa --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/core/user.by.office.queries.hbm.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/core/user.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/core/user.queries.hbm.xml new file mode 100644 index 0000000..bf1475a --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/core/user.queries.hbm.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/delivery.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/delivery.queries.hbm.xml new file mode 100644 index 0000000..5093589 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/delivery.queries.hbm.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.by.renovation.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.by.renovation.queries.hbm.xml new file mode 100644 index 0000000..a47c73a --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.by.renovation.queries.hbm.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.by.user.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.by.user.queries.hbm.xml new file mode 100644 index 0000000..0fbf585 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.by.user.queries.hbm.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.details.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.details.queries.hbm.xml new file mode 100644 index 0000000..8e4ad9d --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.details.queries.hbm.xml @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.employee.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.employee.hbm.xml new file mode 100644 index 0000000..2ecd466 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.employee.hbm.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.fee.notification.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.fee.notification.queries.hbm.xml new file mode 100644 index 0000000..8f7f2d2 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.fee.notification.queries.hbm.xml @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.queries.hbm.xml new file mode 100644 index 0000000..7b85383 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.queries.hbm.xml @@ -0,0 +1,495 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + AND l.loanStatus = 'APPROVED' + AND (l.amountToPay - l.amountPaid) > 0 + ORDER BY + l.createdOn + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(l.fecha) + ORDER BY l.fecha + ]]> + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(l.fechaJuridico) + ORDER BY l.fecha + ]]> + + + + + + + + + + + + + + + + + + + + = lt.paymentDaily + THEN + lt.paymentDaily + ELSE + (l.amountToPay - l.amountPaid) + END + )AS paymentDaily, + lt.fee AS fee, + (SELECT count(notificationNumber) FROM LoanFeeNotification WHERE loan = l.id) AS notificationNumber, + ( + CASE + WHEN + l.amountPaid >= (SELECT FLOOR(lt.paymentTotal * .6364) FROM LoanType WHERE id = l.loanType) + THEN + CASE + WHEN + (SELECT COUNT(notificationNumber) as total + FROM LoanFeeNotification + WHERE loan = l.id + ) < 4 + THEN 'ENEBLED' + WHEN + (SELECT count(notificationNumber) as total + FROM LoanFeeNotification + WHERE loan = l.id + ) BETWEEN 4 AND 5 + AND + (SELECT COUNT(lt_inner.id) + FROM Loan l_inner + INNER JOIN LoanType lt_inner ON l_inner.loanType = lt_inner.id + WHERE l_inner.id = l.id AND + lt.payment <= lt_inner.payment - 1000) > 0 + THEN 'ENEBLED' + ELSE 'DISABLED' + END + ELSE + 'DISABLED' + END + ) AS renovation, + (SELECT amountToPay - amountPaid FROM Loan WHERE id = l.id) AS maxAmountToPay, + ( + CASE + WHEN + (SELECT COUNT(count_ld.id) FROM LoanDetails count_ld WHERE count_ld.loan = l.id AND DATE(count_ld.createdOn) = CURDATE()) > 0 + THEN + 1 + ELSE + 0 + END + ) AS hasPaymentToday, + l.id AS loanId, + ( + SELECT + inner_lby.user.id + FROM + LoanByUser inner_lby + INNER JOIN + Loan inner_l ON inner_lby.loan = inner_l.id + WHERE + inner_l.loanStatus = 'APPROVED' AND + inner_lby.ownerLoan = 'CURRENT_OWNER' AND + inner_lby.loan = l.id + ) AS currentOwner + FROM + LoanByUser lbu + INNER JOIN Loan l ON lbu.loan = l.id + INNER JOIN LoanType lt ON l.loanType = lt.id + INNER JOIN People cstmr ON l.customer = cstmr.id + INNER JOIN People ndrsmnt ON l.endorsement = ndrsmnt.id + WHERE + l.customer = :customer AND + l.loanStatus = 'APPROVED' AND + 1 = (CASE + WHEN + (SELECT COUNT(case_l.id) AS TOTAL + FROM Loan case_l + INNER JOIN LoanByUser case_lbu ON case_l.id = case_lbu.loan + WHERE + case_l.customer = :customer AND + case_l.loanStatus = 'APPROVED' AND + case_lbu.ownerLoan = 'CURRENT_OWNER' AND + case_lbu.user = :user + + ) = 1 + THEN + 1 + WHEN + l.routeCtlg IN (SELECT case_hrhr.routeCtlg + FROM HumanResourceHasRoute case_hrhr + INNER JOIN User case_u ON case_hrhr.humanResource = case_u.humanResource + WHERE + case_u.id = :id AND + case_u.certifier = 'ENEBLED') + THEN + 1 + ELSE + 0 + END) + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.type.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.type.queries.hbm.xml new file mode 100644 index 0000000..8b96da1 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/loan/loan.type.queries.hbm.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/gasoline/gasoline.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/gasoline/gasoline.hbm.xml new file mode 100644 index 0000000..33242f8 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/gasoline/gasoline.hbm.xml @@ -0,0 +1,23 @@ + + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/preference/user.mobile.preference.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/preference/user.mobile.preference.queries.hbm.xml new file mode 100644 index 0000000..cd593c7 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/preference/user.mobile.preference.queries.hbm.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/reports/user.week.report.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/reports/user.week.report.hbm.xml new file mode 100644 index 0000000..296a849 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/reports/user.week.report.hbm.xml @@ -0,0 +1,20 @@ + + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/available.customers.view.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/available.customers.view.queries.hbm.xml new file mode 100644 index 0000000..9284cb4 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/available.customers.view.queries.hbm.xml @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/available.endorsements.view.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/available.endorsements.view.queries.hbm.xml new file mode 100644 index 0000000..8a471bf --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/available.endorsements.view.queries.hbm.xml @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/availables.owners.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/availables.owners.view.hbm.xml new file mode 100644 index 0000000..9e7c932 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/availables.owners.view.hbm.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/cash.register.curdate.by.user.view.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/cash.register.curdate.by.user.view.queries.hbm.xml new file mode 100644 index 0000000..492081d --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/cash.register.curdate.by.user.view.queries.hbm.xml @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/current.customer.by.loan.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/current.customer.by.loan.view.hbm.xml new file mode 100644 index 0000000..4794c46 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/current.customer.by.loan.view.hbm.xml @@ -0,0 +1,19 @@ + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/exchange.enebled.users.view.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/exchange.enebled.users.view.queries.hbm.xml new file mode 100644 index 0000000..c928e43 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/exchange.enebled.users.view.queries.hbm.xml @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/loan.approved.detail.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/loan.approved.detail.view.hbm.xml new file mode 100644 index 0000000..8ec52b2 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/loan.approved.detail.view.hbm.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/loan.by.user.order.preference.view.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/loan.by.user.order.preference.view.queries.hbm.xml new file mode 100644 index 0000000..57c4acf --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/loan.by.user.order.preference.view.queries.hbm.xml @@ -0,0 +1,18 @@ + + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/loan.by.user.view.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/loan.by.user.view.queries.hbm.xml new file mode 100644 index 0000000..7846824 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/loan.by.user.view.queries.hbm.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/loan.in.pending.status.to.delivery.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/loan.in.pending.status.to.delivery.view.hbm.xml new file mode 100644 index 0000000..23b43dc --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/loan.in.pending.status.to.delivery.view.hbm.xml @@ -0,0 +1,20 @@ + + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/loan.to.delivery.by.ciertifier.view.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/loan.to.delivery.by.ciertifier.view.queries.hbm.xml new file mode 100644 index 0000000..2a0f54e --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/loan.to.delivery.by.ciertifier.view.queries.hbm.xml @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/person.search.detail.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/person.search.detail.view.hbm.xml new file mode 100644 index 0000000..5093589 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/person.search.detail.view.hbm.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/person.search.historical.details.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/person.search.historical.details.view.hbm.xml new file mode 100644 index 0000000..4fe154a --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/person.search.historical.details.view.hbm.xml @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/person.search.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/person.search.view.hbm.xml new file mode 100644 index 0000000..cf19b32 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/person.search.view.hbm.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/total.cash.by.curdate.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/total.cash.by.curdate.view.hbm.xml new file mode 100644 index 0000000..a227b3c --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/mobile/views/total.cash.by.curdate.view.hbm.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/payroll/payroll.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/payroll/payroll.queries.hbm.xml new file mode 100644 index 0000000..f89e04f --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/payroll/payroll.queries.hbm.xml @@ -0,0 +1,201 @@ + + + + + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(createdOn) + ORDER BY createdOn DESC + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/payroll/total.expected.payment.daily.by.user.queries.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/payroll/total.expected.payment.daily.by.user.queries.hbm.xml new file mode 100644 index 0000000..03052b9 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/payroll/total.expected.payment.daily.by.user.queries.hbm.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/administration.person.serch.view.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/administration.person.serch.view.xml new file mode 100644 index 0000000..c92cf67 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/administration.person.serch.view.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/advance.user.daily.detail.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/advance.user.daily.detail.view.hbm.xml new file mode 100644 index 0000000..f2e5cf0 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/advance.user.daily.detail.view.hbm.xml @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/advance.user.daily.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/advance.user.daily.view.hbm.xml new file mode 100644 index 0000000..468b34b --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/advance.user.daily.view.hbm.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/customer.without.renovation.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/customer.without.renovation.view.hbm.xml new file mode 100644 index 0000000..5cbfc4a --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/customer.without.renovation.view.hbm.xml @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/enabled.user.details.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/enabled.user.details.view.hbm.xml new file mode 100644 index 0000000..fb1e0df --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/enabled.user.details.view.hbm.xml @@ -0,0 +1,24 @@ + + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/general.box.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/general.box.view.hbm.xml new file mode 100644 index 0000000..633fc1a --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/general.box.view.hbm.xml @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/information.loan.last.week.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/information.loan.last.week.view.hbm.xml new file mode 100644 index 0000000..805147d --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/information.loan.last.week.view.hbm.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/information.loan.week.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/information.loan.week.view.hbm.xml new file mode 100644 index 0000000..f7d3ed3 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/information.loan.week.view.hbm.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/loan.by.user.payment.zero.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/loan.by.user.payment.zero.view.hbm.xml new file mode 100644 index 0000000..54e0c6a --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/loan.by.user.payment.zero.view.hbm.xml @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/loan.employee.detail.all.data.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/loan.employee.detail.all.data.view.hbm.xml new file mode 100644 index 0000000..13b1f75 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/loan.employee.detail.all.data.view.hbm.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/loan.employee.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/loan.employee.view.hbm.xml new file mode 100644 index 0000000..65cc817 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/loan.employee.view.hbm.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/loan.renovation.devilery.weekly.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/loan.renovation.devilery.weekly.view.hbm.xml new file mode 100644 index 0000000..a168f2f --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/loan.renovation.devilery.weekly.view.hbm.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/money.daily.by.user.certifier.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/money.daily.by.user.certifier.view.hbm.xml new file mode 100644 index 0000000..26bc378 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/money.daily.by.user.certifier.view.hbm.xml @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/payment.detail.from.user.by.curdate.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/payment.detail.from.user.by.curdate.view.hbm.xml new file mode 100644 index 0000000..f45b768 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/payment.detail.from.user.by.curdate.view.hbm.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/resumen.new.customer.last.week.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/resumen.new.customer.last.week.view.hbm.xml new file mode 100644 index 0000000..d790893 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/resumen.new.customer.last.week.view.hbm.xml @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/resumen.new.customer.week.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/resumen.new.customer.week.view.hbm.xml new file mode 100644 index 0000000..0386697 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/resumen.new.customer.week.view.hbm.xml @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/resumen.total.last.week.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/resumen.total.last.week.view.hbm.xml new file mode 100644 index 0000000..6f1ae3e --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/resumen.total.last.week.view.hbm.xml @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/resumen.total.week.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/resumen.total.week.view.hbm.xml new file mode 100644 index 0000000..ca6c87e --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/resumen.total.week.view.hbm.xml @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.advances.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.advances.view.hbm.xml new file mode 100644 index 0000000..375cf45 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.advances.view.hbm.xml @@ -0,0 +1,31 @@ + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) + ORDER BY created_on DESC + ]]> + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) AND + idRoute = :route + ORDER BY created_on DESC + ]]> + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.closing.day.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.closing.day.view.hbm.xml new file mode 100644 index 0000000..93853cb --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.closing.day.view.hbm.xml @@ -0,0 +1,31 @@ + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) + ORDER BY created_on DESC + ]]> + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) AND + idUser = :user + ORDER BY created_on DESC + ]]> + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.deposits.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.deposits.view.hbm.xml new file mode 100644 index 0000000..73d9254 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.deposits.view.hbm.xml @@ -0,0 +1,31 @@ + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) + ORDER BY created_on DESC + ]]> + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) AND + idUser = :user + ORDER BY created_on DESC + ]]> + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.employee.saving.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.employee.saving.view.hbm.xml new file mode 100644 index 0000000..c51338c --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.employee.saving.view.hbm.xml @@ -0,0 +1,31 @@ + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) + ORDER BY created_on DESC + ]]> + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) + AND id_user = :idUser + ORDER BY created_on DESC + ]]> + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.fees.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.fees.view.hbm.xml new file mode 100644 index 0000000..b56a963 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.fees.view.hbm.xml @@ -0,0 +1,44 @@ + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) + ORDER BY created_on DESC + ]]> + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) AND + idUser = :user + ORDER BY created_on DESC + ]]> + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) AND + idRoute = :route + ORDER BY created_on DESC + ]]> + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.gasoline.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.gasoline.view.hbm.xml new file mode 100644 index 0000000..8939642 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.gasoline.view.hbm.xml @@ -0,0 +1,18 @@ + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) + ORDER BY created_on DESC + ]]> + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.opening.fees.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.opening.fees.view.hbm.xml new file mode 100644 index 0000000..1b4f5d4 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.opening.fees.view.hbm.xml @@ -0,0 +1,31 @@ + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) + ORDER BY created_on DESC + ]]> + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) AND + idUser = :user + ORDER BY created_on DESC + ]]> + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.payment.renovation.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.payment.renovation.view.hbm.xml new file mode 100644 index 0000000..481d931 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.payment.renovation.view.hbm.xml @@ -0,0 +1,31 @@ + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) + ORDER BY created_on DESC + ]]> + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) AND + idUser = :user + ORDER BY created_on DESC + ]]> + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.payment.route.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.payment.route.view.hbm.xml new file mode 100644 index 0000000..3f0f1a0 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.payment.route.view.hbm.xml @@ -0,0 +1,31 @@ + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) + ORDER BY created_on DESC + ]]> + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) AND + idRoute = :route + ORDER BY created_on DESC + ]]> + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.payment.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.payment.view.hbm.xml new file mode 100644 index 0000000..9d30582 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.payment.view.hbm.xml @@ -0,0 +1,31 @@ + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) + ORDER BY created_on DESC + ]]> + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) AND + idUser = :user + ORDER BY created_on DESC + ]]> + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.payroll.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.payroll.view.hbm.xml new file mode 100644 index 0000000..cdf5d4b --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.payroll.view.hbm.xml @@ -0,0 +1,31 @@ + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) + ORDER BY created_on DESC + ]]> + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) AND + idUser = :user + ORDER BY created_on DESC + ]]> + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.vehicle.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.vehicle.view.hbm.xml new file mode 100644 index 0000000..9f5a1f8 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.vehicle.view.hbm.xml @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.zero.payments.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.zero.payments.view.hbm.xml new file mode 100644 index 0000000..e45d6f4 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/stats.zero.payments.view.hbm.xml @@ -0,0 +1,31 @@ + + + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) + ORDER BY created_on DESC + ]]> + + + + = DATE(:startDate) AND + DATE(:endDate) >= DATE(created_on) AND + idUser = :user + ORDER BY created_on DESC + ]]> + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/total.closing.daily.detail.from.user.by.curdate.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/total.closing.daily.detail.from.user.by.curdate.view.hbm.xml new file mode 100644 index 0000000..0cd4796 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/total.closing.daily.detail.from.user.by.curdate.view.hbm.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/total.closing.day.by.curdate.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/total.closing.day.by.curdate.view.hbm.xml new file mode 100644 index 0000000..525bcf0 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/total.closing.day.by.curdate.view.hbm.xml @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/total.loans.approved.by.office.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/total.loans.approved.by.office.view.hbm.xml new file mode 100644 index 0000000..74dbe53 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/total.loans.approved.by.office.view.hbm.xml @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/total.loans.by.office.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/total.loans.by.office.view.hbm.xml new file mode 100644 index 0000000..35ebd64 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/total.loans.by.office.view.hbm.xml @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/transfer.in.pending.status.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/transfer.in.pending.status.view.hbm.xml new file mode 100644 index 0000000..7a1a1e8 --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/transfer.in.pending.status.view.hbm.xml @@ -0,0 +1,20 @@ + + + + + + + + + + \ No newline at end of file diff --git a/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/user.by.route.view.hbm.xml b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/user.by.route.view.hbm.xml new file mode 100644 index 0000000..5ecc37e --- /dev/null +++ b/apc-model/src/main/resources/com/arrebol/apc/model/queries/view/user.by.route.view.hbm.xml @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/apc-security/nb-configuration.xml b/apc-security/nb-configuration.xml new file mode 100644 index 0000000..a65c451 --- /dev/null +++ b/apc-security/nb-configuration.xml @@ -0,0 +1,18 @@ + + + + + + JDK_1.8 + + diff --git a/apc-security/pom.xml b/apc-security/pom.xml new file mode 100644 index 0000000..1006412 --- /dev/null +++ b/apc-security/pom.xml @@ -0,0 +1,57 @@ + + + 4.0.0 + com.arrebol + apc-security + 1.0.0 + jar + + UTF-8 + 1.8 + 1.8 + 2.17.0 + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12.4 + + true + + + + + + + + org.apache.logging.log4j + log4j-api + ${log4j.version} + + + org.apache.logging.log4j + log4j-core + ${log4j.version} + + + + junit + junit + 4.12 + test + + + \ No newline at end of file diff --git a/apc-security/src/main/java/com/arrebol/apc/security/APCSecure.java b/apc-security/src/main/java/com/arrebol/apc/security/APCSecure.java new file mode 100644 index 0000000..177acb6 --- /dev/null +++ b/apc-security/src/main/java/com/arrebol/apc/security/APCSecure.java @@ -0,0 +1,68 @@ +package com.arrebol.apc.security; + +import java.nio.charset.Charset; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.xml.bind.DatatypeConverter; + +/** + * + * @author Picasso + */ +public class APCSecure { + + private static final String DIGEST_METHOD = "SHA-256"; + private static final String ENCODING = "UTF-8"; + private static final String[] SECRET = {"Capoeira", "CaperucitaRoja", "Guardian"}; + + private final String app; + private String password; + + public APCSecure(String app, String password) { + this.app = app; + this.password = password; + } + + public String getPassword() { + MessageDigest md = null; + StringBuilder builder = new StringBuilder().append(SECRET[0].charAt(SECRET[0].length() - 2)); + + try { + md = MessageDigest.getInstance(DIGEST_METHOD); + + builder.append(password.charAt(1)); + builder.append(password.charAt(password.length() - 2)); + builder.append(password); + builder.append(SECRET[1]); + builder.append(password.charAt(0)); + builder.append(password.charAt(password.length() - 1)); + + for (int i = app.length(); i > 0; i--) { + builder.append(app.charAt(i - 1)); + } + + for (int i = SECRET[0].length(); i > 0; i--) { + builder.append(SECRET[0].charAt(i - 1)); + } + + for (int i = password.length(); i > 0; i--) { + builder.append(password.charAt(i - 1)); + } + + for (int i = 0; i < SECRET[2].length(); i++) { + builder.append(SECRET[2].charAt(i)); + } + + byte[] digest = md.digest(builder.toString().getBytes(Charset.forName(ENCODING))); + + return this.password = DatatypeConverter.printHexBinary(digest).toUpperCase(); + + } catch (NoSuchAlgorithmException ex) { + Logger.getLogger(APCSecure.class.getName()).log(Level.SEVERE, null, ex); + return ""; + } + } + +} diff --git a/apc-security/src/main/resources/log4j2.xml b/apc-security/src/main/resources/log4j2.xml new file mode 100644 index 0000000..4b01a88 --- /dev/null +++ b/apc-security/src/main/resources/log4j2.xml @@ -0,0 +1,19 @@ + + + + + + %d{dd-MM-yyyy HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-security/src/test/java/com/arrebol/apc/security/APCSecureTest.java b/apc-security/src/test/java/com/arrebol/apc/security/APCSecureTest.java new file mode 100644 index 0000000..d39de3a --- /dev/null +++ b/apc-security/src/test/java/com/arrebol/apc/security/APCSecureTest.java @@ -0,0 +1,40 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.security; + +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.*; + +/** + * + * @author Picasso + */ +public class APCSecureTest { + + private static final String APP_NAME = "ApoyoAProyectosComerciales"; + private static final String PASSWORD = "12345678"; + private APCSecure apcSecure; + + public APCSecureTest() { + } + + @Before + public void setUp() { + this.apcSecure = new APCSecure(APP_NAME, PASSWORD); + } + + @Test + public void getPassword() { + try { + String pwd = apcSecure.getPassword(); + System.out.println(pwd); + assertNotNull(pwd); + } catch (Exception e) { + } + } + +} diff --git a/apc-web/faces-config.NavData b/apc-web/faces-config.NavData new file mode 100644 index 0000000..298bfc5 --- /dev/null +++ b/apc-web/faces-config.NavData @@ -0,0 +1,6 @@ + + + + + + diff --git a/apc-web/faces-config_old.NavData b/apc-web/faces-config_old.NavData new file mode 100644 index 0000000..e69de29 diff --git a/apc-web/nb-configuration.xml b/apc-web/nb-configuration.xml new file mode 100644 index 0000000..6b661f9 --- /dev/null +++ b/apc-web/nb-configuration.xml @@ -0,0 +1,28 @@ + + + + + + 1.8-web + Tomcat + true + JDK_1.8 + JSP + /less:/css + false + false + + + /scss:/css + + diff --git a/apc-web/pom.xml b/apc-web/pom.xml new file mode 100644 index 0000000..c607c5c --- /dev/null +++ b/apc-web/pom.xml @@ -0,0 +1,204 @@ + + + 4.0.0 + + com.arrebol + apc-web + 1.0.0 + war + + apc-web + + + ${project.build.directory}/endorsed + UTF-8 + 2.17.0 + + + + + javax + javaee-api + 8.0 + provided + + + + org.apache.tomcat + tomcat-dbcp + 8.5.35 + + + + org.apache.poi + poi + 4.0.1 + + + + org.apache.logging.log4j + log4j-api + ${log4j.version} + + + org.apache.logging.log4j + log4j-core + ${log4j.version} + + + org.apache.logging.log4j + log4j-slf4j-impl + ${log4j.version} + + + + com.arrebol + apc-layout + 1.0.0 + jar + + + com.arrebol + apc-controller + 1.0.0 + jar + + + com.arrebol + apc-security + 1.0.0 + jar + + + org.apache.logging.log4j + log4j-api + + + org.apache.logging.log4j + log4j-core + + + + + + com.itextpdf + itextpdf + 5.5.13.3 + + + + com.twilio.sdk + twilio + 9.0.0-rc.2 + + + + + + Localhost + + jdbc:mysql://localhost:3306/apo_pro_com_april_ten?serverTimezone=GMT-5 + apoprocomlocalhost + Yj$2Da0z! + + + + Amazon-Web-Services + + jdbc:mysql://apoyoaproyectoscomerciales.c9hicmk2emj3.us-east-2.rds.amazonaws.com:3306/apo_pro_com_april_ten + apoprocom + Yj$2Da0z! + + + + Amazon-Web-Services-Test + + jdbc:mysql://apc.clwlkknfqkjh.us-east-2.rds.amazonaws.com:3306/apo_pro_com_april_ten + apoprocom + Yj$2Da0z! + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + ${endorsed.dir} + + + + + org.apache.maven.plugins + maven-war-plugin + 2.3 + + + + src/main/webapp/META-INF + true + META-INF + + + false + + + + org.apache.maven.plugins + maven-dependency-plugin + 2.6 + + + validate + + copy + + + ${endorsed.dir} + true + + + javax + javaee-api + 8.0 + jar + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12.4 + + true + + + + + + diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/Datatable.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/Datatable.java new file mode 100644 index 0000000..d43e57d --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/Datatable.java @@ -0,0 +1,30 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans; + +import java.util.List; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +public interface Datatable { + + public void editRow(RowEditEvent event); + + public void onRowCancel(RowEditEvent event); + + public void onRowReorder(ReorderEvent event); + + public void addRow(); + + public void deleteRow(); + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/GenericBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/GenericBean.java new file mode 100644 index 0000000..3b071f4 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/GenericBean.java @@ -0,0 +1,209 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans; + +import com.arrebol.apc.controller.util.DateWrapper; +import com.arrebol.apc.model.core.UserByOffice; +import java.text.MessageFormat; +import java.text.NumberFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.ResourceBundle; +import javax.faces.application.FacesMessage; +import javax.faces.context.ExternalContext; +import javax.faces.context.FacesContext; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public abstract class GenericBean { + + /** + * It Shows messages in xhtml. + * + * @param success True shows info, False shows warn, null shows fatal. + */ + public void testActionButtom(Boolean success) { + try { + if (success) { + showMessage(FacesMessage.SEVERITY_INFO, + getBundlePropertyFile().getString("generic.title"), + getBundlePropertyFile().getString("generic.true")); + } else { + showMessage(FacesMessage.SEVERITY_WARN, + getBundlePropertyFile().getString("generic.title"), + getBundlePropertyFile().getString("generic.false")); + } + } catch (Exception e) { + showMessage(FacesMessage.SEVERITY_FATAL, + getBundlePropertyFile().getString("generic.title"), + getBundlePropertyFile().getString("generic.exception")); + } + + } + + /** + * + * @param field + * @param value + */ + public void initStartAndEndDates(int field, int value) { + try { + Calendar starDateCalendar = Calendar.getInstance(); + + starDateCalendar.setTime(DateWrapper.getTodayMXTime()); + starDateCalendar.set(field, value); + + setStarDate(starDateCalendar.getTime()); + setEndDate(DateWrapper.getTodayMXTime()); + } catch (Exception e) { + + } + } + + public void initOneWeekBeforeToCurrdate() { + try { + Calendar start = Calendar.getInstance(); + + start.set(Calendar.WEEK_OF_YEAR, start.get(Calendar.WEEK_OF_YEAR) - 1); + start.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); + + setStarDate(start.getTime()); + setEndDate(DateWrapper.getTodayMXTime()); + } catch (Exception e) { + + } + } + + public void initThisWeekToCurrdate() { + try { + Calendar start = Calendar.getInstance(); + + //start.set(Calendar.WEEK_OF_YEAR, start.get(Calendar.WEEK_OF_YEAR) - 1); + start.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); + setStarDate(start.getTime()); + + setEndDate(DateWrapper.getTodayMXTime()); + } catch (Exception e) { + + } + } + + /** + * + * @return + */ + protected synchronized FacesContext facesContext() { + return FacesContext.getCurrentInstance(); + } + + /** + * + * @return + */ + protected synchronized ExternalContext externalContext() { + return facesContext().getExternalContext(); + } + + /** + * + * @return + */ + public synchronized UserByOffice getLoggedUser() { + return (UserByOffice) externalContext().getSessionMap().get(APC_SESSION); + } + + /** + * + * @param userByOffice + */ + protected synchronized void setLoggedUser(UserByOffice userByOffice) { + externalContext().getSessionMap().put(APC_SESSION, userByOffice); + } + + /** + * + * @param severity + * @param title + * @param details + */ + protected void showMessage(FacesMessage.Severity severity, String title, String details) { + facesContext().addMessage(null, new FacesMessage(severity, title, details)); + } + + /** + * + * @param number Must be numeric (BigDecimal, Double, Float or Integer) + * @return + */ + public String currencyFormatNumber(Object number) { + String currency; + try { + NumberFormat defaultFormat = NumberFormat.getCurrencyInstance(); + currency = defaultFormat.format(number); + } catch (Exception e) { + currency = "$0.00"; + } + return currency; + } + + /** + * Construye y envia el mensaje de notification del resultado de la accion + * ejecutada. + * + * @param params argumentos {0},{1}, etc. + * @param msg mesage que se sustituira lo {0},{1}, etc. + * @param severity Solo se permiten INFO, WARN or FATAL. + * @param title Titulo que aparece en message + */ + protected void buildAndSendMessage(Object[] params, String msg, + FacesMessage.Severity severity, String title) { + MessageFormat mf = new MessageFormat(msg); + + facesContext().addMessage(null, new FacesMessage(severity, title, mf.format(params))); + } + + protected static final String APP = "ApoyoAProyectosComerciales"; + + protected static final String APC_SESSION = "APCAuthorization"; + private ResourceBundle bundlePropertyFile; + private final String PROPERTY_FILE = "com.arrebol.apc.i18n.app_background"; + private final int pwdMaxlength = 15; + private Date starDate; + private Date endDate; + + public ResourceBundle getBundlePropertyFile() { + return bundlePropertyFile; + } + + public void loadBundlePropertyFile() { + this.bundlePropertyFile = ResourceBundle.getBundle(PROPERTY_FILE); + } + + public int getPwdMaxlength() { + return pwdMaxlength; + } + + public Date getStarDate() { + return starDate; + } + + public void setStarDate(Date starDate) { + this.starDate = starDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/SendMSN.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/SendMSN.java new file mode 100644 index 0000000..a1509a3 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/SendMSN.java @@ -0,0 +1,49 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.web.beans; + +import com.twilio.Twilio; +import com.twilio.rest.api.v2010.account.Message; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * + * @author Oscar + */ +public class SendMSN { + + public static final String ACCOUNT_SID = "AC3f21ebff784532f98229abfd8bc0e227"; + public static final String AUTH_TOKEN = "08e8c76db40ea5cc9ed772671909f292"; + private String text = ""; + private String phone = ""; + + public SendMSN(String aMessage, String aPhone) { + text = aMessage; + phone = aPhone; + } + + public void sendMessage() { + Twilio.init(ACCOUNT_SID, AUTH_TOKEN); + Message message = Message.creator( + new com.twilio.type.PhoneNumber(phone), + new com.twilio.type.PhoneNumber("+18504076816"), + text) + .create(); + + System.out.println(message.getSid()); + } + + public static boolean validarMovil(String movil) { + Pattern p = Pattern.compile("^\\d{10}$"); + Matcher m = p.matcher(movil); + return (m.matches()); + } + + public static String getNumberPhoneFormat(String movil) { + return "+52" + movil.trim(); + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/AdvanceBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/AdvanceBean.java new file mode 100644 index 0000000..b63d32d --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/AdvanceBean.java @@ -0,0 +1,252 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.BitacoraController; +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.GenericValidationController; +import com.arrebol.apc.controller.admin.AdvanceController; +import com.arrebol.apc.model.admin.Advance; +import com.arrebol.apc.model.admin.ExpenseCompany; +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.system.logs.Bitacora; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("advanceManager") +@ViewScoped +public class AdvanceBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setAdvance(fillDatatableAdvance()); + } + } catch (Exception e) { + } + } + + public List fillDatatableAdvance() { + + return getAdvanceCtrl().fillAdvanceDatatable(getLoggedUser().getOffice().getId(), getStarDate(), getEndDate()); + } + + public List getHr() { + + return genericCtrl.getAllHRByOffice(getLoggedUser().getOffice().getId()); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + Date date = new Date(); + if (genericCtrl.existStableGeneralBoxByCreatedOn(date)) { + showMessage(FacesMessage.SEVERITY_WARN, "Día cerrado", "No se pueden agregar más adelantos porque ya se existe un cuadre de caja general de hoy."); + return; + } + + if(new BigDecimal(amount).compareTo(BigDecimal.ZERO)==0){ + + showMessage(FacesMessage.SEVERITY_WARN, "Adelanto Incorrecta", "No se pueden dar adelantos de 0"); + return; + + } + + if(new BigDecimal(amount).compareTo(BigDecimal.ZERO)<0){ + + showMessage(FacesMessage.SEVERITY_WARN, "Adelanto Incorrecto", "No se puede dar adelanto de un numero negativo"); + return; + + } + + Advance advanceSave = new Advance(); + advanceSave.setActiveStatus(ActiveStatus.ENEBLED); + advanceSave.setAmount(new BigDecimal(amount)); + advanceSave.setHumanResource(new HumanResource(humanResourceId)); + advanceSave.setOffice(new Office(getLoggedUser().getOffice().getId())); + advanceSave.setCreatedOn(date); + advanceSave.setCreatedBy(getLoggedUser().getId()); + advanceCtrl.saveAdvance(advanceSave); + advance.clear(); + advance = fillDatatableAdvance(); + humanResourceId = ""; + amount = ""; + FacesMessage msg = new FacesMessage("Nuevo adelanto", "Se agregó correctamente"); + FacesContext.getCurrentInstance().addMessage(null, msg); + + } + + @Override + public void deleteRow() { + if (genericCtrl.existStableGeneralBoxByCreatedOn(selectedAdvance.getCreatedOn())) { + showMessage(FacesMessage.SEVERITY_WARN, "Adelanto", "No se puede borrar porque ya se realizo el cuadre de caja general del día."); + } else { + advanceCtrl.updateAdvanceByStatus(ActiveStatus.DISABLED, selectedAdvance.getId(), getLoggedUser().getUser().getId()); + Bitacora bitacora = new Bitacora(); + bitacora.setAction("Eliminar adelanto"); + bitacora.setCommentsUser(commentsBitacora); + bitacora.setCreatedBy(getLoggedUser().getUser().getId()); + bitacora.setCreatedOn(new Date()); + bitacora.setNameUser(getLoggedUser().getUser().getUserName()); + bitacora.setOffice(new Office(getLoggedUser().getOffice().getId())); + bitacora.setDescription("Se eliminó el adelanto con monto $" + + selectedAdvance.getAmount() + " y fecha " + selectedAdvance.getCreatedOn()); + + searchHistoricalAction(); + bitacoraCtrl.saveBitacora(bitacora); + commentsBitacora = ""; + //advance.remove(selectedAdvance); + selectedAdvance = null; + showMessage(FacesMessage.SEVERITY_INFO, "Adelanto Eliminado", "Se eliminó correctamente."); + } + } + + public AdvanceController getAdvanceCtrl() { + return advanceCtrl; + } + + public void setAdvanceCtrl(AdvanceController advanceCtrl) { + this.advanceCtrl = advanceCtrl; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List getAdvance() { + return advance; + } + + public void setAdvance(List advance) { + this.advance = advance; + } + + public List getHumanResource() { + return humanResource; + } + + public void setHumanResource(List humanResource) { + this.humanResource = humanResource; + } + + public String getHumanResourceId() { + return humanResourceId; + } + + public void setHumanResourceId(String humanResourceId) { + this.humanResourceId = humanResourceId; + } + + public Advance getSelectedAdvance() { + return selectedAdvance; + } + + public void setSelectedAdvance(Advance selectedAdvance) { + this.selectedAdvance = selectedAdvance; + } + + public String getAmount() { + return amount; + } + + public void setAmount(String amount) { + this.amount = amount; + } + + public GenericValidationController getGenericValidateController() { + return genericValidateController; + } + + public void setGenericValidateController(GenericValidationController genericController) { + this.genericValidateController = genericController; + } + + public Date getLastStableGeneralBox() { + return lastStableGeneralBox; + } + + public void setLastStableGeneralBox(Date lastStableGeneralBox) { + this.lastStableGeneralBox = lastStableGeneralBox; + } + + public String getCommentsBitacora() { + return commentsBitacora; + } + + public void setCommentsBitacora(String commentsBitacora) { + this.commentsBitacora = commentsBitacora; + } + + private AdvanceController advanceCtrl; + private GenericController genericCtrl; + private BitacoraController bitacoraCtrl; + private GenericValidationController genericValidateController; + private Date lastStableGeneralBox; + private String commentsBitacora; + + private List advance; + private List humanResource; + + private String humanResourceId; + private Advance selectedAdvance; + private String amount; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initOneWeekBeforeToCurrdate(); + + advanceCtrl = new AdvanceController(); + genericCtrl = new GenericController(); + bitacoraCtrl = new BitacoraController(); + setGenericValidateController(new GenericValidationController()); + setLastStableGeneralBox(getGenericValidateController().lastStableGeneralBoxByDate(getLoggedUser().getUser())); + commentsBitacora = ""; + advance = fillDatatableAdvance(); + humanResource = getHr(); + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/AjustarInventariosBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/AjustarInventariosBean.java new file mode 100644 index 0000000..28354ef --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/AjustarInventariosBean.java @@ -0,0 +1,66 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.admin.AjustarInventariosController; +import com.arrebol.apc.model.catalog.MovimientosInventario; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Oscar + */ +@Named("ajustarInventariosBean") +@ViewScoped +public class AjustarInventariosBean extends GenericBean implements Serializable { + + final Logger logger = LogManager.getLogger(AjustarInventariosBean.class); + + private AjustarInventariosController ajustarInventariosController; + private List listMovimientos; + private MovimientosInventario selectedMovimientos; + + @PostConstruct + public void init() { + try { + setAjustarInventariosController(new AjustarInventariosController()); + listMovimientos = getAjustarInventariosController().fillMovimientosInventario(); + } catch (Exception e) { + logger.error("init(): " + e); + } + } + + public AjustarInventariosController getAjustarInventariosController() { + return ajustarInventariosController; + } + + public void setAjustarInventariosController(AjustarInventariosController ajustarInventariosController) { + this.ajustarInventariosController = ajustarInventariosController; + } + + public List getListMovimientos() { + return listMovimientos; + } + + public void setListMovimientos(List listMovimientos) { + this.listMovimientos = listMovimientos; + } + + public MovimientosInventario getSelectedMovimientos() { + return selectedMovimientos; + } + + public void setSelectedMovimientos(MovimientosInventario selectedMovimientos) { + this.selectedMovimientos = selectedMovimientos; + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/BonusBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/BonusBean.java new file mode 100644 index 0000000..b3dade8 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/BonusBean.java @@ -0,0 +1,158 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.admin.BonusController; +import com.arrebol.apc.model.admin.Bonus; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ + +@Named("bonusManager") +@ViewScoped +public class BonusBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setBonus(getBonusCtrl().fillBonusDatatable(getLoggedUser().getOffice().getId(), getStarDate(), getEndDate())); + } + } catch (Exception e) { + } + } + + public List fillDatatableBonus() { + + return getBonusCtrl().fillBonusDatatable(getLoggedUser().getOffice().getId(), getStarDate(), getEndDate()); + } + + @Override + public void editRow(RowEditEvent event) { + Bonus bonus = (Bonus) event.getObject(); + if (bonus != null) { + bonusCtrl.updateByBonusId(bonus); + showMessage(FacesMessage.SEVERITY_INFO, "Registro Editado", "Se hizo el cambio correctamente."); + } + } + + @Override + public void onRowCancel(RowEditEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Edición Cancelada", ((Bonus) event.getObject()).getName().toString()); + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + if (administrative) { + saveBonus.setAdministrative(ActiveStatus.ENEBLED); + } else { + saveBonus.setAdministrative(ActiveStatus.DISABLED); + } + saveBonus.setActiveStatus(ActiveStatus.ENEBLED); + saveBonus.setCreatedBy(getLoggedUser().getId()); + saveBonus.setOffice(new Office(getLoggedUser().getOffice().getId())); + saveBonus.setCreatedOn(new Date()); + if (bonusCtrl.saveBonus(saveBonus)) { + saveBonus = new Bonus(); + administrative = false; + bonus.clear(); + bonus = fillDatatableBonus(); + FacesMessage msg = new FacesMessage("Nuevo bono", "Se agregó correctamente"); + FacesContext.getCurrentInstance().addMessage(null, msg); + } + } + + @Override + public void deleteRow() { + bonusCtrl.updateBonusByStatus(ActiveStatus.DISABLED, selectedBonus.getId(), getLoggedUser().getUser().getId()); + bonus.remove(selectedBonus); + selectedBonus = null; + showMessage(FacesMessage.SEVERITY_INFO, "Bono Eliminado", "Se eliminó correctamente."); + } + + public BonusController getBonusCtrl() { + return bonusCtrl; + } + + public void setBonusCtrl(BonusController bonusCtrl) { + this.bonusCtrl = bonusCtrl; + } + + public List getBonus() { + return bonus; + } + + public void setBonus(List bonus) { + this.bonus = bonus; + } + + public Bonus getSelectedBonus() { + return selectedBonus; + } + + public void setSelectedBonus(Bonus selectedBonus) { + this.selectedBonus = selectedBonus; + } + + public Bonus getSaveBonus() { + return saveBonus; + } + + public void setSaveBonus(Bonus saveBonus) { + this.saveBonus = saveBonus; + } + + public boolean isAdministrative() { + return administrative; + } + + public void setAdministrative(boolean administrative) { + this.administrative = administrative; + } + + private BonusController bonusCtrl; + private List bonus; + private Bonus selectedBonus; + private Bonus saveBonus; + private boolean administrative; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initOneWeekBeforeToCurrdate(); + + bonusCtrl = new BonusController(); + bonus = fillDatatableBonus(); + saveBonus = new Bonus(); + administrative = false; + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/ChangeOwnerBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/ChangeOwnerBean.java new file mode 100644 index 0000000..92c8240 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/ChangeOwnerBean.java @@ -0,0 +1,241 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.admin.ChangeOwnerController; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.views.AvailablesOwnersView; +import com.arrebol.apc.model.views.CurrentCustomerByLoanView; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.primefaces.model.DualListModel; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Named() +@ViewScoped +public class ChangeOwnerBean extends GenericBean implements Serializable { + + /** + * + */ + public void onCurrentOwnerChange() { + logger.debug("onCurrentOwnerChange"); + try { + setNewOwners(getController().findAllNewOwners(getLoggedUser().getOffice().getId(), getCurrentOwner())); + + setLoansByCurrentOwner( + new DualListModel<>( + getController().findAllLoansByCurrentOwner(getLoggedUser().getOffice().getId(), getCurrentOwner()), + new ArrayList<>() + ) + ); + + AvailablesOwnersView owner = getCurrentOwners() + .stream() + .filter(value -> getCurrentOwner().equals(value.getUserId())) + .findAny() + .orElse(null); + + setCurrentOwnerFullName(null == owner ? "Error" : owner.getFullName()); + + setNewOwner(null); + setNewOwnerFullName(""); + } catch (Exception e) { + logger.error("onCurrentOwnerChange", e); + + setNewOwner(null); + setNewOwnerFullName(""); + setNewOwners(new ArrayList<>()); + setLoansByCurrentOwner(new DualListModel<>(new ArrayList<>(), new ArrayList<>())); + setCurrentOwners(new ArrayList<>()); + } + } + + /** + * + */ + public void onNewOwnerChange() { + logger.debug("onNewOwnerChange"); + try { + setLoansByCurrentOwner( + new DualListModel<>( + getController().findAllLoansByCurrentOwner(getLoggedUser().getOffice().getId(), getCurrentOwner()), + new ArrayList<>() + ) + ); + + AvailablesOwnersView owner = getNewOwners() + .stream() + .filter(value -> getNewOwner().equals(value.getUserId())) + .findAny() + .orElse(null); + + setNewOwnerFullName(null == owner ? "Error" : owner.getFullName()); + } catch (Exception e) { + logger.error("onNewOwnerChange", e); + + setNewOwners(new ArrayList<>()); + setLoansByCurrentOwner(new DualListModel<>(new ArrayList<>(), new ArrayList<>())); + } + } + + /** + * + */ + public void changeLoansBetweenUsers() { + logger.debug("changeLoansBetweenUsers"); + + try { + FacesMessage.Severity severity = FacesMessage.SEVERITY_WARN; + String messafeFormat = getBundlePropertyFile().getString("message.format.failure"); + String messageTitle = getBundlePropertyFile().getString("change.owner.upper"); + String messageAction = getBundlePropertyFile().getString("updated"); + + List loans = new ArrayList<>(); + + getLoansByCurrentOwner().getTarget().forEach((loanView) -> { + loans.add(new Loan(loanView.getLoanId())); + }); + + if (getController().changeLoansBetweenUsers(getNewOwner(), loans)) { + setCurrentOwner(null); + setCurrentOwnerFullName(""); + setCurrentOwners(getController().findAllCurrentOwners(getLoggedUser().getOffice().getId())); + setNewOwner(null); + setNewOwnerFullName(""); + setNewOwners(new ArrayList<>()); + setLoansByCurrentOwner(new DualListModel<>(new ArrayList<>(), new ArrayList<>())); + + severity = FacesMessage.SEVERITY_INFO; + messafeFormat = getBundlePropertyFile().getString("message.format.sucess"); + } + + Object[] param = {messageTitle, messageAction}; + + buildAndSendMessage(param, messafeFormat, severity, messageTitle); + } catch (Exception e) { + logger.error("changeLoansBetweenUsers", e); + Object[] param = {getBundlePropertyFile().getString("change.owner.upper")}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + getBundlePropertyFile().getString("change.owner") + ); + } + } + + @PostConstruct + public void init() { + try { + loadBundlePropertyFile(); + + setController(new ChangeOwnerController()); + setCurrentOwners(getController().findAllCurrentOwners(getLoggedUser().getOffice().getId())); + + setLoansByCurrentOwner( + new DualListModel<>( + new ArrayList<>(), + new ArrayList<>() + ) + ); + } catch (Exception e) { + logger.error("init", e); + } + } + + private static final long serialVersionUID = -7947550003483328090L; + final Logger logger = LogManager.getLogger(getClass().getName()); + + private ChangeOwnerController controller; + private List currentOwners; + private List newOwners; + private DualListModel loansByCurrentOwner; + + private String currentOwner; + private String newOwner; + private String currentOwnerFullName; + private String newOwnerFullName; + + public ChangeOwnerController getController() { + return controller; + } + + public void setController(ChangeOwnerController controller) { + this.controller = controller; + } + + public List getCurrentOwners() { + return currentOwners; + } + + public void setCurrentOwners(List currentOwners) { + this.currentOwners = currentOwners; + } + + public List getNewOwners() { + return newOwners; + } + + public void setNewOwners(List newOwners) { + this.newOwners = newOwners; + } + + public DualListModel getLoansByCurrentOwner() { + return loansByCurrentOwner; + } + + public void setLoansByCurrentOwner(DualListModel loansByCurrentOwner) { + this.loansByCurrentOwner = loansByCurrentOwner; + } + + public String getCurrentOwner() { + return currentOwner; + } + + public void setCurrentOwner(String currentOwner) { + this.currentOwner = currentOwner; + } + + public String getNewOwner() { + return newOwner; + } + + public void setNewOwner(String newOwner) { + this.newOwner = newOwner; + } + + public String getCurrentOwnerFullName() { + return currentOwnerFullName; + } + + public void setCurrentOwnerFullName(String currentOwnerFullName) { + this.currentOwnerFullName = currentOwnerFullName; + } + + public String getNewOwnerFullName() { + return newOwnerFullName; + } + + public void setNewOwnerFullName(String newOwnerFullName) { + this.newOwnerFullName = newOwnerFullName; + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/ClosingDayBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/ClosingDayBean.java new file mode 100644 index 0000000..8a6ea61 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/ClosingDayBean.java @@ -0,0 +1,1281 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.BitacoraController; +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.ClosingDayController; +import com.arrebol.apc.controller.admin.LoanController; +import com.arrebol.apc.model.admin.ClosingDay; +import com.arrebol.apc.model.admin.ClosingDayDetail; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.system.logs.Bitacora; +import com.arrebol.apc.model.views.ClosingDailyDetailFromUserByCurdateView; +import com.arrebol.apc.model.views.LoanByUserPaymentZeroView; +import com.arrebol.apc.model.views.TotalCashByCurdateDashboardView; +import com.arrebol.apc.model.views.TotalCashByCurdateView; +import com.arrebol.apc.model.views.TotalClosingDayByCurdateView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import com.itextpdf.text.BaseColor; +import com.itextpdf.text.Chunk; +import com.itextpdf.text.Document; +import com.itextpdf.text.Element; +import com.itextpdf.text.FontFactory; +import com.itextpdf.text.Image; +import com.itextpdf.text.PageSize; +import com.itextpdf.text.Paragraph; +import com.itextpdf.text.pdf.PdfPCell; +import com.itextpdf.text.pdf.PdfPTable; +import com.itextpdf.text.pdf.PdfWriter; +import java.awt.Font; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.Serializable; +import java.math.BigDecimal; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("closingDayManager") +@ViewScoped +public class ClosingDayBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setClosingDay(getClosingDayCtrl().fillClosingDayDatatable(getLoggedUser().getOffice().getId(), getStarDate(), getEndDate())); + } + } catch (Exception e) { + } + } + + public List fillDatatableClosingDay() { + + return getClosingDayCtrl().fillClosingDayDatatable(getLoggedUser().getOffice().getId(), getStarDate(), getEndDate()); + } + + /** + * + * @param outcome + * @return + */ + public String detailClosingDay(String outcome) { + return outcome; + } + + public List getUsers() { + + return genericCtrl.getAllUsersByOffice(getLoggedUser().getOffice().getId()); + } + + public List fillDatatableClosingDetails(String idUser) { + + return closingDayCtrl.findAllClosingDailyDetailFromUserByCurdateView(idUser); + } + + public List getLoansPaymentZeroByUser(String idUser) { + + return closingDayCtrl.getLoansPaymentZeroByUser(idUser); + } + + public void getResumen() { + + List listTotal = closingDayCtrl.getAllTotalCashByCurdateDashboardView(getLoggedUser().getOffice().getId()); + totalAmount = BigDecimal.ZERO; + totalTransferSender = BigDecimal.ZERO; + totalTransferReceiver = BigDecimal.ZERO; + totalMoneyDaily = BigDecimal.ZERO; + totalDelivery = BigDecimal.ZERO; + totalFinal = BigDecimal.ZERO; + totalCaja = BigDecimal.ZERO; + totalOtherExpense = BigDecimal.ZERO; + deposit = BigDecimal.ZERO; + + for (TotalCashByCurdateDashboardView temp : listTotal) { + totalAmount = totalAmount.add(temp.getPaymentDaily()); + totalTransferSender = totalTransferSender.add(temp.getTransferSender()); + totalTransferReceiver = totalTransferReceiver.add(temp.getTransferReceiver()); + totalMoneyDaily = totalMoneyDaily.add(temp.getMoneyDaily()); + totalDelivery = totalDelivery.add(temp.getDelivery()); + deposit = deposit.add(temp.getDepositDaily()); + totalFinal = totalFinal.add(temp.getTotal()); + totalOtherExpense = totalOtherExpense.add(temp.getOtherExpense()); + } + + List closingTotal = closingDayCtrl.findAllClosingDayByCurdate(getLoggedUser().getOffice().getId()); + if (closingTotal != null && !closingTotal.isEmpty()) { + for (TotalClosingDayByCurdateView temp : closingTotal) { + totalCaja = totalCaja.add(temp.getAmountPaid()); + } + } + + } + + public void getCashTotal() { + + + if(userId.equalsIgnoreCase("")){ + FacesMessage msg = new FacesMessage("ERROR", "Debes de elegir un usuario para poder ver sus totales"); + FacesContext.getCurrentInstance().addMessage(null, msg); + imprimirStatus = true; + userId = ""; + return; + } + if(loanCtrl.countLoanDetailsAuthorize(userId)>0){ + FacesMessage msg = new FacesMessage("Depositos pendientes", "No se puede realizar el corte de caja, autorice todas los depositos pendientes"); + FacesContext.getCurrentInstance().addMessage(null, msg); + userId = ""; + return; + } + + if (closingDayCtrl.getClosingDayCurdateByUserId(userId, getLoggedUser().getOffice().getId()) > 0) { + FacesMessage msg = new FacesMessage("Corte encontrado", "El usuario ya tiene un corte registrado el día de hoy."); + FacesContext.getCurrentInstance().addMessage(null, msg); + userId = ""; + return; + } + totales = new TotalCashByCurdateView(); + totales.setMoneyDaily(BigDecimal.ZERO); + totales.setPaymentDaily(BigDecimal.ZERO); + totales.setTransferReceiver(BigDecimal.ZERO); + totales.setTransferSender(BigDecimal.ZERO); + totales.setDelivery(BigDecimal.ZERO); + totales.setTransferPending(BigDecimal.ZERO); + totales.setOtherExpense(BigDecimal.ZERO); + totales.setDepositDaily(BigDecimal.ZERO); + total = BigDecimal.ZERO.toString(); + totalCustomerWithOutAction = new Long(0); + comments = ""; + TotalCashByCurdateView temp; + temp = closingDayCtrl.getTotalCashByCurdateViewById(userId); + if (temp != null) { + totales = temp; + total = temp.getTotal().toString(); + } + + if (closingDetail != null && !closingDetail.isEmpty()) { + closingDetail.clear(); + } + + User userObj = closingDayCtrl.getUserById(userId); + + + if (userObj.getCertifier().equals(ActiveStatus.DISABLED)) { + closingDetail = fillDatatableClosingDetails(userId); + } else { + closingDetail = closingDayCtrl.findAllClosingDailyDetailFromUserCertifierByCurdateView(userId); + } + + totalCustomerWithOutAction = closingDayCtrl.getLoansCountDailyByUser(userId); + paymentoZeroDetail = getLoansPaymentZeroByUser(userId); + + imprimirStatus = false; + // imprimirStatus(); + } + + public void imprimir() { + if (userId.equalsIgnoreCase("")) { + FacesMessage msg = new FacesMessage("ERROR", "Debes de elegir un usuario para poder imprimir el corte."); + FacesContext.getCurrentInstance().addMessage(null, msg); + userId = ""; + imprimirStatus = true; + return; + } + Document document = new Document(PageSize.LETTER); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try { + PdfWriter.getInstance(document, baos); + List results = new ArrayList<>(); + results = closingDayCtrl.findDetailsFromClosingDayCurDate(userId); + document.open(); + + DateFormat formatter = new SimpleDateFormat("dd/MM/yy"); + DateFormat formatter2 = new SimpleDateFormat("dd/MM/yyyy HH:mm:SS"); + formatter2.setTimeZone(TimeZone.getTimeZone("GMT-6")); + + Paragraph printDate = new Paragraph("Fecha de impresión: " + formatter.format(new Date()), FontFactory.getFont("arial", 10, Font.BOLD, BaseColor.DARK_GRAY)); + printDate.setAlignment(Element.ALIGN_RIGHT); + document.add(printDate); + +// Image imagen = Image.getInstance("other sources/resources/serenity-layout/images/apc_card.png"); +// imagen.scaleAbsoluteWidth(100f); +// document.add(imagen); + + Paragraph title = new Paragraph("Corte del día", FontFactory.getFont("arial", 18, Font.BOLD, BaseColor.DARK_GRAY)); + title.setAlignment(Element.ALIGN_CENTER); + document.add(title); + + document.add(Chunk.NEWLINE); + + Object[] res = (Object[]) results.get(0); + BigDecimal totalesRep = BigDecimal.ZERO; + BigDecimal recuperado = BigDecimal.ZERO; + BigDecimal transEnv = BigDecimal.ZERO; + BigDecimal transRec = BigDecimal.ZERO; + BigDecimal inicio = BigDecimal.ZERO; + BigDecimal gastos = BigDecimal.ZERO; + BigDecimal depositos = BigDecimal.ZERO; + BigDecimal entrPrestamos = BigDecimal.ZERO; + + + PdfPTable tableGen = new PdfPTable(4); + tableGen.setWidthPercentage(100); + tableGen.setTotalWidth(new float[]{100f, 170f, 140f, 150f}); + tableGen.setLockedWidth(true); + + PdfPCell cellGen = new PdfPCell(new Paragraph("Asesor: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + cellGen = new PdfPCell(new Paragraph(res[8] == null ? "" : res[8].toString(), + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(3); + tableGen.addCell(cellGen); + + cellGen = new PdfPCell(new Paragraph("Monto recuperado: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + recuperado = new BigDecimal(res[9] == null ? "0.0" : res[9].toString()); + cellGen = new PdfPCell(new Paragraph(res[9] != null ? "$" + res[9].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + cellGen = new PdfPCell(new Paragraph("Monto enviado por transferencia: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + transEnv = new BigDecimal(res[11] == null ? "0.0" : res[11].toString()); + cellGen = new PdfPCell(new Paragraph(res[11] != null ? "$" + res[11].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + + cellGen = new PdfPCell(new Paragraph("Monto de inicio: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + inicio = new BigDecimal(res[13] == null ? "0.0" : res[13].toString()); + cellGen = new PdfPCell(new Paragraph(res[13] != null ? "$" + res[13].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + cellGen = new PdfPCell(new Paragraph("Monto recibido por transferencia: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + transRec = new BigDecimal(res[12] == null ? "0.0" : res[12].toString()); + cellGen = new PdfPCell(new Paragraph(res[12] != null ? "$" + res[12].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + + cellGen = new PdfPCell(new Paragraph("Entrega de préstamos: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + entrPrestamos = new BigDecimal(res[15] == null ? "0.0" : res[15].toString()); + cellGen = new PdfPCell(new Paragraph(res[15] != null ? "$" + res[15].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + cellGen = new PdfPCell(new Paragraph("Gastos: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + gastos = new BigDecimal(res[14] == null ? "0.0" : res[14].toString()); + cellGen = new PdfPCell(new Paragraph(res[14] != null ? "$" + res[14].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + + cellGen = new PdfPCell(new Paragraph("Depósitos: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + depositos = new BigDecimal(res[10] == null ? "0.0" : res[10].toString()); + cellGen = new PdfPCell(new Paragraph(res[10] != null ? "$" + res[10].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + totalesRep = totalesRep.add(recuperado).subtract(transEnv).add(transRec).add(inicio).subtract(gastos).subtract(entrPrestamos); + cellGen = new PdfPCell(new Paragraph("Total: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + cellGen = new PdfPCell(new Paragraph(totalesRep != null ? "$" + totalesRep.toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + + + + cellGen = new PdfPCell(new Paragraph("Monto Esperado: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + cellGen = new PdfPCell(new Paragraph(totales.getTotal() != null ? "$" + totales.getTotal().toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + cellGen = new PdfPCell(new Paragraph("Monto Entregado: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + cellGen = new PdfPCell(new Paragraph(new BigDecimal(total) != null ? "$" + new BigDecimal(total).toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + + document.add(tableGen); + document.add(Chunk.NEWLINE); + + PdfPTable table = new PdfPTable(7); + table.setTotalWidth(new float[]{60, 60, 60, 60, 170, 60, 100}); + + table.setLockedWidth(true); + PdfPCell cell = new PdfPCell(new Paragraph("Detalles del corte", + FontFactory.getFont("arial", 10, Font.BOLD, BaseColor.WHITE))); + + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setBackgroundColor(new BaseColor( 4, 193, 10 )); + cell.setColspan(7); + table.addCell(cell); + + cell = new PdfPCell(new Paragraph("Detalle", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setColspan(1); + table.addCell(cell); + + cell = new PdfPCell(new Paragraph("P. anterior", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setColspan(1); + table.addCell(cell); + + cell = new PdfPCell(new Paragraph("C. apertura", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setColspan(1); + table.addCell(cell); + + cell = new PdfPCell(new Paragraph("Monto", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setColspan(1); + table.addCell(cell); + + cell = new PdfPCell(new Paragraph("Saldo insoluto", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setColspan(1); + table.addCell(cell); + + cell = new PdfPCell(new Paragraph("Tipo", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setColspan(1); + table.addCell(cell); + + cell = new PdfPCell(new Paragraph("Fecha", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setColspan(1); + table.addCell(cell); + + for(Object result : results){ + Object[] tmp = (Object[]) result; + // Detalle + cell = new PdfPCell(new Paragraph(tmp[0] == null ? "" : tmp[0].toString(), + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setColspan(1); + table.addCell(cell); + //Préstamo anterior + cell = new PdfPCell(new Paragraph(tmp[6] != null ? "$" + tmp[6].toString() : "$0.00", + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setColspan(1); + table.addCell(cell); + // Comisión por apertura + cell = new PdfPCell(new Paragraph(tmp[5] != null ? "$" + tmp[5].toString() : "$0.00", + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setColspan(1); + table.addCell(cell); + // Monto + cell = new PdfPCell(new Paragraph(tmp[1] != null ? "$" + tmp[1].toString() : "$0.00", + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setColspan(1); + table.addCell(cell); + // Saldo insoluto + cell = new PdfPCell(new Paragraph(tmp[3] != null ? "$" + tmp[3].toString() : "$0.00", + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setColspan(1); + table.addCell(cell); + // Tipo + cell = new PdfPCell(new Paragraph(tmp[2] == null ? "" : tmp[2].toString(), + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setColspan(1); + table.addCell(cell); + // Fecha + cell = new PdfPCell(new Paragraph(tmp[4] == null ? "" : formatter2.format((Date) tmp[4]), + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setColspan(1); + table.addCell(cell); + } + + document.add(table); + + document.add(Chunk.NEWLINE); + document.add(Chunk.NEWLINE); + document.add(Chunk.NEWLINE); + document.add(Chunk.NEWLINE); + + document.add(new Paragraph(" __________________________ __________________________")); + document.add(new Paragraph(" Firma Nombre y firma cajero responsable")); + document.add(new Paragraph(" " + res[8] == null ? "" : res[8].toString())); + + } catch (Exception e) { + System.out.print("Error 1: " + e.getMessage()); + } + + document.close(); + FacesContext context = FacesContext.getCurrentInstance(); + Object response = context.getExternalContext().getResponse(); + if (response instanceof HttpServletResponse) { + HttpServletResponse hrs = (HttpServletResponse) response; + hrs.setContentType("application/pdf"); + //hrs.setHeader("Content-disposition", "attachment"); + hrs.setHeader("Content-disposition", "attachment;filename=corte_del_día.pdf"); + hrs.setContentLength(baos.size()); + try { + ServletOutputStream out = hrs.getOutputStream(); + baos.writeTo(out); + out.flush(); + + } catch (IOException e) { + System.out.print("Error 2: " + e.getMessage()); + } + context.responseComplete(); + } + } + + public void imprimirHistory() { + + Document document = new Document(PageSize.LETTER); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try { + PdfWriter.getInstance(document, baos); + List results = new ArrayList<>(); + results = closingDayCtrl.findDetailsFromClosingDayHisotry(selectedClosingDay.getId()); + document.open(); + DateFormat formatter2 = new SimpleDateFormat("dd/MM/yyyy HH:mm:SS"); + formatter2.setTimeZone(TimeZone.getTimeZone("GMT-6")); + + Object[] res = (Object[]) results.get(0); + BigDecimal totalesRep = BigDecimal.ZERO; + BigDecimal recuperado = BigDecimal.ZERO; + BigDecimal transEnv = BigDecimal.ZERO; + BigDecimal transRec = BigDecimal.ZERO; + BigDecimal inicio = BigDecimal.ZERO; + BigDecimal gastos = BigDecimal.ZERO; + BigDecimal depositos = BigDecimal.ZERO; + BigDecimal entrPrestamos = BigDecimal.ZERO; + + Paragraph printDate = new Paragraph("Fecha de impresión: " +res[3], FontFactory.getFont("arial", 10, Font.BOLD, BaseColor.DARK_GRAY)); + printDate.setAlignment(Element.ALIGN_RIGHT); + document.add(printDate); + +// Image imagen = Image.getInstance("other sources/resources/serenity-layout/images/apc_card.png"); +// imagen.scaleAbsoluteWidth(100f); +// document.add(imagen); + + Paragraph title = new Paragraph("Corte del día", FontFactory.getFont("arial", 18, Font.BOLD, BaseColor.DARK_GRAY)); + title.setAlignment(Element.ALIGN_CENTER); + document.add(title); + + document.add(Chunk.NEWLINE); + + + + + PdfPTable tableGen = new PdfPTable(4); + tableGen.setWidthPercentage(100); + tableGen.setTotalWidth(new float[]{100f, 170f, 140f, 150f}); + tableGen.setLockedWidth(true); + + PdfPCell cellGen = new PdfPCell(new Paragraph("Asesor: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + cellGen = new PdfPCell(new Paragraph(res[6] == null ? "" : res[6].toString(), + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(3); + tableGen.addCell(cellGen); + + cellGen = new PdfPCell(new Paragraph("Monto recuperado: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + recuperado = new BigDecimal(res[7] == null ? "0.0" : res[7].toString()); + cellGen = new PdfPCell(new Paragraph(res[7] != null ? "$" + res[7].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + cellGen = new PdfPCell(new Paragraph("Monto enviado por transferencia: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + transEnv = new BigDecimal(res[11] == null ? "0.0" : res[11].toString()); + cellGen = new PdfPCell(new Paragraph(res[11] != null ? "$" + res[11].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + + cellGen = new PdfPCell(new Paragraph("Monto de inicio: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + inicio = new BigDecimal(res[10] == null ? "0.0" : res[10].toString()); + cellGen = new PdfPCell(new Paragraph(res[10] != null ? "$" + res[10].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + cellGen = new PdfPCell(new Paragraph("Monto recibido por transferencia: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + transRec = new BigDecimal(res[11] == null ? "0.0" : res[11].toString()); + cellGen = new PdfPCell(new Paragraph(res[11] != null ? "$" + res[11].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + + cellGen = new PdfPCell(new Paragraph("Entrega de préstamos: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + entrPrestamos = new BigDecimal(res[13] == null ? "0.0" : res[13].toString()); + cellGen = new PdfPCell(new Paragraph(res[13] != null ? "$" + res[13].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + cellGen = new PdfPCell(new Paragraph("Gastos: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + gastos = new BigDecimal(res[12] == null ? "0.0" : res[12].toString()); + cellGen = new PdfPCell(new Paragraph(res[12] != null ? "$" + res[12].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + + cellGen = new PdfPCell(new Paragraph("Depósitos: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + depositos = new BigDecimal(res[8] == null ? "0.0" : res[8].toString()); + cellGen = new PdfPCell(new Paragraph(res[8] != null ? "$" + res[8].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + totalesRep = totalesRep.add(recuperado).subtract(transEnv).add(transRec).add(inicio).subtract(gastos).subtract(entrPrestamos); + cellGen = new PdfPCell(new Paragraph("Total: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + cellGen = new PdfPCell(new Paragraph(totalesRep != null ? "$" + totalesRep.toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + + + + cellGen = new PdfPCell(new Paragraph("Monto Esperado: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + cellGen = new PdfPCell(new Paragraph(res[4] != null ? "$" + res[4].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + cellGen = new PdfPCell(new Paragraph("Monto Entregado: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + cellGen = new PdfPCell(new Paragraph(res[5] != null ? "$" + res[5].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + + document.add(tableGen); + document.add(Chunk.NEWLINE); + + PdfPTable table = new PdfPTable(7); + table.setTotalWidth(new float[]{60, 60, 60, 60, 170, 60, 100}); + + table.setLockedWidth(true); + PdfPCell cell = new PdfPCell(new Paragraph("Detalles del corte", + FontFactory.getFont("arial", 10, Font.BOLD, BaseColor.WHITE))); + + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setBackgroundColor(new BaseColor( 4, 193, 10 )); + cell.setColspan(7); + table.addCell(cell); + + cell = new PdfPCell(new Paragraph("Detalle", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setColspan(1); + table.addCell(cell); + + cell = new PdfPCell(new Paragraph("P. anterior", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setColspan(1); + table.addCell(cell); + + cell = new PdfPCell(new Paragraph("C. apertura", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setColspan(1); + table.addCell(cell); + + cell = new PdfPCell(new Paragraph("Monto", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setColspan(1); + table.addCell(cell); + + cell = new PdfPCell(new Paragraph("Saldo insoluto", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setColspan(1); + table.addCell(cell); + + cell = new PdfPCell(new Paragraph("Tipo", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setColspan(1); + table.addCell(cell); + + cell = new PdfPCell(new Paragraph("Fecha", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setColspan(1); + table.addCell(cell); + + for(Object result : results){ + Object[] tmp = (Object[]) result; + // Detalle + cell = new PdfPCell(new Paragraph(tmp[0] == null ? "" : tmp[0].toString(), + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setColspan(1); + table.addCell(cell); + cell = new PdfPCell(new Paragraph( "", + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setColspan(1); + table.addCell(cell); + cell = new PdfPCell(new Paragraph( "", + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setColspan(1); + table.addCell(cell); + + + // Monto + cell = new PdfPCell(new Paragraph(tmp[1] != null ? "$" + tmp[1].toString() : "$0.00", + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setColspan(1); + table.addCell(cell); + + cell = new PdfPCell(new Paragraph( "", + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setColspan(1); + table.addCell(cell); + + // Tipo + cell = new PdfPCell(new Paragraph(tmp[2] == null ? "" : tmp[2].toString(), + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setColspan(1); + table.addCell(cell); + // Fecha + cell = new PdfPCell(new Paragraph(tmp[15] == null ? "" : formatter2.format((Date) tmp[15]), + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setColspan(1); + table.addCell(cell); + } + + document.add(table); + + document.add(Chunk.NEWLINE); + document.add(Chunk.NEWLINE); + document.add(Chunk.NEWLINE); + document.add(Chunk.NEWLINE); + + document.add(new Paragraph(" __________________________ __________________________")); + document.add(new Paragraph(" Firma Nombre y firma cajero responsable")); + document.add(new Paragraph(" " + res[6] == null ? "" : res[6].toString())); + + } catch (Exception e) { + System.out.print("Error 1: " + e.getMessage()); + } + + document.close(); + FacesContext context = FacesContext.getCurrentInstance(); + Object response = context.getExternalContext().getResponse(); + if (response instanceof HttpServletResponse) { + HttpServletResponse hrs = (HttpServletResponse) response; + hrs.setContentType("application/pdf"); + //hrs.setHeader("Content-disposition", "attachment"); + hrs.setHeader("Content-disposition", "attachment;filename=corte_del_día.pdf"); + hrs.setContentLength(baos.size()); + try { + ServletOutputStream out = hrs.getOutputStream(); + baos.writeTo(out); + out.flush(); + + } catch (IOException e) { + System.out.print("Error 2: " + e.getMessage()); + } + context.responseComplete(); + } + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + if (userId.equalsIgnoreCase("")) { + FacesMessage msg = new FacesMessage("ERROR", "Debes de elegir un usuario para poder generar el corte."); + FacesContext.getCurrentInstance().addMessage(null, msg); + imprimirStatus = true; + userId = ""; + return; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date()); + calendar.set(Calendar.HOUR_OF_DAY, 12); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); + + if (!(dayOfWeek == Calendar.SUNDAY) && !(userId.equalsIgnoreCase("aad0c673-eb93-11ea-b7e1-02907d0fb4e6"))) { + if (totalCustomerWithOutAction.compareTo(new Long(0)) == 1) { + FacesMessage msg = new FacesMessage("ERROR", "El asesor debe de realizar una acción en todos sus préstamos."); + FacesContext.getCurrentInstance().addMessage(null, msg); + return; + } + } + + if (totales.getTotal().compareTo(new BigDecimal(total)) != 0) { + if (comments == null || comments.trim().equals("")) { + FacesMessage msg = new FacesMessage("ERROR", "Es necesario capturar las observaciones."); + FacesContext.getCurrentInstance().addMessage(null, msg); + return; + } + } + + User userData = null; + for(User us : user){ + if(us.getId().equalsIgnoreCase(userId)){ + userData = us; + break; + } + } + + ClosingDay closingSave = new ClosingDay(); + closingSave.setActiveStatus(ActiveStatus.ENEBLED); + closingSave.setAmountExpected(totales.getTotal()); + closingSave.setAmountPaid(new BigDecimal(total)); + closingSave.setOffice(new Office(getLoggedUser().getOffice().getId())); + closingSave.setUser(new User(userId)); + closingSave.setCreatedBy(getLoggedUser().getId()); + closingSave.setCreatedOn(new Date()); + closingSave.setComments(comments); + closingSave.setRouteCtlg(userData.getHumanResource().getHumanResourceHasRoutes().get(0).getRouteCtlg()); + if (closingDayCtrl.saveClosingDay(closingSave)) { + if (closingDetail != null && !closingDetail.isEmpty()) { + List detail = new ArrayList(); + + for (ClosingDailyDetailFromUserByCurdateView info : closingDetail) { + ClosingDayDetail detailInfo = new ClosingDayDetail(); + detailInfo.setAmount(info.getAmount()); + detailInfo.setClosingDay(closingSave); + detailInfo.setComments(info.getComments()); + detailInfo.setCreatedBy(getLoggedUser().getId()); + detailInfo.setCreatedOn(new Date()); + detailInfo.setDateDetail(info.getCreatedOn()); + detailInfo.setType(info.getType()); + detail.add(detailInfo); + } + closingDayCtrl.saveClosingDayDetail(detail); + } + + } + getResumen(); + totales = new TotalCashByCurdateView(); + totales.setMoneyDaily(BigDecimal.ZERO); + totales.setPaymentDaily(BigDecimal.ZERO); + totales.setTransferReceiver(BigDecimal.ZERO); + totales.setTransferSender(BigDecimal.ZERO); + totales.setDelivery(BigDecimal.ZERO); + totales.setTotal(BigDecimal.ZERO); + totales.setTransferPending(BigDecimal.ZERO); + totales.setOtherExpense(BigDecimal.ZERO); + totales.setDepositDaily(BigDecimal.ZERO); + total = BigDecimal.ZERO.toString(); + totalBox = BigDecimal.ZERO; + totalCustomerWithOutAction = new Long(0); + totalBox = genericCtrl.findAllSmallBox(getLoggedUser().getOffice().getId()); + comments = ""; + closingDetail.clear(); + paymentoZeroDetail.clear(); + FacesMessage msg = new FacesMessage("Nuevo corte registrado", "Se agregó correctamente"); + FacesContext.getCurrentInstance().addMessage(null, msg); + } + + @Override + public void deleteRow() { + try { + if (closingDayCtrl.existStableSmallBoxByCreatedOn(selectedClosingDay.getCreatedOn())) { + showMessage(FacesMessage.SEVERITY_WARN, "Corte del día", "No se puede borrar porque ya se realizo el cuadre de caja chica del día."); + } else { + boolean delete = true; + delete = selectedClosingDay.getActiveStatus() == ActiveStatus.ENEBLED ? true : false; + + if (delete) { + Bitacora bitacora = new Bitacora(); + ClosingDay closing = closingDayCtrl.getClosingDayById(selectedClosingDay.getId()); + bitacora.setAction("Eliminar corte del día"); + bitacora.setCommentsUser(commentsBitacora); + bitacora.setCreatedBy(getLoggedUser().getUser().getId()); + bitacora.setCreatedOn(new Date()); + bitacora.setNameUser(getLoggedUser().getUser().getUserName()); + bitacora.setOffice(new Office(getLoggedUser().getOffice().getId())); + bitacora.setDescription("Se eliminó el corte del asesor " + closing.getUser().getUserName() + " con monto $" + + selectedClosingDay.getAmountPaid() + " y fecha " + closing.getCreatedOn()); + closingDayCtrl.updateClosingDayByStatus(ActiveStatus.DISABLED, selectedClosingDay.getId(), getLoggedUser().getUser().getId()); + //closingDay.remove(selectedClosingDay); + searchHistoricalAction(); + bitacoraCtrl.saveBitacora(bitacora); + commentsBitacora = ""; + selectedClosingDay = null; + showMessage(FacesMessage.SEVERITY_INFO, "Corte del día", "Se eliminó correctamente."); + } + } + } catch (Exception e) { + } + } + + public ClosingDayController getClosingDayCtrl() { + return closingDayCtrl; + } + + public void setClosingDayCtrl(ClosingDayController closingDayCtrl) { + this.closingDayCtrl = closingDayCtrl; + } + + public List getClosingDay() { + return closingDay; + } + + public void setClosingDay(List closingDay) { + this.closingDay = closingDay; + } + + public List getUser() { + return user; + } + + public void setUser(List user) { + this.user = user; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getAmount() { + return amount; + } + + public void setAmount(String amount) { + this.amount = amount; + } + + public ClosingDay getSelectedClosingDay() { + return selectedClosingDay; + } + + public void setSelectedClosingDay(ClosingDay selectedClosingDay) { + this.selectedClosingDay = selectedClosingDay; + } + + public TotalCashByCurdateView getTotales() { + return totales; + } + + public void setTotales(TotalCashByCurdateView totales) { + this.totales = totales; + } + + public String getTotal() { + return total; + } + + public void setTotal(String total) { + this.total = total; + } + + public BigDecimal getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(BigDecimal totalAmount) { + this.totalAmount = totalAmount; + } + + public BigDecimal getTotalTransferSender() { + return totalTransferSender; + } + + public void setTotalTransferSender(BigDecimal totalTransferSender) { + this.totalTransferSender = totalTransferSender; + } + + public BigDecimal getTotalTransferReceiver() { + return totalTransferReceiver; + } + + public void setTotalTransferReceiver(BigDecimal totalTransferReceiver) { + this.totalTransferReceiver = totalTransferReceiver; + } + + public BigDecimal getTotalMoneyDaily() { + return totalMoneyDaily; + } + + public void setTotalMoneyDaily(BigDecimal totalMoneyDaily) { + this.totalMoneyDaily = totalMoneyDaily; + } + + public BigDecimal getTotalDelivery() { + return totalDelivery; + } + + public void setTotalDelivery(BigDecimal totalDelivery) { + this.totalDelivery = totalDelivery; + } + + public BigDecimal getTotalFinal() { + return totalFinal; + } + + public void setTotalFinal(BigDecimal totalFinal) { + this.totalFinal = totalFinal; + } + + public BigDecimal getTotalCaja() { + return totalCaja; + } + + public void setTotalCaja(BigDecimal totalCaja) { + this.totalCaja = totalCaja; + } + + public BigDecimal getTotalOtherExpense() { + return totalOtherExpense; + } + + public void setTotalOtherExpense(BigDecimal totalOtherExpense) { + this.totalOtherExpense = totalOtherExpense; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List getClosingDetail() { + return closingDetail; + } + + public void setClosingDetail(List closingDetail) { + this.closingDetail = closingDetail; + } + + public BigDecimal getTotalBox() { + return totalBox; + } + + public void setTotalBox(BigDecimal totalBox) { + this.totalBox = totalBox; + } + + public Long getTotalCustomerWithOutAction() { + return totalCustomerWithOutAction; + } + + public void setTotalCustomerWithOutAction(Long totalCustomerWithOutAction) { + this.totalCustomerWithOutAction = totalCustomerWithOutAction; + } + + public List getPaymentoZeroDetail() { + return paymentoZeroDetail; + } + + public void setPaymentoZeroDetail(List paymentoZeroDetail) { + this.paymentoZeroDetail = paymentoZeroDetail; + } + + public BigDecimal getDeposit() { + return deposit; + } + + public void setDeposit(BigDecimal deposit) { + this.deposit = deposit; + } + + public String getCommentsBitacora() { + return commentsBitacora; + } + + public void setCommentsBitacora(String commentsBitacora) { + this.commentsBitacora = commentsBitacora; + } + + public LoanController getLoanCtrl() { + return loanCtrl; + } + + public void setLoanCtrl(LoanController loanCtrl) { + this.loanCtrl = loanCtrl; + } + + public boolean getImprimirStatus() { + return imprimirStatus; + } + + public void setImprimirStatus(boolean imprimirStatus) { + this.imprimirStatus = imprimirStatus; + } + + + + private ClosingDayController closingDayCtrl; + private GenericController genericCtrl; + private BitacoraController bitacoraCtrl; + private LoanController loanCtrl; + + private List closingDay; + private List user; + + private String userId; + private String amount; + private String total; + + private BigDecimal totalAmount; + private BigDecimal totalTransferSender; + private BigDecimal totalTransferReceiver; + private BigDecimal totalMoneyDaily; + private BigDecimal totalDelivery; + private BigDecimal totalFinal; + private BigDecimal totalCaja; + private BigDecimal totalOtherExpense; + private BigDecimal totalBox; + private Long totalCustomerWithOutAction; + private BigDecimal deposit; + + private String commentsBitacora; + + private String comments; + private boolean imprimirStatus; + + private TotalCashByCurdateView totales; + + private ClosingDay selectedClosingDay; + + private List closingDetail; + private List paymentoZeroDetail; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + + loanCtrl = new LoanController(); + closingDayCtrl = new ClosingDayController(); + bitacoraCtrl = new BitacoraController(); + genericCtrl = new GenericController(); + + //initOneWeekBeforeToCurrdate(); + initThisWeekToCurrdate(); + + imprimirStatus = true; + closingDay = fillDatatableClosingDay(); + commentsBitacora = ""; + user = getUsers(); + getResumen(); + comments = ""; + totalBox = genericCtrl.findAllSmallBox(getLoggedUser().getOffice().getId()); + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/ClosingDayDetailBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/ClosingDayDetailBean.java new file mode 100644 index 0000000..6e94c08 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/ClosingDayDetailBean.java @@ -0,0 +1,100 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.admin.ClosingDayController; +import com.arrebol.apc.model.admin.ClosingDay; +import com.arrebol.apc.model.admin.ClosingDayDetail; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("closingDayDetailManager") +@ViewScoped +public class ClosingDayDetailBean extends GenericBean implements Serializable, Datatable{ + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + public ClosingDayController getClosingDayCtrl() { + return closingDayCtrl; + } + + public void setClosingDayCtrl(ClosingDayController closingDayCtrl) { + this.closingDayCtrl = closingDayCtrl; + } + + public String getClosingDayId() { + return closingDayId; + } + + public void setClosingDayId(String closingDayId) { + this.closingDayId = closingDayId; + } + + public ClosingDay getClosingDay() { + return closingDay; + } + + public void setClosingDay(ClosingDay closingDay) { + this.closingDay = closingDay; + } + + public List getClosingDayDetail() { + return closingDayDetail; + } + + public void setClosingDayDetail(List closingDayDetail) { + this.closingDayDetail = closingDayDetail; + } + + private ClosingDayController closingDayCtrl; + private String closingDayId; + private ClosingDay closingDay; + private List closingDayDetail; + + @PostConstruct + public void init() { + closingDayCtrl = new ClosingDayController(); + setClosingDayId(externalContext().getRequestParameterMap().get("form:dtClosingDay_selection")); + setClosingDay(closingDayCtrl.getClosingDayById(closingDayId)); + setClosingDayDetail(closingDayCtrl.getClosingDayDetailByIdClosingDay(getClosingDayId())); + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/CustomerBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/CustomerBean.java new file mode 100644 index 0000000..d409dcd --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/CustomerBean.java @@ -0,0 +1,169 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.admin.CustomerController; +import com.arrebol.apc.controller.catalog.RouteController; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.PeopleType; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("customerManager") +@ViewScoped +public class CustomerBean extends GenericBean implements Serializable, Datatable{ + + public List fillDatatableCustomer() { + + return customerCtrl.fillCustomersDatatable(getLoggedUser().getOffice().getId()); + } + + public void changeRoute(){ + if(!routeId.isEmpty()){ + if(customerCtrl.updateRouteById(new RouteCtlg(routeId), selectedCustomer.getId(), getLoggedUser().getUser().getId())) + { + showMessage(FacesMessage.SEVERITY_INFO, "Ruta modificada", "Se modificó correctamente."); + } + else + { + showMessage(FacesMessage.SEVERITY_WARN, "Ruta modificada", "Ocurrió un error durante el proceso."); + } + + } + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + customerCtrl.updatePeopleByStatus(ActiveStatus.DISABLED, selectedCustomer.getId(), getLoggedUser().getUser().getId()); + customer.remove(selectedCustomer); + selectedCustomer = null; + showMessage(FacesMessage.SEVERITY_INFO, "Cliente Eliminado", "Se eliminó correctamente."); + } + + public void updatePeopleTypeById() { + if(selectedCustomer.getPeopleType().equals(PeopleType.BOTH)) + { + showMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "El cliente ya se encuentra como Aval."); + return; + } + customerCtrl.updatePeopleTypeById(PeopleType.BOTH, selectedCustomer.getId(), getLoggedUser().getUser().getId()); + customer = null; + selectedCustomer = null; + customer = fillDatatableCustomer(); + showMessage(FacesMessage.SEVERITY_INFO, "Cliente modificado", "Se modificó correctamente."); + } + + /** + * + * @param outcome + * @return + */ + public String detailCustomer(String outcome) { + return outcome; + } + + public CustomerController getCustomerCtrl() { + return customerCtrl; + } + + public void setCustomerCtrl(CustomerController customerCtrl) { + this.customerCtrl = customerCtrl; + } + + public List getCustomer() { + return customer; + } + + public void setCustomer(List customer) { + this.customer = customer; + } + + public People getSelectedCustomer() { + return selectedCustomer; + } + + public void setSelectedCustomer(People selectedCustomer) { + this.selectedCustomer = selectedCustomer; + } + + public String getRouteId() { + return routeId; + } + + public void setRouteId(String routeId) { + this.routeId = routeId; + } + + public RouteController getRouteCtrl() { + return routeCtrl; + } + + public void setRouteCtrl(RouteController routeCtrl) { + this.routeCtrl = routeCtrl; + } + + public List getRoute() { + return route; + } + + public void setRoute(List route) { + this.route = route; + } + + private CustomerController customerCtrl; + private RouteController routeCtrl; + + private List customer; + private List route; + + private People selectedCustomer; + private String routeId; + + @PostConstruct + public void init() { + customerCtrl = new CustomerController(); + routeCtrl = new RouteController(); + customer = fillDatatableCustomer(); + route = routeCtrl.fillRoutesDatatable(getLoggedUser().getOffice().getId()); + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/CustomerDetailBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/CustomerDetailBean.java new file mode 100644 index 0000000..1f44911 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/CustomerDetailBean.java @@ -0,0 +1,175 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.admin.CustomerController; +import com.arrebol.apc.controller.admin.LoanController; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.loan.LoanDetails; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("customerDetailManager") +@ViewScoped +public class CustomerDetailBean extends GenericBean implements Serializable, Datatable { + + public List getDetails(String id) { + try { + loanDetails = loanCtrl.getLoanDetailsbyId(id); + + } catch (Exception e) { + } + return null == loanDetails ? new ArrayList<>() : loanDetails; + } + + public People getCustomerDetail(String peopleId){ + return customerCtrl.findPeopleById(peopleId); + } + + public List getLoanByPeople(String peopleId){ + return customerCtrl.findLoanByCustomer(peopleId); + } + + public void editPeople() + { + if(customer.getBirthdate() == null){ + showMessage(FacesMessage.SEVERITY_FATAL, "Campo obligatorio", "La fecha de cumpleaños es obligatoria"); + return; + } + if(customer.getFirstName() == null){ + showMessage(FacesMessage.SEVERITY_FATAL, "Campo obligatorio", "El primer nombre es obligatoria"); + return; + } + if(customer.getLastName() == null){ + showMessage(FacesMessage.SEVERITY_FATAL, "Campo obligatorio", "El apellido paterno es obligatoria"); + return; + } + if(customer.getMiddleName() == null){ + showMessage(FacesMessage.SEVERITY_FATAL, "Campo obligatorio", "El apellido materno es obligatoria"); + return; + } + if(customer.getPhoneHome()== null){ + showMessage(FacesMessage.SEVERITY_FATAL, "Campo obligatorio", "El teléfono de casa es obligatoria"); + return; + } + if(customer.getAddressHome()== null){ + showMessage(FacesMessage.SEVERITY_FATAL, "Campo obligatorio", "El domicilio personal es obligatoria"); + return; + } + if(customerCtrl.updateByPeopleId(customer)) + { + showMessage(FacesMessage.SEVERITY_INFO, "Cliente modificado", "Se modificó correctamente."); + } + } + + @Override + public void editRow(RowEditEvent event) { + + + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + public CustomerController getCustomerCtrl() { + return customerCtrl; + } + + public void setCustomerCtrl(CustomerController customerCtrl) { + this.customerCtrl = customerCtrl; + } + + public People getCustomer() { + return customer; + } + + public void setCustomer(People customer) { + this.customer = customer; + } + + public String getCustomerId() { + return customerId; + } + + public void setCustomerId(String customerId) { + this.customerId = customerId; + } + + public List getLoan() { + return loan; + } + + public void setLoan(List loan) { + this.loan = loan; + } + + public LoanController getLoanCtrl() { + return loanCtrl; + } + + public void setLoanCtrl(LoanController loanCtrl) { + this.loanCtrl = loanCtrl; + } + + public List getLoanDetails() { + return loanDetails; + } + + public void setLoanDetails(List loanDetails) { + this.loanDetails = loanDetails; + } + + private CustomerController customerCtrl; + private LoanController loanCtrl; + private People customer; + private String customerId; + private List loan; + private List loanDetails; + + @PostConstruct + public void init() { + customerCtrl = new CustomerController(); + loanCtrl = new LoanController(); + setCustomerId(externalContext().getRequestParameterMap().get("form:dtCustomer_selection")); + customer = getCustomerDetail(getCustomerId()); + loan = getLoanByPeople(getCustomerId()); + + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/EmployeeListBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/EmployeeListBean.java new file mode 100644 index 0000000..2b74d92 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/EmployeeListBean.java @@ -0,0 +1,100 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.system.employee.EmployeeController; +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.HumanResourceStatus; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar + */ +@Named("employeeListManager") +@ViewScoped +public class EmployeeListBean extends GenericBean implements Serializable, Datatable { + + + + + public List fillDatatableEmployee() { + return getController().findEmployeesByType( + getLoggedUser().getOffice(), + HumanResourceStatus.ENEBLED, + getLoggedUser().getUser().getHumanResource().getId()); + } + + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + public EmployeeController getController() { + return controller; + } + + public void setController(EmployeeController controller) { + this.controller = controller; + } + + public List getHumanResource() { + return humanResource; + } + + public void setHumanResource(List humanResource) { + this.humanResource = humanResource; + } + + + private EmployeeController controller; + + private List humanResource; + + + @PostConstruct() + public void init() { + loadBundlePropertyFile(); + + controller = new EmployeeController(); + + + setHumanResource(fillDatatableEmployee()); + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/EndorsementBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/EndorsementBean.java new file mode 100644 index 0000000..14aaf0d --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/EndorsementBean.java @@ -0,0 +1,178 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.admin.AdministrationPersonSearchViewController; +import com.arrebol.apc.controller.admin.EndorsementController; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.PeopleType; +import com.arrebol.apc.model.views.AdministrationPersonSerchView; +import com.sun.javafx.scene.control.skin.VirtualFlow; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("endorsementManager") +@ViewScoped +public class EndorsementBean extends GenericPersonSearchBean implements Serializable { + + public List autoCompleteSearchByName(String nameToSearch) { + List results; + try { + results = executeAutoComplete(nameToSearch, PeopleType.ENDORSEMENT); + } catch (Exception e) { + results = new ArrayList<>(); + + logger.error("autoCompleteSearchByName", e); + } + return results; + } + + public void searchPersonAction() { + try { + if ((null == getSearchPersonName() || "".equals(getSearchPersonName().trim())) && getRouteId().equals("All")) { + showMessage(FacesMessage.SEVERITY_WARN, "Ingresar nombre de persona a buscar", "Para hacer una busqueda general en las rutas debes propocionar el nombre de la persona a buscar-"); + } else { + if (getRouteId().equals("All")) { + executeQueryLike(true, PeopleType.ENDORSEMENT); + } else if (null != getSearchPersonName() && !"".equals(getSearchPersonName().trim())) { + boolean allRoutes = false; + + if (getRouteId().equals("All")) { + allRoutes = true; + } + + executeQueryLike(allRoutes, PeopleType.ENDORSEMENT); + } else if (null == getSearchPersonName() || "".equals(getSearchPersonName().trim())) { + fillPersonList(PeopleType.ENDORSEMENT); + } + } + } catch (Exception e) { + logger.error("searchPersonAction", e); + setPersonList(new ArrayList<>()); + } + } + + public List fillDatatableEndorsement() { + return endorsementCtrl.fillEndorsementsDatatable(getLoggedUser().getOffice().getId()); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + getEndorsementCtrl().updatePeopleByStatus(ActiveStatus.DISABLED, getSelectedPerson().getId(), getLoggedUser().getUser().getId()); + cleaningView(); + + showMessage(FacesMessage.SEVERITY_INFO, "Aval Eliminado", "Se eliminó correctamente."); + } + + public void updatePeopleTypeById() { + if (selectedEndorsement.getPeopleType().equals(PeopleType.BOTH)) { + showMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "El aval ya se encuentra como cliente."); + return; + } + //endorsementCtrl.updatePeopleTypeById(PeopleType.BOTH, selectedEndorsement.getId(), getLoggedUser().getUser().getId()); + //endorsement = null; + //endorsement = fillDatatableEndorsement(); + //selectedEndorsement = null; + + getEndorsementCtrl().updatePeopleTypeById(PeopleType.BOTH, getSelectedPerson().getId(), getLoggedUser().getUser().getId()); + cleaningView(); + + showMessage(FacesMessage.SEVERITY_INFO, "Aval modificado", "Se modificó correctamente."); + } + + private void cleaningView() { + getPersonList().remove(getSelectedPerson()); + setSelectedPerson(null); + } + + final Logger logger = LogManager.getLogger(getClass()); + + private EndorsementController endorsementCtrl; + private List endorsement; + private People selectedEndorsement; + + @PostConstruct + public void init() { + try { + loadBundlePropertyFile(); + + endorsementCtrl = new EndorsementController(); + setAdminSearchController(new AdministrationPersonSearchViewController()); + + setRoutes(getAdminSearchController().findAllActiveRoutesByOfficce(getLoggedUser().getOffice().getId())); + } catch (Exception e) { + } + } + + /** + * + * @param outcome + * @return + */ + public String detailEndorsement(String outcome) { + return outcome; + } + + public EndorsementController getEndorsementCtrl() { + return endorsementCtrl; + } + + public void setEndorsementCtrl(EndorsementController endorsementCtrl) { + this.endorsementCtrl = endorsementCtrl; + } + + public List getEndorsement() { + return endorsement; + } + + public void setEndorsement(List endorsement) { + this.endorsement = endorsement; + } + + public People getSelectedEndorsement() { + return selectedEndorsement; + } + + public void setSelectedEndorsement(People selectedEndorsement) { + this.selectedEndorsement = selectedEndorsement; + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/EndorsementDetailBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/EndorsementDetailBean.java new file mode 100644 index 0000000..96ba33f --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/EndorsementDetailBean.java @@ -0,0 +1,143 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.admin.EndorsementController; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("endorsementDetailManager") +@ViewScoped +public class EndorsementDetailBean extends GenericBean implements Serializable, Datatable { + + public People getEndorsementDetail(String peopleId){ + return endorsementCtrl.findPeopleById(peopleId); + } + + public List getLoanByPeople(String peopleId){ + return endorsementCtrl.findLoanByEndorsement(peopleId); + } + + public void editPeople() + { + if(endorsement.getBirthdate() == null){ + showMessage(FacesMessage.SEVERITY_FATAL, "Campo obligatorio", "La fecha de cumpleaños es obligatoria"); + return; + } + if(endorsement.getFirstName() == null){ + showMessage(FacesMessage.SEVERITY_FATAL, "Campo obligatorio", "El primer nombre es obligatoria"); + return; + } + if(endorsement.getLastName() == null){ + showMessage(FacesMessage.SEVERITY_FATAL, "Campo obligatorio", "El apellido paterno es obligatoria"); + return; + } + if(endorsement.getMiddleName() == null){ + showMessage(FacesMessage.SEVERITY_FATAL, "Campo obligatorio", "El apellido materno es obligatoria"); + return; + } + if(endorsement.getPhoneHome()== null){ + showMessage(FacesMessage.SEVERITY_FATAL, "Campo obligatorio", "El teléfono de casa es obligatoria"); + return; + } + if(endorsement.getAddressHome()== null){ + showMessage(FacesMessage.SEVERITY_FATAL, "Campo obligatorio", "El domicilio personal es obligatoria"); + return; + } + if(endorsementCtrl.updateByPeopleId(endorsement)) + { + showMessage(FacesMessage.SEVERITY_INFO, "Aval modificado", "Se modificó correctamente."); + } + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + public EndorsementController getCustomerCtrl() { + return endorsementCtrl; + } + + public void setEndorsementCtrl(EndorsementController endorsementCtrl) { + this.endorsementCtrl = endorsementCtrl; + } + + public People getEndorsement() { + return endorsement; + } + + public void setEndorsement(People endorsement) { + this.endorsement = endorsement; + } + + public String getEndorsementId() { + return endorsementId; + } + + public void setEndorsementId(String endorsementId) { + this.endorsementId = endorsementId; + } + + public List getLoan() { + return loan; + } + + public void setLoan(List loan) { + this.loan = loan; + } + + private EndorsementController endorsementCtrl; + private People endorsement; + private String endorsementId; + private List loan; + + @PostConstruct + public void init() { + endorsementCtrl = new EndorsementController(); + setEndorsementId(externalContext().getRequestParameterMap().get("form:dtEndorsement_selection")); + endorsement = getEndorsementDetail(getEndorsementId()); + loan = getLoanByPeople(getEndorsementId()); + + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/ExpenseCompanyInBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/ExpenseCompanyInBean.java new file mode 100644 index 0000000..eb3942f --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/ExpenseCompanyInBean.java @@ -0,0 +1,239 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.BitacoraController; +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.GenericValidationController; +import com.arrebol.apc.controller.admin.ExpenseCompanyController; +import com.arrebol.apc.controller.admin.StableGeneralBoxController; +import com.arrebol.apc.model.admin.ExpenseCompany; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.ExpenseCompanyType; +import com.arrebol.apc.model.system.logs.Bitacora; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("expenseCompanyInManager") +@ViewScoped +public class ExpenseCompanyInBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setExpenseCompany(fillDatatableExpenseCompany()); + } + } catch (Exception e) { + } + } + + public List fillDatatableExpenseCompany() { + + return getExpenseCompanyCtrl().fillxpenseCompanyInDatatable(getLoggedUser().getOffice().getId(), getStarDate(), getEndDate()); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + Date date = new Date(); + if (genericCtrl.existStableGeneralBoxByCreatedOn(date)) { + showMessage(FacesMessage.SEVERITY_WARN, "Día cerrado", "No se pueden agregar más entradas porque ya se existe un cuadre de caja general de hoy."); + return; + } + + ExpenseCompany expense = new ExpenseCompany(); + expense.setActiveStatus(ActiveStatus.ENEBLED); + expense.setExpenseCompanyType(ExpenseCompanyType.PAYMENT_IN); + expense.setOffice(new Office(getLoggedUser().getOffice().getId())); + expense.setAmount(new BigDecimal(amount)); + expense.setDescription(comments); + expense.setCreatedOn(new Date()); + expense.setCreatedBy(getLoggedUser().getId()); + expenseCompanyCtrl.saveExpenseCompany(expense); + expenseCompany.clear(); + expenseCompany = fillDatatableExpenseCompany(); + amount = ""; + comments = ""; + FacesMessage msg = new FacesMessage("Nueva entrada", "Se agregó correctamente"); + FacesContext.getCurrentInstance().addMessage(null, msg); + } + + @Override + public void deleteRow() { + if (genericCtrl.existStableGeneralBoxByCreatedOn(selectedExpenseCompany.getCreatedOn())) { + showMessage(FacesMessage.SEVERITY_WARN, "Entradas", "No se puede borrar porque ya se realizo el cuadre de caja general del día."); + } else { + boolean delete = true; + delete = selectedExpenseCompany.getActiveStatus() == ActiveStatus.ENEBLED ? true : false; + + if (delete) { + Bitacora bitacora = new Bitacora(); + ExpenseCompany expenseIn = expenseCompanyCtrl.getExpenseById(selectedExpenseCompany.getId()); + bitacora.setAction("Eliminar entrada"); + bitacora.setCommentsUser(commentsBitacora); + bitacora.setCreatedBy(getLoggedUser().getUser().getId()); + bitacora.setCreatedOn(new Date()); + bitacora.setNameUser(getLoggedUser().getUser().getUserName()); + bitacora.setOffice(new Office(getLoggedUser().getOffice().getId())); + bitacora.setDescription("Se eliminó la entrada con monto $" + + expenseIn.getAmount() + " y fecha " + expenseIn.getCreatedOn()); + + expenseCompanyCtrl.updateExpenseCompanyByStatus(ActiveStatus.DISABLED, selectedExpenseCompany.getId(), getLoggedUser().getUser().getId()); + //expenseCompany.remove(selectedExpenseCompany); + searchHistoricalAction(); + bitacoraCtrl.saveBitacora(bitacora); + commentsBitacora = ""; + selectedExpenseCompany = null; + showMessage(FacesMessage.SEVERITY_INFO, "Entrada Eliminada", "Se eliminó correctamente."); + } + } + } + + public ExpenseCompanyController getExpenseCompanyCtrl() { + return expenseCompanyCtrl; + } + + public void setExpenseCompanyCtrl(ExpenseCompanyController expenseCompanyCtrl) { + this.expenseCompanyCtrl = expenseCompanyCtrl; + } + + public List getExpenseCompany() { + return expenseCompany; + } + + public void setExpenseCompany(List expenseCompany) { + this.expenseCompany = expenseCompany; + } + + public String getAmount() { + return amount; + } + + public void setAmount(String amount) { + this.amount = amount; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public ExpenseCompany getSelectedExpenseCompany() { + return selectedExpenseCompany; + } + + public void setSelectedExpenseCompany(ExpenseCompany selectedExpenseCompany) { + this.selectedExpenseCompany = selectedExpenseCompany; + } + + public String getCommentsBitacora() { + return commentsBitacora; + } + + public void setCommentsBitacora(String commentsBitacora) { + this.commentsBitacora = commentsBitacora; + } + + public BitacoraController getBitacoraCtrl() { + return bitacoraCtrl; + } + + public void setBitacoraCtrl(BitacoraController bitacoraCtrl) { + this.bitacoraCtrl = bitacoraCtrl; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public GenericValidationController getGenericValidateController() { + return genericValidateController; + } + + public void setGenericValidateController(GenericValidationController genericController) { + this.genericValidateController = genericController; + } + + public Date getLastStableGeneralBox() { + return lastStableGeneralBox; + } + + public void setLastStableGeneralBox(Date lastStableGeneralBox) { + this.lastStableGeneralBox = lastStableGeneralBox; + } + + private ExpenseCompanyController expenseCompanyCtrl; + private BitacoraController bitacoraCtrl; + private GenericController genericCtrl; + private GenericValidationController genericValidateController; + private Date lastStableGeneralBox; + + private List expenseCompany; + + private String amount; + private String comments; + + private ExpenseCompany selectedExpenseCompany; + + private String commentsBitacora; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initOneWeekBeforeToCurrdate(); + + expenseCompanyCtrl = new ExpenseCompanyController(); + bitacoraCtrl = new BitacoraController(); + genericCtrl = new GenericController(); + setGenericValidateController(new GenericValidationController()); + setLastStableGeneralBox(getGenericValidateController().lastStableGeneralBoxByDate(getLoggedUser().getUser())); + expenseCompany = fillDatatableExpenseCompany(); + commentsBitacora = ""; + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/ExpenseCompanyOutBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/ExpenseCompanyOutBean.java new file mode 100644 index 0000000..eafadd4 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/ExpenseCompanyOutBean.java @@ -0,0 +1,248 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.BitacoraController; +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.GenericValidationController; +import com.arrebol.apc.controller.admin.ExpenseCompanyController; +import com.arrebol.apc.controller.admin.StableGeneralBoxController; +import com.arrebol.apc.model.admin.ExpenseCompany; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.ExpenseCompanyType; +import com.arrebol.apc.model.system.logs.Bitacora; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("expenseCompanyOutManager") +@ViewScoped +public class ExpenseCompanyOutBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setExpenseCompany(fillDatatableExpenseCompany()); + } + } catch (Exception e) { + } + } + + public List fillDatatableExpenseCompany() { + return getExpenseCompanyCtrl().fillxpenseCompanyOutDatatable(getLoggedUser().getOffice().getId(), getStarDate(), getEndDate()); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + Date date = new Date(); + if (genericCtrl.existStableGeneralBoxByCreatedOn(date)) { + showMessage(FacesMessage.SEVERITY_WARN, "Día cerrado", "No se pueden agregar más gastos administrativos porque ya se existe un cuadre de caja general de hoy."); + return; + } + if(stableGeneralBoxCtrl.getTotalBox().compareTo(new BigDecimal(amount))>=0){ + ExpenseCompany expense = new ExpenseCompany(); + expense.setActiveStatus(ActiveStatus.ENEBLED); + expense.setExpenseCompanyType(ExpenseCompanyType.PAYMENT_OUT); + expense.setOffice(new Office(getLoggedUser().getOffice().getId())); + expense.setAmount(new BigDecimal(amount)); + expense.setDescription(comments); + expense.setCreatedOn(new Date()); + expense.setCreatedBy(getLoggedUser().getUser().getId()); + expenseCompanyCtrl.saveExpenseCompany(expense); + expenseCompany.clear(); + + amount = ""; + comments = ""; + totalCaja= stableGeneralBoxCtrl.getTotalBox(); + FacesMessage msg = new FacesMessage("Nueva Salida", "Se agregó correctamente"); + + setExpenseCompany(fillDatatableExpenseCompany()); + FacesContext.getCurrentInstance().addMessage(null, msg);} + else{ + showMessage(FacesMessage.SEVERITY_WARN, "Salida incorrecta", "No se pueden generar la salida porque es mas grande que la cantidad en caja general."); + } + } + + @Override + public void deleteRow() { + if (genericCtrl.existStableGeneralBoxByCreatedOn(selectedExpenseCompany.getCreatedOn())) { + showMessage(FacesMessage.SEVERITY_WARN, "Gasto administrativo", "No se puede borrar porque ya se realizo el cuadre de caja general del día."); + } else { + boolean delete = true; + delete = selectedExpenseCompany.getActiveStatus() == ActiveStatus.ENEBLED ? true : false; + + if (delete) { + Bitacora bitacora = new Bitacora(); + ExpenseCompany expenseOut = expenseCompanyCtrl.getExpenseById(selectedExpenseCompany.getId()); + bitacora.setAction("Eliminar gasto administrativo"); + bitacora.setCommentsUser(commentsBitacora); + bitacora.setCreatedBy(getLoggedUser().getUser().getId()); + bitacora.setCreatedOn(new Date()); + bitacora.setNameUser(getLoggedUser().getUser().getUserName()); + bitacora.setOffice(new Office(getLoggedUser().getOffice().getId())); + bitacora.setDescription("Se eliminó el gasto administrativo con monto $" + + expenseOut.getAmount() + " y fecha " + expenseOut.getCreatedOn()); + + expenseCompanyCtrl.updateExpenseCompanyByStatus(ActiveStatus.DISABLED, selectedExpenseCompany.getId(), getLoggedUser().getUser().getId()); + // expenseCompany.remove(selectedExpenseCompany); + searchHistoricalAction(); + bitacoraCtrl.saveBitacora(bitacora); + commentsBitacora = ""; + selectedExpenseCompany = null; + showMessage(FacesMessage.SEVERITY_INFO, "Gasto administrativo eliminado", "Se eliminó correctamente."); + } + } + } + + public ExpenseCompanyController getExpenseCompanyCtrl() { + return expenseCompanyCtrl; + } + + public void setExpenseCompanyCtrl(ExpenseCompanyController expenseCompanyCtrl) { + this.expenseCompanyCtrl = expenseCompanyCtrl; + } + + public List getExpenseCompany() { + return expenseCompany; + } + + public void setExpenseCompany(List expenseCompany) { + this.expenseCompany = expenseCompany; + } + + public String getAmount() { + return amount; + } + + public void setAmount(String amount) { + this.amount = amount; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public ExpenseCompany getSelectedExpenseCompany() { + return selectedExpenseCompany; + } + + public void setSelectedExpenseCompany(ExpenseCompany selectedExpenseCompany) { + this.selectedExpenseCompany = selectedExpenseCompany; + } + + public BitacoraController getBitacoraCtrl() { + return bitacoraCtrl; + } + + public void setBitacoraCtrl(BitacoraController bitacoraCtrl) { + this.bitacoraCtrl = bitacoraCtrl; + } + + public String getCommentsBitacora() { + return commentsBitacora; + } + + public void setCommentsBitacora(String commentsBitacora) { + this.commentsBitacora = commentsBitacora; + } + + public GenericValidationController getGenericValidateController() { + return genericValidateController; + } + + public void setGenericValidateController(GenericValidationController genericController) { + this.genericValidateController = genericController; + } + + public Date getLastStableGeneralBox() { + return lastStableGeneralBox; + } + + public BigDecimal getTotalCaja() { + return totalCaja; + } + + public void setTotalCaja(BigDecimal totalCaja) { + this.totalCaja = totalCaja; + } + + public void setLastStableGeneralBox(Date lastStableGeneralBox) { + this.lastStableGeneralBox = lastStableGeneralBox; + } + + private ExpenseCompanyController expenseCompanyCtrl; + private BitacoraController bitacoraCtrl; + private GenericController genericCtrl; + private StableGeneralBoxController stableGeneralBoxCtrl; + + private GenericValidationController genericValidateController; + private Date lastStableGeneralBox; + + private List expenseCompany; + + private String amount; + private String comments; + + private BigDecimal totalCaja; + private ExpenseCompany selectedExpenseCompany; + private String commentsBitacora; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initOneWeekBeforeToCurrdate(); + + expenseCompanyCtrl = new ExpenseCompanyController(); + stableGeneralBoxCtrl = new StableGeneralBoxController(); + totalCaja= stableGeneralBoxCtrl.getTotalBox(); + bitacoraCtrl = new BitacoraController(); + genericCtrl = new GenericController(); + setGenericValidateController(new GenericValidationController()); + setLastStableGeneralBox(getGenericValidateController().lastStableGeneralBoxByDate(getLoggedUser().getUser())); + commentsBitacora = ""; + expenseCompany = fillDatatableExpenseCompany(); + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/FeesBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/FeesBean.java new file mode 100644 index 0000000..c79c92e --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/FeesBean.java @@ -0,0 +1,212 @@ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.FeesController; +import com.arrebol.apc.controller.catalog.RouteController; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.views.FeesView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +/** + * + * @author David Rodriguez + */ +@Named("feesManager") +@ViewScoped +public class FeesBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setFees(fillDatatableFees()); + setTotalValue(); + } + } catch (Exception e) { + } + } + + public void searchHistoricalActionByRoute() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setFees(fillDatatableFeesByRoute()); + setTotalValue(); + } + } catch (Exception e) { + } + } + + public BigDecimal searchTotalFeesAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setTotalValue(); + } + } catch (Exception e) { + } + return getTotalFees(); + } + + public FeesController getFeesCtrl() { + return feesCtrl; + } + + public void setFeesCtrl(FeesController feesCtrl) { + this.feesCtrl = feesCtrl; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List fillDatatableFees() { + return getFeesCtrl().fillFeesDataTable(getStarDate(), getEndDate(), getUserSelectedId()); + } + + public List fillDatatableFeesByRoute() { + return getFeesCtrl().fillFeesDataTableByRoute(getStarDate(), getEndDate(), getRouteSelectedId()); + } + + public BigDecimal fillTotalFees() { + return getFeesCtrl().fillTotalFees(getStarDate(), getEndDate()); + } + + public List getFees() { + return fees; + } + + public void setFees(List fees) { + this.fees = fees; + } + + public FeesView getSelectedFees() { + return selectedFees; + } + + public void setSelectedFees(FeesView selectedFees) { + this.selectedFees = selectedFees; + } + + public BigDecimal getTotalFees() { + return totalFees; + } + + public void setTotalFees(BigDecimal totalFees) { + this.totalFees = totalFees; + } + + public List getUsers() { + return genericCtrl.getAllUsersByOffice(getLoggedUser().getOffice().getId()); + } + + public String getUserSelectedId() { + return userSelectedId; + } + + public void setUserSelectedId(String userSelectedId) { + this.userSelectedId = userSelectedId; + } + + public List getRoutes() { + return routes; + } + + public RouteController getRouteCtrl() { + return routeCtrl; + } + + public void setRouteCtrl(RouteController routeCtrl) { + this.routeCtrl = routeCtrl; + } + + public String getRouteSelectedId() { + return routeSelectedId; + } + + public void setRouteSelectedId(String routeSelectedId) { + this.routeSelectedId = routeSelectedId; + } + + private FeesController feesCtrl; + private GenericController genericCtrl; + private List fees; + private FeesView selectedFees; + private BigDecimal totalFees; + + private RouteController routeCtrl; + private List routes; + private String routeSelectedId; + + private List users; + private String userSelectedId; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initOneWeekBeforeToCurrdate(); + + feesCtrl = new FeesController(); + genericCtrl = new GenericController(); + routeCtrl = new RouteController(); + fees = fillDatatableFees(); + setTotalValue(); + routes = routeCtrl.fillRoutesDatatable(getLoggedUser().getOffice().getId()); + } + + private void setTotalValue() { + if (fees != null && !fees.isEmpty()) { + setTotalFees(fees.stream().map(FeesView::getTotalFees).reduce(BigDecimal::add).get()); + } else { + setTotalFees(BigDecimal.ZERO); + } + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/GenericPersonSearchBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/GenericPersonSearchBean.java new file mode 100644 index 0000000..537e543 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/GenericPersonSearchBean.java @@ -0,0 +1,193 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.admin.AdministrationPersonSearchViewController; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.enums.PeopleType; +import com.arrebol.apc.model.views.AdministrationPersonSerchView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.util.ArrayList; +import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.primefaces.event.SelectEvent; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +public abstract class GenericPersonSearchBean extends GenericBean implements Datatable { + + public void onSearchSinglePersonByNameItemSelect(SelectEvent event) { + try { + getPersonList().clear(); + getPersonList().add(getAdminSearchController().administrationPersonSerchViewById(((AdministrationPersonSerchView) event.getObject()).getId())); + } catch (Exception e) { + logger.error("onItemSelect", e); + } + } + + /** + * + * @param type + */ + protected void fillPersonList(PeopleType type) { + try { + setPersonList(getAdminSearchController().findPersonByTypeAndRouteAndOffice(type, getRouteId(), getLoggedUser().getOffice().getId())); + } catch (Exception e) { + setPersonList(new ArrayList<>()); + logger.error("fillPersonList", e); + } + } + + /** + * + * @param nameToSearch + * @param type + * @return + */ + protected List executeAutoComplete(String nameToSearch, PeopleType type) { + List results; + try { + results = getAdminSearchController().likePersonNameInPersonTypeAllRoutesByOffice("%" + nameToSearch + "%", type, getLoggedUser().getOffice().getId()); + } catch (Exception e) { + results = new ArrayList<>(); + + logger.error("executeAutoComplete", e); + } + return results; + } + + /** + * + * @param isAll + * @param peopleType + */ + protected void executeQueryLike(boolean isAll, PeopleType peopleType) { + try { + cleanAndPrepareRoutesDetails(isAll); + fillPersonListLikePersonName(peopleType); + } catch (Exception e) { + logger.error("executeQueryLike", e); + } + } + + /** + * + * @param type + */ + private void fillPersonListLikePersonName(PeopleType type) { + try { + setPersonList(getAdminSearchController().likePersonNameInPersonTypeInRoutesAndOffice("%" + getSearchPersonName() + "%", type, getIdRoutes(), getLoggedUser().getOffice().getId())); + } catch (Exception e) { + setPersonList(new ArrayList<>()); + logger.error("fillPersonListLikePersonName", e); + } + } + + /** + * + * @param isAll + */ + private void cleanAndPrepareRoutesDetails(boolean isAll) { + getIdRoutes().clear(); + + if (isAll) { + getRoutes().forEach((t) -> { + getIdRoutes().add(t.getId()); + }); + } else { + getIdRoutes().add(getRouteId()); + } + + } + + final Logger logger = LogManager.getLogger(getClass()); + + private AdministrationPersonSearchViewController adminSearchController; + private List personList; + private List routes; + private List idRoutes; + private String routeId; + private AdministrationPersonSerchView selectedPerson; + private String searchPersonName; + private AdministrationPersonSerchView searchSinglePersonByName; + + public AdministrationPersonSearchViewController getAdminSearchController() { + return adminSearchController; + } + + public void setAdminSearchController(AdministrationPersonSearchViewController adminSearchController) { + this.adminSearchController = adminSearchController; + } + + public List getPersonList() { + if (null == personList) { + personList = new ArrayList<>(); + } + return personList; + } + + public void setPersonList(List personList) { + this.personList = personList; + } + + public List getRoutes() { + return routes; + } + + public void setRoutes(List routes) { + this.routes = routes; + } + + public List getIdRoutes() { + if (null == idRoutes) { + idRoutes = new ArrayList<>(); + } + return idRoutes; + } + + public void setIdRoutes(List idRoutes) { + this.idRoutes = idRoutes; + } + + public String getRouteId() { + return routeId; + } + + public void setRouteId(String routeId) { + this.routeId = routeId; + } + + public AdministrationPersonSerchView getSelectedPerson() { + return selectedPerson; + } + + public void setSelectedPerson(AdministrationPersonSerchView selectedPerson) { + this.selectedPerson = selectedPerson; + } + + public String getSearchPersonName() { + return searchPersonName; + } + + public void setSearchPersonName(String searchPersonName) { + this.searchPersonName = searchPersonName; + } + + public AdministrationPersonSerchView getSearchSinglePersonByName() { + return searchSinglePersonByName; + } + + public void setSearchSinglePersonByName(AdministrationPersonSerchView searchSinglePersonByName) { + this.searchSinglePersonByName = searchSinglePersonByName; + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/GoalBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/GoalBean.java new file mode 100644 index 0000000..2251cfa --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/GoalBean.java @@ -0,0 +1,155 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.admin.GoalController; +import com.arrebol.apc.model.admin.Goal; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; + +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("goalManager") +@ViewScoped +public class GoalBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setGoal(getGoalCtrl().fillGoalDatatable(getLoggedUser().getOffice().getId(), getStarDate(), getEndDate())); + } + } catch (Exception e) { + } + } + + public List fillDatatableGoal() { + + return getGoalCtrl().fillGoalDatatable(getLoggedUser().getOffice().getId(), getStarDate(), getEndDate()); + } + + @Override + public void editRow(RowEditEvent event) { + Goal goal = (Goal) event.getObject(); + if (goal != null) { + goalCtrl.updateByGoalId(goal); + showMessage(FacesMessage.SEVERITY_INFO, "Registro Editado", "Se hizo el cambio correctamente."); + } + } + + @Override + public void onRowCancel(RowEditEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Edición Cancelada", ((Goal) event.getObject()).getAmount().toString()); + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + goalSave.setActiveStatus(ActiveStatus.ENEBLED); + goalSave.setAmount(new BigDecimal(amount)); + goalSave.setOffice(new Office(getLoggedUser().getOffice().getId())); + goalSave.setCreatedOn(new Date()); + goalSave.setCreatedBy(getLoggedUser().getId()); + goalCtrl.saveGoal(goalSave); + goalSave = new Goal(); + goal.clear(); + goal = fillDatatableGoal(); + amount = ""; + FacesMessage msg = new FacesMessage("Nueva meta", "Se agregó correctamente"); + FacesContext.getCurrentInstance().addMessage(null, msg); + } + + @Override + public void deleteRow() { + goalCtrl.updateGoalByStatus(ActiveStatus.DISABLED, selectedGoal.getId(), getLoggedUser().getUser().getId()); + goal.remove(selectedGoal); + selectedGoal = null; + showMessage(FacesMessage.SEVERITY_INFO, "Meta Eliminada", "Se eliminó correctamente."); + } + + public GoalController getGoalCtrl() { + return goalCtrl; + } + + public void setGoalCtrl(GoalController goalCtrl) { + this.goalCtrl = goalCtrl; + } + + public List getGoal() { + return goal; + } + + public void setGoal(List goal) { + this.goal = goal; + } + + public Goal getSelectedGoal() { + return selectedGoal; + } + + public void setSelectedGoal(Goal selectedGoal) { + this.selectedGoal = selectedGoal; + } + + public String getAmount() { + return amount; + } + + public void setAmount(String amount) { + this.amount = amount; + } + + public Goal getGoalSave() { + return goalSave; + } + + public void setGoalSave(Goal goalSave) { + this.goalSave = goalSave; + } + + private GoalController goalCtrl; + + private List goal; + + private Goal selectedGoal; + private String amount; + + private Goal goalSave; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initOneWeekBeforeToCurrdate(); + + goalCtrl = new GoalController(); + goal = fillDatatableGoal(); + goalSave = new Goal(); + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanDetailTransferBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanDetailTransferBean.java new file mode 100644 index 0000000..db3f9a7 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanDetailTransferBean.java @@ -0,0 +1,331 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.LoanController; +import com.arrebol.apc.controller.catalog.LoanTypeController; +import com.arrebol.apc.controller.catalog.RouteController; +import com.arrebol.apc.controller.util.DateWrapper; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.FeeStatus; +import com.arrebol.apc.model.enums.LoanDetailsType; +import com.arrebol.apc.model.enums.LoanStatus; +import com.arrebol.apc.model.enums.PeopleType; +import com.arrebol.apc.model.enums.TransferStatus; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.loan.LoanDetails; +import com.arrebol.apc.model.loan.LoanFeeNotification; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar + */ + +@Named("loanDetailTransferManager") +@ViewScoped +public class LoanDetailTransferBean extends GenericBean implements Serializable, Datatable { + + + public List fillDatatableLoan() { + return getLoanCtrl().fillAllTransfersLoanDetails(); + } + + + public void authorizeLoanDetail(){ + getLoanCtrl().updateAuthorizeLoanDetailById(selectedLoanDetails.getId()); + + showMessage(FacesMessage.SEVERITY_INFO, "Deposito validado", "El depostio fue autorizado."); + setLoanDetails(fillDatatableLoan()); + + } + + + public void rejectLoanDetail(){ + getLoanCtrl().updateRejectLoanDetailById(selectedLoanDetails.getId()); + + showMessage(FacesMessage.SEVERITY_INFO, "Deposito validado", "El depostio fue rechazado."); + + + LoanDetails detail = new LoanDetails(); + Loan loan = selectedLoanDetails.getLoan(); + detail.setComments("Transferencia cancelada"); + detail.setCreatedBy(getLoggedUser().getUser().getId()); + detail.setCreatedOn(new Date()); + detail.setLoan(loan); + detail.setLoanDetailsType(LoanDetailsType.FEE); + detail.setTransferStatus(TransferStatus.AUTHORIZED); + detail.setTransferNumber("N/A"); + detail.setFeeStatus(FeeStatus.TO_PAY); + detail.setPaymentAmount(loan.getLoanType().getFee()); + detail.setPeopleType(PeopleType.CUSTOMER); + detail.setReferenceNumber(selectedLoanDetails.getLoan().getLastReferenceNumber() + 1); + detail.setUser(selectedLoanDetails.getUser()); + if (loanCtrl.saveLoanDetail(detail)) { + Loan loanUpdate = loanCtrl.getLoanById(loan.getId()); + loanUpdate.setAmountToPay(loanUpdate.getAmountToPay().add(loan.getLoanType().getFee())); + loanUpdate.setAmountPaid(loanUpdate.getAmountPaid().subtract(selectedLoanDetails.getPaymentAmount())); + loanUpdate.setLastUpdatedOn(new Date()); + loanUpdate.setLastUpdatedBy(getLoggedUser().getUser().getId()); + loanUpdate.setLastReferenceNumber(loanUpdate.getLastReferenceNumber() + 1); + loanCtrl.updateLoan(loanUpdate); + + LoanFeeNotification notification = new LoanFeeNotification(); + notification.setCreatedBy(getLoggedUser().getUser().getId()); + notification.setCreatedOn(new Date()); + notification.setLoan(loanUpdate); + notification.setUser(selectedLoanDetails.getUser()); + notification.setNotificationNumber(loanUpdate.getTotalFeeByLoan() + 1); + loanCtrl.saveLoanNotificationFee(notification); + + + showMessage(FacesMessage.SEVERITY_INFO, "Multa creada", "Se creo la multa de forma correcta."); + } + setLoanDetails(fillDatatableLoan()); + + } + public void deleteLoan() { + /* loanCtrl.updateLoanByStatusWeb(LoanStatus.DELETED, selectedLoan.getId(), getLoggedUser().getUser().getId()); + loanCtrl.updateLoanByUserByStatus(LoanStatus.DELETED, selectedLoan); + loan.remove(selectedLoan); + selectedLoan = null; + + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de estatus", "El préstamo se cambió a estatus 'Eliminado' de forma correcta.");*/ + } + + public void changeApprovedStatus() { + /*loanCtrl.updateLoanByStatusWeb(LoanStatus.APPROVED, selectedLoan.getId(), getLoggedUser().getUser().getId()); + loanCtrl.updateLoanByUserByStatus(LoanStatus.APPROVED, selectedLoan); + loan.clear(); + loan = fillDatatableLoan(); + selectedLoan = null; + + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de estatus", "El préstamo se cambió a estatus 'Aprobado' de forma correcta.");*/ + } + + public void changeFinishStatus() { + /*loanCtrl.updateLoanByStatusWeb(LoanStatus.FINISH, selectedLoan.getId(), getLoggedUser().getUser().getId()); + loanCtrl.updateLoanByUserByStatus(LoanStatus.FINISH, selectedLoan); + loan.clear(); + loan = fillDatatableLoan(); + selectedLoan = null; + + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de estatus", "El préstamo se cambió a estatus 'Aprobado' de forma correcta.");*/ + } + + public void deletePaymentLoan() { + + /*if (selectedLoan.getLoanStatus() == LoanStatus.APPROVED || selectedLoan.getLoanStatus() == LoanStatus.PENDING_RENOVATION) { + + List details = loanCtrl.getLoanDetailsCurdatebyIdLoan(selectedLoan.getId()); + if (details != null && !details.isEmpty()) { + Loan loanUpdate = loanCtrl.getLoanById(selectedLoan.getId()); + for (LoanDetails detail : details) { + loanUpdate.setAmountPaid(loanUpdate.getAmountPaid().subtract(detail.getPaymentAmount())); + loanUpdate.setLastReferenceNumber(loanUpdate.getLastReferenceNumber() - 1); + } + if (loanCtrl.deleteLoanDetailsByLoanCurdate(selectedLoan)) { + loanCtrl.updateLoan(loanUpdate); + loan.clear(); + loan = fillDatatableLoan(); + selectedLoan = null; + showMessage(FacesMessage.SEVERITY_INFO, "Abonos eliminados", "Se eliminó el/los abonos del día de hoy correctamente."); + } + } else { + showMessage(FacesMessage.SEVERITY_WARN, "Advertencia", "El préstamo no tiene registrado abonos el día de hoy"); + } + } + else + { + showMessage(FacesMessage.SEVERITY_WARN, "No se puede eliminar abono", "Solo puedes eliminar el abono de préstamos en estatus Aprobados o Pendiente por renovación"); + return; + }*/ + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + /** + * + * @param outcome + * @return + */ + public String detailLoan(String outcome) { + return outcome; + } + + public LoanController getLoanCtrl() { + return loanCtrl; + } + + public void setLoanCtrl(LoanController loanCtrl) { + this.loanCtrl = loanCtrl; + } + + public List getLoanDetails() { + return loanDetails; + } + + public void setLoanDetails(List loanDetails) { + this.loanDetails = loanDetails; + } + + public LoanDetails getSelectedLoanDetails() { + return selectedLoanDetails; + } + + public void setSelectedLoanDetails(LoanDetails selectedLoanDetails) { + this.selectedLoanDetails = selectedLoanDetails; + } + + + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List getUsers() { + return users; + } + + public void setUsers(List users) { + this.users = users; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public BigDecimal getPayment() { + return payment; + } + + public void setPayment(BigDecimal payment) { + this.payment = payment; + } + + public BigDecimal getFee() { + return fee; + } + + public void setFee(BigDecimal fee) { + this.fee = fee; + } + + public LoanTypeController getLoanTypeCtrl() { + return loanTypeCtrl; + } + + public void setLoanTypeCtrl(LoanTypeController loanTypeCtrl) { + this.loanTypeCtrl = loanTypeCtrl; + } + + public String getLoanTypeId() { + return loanTypeId; + } + + public void setLoanTypeId(String loanTypeId) { + this.loanTypeId = loanTypeId; + } + + public String getRouteId() { + return routeId; + } + + public void setRouteId(String routeId) { + this.routeId = routeId; + } + + public RouteController getRouteCtrl() { + return routeCtrl; + } + + public void setRouteCtrl(RouteController routeCtrl) { + this.routeCtrl = routeCtrl; + } + + private LoanController loanCtrl; + private LoanTypeController loanTypeCtrl; + private GenericController genericCtrl; + private RouteController routeCtrl; + + private List loanDetails; + private List users; + private LoanDetails selectedLoanDetails; + private String comments; + private String userId; + private BigDecimal payment; + private BigDecimal fee; + private String loanTypeId; + private String routeId; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + + loanCtrl = new LoanController(); + genericCtrl = new GenericController(); + loanTypeCtrl = new LoanTypeController(); + routeCtrl = new RouteController(); + users = genericCtrl.getAllUsersByOffice(getLoggedUser().getOffice().getId()); + + setLoanDetails(fillDatatableLoan()); + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanEmployeeListBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanEmployeeListBean.java new file mode 100644 index 0000000..2a8f406 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanEmployeeListBean.java @@ -0,0 +1,411 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.BitacoraController; +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.GenericValidationController; +import com.arrebol.apc.controller.admin.LoanEmployeeController; +import com.arrebol.apc.model.admin.ExpenseCompany; +import com.arrebol.apc.model.admin.LoanEmployee; +import com.arrebol.apc.model.admin.LoanEmployeeDetails; +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.views.LoanEmployeeView; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.system.logs.Bitacora; +import com.arrebol.apc.model.views.LoanEmployeeDetailAllDataView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Administrador + */ +@Named("loanEmployeeListBean") +@ViewScoped +public class LoanEmployeeListBean extends GenericBean implements Serializable, Datatable { + + public List getDetails(String idLoan) { + try { + setLoanEmployeeDetails(getController().getLoanEmployeeDetailByIdLoan(idLoan)); + setTotalAmountLoan(fillTotalAmountLoan()); + } catch (Exception e) { + } + return null == loanEmployeeDetails ? new ArrayList<>() : loanEmployeeDetails; + } + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setLoanEmployee(getController().fillLoanEmployeeDataTable(getStarDate(), getEndDate())); + } + } catch (Exception e) { + } + } + + public BigDecimal searchTotalAmountLoan() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setTotalAmountLoan(fillTotalAmountLoan()); + } + } catch (Exception e) { + } + return getTotalAmountLoan(); + } + + public BigDecimal fillTotalAmountLoan() { + return getController().fillTotalAmountLoan(getStarDate(), getEndDate()); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + Date date = new Date(); + if (genericCtrl.existStableGeneralBoxByCreatedOn(date)) { + showMessage(FacesMessage.SEVERITY_WARN, "Día cerrado", "No se pueden agregar más préstamos a empleados porque ya se existe un cuadre de caja general de hoy."); + return; + } + + if(amountLoan.compareTo(BigDecimal.ZERO)==0 || amountToPay.compareTo(BigDecimal.ZERO)==0 ){ + + showMessage(FacesMessage.SEVERITY_WARN, "Prestamo Incorrecto", "No se pueden agregar préstamos a empleados con monto o monto de abonos de 0"); + return; + + } + + if(amountLoan.compareTo(amountToPay)<=0){ + + showMessage(FacesMessage.SEVERITY_WARN, "Prestamo Incorrecto", "No se pueden agregar préstamos a empleados con valor a pagar menor a sus abonos"); + return; + + } + + LoanEmployee loan = new LoanEmployee(); + loan.setIdEmployee(userId); + loan.setCreatedOn(new Date()); + loan.setCreatedBy(getLoggedUser().getUser().getId()); + loan.setAmountLoan(amountLoan); + loan.setAmountToPay(amountToPay); + loan.setLoanEmployeeStatus(ActiveStatus.ENEBLED); + + // Calcula numero de semanas + Double interes = 0.05; + Double interesReal = 0.0; + Double semanasD = amountLoan.doubleValue()/amountToPay.doubleValue(); + int numSemanas = semanasD.intValue(); + double residuo = semanasD - numSemanas; + if(residuo != 0.0){ + numSemanas += 1; + } + + // Calcula número de meses + int numMeses = numSemanas/4; + if(numSemanas % 4 > 0){ + numMeses += 1; + } + + // Calcula el interes real 0.05 por el número de meses + interesReal = interes * numMeses; + Double saldoTotal = (amountLoan.doubleValue() * interesReal) + amountLoan.doubleValue(); + loan.setTotalAmountToPay(new BigDecimal(saldoTotal)); + loan.setBalance(new BigDecimal(saldoTotal)); + + HumanResource hr = users.stream().filter(p -> p.getId().equals(userId)).findFirst().get(); + hr.setBalance(hr.getBalance().add(new BigDecimal(saldoTotal))); + + getController().saveLoanEmployee(loan, hr); + + userId = ""; + amountLoan = BigDecimal.ZERO; + amountToPay = BigDecimal.ZERO; + + setLoanEmployee(getController().fillLoanEmployeeDataTable(getStarDate(), getEndDate())); + } + + public void addRowLoanDetail() { + + if(loanDetailAmount.compareTo(BigDecimal.ZERO)==0){ + + showMessage(FacesMessage.SEVERITY_WARN, "Abono Incorrecto", "No se pueden agregar un abono de 0"); + return; + + } + + if(loanDetailAmount.compareTo(BigDecimal.ZERO)<0){ + + showMessage(FacesMessage.SEVERITY_WARN, "Abono Incorrecto", "No se pueden agregar un abono negativo"); + return; + + } + + if (genericCtrl.existStableGeneralBoxByCreatedOn(new Date())) { + showMessage(FacesMessage.SEVERITY_WARN, "Día cerrado", "No se pueden hacer mas abonos a prestamos porque ya se existe un cuadre de caja general de hoy."); + return; + } + + + if(loanDetailAmount.compareTo(selectedLoan.getBalance())<=0){ + if(selectedLoan.getLoanEmployeeStatus()== ActiveStatus.ENEBLED){ + LoanEmployeeDetails loanDetail = new LoanEmployeeDetails(); + loanDetail.setIdLoan(selectedLoan.getId()); + loanDetail.setIdUser(selectedLoan.getIdUser()); + loanDetail.setPaymentAmount(loanDetailAmount); + loanDetail.setReferenceNumber(selectedLoan.getReferenceNumber() + 1); + loanDetail.setCreatedOn(new Date()); + loanDetail.setCreatedBy(getLoggedUser().getUser().getId()); + loanDetail.setLoanEmployeeDetailStatus(ActiveStatus.ENEBLED); + loanDetail.setPayroll(ActiveStatus.DISABLED); + + HumanResource hr = users.stream().filter(p -> p.getId().equals(selectedLoan.getIdUser())).findFirst().get(); + hr.setBalance(hr.getBalance().subtract(loanDetailAmount)); + + LoanEmployee loan = getController().getLoanEmployeeById(selectedLoan.getId()); + loan.setBalance(loan.getBalance().subtract(loanDetailAmount)); + + getController().saveLoanEmployeeDetail(loanDetail, hr, loan); + loanDetailAmount = BigDecimal.ZERO; + + setLoanEmployee(getController().fillLoanEmployeeDataTable(getStarDate(), getEndDate())); + showMessage(FacesMessage.SEVERITY_INFO, "Abono correcto", "Abono creado correctamente.");} + else{ + showMessage(FacesMessage.SEVERITY_WARN, "Prestamo deshabilitado", "No se puede abonar a un préstamo deshabilitado"); + } + }else{ + showMessage(FacesMessage.SEVERITY_WARN, "Cantidad incorrecta", "La cantidad a abonar es mayor a la deuda faltante del préstamo"); + } + + } + + @Override + public void deleteRow() { + + if (genericCtrl.existStableGeneralBoxByCreatedOn(selectedLoan.getCreatedOn())) { + showMessage(FacesMessage.SEVERITY_WARN, "Préstamo a empleado", "No se puede borrar porque ya se realizó el cuadre de caja general del día."); + } else { + if(selectedLoan.getTotalAmountToPay().compareTo(selectedLoan.getBalance())==0){ + boolean delete = true; + delete = selectedLoan.getLoanEmployeeStatus() == ActiveStatus.ENEBLED ? true : false; + + if (delete) { + getController().updateLoanEmployeeByStatus(ActiveStatus.DISABLED, selectedLoan.getId(), getLoggedUser().getUser().getId()); + setLoanEmployee(getController().fillLoanEmployeeDataTable(getStarDate(), getEndDate())); + + Bitacora bitacora = new Bitacora(); + LoanEmployee loan = getController().getLoanEmployeeById(selectedLoan.getId()); + bitacora.setAction("Eliminar gasto administrativo"); + bitacora.setCommentsUser(commentsBitacora); + bitacora.setCreatedBy(getLoggedUser().getUser().getId()); + bitacora.setCreatedOn(new Date()); + bitacora.setNameUser(getLoggedUser().getUser().getUserName()); + bitacora.setOffice(new Office(getLoggedUser().getOffice().getId())); + bitacora.setDescription("Se eliminó el prestamo con monto $" + + loan.getAmountLoan()+ " y fecha " + loan.getCreatedOn()); + + /* + List details = getDetails(selectedLoan.getId()); + if (details != null) { + for (LoanEmployeeDetailAllDataView detail : details) { + getController().updateLoanEmployeeDetailByStatus(ActiveStatus.DISABLED, detail.getId(), getLoggedUser().getUser().getId()); + } + }*/ + + bitacoraCtrl.saveBitacora(bitacora); + commentsBitacora = ""; + selectedLoan = null; + showMessage(FacesMessage.SEVERITY_INFO, "Préstamo a empleado eliminado", "Se eliminó correctamente."); + } + } + else{ + showMessage(FacesMessage.SEVERITY_INFO, "Préstamo tiene abonos agregados", "No se puede borrar un préstamo con abonos."); + } + + } + } + + private LoanEmployeeController controller; + private GenericController genericCtrl; + private List loanEmployeeView; + private List loanEmployeeDetails; + private LoanEmployeeView selectedLoan; + private List users; + private String userId; + private BigDecimal amountLoan; + private BigDecimal amountToPay; + private BigDecimal loanDetailAmount; + private BigDecimal totalAmountLoan; + + private BitacoraController bitacoraCtrl; + private GenericValidationController genericValidateController; + private Date lastStableGeneralBox; + private String commentsBitacora; + + public BigDecimal getTotalAmountLoan() { + return totalAmountLoan; + } + + public void setTotalAmountLoan(BigDecimal totalAmountLoan) { + this.totalAmountLoan = totalAmountLoan; + } + + public BigDecimal getAmountLoan() { + return amountLoan; + } + + public void setAmountLoan(BigDecimal amountLoan) { + this.amountLoan = amountLoan; + } + + public BigDecimal getLoanDetailAmount() { + return loanDetailAmount; + } + + public void setLoanDetailAmount(BigDecimal loanDetailAmount) { + this.loanDetailAmount = loanDetailAmount; + } + + public BigDecimal getAmountToPay() { + return amountToPay; + } + + public void setAmountToPay(BigDecimal amountToPay) { + this.amountToPay = amountToPay; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List getUsers() { + return users; + } + + public void setUsers(List users) { + this.users = users; + } + + public List getLoanEmployeeView() { + return loanEmployeeView; + } + + public void setLoanEmployeeView(List loanEmployeeView) { + this.loanEmployeeView = loanEmployeeView; + } + + public LoanEmployeeView getSelectedLoan() { + return selectedLoan; + } + + public void setSelectedLoan(LoanEmployeeView selectedLoan) { + this.selectedLoan = selectedLoan; + } + + public LoanEmployeeController getController() { + return controller; + } + + public void setController(LoanEmployeeController controller) { + this.controller = controller; + } + + public List getLoanEmployee() { + return loanEmployeeView; + } + + public void setLoanEmployee(List loanEmployee) { + this.loanEmployeeView = loanEmployee; + } + + public List getLoanEmployeeDetails() { + return loanEmployeeDetails; + } + + public void setLoanEmployeeDetails(List loanEmployeeDetails) { + this.loanEmployeeDetails = loanEmployeeDetails; + } + + public String getCommentsBitacora() { + return commentsBitacora; + } + + public void setCommentsBitacora(String commentsBitacora) { + this.commentsBitacora = commentsBitacora; + } + + public GenericValidationController getGenericValidateController() { + return genericValidateController; + } + + public void setGenericValidateController(GenericValidationController genericController) { + this.genericValidateController = genericController; + } + + public Date getLastStableGeneralBox() { + return lastStableGeneralBox; + } + + public void setLastStableGeneralBox(Date lastStableGeneralBox) { + this.lastStableGeneralBox = lastStableGeneralBox; + } + + @PostConstruct + public void init() { + try { + loadBundlePropertyFile(); + genericCtrl = new GenericController(); + setController(new LoanEmployeeController()); + bitacoraCtrl = new BitacoraController(); + setGenericValidateController(new GenericValidationController()); + setLastStableGeneralBox(getGenericValidateController().lastStableGeneralBoxByDate(getLoggedUser().getUser())); + setLoanEmployee(getController().fillLoanEmployeeDataTable(getStarDate(), getEndDate())); + // users = genericCtrl.getAllUsersByOffice(getLoggedUser().getOffice().getId()); + users = genericCtrl.getAllHRByOffice(getLoggedUser().getOffice().getId()); + totalAmountLoan = fillTotalAmountLoan(); + } catch (Exception e) { + } + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanHistoryBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanHistoryBean.java new file mode 100644 index 0000000..574408d --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanHistoryBean.java @@ -0,0 +1,546 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.LoanController; +import com.arrebol.apc.controller.catalog.LoanTypeController; +import com.arrebol.apc.controller.catalog.RouteController; +import com.arrebol.apc.controller.util.DateWrapper; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.LoanStatus; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.loan.LoanType; +import com.arrebol.apc.model.views.HistoryLoanView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("loanHistoryManager") +@ViewScoped +public class LoanHistoryBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setLoan(getLoanCtrl().fillAllLoansViewDatatable(getStarDate(), getEndDate())); + } + } catch (Exception e) { + } + } + + public List fillDatatableLoan() { + return getLoanCtrl().fillAllLoansViewDatatable(getStarDate(), getEndDate()); + } + + public void changeBonusNewCustomer() { + loanCtrl.updateBonusNewCustomer(ActiveStatus.ENEBLED, selectedLoan.getId(), getLoggedUser().getUser().getId()); + loan.clear(); + loan = fillDatatableLoan(); + selectedLoan = null; + + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de bono", "El préstamo empezó a contar como bono de cliente nuevo."); + } + + public void removeBonusNewCustomer() { + loanCtrl.updateBonusNewCustomer(ActiveStatus.DISABLED, selectedLoan.getId(), getLoggedUser().getUser().getId()); + loan.clear(); + loan = fillDatatableLoan(); + selectedLoan = null; + + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de bono", "El préstamo ya no contará como bono de cliente nuevo."); + } + + public void deleteFeeLoan() { + + /* if (selectedLoan.getEstatusPrestamo()== LoanStatus.APPROVED.getValue() || selectedLoan.getEstatusPrestamo() == LoanStatus.PENDING_RENOVATION.getValue()) { + + List details = loanCtrl.getLoanDetailsFeeCurdatebyIdLoan(selectedLoan.getId()); + if (details != null && !details.isEmpty()) { + Loan loanUpdate = loanCtrl.getLoanById(selectedLoan.getId()); + for (LoanDetails detail : details) { + loanUpdate.setAmountToPay(loanUpdate.getAmountToPay().subtract(detail.getPaymentAmount())); + } + if (loanCtrl.deleteLoanDetailsFeeByLoanCurdate(selectedLoan)) { + loanCtrl.deleteLoanFeeNotificationByLoanCurdate(selectedLoan); + loanCtrl.updateLoan(loanUpdate); + loan.clear(); + loan = fillDatatableLoan(); + selectedLoan = null; + showMessage(FacesMessage.SEVERITY_INFO, "Multas eliminadas", "Se eliminó el/las multas del día de hoy correctamente."); + } + } else { + showMessage(FacesMessage.SEVERITY_WARN, "Advertencia", "El préstamo no tiene registrado multas el día de hoy"); + } + } + else + { + showMessage(FacesMessage.SEVERITY_WARN, "No se puede eliminar la multa", "Solo puedes eliminar la multa de préstamos en estatus Aprobados o Pendiente por renovación"); + return; + }*/ + } + + public void changeRoute() { + if (!routeId.isEmpty()) { + if (loanCtrl.updateRouteById(new RouteCtlg(routeId), selectedLoan.getId(), getLoggedUser().getUser().getId())) { + showMessage(FacesMessage.SEVERITY_INFO, "Ruta modificada", "Se modificó correctamente."); + } else { + showMessage(FacesMessage.SEVERITY_WARN, "Ruta modificada", "Ocurrió un error durante el proceso."); + } + + } + } + + public void changeLoanType() { + if (selectedLoan.getEstatusPrestamo() != LoanStatus.TO_DELIVERY.getValue()) { + loanTypeId = ""; + selectedLoan = null; + showMessage(FacesMessage.SEVERITY_WARN, "No se puede cambiar el tipo de préstamo", "Solo puedes cambiar el monto a prestar de préstamos en estatus Por liberar"); + return; + } + Loan loanUpdate = loanCtrl.getLoanById(selectedLoan.getId()); + loanUpdate.setLoanType(new LoanType(loanTypeId)); + loanUpdate.setAmountToPay(loanTypeCtrl.getLoanTypeById(loanTypeId).getPaymentTotal()); + if (loanCtrl.updateLoan(loanUpdate)) { + loan.clear(); + loan = fillDatatableLoan(); + loanTypeId = ""; + selectedLoan = null; + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de tipo de préstamo", "El préstamo se cambió correctamente"); + } + + } + + public void deleteLoan() { + /* loanCtrl.updateLoanByStatusWeb(LoanStatus.DELETED, selectedLoan.getId(), getLoggedUser().getUser().getId()); + loanCtrl.updateLoanByUserByStatus(LoanStatus.DELETED, selectedLoan); + loan.remove(selectedLoan); + selectedLoan = null; + + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de estatus", "El préstamo se cambió a estatus 'Eliminado' de forma correcta.");*/ + } + + public void changeApprovedStatus() { + /*loanCtrl.updateLoanByStatusWeb(LoanStatus.APPROVED, selectedLoan.getId(), getLoggedUser().getUser().getId()); + loanCtrl.updateLoanByUserByStatus(LoanStatus.APPROVED, selectedLoan); + loan.clear(); + loan = fillDatatableLoan(); + selectedLoan = null; + + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de estatus", "El préstamo se cambió a estatus 'Aprobado' de forma correcta.");*/ + } + + public void changeFinishStatus() { + /*loanCtrl.updateLoanByStatusWeb(LoanStatus.FINISH, selectedLoan.getId(), getLoggedUser().getUser().getId()); + loanCtrl.updateLoanByUserByStatus(LoanStatus.FINISH, selectedLoan); + loan.clear(); + loan = fillDatatableLoan(); + selectedLoan = null; + + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de estatus", "El préstamo se cambió a estatus 'Aprobado' de forma correcta.");*/ + } + + public void deletePaymentLoan() { + + /*if (selectedLoan.getLoanStatus() == LoanStatus.APPROVED || selectedLoan.getLoanStatus() == LoanStatus.PENDING_RENOVATION) { + + List details = loanCtrl.getLoanDetailsCurdatebyIdLoan(selectedLoan.getId()); + if (details != null && !details.isEmpty()) { + Loan loanUpdate = loanCtrl.getLoanById(selectedLoan.getId()); + for (LoanDetails detail : details) { + loanUpdate.setAmountPaid(loanUpdate.getAmountPaid().subtract(detail.getPaymentAmount())); + loanUpdate.setLastReferenceNumber(loanUpdate.getLastReferenceNumber() - 1); + } + if (loanCtrl.deleteLoanDetailsByLoanCurdate(selectedLoan)) { + loanCtrl.updateLoan(loanUpdate); + loan.clear(); + loan = fillDatatableLoan(); + selectedLoan = null; + showMessage(FacesMessage.SEVERITY_INFO, "Abonos eliminados", "Se eliminó el/los abonos del día de hoy correctamente."); + } + } else { + showMessage(FacesMessage.SEVERITY_WARN, "Advertencia", "El préstamo no tiene registrado abonos el día de hoy"); + } + } + else + { + showMessage(FacesMessage.SEVERITY_WARN, "No se puede eliminar abono", "Solo puedes eliminar el abono de préstamos en estatus Aprobados o Pendiente por renovación"); + return; + }*/ + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + public void addPayment() { + /*if (selectedLoan.getLoanStatus() == LoanStatus.APPROVED || selectedLoan.getLoanStatus() == LoanStatus.PENDING_RENOVATION) { + LoanDetails detail = new LoanDetails(); + detail.setComments(comments); + detail.setCreatedBy(getLoggedUser().getUser().getId()); + detail.setCreatedOn(new Date()); + detail.setLoan(selectedLoan); + detail.setLoanDetailsType(LoanDetailsType.PAYMENT); + detail.setPaymentAmount(payment); + detail.setPeopleType(PeopleType.CUSTOMER); + detail.setReferenceNumber(selectedLoan.getLastReferenceNumber() + 1); + detail.setUser(new User(userId)); + if (loanCtrl.saveLoanDetail(detail)) { + Loan loanUpdate = loanCtrl.getLoanById(selectedLoan.getId()); + loanUpdate.setAmountPaid(loanUpdate.getAmountPaid().add(payment)); + loanUpdate.setLastReferenceNumber(loanUpdate.getLastReferenceNumber() + 1); + if (loanUpdate.getAmountToPay().compareTo(loanUpdate.getAmountPaid()) == 0) { + + LoanByUser loanByUser = loanCtrl.getLoanByUserByIdLoan(loanUpdate); + loanByUser.setLoanByUserStatus(LoanStatus.FINISH); + if (loanCtrl.updateLoanByUser(loanByUser)) { + loanUpdate.setLoanStatus(LoanStatus.FINISH); + } + } + loanCtrl.updateLoan(loanUpdate); + loan.clear(); + loan = fillDatatableLoan(); + selectedLoan = null; + userId = ""; + comments = ""; + payment = BigDecimal.ZERO; + showMessage(FacesMessage.SEVERITY_INFO, "Agregar abono", "Se agregó el abono de forma correcta."); + } + } else { + selectedLoan = null; + userId = ""; + comments = ""; + payment = BigDecimal.ZERO; + showMessage(FacesMessage.SEVERITY_WARN, "No se puede abonar", "Solo puedes abonar préstamos en estatus Aprobados o Pendientes por renovación"); + return; + }*/ + + } + + public void addFee() { + /*if (selectedLoan.getLoanStatus() != LoanStatus.APPROVED) { + selectedLoan = null; + userId = ""; + comments = ""; + fee = BigDecimal.ZERO; + showMessage(FacesMessage.SEVERITY_WARN, "No se puede multar", "Solo puedes multar préstamos en estatus Aprobados"); + return; + } + LoanDetails detail = new LoanDetails(); + detail.setComments(comments); + detail.setCreatedBy(getLoggedUser().getUser().getId()); + detail.setCreatedOn(new Date()); + detail.setLoan(selectedLoan); + detail.setLoanDetailsType(LoanDetailsType.FEE); + detail.setPaymentAmount(fee); + detail.setPeopleType(PeopleType.CUSTOMER); + detail.setReferenceNumber(selectedLoan.getLastReferenceNumber() + 1); + detail.setUser(new User(userId)); + if (loanCtrl.saveLoanDetail(detail)) { + Loan loanUpdate = loanCtrl.getLoanById(selectedLoan.getId()); + loanUpdate.setAmountToPay(loanUpdate.getAmountToPay().add(fee)); + loanUpdate.setLastReferenceNumber(loanUpdate.getLastReferenceNumber() + 1); + loanCtrl.updateLoan(loanUpdate); + + LoanFeeNotification notification = new LoanFeeNotification(); + notification.setCreatedBy(getLoggedUser().getUser().getId()); + notification.setCreatedOn(new Date()); + notification.setLoan(loanUpdate); + notification.setUser(new User(userId)); + notification.setNotificationNumber(loanUpdate.getTotalFeeByLoan() + 1); + loanCtrl.saveLoanNotificationFee(notification); + + loan.clear(); + loan = fillDatatableLoan(); + selectedLoan = null; + userId = ""; + comments = ""; + fee = BigDecimal.ZERO; + showMessage(FacesMessage.SEVERITY_INFO, "Agregar multa", "Se agregó la multa de forma correcta."); + }*/ + } + + public void changeOwner() { + /*if (selectedLoan.getLoanStatus() != LoanStatus.APPROVED) { + selectedLoan = null; + userId = ""; + showMessage(FacesMessage.SEVERITY_WARN, "No se puede modificar propietario", "Solo puedes cambiar de propietario a préstamos en estatus Aprobados"); + return; + } + LoanByUser old = new LoanByUser(); + old = loanCtrl.getLoanByUserByIdLoan(selectedLoan); + + LoanByUser loanByUser = new LoanByUser(); + LoanByUserId idRelation = new LoanByUserId(); + + idRelation.setIdLoan(selectedLoan.getId()); + idRelation.setIdUser(userId); + + loanByUser.setId(idRelation); + loanByUser.setComments(old.getComments()); + loanByUser.setCreatedBy(old.getCreatedBy()); + loanByUser.setLoanByUserStatus(old.getLoanByUserStatus()); + loanByUser.setLoan(selectedLoan); + loanByUser.setOrderInList(old.getOrderInList()); + loanByUser.setOwnerLoan(OwnerLoan.CURRENT_OWNER); + loanByUser.setUser(new User(userId)); + if (loanCtrl.deleteLoanByUser(old)) { + loanCtrl.saveLoanByUser(loanByUser); + selectedLoan = null; + userId = ""; + loan.clear(); + loan = fillDatatableLoan(); + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de propietario", "Se reasignó el préstamo de forma correcta."); + } else { + selectedLoan = null; + showMessage(FacesMessage.SEVERITY_ERROR, "Cambio de propietario", "Ocurrió un error al intentar hacer el cambio de propietario."); + }*/ + } + + /** + * + */ + private void initStartAndEndDates() { + try { + Calendar starDateCalendar = Calendar.getInstance(); + + starDateCalendar.setTime(DateWrapper.getTodayMXTime()); + starDateCalendar.add(Calendar.MONTH, -1); + + setStarDate(starDateCalendar.getTime()); + setEndDate(DateWrapper.getTodayMXTime()); + } catch (Exception e) { + + } + } + + public void approvedLoan() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + /** + * + * @param outcome + * @return + */ + public String detailLoan(String outcome) { + return outcome; + } + + public LoanController getLoanCtrl() { + return loanCtrl; + } + + public void setLoanCtrl(LoanController loanCtrl) { + this.loanCtrl = loanCtrl; + } + + public List getLoan() { + return loan; + } + + public void setLoan(List loan) { + this.loan = loan; + } + + public HistoryLoanView getSelectedLoan() { + return selectedLoan; + } + + public void setSelectedLoan(HistoryLoanView selectedLoan) { + this.selectedLoan = selectedLoan; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List getUsers() { + return users; + } + + public void setUsers(List users) { + this.users = users; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public BigDecimal getPayment() { + return payment; + } + + public void setPayment(BigDecimal payment) { + this.payment = payment; + } + + public BigDecimal getFee() { + return fee; + } + + public void setFee(BigDecimal fee) { + this.fee = fee; + } + + public LoanTypeController getLoanTypeCtrl() { + return loanTypeCtrl; + } + + public void setLoanTypeCtrl(LoanTypeController loanTypeCtrl) { + this.loanTypeCtrl = loanTypeCtrl; + } + + public List getLoanType() { + return loanType; + } + + public void setLoanType(List loanType) { + this.loanType = loanType; + } + + public String getLoanTypeId() { + return loanTypeId; + } + + public void setLoanTypeId(String loanTypeId) { + this.loanTypeId = loanTypeId; + } + + public String getRouteId() { + return routeId; + } + + public void setRouteId(String routeId) { + this.routeId = routeId; + } + + public RouteController getRouteCtrl() { + return routeCtrl; + } + + public void setRouteCtrl(RouteController routeCtrl) { + this.routeCtrl = routeCtrl; + } + + public List getRoute() { + return route; + } + + public void setRoute(List route) { + this.route = route; + } + + public Date getStarDate() { + return starDate; + } + + public void setStarDate(Date starDate) { + this.starDate = starDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + private LoanController loanCtrl; + private LoanTypeController loanTypeCtrl; + private GenericController genericCtrl; + private RouteController routeCtrl; + + private List loan; + private List users; + private List loanType; + private List route; + private HistoryLoanView selectedLoan; + private String comments; + private String userId; + private BigDecimal payment; + private BigDecimal fee; + private String loanTypeId; + private String routeId; + + private Date starDate; + private Date endDate; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + + loanCtrl = new LoanController(); + genericCtrl = new GenericController(); + loanTypeCtrl = new LoanTypeController(); + routeCtrl = new RouteController(); + initStartAndEndDates(); + users = genericCtrl.getAllUsersByOffice(getLoggedUser().getOffice().getId()); + loanType = loanTypeCtrl.fillLoanTypeDatatable(getLoggedUser().getOffice().getId()); + route = routeCtrl.fillRoutesDatatable(getLoggedUser().getOffice().getId()); + + setLoan(fillDatatableLoan()); + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanHistoryDetailBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanHistoryDetailBean.java new file mode 100644 index 0000000..ec8c5bf --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanHistoryDetailBean.java @@ -0,0 +1,220 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.admin.CustomerController; +import com.arrebol.apc.controller.admin.EndorsementController; +import com.arrebol.apc.controller.admin.LoanController; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.enums.LoanStatus; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.loan.LoanDetails; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("loanHistoryDetailManager") +@ViewScoped +public class LoanHistoryDetailBean extends GenericBean implements Serializable, Datatable { + + public List getDetails(String id) { + try { + loanDetails = loanCtrl.getLoanDetailsbyId(id); + + } catch (Exception e) { + } + return null == loanDetails ? new ArrayList<>() : loanDetails; + } + + public People getCustomerDetail(String peopleId){ + return customerCtrl.findPeopleById(peopleId); + } + + public List getLoanByCustomer(String peopleId){ + return customerCtrl.findLoanByCustomer(peopleId); + } + + public List getLoanByEndorsement(String peopleId){ + return endorsementCtrl.findLoanByEndorsement(peopleId); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + public CustomerController getCustomerCtrl() { + return customerCtrl; + } + + public void setCustomerCtrl(CustomerController customerCtrl) { + this.customerCtrl = customerCtrl; + } + + public People getCustomer() { + return customer; + } + + public void setCustomer(People customer) { + this.customer = customer; + } + + public List getLoanCustomer() { + return loanCustomer; + } + + public void setLoanCustomer(List loanCustomer) { + this.loanCustomer = loanCustomer; + } + + public String getCustomerId() { + return customerId; + } + + public void setCustomerId(String customerId) { + this.customerId = customerId; + } + + public LoanController getLoanCtrl() { + return loanCtrl; + } + + public void setLoanCtrl(LoanController loanCtrl) { + this.loanCtrl = loanCtrl; + } + + public String getLoanId() { + return loanId; + } + + public void setLoanId(String loanId) { + this.loanId = loanId; + } + + public Loan getLoan() { + return loan; + } + + public void setLoan(Loan loan) { + this.loan = loan; + } + + public EndorsementController getEndorsementCtrl() { + return endorsementCtrl; + } + + public void setEndorsementCtrl(EndorsementController endorsementCtrl) { + this.endorsementCtrl = endorsementCtrl; + } + + public People getEndorsement() { + return endorsement; + } + + public void setEndorsement(People endorsement) { + this.endorsement = endorsement; + } + + public String getEndorsementId() { + return endorsementId; + } + + public void setEndorsementId(String endorsementId) { + this.endorsementId = endorsementId; + } + + public List getLoanEndorsement() { + return loanEndorsement; + } + + public void setLoanEndorsement(List loanEndorsement) { + this.loanEndorsement = loanEndorsement; + } + + public Loan getSelectedLoanCustomer() { + return selectedLoanCustomer; + } + + public void setSelectedLoanCustomer(Loan selectedLoanCustomer) { + this.selectedLoanCustomer = selectedLoanCustomer; + } + + public List getLoanDetails() { + return loanDetails; + } + + public void setLoanDetails(List loanDetails) { + this.loanDetails = loanDetails; + } + + private CustomerController customerCtrl; + private LoanController loanCtrl; + private EndorsementController endorsementCtrl; + + private People customer; + private Loan loan; + private People endorsement; + + private String customerId; + private String loanId; + private String endorsementId; + + private List loanEndorsement; + private List loanCustomer; + private Loan selectedLoanCustomer; + + private List loanDetails; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + customerCtrl = new CustomerController(); + loanCtrl = new LoanController(); + endorsementCtrl = new EndorsementController(); + + setLoanId(externalContext().getRequestParameterMap().get("form:dtLoan_selection")); + loan = loanCtrl.getLoanById(getLoanId()); + customer = loan.getCustomer(); + endorsement = loan.getEndorsement(); + loanEndorsement = getLoanByEndorsement(loan.getEndorsement().getId()); + loanCustomer = getLoanByCustomer(loan.getCustomer().getId()); + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanHistoryJuridicalBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanHistoryJuridicalBean.java new file mode 100644 index 0000000..6d39ef0 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanHistoryJuridicalBean.java @@ -0,0 +1,546 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.LoanController; +import com.arrebol.apc.controller.catalog.LoanTypeController; +import com.arrebol.apc.controller.catalog.RouteController; +import com.arrebol.apc.controller.util.DateWrapper; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.LoanStatus; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.loan.LoanType; +import com.arrebol.apc.model.views.HistoryLoanView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("loanHistoryJuridicalManager") +@ViewScoped +public class LoanHistoryJuridicalBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setLoan(getLoanCtrl().fillAllLoansJuridicalViewDatatable(getStarDate(), getEndDate())); + } + } catch (Exception e) { + } + } + + public List fillDatatableLoan() { + return getLoanCtrl().fillAllLoansJuridicalViewDatatable(getStarDate(), getEndDate()); + } + + public void changeBonusNewCustomer() { + loanCtrl.updateBonusNewCustomer(ActiveStatus.ENEBLED, selectedLoan.getId(), getLoggedUser().getUser().getId()); + loan.clear(); + loan = fillDatatableLoan(); + selectedLoan = null; + + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de bono", "El préstamo empezó a contar como bono de cliente nuevo."); + } + + public void removeBonusNewCustomer() { + loanCtrl.updateBonusNewCustomer(ActiveStatus.DISABLED, selectedLoan.getId(), getLoggedUser().getUser().getId()); + loan.clear(); + loan = fillDatatableLoan(); + selectedLoan = null; + + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de bono", "El préstamo ya no contará como bono de cliente nuevo."); + } + + public void deleteFeeLoan() { + + /* if (selectedLoan.getEstatusPrestamo()== LoanStatus.APPROVED.getValue() || selectedLoan.getEstatusPrestamo() == LoanStatus.PENDING_RENOVATION.getValue()) { + + List details = loanCtrl.getLoanDetailsFeeCurdatebyIdLoan(selectedLoan.getId()); + if (details != null && !details.isEmpty()) { + Loan loanUpdate = loanCtrl.getLoanById(selectedLoan.getId()); + for (LoanDetails detail : details) { + loanUpdate.setAmountToPay(loanUpdate.getAmountToPay().subtract(detail.getPaymentAmount())); + } + if (loanCtrl.deleteLoanDetailsFeeByLoanCurdate(selectedLoan)) { + loanCtrl.deleteLoanFeeNotificationByLoanCurdate(selectedLoan); + loanCtrl.updateLoan(loanUpdate); + loan.clear(); + loan = fillDatatableLoan(); + selectedLoan = null; + showMessage(FacesMessage.SEVERITY_INFO, "Multas eliminadas", "Se eliminó el/las multas del día de hoy correctamente."); + } + } else { + showMessage(FacesMessage.SEVERITY_WARN, "Advertencia", "El préstamo no tiene registrado multas el día de hoy"); + } + } + else + { + showMessage(FacesMessage.SEVERITY_WARN, "No se puede eliminar la multa", "Solo puedes eliminar la multa de préstamos en estatus Aprobados o Pendiente por renovación"); + return; + }*/ + } + + public void changeRoute() { + if (!routeId.isEmpty()) { + if (loanCtrl.updateRouteById(new RouteCtlg(routeId), selectedLoan.getId(), getLoggedUser().getUser().getId())) { + showMessage(FacesMessage.SEVERITY_INFO, "Ruta modificada", "Se modificó correctamente."); + } else { + showMessage(FacesMessage.SEVERITY_WARN, "Ruta modificada", "Ocurrió un error durante el proceso."); + } + + } + } + + public void changeLoanType() { + if (selectedLoan.getEstatusPrestamo() != LoanStatus.TO_DELIVERY.getValue()) { + loanTypeId = ""; + selectedLoan = null; + showMessage(FacesMessage.SEVERITY_WARN, "No se puede cambiar el tipo de préstamo", "Solo puedes cambiar el monto a prestar de préstamos en estatus Por liberar"); + return; + } + Loan loanUpdate = loanCtrl.getLoanById(selectedLoan.getId()); + loanUpdate.setLoanType(new LoanType(loanTypeId)); + loanUpdate.setAmountToPay(loanTypeCtrl.getLoanTypeById(loanTypeId).getPaymentTotal()); + if (loanCtrl.updateLoan(loanUpdate)) { + loan.clear(); + loan = fillDatatableLoan(); + loanTypeId = ""; + selectedLoan = null; + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de tipo de préstamo", "El préstamo se cambió correctamente"); + } + + } + + public void deleteLoan() { + /* loanCtrl.updateLoanByStatusWeb(LoanStatus.DELETED, selectedLoan.getId(), getLoggedUser().getUser().getId()); + loanCtrl.updateLoanByUserByStatus(LoanStatus.DELETED, selectedLoan); + loan.remove(selectedLoan); + selectedLoan = null; + + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de estatus", "El préstamo se cambió a estatus 'Eliminado' de forma correcta.");*/ + } + + public void changeApprovedStatus() { + /*loanCtrl.updateLoanByStatusWeb(LoanStatus.APPROVED, selectedLoan.getId(), getLoggedUser().getUser().getId()); + loanCtrl.updateLoanByUserByStatus(LoanStatus.APPROVED, selectedLoan); + loan.clear(); + loan = fillDatatableLoan(); + selectedLoan = null; + + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de estatus", "El préstamo se cambió a estatus 'Aprobado' de forma correcta.");*/ + } + + public void changeFinishStatus() { + /*loanCtrl.updateLoanByStatusWeb(LoanStatus.FINISH, selectedLoan.getId(), getLoggedUser().getUser().getId()); + loanCtrl.updateLoanByUserByStatus(LoanStatus.FINISH, selectedLoan); + loan.clear(); + loan = fillDatatableLoan(); + selectedLoan = null; + + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de estatus", "El préstamo se cambió a estatus 'Aprobado' de forma correcta.");*/ + } + + public void deletePaymentLoan() { + + /*if (selectedLoan.getLoanStatus() == LoanStatus.APPROVED || selectedLoan.getLoanStatus() == LoanStatus.PENDING_RENOVATION) { + + List details = loanCtrl.getLoanDetailsCurdatebyIdLoan(selectedLoan.getId()); + if (details != null && !details.isEmpty()) { + Loan loanUpdate = loanCtrl.getLoanById(selectedLoan.getId()); + for (LoanDetails detail : details) { + loanUpdate.setAmountPaid(loanUpdate.getAmountPaid().subtract(detail.getPaymentAmount())); + loanUpdate.setLastReferenceNumber(loanUpdate.getLastReferenceNumber() - 1); + } + if (loanCtrl.deleteLoanDetailsByLoanCurdate(selectedLoan)) { + loanCtrl.updateLoan(loanUpdate); + loan.clear(); + loan = fillDatatableLoan(); + selectedLoan = null; + showMessage(FacesMessage.SEVERITY_INFO, "Abonos eliminados", "Se eliminó el/los abonos del día de hoy correctamente."); + } + } else { + showMessage(FacesMessage.SEVERITY_WARN, "Advertencia", "El préstamo no tiene registrado abonos el día de hoy"); + } + } + else + { + showMessage(FacesMessage.SEVERITY_WARN, "No se puede eliminar abono", "Solo puedes eliminar el abono de préstamos en estatus Aprobados o Pendiente por renovación"); + return; + }*/ + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + public void addPayment() { + /*if (selectedLoan.getLoanStatus() == LoanStatus.APPROVED || selectedLoan.getLoanStatus() == LoanStatus.PENDING_RENOVATION) { + LoanDetails detail = new LoanDetails(); + detail.setComments(comments); + detail.setCreatedBy(getLoggedUser().getUser().getId()); + detail.setCreatedOn(new Date()); + detail.setLoan(selectedLoan); + detail.setLoanDetailsType(LoanDetailsType.PAYMENT); + detail.setPaymentAmount(payment); + detail.setPeopleType(PeopleType.CUSTOMER); + detail.setReferenceNumber(selectedLoan.getLastReferenceNumber() + 1); + detail.setUser(new User(userId)); + if (loanCtrl.saveLoanDetail(detail)) { + Loan loanUpdate = loanCtrl.getLoanById(selectedLoan.getId()); + loanUpdate.setAmountPaid(loanUpdate.getAmountPaid().add(payment)); + loanUpdate.setLastReferenceNumber(loanUpdate.getLastReferenceNumber() + 1); + if (loanUpdate.getAmountToPay().compareTo(loanUpdate.getAmountPaid()) == 0) { + + LoanByUser loanByUser = loanCtrl.getLoanByUserByIdLoan(loanUpdate); + loanByUser.setLoanByUserStatus(LoanStatus.FINISH); + if (loanCtrl.updateLoanByUser(loanByUser)) { + loanUpdate.setLoanStatus(LoanStatus.FINISH); + } + } + loanCtrl.updateLoan(loanUpdate); + loan.clear(); + loan = fillDatatableLoan(); + selectedLoan = null; + userId = ""; + comments = ""; + payment = BigDecimal.ZERO; + showMessage(FacesMessage.SEVERITY_INFO, "Agregar abono", "Se agregó el abono de forma correcta."); + } + } else { + selectedLoan = null; + userId = ""; + comments = ""; + payment = BigDecimal.ZERO; + showMessage(FacesMessage.SEVERITY_WARN, "No se puede abonar", "Solo puedes abonar préstamos en estatus Aprobados o Pendientes por renovación"); + return; + }*/ + + } + + public void addFee() { + /*if (selectedLoan.getLoanStatus() != LoanStatus.APPROVED) { + selectedLoan = null; + userId = ""; + comments = ""; + fee = BigDecimal.ZERO; + showMessage(FacesMessage.SEVERITY_WARN, "No se puede multar", "Solo puedes multar préstamos en estatus Aprobados"); + return; + } + LoanDetails detail = new LoanDetails(); + detail.setComments(comments); + detail.setCreatedBy(getLoggedUser().getUser().getId()); + detail.setCreatedOn(new Date()); + detail.setLoan(selectedLoan); + detail.setLoanDetailsType(LoanDetailsType.FEE); + detail.setPaymentAmount(fee); + detail.setPeopleType(PeopleType.CUSTOMER); + detail.setReferenceNumber(selectedLoan.getLastReferenceNumber() + 1); + detail.setUser(new User(userId)); + if (loanCtrl.saveLoanDetail(detail)) { + Loan loanUpdate = loanCtrl.getLoanById(selectedLoan.getId()); + loanUpdate.setAmountToPay(loanUpdate.getAmountToPay().add(fee)); + loanUpdate.setLastReferenceNumber(loanUpdate.getLastReferenceNumber() + 1); + loanCtrl.updateLoan(loanUpdate); + + LoanFeeNotification notification = new LoanFeeNotification(); + notification.setCreatedBy(getLoggedUser().getUser().getId()); + notification.setCreatedOn(new Date()); + notification.setLoan(loanUpdate); + notification.setUser(new User(userId)); + notification.setNotificationNumber(loanUpdate.getTotalFeeByLoan() + 1); + loanCtrl.saveLoanNotificationFee(notification); + + loan.clear(); + loan = fillDatatableLoan(); + selectedLoan = null; + userId = ""; + comments = ""; + fee = BigDecimal.ZERO; + showMessage(FacesMessage.SEVERITY_INFO, "Agregar multa", "Se agregó la multa de forma correcta."); + }*/ + } + + public void changeOwner() { + /*if (selectedLoan.getLoanStatus() != LoanStatus.APPROVED) { + selectedLoan = null; + userId = ""; + showMessage(FacesMessage.SEVERITY_WARN, "No se puede modificar propietario", "Solo puedes cambiar de propietario a préstamos en estatus Aprobados"); + return; + } + LoanByUser old = new LoanByUser(); + old = loanCtrl.getLoanByUserByIdLoan(selectedLoan); + + LoanByUser loanByUser = new LoanByUser(); + LoanByUserId idRelation = new LoanByUserId(); + + idRelation.setIdLoan(selectedLoan.getId()); + idRelation.setIdUser(userId); + + loanByUser.setId(idRelation); + loanByUser.setComments(old.getComments()); + loanByUser.setCreatedBy(old.getCreatedBy()); + loanByUser.setLoanByUserStatus(old.getLoanByUserStatus()); + loanByUser.setLoan(selectedLoan); + loanByUser.setOrderInList(old.getOrderInList()); + loanByUser.setOwnerLoan(OwnerLoan.CURRENT_OWNER); + loanByUser.setUser(new User(userId)); + if (loanCtrl.deleteLoanByUser(old)) { + loanCtrl.saveLoanByUser(loanByUser); + selectedLoan = null; + userId = ""; + loan.clear(); + loan = fillDatatableLoan(); + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de propietario", "Se reasignó el préstamo de forma correcta."); + } else { + selectedLoan = null; + showMessage(FacesMessage.SEVERITY_ERROR, "Cambio de propietario", "Ocurrió un error al intentar hacer el cambio de propietario."); + }*/ + } + + /** + * + */ + private void initStartAndEndDates() { + try { + Calendar starDateCalendar = Calendar.getInstance(); + + starDateCalendar.setTime(DateWrapper.getTodayMXTime()); + starDateCalendar.add(Calendar.MONTH, -1); + + setStarDate(starDateCalendar.getTime()); + setEndDate(DateWrapper.getTodayMXTime()); + } catch (Exception e) { + + } + } + + public void approvedLoan() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + /** + * + * @param outcome + * @return + */ + public String detailLoan(String outcome) { + return outcome; + } + + public LoanController getLoanCtrl() { + return loanCtrl; + } + + public void setLoanCtrl(LoanController loanCtrl) { + this.loanCtrl = loanCtrl; + } + + public List getLoan() { + return loan; + } + + public void setLoan(List loan) { + this.loan = loan; + } + + public HistoryLoanView getSelectedLoan() { + return selectedLoan; + } + + public void setSelectedLoan(HistoryLoanView selectedLoan) { + this.selectedLoan = selectedLoan; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List getUsers() { + return users; + } + + public void setUsers(List users) { + this.users = users; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public BigDecimal getPayment() { + return payment; + } + + public void setPayment(BigDecimal payment) { + this.payment = payment; + } + + public BigDecimal getFee() { + return fee; + } + + public void setFee(BigDecimal fee) { + this.fee = fee; + } + + public LoanTypeController getLoanTypeCtrl() { + return loanTypeCtrl; + } + + public void setLoanTypeCtrl(LoanTypeController loanTypeCtrl) { + this.loanTypeCtrl = loanTypeCtrl; + } + + public List getLoanType() { + return loanType; + } + + public void setLoanType(List loanType) { + this.loanType = loanType; + } + + public String getLoanTypeId() { + return loanTypeId; + } + + public void setLoanTypeId(String loanTypeId) { + this.loanTypeId = loanTypeId; + } + + public String getRouteId() { + return routeId; + } + + public void setRouteId(String routeId) { + this.routeId = routeId; + } + + public RouteController getRouteCtrl() { + return routeCtrl; + } + + public void setRouteCtrl(RouteController routeCtrl) { + this.routeCtrl = routeCtrl; + } + + public List getRoute() { + return route; + } + + public void setRoute(List route) { + this.route = route; + } + + public Date getStarDate() { + return starDate; + } + + public void setStarDate(Date starDate) { + this.starDate = starDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + private LoanController loanCtrl; + private LoanTypeController loanTypeCtrl; + private GenericController genericCtrl; + private RouteController routeCtrl; + + private List loan; + private List users; + private List loanType; + private List route; + private HistoryLoanView selectedLoan; + private String comments; + private String userId; + private BigDecimal payment; + private BigDecimal fee; + private String loanTypeId; + private String routeId; + + private Date starDate; + private Date endDate; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + + loanCtrl = new LoanController(); + genericCtrl = new GenericController(); + loanTypeCtrl = new LoanTypeController(); + routeCtrl = new RouteController(); + initStartAndEndDates(); + users = genericCtrl.getAllUsersByOffice(getLoggedUser().getOffice().getId()); + loanType = loanTypeCtrl.fillLoanTypeDatatable(getLoggedUser().getOffice().getId()); + route = routeCtrl.fillRoutesDatatable(getLoggedUser().getOffice().getId()); + + setLoan(fillDatatableLoan()); + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanPendingBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanPendingBean.java new file mode 100644 index 0000000..8474a8e --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanPendingBean.java @@ -0,0 +1,482 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.BitacoraController; +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.CustomerController; +import com.arrebol.apc.controller.admin.EndorsementController; +import com.arrebol.apc.controller.admin.LoanController; +import com.arrebol.apc.controller.catalog.LoanTypeController; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.LoanDetailsType; +import com.arrebol.apc.model.enums.LoanRenovationStatus; +import com.arrebol.apc.model.enums.LoanStatus; +import com.arrebol.apc.model.enums.OwnerLoan; +import com.arrebol.apc.model.enums.PeopleType; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.loan.LoanByRenovation; +import com.arrebol.apc.model.loan.LoanByUser; +import com.arrebol.apc.model.loan.LoanByUserId; +import com.arrebol.apc.model.loan.LoanDetails; +import com.arrebol.apc.model.loan.LoanType; +import com.arrebol.apc.model.system.logs.Bitacora; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("loanPendingManager") +@ViewScoped +public class LoanPendingBean extends GenericBean implements Serializable, Datatable { + + public List fillDatatableLoan() { + + return loanCtrl.fillLoanByStatusPendingDatatable(getLoggedUser().getOffice().getId()); + } + + @Override + public void editRow(RowEditEvent event) { + + } + + public void calculationFunction() { + if (loanTypeId != null && !loanTypeId.isEmpty()) { + total = loanTypeCtrl.getLoanTypeById(loanTypeId).getPaymentTotal().add(totalFee).subtract(totalPayment); + } else { + total = BigDecimal.ZERO; + } + } + + public void approvedLoan() { + loanCtrl.updateLoanByStatus(LoanStatus.TO_DELIVERY, selectedLoan.getId(), getLoggedUser().getUser().getId()); + loanCtrl.updateLoanByUserByStatus(LoanStatus.TO_DELIVERY, selectedLoan); + loan.remove(selectedLoan); + selectedLoan = null; + selectedLoan = null; + + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de estatus", "la venta se cambió a estatus 'A conciliar' de forma correcta."); + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + Loan loanSave = new Loan(); + loanSave.setComments(comments); + loanSave.setCustomer(new People(customerId)); + if (endorsementId != null && !endorsementId.isEmpty() && !endorsementId.equals("0")) { + loanSave.setEndorsement(new People(endorsementId)); + } + loanSave.setLoanType(new LoanType(loanTypeId)); + if (aprobado) { + loanSave.setLoanStatus(LoanStatus.APPROVED); + } else if (terminado) { + loanSave.setLoanStatus(LoanStatus.FINISH); + } else { + loanSave.setLoanStatus(LoanStatus.PENDING); + } + loanSave.setAmountPaid(totalPayment); + loanSave.setRouteCtlg(customerCtrl.findPeopleById(customerId).getRouteCtlg()); + if (totalPayment.compareTo(BigDecimal.ZERO) == 0 && totalFee.compareTo(BigDecimal.ZERO) == 0) { + loanSave.setLastReferenceNumber(0); + } + if (totalPayment.compareTo(BigDecimal.ZERO) > 0 && totalFee.compareTo(BigDecimal.ZERO) == 0) { + loanSave.setLastReferenceNumber(1); + } + if (totalPayment.compareTo(BigDecimal.ZERO) == 0 && totalFee.compareTo(BigDecimal.ZERO) > 0) { + loanSave.setLastReferenceNumber(1); + } + if (totalPayment.compareTo(BigDecimal.ZERO) > 0 && totalFee.compareTo(BigDecimal.ZERO) > 0) { + loanSave.setLastReferenceNumber(2); + } + loanSave.setAmountToPay(loanTypeCtrl.getLoanTypeById(loanTypeId).getPaymentTotal().add(totalFee)); + loanSave.setCreatedBy(userId); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(createdOn); + calendar.set(Calendar.HOUR_OF_DAY, 12); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + loanSave.setCreatedOn(new Date()); + loanSave.setLastUpdatedOn(new Date()); + + if (loanCtrl.saveLoan(loanSave)) { + Loan temp = loanCtrl.getLoanById(loanSave.getId()); + String userName = ""; + for (User user : users) { + if (user.getId().equalsIgnoreCase(userId)) { + userName = user.getHumanResource().getFirstName() + " " + + user.getHumanResource().getLastName(); + break; + } + } + Calendar fechaAct = Calendar.getInstance(); + if (fechaAct.before(calendar)) { + Bitacora bitacora = new Bitacora(); + bitacora.setAction("Préstamo postfechado"); + bitacora.setCommentsUser(""); + bitacora.setCreatedBy(getLoggedUser().getUser().getId()); + bitacora.setCreatedOn(new Date()); + bitacora.setDescription("El usuario " + userName + " postfechó la venta del cliente " + temp.getCustomer().getFullName() + + ", con cantidad de $" + temp.getLoanType().getPayment() + " al día " + temp.getCreatedOn()); + bitacora.setNameUser(getLoggedUser().getUser().getUserName()); + bitacora.setOffice(new Office(getLoggedUser().getOffice().getId())); + bitacoraCtrl.saveBitacora(bitacora); + } + + LoanByUser loanByUser = new LoanByUser(); + LoanByUserId idRelation = new LoanByUserId(); + + idRelation.setIdLoan(loanSave.getId()); + idRelation.setIdUser(userId); + + loanByUser.setId(idRelation); + loanByUser.setComments(comments); + loanByUser.setCreatedBy(getLoggedUser().getUser().getId()); + if (aprobado) { + loanByUser.setLoanByUserStatus(LoanStatus.APPROVED); + } else if (terminado) { + loanByUser.setLoanByUserStatus(LoanStatus.FINISH); + } else { + loanByUser.setLoanByUserStatus(LoanStatus.PENDING); + } + loanByUser.setLoan(loanSave); + loanByUser.setOrderInList(0); + loanByUser.setOwnerLoan(OwnerLoan.CURRENT_OWNER); + loanByUser.setUser(new User(userId)); + loanCtrl.saveLoanByUser(loanByUser); + + int contador = 1; + if (totalPayment.compareTo(BigDecimal.ZERO) > 0) { + LoanDetails detail = new LoanDetails(); + detail.setComments(comments); + detail.setCreatedBy(getLoggedUser().getUser().getId()); + detail.setCreatedOn(createdOn); + detail.setLoan(loanSave); + detail.setLoanDetailsType(LoanDetailsType.PAYMENT); + detail.setPaymentAmount(totalPayment); + detail.setPeopleType(PeopleType.CUSTOMER); + detail.setReferenceNumber(contador); + detail.setUser(new User(userId)); + if (loanCtrl.saveLoanDetail(detail)) { + contador++; + } + } + if (totalFee.compareTo(BigDecimal.ZERO) > 0) { + LoanDetails detail = new LoanDetails(); + detail.setComments(comments); + detail.setCreatedBy(getLoggedUser().getUser().getId()); + detail.setCreatedOn(createdOn); + detail.setLoan(loanSave); + detail.setLoanDetailsType(LoanDetailsType.FEE); + detail.setPaymentAmount(totalFee); + detail.setPeopleType(PeopleType.CUSTOMER); + detail.setReferenceNumber(contador); + detail.setUser(new User(userId)); + if (loanCtrl.saveLoanDetail(detail)) { + contador++; + } + } + + } + loan.clear(); + createdOn = new Date(); + comments = ""; + customerId = ""; + endorsementId = ""; + loanTypeId = ""; + userId = ""; + total = BigDecimal.ZERO; + totalFee = BigDecimal.ZERO; + totalPayment = BigDecimal.ZERO; + aprobado = false; + terminado = false; + loan = fillDatatableLoan(); + FacesMessage msg = new FacesMessage("Nueva venta", "Se agregó correctamente"); + FacesContext.getCurrentInstance().addMessage(null, msg); + } + + @Override + public void deleteRow() { + loanCtrl.updateLoanByStatus(LoanStatus.REJECTED, selectedLoan.getId(), getLoggedUser().getUser().getId()); + loanCtrl.updateLoanByUserByStatus(LoanStatus.REJECTED, selectedLoan); + + LoanByRenovation renovation; + renovation = loanCtrl.getLoanByRenovationByIdLoanNew(selectedLoan); + if (renovation != null) { + loanCtrl.updateLoanByRenovationByStatus(LoanRenovationStatus.REJECTED, selectedLoan, getLoggedUser().getUser().getId()); + loanCtrl.updateLoanByStatus(LoanStatus.APPROVED, renovation.getLoanOld().getId(), getLoggedUser().getUser().getId()); + loanCtrl.updateLoanByUserByStatus(LoanStatus.APPROVED, renovation.getLoanOld()); + } + loan.remove(selectedLoan); + selectedLoan = null; + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de estatus", "la venta se cambió a estatus 'Rechazado' de forma correcta."); + } + + /** + * + * @param outcome + * @return + */ + public String detailLoan(String outcome) { + return outcome; + } + + public LoanController getLoanCtrl() { + return loanCtrl; + } + + public void setLoanCtrl(LoanController loanCtrl) { + this.loanCtrl = loanCtrl; + } + + public List getLoan() { + return loan; + } + + public void setLoan(List loan) { + this.loan = loan; + } + + public Loan getSelectedLoan() { + return selectedLoan; + } + + public void setSelectedLoan(Loan selectedLoan) { + this.selectedLoan = selectedLoan; + } + + public CustomerController getCustomerCtrl() { + return customerCtrl; + } + + public void setCustomerCtrl(CustomerController customerCtrl) { + this.customerCtrl = customerCtrl; + } + + public EndorsementController getEndorsementCtrl() { + return endorsementCtrl; + } + + public void setEndorsementCtrl(EndorsementController endorsementCtrl) { + this.endorsementCtrl = endorsementCtrl; + } + + public LoanTypeController getLoanTypeCtrl() { + return loanTypeCtrl; + } + + public void setLoanTypeCtrl(LoanTypeController loanTypeCtrl) { + this.loanTypeCtrl = loanTypeCtrl; + } + + public List getCustomer() { + return customer; + } + + public void setCustomer(List customer) { + this.customer = customer; + } + + public List getEndorsement() { + return endorsement; + } + + public void setEndorsement(List endorsement) { + this.endorsement = endorsement; + } + + public List getLoanType() { + return loanType; + } + + public void setLoanType(List loanType) { + this.loanType = loanType; + } + + public String getCustomerId() { + return customerId; + } + + public void setCustomerId(String customerId) { + this.customerId = customerId; + } + + public String getEndorsementId() { + return endorsementId; + } + + public void setEndorsementId(String endorsementId) { + this.endorsementId = endorsementId; + } + + public String getLoanTypeId() { + return loanTypeId; + } + + public void setLoanTypeId(String loanTypeId) { + this.loanTypeId = loanTypeId; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public List getUsers() { + return users; + } + + public void setUsers(List users) { + this.users = users; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public BigDecimal getTotalPayment() { + return totalPayment; + } + + public void setTotalPayment(BigDecimal totalPayment) { + this.totalPayment = totalPayment; + } + + public BigDecimal getTotalFee() { + return totalFee; + } + + public void setTotalFee(BigDecimal totalFee) { + this.totalFee = totalFee; + } + + public BigDecimal getTotal() { + return total; + } + + public void setTotal(BigDecimal total) { + this.total = total; + } + + public boolean isAprobado() { + return aprobado; + } + + public void setAprobado(boolean aprobado) { + this.aprobado = aprobado; + } + + public boolean isTerminado() { + return terminado; + } + + public void setTerminado(boolean terminado) { + this.terminado = terminado; + } + + private LoanController loanCtrl; + private CustomerController customerCtrl; + private EndorsementController endorsementCtrl; + private LoanTypeController loanTypeCtrl; + private GenericController genericCtrl; + + private List loan; + private Loan selectedLoan; + private String comments; + + private List customer; + private List endorsement; + private List loanType; + private List users; + + private String customerId; + private String endorsementId; + private String loanTypeId; + private String userId; + + private Date createdOn; + private BigDecimal totalPayment; + private BigDecimal totalFee; + private BigDecimal total; + private boolean aprobado; + private boolean terminado; + + private BitacoraController bitacoraCtrl; + + @PostConstruct + public void init() { + loanCtrl = new LoanController(); + customerCtrl = new CustomerController(); + endorsementCtrl = new EndorsementController(); + loanTypeCtrl = new LoanTypeController(); + genericCtrl = new GenericController(); + totalPayment = BigDecimal.ZERO; + totalFee = BigDecimal.ZERO; + total = BigDecimal.ZERO; + aprobado = false; + terminado = false; + bitacoraCtrl = new BitacoraController(); + + customer = customerCtrl.fillCustomersDatatable(getLoggedUser().getOffice().getId()); + endorsement = endorsementCtrl.fillEndorsementsDatatable(getLoggedUser().getOffice().getId()); + loanType = loanTypeCtrl.fillLoanTypeDatatable(getLoggedUser().getOffice().getId()); + users = genericCtrl.getAllUsersByOffice(getLoggedUser().getOffice().getId()); + + loan = fillDatatableLoan(); + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanPendingDetailBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanPendingDetailBean.java new file mode 100644 index 0000000..ba9b59a --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanPendingDetailBean.java @@ -0,0 +1,333 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.CustomerController; +import com.arrebol.apc.controller.admin.EndorsementController; +import com.arrebol.apc.controller.admin.LoanController; +import com.arrebol.apc.controller.catalog.LoanTypeController; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.enums.LoanRenovationStatus; +import com.arrebol.apc.model.enums.LoanStatus; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.loan.LoanByRenovation; +import com.arrebol.apc.model.loan.LoanDetails; +import com.arrebol.apc.model.loan.LoanType; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("loanPendingDetailManager") +@ViewScoped +public class LoanPendingDetailBean extends GenericBean implements Serializable, Datatable { + + public void changeLoanType(){ + loan.setLoanType(new LoanType(typeLoanId)); + loan.setAmountToPay(loanTypeCtrl.getLoanTypeById(typeLoanId).getPaymentTotal()); + if(loanCtrl.updateLoan(loan)){ + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de tipo de préstamo", "El préstamo se cambió correctamente"); + } + + } + + public void changeDateAndApprovedLoan(){ + loan.setCreatedOn(createdOn); + loan.setComments(comments); + if(loanCtrl.updateLoan(loan)){ + approvedLoan(); + } + + } + + public List getDetails(String id) { + try { + loanDetails = loanCtrl.getLoanDetailsbyId(id); + + } catch (Exception e) { + } + return null == loanDetails ? new ArrayList<>() : loanDetails; + } + + public People getCustomerDetail(String peopleId){ + return customerCtrl.findPeopleById(peopleId); + } + + public List getLoanByCustomer(String peopleId){ + return customerCtrl.findLoanByCustomer(peopleId); + } + + public List getLoanByEndorsement(String peopleId){ + return endorsementCtrl.findLoanByEndorsement(peopleId); + } + + public void rejectedLoan() { + loanCtrl.updateLoanByStatus(LoanStatus.REJECTED, loan.getId(), getLoggedUser().getUser().getId()); + loanCtrl.updateLoanByUserByStatus(LoanStatus.REJECTED, loan); + + LoanByRenovation renovation; + renovation = loanCtrl.getLoanByRenovationByIdLoanNew(loan); + if(renovation != null) + { + loanCtrl.updateLoanByRenovationByStatus(LoanRenovationStatus.REJECTED, loan, getLoggedUser().getUser().getId()); + loanCtrl.updateLoanByStatus(LoanStatus.APPROVED, renovation.getLoanOld().getId(), getLoggedUser().getUser().getId()); + loanCtrl.updateLoanByUserByStatus(LoanStatus.APPROVED, renovation.getLoanOld()); + } + + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de estatus", "El préstamo se cambió a estatus 'Rechazado' de forma correcta."); + } + + public void approvedLoan() { + loanCtrl.updateLoanByStatus(LoanStatus.TO_DELIVERY, loan.getId(), getLoggedUser().getUser().getId()); + loanCtrl.updateLoanByUserByStatus(LoanStatus.TO_DELIVERY, loan); + showMessage(FacesMessage.SEVERITY_INFO, "Cambio de estatus", "El préstamo se cambió a estatus 'A conciliar' de forma correcta."); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + public CustomerController getCustomerCtrl() { + return customerCtrl; + } + + public void setCustomerCtrl(CustomerController customerCtrl) { + this.customerCtrl = customerCtrl; + } + + public People getCustomer() { + return customer; + } + + public void setCustomer(People customer) { + this.customer = customer; + } + + public List getLoanCustomer() { + return loanCustomer; + } + + public void setLoanCustomer(List loanCustomer) { + this.loanCustomer = loanCustomer; + } + + public String getCustomerId() { + return customerId; + } + + public void setCustomerId(String customerId) { + this.customerId = customerId; + } + + public LoanController getLoanCtrl() { + return loanCtrl; + } + + public void setLoanCtrl(LoanController loanCtrl) { + this.loanCtrl = loanCtrl; + } + + public String getLoanId() { + return loanId; + } + + public void setLoanId(String loanId) { + this.loanId = loanId; + } + + public Loan getLoan() { + return loan; + } + + public void setLoan(Loan loan) { + this.loan = loan; + } + + public EndorsementController getEndorsementCtrl() { + return endorsementCtrl; + } + + public void setEndorsementCtrl(EndorsementController endorsementCtrl) { + this.endorsementCtrl = endorsementCtrl; + } + + public People getEndorsement() { + return endorsement; + } + + public void setEndorsement(People endorsement) { + this.endorsement = endorsement; + } + + public String getEndorsementId() { + return endorsementId; + } + + public void setEndorsementId(String endorsementId) { + this.endorsementId = endorsementId; + } + + public List getLoanEndorsement() { + return loanEndorsement; + } + + public void setLoanEndorsement(List loanEndorsement) { + this.loanEndorsement = loanEndorsement; + } + + public Loan getSelectedLoanCustomer() { + return selectedLoanCustomer; + } + + public void setSelectedLoanCustomer(Loan selectedLoanCustomer) { + this.selectedLoanCustomer = selectedLoanCustomer; + } + + public List getLoanDetails() { + return loanDetails; + } + + public void setLoanDetails(List loanDetails) { + this.loanDetails = loanDetails; + } + + public String getTypeLoanId() { + return typeLoanId; + } + + public void setTypeLoanId(String typeLoanId) { + this.typeLoanId = typeLoanId; + } + + public LoanTypeController getLoanTypeCtrl() { + return loanTypeCtrl; + } + + public void setLoanTypeCtrl(LoanTypeController loanTypeCtrl) { + this.loanTypeCtrl = loanTypeCtrl; + } + + public List getLoanType() { + return loanType; + } + + public void setLoanType(List loanType) { + this.loanType = loanType; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public List getCustomers() { + return customers; + } + + public void setCustomers(List customers) { + this.customers = customers; + } + + public String getCustomerTest() { + return customerTest; + } + + public void setCustomerTest(String customerTest) { + this.customerTest = customerTest; + } + + private CustomerController customerCtrl; + private LoanController loanCtrl; + private EndorsementController endorsementCtrl; + private LoanTypeController loanTypeCtrl; + + private People customer; + private Loan loan; + private People endorsement; + + private String customerId; + private String loanId; + private String endorsementId; + private String typeLoanId; + private String customerTest; + + private List loanEndorsement; + private List loanCustomer; + private Loan selectedLoanCustomer; + private List loanType; + private List customers; + + private List loanDetails; + + private Date createdOn; + private String comments; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + customerCtrl = new CustomerController(); + loanCtrl = new LoanController(); + endorsementCtrl = new EndorsementController(); + loanTypeCtrl = new LoanTypeController(); + + setLoanId(externalContext().getRequestParameterMap().get("form:dtLoanPending_selection")); + loan = loanCtrl.getLoanById(getLoanId()); + customer = loan.getCustomer(); + endorsement = loan.getEndorsement(); + loanEndorsement = getLoanByEndorsement(loan.getEndorsement().getId()); + loanCustomer = getLoanByCustomer(loan.getCustomer().getId()); + loanType = loanTypeCtrl.fillLoanTypeDatatable(getLoggedUser().getOffice().getId()); + customers = customerCtrl.fillCustomersDatatable(getLoggedUser().getOffice().getId()); + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanRenovationDeliveryWeeklyBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanRenovationDeliveryWeeklyBean.java new file mode 100644 index 0000000..312ea95 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/LoanRenovationDeliveryWeeklyBean.java @@ -0,0 +1,138 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.admin.LoanRenovationDeliveryWeeklyController; +import com.arrebol.apc.model.views.LoanRenovationDeliveryWeeklyView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar + */ +@Named("loanRenovationWeeklyManager") +@ViewScoped +public class LoanRenovationDeliveryWeeklyBean extends GenericBean implements Serializable, Datatable { + + + public List fillDatatableLoan() { + return getLoanRenovationController().fillLoanRenovationDatatable(); + } + + public int getTotalRenovation() { + int quantity = 0; + for(LoanRenovationDeliveryWeeklyView p : loan) { + if(p.getRenovation().equals("Renovable")){ + quantity++; + } + + } + return quantity; + } + + + public Double getTotalRenovationAmount() { + Double quantity = 0.0; + for(LoanRenovationDeliveryWeeklyView p : loan) { + if(p.getRenovation().equals("Renovable")){ + quantity = quantity + Double.valueOf(p.getAmountLoan()); + } + + } + return quantity; + } + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + + private LoanRenovationDeliveryWeeklyController LoanRenovationController; + + private List loan; + + private int totalRenovable; + private Double totalRenovableAmount; + + public LoanRenovationDeliveryWeeklyController getLoanRenovationController() { + return LoanRenovationController; + } + + public void setLoanRenovationController(LoanRenovationDeliveryWeeklyController LoanRenovationController) { + this.LoanRenovationController = LoanRenovationController; + } + + public List getLoan() { + return loan; + } + + public void setLoan(List loan) { + this.loan = loan; + } + + public int getTotalRenovable() { + return totalRenovable; + } + + public void setTotalRenovable(int totalRenovable) { + this.totalRenovable = totalRenovable; + } + + public Double getTotalRenovableAmount() { + return totalRenovableAmount; + } + + public void setTotalRenovableAmount(Double totalRenovableAmount) { + this.totalRenovableAmount = totalRenovableAmount; + } + + + + + + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + + LoanRenovationController = new LoanRenovationDeliveryWeeklyController(); + + setLoan(fillDatatableLoan()); + setTotalRenovable(getTotalRenovation()); + setTotalRenovableAmount(getTotalRenovationAmount()); + } + + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/MoneyDailyBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/MoneyDailyBean.java new file mode 100644 index 0000000..a0a3265 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/MoneyDailyBean.java @@ -0,0 +1,327 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.BitacoraController; +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.GenericValidationController; +import com.arrebol.apc.controller.admin.MoneyDailyController; +import com.arrebol.apc.controller.admin.StableGeneralBoxController; +import com.arrebol.apc.model.admin.MoneyDaily; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.system.logs.Bitacora; +import com.arrebol.apc.model.views.MoneyDailyByUserCertifier; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("moneyDailyManager") +@ViewScoped +public class MoneyDailyBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setMoneyDaily(getMoneyDailyCtrl().fillMoneyDailyDatatable(getLoggedUser().getOffice().getId(), getStarDate(), getEndDate(), getUserSelectedId())); + setTotalValue(); + } + } catch (Exception e) { + } + } + + public List fillDatatableMoneyDaily() { + + return getMoneyDailyCtrl().fillMoneyDailyDatatable(getLoggedUser().getOffice().getId(), getStarDate(), getEndDate(), getUserSelectedId()); + } + + public List getUsers() { + + return genericCtrl.getAllUsersByOffice(getLoggedUser().getOffice().getId()); + } + + public String getUserSelectedId() { + return userSelectedId; + } + + public void setUserSelectedId(String userSelectedId) { + this.userSelectedId = userSelectedId; + } + + public BigDecimal getTotal() { + return total; + } + + public void setTotal(BigDecimal total) { + this.total = total; + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + /*if(!genericCtrl.verifyStableGeneralBoxVsClosingDay(getLoggedUser().getOffice().getId())) + { + FacesMessage msg = new FacesMessage("Día laborable no cuadrado.", "Falta de realizar un cuadre de caja general en el último día laborable."); + FacesContext.getCurrentInstance().addMessage(null, msg); + return; + }*/ + Date date = new Date(); + if (genericCtrl.existStableGeneralBoxByCreatedOn(date)) { + showMessage(FacesMessage.SEVERITY_WARN, "Día cerrado", "No se pueden agregar más inicios porque ya se existe un cuadre de caja general de hoy."); + return; + } + + if(stableGeneralBoxCtrl.getTotalBox().compareTo(new BigDecimal(amount))>=0){ + MoneyDaily money = new MoneyDaily(); + money.setMoneyDailyDate(new Date()); + money.setOffice(new Office(getLoggedUser().getOffice().getId())); + money.setAmount(new BigDecimal(amount)); + money.setUser(new User(userId)); + money.setCreatedOn(new Date()); + money.setCreatedBy(getLoggedUser().getId()); + moneyDailyCtrl.saveMoneyDaily(money); + moneyDaily.clear(); + moneyDaily = fillDatatableMoneyDaily(); + setTotalValue(); + totalCaja= stableGeneralBoxCtrl.getTotalBox(); + amount = ""; + userId = ""; + FacesMessage msg = new FacesMessage("Nueva entrega de dinero", "Se agregó correctamente"); + FacesContext.getCurrentInstance().addMessage(null, msg); + }else{ + showMessage(FacesMessage.SEVERITY_WARN, "Incicio incorrecto", "No se pueden agregar el inicio porque es mas grande que la cantidad en caja general."); + } + + } + + @Override + public void deleteRow() { + + if (genericCtrl.existStableSmallBoxByCreatedOn(selectedMoneyDaily.getCreatedOn())) { + showMessage(FacesMessage.SEVERITY_WARN, "Inicio", "No se puede borrar porque ya se realizo el cuadre de caja chica del día."); + } else { + Bitacora bitacora = new Bitacora(); + MoneyDaily money = moneyDailyCtrl.getMoneyDailyById(selectedMoneyDaily.getId()); + bitacora.setAction("Eliminar inicio"); + bitacora.setCommentsUser(commentsBitacora); + bitacora.setCreatedBy(getLoggedUser().getUser().getId()); + bitacora.setCreatedOn(new Date()); + bitacora.setNameUser(getLoggedUser().getUser().getUserName()); + bitacora.setOffice(new Office(getLoggedUser().getOffice().getId())); + bitacora.setDescription("Se eliminó el inicio del asesor " + money.getUser().getUserName() + " con monto $" + + money.getAmount() + " y fecha " + money.getCreatedOn()); + moneyDailyCtrl.deleteMoneyDaily(selectedMoneyDaily); + bitacoraCtrl.saveBitacora(bitacora); + commentsBitacora = ""; + selectedMoneyDaily = null; + moneyDaily.clear(); + moneyDaily = fillDatatableMoneyDaily(); + setTotalValue(); + FacesMessage msg = new FacesMessage("Eliminación de inicio", "Se eliminó correctamente"); + FacesContext.getCurrentInstance().addMessage(null, msg); + } + + } + + public MoneyDailyController getMoneyDailyCtrl() { + return moneyDailyCtrl; + } + + public void setMoneyDailyCtrl(MoneyDailyController moneyDailyCtrl) { + this.moneyDailyCtrl = moneyDailyCtrl; + } + + public List getMoneyDaily() { + return moneyDaily; + } + + public void setMoneyDaily(List moneyDaily) { + this.moneyDaily = moneyDaily; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getAmount() { + return amount; + } + + public void setAmount(String amount) { + this.amount = amount; + } + + public MoneyDaily getSelectedMoneyDaily() { + return selectedMoneyDaily; + } + + public void setSelectedMoneyDaily(MoneyDaily selectedMoneyDaily) { + this.selectedMoneyDaily = selectedMoneyDaily; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List getMoneyDailyCertifier() { + return moneyDailyCertifier; + } + + public void setMoneyDailyCertifier(List moneyDailyCertifier) { + this.moneyDailyCertifier = moneyDailyCertifier; + } + + public MoneyDaily getSelectedMoneyDailyCertifier() { + return selectedMoneyDailyCertifier; + } + + public void setSelectedMoneyDailyCertifier(MoneyDaily selectedMoneyDailyCertifier) { + this.selectedMoneyDailyCertifier = selectedMoneyDailyCertifier; + } + + public BitacoraController getBitacoraCtrl() { + return bitacoraCtrl; + } + + public void setBitacoraCtrl(BitacoraController bitacoraCtrl) { + this.bitacoraCtrl = bitacoraCtrl; + } + + public String getCommentsBitacora() { + return commentsBitacora; + } + + public void setCommentsBitacora(String commentsBitacora) { + this.commentsBitacora = commentsBitacora; + } + + public GenericValidationController getGenericValidateController() { + return genericValidateController; + } + + public void setGenericValidateController(GenericValidationController genericController) { + this.genericValidateController = genericController; + } + + public Date getLastStableGeneralBox() { + return lastStableGeneralBox; + } + + public void setLastStableGeneralBox(Date lastStableGeneralBox) { + this.lastStableGeneralBox = lastStableGeneralBox; + } + + public StableGeneralBoxController getStableGeneralBoxCtrl() { + return stableGeneralBoxCtrl; + } + + public void setStableGeneralBoxCtrl(StableGeneralBoxController stableGeneralBoxCtrl) { + this.stableGeneralBoxCtrl = stableGeneralBoxCtrl; + } + + public BigDecimal getTotalCaja() { + return totalCaja; + } + + public void setTotalCaja(BigDecimal totalCaja) { + this.totalCaja = totalCaja; + } + + + + private MoneyDailyController moneyDailyCtrl; + private GenericController genericCtrl; + private BitacoraController bitacoraCtrl; + private GenericValidationController genericValidateController; + private StableGeneralBoxController stableGeneralBoxCtrl; + private Date lastStableGeneralBox; + + private List moneyDaily; + private List moneyDailyCertifier; + private List users; + private String userSelectedId; + private BigDecimal total; + private BigDecimal totalCaja; + + private String userId; + private String amount; + private String commentsBitacora; + + private MoneyDaily selectedMoneyDaily; + private MoneyDaily selectedMoneyDailyCertifier; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + + stableGeneralBoxCtrl = new StableGeneralBoxController(); + + moneyDailyCtrl = new MoneyDailyController(); + genericCtrl = new GenericController(); + bitacoraCtrl = new BitacoraController(); + setGenericValidateController(new GenericValidationController()); + setLastStableGeneralBox(getGenericValidateController().lastStableGeneralBoxByDate(getLoggedUser().getUser())); + + initOneWeekBeforeToCurrdate(); + + totalCaja= stableGeneralBoxCtrl.getTotalBox(); + moneyDaily = fillDatatableMoneyDaily(); + setTotalValue(); + moneyDailyCertifier = moneyDailyCtrl.findAllAmountByUserCertifierView(getLoggedUser().getOffice().getId()); + users = getUsers(); + commentsBitacora = ""; + + } + + private void setTotalValue() { + if (moneyDaily != null && !moneyDaily.isEmpty()) { + setTotal(moneyDaily.stream().map(MoneyDaily::getAmount).reduce(BigDecimal::add).get()); + } else { + setTotal(BigDecimal.ZERO); + } + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/OtherExpenseBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/OtherExpenseBean.java new file mode 100644 index 0000000..f2c03c5 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/OtherExpenseBean.java @@ -0,0 +1,294 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.BitacoraController; +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.GenericValidationController; +import com.arrebol.apc.controller.admin.OtherExpenseController; +import com.arrebol.apc.model.admin.ClosingDay; +import com.arrebol.apc.model.admin.OtherExpense; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.system.logs.Bitacora; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("otherExpenseManager") +@ViewScoped +public class OtherExpenseBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setOtherExpense(getOtherExpenseCtrl().fillOtherExpenseDatatable(getLoggedUser().getOffice().getId(), getStarDate(), getEndDate(), getUserSelectedId())); + setTotalValue(); + } + } catch (Exception e) { + } + } + + public List fillDatatableOtherExpense() { + + return getOtherExpenseCtrl().fillOtherExpenseDatatable(getLoggedUser().getOffice().getId(), getStarDate(), getEndDate(), getUserSelectedId()); + } + + public List getUsers() { + + return genericCtrl.getAllUsersByOffice(getLoggedUser().getOffice().getId()); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + Date date = new Date(); + if (genericCtrl.existStableSmallBoxByCreatedOn(date)) { + showMessage(FacesMessage.SEVERITY_WARN, "Día cerrado", "No se pueden agregar más gastos porque ya se existe un cuadre de caja chica de hoy."); + return; + } + OtherExpense saveOtherExpense = new OtherExpense(); + saveOtherExpense.setDescription(comments); + saveOtherExpense.setCreatedBy(getLoggedUser().getUser().getId()); + saveOtherExpense.setCreatedOn(new Date()); + saveOtherExpense.setExpense(new BigDecimal(amount)); + saveOtherExpense.setUser(new User(userId)); + saveOtherExpense.setOffice(new Office(getLoggedUser().getOffice().getId())); + otherExpenseCtrl.saveOtherExpense(saveOtherExpense); + otherExpense.clear(); + otherExpense = fillDatatableOtherExpense(); + setTotalValue(); + comments = ""; + userId = ""; + amount = ""; + fecha = new Date(); + FacesMessage msg = new FacesMessage("Nuevo gasto", "Se agregó correctamente"); + FacesContext.getCurrentInstance().addMessage(null, msg); + } + + @Override + public void deleteRow() { + if (selectedOtherExpense != null) { + + otherExpenseCtrl.deleteOtherExpense(selectedOtherExpense); + Bitacora bitacora = new Bitacora(); + bitacora.setAction("Eliminar gasto"); + bitacora.setCommentsUser(getCommentsBitacora()); + bitacora.setCreatedBy(getLoggedUser().getUser().getId()); + bitacora.setCreatedOn(new Date()); + bitacora.setNameUser(getLoggedUser().getUser().getUserName()); + bitacora.setOffice(new Office(getLoggedUser().getOffice().getId())); + bitacora.setDescription("Se eliminó correctamente el gasto con fecha: " + selectedOtherExpense.getCreatedOn() + ", con monto $" + + selectedOtherExpense.getExpense()); + bitacoraCtrl.saveBitacora(bitacora); + selectedOtherExpense = null; + otherExpense.clear(); + otherExpense = fillDatatableOtherExpense(); + setTotalValue(); + commentsBitacora = ""; + + FacesMessage msg = new FacesMessage("Eliminación de gasto", "Se eliminó correctamente"); + FacesContext.getCurrentInstance().addMessage(null, msg); + + } + } + + public OtherExpenseController getOtherExpenseCtrl() { + return otherExpenseCtrl; + } + + public void setOtherExpenseCtrl(OtherExpenseController otherExpenseCtrl) { + this.otherExpenseCtrl = otherExpenseCtrl; + } + + public List getOtherExpense() { + return otherExpense; + } + + public void setOtherExpense(List otherExpense) { + this.otherExpense = otherExpense; + } + + public OtherExpense getSelectedOtherExpense() { + return selectedOtherExpense; + } + + public void setSelectedOtherExpense(OtherExpense selectedOtherExpense) { + this.selectedOtherExpense = selectedOtherExpense; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserSelectedId() { + return userSelectedId; + } + + public void setUserSelectedId(String userSelectedId) { + this.userSelectedId = userSelectedId; + } + + public BigDecimal getTotal() { + return total; + } + + public void setTotal(BigDecimal total) { + this.total = total; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public String getAmount() { + return amount; + } + + public void setAmount(String amount) { + this.amount = amount; + } + + public Date getFecha() { + return fecha; + } + + public void setFecha(Date fecha) { + this.fecha = fecha; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public GenericValidationController getGenericValidateController() { + return genericValidateController; + } + + public void setGenericValidateController(GenericValidationController genericController) { + this.genericValidateController = genericController; + } + + public Date getLastStableSmallBox() { + return lastStableSmallBox; + } + + public void setLastStableSmallBox(Date lastStableSmallBox) { + this.lastStableSmallBox = lastStableSmallBox; + } + + public BitacoraController getBitacoraCtrl() { + return bitacoraCtrl; + } + + public void setBitacoraCtrl(BitacoraController bitacoraCtrl) { + this.bitacoraCtrl = bitacoraCtrl; + } + + public String getCommentsBitacora() { + return commentsBitacora; + } + + public void setCommentsBitacora(String commentsBitacora) { + this.commentsBitacora = commentsBitacora; + } + + public List getClosingDayToday() { + return closingDayToday; + } + + public void setClosingDayToday(List closingDayToday) { + this.closingDayToday = closingDayToday; + } + + private OtherExpenseController otherExpenseCtrl; + private GenericController genericCtrl; + private List otherExpense; + private OtherExpense selectedOtherExpense; + private List users; + private String userId; + private String userSelectedId; + private BigDecimal total; + private String comments; + private String amount; + private Date fecha; + + private BitacoraController bitacoraCtrl; + private String commentsBitacora; + private GenericValidationController genericValidateController; + private Date lastStableSmallBox; + private List closingDayToday; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + + otherExpenseCtrl = new OtherExpenseController(); + genericCtrl = new GenericController(); + bitacoraCtrl = new BitacoraController(); + setGenericValidateController(new GenericValidationController()); + setLastStableSmallBox(getGenericValidateController().lastStableSmallBoxByDate(getLoggedUser().getUser())); + setClosingDayToday(getGenericValidateController().allClosingDayByDate()); + + initOneWeekBeforeToCurrdate(); + + otherExpense = fillDatatableOtherExpense(); + setTotalValue(); + users = getUsers(); + } + + private void setTotalValue() { + if (otherExpense != null && !otherExpense.isEmpty()) { + setTotal(otherExpense.stream().map(OtherExpense::getExpense).reduce(BigDecimal::add).get()); + } else { + setTotal(BigDecimal.ZERO); + } + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/PayRollBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/PayRollBean.java new file mode 100644 index 0000000..7d19cbf --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/PayRollBean.java @@ -0,0 +1,953 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.BitacoraController; +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.GenericValidationController; +import com.arrebol.apc.controller.admin.LoanEmployeeController; +import com.arrebol.apc.controller.admin.PayRollController; +import com.arrebol.apc.controller.drive.DriverController; +import com.arrebol.apc.model.admin.EmployeeSaving; +import com.arrebol.apc.model.admin.Goal; +import com.arrebol.apc.model.admin.LoanEmployee; +import com.arrebol.apc.model.admin.LoanEmployeeDetails; +import com.arrebol.apc.model.admin.StableGeneralBox; +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.EmployeeSavingType; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.payroll.Payroll; +import com.arrebol.apc.model.system.logs.Bitacora; +import com.arrebol.apc.model.views.InformationLoanLastWeekView; +import com.arrebol.apc.model.views.LoanEmployeeView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.math.RoundingMode; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("payrollManager") +@ViewScoped +public class PayRollBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setPayroll(getPayrollCtrl().fillPayrollDatatable(getLoggedUser().getOffice().getId(), getStarDate(), getEndDate())); + } + } catch (Exception e) { + } + } + + public List getUsers() { + + return genericCtrl.getAllUsersByOffice(getLoggedUser().getOffice().getId()); + } + + public void calculationFunction() { + total = BigDecimal.ZERO; + BigDecimal moraDiscount = BonusMora.divide(new BigDecimal(5)).multiply(new BigDecimal(daysBonus)); + BigDecimal colocationDiscount = bonusColocation.divide(new BigDecimal(5)).multiply(new BigDecimal(daysBonus)); + BigDecimal salaryDiscount = salary.divide(new BigDecimal(5)).multiply(new BigDecimal(daysSalary)); + granTotalDeducciones = imss.add(advances).add(discounts).add(boxed).add(saving).add(paymentToDebt); + total = total.add(salaryDiscount).add(moraDiscount).add(colocationDiscount).add(newCustomer) + .subtract(imss).subtract(advances).subtract(discounts).subtract(boxed).subtract(saving).subtract(paymentToDebt).add(increases); + } + + public void getResumenByUser() { + + salary = BigDecimal.ZERO; + imss = BigDecimal.ZERO; + advances = BigDecimal.ZERO; + newCustomer = BigDecimal.ZERO; + bonusColocation = BigDecimal.ZERO; + BonusMora = BigDecimal.ZERO; + granTotal = BigDecimal.ZERO; + granTotalDeducciones = BigDecimal.ZERO; + total = BigDecimal.ZERO; + discounts = BigDecimal.ZERO; + increases = BigDecimal.ZERO; + metaInfo = BigDecimal.ZERO; + newCustomerInfo = BigDecimal.ZERO; + toalColocadoInfo = BigDecimal.ZERO; + toalPaymentInfo = BigDecimal.ZERO; + toalFeeInfo = BigDecimal.ZERO; + saldoInsoluto = BigDecimal.ZERO; + bonusNewCustomerInfo = BigDecimal.ZERO; + bonusColocationInfo = BigDecimal.ZERO; + bonusMoraInfo = BigDecimal.ZERO; + tipoBonusInfo = ""; + commentsDiscounts = ""; + commentsIncreases = ""; + commentsIncreases = ""; + boxed = BigDecimal.ZERO; + saving = BigDecimal.ZERO; + paymentToDebt = BigDecimal.ZERO; + BigDecimal divider; + + if (userId == null || userId.isEmpty()) { + showMessage(FacesMessage.SEVERITY_WARN, "Empleado obligatorio", "Debes seleccionar un empleado para calcular la nómina"); + userId = ""; + return; + } + + if (dateInit == null || dateEnd == null) { + showMessage(FacesMessage.SEVERITY_WARN, "Fechas obligatorias", "Debes seleccionar las fechas para calcular la nómina"); + userId = ""; + return; + } + + User userPayRoll = payrollCtrl.getUserById(userId); + if (userPayRoll != null) { + if (userPayRoll.getHumanResource().getBonus() == null) { + showMessage(FacesMessage.SEVERITY_WARN, "Usuario incompleto", "El empleado no tiene un bono registrado, es obligatorio tenerlo registrado"); + userId = ""; + return; + } + //obtengo salario del empleado + salary = userPayRoll.getHumanResource().getPayment(); + //obtengo imss del empleado + imss = userPayRoll.getHumanResource().getImss(); + //Lleno la información de los bonos *** INFORMATIVO + bonusColocationInfo = userPayRoll.getHumanResource().getBonus().getLoanBonus(); + bonusMoraInfo = userPayRoll.getHumanResource().getBonus().getMoraBonus(); + bonusNewCustomerInfo = userPayRoll.getHumanResource().getBonus().getNewCustomerBonus(); + tipoBonusInfo = userPayRoll.getHumanResource().getBonus().getAdministrative() == ActiveStatus.ENEBLED ? "Administrativo" : "Operativo"; + //Obtengo todos los adelantos que tuvo el usuario en las fechas dadas y que esten activos. + Date fechaAdvance = new Date(); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(fechaAdvance); // Configuramos la fecha que se recibe + calendar.add(Calendar.DAY_OF_YEAR, -6); + + advances = payrollCtrl.getSumAdvanceByUser(userPayRoll.getHumanResource().getId(), getLoggedUser().getOffice().getId(), calendar.getTime(), fechaAdvance); + + if (saving.compareTo(BigDecimal.ZERO) == 0) { + saving = userPayRoll.getHumanResource().getEmployeeSaving(); + } + + if (advances == null) { + advances = BigDecimal.ZERO; + } + + //Valido que el bono del usuario no sea administrativo, ya que el bono de clientes nuevos solo se paga a asesores y certificadores, de + //lo contrario va en 0 + if (userPayRoll.getHumanResource().getBonus().getAdministrative() == ActiveStatus.DISABLED) { + //Obtengo cuantos prestamos con clientes nuevos dio de alta el asesor en esas fechas y lo multiplico por el valor del bono de clientes nuevos + List loansNew = payrollCtrl.getTotalNewCustomerLoansByUser(userId, dateInit, dateEnd); + int contador = 0; + for (Loan loan : loansNew) { + newCustomer = newCustomer.add((loan.getLoanType().getPayment().divide(new BigDecimal(1000))).multiply(userPayRoll.getHumanResource().getBonus().getNewCustomerBonus())); + contador++; + } + newCustomerInfo = newCustomerInfo.add(new BigDecimal(contador)); + } + + //Obtengo la meta que consta de esas fechas + //goal = payrollCtrl.getGoalByDates(getLoggedUser().getOffice().getId(), dateInit, dateEnd); + // La meta se obtiene de la última capturada + goal = payrollCtrl.getLastGoal(getLoggedUser().getOffice().getId()); + metaInfo = goal.getAmount(); + + // Se llena el control de abono a deuda + List loanEmployeeList = payrollCtrl.getPaymentToDebtByUser(userPayRoll.getHumanResource().getId()); + if (loanEmployeeList != null && !loanEmployeeList.isEmpty()) { + loanEmployeeList.forEach((loanEmployee) -> { + saldoInsoluto = saldoInsoluto.add(loanEmployee.getBalance()); + if(loanEmployee.getBalance().compareTo(loanEmployee.getAmountToPay()) < 0){ + if (loanEmployee.getBalance().compareTo(BigDecimal.ZERO) > 0) { + paymentToDebt = paymentToDebt.add(loanEmployee.getBalance()); + } + }else{ + paymentToDebt = paymentToDebt.add(loanEmployee.getAmountToPay()); + } + }); + } + + //********Bono de colocación********* + //Obtengo el total del monto colocado por usuario en esas fechas. + BigDecimal amountColocationByUser = payrollCtrl.getTotalLoansByUserForDates(userId, dateInit, dateEnd); + toalColocadoInfo = amountColocationByUser; + + //Valido que si halla obtenido una meta y que el bono del empleado no sea administrativo para calcular el bono por colocacion. + if (goal != null && amountColocationByUser != null && userPayRoll.getHumanResource().getBonus().getAdministrative() == ActiveStatus.DISABLED) { + BigDecimal maxPorcentaje = new BigDecimal(100); + BigDecimal minPorcentaje = new BigDecimal(80); + BigDecimal porcentaje = (amountColocationByUser.multiply(maxPorcentaje)).divide(goal.getAmount(), 2, RoundingMode.HALF_UP); + + if (porcentaje != null) { + if (porcentaje.compareTo(minPorcentaje) == -1) { + bonusColocation = BigDecimal.ZERO; + } + if (porcentaje.compareTo(minPorcentaje.subtract(BigDecimal.ONE)) == 1 && porcentaje.compareTo(maxPorcentaje) == -1) { + bonusColocation = ((goal.getAmount().multiply(userPayRoll.getHumanResource().getBonus().getLoanBonus())).divide(maxPorcentaje)).divide(new BigDecimal(2)); + } + if (porcentaje.compareTo(maxPorcentaje) == 0 || porcentaje.compareTo(maxPorcentaje) == 1) { + bonusColocation = (goal.getAmount().multiply(userPayRoll.getHumanResource().getBonus().getLoanBonus())).divide(maxPorcentaje); + } + } + + } + if (userPayRoll.getHumanResource().getBonus().getAdministrative() == ActiveStatus.ENEBLED) { + bonusColocation = userPayRoll.getHumanResource().getBonus().getLoanBonus(); + } + + //********Bono de mora********* + //Obtengo todos los abonos por usuario en ese rango de fechas + BigDecimal amountPayments = payrollCtrl.getLoanDetailsByUserForDates(userId, dateInit, dateEnd); + Long openingFee = payrollCtrl.getTotalOpeningFeeByUser(userId, dateInit, dateEnd); + + //Obtengo todas las multas por usuario en ese rango de fechas + //BigDecimal amountFee = payrollCtrl.getFeeByUserForDates(userId, dateInit, dateEnd); + //************************** + Double sumFaltante = data.stream().filter(p -> p.getIdUser().equalsIgnoreCase(userId)).mapToDouble(h -> h.getFaltante().doubleValue()).sum(); + BigDecimal amountFee = BigDecimal.valueOf(sumFaltante); + //************************** + + if (openingFee == null) { + openingFee = 0L; + } + if (amountPayments == null) { + amountPayments = BigDecimal.ZERO; + } + if (amountFee == null) { + amountFee = BigDecimal.ZERO; + } + amountPayments = amountPayments.add(BigDecimal.valueOf(openingFee)); + toalPaymentInfo = amountPayments; + toalFeeInfo = amountFee; + + if (userPayRoll.getHumanResource().getBonus().getAdministrative() == ActiveStatus.ENEBLED) { + BonusMora = userPayRoll.getHumanResource().getBonus().getMoraBonus(); + } else { + if (amountPayments.compareTo(BigDecimal.ZERO) == 1) { + BigDecimal totalPorcentaje = new BigDecimal(100); + BigDecimal maxPorcentaje = new BigDecimal(2); + BigDecimal middlePorcentaje = new BigDecimal(1); + if (amountFee.compareTo(BigDecimal.ZERO) == 0 || amountFee.compareTo(BigDecimal.ZERO) < 0) { + BonusMora = (amountPayments.multiply(userPayRoll.getHumanResource().getBonus().getMoraBonus())); + } else { + + if(payrollCtrl.getTotalExpectedWeekByUser(userId)==null){ + + divider = BigDecimal.ONE; + }else{ + divider = payrollCtrl.getTotalExpectedWeekByUser(userId); + } + + + BigDecimal porcentaje = (amountFee.multiply(totalPorcentaje)).divide(divider, 2, RoundingMode.HALF_UP); + if (porcentaje.compareTo(maxPorcentaje) == 0 || porcentaje.compareTo(maxPorcentaje) == 1) { + BonusMora = BigDecimal.ZERO; + } + if ((porcentaje.compareTo(BigDecimal.ZERO) == 0) || (porcentaje.compareTo(BigDecimal.ZERO) == 1 && porcentaje.compareTo(middlePorcentaje) == -1)) { + BonusMora = (amountPayments.multiply(userPayRoll.getHumanResource().getBonus().getMoraBonus())); + } + if ((porcentaje.compareTo(middlePorcentaje) == 0) || (porcentaje.compareTo(middlePorcentaje) == 1 && porcentaje.compareTo(maxPorcentaje) == -1)) { + BonusMora = (amountPayments.multiply(userPayRoll.getHumanResource().getBonus().getMoraBonus())).divide(maxPorcentaje); + } + } + + } + } + boxed = payrollCtrl.getDiscountByUserThisWeek(userId); + if (boxed == null || boxed.compareTo(BigDecimal.ZERO) < 0) { + boxed = BigDecimal.ZERO; + } + /* Se comenta debido a que el campo cajeado toma el valor + else { + commentsDiscounts = "Descuentos por cajeado en cortes del día"; + }*/ + granTotal = salary.add(BonusMora).add(bonusColocation).add(newCustomer).subtract(advances); + granTotalDeducciones = imss.add(advances).add(discounts).add(boxed).add(saving).add(paymentToDebt); + total = granTotal.subtract(boxed).subtract(imss).subtract(saving).subtract(paymentToDebt); + } + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + if (userId == null || userId.isEmpty()) { + showMessage(FacesMessage.SEVERITY_WARN, "Empleado obligatorio", "Debes seleccionar un empleado para calcular la nómina"); + userId = ""; + return; + } + + if (dateInit == null || dateEnd == null) { + showMessage(FacesMessage.SEVERITY_WARN, "Fechas obligatorias", "Debes seleccionar las fechas para calcular la nómina"); + userId = ""; + return; + } + + + if (genericCtrl.existStableGeneralBoxByCreatedOn(new Date())) { + showMessage(FacesMessage.SEVERITY_WARN, "Día cerrado", "No se pueden crear mas nominas porque ya se existe un cuadre de caja general de hoy."); + return; + } + + + Payroll payroll = new Payroll(); + + User userPayRoll = payrollCtrl.getUserById(userId); + + payroll.setActiveStatus(ActiveStatus.ENEBLED); + payroll.setAdvance(advances); + payroll.setCommentsDiscounts(commentsDiscounts); + payroll.setCommentsIncreases(commentsIncreases); + payroll.setCreatedBy(getLoggedUser().getUser().getId()); + payroll.setCreatedOn(new Date()); + payroll.setDiscounts(discounts); + payroll.setHumanResource(userPayRoll.getHumanResource()); + payroll.setImss(imss); + payroll.setIncreases(increases); + payroll.setObservation(comments); + payroll.setOffice(new Office(getLoggedUser().getOffice().getId())); + payroll.setSalary(salary); + payroll.setTotalBonusColocation(bonusColocation); + payroll.setTotalBonusMora(BonusMora); + payroll.setTotalBonusNewCustomer(newCustomer); + payroll.setTotalDaysBonus(daysBonus); + payroll.setTotalDaysSalary(daysSalary); + payroll.setTotalPayment(total); + payroll.setBoxed(boxed); + payroll.setSaving(saving); + payroll.setPaymentToDebt(paymentToDebt); + + // ADD new Fields values + + if (payrollCtrl.savePayroll(payroll)) { + createPaymentLoanEmployee(userPayRoll.getHumanResource()); + // Guarda el registro en la tabla de ahorro + if (saving.compareTo(BigDecimal.ZERO) > 0) { + createEmployeeSaving(userPayRoll.getHumanResource()); + } + + FacesMessage msg = new FacesMessage("Nómina creada.", "Se registró la nómina correctamente."); + FacesContext.getCurrentInstance().addMessage(null, msg); + salary = BigDecimal.ZERO; + imss = BigDecimal.ZERO; + advances = BigDecimal.ZERO; + newCustomer = BigDecimal.ZERO; + bonusColocation = BigDecimal.ZERO; + BonusMora = BigDecimal.ZERO; + granTotal = BigDecimal.ZERO; + granTotalDeducciones = BigDecimal.ZERO; + total = BigDecimal.ZERO; + discounts = BigDecimal.ZERO; + increases = BigDecimal.ZERO; + metaInfo = BigDecimal.ZERO; + newCustomerInfo = BigDecimal.ZERO; + toalColocadoInfo = BigDecimal.ZERO; + toalPaymentInfo = BigDecimal.ZERO; + toalFeeInfo = BigDecimal.ZERO; + saldoInsoluto = BigDecimal.ZERO; + bonusNewCustomerInfo = BigDecimal.ZERO; + bonusColocationInfo = BigDecimal.ZERO; + bonusMoraInfo = BigDecimal.ZERO; + tipoBonusInfo = ""; + commentsDiscounts = ""; + commentsIncreases = ""; + comments = ""; + userId = ""; + boxed = BigDecimal.ZERO; + saving = BigDecimal.ZERO; + paymentToDebt = BigDecimal.ZERO; + } + + } + + private void createPaymentLoanEmployee(HumanResource humanResource) { + List loanEmployeeList = payrollCtrl.getPaymentToDebtByUser(humanResource.getId()); + BigDecimal paymentToDebtResp = paymentToDebt; + if (loanEmployeeList != null && !loanEmployeeList.isEmpty()) { + for (LoanEmployeeView loan : loanEmployeeList) { + BigDecimal detailPay = loan.getAmountToPay(); + if (paymentToDebtResp.compareTo(BigDecimal.ZERO) == 1) { + LoanEmployeeDetails loanDetail = new LoanEmployeeDetails(); + loanDetail.setIdLoan(loan.getId()); + loanDetail.setIdUser(loan.getIdUser()); + loanDetail.setPaymentAmount(detailPay); + loanDetail.setReferenceNumber(loan.getReferenceNumber() + 1); + loanDetail.setCreatedOn(new Date()); + loanDetail.setCreatedBy(getLoggedUser().getId()); + loanDetail.setLoanEmployeeDetailStatus(ActiveStatus.ENEBLED); + loanDetail.setPayroll(ActiveStatus.ENEBLED); + + humanResource.setBalance(humanResource.getBalance().subtract(detailPay)); + LoanEmployee loanE = payrollCtrl.getLoanEmployeeById(loan.getId()); + if(loanE.getBalance().compareTo(detailPay) < 0 || detailPay.compareTo(loanE.getBalance()) == 0){ + paymentToDebtResp.subtract(loanE.getBalance()); + loanDetail.setPaymentAmount(loanE.getBalance()); + loanE.setBalance(BigDecimal.ZERO); + }else{ + loanE.setBalance(loanE.getBalance().subtract(detailPay)); + paymentToDebtResp.subtract(detailPay); + } + + + payrollCtrl.saveLoanEmployeeDetail(loanDetail, humanResource, loanE); + } + } + } + } + + private void createEmployeeSaving(HumanResource humanResource) { + EmployeeSaving employeeSaving = new EmployeeSaving(); + employeeSaving.setIdUser(humanResource.getId()); + employeeSaving.setEmployeeSaving(saving); + employeeSaving.setCreatedOn(new Date()); + employeeSaving.setCreatedBy(getLoggedUser().getId()); + employeeSaving.setType(EmployeeSavingType.SAVING); + humanResource.setEmployeeSaving(saving); + payrollCtrl.saveEmployeeSaving(employeeSaving, humanResource); + } + + private void cancelEmployeeSaving(Payroll payroll) { + EmployeeSaving employeeSaving = new EmployeeSaving(); + employeeSaving.setIdUser(payroll.getHumanResource().getId()); + employeeSaving.setEmployeeSaving(payroll.getSaving()); + employeeSaving.setCreatedOn(new Date()); + employeeSaving.setCreatedBy(getLoggedUser().getId()); + employeeSaving.setType(EmployeeSavingType.CANCEL); + payrollCtrl.saveEmployeeSaving(employeeSaving, payroll.getHumanResource()); + } + + @Override + public void deleteRow() { + boolean delete = true; + delete = selectedPayroll.getActiveStatus() == ActiveStatus.ENEBLED ? true : false; + + + + if (delete) { + + List listGeneralBox = payrollCtrl.getStableGeneralBoxByDate(getLoggedUser().getOffice().getId(), + selectedPayroll.getCreatedOn(), selectedPayroll.getCreatedOn()); + if (listGeneralBox == null || listGeneralBox.isEmpty()) { + payrollCtrl.updatePayrollByStatus(ActiveStatus.DISABLED, selectedPayroll.getId(), getLoggedUser().getUser().getId()); + + List loanEmployeeList = loanEmployeeController.findLoanDetailToUpdate(selectedPayroll.getHumanResource().getId(),selectedPayroll.getCreatedOn()); + + for(LoanEmployeeDetails loanDetail: loanEmployeeList){ + + LoanEmployee loan = payrollCtrl.getLoanEmployeeById(loanDetail.getIdLoan()); + + loan.setBalance(loan.getBalance().add(loanDetail.getPaymentAmount())); + loan.setLastUpdatedBy(getLoggedUser().getId()); + loan.setLastUpdatedOn(new Date()); + + + loanEmployeeController.updateLoanEmployee(loan); + + } + + loanEmployeeController.updateLoanEmployeeDetailByStatus(selectedPayroll.getHumanResource().getId(),selectedPayroll.getCreatedOn()); + cancelEmployeeSaving(selectedPayroll); + searchHistoricalAction(); + + Bitacora bitacora = new Bitacora(); + bitacora.setAction("Eliminar nómina"); + bitacora.setCommentsUser(getComments()); + bitacora.setCreatedBy(getLoggedUser().getUser().getId()); + bitacora.setCreatedOn(new Date()); + bitacora.setNameUser(getLoggedUser().getUser().getUserName()); + bitacora.setOffice(new Office(getLoggedUser().getOffice().getId())); + bitacora.setDescription("Se eliminó correctamente la nómina con fecha: " + selectedPayroll.getCreatedOn() + ", con monto $" + + selectedPayroll.getTotalPayment()); + bitacoraCtrl.saveBitacora(bitacora); + comments = ""; + selectedPayroll = null; + showMessage(FacesMessage.SEVERITY_INFO, "Nómina eliminada", "Se eliminó correctamente."); + } + else{ + showMessage(FacesMessage.SEVERITY_ERROR, "Error", "La nómina no se pudo eliminar porque existe un corte de caja general con esa fecha."); + } + } + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List getUser() { + return user; + } + + public void setUser(List user) { + this.user = user; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public Date getDateInit() { + return dateInit; + } + + public void setDateInit(Date dateInit) { + this.dateInit = dateInit; + } + + public Date getDateEnd() { + return dateEnd; + } + + public void setDateEnd(Date dateEnd) { + this.dateEnd = dateEnd; + } + + public PayRollController getPayrollCtrl() { + return payrollCtrl; + } + + public void setPayrollCtrl(PayRollController payrollCtrl) { + this.payrollCtrl = payrollCtrl; + } + + public BigDecimal getSalary() { + return salary; + } + + public void setSalary(BigDecimal salary) { + this.salary = salary; + } + + public BigDecimal getImss() { + return imss; + } + + public void setImss(BigDecimal imss) { + this.imss = imss; + } + + public BigDecimal getAdvances() { + return advances; + } + + public void setAdvances(BigDecimal advances) { + this.advances = advances; + } + + public BigDecimal getNewCustomer() { + return newCustomer; + } + + public void setNewCustomer(BigDecimal newCustomer) { + this.newCustomer = newCustomer; + } + + public BigDecimal getBonusColocation() { + return bonusColocation; + } + + public void setBonusColocation(BigDecimal bonusColocation) { + this.bonusColocation = bonusColocation; + } + + public BigDecimal getBonusMora() { + return BonusMora; + } + + public void setBonusMora(BigDecimal BonusMora) { + this.BonusMora = BonusMora; + } + + public Goal getGoal() { + return goal; + } + + public void setGoal(Goal goal) { + this.goal = goal; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public BigDecimal getGranTotal() { + return granTotal; + } + + public void setGranTotal(BigDecimal granTotal) { + this.granTotal = granTotal; + } + + public BigDecimal getGranTotalDeducciones() { + return granTotalDeducciones; + } + + public void setGranTotalDeducciones(BigDecimal granTotalDeducciones) { + this.granTotalDeducciones = granTotalDeducciones; + } + + public BigDecimal getDiscounts() { + return discounts; + } + + public void setDiscounts(BigDecimal discounts) { + this.discounts = discounts; + } + + public String getCommentsDiscounts() { + return commentsDiscounts; + } + + public void setCommentsDiscounts(String commentsDiscounts) { + this.commentsDiscounts = commentsDiscounts; + } + + public BigDecimal getIncreases() { + return increases; + } + + public void setIncreases(BigDecimal increases) { + this.increases = increases; + } + + public String getCommentsIncreases() { + return commentsIncreases; + } + + public void setCommentsIncreases(String commentsIncreases) { + this.commentsIncreases = commentsIncreases; + } + + public BigDecimal getTotal() { + return total; + } + + public void setTotal(BigDecimal total) { + this.total = total; + } + + public BigDecimal getMetaInfo() { + return metaInfo; + } + + public void setMetaInfo(BigDecimal metaInfo) { + this.metaInfo = metaInfo; + } + + public BigDecimal getNewCustomerInfo() { + return newCustomerInfo; + } + + public void setNewCustomerInfo(BigDecimal newCustomerInfo) { + this.newCustomerInfo = newCustomerInfo; + } + + public BigDecimal getToalColocadoInfo() { + return toalColocadoInfo; + } + + public void setToalColocadoInfo(BigDecimal toalColocadoInfo) { + this.toalColocadoInfo = toalColocadoInfo; + } + + public BigDecimal getToalPaymentInfo() { + return toalPaymentInfo; + } + + public void setToalPaymentInfo(BigDecimal toalPaymentInfo) { + this.toalPaymentInfo = toalPaymentInfo; + } + + public BigDecimal getToalFeeInfo() { + return toalFeeInfo; + } + + public void setToalFeeInfo(BigDecimal toalFeeInfo) { + this.toalFeeInfo = toalFeeInfo; + } + public BigDecimal getSaldoInsoluto() { + return saldoInsoluto; + } + + public void setSaldoInsoluto(BigDecimal saldoInsoluto) { + this.saldoInsoluto = saldoInsoluto; + } + + public BigDecimal getBonusNewCustomerInfo() { + return bonusNewCustomerInfo; + } + + public void setBonusNewCustomerInfo(BigDecimal bonusNewCustomerInfo) { + this.bonusNewCustomerInfo = bonusNewCustomerInfo; + } + + public BigDecimal getBonusColocationInfo() { + return bonusColocationInfo; + } + + public void setBonusColocationInfo(BigDecimal bonusColocationInfo) { + this.bonusColocationInfo = bonusColocationInfo; + } + + public BigDecimal getBonusMoraInfo() { + return bonusMoraInfo; + } + + public void setBonusMoraInfo(BigDecimal bonusMoraInfo) { + this.bonusMoraInfo = bonusMoraInfo; + } + + public String getTipoBonusInfo() { + return tipoBonusInfo; + } + + public void setTipoBonusInfo(String tipoBonusInfo) { + this.tipoBonusInfo = tipoBonusInfo; + } + + public Integer getDaysSalary() { + return daysSalary; + } + + public void setDaysSalary(Integer daysSalary) { + this.daysSalary = daysSalary; + } + + public Integer getDaysBonus() { + return daysBonus; + } + + public void setDaysBonus(Integer daysBonus) { + this.daysBonus = daysBonus; + } + + public List getPayroll() { + return payroll; + } + + public void setPayroll(List payroll) { + this.payroll = payroll; + } + + public Payroll getSelectedPayroll() { + return selectedPayroll; + } + + public void setSelectedPayroll(Payroll selectedPayroll) { + this.selectedPayroll = selectedPayroll; + } + + public DriverController getDriverCtrl() { + return driverCtrl; + } + + public void setDriverCtrl(DriverController driverCtrl) { + this.driverCtrl = driverCtrl; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public BigDecimal getBoxed() { + return boxed; + } + + public void setBoxed(BigDecimal boxed) { + this.boxed = boxed; + } + + public BigDecimal getSaving() { + return saving; + } + + public void setSaving(BigDecimal saving) { + this.saving = saving; + } + + public BigDecimal getPaymentToDebt() { + return paymentToDebt; + } + + public void setPaymentToDebt(BigDecimal paymentToDebt) { + this.paymentToDebt = paymentToDebt; + } + + public GenericValidationController getGenericValidateController() { + return genericValidateController; + } + + public void setGenericValidateController(GenericValidationController genericController) { + this.genericValidateController = genericController; + } + + public Date getLastStableGeneralBox() { + return lastStableGeneralBox; + } + + public void setLastStableGeneralBox(Date lastStableGeneralBox) { + this.lastStableGeneralBox = lastStableGeneralBox; + } + + private GenericController genericCtrl; + private PayRollController payrollCtrl; + private BitacoraController bitacoraCtrl; + private GenericValidationController genericValidateController; + private LoanEmployeeController loanEmployeeController; + + private Date lastStableGeneralBox; + private List user; + private List payroll; + private Payroll selectedPayroll; + + private String userId; + private Date dateInit; + private Date dateEnd; + private String comments; + + private BigDecimal salary; + private BigDecimal imss; + private BigDecimal advances; + private BigDecimal newCustomer; + private BigDecimal bonusColocation; + private BigDecimal BonusMora; + private Goal goal; + private BigDecimal granTotal; + private BigDecimal granTotalDeducciones; + private BigDecimal discounts; + private String commentsDiscounts; + private BigDecimal increases; + private String commentsIncreases; + private BigDecimal total; + + private BigDecimal metaInfo; + private BigDecimal newCustomerInfo; + private BigDecimal toalColocadoInfo; + private BigDecimal toalPaymentInfo; + private BigDecimal toalFeeInfo; + private BigDecimal saldoInsoluto; + + private BigDecimal bonusNewCustomerInfo; + private BigDecimal bonusColocationInfo; + private BigDecimal bonusMoraInfo; + private String tipoBonusInfo; + private Integer daysSalary; + private Integer daysBonus; + private DriverController driverCtrl; + private List data; + + private BigDecimal boxed; + private BigDecimal saving; + private BigDecimal paymentToDebt; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initOneWeekBeforeToCurrdate(); + + genericCtrl = new GenericController(); + payrollCtrl = new PayRollController(); + driverCtrl = new DriverController(); + bitacoraCtrl = new BitacoraController(); + loanEmployeeController = new LoanEmployeeController(); + data = driverCtrl.getAllLoanLastWeekByOffice(getLoggedUser().getOffice().getId()); + payroll = payrollCtrl.fillPayrollDatatable(getLoggedUser().getOffice().getId(), getStarDate(), getEndDate()); + setGenericValidateController(new GenericValidationController()); + setLastStableGeneralBox(getGenericValidateController().lastStableGeneralBoxByDate(getLoggedUser().getUser())); + user = getUsers(); + salary = BigDecimal.ZERO; + imss = BigDecimal.ZERO; + advances = BigDecimal.ZERO; + newCustomer = BigDecimal.ZERO; + bonusColocation = BigDecimal.ZERO; + BonusMora = BigDecimal.ZERO; + granTotal = BigDecimal.ZERO; + granTotalDeducciones = BigDecimal.ZERO; + total = BigDecimal.ZERO; + discounts = BigDecimal.ZERO; + increases = BigDecimal.ZERO; + metaInfo = BigDecimal.ZERO; + newCustomerInfo = BigDecimal.ZERO; + toalColocadoInfo = BigDecimal.ZERO; + toalPaymentInfo = BigDecimal.ZERO; + toalFeeInfo = BigDecimal.ZERO; + saldoInsoluto = BigDecimal.ZERO; + bonusNewCustomerInfo = BigDecimal.ZERO; + bonusColocationInfo = BigDecimal.ZERO; + bonusMoraInfo = BigDecimal.ZERO; + tipoBonusInfo = ""; + commentsDiscounts = ""; + commentsIncreases = ""; + daysBonus = 5; + daysSalary = 5; + + boxed = BigDecimal.ZERO; + saving = BigDecimal.ZERO; + paymentToDebt = BigDecimal.ZERO; + + Calendar c = Calendar.getInstance(); + if(c.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY){ + c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); + dateInit = new Date(c.getTimeInMillis()); + c.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY); + dateEnd = new Date(c.getTimeInMillis()); + } + else{ + c.add(Calendar.DAY_OF_WEEK, -7); + c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); + dateInit = new Date(c.getTimeInMillis()); + c.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY); + dateEnd = new Date(c.getTimeInMillis()); + } + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/PeopleBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/PeopleBean.java new file mode 100644 index 0000000..40be5a7 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/PeopleBean.java @@ -0,0 +1,231 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.PeopleController; +import com.arrebol.apc.controller.catalog.RouteController; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.CustomerClassification; +import com.arrebol.apc.model.enums.PeopleType; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("peopleManager") +@ViewScoped +public class PeopleBean extends GenericBean implements Serializable { + + public void addPeople() { + try { + logger.debug("addPeople"); + getSavePeople().setOffice(new Office(getLoggedUser().getOffice().getId())); + getSavePeople().setActiveStatus(ActiveStatus.ENEBLED); + getSavePeople().setRouteCtlg(new RouteCtlg(routeId)); + getSavePeople().setLetraCuenta(""); + getSavePeople().setThumbnail(""); + getSavePeople().setClassification(CustomerClassification.WHITE); + getSavePeople().setDatosCreditoVendedor(userVId); + getSavePeople().setDatosCreditoAsignado(userAId); + getSavePeople().setDatosCreditoInvestigador(userIId); + + if (isCustomer == true && isEndorsement == false) { + getSavePeople().setPeopleType(PeopleType.CUSTOMER); + } + if (isCustomer == true && isEndorsement == true) { + getSavePeople().setPeopleType(PeopleType.BOTH); + } + if (isCustomer == false && isEndorsement == true) { + getSavePeople().setPeopleType(PeopleType.ENDORSEMENT); + } + if (isCustomer == false && isEndorsement == false) { + getSavePeople().setPeopleType(PeopleType.BOTH); + } + + String messafeFormat = getBundlePropertyFile().getString("message.format.failure"); + FacesMessage.Severity severity = FacesMessage.SEVERITY_WARN; + + if (getSavePeople().getId() != null) { + getSavePeople().setLastUpdatedBy(getLoggedUser().getUser().getId()); + getSavePeople().setLastUpdatedOn(new Date()); + if (getPeopleCtrl().updateByPeopleId(getSavePeople())) { + messafeFormat = "Datos actualizados"; + severity = FacesMessage.SEVERITY_INFO; + } + } else { + getSavePeople().setCreatedBy(getLoggedUser().getUser().getId()); + getSavePeople().setCreatedOn(new Date()); + if (getPeopleCtrl().savePeople(getSavePeople())) { + messafeFormat = getBundlePropertyFile().getString("message.format.sucess"); + severity = FacesMessage.SEVERITY_INFO; + } + } + + Object[] param = {getBundlePropertyFile().getString("people"), getBundlePropertyFile().getString("created")}; + + buildAndSendMessage(param, messafeFormat, severity, getBundlePropertyFile().getString("people")); + + } catch (Exception e) { + logger.error("savePeople", e); + Object[] param = {getBundlePropertyFile().getString("created")}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + getBundlePropertyFile().getString("people") + ); + } + } + + public void limpiarForm() { + setSavePeople(new People()); + isCustomer = false; + isEndorsement = false; + } + + public PeopleController getPeopleCtrl() { + return peopleCtrl; + } + + public void setPeopleCtrl(PeopleController peopleCtrl) { + this.peopleCtrl = peopleCtrl; + } + + public boolean isIsCustomer() { + return isCustomer; + } + + public void setIsCustomer(boolean isCustomer) { + this.isCustomer = isCustomer; + } + + public boolean isIsEndorsement() { + return isEndorsement; + } + + public void setIsEndorsement(boolean isEndorsement) { + this.isEndorsement = isEndorsement; + } + + public People getSavePeople() { + return savePeople; + } + + public void setSavePeople(People savePeople) { + this.savePeople = savePeople; + } + + public String getRouteId() { + return routeId; + } + + public void setRouteId(String routeId) { + this.routeId = routeId; + } + + public List getRoutes() { + return routes; + } + + public void setRoutes(List routes) { + this.routes = routes; + } + + public RouteController getRouteCtrl() { + return routeCtrl; + } + + public void setRouteCtrl(RouteController routeCtrl) { + this.routeCtrl = routeCtrl; + } + + public String getRouteLetra() { + return routeLetra; + } + + public void setRouteLetra(String routeLetra) { + this.routeLetra = routeLetra; + } + + public List getUser() { + return user; + } + + public void setUser(List user) { + this.user = user; + } + + public String getUserVId() { + return userVId; + } + + public void setUserVId(String userVId) { + this.userVId = userVId; + } + + public String getUserIId() { + return userIId; + } + + public void setUserIId(String userIId) { + this.userIId = userIId; + } + + public String getUserAId() { + return userAId; + } + + public void setUserAId(String userAId) { + this.userAId = userAId; + } + + final Logger logger = LogManager.getLogger(PeopleBean.class); + + private PeopleController peopleCtrl; + private RouteController routeCtrl; + private GenericController genericCtrl; + boolean isCustomer; + boolean isEndorsement; + private People savePeople; + String routeId; + String routeLetra; + List routes; + private List user; + String userVId; + String userIId; + String userAId; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + peopleCtrl = new PeopleController(); + routeCtrl = new RouteController(); + genericCtrl = new GenericController(); + setSavePeople(new People()); + isCustomer = false; + isEndorsement = false; + routes = routeCtrl.fillRoutesDatatable(getLoggedUser().getOffice().getId()); + user = genericCtrl.getAllUsersByOffice(getLoggedUser().getOffice().getId()); + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StableGeneralBoxBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StableGeneralBoxBean.java new file mode 100644 index 0000000..cc6d1f1 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StableGeneralBoxBean.java @@ -0,0 +1,851 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.BitacoraController; +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.GenericValidationController; +import com.arrebol.apc.controller.admin.StableGeneralBoxController; +import com.arrebol.apc.model.admin.ExpenseCompany; +import com.arrebol.apc.model.admin.StableGeneralBox; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.ExpenseCompanyType; +import com.arrebol.apc.model.system.logs.Bitacora; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import com.arrebol.apc.web.beans.SendMSN; +import com.itextpdf.text.BaseColor; +import com.itextpdf.text.Chunk; +import com.itextpdf.text.Document; +import com.itextpdf.text.Element; +import com.itextpdf.text.FontFactory; +import com.itextpdf.text.Image; +import com.itextpdf.text.PageSize; +import com.itextpdf.text.Paragraph; +import com.itextpdf.text.pdf.PdfPCell; +import com.itextpdf.text.pdf.PdfPTable; +import com.itextpdf.text.pdf.PdfWriter; +import java.awt.Font; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.Serializable; +import java.math.BigDecimal; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import javax.servlet.ServletContext; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import static org.hibernate.annotations.common.util.impl.LoggerFactory.logger; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("stableGeneralBoxManager") +@ViewScoped +public class StableGeneralBoxBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setStableGeneralBox(fillDatatableStableGeneralBox()); + } + } catch (Exception e) { + } + } + + public List fillDatatableStableGeneralBox() { + + return getStableGeneralBoxCtrl().fillStableGeneralBoxDatatable(getLoggedUser().getOffice().getId(), getStarDate(), getEndDate()); + } + + public void calculationFunction() { + total = sobres.add(efectivo).add(monedas); + total = total.subtract(totalBox); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + if (createdOn == null) { + FacesMessage msg = new FacesMessage("Datos incorrectos", "La fecha es obligatoria"); + FacesContext.getCurrentInstance().addMessage(null, msg); + return; + } + // BigDecimal totalBoxTemp = genericCtrl.findAllGeneralBox(getLoggedUser().getOffice().getId()); + BigDecimal totalBoxTemp = stableGeneralBoxCtrl.getTotalBox(); + + if (totalBox.compareTo(totalBoxTemp) != 0) { + FacesMessage msg = new FacesMessage("Advertencia", "Otros usuarios han movido la información de caja general, por lo cual cambio el monto. Favor de refrescar la página."); + FacesContext.getCurrentInstance().addMessage(null, msg); + return; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(createdOn); + calendar.set(Calendar.HOUR_OF_DAY, 12); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + + if (stableGeneralBoxCtrl.getCountStableGeneralBoxByOfficeAndDate(calendar.getTime(), getLoggedUser().getOffice().getId()) > 0) { + FacesMessage msg = new FacesMessage("Cuadre de caja encontrado.", "Ya se encuentra registrado un cuadre de caja general para ese día."); + FacesContext.getCurrentInstance().addMessage(null, msg); + return; + } + + if (stableGeneralBoxCtrl.getPendingByClosingDay(getLoggedUser().getOffice().getId()).compareTo(BigDecimal.ZERO) > 0) { + FacesMessage msg = new FacesMessage("ATENCION - CORTES FALTANTES.", "Falta hacer cortes del dia."); + FacesContext.getCurrentInstance().addMessage(null, msg); + return; + } + + StableGeneralBox box = new StableGeneralBox(); + box.setActiveStatus(ActiveStatus.ENEBLED); + box.setDescription(description); + box.setOffice(new Office(getLoggedUser().getOffice().getId())); + box.setTotalGeneralBox(totalBox); + box.setTotalBankNote(efectivo); + box.setTotalEnvelope(sobres); + box.setTotalCoin(monedas); + BigDecimal temp = sobres.add(efectivo).add(monedas); + box.setTotalStable(temp.subtract(totalBox)); + + box.setCreatedOn(new Date()); + box.setCreatedBy(getLoggedUser().getUser().getId()); + stableGeneralBoxCtrl.saveStableGeneralBox(box); + + + if (total.compareTo(BigDecimal.ZERO) > 0) { + Calendar calendarDate = calendar; + calendarDate.add(Calendar.DAY_OF_YEAR, 1); + Date date = calendarDate.getTime(); + + ExpenseCompany expense = new ExpenseCompany(); + expense.setActiveStatus(ActiveStatus.ENEBLED); + expense.setExpenseCompanyType(ExpenseCompanyType.PAYMENT_IN); + expense.setOffice(new Office(getLoggedUser().getOffice().getId())); + expense.setAmount(total); + expense.setDescription("Entrada automática por sobrante de caja general"); + expense.setCreatedOn(date); + expense.setCreatedBy(box.getCreatedBy()); + + stableGeneralBoxCtrl.autoSaveEntry(expense); + } + + try { + SendMSN msn = new SendMSN("Caja general - " + "APC" + " - " + + "Total: $" + totalBox.toString() + ", Entrego: $" + + sobres.add(efectivo).add(monedas).toString(), + SendMSN.getNumberPhoneFormat("3314666450")); + msn.sendMessage(); + } catch (Exception e) { + showMessage(FacesMessage.SEVERITY_ERROR, + "Error en notificación", + "No fue posible enviar el mensaje al receptor, contacta al administrador."); + } + + efectivo = BigDecimal.ZERO; + sobres = BigDecimal.ZERO; + monedas = BigDecimal.ZERO; + total = BigDecimal.ZERO; + description = ""; + FacesMessage msg = new FacesMessage("Nuevo cuadre de caja general", "Se agregó correctamente"); + FacesContext.getCurrentInstance().addMessage(null, msg); + } + + @Override + public void deleteRow() { + try { + if (stableGeneralBoxCtrl.existNextPaidStableGeneralBoxByCreatedOn(selectedStableGeneralBox.getCreatedOn())) { + showMessage(FacesMessage.SEVERITY_WARN, "Historial cadre de caja general", "No se puede borrar porque existe un cuadre de caja posterior."); + } else { + boolean delete = true; + delete = selectedStableGeneralBox.getActiveStatus() == ActiveStatus.ENEBLED ? true : false; + + if (delete) { + stableGeneralBoxCtrl.updateStableGeneralBoxByStatus(ActiveStatus.DISABLED, selectedStableGeneralBox.getId(), getLoggedUser().getUser().getId()); + searchHistoricalAction(); + Bitacora bitacora = new Bitacora(); + bitacora.setAction("Eliminar corte de caja general"); + bitacora.setCommentsUser(getComments()); + bitacora.setCreatedBy(getLoggedUser().getUser().getId()); + bitacora.setCreatedOn(new Date()); + bitacora.setNameUser(getLoggedUser().getUser().getUserName()); + bitacora.setOffice(new Office(getLoggedUser().getOffice().getId())); + bitacora.setDescription("Se eliminó el corte de caja general con total en caja " + currencyFormatNumber(getSelectedStableGeneralBox().getTotalGeneralBox()) + + ", total sobre " + currencyFormatNumber(getSelectedStableGeneralBox().getTotalEnvelope()) + + ", total monedas " + currencyFormatNumber(getSelectedStableGeneralBox().getTotalCoin()) + + ", total efectivo " + currencyFormatNumber(getSelectedStableGeneralBox().getTotalBankNote()) + + ", diferencia de " + currencyFormatNumber(getSelectedStableGeneralBox().getTotalGeneralBox().subtract(getSelectedStableGeneralBox().getTotalEnvelope()).subtract(getSelectedStableGeneralBox().getTotalCoin()).subtract(getSelectedStableGeneralBox().getTotalBankNote())) + + " y fecha " + getSelectedStableGeneralBox().getCreatedOn()); + bitacoraCtrl.saveBitacora(bitacora); + comments = ""; + selectedStableGeneralBox = null; + showMessage(FacesMessage.SEVERITY_INFO, "Historial cadre de caja general", "Se eliminó correctamente."); + } + } + } catch (Exception e) { + } + } + + public StableGeneralBoxController getStableGeneralBoxCtrl() { + return stableGeneralBoxCtrl; + } + + public void setStableGeneralBoxCtrl(StableGeneralBoxController stableGeneralBoxCtrl) { + this.stableGeneralBoxCtrl = stableGeneralBoxCtrl; + } + + public List getStableGeneralBox() { + return stableGeneralBox; + } + + public void setStableGeneralBox(List stableGeneralBox) { + this.stableGeneralBox = stableGeneralBox; + } + + public StableGeneralBox getSelectedStableGeneralBox() { + return selectedStableGeneralBox; + } + + public void setSelectedStableGeneralBox(StableGeneralBox selectedStableGeneralBox) { + this.selectedStableGeneralBox = selectedStableGeneralBox; + } + + public BigDecimal getTotalBox() { + return totalBox; + } + + public void setTotalBox(BigDecimal totalBox) { + this.totalBox = totalBox; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public BigDecimal getSobres() { + return sobres; + } + + public void setSobres(BigDecimal sobres) { + this.sobres = sobres; + } + + public BigDecimal getEfectivo() { + return efectivo; + } + + public void setEfectivo(BigDecimal efectivo) { + this.efectivo = efectivo; + } + + public BigDecimal getMonedas() { + return monedas; + } + + public void setMonedas(BigDecimal monedas) { + this.monedas = monedas; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public BigDecimal getTotal() { + return total; + } + + public void setTotal(BigDecimal total) { + this.total = total; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public GenericValidationController getGenericValidateController() { + return genericValidateController; + } + + public void setGenericValidateController(GenericValidationController genericController) { + this.genericValidateController = genericController; + } + + public Date getLastStableGeneralBox() { + return lastStableGeneralBox; + } + + public void setLastStableGeneralBox(Date lastStableGeneralBox) { + this.lastStableGeneralBox = lastStableGeneralBox; + } + + public void imprimir() { + Document document = new Document(PageSize.LETTER); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try { + + PdfWriter.getInstance(document, baos); + + List results = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(selectedStableGeneralBox.getCreatedOn()); + calendar.add(Calendar.HOUR_OF_DAY, -6); + Date fecha = calendar.getTime(); + + results = stableGeneralBoxCtrl.getDataReport(fecha); + document.open(); + + DateFormat formatter = new SimpleDateFormat("dd/MM/yy"); + + Paragraph printDate = new Paragraph("Fecha de impresión: " + formatter.format(fecha), FontFactory.getFont("arial", 10, Font.BOLD, BaseColor.DARK_GRAY)); + printDate.setAlignment(Element.ALIGN_RIGHT); + document.add(printDate); + + ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext(); + String carpetaImagen = (String) servletContext.getRealPath("resources/serenity-layout/images"); + + Image imagen = Image.getInstance(carpetaImagen + "/apc_card.png"); + imagen.scalePercent(4f); + imagen.setAlignment(Element.ALIGN_CENTER); + document.add(imagen); + + Paragraph title = new Paragraph("CUADRE CAJA GENERAL", FontFactory.getFont("arial", 18, Font.BOLD, BaseColor.DARK_GRAY)); + title.setAlignment(Element.ALIGN_CENTER); + document.add(title); + + document.add(Chunk.NEWLINE); + + Object[] res = (Object[]) results.get(0); + BigDecimal sobresCajaChica = BigDecimal.ZERO; + BigDecimal efectivoCajaChica = BigDecimal.ZERO; + BigDecimal monedasCajaChica = BigDecimal.ZERO; + BigDecimal totalCajaChica = BigDecimal.ZERO; + + BigDecimal sobresCajaGral = BigDecimal.ZERO; + BigDecimal efectivoCajaGral = BigDecimal.ZERO; + BigDecimal monedasCajaGral = BigDecimal.ZERO; + BigDecimal totalCajaGral = BigDecimal.ZERO; + + PdfPTable tableGen = new PdfPTable(3); + tableGen.setWidthPercentage(100); + tableGen.setTotalWidth(new float[]{150f, 205f, 205f}); + tableGen.setLockedWidth(true); + + PdfPCell cellGen = new PdfPCell(new Paragraph("Detalle del día de egresos e ingresos", + FontFactory.getFont("arial", 10, Font.BOLD, BaseColor.WHITE))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGen.setBackgroundColor(new BaseColor( 4, 193, 10 )); + cellGen.setColspan(3); + tableGen.addCell(cellGen); + + cellGen = new PdfPCell(new Paragraph("Tipo", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + //cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + + cellGen = new PdfPCell(new Paragraph("Ingreso", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + //cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + + cellGen = new PdfPCell(new Paragraph("Egreso", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + //cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + // INICIOS + cellGen = new PdfPCell(new Paragraph("inicios", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + // Inicios Ingresos + cellGen = new PdfPCell(new Paragraph("$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + // Inicios Egresos + cellGen = new PdfPCell(new Paragraph(res[1] != null ? "$" + res[1].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + // ENTRADAS + cellGen = new PdfPCell(new Paragraph("Entradas", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + // Entradas Ingresos + cellGen = new PdfPCell(new Paragraph(res[4] != null ? "$" + res[4].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + // Entradas Egresos + cellGen = new PdfPCell(new Paragraph("$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + // ADELANTOS + cellGen = new PdfPCell(new Paragraph("Adelantos", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + // Adelantos Ingresos + cellGen = new PdfPCell(new Paragraph("$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + // Adelantos Egresos + cellGen = new PdfPCell(new Paragraph(res[3] != null ? "$" + res[3].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + // GASTOS ADMON + cellGen = new PdfPCell(new Paragraph("Gastos admon.", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + // Gastos Admon Ingresos + cellGen = new PdfPCell(new Paragraph("$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + // Gastos Admon Egresos + cellGen = new PdfPCell(new Paragraph(res[5] != null ? "$" + res[5].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + // NOMINA + cellGen = new PdfPCell(new Paragraph("Nóminas", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + // Nómina Ingresos + cellGen = new PdfPCell(new Paragraph("$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + // Nómina Egresos + cellGen = new PdfPCell(new Paragraph(res[2] != null ? "$" + res[2].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + + document.add(tableGen); + document.add(Chunk.NEWLINE); + + PdfPTable table = new PdfPTable(4); + table.setTotalWidth(new float[]{100f, 170f, 140f, 150f}); + + table.setLockedWidth(true); + PdfPCell cell = new PdfPCell(new Paragraph("Detalle del cuadre de caja chica y caja general", + FontFactory.getFont("arial", 10, Font.BOLD, BaseColor.WHITE))); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setBackgroundColor(new BaseColor( 4, 193, 10 )); + cell.setColspan(4); + table.addCell(cell); + + cell = new PdfPCell(new Paragraph("Total caja chica: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + cell = new PdfPCell(new Paragraph(res[6] != null ? "$" + res[6].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + totalCajaChica = new BigDecimal(res[6] == null ? "0.0" : res[6].toString()); + cell = new PdfPCell(new Paragraph("Total caja general: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + cell = new PdfPCell(new Paragraph(res[12] != null ? "$" + res[12].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + totalCajaGral = new BigDecimal(res[12] == null ? "0.0" : res[12].toString()); + + cell = new PdfPCell(new Paragraph("Total sobres: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + cell = new PdfPCell(new Paragraph(res[7] != null ? "$" + res[7].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + sobresCajaChica = new BigDecimal(res[7] == null ? "0.0" : res[7].toString()); + cell = new PdfPCell(new Paragraph("Total sobres: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + cell = new PdfPCell(new Paragraph(res[13] != null ? "$" + res[13].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + sobresCajaGral = new BigDecimal(res[13] == null ? "0.0" : res[13].toString()); + + cell = new PdfPCell(new Paragraph("Total efectivo: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + cell = new PdfPCell(new Paragraph(res[8] != null ? "$" + res[8].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + efectivoCajaChica = new BigDecimal(res[8] == null ? "0.0" : res[8].toString()); + cell = new PdfPCell(new Paragraph("Total efectivo: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + cell = new PdfPCell(new Paragraph(res[14] != null ? "$" + res[14].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + efectivoCajaGral = new BigDecimal(res[14] == null ? "0.0" : res[14].toString()); + + cell = new PdfPCell(new Paragraph("Total monedas: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + cell = new PdfPCell(new Paragraph(res[9] != null ? "$" + res[9].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + monedasCajaChica = new BigDecimal(res[9] == null ? "0.0" : res[9].toString()); + cell = new PdfPCell(new Paragraph("Total monedas: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + cell = new PdfPCell(new Paragraph(res[15] != null ? "$" + res[15].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + monedasCajaGral = new BigDecimal(res[15] == null ? "0.0" : res[15].toString()); + + cell = new PdfPCell(new Paragraph("Diferencia: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + BigDecimal difCajaChica = sobresCajaChica.add(efectivoCajaChica).add(monedasCajaChica).subtract(totalCajaChica); + cell = new PdfPCell(new Paragraph(difCajaChica != null ? "$" + difCajaChica.toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + cell = new PdfPCell(new Paragraph("Diferencia: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + BigDecimal difCajaGral = sobresCajaGral.add(efectivoCajaGral).add(monedasCajaGral).subtract(totalCajaGral); + cell = new PdfPCell(new Paragraph(difCajaGral != null ? "$" + difCajaGral.toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + + cell = new PdfPCell(new Paragraph("Comentarios: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + cell = new PdfPCell(new Paragraph(res[11] != null ? res[11].toString() : "", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + cell = new PdfPCell(new Paragraph("Comentarios: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + cell = new PdfPCell(new Paragraph(res[17] != null ? res[17].toString() : "", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + cell.setBorder(0); + cell.setColspan(1); + table.addCell(cell); + + document.add(table); + document.add(Chunk.NEWLINE); + + PdfPTable tableRes = new PdfPTable(2); + tableRes.setTotalWidth(new float[]{100f, 460f}); + + tableRes.setLockedWidth(true); + PdfPCell cellRes = new PdfPCell(new Paragraph("Resumen del día", + FontFactory.getFont("arial", 10, Font.BOLD, BaseColor.WHITE))); + cellRes.setHorizontalAlignment(Element.ALIGN_CENTER); + cellRes.setBackgroundColor(new BaseColor( 4, 193, 10 )); + cellRes.setColspan(2); + tableRes.addCell(cellRes); + + cellRes = new PdfPCell(new Paragraph("Cortes del día: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + cellRes = new PdfPCell(new Paragraph(res[18] != null ? "$" + res[18].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + + cellRes = new PdfPCell(new Paragraph("Subtotal: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + cellRes = new PdfPCell(new Paragraph(res[19] != null ? "$" + res[19].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + + cellRes = new PdfPCell(new Paragraph("Comisión ap.: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + cellRes = new PdfPCell(new Paragraph(res[20] != null ? "$" + res[20].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + + cellRes = new PdfPCell(new Paragraph("Cobranza: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + cellRes = new PdfPCell(new Paragraph(res[21] != null ? "$" + res[21].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + + cellRes = new PdfPCell(new Paragraph("Colocación: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + cellRes = new PdfPCell(new Paragraph(res[22] != null ? "$" + res[22].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + + document.add(tableRes); + + + document.add(Chunk.NEWLINE); + document.add(Chunk.NEWLINE); + document.add(Chunk.NEWLINE); + document.add(Chunk.NEWLINE); + + document.add(new Paragraph(" __________________________ __________________________")); + document.add(new Paragraph(" Firma Nombre y firma cajero responsable")); + //document.add(new Paragraph(" " + res[8] == null ? "" : res[8].toString())); + + } catch (Exception e) { + System.out.print("Error 1: " + e.getMessage()); + } + + document.close(); + FacesContext context = FacesContext.getCurrentInstance(); + Object response = context.getExternalContext().getResponse(); + if (response instanceof HttpServletResponse) { + HttpServletResponse hrs = (HttpServletResponse) response; + hrs.setContentType("application/pdf"); + hrs.setHeader("Content-disposition", "attachment;filename=caja_general.pdf"); + hrs.setContentLength(baos.size()); + try { + ServletOutputStream out = hrs.getOutputStream(); + baos.writeTo(out); + out.flush(); + + } catch (IOException e) { + System.out.print("Error 2: " + e.getMessage()); + } + context.responseComplete(); + } + } + + private StableGeneralBoxController stableGeneralBoxCtrl; + private GenericController genericCtrl; + private BitacoraController bitacoraCtrl; + private GenericValidationController genericValidateController; + private Date lastStableGeneralBox; + private String comments; + + private List stableGeneralBox; + + private StableGeneralBox selectedStableGeneralBox; + + private BigDecimal totalBox; + + private String description; + private BigDecimal sobres; + private BigDecimal efectivo; + private BigDecimal monedas; + private Date createdOn; + private BigDecimal total; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initOneWeekBeforeToCurrdate(); + + stableGeneralBoxCtrl = new StableGeneralBoxController(); + genericCtrl = new GenericController(); + bitacoraCtrl = new BitacoraController(); + setGenericValidateController(new GenericValidationController()); + setLastStableGeneralBox(getGenericValidateController().lastStableGeneralBoxByDate(getLoggedUser().getUser())); + stableGeneralBox = fillDatatableStableGeneralBox(); + // totalBox = genericCtrl.findAllGeneralBox(getLoggedUser().getOffice().getId()); + totalBox = stableGeneralBoxCtrl.getTotalBox(); + efectivo = BigDecimal.ZERO; + monedas = BigDecimal.ZERO; + sobres = BigDecimal.ZERO; + total = totalBox; + createdOn=new Date(); + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StableSmallBoxBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StableSmallBoxBean.java new file mode 100644 index 0000000..0fc4b8f --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StableSmallBoxBean.java @@ -0,0 +1,679 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.BitacoraController; +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.GenericValidationController; +import com.arrebol.apc.controller.admin.StableSmallBoxController; +import com.arrebol.apc.model.admin.OtherExpense; +import com.arrebol.apc.model.admin.StableSmallBox; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.system.logs.Bitacora; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import com.arrebol.apc.web.beans.SendMSN; +import com.itextpdf.text.BaseColor; +import com.itextpdf.text.Chunk; +import com.itextpdf.text.Document; +import com.itextpdf.text.Element; +import com.itextpdf.text.FontFactory; +import com.itextpdf.text.Image; +import com.itextpdf.text.PageSize; +import com.itextpdf.text.Paragraph; +import com.itextpdf.text.pdf.PdfPCell; +import com.itextpdf.text.pdf.PdfPTable; +import com.itextpdf.text.pdf.PdfWriter; +import java.awt.Font; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.Serializable; +import java.math.BigDecimal; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import javax.servlet.ServletContext; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("stableSmallBoxManager") +@ViewScoped +public class StableSmallBoxBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setStableSmallBox(fillDatatableStableSmallBox()); + } + } catch (Exception e) { + } + } + + public List fillDatatableStableSmallBox() { + return getStableSmallBoxCtrl().fillStableSmallBoxDatatable(getLoggedUser().getOffice().getId(), getStarDate(), getEndDate()); + } + + public void calculationFunction() { + total = sobres.add(efectivo).add(monedas); + total = total.subtract(totalBox); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + if (createdOn == null) { + FacesMessage msg = new FacesMessage("Datos incorrectos", "La fecha es obligatoria"); + FacesContext.getCurrentInstance().addMessage(null, msg); + return; + } + + BigDecimal totalBoxTemp = genericCtrl.findAllSmallBox(getLoggedUser().getOffice().getId()); + if (totalBox.compareTo(totalBoxTemp) != 0) { + FacesMessage msg = new FacesMessage("Advertencia", "Otros usuarios han movido la información de caja chica, por lo cual cambio el monto. Favor de refrescar la página."); + FacesContext.getCurrentInstance().addMessage(null, msg); + return; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(createdOn); + calendar.set(Calendar.HOUR_OF_DAY, 12); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + + if (stableSmallBoxCtrl.getCountStableSmallBoxByOfficeAndDate(calendar.getTime(), getLoggedUser().getOffice().getId()) > 0) { + FacesMessage msg = new FacesMessage("Cuadre de caja chica encontrado.", "Ya se encuentra registrado un cuadre de caja chica para ese día."); + FacesContext.getCurrentInstance().addMessage(null, msg); + return; + } + + if (stableSmallBoxCtrl.getPendingByClosingDay(getLoggedUser().getOffice().getId()).compareTo(BigDecimal.ZERO) > 0) { + FacesMessage msg = new FacesMessage("ATENCION - CORTES FALTANTES.", "Falta hacer cortes del dia."); + FacesContext.getCurrentInstance().addMessage(null, msg); + return; + } + + Date date = new Date(); + if (genericCtrl.existStableGeneralBoxByCreatedOn(date)) { + showMessage(FacesMessage.SEVERITY_WARN, "Día cerrado", "No se pueden agregar más cortes de caja chica porque ya se existe un cuadre de caja general de hoy."); + return; + } + StableSmallBox box = new StableSmallBox(); + box.setActiveStatus(ActiveStatus.ENEBLED); + box.setDescription(description); + box.setOffice(new Office(getLoggedUser().getOffice().getId())); + box.setTotalSmallBox(totalBox); + box.setTotalBankNote(efectivo); + box.setTotalEnvelope(sobres); + box.setTotalCoin(monedas); + BigDecimal temp = sobres.add(efectivo).add(monedas); + box.setTotalStable(temp.subtract(totalBox)); + + try { + SendMSN msn = new SendMSN("Caja chica - " + "APC" + " - " + + "Por entregar: $" + box.getTotalSmallBox().toString() + ", entregado: $" + + box.getTotalEnvelope().add(box.getTotalBankNote()).add(box.getTotalCoin()).toString(), + SendMSN.getNumberPhoneFormat("3314666450")); + msn.sendMessage(); + } catch (Exception e) { + showMessage(FacesMessage.SEVERITY_ERROR, + "Error en notificación", + "No fue posible enviar el mensaje al receptor, contacta al administrador."); + } + + box.setCreatedOn(new Date()); + box.setCreatedBy(getLoggedUser().getUser().getId()); + stableSmallBoxCtrl.saveStableSmallBox(box); + efectivo = BigDecimal.ZERO; + sobres = BigDecimal.ZERO; + monedas = BigDecimal.ZERO; + total = BigDecimal.ZERO; + description = ""; + FacesMessage msg = new FacesMessage("Nuevo cuadre de caja chica", "Se agregó correctamente"); + FacesContext.getCurrentInstance().addMessage(null, msg); + } + + @Override + public void deleteRow() { + try { + if (stableSmallBoxCtrl.existStableGeneralBoxByCreatedOn(selectedStableSmallBox.getCreatedOn())) { + showMessage(FacesMessage.SEVERITY_WARN, "Cuadre Caja chica", "No se puede borrar porque ya se realizo el cuadre de caja general del día."); + } else { + if (stableSmallBoxCtrl.existNextPaidStableSmallBoxByCreatedOn(selectedStableSmallBox.getCreatedOn())) { + showMessage(FacesMessage.SEVERITY_WARN, "Cuadre Caja chica", "No se puede borrar porque existe un cuadre de caja chica posterior"); + } else { + boolean delete = true; + delete = selectedStableSmallBox.getActiveStatus() == ActiveStatus.ENEBLED ? true : false; + + if (delete) { + + stableSmallBoxCtrl.updateStableSmallBoxByStatus(ActiveStatus.DISABLED, selectedStableSmallBox.getId(), getLoggedUser().getUser().getId()); + Bitacora bitacora = new Bitacora(); + bitacora.setAction("Eliminar corte de caja general"); + bitacora.setCommentsUser(getComments()); + bitacora.setCreatedBy(getLoggedUser().getUser().getId()); + bitacora.setCreatedOn(new Date()); + bitacora.setNameUser(getLoggedUser().getUser().getUserName()); + bitacora.setOffice(new Office(getLoggedUser().getOffice().getId())); + bitacora.setDescription("Se eliminó el corte de caja chica con total en caja " + currencyFormatNumber(getSelectedStableSmallBox().getTotalSmallBox()) + + ", total sobre " + currencyFormatNumber(getSelectedStableSmallBox().getTotalEnvelope()) + + ", total monedas " + currencyFormatNumber(getSelectedStableSmallBox().getTotalCoin()) + + ", total efectivo " + currencyFormatNumber(getSelectedStableSmallBox().getTotalBankNote()) + + ", diferencia de " + currencyFormatNumber(getSelectedStableSmallBox().getTotalSmallBox().subtract(getSelectedStableSmallBox().getTotalEnvelope()).subtract(getSelectedStableSmallBox().getTotalCoin()).subtract(getSelectedStableSmallBox().getTotalBankNote())) + + " y fecha " + getSelectedStableSmallBox().getCreatedOn()); + bitacoraCtrl.saveBitacora(bitacora); + comments = ""; + + searchHistoricalAction(); + selectedStableSmallBox = null; + showMessage(FacesMessage.SEVERITY_INFO, "Cuadre Caja chica", "Se eliminó correctamente."); + } + } + } + + } catch (Exception e) { + } + } + + public StableSmallBoxController getStableSmallBoxCtrl() { + return stableSmallBoxCtrl; + } + + public void setStableSmallBoxCtrl(StableSmallBoxController stableSmallBoxCtrl) { + this.stableSmallBoxCtrl = stableSmallBoxCtrl; + } + + public List getStableSmallBox() { + return stableSmallBox; + } + + public void setStableSmallBox(List stableSmallBox) { + this.stableSmallBox = stableSmallBox; + } + + public StableSmallBox getSelectedStableSmallBox() { + return selectedStableSmallBox; + } + + public void setSelectedStableSmallBox(StableSmallBox selectedStableSmallBox) { + this.selectedStableSmallBox = selectedStableSmallBox; + } + + public BigDecimal getTotalBox() { + return totalBox; + } + + public void setTotalBox(BigDecimal totalBox) { + this.totalBox = totalBox; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public BigDecimal getSobres() { + return sobres; + } + + public void setSobres(BigDecimal sobres) { + this.sobres = sobres; + } + + public BigDecimal getEfectivo() { + return efectivo; + } + + public void setEfectivo(BigDecimal efectivo) { + this.efectivo = efectivo; + } + + public BigDecimal getMonedas() { + return monedas; + } + + public void setMonedas(BigDecimal monedas) { + this.monedas = monedas; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public BigDecimal getTotal() { + return total; + } + + public void setTotal(BigDecimal total) { + this.total = total; + } + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public GenericValidationController getGenericValidateController() { + return genericValidateController; + } + + public void setGenericValidateController(GenericValidationController genericController) { + this.genericValidateController = genericController; + } + + public Date getLastStableGeneralBox() { + return lastStableGeneralBox; + } + + public void setLastStableGeneralBox(Date lastStableGeneralBox) { + this.lastStableGeneralBox = lastStableGeneralBox; + } + + public void imprimir() { + Document document = new Document(PageSize.LETTER); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try { + PdfWriter.getInstance(document, baos); + List results = new ArrayList<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(selectedStableSmallBox.getCreatedOn()); + calendar.add(Calendar.HOUR_OF_DAY, -6); + Date fecha = calendar.getTime(); + + results = stableSmallBoxCtrl.getDataReport(fecha); + List gastos = stableSmallBoxCtrl.fillOtherExpenseDatatable(getLoggedUser().getOffice().getId(), selectedStableSmallBox.getCreatedOn(), selectedStableSmallBox.getCreatedOn()); + document.open(); + + DateFormat formatter = new SimpleDateFormat("dd/MM/yy"); + + Paragraph printDate = new Paragraph("Fecha de impresión: " + formatter.format(fecha), FontFactory.getFont("arial", 10, Font.BOLD, BaseColor.DARK_GRAY)); + printDate.setAlignment(Element.ALIGN_RIGHT); + document.add(printDate); + + ServletContext servletContext = (ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext(); + String carpetaImagen=(String)servletContext.getRealPath("resources/serenity-layout/images"); + + Image imagen = Image.getInstance(carpetaImagen+"/apc_card.png"); + imagen.scalePercent(4f); + imagen.setAlignment(Element.ALIGN_CENTER); + document.add(imagen); + + Paragraph title = new Paragraph("CORTE DE CAJA CHICA", FontFactory.getFont("arial", 18, Font.BOLD, BaseColor.DARK_GRAY)); + title.setAlignment(Element.ALIGN_CENTER); + document.add(title); + + document.add(Chunk.NEWLINE); + + Object[] res = (Object[]) results.get(0); + BigDecimal sobresC = BigDecimal.ZERO; + BigDecimal efectivoC = BigDecimal.ZERO; + BigDecimal monedasC = BigDecimal.ZERO; + BigDecimal totalC = BigDecimal.ZERO; + BigDecimal dif = BigDecimal.ZERO; + + PdfPTable tableGen = new PdfPTable(5); + tableGen.setWidthPercentage(100); + tableGen.setTotalWidth(new float[]{100f, 100f, 110f, 110f, 120f}); + tableGen.setLockedWidth(true); + + PdfPCell cellGen = new PdfPCell(new Paragraph("Detalle de cortes del día", + FontFactory.getFont("arial", 10, Font.BOLD, BaseColor.WHITE))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGen.setBackgroundColor(new BaseColor(4, 193, 10)); + cellGen.setColspan(5); + tableGen.addCell(cellGen); + + cellGen = new PdfPCell(new Paragraph("Asesor", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + //cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + cellGen = new PdfPCell(new Paragraph("Ruta", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + //cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + cellGen = new PdfPCell(new Paragraph("Monto esperado", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + //cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + cellGen = new PdfPCell(new Paragraph("Monto reportado", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + //cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + cellGen = new PdfPCell(new Paragraph("Comentarios", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + //cellGen.setBorder(0); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + + for (Object result : results) { + Object[] tmp = (Object[]) result; + // Detalle + cellGen = new PdfPCell(new Paragraph(tmp[0] == null ? "" : tmp[0].toString(), + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + //Préstamo anterior + cellGen = new PdfPCell(new Paragraph(tmp[1] != null ? tmp[1].toString() : "", + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + // Comisión por apertura + cellGen = new PdfPCell(new Paragraph(tmp[2] != null ? "$" + tmp[2].toString() : "$0.00", + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + // Monto + cellGen = new PdfPCell(new Paragraph(tmp[3] != null ? "$" + tmp[3].toString() : "$0.00", + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + // Saldo insoluto + cellGen = new PdfPCell(new Paragraph(tmp[4] != null ? "$" + tmp[4].toString() : "$0.00", + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cellGen.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGen.setColspan(1); + tableGen.addCell(cellGen); + } + document.add(tableGen); + document.add(new Paragraph(" ", FontFactory.getFont("arial", 10, Font.BOLD, BaseColor.DARK_GRAY))); + + PdfPTable tableGastos = new PdfPTable(4); + tableGastos.setWidthPercentage(100); + tableGastos.setTotalWidth(new float[]{130f, 130f, 140f, 140f}); + tableGastos.setLockedWidth(true); + + PdfPCell cellGastos = new PdfPCell(new Paragraph("Detalle de gastos", + FontFactory.getFont("arial", 10, Font.BOLD, BaseColor.WHITE))); + cellGastos.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGastos.setBackgroundColor(new BaseColor(4, 193, 10)); + cellGastos.setColspan(5); + tableGastos.addCell(cellGastos); + cellGastos = new PdfPCell(new Paragraph("Asesor", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGastos.setHorizontalAlignment(Element.ALIGN_CENTER); + //cellGen.setBorder(0); + cellGastos.setColspan(1); + tableGastos.addCell(cellGastos); + cellGastos = new PdfPCell(new Paragraph("Ruta", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGastos.setHorizontalAlignment(Element.ALIGN_CENTER); + //cellGen.setBorder(0); + cellGastos.setColspan(1); + tableGastos.addCell(cellGastos); + cellGastos = new PdfPCell(new Paragraph("Monto", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGastos.setHorizontalAlignment(Element.ALIGN_CENTER); + //cellGen.setBorder(0); + cellGastos.setColspan(1); + tableGastos.addCell(cellGastos); + cellGastos = new PdfPCell(new Paragraph("Comentarios", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellGastos.setHorizontalAlignment(Element.ALIGN_CENTER); + //cellGen.setBorder(0); + cellGastos.setColspan(1); + tableGastos.addCell(cellGastos); + + for (OtherExpense datoGasto : gastos) { + // usuario + cellGastos = new PdfPCell(new Paragraph(datoGasto == null ? "" : datoGasto.getUser().getHumanResource().getFirstName() + " " + datoGasto.getUser().getHumanResource().getLastName(), + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cellGastos.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGastos.setColspan(1); + tableGastos.addCell(cellGastos); + //rutas + cellGastos = new PdfPCell(new Paragraph(datoGasto != null ? datoGasto.getUserRoutes() : "", + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cellGastos.setHorizontalAlignment(Element.ALIGN_LEFT); + cellGastos.setColspan(1); + tableGastos.addCell(cellGastos); + // monto + cellGastos = new PdfPCell(new Paragraph(datoGasto != null ? "$" + datoGasto.getExpense() : "$0.00", + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cellGastos.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGastos.setColspan(1); + tableGastos.addCell(cellGastos); + // comentarios + cellGastos = new PdfPCell(new Paragraph(datoGasto != null ? datoGasto.getDescription() : "", + FontFactory.getFont("arial", 6, Font.PLAIN, BaseColor.BLACK))); + cellGastos.setHorizontalAlignment(Element.ALIGN_CENTER); + cellGastos.setColspan(1); + tableGastos.addCell(cellGastos); + } + + document.add(tableGastos); + document.add(new Paragraph(" ", FontFactory.getFont("arial", 10, Font.BOLD, BaseColor.DARK_GRAY))); + + PdfPTable tableRes = new PdfPTable(2); + tableRes.setTotalWidth(new float[]{100f, 440f}); + + tableRes.setLockedWidth(true); + PdfPCell cellRes = new PdfPCell(new Paragraph("Detalle del cuadre de caja chica", + FontFactory.getFont("arial", 10, Font.BOLD, BaseColor.WHITE))); + cellRes.setHorizontalAlignment(Element.ALIGN_CENTER); + cellRes.setBackgroundColor(new BaseColor(4, 193, 10)); + cellRes.setColspan(2); + tableRes.addCell(cellRes); + + cellRes = new PdfPCell(new Paragraph("Total caja: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + cellRes = new PdfPCell(new Paragraph(res[5] != null ? "$" + res[5].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + totalC = new BigDecimal(res[5] == null ? "0.0" : res[5].toString()); + + cellRes = new PdfPCell(new Paragraph("Total sobres: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + cellRes = new PdfPCell(new Paragraph(res[6] != null ? "$" + res[6].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + sobresC = new BigDecimal(res[6] == null ? "0.0" : res[6].toString()); + + cellRes = new PdfPCell(new Paragraph("Total efectivo: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + cellRes = new PdfPCell(new Paragraph(res[7] != null ? "$" + res[7].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + efectivoC = new BigDecimal(res[7] == null ? "0.0" : res[7].toString()); + + cellRes = new PdfPCell(new Paragraph("Total monedas: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + cellRes = new PdfPCell(new Paragraph(res[8] != null ? "$" + res[8].toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + monedasC = new BigDecimal(res[8] == null ? "0.0" : res[8].toString()); + + cellRes = new PdfPCell(new Paragraph("Diferencia: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + dif = sobresC.add(efectivoC).add(monedasC).subtract(totalC); + cellRes = new PdfPCell(new Paragraph(dif != null ? "$" + dif.toString() : "$0.00", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + + cellRes = new PdfPCell(new Paragraph("Comentarios: ", + FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + cellRes = new PdfPCell(new Paragraph(res[10] != null ? res[10].toString() : "", + FontFactory.getFont("arial", 8, Font.PLAIN, BaseColor.BLACK))); + cellRes.setHorizontalAlignment(Element.ALIGN_LEFT); + cellRes.setBorder(0); + cellRes.setColspan(1); + tableRes.addCell(cellRes); + + document.add(tableRes); + + document.add(Chunk.NEWLINE); + document.add(Chunk.NEWLINE); + document.add(Chunk.NEWLINE); + document.add(Chunk.NEWLINE); + + document.add(new Paragraph(" __________________________ __________________________")); + document.add(new Paragraph(" Firma Nombre y firma cajero responsable")); +// document.add(new Paragraph(" " + res[8] == null ? "" : res[8].toString())); + + } catch (Exception e) { + System.out.print("Error 1: " + e.getMessage()); + } + + document.close(); + FacesContext context = FacesContext.getCurrentInstance(); + Object response = context.getExternalContext().getResponse(); + if (response instanceof HttpServletResponse) { + HttpServletResponse hrs = (HttpServletResponse) response; + hrs.setContentType("application/pdf"); + hrs.setHeader("Content-disposition", "attachment"); + hrs.setContentLength(baos.size()); + try { + ServletOutputStream out = hrs.getOutputStream(); + baos.writeTo(out); + out.flush(); + + } catch (IOException e) { + System.out.print("Error 2: " + e.getMessage()); + } + context.responseComplete(); + } + } + + private StableSmallBoxController stableSmallBoxCtrl; + private GenericController genericCtrl; + private BitacoraController bitacoraCtrl; + private GenericValidationController genericValidateController; + private Date lastStableGeneralBox; + private String comments; + + private List stableSmallBox; + + private StableSmallBox selectedStableSmallBox; + + private BigDecimal totalBox; + + private String description; + private BigDecimal sobres; + private BigDecimal efectivo; + private BigDecimal monedas; + private Date createdOn; + private BigDecimal total; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initOneWeekBeforeToCurrdate(); + + stableSmallBoxCtrl = new StableSmallBoxController(); + genericCtrl = new GenericController(); + bitacoraCtrl = new BitacoraController(); + setGenericValidateController(new GenericValidationController()); + setLastStableGeneralBox(getGenericValidateController().lastStableGeneralBoxByDate(getLoggedUser().getUser())); + stableSmallBox = fillDatatableStableSmallBox(); + totalBox = genericCtrl.findAllSmallBox(getLoggedUser().getOffice().getId()); + efectivo = BigDecimal.ZERO; + monedas = BigDecimal.ZERO; + sobres = BigDecimal.ZERO; + total = totalBox; + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsAdvancesBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsAdvancesBean.java new file mode 100644 index 0000000..2338ec9 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsAdvancesBean.java @@ -0,0 +1,180 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.StatsAdvancesController; +import com.arrebol.apc.controller.catalog.RouteController; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.views.StatsAdvancesView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author David Rodriguez + */ +@Named("statsAdvancesManager") +@ViewScoped +public class StatsAdvancesBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setAdvances(fillDatatableAdvances()); + setTotalValue(); + } + } catch (Exception e) { + } + } + + public BigDecimal searchTotalAdvancesAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setTotalValue(); + } + } catch (Exception e) { + } + return getTotalAdvances(); + } + + public StatsAdvancesController getAdvancesCtrl() { + return advancesCtrl; + } + + public void setAdvancesCtrl(StatsAdvancesController advancesCtrl) { + this.advancesCtrl = advancesCtrl; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List fillDatatableAdvances() { + return getAdvancesCtrl().fillAdvancesDataTable(getStarDate(), getEndDate(), getRouteSelectedId()); + } + + public BigDecimal fillTotalAdvances() { + return getAdvancesCtrl().fillTotalAdvances(getStarDate(), getEndDate()); + } + + public List getAdvances() { + return advances; + } + + public void setAdvances(List advances) { + this.advances = advances; + } + + public StatsAdvancesView getSelectedAdvances() { + return selectedAdvances; + } + + public void setSelectedAdvances(StatsAdvancesView selectedAdvances) { + this.selectedAdvances = selectedAdvances; + } + + public BigDecimal getTotalAdvances() { + return totalAdvances; + } + + public void setTotalAdvances(BigDecimal totalAdvances) { + this.totalAdvances = totalAdvances; + } + + public List getRoutes() { + return routes; + } + + public RouteController getRouteCtrl() { + return routeCtrl; + } + + public void setRouteCtrl(RouteController routeCtrl) { + this.routeCtrl = routeCtrl; + } + + public String getRouteSelectedId() { + return routeSelectedId; + } + + public void setRouteSelectedId(String routeSelectedId) { + this.routeSelectedId = routeSelectedId; + } + + private StatsAdvancesController advancesCtrl; + private GenericController genericCtrl; + private RouteController routeCtrl; + private List advances; + private StatsAdvancesView selectedAdvances; + private BigDecimal totalAdvances; + private List routes; + private String routeSelectedId; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initStartAndEndDates(Calendar.DAY_OF_WEEK, 2); + + advancesCtrl = new StatsAdvancesController(); + genericCtrl = new GenericController(); + routeCtrl = new RouteController(); + advances = fillDatatableAdvances(); + setTotalValue(); + routes = routeCtrl.fillRoutesDatatable(getLoggedUser().getOffice().getId()); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + private void setTotalValue() { + if (advances != null && !advances.isEmpty()) { + setTotalAdvances(advances.stream().map(StatsAdvancesView::getTotalAdvances).reduce(BigDecimal::add).get()); + } else { + setTotalAdvances(BigDecimal.ZERO); + } + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsClosingDayBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsClosingDayBean.java new file mode 100644 index 0000000..5006f76 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsClosingDayBean.java @@ -0,0 +1,169 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.StatsClosingDayController; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.views.StatsClosingDayView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author David Rodriguez + */ +@Named("statsClosingDayManager") +@ViewScoped +public class StatsClosingDayBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setClosingDay(fillDatatableClosingDay()); + setTotalValue(); + } + } catch (Exception e) { + } + } + + public BigDecimal searchTotalClosingDayAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setTotalValue(); + } + } catch (Exception e) { + } + return getTotalClosingDay(); + } + + public StatsClosingDayController getClosingDayCtrl() { + return closingDayCtrl; + } + + public void setClosingDayCtrl(StatsClosingDayController closingDayCtrl) { + this.closingDayCtrl = closingDayCtrl; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List fillDatatableClosingDay() { + return getClosingDayCtrl().fillClosingDayDataTable(getStarDate(), getEndDate(), getUserSelectedId()); + } + + public BigDecimal fillTotalClosingDay() { + return getClosingDayCtrl().fillTotalClosingDay(getStarDate(), getEndDate()); + } + + public List getClosingDay() { + return closingDay; + } + + public void setClosingDay(List closingDay) { + this.closingDay = closingDay; + } + + public StatsClosingDayView getSelectedClosingDay() { + return selectedClosingDay; + } + + public void setSelectedClosingDay(StatsClosingDayView selectedClosingDay) { + this.selectedClosingDay = selectedClosingDay; + } + + public BigDecimal getTotalClosingDay() { + return totalClosingDay; + } + + public void setTotalClosingDay(BigDecimal totalClosingDay) { + this.totalClosingDay = totalClosingDay; + } + + public List getUsers() { + return genericCtrl.getAllUsersByOffice(getLoggedUser().getOffice().getId()); + } + + public String getUserSelectedId() { + return userSelectedId; + } + + public void setUserSelectedId(String userSelectedId) { + this.userSelectedId = userSelectedId; + } + + private StatsClosingDayController closingDayCtrl; + private GenericController genericCtrl; + private List closingDay; + private StatsClosingDayView selectedClosingDay; + private BigDecimal totalClosingDay; + private List users; + private String userSelectedId; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initStartAndEndDates(Calendar.DAY_OF_WEEK, 2); + + closingDayCtrl = new StatsClosingDayController(); + genericCtrl = new GenericController(); + closingDay = fillDatatableClosingDay(); + setTotalValue(); + users = getUsers(); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + private void setTotalValue() { + if (closingDay != null && !closingDay.isEmpty()) { + setTotalClosingDay(closingDay.stream().map(StatsClosingDayView::getTotalClosingDay).reduce(BigDecimal::add).get()); + } else { + setTotalClosingDay(BigDecimal.ZERO); + } + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsDepositsBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsDepositsBean.java new file mode 100644 index 0000000..393ea37 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsDepositsBean.java @@ -0,0 +1,169 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.StatsDepositsController; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.views.StatsDepositsView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author David Rodriguez + */ +@Named("statsDepositsManager") +@ViewScoped +public class StatsDepositsBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setDeposits(fillDatatableDeposits()); + setTotalValue(); + } + } catch (Exception e) { + } + } + + public BigDecimal searchTotalDepositsAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setTotalValue(); + } + } catch (Exception e) { + } + return getTotalDeposits(); + } + + public StatsDepositsController getDepositsCtrl() { + return depositsCtrl; + } + + public void setDepositsCtrl(StatsDepositsController depositsCtrl) { + this.depositsCtrl = depositsCtrl; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List fillDatatableDeposits() { + return getDepositsCtrl().fillDepositsDataTable(getStarDate(), getEndDate(), getUserSelectedId()); + } + + public BigDecimal fillTotalDeposits() { + return getDepositsCtrl().fillTotalDeposits(getStarDate(), getEndDate()); + } + + public List getDeposits() { + return deposits; + } + + public void setDeposits(List deposits) { + this.deposits = deposits; + } + + public StatsDepositsView getSelectedDeposits() { + return selectedDeposits; + } + + public void setSelectedDeposits(StatsDepositsView selectedDeposits) { + this.selectedDeposits = selectedDeposits; + } + + public BigDecimal getTotalDeposits() { + return totalDeposits; + } + + public void setTotalDeposits(BigDecimal totalDeposits) { + this.totalDeposits = totalDeposits; + } + + public List getUsers() { + return genericCtrl.getAllUsersByOffice(getLoggedUser().getOffice().getId()); + } + + public String getUserSelectedId() { + return userSelectedId; + } + + public void setUserSelectedId(String userSelectedId) { + this.userSelectedId = userSelectedId; + } + + private StatsDepositsController depositsCtrl; + private GenericController genericCtrl; + private List deposits; + private StatsDepositsView selectedDeposits; + private BigDecimal totalDeposits; + private List users; + private String userSelectedId; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initStartAndEndDates(Calendar.DAY_OF_WEEK, 2); + + depositsCtrl = new StatsDepositsController(); + genericCtrl = new GenericController(); + deposits = fillDatatableDeposits(); + setTotalValue(); + users = getUsers(); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + private void setTotalValue() { + if (deposits != null && !deposits.isEmpty()) { + setTotalDeposits(deposits.stream().map(StatsDepositsView::getTotalDeposits).reduce(BigDecimal::add).get()); + } else { + setTotalDeposits(BigDecimal.ZERO); + } + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsEmployeeSavingBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsEmployeeSavingBean.java new file mode 100644 index 0000000..7826915 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsEmployeeSavingBean.java @@ -0,0 +1,264 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.StatsEmployeeSavingController; +import com.arrebol.apc.controller.util.DateWrapper; +import com.arrebol.apc.model.admin.EmployeeSaving; +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.EmployeeSavingType; +import com.arrebol.apc.model.views.StatsEmployeeSavingView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author David Rodriguez + */ +@Named("statsEmployeeSavingManager") +@ViewScoped +public class StatsEmployeeSavingBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setEmployeeSaving(fillDatatableEmployeeSaving()); + setTotalEmployeeSaving(fillTotalEmployeeSaving()); + } + } catch (Exception e) { + } + } + + public BigDecimal searchTotalEmployeeSavingAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setTotalEmployeeSaving(fillTotalEmployeeSaving()); + } + } catch (Exception e) { + } + return getTotalEmployeeSaving(); + } + + public List getDetails(String idUser) { + try { + setEmployeeSavingDetails(getEmployeeSavingCtrl().getEmployeeSavingById(getStarDate(), getEndDate(), idUser)); + } catch (Exception e) { + } + return null == employeeSavingsDetails ? new ArrayList<>() : employeeSavingsDetails; + } + + public StatsEmployeeSavingController getEmployeeSavingCtrl() { + return employeeSavingCtrl; + } + + public void setEmployeeSavingCtrl(StatsEmployeeSavingController employeeSavingCtrl) { + this.employeeSavingCtrl = employeeSavingCtrl; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List fillDatatableEmployeeSaving() { + return getEmployeeSavingCtrl().fillEmployeeSavingDataTable(getStarDate(), getEndDate()); + } + + public BigDecimal fillTotalEmployeeSaving() { + return getEmployeeSavingCtrl().fillTotalEmployeeSaving(getStarDate(), getEndDate()); + } + + public List getEmployeeSaving() { + return employeeSavings; + } + + public void setEmployeeSaving(List employeeSaving) { + this.employeeSavings = employeeSaving; + } + + public List getEmployeeSavingDetails() { + return employeeSavingsDetails; + } + + public void setEmployeeSavingDetails(List employeeSavingsDetails) { + this.employeeSavingsDetails = employeeSavingsDetails; + } + + public StatsEmployeeSavingView getSelectedEmployeeSaving() { + return selectedEmployeeSaving; + } + + public void setSelectedEmployeeSaving(StatsEmployeeSavingView selectedEmployeeSaving) { + this.selectedEmployeeSaving = selectedEmployeeSaving; + } + + public BigDecimal getTotalEmployeeSaving() { + return totalEmployeeSaving; + } + + public void setTotalEmployeeSaving(BigDecimal totalEmployeeSaving) { + this.totalEmployeeSaving = totalEmployeeSaving; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public BigDecimal getDisposal() { + return disposal; + } + + public void setDisposal(BigDecimal disposal) { + this.disposal = disposal; + } + + public List getUsers() { + return genericCtrl.getAllUsersByOffice(getLoggedUser().getOffice().getId()); + } + + public String getUserSelectedId() { + return userSelectedId; + } + + public void setUserSelectedId(String userSelectedId) { + this.userSelectedId = userSelectedId; + } + + private StatsEmployeeSavingController employeeSavingCtrl; + private GenericController genericCtrl; + private List employeeSavings; + private List employeeSavingsDetails; + private StatsEmployeeSavingView selectedEmployeeSaving; + private BigDecimal totalEmployeeSaving; + private String userId; + private BigDecimal disposal; + private List users; + private String userSelectedId; + + public void createEmployeeSaving() { + User userPayRoll = employeeSavingCtrl.getUserById(userSelectedId); + + getDetails(userPayRoll.getHumanResource().getId()); + + if(disposal.compareTo(BigDecimal.ZERO)==0){ + + showMessage(FacesMessage.SEVERITY_WARN, "Disposición Incorrecta", "No se puede disponer de 0"); + return; + + } + + if(disposal.compareTo(BigDecimal.ZERO)<0){ + + showMessage(FacesMessage.SEVERITY_WARN, "Disposición Incorrecta", "No se puede disponer de un numero negativo"); + return; + + } + + if (genericCtrl.existStableGeneralBoxByCreatedOn(new Date())) { + showMessage(FacesMessage.SEVERITY_WARN, "Día cerrado", "No se pueden hacer mas disposiciones de ahorro porque ya se existe un cuadre de caja general de hoy."); + return; + } + + BigDecimal totalEmployeeSavingDetail = BigDecimal.ZERO; + for (StatsEmployeeSavingView employeeSaving : employeeSavingsDetails) { + if (employeeSaving.getType().equals(EmployeeSavingType.SAVING)) { + totalEmployeeSavingDetail = totalEmployeeSavingDetail.add(employeeSaving.getEmployeeSaving()); + }else{ + totalEmployeeSavingDetail = totalEmployeeSavingDetail.subtract(employeeSaving.getEmployeeSaving()); + } + } + + if(disposal.compareTo(totalEmployeeSavingDetail)<=0){ + EmployeeSaving employeeSaving = new EmployeeSaving(); + employeeSaving.setIdUser(userPayRoll.getHumanResource().getId()); + employeeSaving.setEmployeeSaving(disposal); + employeeSaving.setCreatedOn(new Date()); + employeeSaving.setCreatedBy(getLoggedUser().getId()); + employeeSaving.setType(EmployeeSavingType.DISPOSAL); + + employeeSavingCtrl.saveEmployeeSaving(employeeSaving); + showMessage(FacesMessage.SEVERITY_INFO, "Disposición de ahorro", "Se guardó correctamente"); + setEmployeeSaving(fillDatatableEmployeeSaving()); + setTotalEmployeeSaving(fillTotalEmployeeSaving()); + } + + else{ + showMessage(FacesMessage.SEVERITY_INFO, "Disposición de ahorro fallida", "No se puede disponer más efectivo del ahorro de esta persona"); + } + + } + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + + Calendar cal = Calendar.getInstance(); + + cal.set(Calendar.DAY_OF_YEAR, 1); + Date start = cal.getTime(); + + setStarDate(start); + setEndDate(DateWrapper.getTodayMXTime()); + + employeeSavingCtrl = new StatsEmployeeSavingController(); + genericCtrl = new GenericController(); + employeeSavings = fillDatatableEmployeeSaving(); + totalEmployeeSaving = fillTotalEmployeeSaving(); + users = getUsers(); + + disposal = BigDecimal.ZERO; + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsGasolineBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsGasolineBean.java new file mode 100644 index 0000000..e2ec866 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsGasolineBean.java @@ -0,0 +1,144 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.StatsGasolineController; +import com.arrebol.apc.model.views.StatsGasolineView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.Calendar; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author David Rodriguez + */ +@Named("statsGasolineManager") +@ViewScoped +public class StatsGasolineBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setGasoline(fillDatatableGasoline()); + setTotalGasoline(fillTotalGasoline()); + } + } catch (Exception e) { + } + } + + public Double searchTotalGasolineAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setTotalGasoline(fillTotalGasoline()); + } + } catch (Exception e) { + } + return getTotalGasoline(); + } + + public StatsGasolineController getGasolineCtrl() { + return gasolineCtrl; + } + + public void setGasolineCtrl(StatsGasolineController gasolineCtrl) { + this.gasolineCtrl = gasolineCtrl; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List fillDatatableGasoline() { + return getGasolineCtrl().fillGasolineDataTable(getStarDate(), getEndDate()); + } + + public Double fillTotalGasoline() { + return getGasolineCtrl().fillTotalGasoline(getStarDate(), getEndDate()); + } + + public List getGasoline() { + return gasoline; + } + + public void setGasoline(List gasoline) { + this.gasoline = gasoline; + } + + public StatsGasolineView getSelectedGasoline() { + return selectedGasoline; + } + + public void setSelectedGasoline(StatsGasolineView selectedGasoline) { + this.selectedGasoline = selectedGasoline; + } + + public Double getTotalGasoline() { + return totalGasoline; + } + + public void setTotalGasoline(Double totalGasoline) { + this.totalGasoline = totalGasoline; + } + + private StatsGasolineController gasolineCtrl; + private GenericController genericCtrl; + private List gasoline; + private StatsGasolineView selectedGasoline; + private Double totalGasoline; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initStartAndEndDates(Calendar.DAY_OF_WEEK, 2); + + gasolineCtrl = new StatsGasolineController(); + genericCtrl = new GenericController(); + gasoline = fillDatatableGasoline(); + totalGasoline = fillTotalGasoline(); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsOpeningFeesBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsOpeningFeesBean.java new file mode 100644 index 0000000..9c095ea --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsOpeningFeesBean.java @@ -0,0 +1,168 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.StatsOpeningFeesController; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.views.StatsOpeningFeesView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author David Rodriguez + */ +@Named("statsOpeningFeesManager") +@ViewScoped +public class StatsOpeningFeesBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setOpeningFees(fillDatatableOpeningFees()); + setTotalValue(); + } + } catch (Exception e) { + } + } + + public BigDecimal searchTotalOpeningFeesAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setTotalValue(); + } + } catch (Exception e) { + } + return getTotalOpeningFees(); + } + + public StatsOpeningFeesController getOpeningFeesCtrl() { + return openingFeesCtrl; + } + + public void setOpeningFeesCtrl(StatsOpeningFeesController openingFeesCtrl) { + this.openingFeesCtrl = openingFeesCtrl; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List fillDatatableOpeningFees() { + return getOpeningFeesCtrl().fillOpeningFeesDataTable(getStarDate(), getEndDate(), getUserSelectedId()); + } + + public BigDecimal fillTotalOpeningFees() { + return getOpeningFeesCtrl().fillTotalOpeningFees(getStarDate(), getEndDate()); + } + + public List getopeningFees() { + return openingFees; + } + + public void setOpeningFees(List openingFees) { + this.openingFees = openingFees; + } + + public StatsOpeningFeesView getSelectedOpeningFees() { + return selectedOpeningFees; + } + + public void setSelectedOpeningFees(StatsOpeningFeesView selectedOpeningFees) { + this.selectedOpeningFees = selectedOpeningFees; + } + + public BigDecimal getTotalOpeningFees() { + return totalOpeningFees; + } + + public void setTotalOpeningFees(BigDecimal totalOpeningFees) { + this.totalOpeningFees = totalOpeningFees; + } + + public List getUsers() { + return genericCtrl.getAllUsersByOffice(getLoggedUser().getOffice().getId()); + } + + public String getUserSelectedId() { + return userSelectedId; + } + + public void setUserSelectedId(String userSelectedId) { + this.userSelectedId = userSelectedId; + } + + private StatsOpeningFeesController openingFeesCtrl; + private GenericController genericCtrl; + private List openingFees; + private StatsOpeningFeesView selectedOpeningFees; + private BigDecimal totalOpeningFees; + private List users; + private String userSelectedId; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initStartAndEndDates(Calendar.DAY_OF_WEEK, 2); + + openingFeesCtrl = new StatsOpeningFeesController(); + genericCtrl = new GenericController(); + openingFees = fillDatatableOpeningFees(); + setTotalValue(); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + private void setTotalValue() { + if (openingFees != null && !openingFees.isEmpty()) { + setTotalOpeningFees(openingFees.stream().map(StatsOpeningFeesView::getTotalOpeningFees).reduce(BigDecimal::add).get()); + } else { + setTotalOpeningFees(BigDecimal.ZERO); + } + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsPaymentBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsPaymentBean.java new file mode 100644 index 0000000..79d9efc --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsPaymentBean.java @@ -0,0 +1,169 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.StatsPaymentController; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.views.StatsPaymentView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author David Rodriguez + */ +@Named("statsPaymentManager") +@ViewScoped +public class StatsPaymentBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setPayment(fillDatatablePayment()); + setTotalValue(); + } + } catch (Exception e) { + } + } + + public BigDecimal searchTotalPaymentAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setTotalValue(); + } + } catch (Exception e) { + } + return getTotalPayment(); + } + + public StatsPaymentController getPaymentCtrl() { + return paymentCtrl; + } + + public void setPaymentCtrl(StatsPaymentController paymentCtrl) { + this.paymentCtrl = paymentCtrl; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List fillDatatablePayment() { + return getPaymentCtrl().fillPaymentDataTable(getStarDate(), getEndDate(), getUserSelectedId()); + } + + public BigDecimal fillTotalPayment() { + return getPaymentCtrl().fillTotalPayment(getStarDate(), getEndDate()); + } + + public List getPayment() { + return payment; + } + + public void setPayment(List payment) { + this.payment = payment; + } + + public StatsPaymentView getSelectedPayment() { + return selectedPayment; + } + + public void setSelectedPayment(StatsPaymentView selectedPayment) { + this.selectedPayment = selectedPayment; + } + + public BigDecimal getTotalPayment() { + return totalPayment; + } + + public void setTotalPayment(BigDecimal totalPayment) { + this.totalPayment = totalPayment; + } + + public List getUsers() { + return genericCtrl.getAllUsersByOffice(getLoggedUser().getOffice().getId()); + } + + public String getUserSelectedId() { + return userSelectedId; + } + + public void setUserSelectedId(String userSelectedId) { + this.userSelectedId = userSelectedId; + } + + private StatsPaymentController paymentCtrl; + private GenericController genericCtrl; + private List payment; + private StatsPaymentView selectedPayment; + private BigDecimal totalPayment; + private List users; + private String userSelectedId; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initStartAndEndDates(Calendar.DAY_OF_WEEK, 2); + + paymentCtrl = new StatsPaymentController(); + genericCtrl = new GenericController(); + payment = fillDatatablePayment(); + setTotalValue(); + users = getUsers(); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + private void setTotalValue() { + if (payment != null && !payment.isEmpty()) { + setTotalPayment(payment.stream().map(StatsPaymentView::getTotalPayment).reduce(BigDecimal::add).get()); + } else { + setTotalPayment(BigDecimal.ZERO); + } + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsPaymentRenovationBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsPaymentRenovationBean.java new file mode 100644 index 0000000..4dc97f1 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsPaymentRenovationBean.java @@ -0,0 +1,168 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.StatsPaymentRenovationController; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.views.StatsPaymentRenovationView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author David Rodriguez + */ +@Named("statsPaymentRenovationManager") +@ViewScoped +public class StatsPaymentRenovationBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setPaymentRenovation(fillDatatablePayment()); + setTotalValue(); + } + } catch (Exception e) { + } + } + + public BigDecimal searchTotalPaymentAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setTotalValue(); + } + } catch (Exception e) { + } + return getTotalPayment(); + } + + public StatsPaymentRenovationController getPaymentCtrl() { + return paymentCtrl; + } + + public void setPaymentCtrl(StatsPaymentRenovationController paymentCtrl) { + this.paymentCtrl = paymentCtrl; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List fillDatatablePayment() { + return getPaymentCtrl().fillPaymentDataTable(getStarDate(), getEndDate(), getUserSelectedId()); + } + + public BigDecimal fillTotalPayment() { + return getPaymentCtrl().fillTotalPayment(getStarDate(), getEndDate()); + } + + public List getPaymentRenovation() { + return paymentRenovation; + } + + public void setPaymentRenovation(List payment) { + this.paymentRenovation = payment; + } + + public StatsPaymentRenovationView getSelectedPaymentRenovation() { + return selectedPaymentRenovation; + } + + public void setSelectedPaymentRenovation(StatsPaymentRenovationView selectedPayment) { + this.selectedPaymentRenovation = selectedPayment; + } + + public BigDecimal getTotalPayment() { + return totalPayment; + } + + public void setTotalPayment(BigDecimal totalPayment) { + this.totalPayment = totalPayment; + } + + public List getUsers() { + return genericCtrl.getAllUsersByOffice(getLoggedUser().getOffice().getId()); + } + + public String getUserSelectedId() { + return userSelectedId; + } + + public void setUserSelectedId(String userSelectedId) { + this.userSelectedId = userSelectedId; + } + + private StatsPaymentRenovationController paymentCtrl; + private GenericController genericCtrl; + private List paymentRenovation; + private StatsPaymentRenovationView selectedPaymentRenovation; + private BigDecimal totalPayment; + private List users; + private String userSelectedId; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initStartAndEndDates(Calendar.DAY_OF_WEEK, 2); + + paymentCtrl = new StatsPaymentRenovationController(); + genericCtrl = new GenericController(); + paymentRenovation = fillDatatablePayment(); + setTotalValue(); + users = getUsers(); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + private void setTotalValue() { + if (paymentRenovation != null && !paymentRenovation.isEmpty()) { + setTotalPayment(paymentRenovation.stream().map(StatsPaymentRenovationView::getTotalPayment).reduce(BigDecimal::add).get()); + } else { + setTotalPayment(BigDecimal.ZERO); + } + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsPaymentRouteBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsPaymentRouteBean.java new file mode 100644 index 0000000..2c5ff53 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsPaymentRouteBean.java @@ -0,0 +1,180 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.StatsPaymentRouteController; +import com.arrebol.apc.controller.catalog.RouteController; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.views.StatsPaymentRouteView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author David Rodriguez + */ +@Named("statsPaymentRouteManager") +@ViewScoped +public class StatsPaymentRouteBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setPayment(fillDatatablePayment()); + setTotalValue(); + } + } catch (Exception e) { + } + } + + public BigDecimal searchTotalPaymentAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setTotalValue(); + } + } catch (Exception e) { + } + return getTotalPayment(); + } + + public StatsPaymentRouteController getPaymentCtrl() { + return paymentCtrl; + } + + public void setPaymentCtrl(StatsPaymentRouteController paymentCtrl) { + this.paymentCtrl = paymentCtrl; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List fillDatatablePayment() { + return getPaymentCtrl().fillPaymentDataTable(getStarDate(), getEndDate(), getRouteSelectedId()); + } + + public BigDecimal fillTotalPayment() { + return getPaymentCtrl().fillTotalPayment(getStarDate(), getEndDate()); + } + + public List getPayment() { + return payment; + } + + public void setPayment(List payment) { + this.payment = payment; + } + + public StatsPaymentRouteView getSelectedPayment() { + return selectedPayment; + } + + public void setSelectedPayment(StatsPaymentRouteView selectedPayment) { + this.selectedPayment = selectedPayment; + } + + public BigDecimal getTotalPayment() { + return totalPayment; + } + + public void setTotalPayment(BigDecimal totalPayment) { + this.totalPayment = totalPayment; + } + + public List getRoutes() { + return routes; + } + + public RouteController getRouteCtrl() { + return routeCtrl; + } + + public void setRouteCtrl(RouteController routeCtrl) { + this.routeCtrl = routeCtrl; + } + + public String getRouteSelectedId() { + return routeSelectedId; + } + + public void setRouteSelectedId(String routeSelectedId) { + this.routeSelectedId = routeSelectedId; + } + + private StatsPaymentRouteController paymentCtrl; + private GenericController genericCtrl; + private RouteController routeCtrl; + private List payment; + private StatsPaymentRouteView selectedPayment; + private BigDecimal totalPayment; + private List routes; + private String routeSelectedId; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initStartAndEndDates(Calendar.DAY_OF_WEEK, 2); + + paymentCtrl = new StatsPaymentRouteController(); + genericCtrl = new GenericController(); + routeCtrl = new RouteController(); + payment = fillDatatablePayment(); + setTotalValue(); + routes = routeCtrl.fillRoutesDatatable(getLoggedUser().getOffice().getId()); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + private void setTotalValue() { + if (payment != null && !payment.isEmpty()) { + setTotalPayment(payment.stream().map(StatsPaymentRouteView::getTotalPayment).reduce(BigDecimal::add).get()); + } else { + setTotalPayment(BigDecimal.ZERO); + } + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsPayrollBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsPayrollBean.java new file mode 100644 index 0000000..2e39402 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsPayrollBean.java @@ -0,0 +1,169 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.StatsPayrollController; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.views.StatsPayrollView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author David Rodriguez + */ +@Named("statsPayrollManager") +@ViewScoped +public class StatsPayrollBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setPayroll(fillDatatablePayroll()); + setTotalValue(); + } + } catch (Exception e) { + } + } + + public BigDecimal searchTotalPayrollAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setTotalValue(); + } + } catch (Exception e) { + } + return getTotalPayroll(); + } + + public StatsPayrollController getPayrollCtrl() { + return payrollCtrl; + } + + public void setPayrollCtrl(StatsPayrollController payrollCtrl) { + this.payrollCtrl = payrollCtrl; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List fillDatatablePayroll() { + return getPayrollCtrl().fillPayrollDataTable(getStarDate(), getEndDate(), getUserSelectedId()); + } + + public BigDecimal fillTotalPayroll() { + return getPayrollCtrl().fillTotalPayroll(getStarDate(), getEndDate()); + } + + public List getPayroll() { + return payroll; + } + + public void setPayroll(List payroll) { + this.payroll = payroll; + } + + public StatsPayrollView getSelectedPayroll() { + return selectedPayroll; + } + + public void setSelectedPayroll(StatsPayrollView selectedPayroll) { + this.selectedPayroll = selectedPayroll; + } + + public BigDecimal getTotalPayroll() { + return totalPayroll; + } + + public void setTotalPayroll(BigDecimal totalPayroll) { + this.totalPayroll = totalPayroll; + } + + public List getUsers() { + return genericCtrl.getAllUsersByOffice(getLoggedUser().getOffice().getId()); + } + + public String getUserSelectedId() { + return userSelectedId; + } + + public void setUserSelectedId(String userSelectedId) { + this.userSelectedId = userSelectedId; + } + + private StatsPayrollController payrollCtrl; + private GenericController genericCtrl; + private List payroll; + private StatsPayrollView selectedPayroll; + private BigDecimal totalPayroll; + private List users; + private String userSelectedId; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initStartAndEndDates(Calendar.DAY_OF_WEEK, 2); + + payrollCtrl = new StatsPayrollController(); + genericCtrl = new GenericController(); + payroll = fillDatatablePayroll(); + setTotalValue(); + users = getUsers(); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + private void setTotalValue() { + if (payroll != null && !payroll.isEmpty()) { + setTotalPayroll(payroll.stream().map(StatsPayrollView::getTotalPayroll).reduce(BigDecimal::add).get()); + } else { + setTotalPayroll(BigDecimal.ZERO); + } + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsSummaryBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsSummaryBean.java new file mode 100644 index 0000000..b3754ab --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsSummaryBean.java @@ -0,0 +1,145 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.StatsSummaryController; +import com.arrebol.apc.model.views.StatsSummaryView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author David Rodriguez + */ +@Named("statsSummaryManager") +@ViewScoped +public class StatsSummaryBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setSummary(fillDatatableSummary()); + setTotalSummary(fillTotalSummary()); + } + } catch (Exception e) { + } + } + + public BigDecimal searchTotalSummaryAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setTotalSummary(fillTotalSummary()); + } + } catch (Exception e) { + } + return getTotalSummary(); + } + + public StatsSummaryController getSummaryCtrl() { + return summaryCtrl; + } + + public void setSummaryCtrl(StatsSummaryController summaryCtrl) { + this.summaryCtrl = summaryCtrl; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List fillDatatableSummary() { + return getSummaryCtrl().fillSummaryDataTable(getStarDate(), getEndDate()); + } + + public BigDecimal fillTotalSummary() { + return getSummaryCtrl().fillTotalSummary(getStarDate(), getEndDate()); + } + + public List getSummary() { + return summary; + } + + public void setSummary(List summary) { + this.summary = summary; + } + + public StatsSummaryView getSelectedSummary() { + return selectedSummary; + } + + public void setSelectedSummary(StatsSummaryView selectedSummary) { + this.selectedSummary = selectedSummary; + } + + public BigDecimal getTotalSummary() { + return totalSummary; + } + + public void setTotalSummary(BigDecimal totalSummary) { + this.totalSummary = totalSummary; + } + + private StatsSummaryController summaryCtrl; + private GenericController genericCtrl; + private List summary; + private StatsSummaryView selectedSummary; + private BigDecimal totalSummary; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initStartAndEndDates(Calendar.DAY_OF_WEEK, 2); + + summaryCtrl = new StatsSummaryController(); + genericCtrl = new GenericController(); + summary = fillDatatableSummary(); + totalSummary = fillTotalSummary(); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsVehicleBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsVehicleBean.java new file mode 100644 index 0000000..e02eb6c --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsVehicleBean.java @@ -0,0 +1,117 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.StatsVehicleController; +import com.arrebol.apc.model.catalog.Vehicle; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.Calendar; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author David Rodriguez + */ +@Named("statsVehicleManager") +@ViewScoped +public class StatsVehicleBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setVehicle(fillDatatableVehicle()); + } + } catch (Exception e) { + } + } + + public StatsVehicleController getVehicleCtrl() { + return vehicleCtrl; + } + + public void setVehicleCtrl(StatsVehicleController gasolineCtrl) { + this.vehicleCtrl = gasolineCtrl; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List fillDatatableVehicle() { + return getVehicleCtrl().fillVehicleDataTable(getStarDate(), getEndDate()); + } + + public List getVehicle() { + return vehicle; + } + + public void setVehicle(List vehicle) { + this.vehicle = vehicle; + } + + public Vehicle getSelectedVehicle() { + return selectedVehicle; + } + + public void setSelectedVehicle(Vehicle selectedVehicle) { + this.selectedVehicle = selectedVehicle; + } + + private StatsVehicleController vehicleCtrl; + private GenericController genericCtrl; + private List vehicle; + private Vehicle selectedVehicle; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initStartAndEndDates(Calendar.DAY_OF_WEEK, 2); + + vehicleCtrl = new StatsVehicleController(); + genericCtrl = new GenericController(); + vehicle = fillDatatableVehicle(); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsZeroPaymentsBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsZeroPaymentsBean.java new file mode 100644 index 0000000..4d32c28 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/StatsZeroPaymentsBean.java @@ -0,0 +1,168 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.StatsZeroPaymentsController; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.views.StatsZeroPaymentsView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.Calendar; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author David Rodriguez + */ +@Named("statsZeroPaymentsManager") +@ViewScoped +public class StatsZeroPaymentsBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setZeroPayments(fillDatatableZeroPayments()); + setTotalValue(); + } + } catch (Exception e) { + } + } + + public int searchTotalZeroPaymentsAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setTotalValue(); + } + } catch (Exception e) { + } + return getTotalZeroPayments(); + } + + public StatsZeroPaymentsController getZeroPaymentsCtrl() { + return zeroPaymentsCtrl; + } + + public void setZeroPaymentsCtrl(StatsZeroPaymentsController zeroPaymentsCtrl) { + this.zeroPaymentsCtrl = zeroPaymentsCtrl; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List fillDatatableZeroPayments() { + return getZeroPaymentsCtrl().fillZeroPaymentsDataTable(getStarDate(), getEndDate(), getUserSelectedId()); + } + + public int fillTotalZeroPayments() { + return getZeroPaymentsCtrl().fillTotalZeroPayments(getStarDate(), getEndDate()); + } + + public List getZeroPayments() { + return zeroPayments; + } + + public void setZeroPayments(List zeroPayments) { + this.zeroPayments = zeroPayments; + } + + public StatsZeroPaymentsView getSelectedZeroPayments() { + return selectedZeroPayments; + } + + public void setSelectedZeroPayments(StatsZeroPaymentsView selectedZeroPayments) { + this.selectedZeroPayments = selectedZeroPayments; + } + + public int getTotalZeroPayments() { + return totalZeroPayments; + } + + public void setTotalZeroPayments(int totalZeroPayments) { + this.totalZeroPayments = totalZeroPayments; + } + + public List getUsers() { + return genericCtrl.getAllUsersByOffice(getLoggedUser().getOffice().getId()); + } + + public String getUserSelectedId() { + return userSelectedId; + } + + public void setUserSelectedId(String userSelectedId) { + this.userSelectedId = userSelectedId; + } + + private StatsZeroPaymentsController zeroPaymentsCtrl; + private GenericController genericCtrl; + private List zeroPayments; + private StatsZeroPaymentsView selectedZeroPayments; + private int totalZeroPayments; + private List users; + private String userSelectedId; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initStartAndEndDates(Calendar.DAY_OF_WEEK, 2); + + zeroPaymentsCtrl = new StatsZeroPaymentsController(); + genericCtrl = new GenericController(); + zeroPayments = fillDatatableZeroPayments(); + setTotalValue(); + users = getUsers(); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + private void setTotalValue() { + if (zeroPayments != null) { + setTotalZeroPayments(zeroPayments.size()); + } else { + setTotalZeroPayments(0); + } + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/TransferBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/TransferBean.java new file mode 100644 index 0000000..21e4bad --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/TransferBean.java @@ -0,0 +1,263 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.BitacoraController; +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.GenericValidationController; +import com.arrebol.apc.controller.admin.TransferController; +import com.arrebol.apc.model.admin.Transfer; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.ActionStatus; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.system.logs.Bitacora; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("transferManager") +@ViewScoped +public class TransferBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setTransfer(getTransferCtrl().fillTransferDatatable(getLoggedUser().getOffice().getId(), getStarDate(), getEndDate())); + } + } catch (Exception e) { + } + } + + public List fillDatatableTransfer() { + + return getTransferCtrl().fillTransferDatatable(getLoggedUser().getOffice().getId(), getStarDate(), getEndDate()); + } + + public List getUsers() { + + return genericCtrl.getAllUsersByOffice(getLoggedUser().getOffice().getId()); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + Date date = new Date(); + if (genericCtrl.existStableSmallBoxByCreatedOn(date)) { + showMessage(FacesMessage.SEVERITY_WARN, "Día cerrado", "No se pueden agregar más transferencias porque ya se existe un cuadre de caja chica de hoy."); + return; + } + + Transfer saveTransfer = new Transfer(); + saveTransfer.setActionStatus(ActionStatus.PENDING); + saveTransfer.setActiveStatus(ActiveStatus.ENEBLED); + saveTransfer.setOffice(new Office(getLoggedUser().getOffice().getId())); + saveTransfer.setUserReceiver(new User(userReceiveId)); + saveTransfer.setUserTransmitter(new User(userSendId)); + saveTransfer.setAmountToTransfer(new BigDecimal(amountToTransfer)); + saveTransfer.setCreatedBy(getLoggedUser().getId()); + saveTransfer.setCreatedOn(new Date()); + transferCtrl.saveTransfer(saveTransfer); + transfer.clear(); + transfer = fillDatatableTransfer(); + amountToTransfer = ""; + userReceiveId = ""; + userSendId = ""; + FacesMessage msg = new FacesMessage("Nueva transferencia", "Se agregó correctamente"); + FacesContext.getCurrentInstance().addMessage(null, msg); + } + + @Override + public void deleteRow() { + transferCtrl.updateTransferByStatus(ActiveStatus.DISABLED, selectedTransfer.getId(), getLoggedUser().getUser().getId()); + searchHistoricalAction(); + Bitacora bitacora = new Bitacora(); + bitacora.setAction("Eliminar transferencia"); + bitacora.setCommentsUser(getCommentsBitacora()); + bitacora.setCreatedBy(getLoggedUser().getUser().getId()); + bitacora.setCreatedOn(new Date()); + bitacora.setNameUser(getLoggedUser().getUser().getUserName()); + bitacora.setOffice(new Office(getLoggedUser().getOffice().getId())); + bitacora.setDescription("Se eliminó correctamente la transferencia con fecha: " + selectedTransfer.getCreatedOn() + ", con monto $" + + selectedTransfer.getAmountToTransfer()); + bitacoraCtrl.saveBitacora(bitacora); + selectedTransfer = null; + commentsBitacora = ""; + showMessage(FacesMessage.SEVERITY_INFO, "Transferencia Eliminada", "Se eliminó correctamente."); + } + + public TransferController getTransferCtrl() { + return transferCtrl; + } + + public void setTransferCtrl(TransferController transferCtrl) { + this.transferCtrl = transferCtrl; + } + + public List getTransfer() { + return transfer; + } + + public void setTransfer(List transfer) { + this.transfer = transfer; + } + + public Transfer getSelectedTransfer() { + return selectedTransfer; + } + + public void setSelectedTransfer(Transfer selectedTransfer) { + this.selectedTransfer = selectedTransfer; + } + + public List getUserSend() { + return userSend; + } + + public void setUserSend(List userSend) { + this.userSend = userSend; + } + + public List getUserReceive() { + return userReceive; + } + + public void setUserReceive(List userReceive) { + this.userReceive = userReceive; + } + + public String getUserSendId() { + return userSendId; + } + + public void setUserSendId(String userSendId) { + this.userSendId = userSendId; + } + + public String getUserReceiveId() { + return userReceiveId; + } + + public void setUserReceiveId(String userReceiveId) { + this.userReceiveId = userReceiveId; + } + + public String getAmountToTransfer() { + return amountToTransfer; + } + + public void setAmountToTransfer(String amountToTransfer) { + this.amountToTransfer = amountToTransfer; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public GenericValidationController getGenericValidateController() { + return genericValidateController; + } + + public void setGenericValidateController(GenericValidationController genericController) { + this.genericValidateController = genericController; + } + + public Date getLastStableSmallBox() { + return lastStableSmallBox; + } + + public void setLastStableSmallBox(Date lastStableSmallBox) { + this.lastStableSmallBox = lastStableSmallBox; + } + + public BitacoraController getBitacoraCtrl() { + return bitacoraCtrl; + } + + public void setBitacoraCtrl(BitacoraController bitacoraCtrl) { + this.bitacoraCtrl = bitacoraCtrl; + } + + public String getCommentsBitacora() { + return commentsBitacora; + } + + public void setCommentsBitacora(String commentsBitacora) { + this.commentsBitacora = commentsBitacora; + } + + private TransferController transferCtrl; + private GenericController genericCtrl; + private BitacoraController bitacoraCtrl; + private String commentsBitacora; + private GenericValidationController genericValidateController; + private Date lastStableSmallBox; + + private List transfer; + private List userSend; + private List userReceive; + + private String userSendId; + private String userReceiveId; + private String amountToTransfer; + + private Transfer selectedTransfer; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + + transferCtrl = new TransferController(); + genericCtrl = new GenericController(); + bitacoraCtrl = new BitacoraController(); + setGenericValidateController(new GenericValidationController()); + setLastStableSmallBox(getGenericValidateController().lastStableSmallBoxByDate(getLoggedUser().getUser())); + + initOneWeekBeforeToCurrdate(); + + transfer = fillDatatableTransfer(); + userSend = getUsers(); + userReceive = getUsers(); + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/TransferUpgradeBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/TransferUpgradeBean.java new file mode 100644 index 0000000..579ee72 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/TransferUpgradeBean.java @@ -0,0 +1,268 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.model.admin.Transfer; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.ActionStatus; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.system.logs.Bitacora; +import com.arrebol.apc.model.views.EnabledUserDetailsView; +import com.arrebol.apc.model.views.TransferView; +import com.arrebol.apc.service.BitacoraService; +import com.arrebol.apc.service.GenericValidationService; +import com.arrebol.apc.service.admin.TransferService; +import com.arrebol.apc.service.views.EnabledUserDetailsViewService; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.primefaces.model.LazyDataModel; +import org.primefaces.model.SortOrder; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Named(value = "transferUpgradeBean") +@ViewScoped +public class TransferUpgradeBean extends GenericBean implements Serializable { + + /** + * + */ + public void addRow() { + Date date = new Date(); + if (genericValidationService.existStableSmallBoxByCreatedOn(date)) { + showMessage(FacesMessage.SEVERITY_WARN, "Día cerrado", "No se pueden agregar más transferencias porque ya se existe un cuadre de caja chica de hoy."); + return; + } + + try { + Transfer saveTransfer = new Transfer(); + saveTransfer.setActionStatus(ActionStatus.PENDING); + saveTransfer.setActiveStatus(ActiveStatus.ENEBLED); + saveTransfer.setOffice(new Office(getLoggedUser().getOffice().getId())); + saveTransfer.setUserReceiver(new User(userReceiveId)); + saveTransfer.setUserTransmitter(new User(userSendId)); + saveTransfer.setAmountToTransfer(new BigDecimal(amountToTransfer)); + saveTransfer.setCreatedBy(getLoggedUser().getId()); + saveTransfer.setCreatedOn(new Date()); + transferService.saveTransfer(saveTransfer); + + setAmountToTransfer(""); + setUserReceiveId(""); + setUserSendId(""); + + showMessage(FacesMessage.SEVERITY_INFO, "Transferencia", "No se agrego correctamente la transferencia"); + } catch (Exception e) { + logger.error("addRow", e); + showMessage(FacesMessage.SEVERITY_ERROR, "Transferencia", "No se agrego correctamente la transferencia"); + } + + } + + /** + * + */ + public void deleteRow() { + try { + transferService.updateTransferByStatus(ActiveStatus.DISABLED, getSelectedTransfer().getId(), getLoggedUser().getUser().getId()); + + Bitacora bitacora = new Bitacora(); + bitacora.setAction("Eliminar transferencia"); + bitacora.setCommentsUser(getCommentsBitacora()); + bitacora.setCreatedBy(getLoggedUser().getUser().getId()); + bitacora.setCreatedOn(new Date()); + bitacora.setNameUser(getLoggedUser().getUser().getUserName()); + bitacora.setOffice(new Office(getLoggedUser().getOffice().getId())); + bitacora.setDescription("Se eliminó correctamente la transferencia con fecha: " + getSelectedTransfer().getStrCreatedOn() + ", con monto $" + + selectedTransfer.getAmountToTransfer()); + bitacoraService.saveBitacora(bitacora); + setSelectedTransfer(null); + setCommentsBitacora(""); + showMessage(FacesMessage.SEVERITY_INFO, "Transferencia", "Se eliminó correctamente la transferencia"); + } catch (Exception e) { + logger.error("deleteRow", e); + showMessage(FacesMessage.SEVERITY_ERROR, "Transferencia", "No se eliminó correctamente la transferencia"); + } + + } + + /** + * + */ + private void loadingLazyDataTable() { + try { + setTransfers(new LazyDataModel() { + private List lazyEntityList; + + @Override + public List load(int first, int pageSize, String sortField, SortOrder sortOrder, Map filterBy) { + try { + Long total = transferService.countPaginator(filterBy, getLoggedUser().getOffice().getId(), getStarDate(), getEndDate()); + + setRowCount(total.intValue()); + + lazyEntityList = transferService.lazyEntityListPaginator(first, pageSize, sortField, sortOrder, filterBy, getLoggedUser().getOffice().getId(), getStarDate(), getEndDate()); + + return lazyEntityList; + } catch (Exception e) { + logger.error("lazy Entity List", e); + setRowCount(0); + return new ArrayList<>(); + } + } + + @Override + public String getRowKey(TransferView row) { + return row.getId(); + } + + @Override + public TransferView getRowData(String rowKey) { + return lazyEntityList + .stream() + .filter(row -> rowKey.equals(row.getId())) + .findFirst() + .orElse(null); + } + } + ); + } catch (Exception e) { + logger.error("Lazy Data Model Customer View ", e); + } + } + + /** + * + */ + private void fillUsersComboBoxes() { + setUserSend(enabledUserDetailsViewService.findEnabledUsersByOffice(getLoggedUser().getOffice().getId())); + setUserReceive(getUserSend()); + } + + @PostConstruct + public void init() { + try { + loadBundlePropertyFile(); + initOneWeekBeforeToCurrdate(); + setLastStableSmallBox(genericValidationService.lastStableSmallBoxByDate(getLoggedUser().getUser())); + loadingLazyDataTable(); + fillUsersComboBoxes(); + } catch (Exception e) { + logger.error("TransferUpgradeBean init", e); + } + } + + final Logger logger = LogManager.getLogger(getClass()); + + @Inject + private TransferService transferService; + @Inject + private GenericValidationService genericValidationService; + @Inject + private BitacoraService bitacoraService; + @Inject + private EnabledUserDetailsViewService enabledUserDetailsViewService; + + private Date lastStableSmallBox; + private LazyDataModel transfers; + private TransferView selectedTransfer; + private String commentsBitacora; + private List userSend; + private List userReceive; + private String userSendId; + private String userReceiveId; + private String amountToTransfer; + + public Date getLastStableSmallBox() { + return lastStableSmallBox; + } + + public void setLastStableSmallBox(Date lastStableSmallBox) { + this.lastStableSmallBox = lastStableSmallBox; + } + + public LazyDataModel getTransfers() { + return transfers; + } + + public void setTransfers(LazyDataModel transfers) { + this.transfers = transfers; + } + + public TransferView getSelectedTransfer() { + return selectedTransfer; + } + + public void setSelectedTransfer(TransferView selectedTransfer) { + this.selectedTransfer = selectedTransfer; + } + + public String getCommentsBitacora() { + return commentsBitacora; + } + + public void setCommentsBitacora(String commentsBitacora) { + this.commentsBitacora = commentsBitacora; + } + + public List getUserSend() { + return userSend; + } + + public void setUserSend(List userSend) { + this.userSend = userSend; + } + + public List getUserReceive() { + return userReceive; + } + + public void setUserReceive(List userReceive) { + this.userReceive = userReceive; + } + + public String getUserSendId() { + return userSendId; + } + + public void setUserSendId(String userSendId) { + this.userSendId = userSendId; + } + + public String getUserReceiveId() { + return userReceiveId; + } + + public void setUserReceiveId(String userReceiveId) { + this.userReceiveId = userReceiveId; + } + + public String getAmountToTransfer() { + return amountToTransfer; + } + + public void setAmountToTransfer(String amountToTransfer) { + this.amountToTransfer = amountToTransfer; + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/VehicleBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/VehicleBean.java new file mode 100644 index 0000000..c69daed --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/VehicleBean.java @@ -0,0 +1,613 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin; + +import com.arrebol.apc.controller.admin.VehicleController; +import com.arrebol.apc.web.beans.system.employee.*; +import com.arrebol.apc.model.admin.Bonus; +import com.arrebol.apc.model.catalog.RoleCtlg; +import com.arrebol.apc.model.catalog.Vehicle; +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.HumanResourceStatus; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Named +@ViewScoped +public class VehicleBean extends GenericBean implements Serializable { + + public void saveVehicleRow() { + logger.debug("saveVehicle"); + try { + getSaveVehicle().setCreatedBy(getLoggedUser().getUser().getId()); + getSaveVehicle().setCreatedOn(new Date()); + getSaveVehicle().setVehicleStatus(ActiveStatus.ENEBLED); + getSaveVehicle().setIdDriver(getUpdateId()); + + String messafeFormat = getBundlePropertyFile().getString("message.format.failure"); + FacesMessage.Severity severity = FacesMessage.SEVERITY_WARN; + + if (getController().saveVehicle(getSaveVehicle())) { + setSaveVehicle(new Vehicle()); + + messafeFormat = getBundlePropertyFile().getString("message.format.sucess"); + severity = FacesMessage.SEVERITY_INFO; + + refreshDropBox(); + } + Object[] param = {"Vehicle", getBundlePropertyFile().getString("created")}; + + buildAndSendMessage(param, messafeFormat, severity, "Vehicle"); + } catch (Exception e) { + logger.error("saveVehicle", e); + Object[] param = {getBundlePropertyFile().getString("created")}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + "Vehicle" + ); + } + } + + /** + * + * @param action 1 = TO DISABLED, 2 = TO ENEBLED, 3 = TO DELETED, 4 NOT + * ALLOWED + */ + public void actionDropBox(int action) { + logger.debug("actionDropBox"); + try { + String messageTitle = getBundlePropertyFile().getString("employee"); + String actionUserIdSelected = null; + String messageAction = null; + + HumanResourceStatus status = null; + + switch (action) { + case 1: + actionUserIdSelected = getEnebledId(); + messageAction = getBundlePropertyFile().getString("disabled"); + status = HumanResourceStatus.DISABLED; + break; + case 2: + actionUserIdSelected = getDisabledId(); + messageAction = getBundlePropertyFile().getString("enebled"); + status = HumanResourceStatus.ENEBLED; + break; + case 3: + actionUserIdSelected = getDeletedId(); + messageAction = getBundlePropertyFile().getString("deleted"); + status = HumanResourceStatus.DELETED; + break; + default: + throw new Exception(action + " is NOT valid a option"); + } + + if (executeAction(status, actionUserIdSelected, messageTitle, messageAction)) { + refreshDropBox(); + } + } catch (Exception e) { + logger.error("actionDropBox", e); + Object[] param = {getBundlePropertyFile().getString("employee")}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + getBundlePropertyFile().getString("process") + ); + } + } + + public void updateSlctBtnHRAction() { +// logger.debug("updateHR"); +// try { +// getUpdateHumanResource().setLastUpdatedBy(getLoggedUser().getUser().getId()); +// getUpdateHumanResource().setLastUpdatedOn(new Date()); +// getUpdateHumanResource().setRoleCtlg(new RoleCtlg(roleUpdate)); +// +// if (getUpdateHumanResource().getEmployeeSaving() == null) { +// getUpdateHumanResource().setEmployeeSaving(BigDecimal.ZERO); +// } +// +// String messafeFormat = getBundlePropertyFile().getString("message.format.failure"); +// FacesMessage.Severity severity = FacesMessage.SEVERITY_WARN; +// +// if (null != getBonusId() && getBonusId().length() == 36) { +// getUpdateHumanResource().setBonus(new Bonus(getBonusId())); +// } +// +// if (getController().updateByHumanResourceId(getUpdateHumanResource(), false)) { +// messafeFormat = getBundlePropertyFile().getString("message.format.sucess"); +// severity = FacesMessage.SEVERITY_INFO; +// } +// +// Object[] param = {getBundlePropertyFile().getString("employee"), getBundlePropertyFile().getString("updated")}; +// +// buildAndSendMessage(param, messafeFormat, severity, getBundlePropertyFile().getString("employee")); +// } catch (Exception e) { +// logger.error("updateSlctBtnHRActionListener", e); +// Object[] param = {getBundlePropertyFile().getString("updated")}; +// +// buildAndSendMessage( +// param, +// getBundlePropertyFile().getString("message.format.fatal"), +// FacesMessage.SEVERITY_FATAL, +// getBundlePropertyFile().getString("employee") +// ); +// } + } + + public void loadVehicleToUpdate() { +// try { +// setUpdateHumanResource(getController().findHumanResourceById(getUpdateId())); +// setRoleUpdate(getUpdateHumanResource().getBonus().getId()); +// updateBonusId = getRoleUpdate(); +// } catch (Exception e) { +// logger.error("updateSlctBtnHRActionListener", e); +// Object[] param = {getBundlePropertyFile().getString("searching")}; +// +// buildAndSendMessage( +// param, +// getBundlePropertyFile().getString("message.format.fatal"), +// FacesMessage.SEVERITY_FATAL, +// getBundlePropertyFile().getString("employee") +// ); +// } + } + + /** + * + * @param option 1 = to disabled, 2 = to enebled, 4 = to updated + */ + public void enebledDisabledDropBoxListener(int option) { +// logger.debug("enebledDisabledDropBoxListener"); +// try { +// HumanResourceStatus status = HumanResourceStatus.ENEBLED; +// +// boolean goAHead = false; +// +// switch (option) { +// case 1: +// if (isEnebledHR()) { +// goAHead = isEnebledHR(); +// } else { +// setEnebledHumanResourcesLst(null); +// } +// break; +// case 2: +// if (isDisabledHR()) { +// goAHead = isDisabledHR(); +// } else { +// setDeletedHumanResourcesLst(null); +// } +// break; +// case 4: +// if (isSelectedUpdateHR()) { +// goAHead = isSelectedUpdateHR(); +// } else { +// setUpdateHumanResourcesLst(null); +// setUpdateVehicle(new Vehicle()); +// } +// break; +// } +// +// if (goAHead) { +// if (2 == option) { +// status = HumanResourceStatus.DISABLED; +// } +// +// List results = getController().findEmployeesByType( +// new Office(getLoggedUser().getOffice().getId()), +// status, +// getLoggedUser().getUser().getHumanResource().getId() +// ); +// +// switch (option) { +// case 1: +// setEnebledHumanResourcesLst(results); +// break; +// case 2: +// setDisabledHumanResourcesLst(results); +// break; +// case 4: +// setUpdateHumanResourcesLst(results); +// setUpdateHumanResource(new HumanResource()); +// break; +// } +// } +// } catch (Exception e) { +// logger.error("enebledDisabledDropBoxListener"); +// +// Object[] param = {getBundlePropertyFile().getString("searching")}; +// +// buildAndSendMessage( +// param, +// getBundlePropertyFile().getString("message.format.fatal"), +// FacesMessage.SEVERITY_FATAL, +// getBundlePropertyFile().getString("employee") +// ); +// } + } + + public void deletedHRListener() { +// try { +// if (isDeletedHR()) { +// List statusLst = new ArrayList<>(); +// +// statusLst.add(HumanResourceStatus.ENEBLED); +// statusLst.add(HumanResourceStatus.DISABLED); +// +// setDeletedHumanResourcesLst( +// getController().findEmployeesInType( +// new Office(getLoggedUser().getOffice().getId()), +// statusLst, +// getLoggedUser().getUser().getHumanResource().getId() +// ) +// ); +// } else { +// setDeletedHumanResourcesLst(null); +// } +// } catch (Exception e) { +// logger.error("deletedHRListener", e); +// Object[] param = {getBundlePropertyFile().getString("searching")}; +// +// buildAndSendMessage( +// param, +// getBundlePropertyFile().getString("message.format.fatal"), +// FacesMessage.SEVERITY_FATAL, +// getBundlePropertyFile().getString("employee") +// ); +// } + } + + /** + * + * @param status + * @param userIdSelected + * @param msgTitle + * @param msgAction + */ + private boolean executeAction(HumanResourceStatus status, String userIdSelected, String msgTitle, String msgAction) { + logger.debug("executeAction"); + + boolean success = false; + + try { + String messafeFormat = getBundlePropertyFile().getString("message.format.failure"); + FacesMessage.Severity severity = FacesMessage.SEVERITY_WARN; + + success = getController().updateHRByStatus(status, userIdSelected, getLoggedUser().getUser().getId()); + + if (success) { + logger.debug("executeAction"); + + messafeFormat = getBundlePropertyFile().getString("message.format.sucess"); + severity = FacesMessage.SEVERITY_INFO; + } + + Object[] param = {msgTitle, msgAction}; + + buildAndSendMessage(param, messafeFormat, severity, msgTitle); + } catch (Exception e) { + logger.error("executeAction", e); + Object[] param = {msgTitle}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + msgTitle + ); + } + return success; + } + + private void refreshDropBox() { + try { + if (isEnebledHR()) { + enebledDisabledDropBoxListener(1); + } + if (isDisabledHR()) { + enebledDisabledDropBoxListener(2); + } + + if (isDeletedHR()) { + deletedHRListener(); + } + + if (isSelectedUpdateVehicle()) { + enebledDisabledDropBoxListener(4); + } + } catch (Exception e) { + logger.error("executeAction", e); + } + } + + private static final long serialVersionUID = 2969985354193657703L; + final Logger logger = LogManager.getLogger(EmployeeBean.class); + + private VehicleController controller; + + private Vehicle saveVehicle; + private Vehicle updateVehicle; + + private String role; + private List roles; + + private boolean selectedUpdateVehicle; + private String updateId; + + private String roleUpdate; + private List updateHumanResourcesLst; + private List typeLst; + + private boolean enebledHR; + private String enebledId; + private List enebledHumanResourcesLst; + + private boolean disabledHR; + private String disabledId; + private List disabledHumanResourcesLst; + + private boolean deletedHR; + private String deletedId; + private List deletedHumanResourcesLst; + + private String bonusId; + private List bonuses; + private String updateBonusId; + + private List vehicleType; + + @PostConstruct() + public void init() { + try { + loadBundlePropertyFile(); + setController(new VehicleController()); + setSaveVehicle(new Vehicle()); + setUpdateVehicle(new Vehicle()); + + List results = getController().findEmployeesByType( + new Office(getLoggedUser().getOffice().getId()), + HumanResourceStatus.ENEBLED, + getLoggedUser().getUser().getHumanResource().getId() + ); + + setUpdateHumanResourcesLst(results); + + vehicleType = new ArrayList<>(); + vehicleType.add("Automóvil"); + vehicleType.add("Motocicleta"); + } catch (Exception e) { + logger.error("init", e); + } + } + + @PreDestroy + public void finish() { + try { + setSaveVehicle(new Vehicle()); + setUpdateVehicle(new Vehicle()); + setController(null); + } catch (Exception e) { + logger.error("finish", e); + } + } + + public VehicleController getController() { + return controller; + } + + public void setController(VehicleController controller) { + this.controller = controller; + } + + public Vehicle getSaveVehicle() { + return saveVehicle; + } + + public void setSaveVehicle(Vehicle saveVehicle) { + this.saveVehicle = saveVehicle; + } + + public Vehicle getUpdateVehicle() { + return updateVehicle; + } + + public void setUpdateVehicle(Vehicle updateVehicle) { + this.updateVehicle = updateVehicle; + } + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + public List getRoles() { + if (null == roles) { + /* + roles = Stream.of( + HumanResourceType.values()) + .map(Enum::name) + .collect(Collectors.toList() + ); + */ + } + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } + + public boolean isSelectedUpdateVehicle() { + return selectedUpdateVehicle; + } + + public void setSelectedUpdateVehicle(boolean selectedUpdateVehicle) { + this.selectedUpdateVehicle = selectedUpdateVehicle; + } + + public String getUpdateId() { + return updateId; + } + + public void setUpdateId(String updateId) { + this.updateId = updateId; + } + + public String getRoleUpdate() { + return roleUpdate; + } + + public void setRoleUpdate(String roleUpdate) { + this.roleUpdate = roleUpdate; + } + + public List getUpdateHumanResourcesLst() { + return updateHumanResourcesLst; + } + + public void setUpdateHumanResourcesLst(List updateHumanResourcesLst) { + this.updateHumanResourcesLst = updateHumanResourcesLst; + } + + public List getTypeLst() { + return typeLst; + } + + public void setTypeLst(List typeLst) { + this.typeLst = typeLst; + } + + public boolean isEnebledHR() { + return enebledHR; + } + + public void setEnebledHR(boolean enebledHR) { + this.enebledHR = enebledHR; + } + + public String getEnebledId() { + return enebledId; + } + + public void setEnebledId(String enebledId) { + this.enebledId = enebledId; + } + + public List getEnebledHumanResourcesLst() { + return enebledHumanResourcesLst; + } + + public void setEnebledHumanResourcesLst(List enebledHumanResourcesLst) { + this.enebledHumanResourcesLst = enebledHumanResourcesLst; + } + + public boolean isDisabledHR() { + return disabledHR; + } + + public void setDisabledHR(boolean disabledHR) { + this.disabledHR = disabledHR; + } + + public String getDisabledId() { + return disabledId; + } + + public void setDisabledId(String disabledId) { + this.disabledId = disabledId; + } + + public List getDisabledHumanResourcesLst() { + return disabledHumanResourcesLst; + } + + public void setDisabledHumanResourcesLst(List disabledHumanResourcesLst) { + this.disabledHumanResourcesLst = disabledHumanResourcesLst; + } + + public boolean isDeletedHR() { + return deletedHR; + } + + public void setDeletedHR(boolean deletedHR) { + this.deletedHR = deletedHR; + } + + public String getDeletedId() { + return deletedId; + } + + public void setDeletedId(String deletedId) { + this.deletedId = deletedId; + } + + public List getDeletedHumanResourcesLst() { + return deletedHumanResourcesLst; + } + + public void setDeletedHumanResourcesLst(List deletedHumanResourcesLst) { + this.deletedHumanResourcesLst = deletedHumanResourcesLst; + } + + public String getBonusId() { + return bonusId; + } + + public void setBonusId(String bonusId) { + this.bonusId = bonusId; + } + + public List getBonuses() { + return bonuses; + } + + public void setBonuses(List bonuses) { + this.bonuses = bonuses; + } + + public String getUpdateBonusId() { + return updateBonusId; + } + + public void setUpdateBonusId(String updateBonusId) { + this.updateBonusId = updateBonusId; + } + + public List getVehicleType() { + return vehicleType; + } + + public void setVehicleType(List vehicleType) { + this.vehicleType = vehicleType; + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/people/PersonCustomerBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/people/PersonCustomerBean.java new file mode 100644 index 0000000..26f8fc1 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/admin/people/PersonCustomerBean.java @@ -0,0 +1,795 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.admin.people; + +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.PeopleController; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.CustomerClassification; +import com.arrebol.apc.model.enums.LoanDetailsType; +import com.arrebol.apc.model.enums.LoanStatus; +import com.arrebol.apc.model.enums.OwnerLoan; +import com.arrebol.apc.model.enums.PeopleType; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.loan.LoanByUser; +import com.arrebol.apc.model.loan.LoanByUserId; +import com.arrebol.apc.model.loan.LoanDetails; +import com.arrebol.apc.model.loan.LoanType; +import com.arrebol.apc.model.system.logs.Bitacora; +import com.arrebol.apc.model.views.CustomerView; +import com.arrebol.apc.service.BitacoraService; +import com.arrebol.apc.service.admin.CustomerService; +import com.arrebol.apc.service.admin.PeopleService; +import com.arrebol.apc.service.catalog.LoanService; +import com.arrebol.apc.service.catalog.LoanTypeService; +import com.arrebol.apc.service.catalog.PeopleAutoCompleteService; +import com.arrebol.apc.service.catalog.RouteService; +import com.arrebol.apc.service.core.UserService; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.Map; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.primefaces.model.LazyDataModel; +import org.primefaces.model.SortOrder; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Named(value = "personCustomerBean") +@ViewScoped +public class PersonCustomerBean extends GenericBean implements Serializable { + + /** + * + * @param query + * @return + */ + public List completeCustomer(String query) { + return peopleAutoCompleteService.findCustomersLike(query.trim()); + } + + /** + * + * @param query + * @return + */ + public List completeEndorsement(String query) { + return peopleAutoCompleteService.findEndorsementsLike(query.trim()); + } + + /** + * + */ + public void changeRoute() { + if (!getRouteId().isEmpty()) { + if (customerService.updateRouteById(new RouteCtlg(getRouteId()), getSelectedCustomerView().getId(), getLoggedUser().getUser().getId())) { + showMessage(FacesMessage.SEVERITY_INFO, "Cliente", "Se modificó la ruta del cliente correctamente."); + } else { + showMessage(FacesMessage.SEVERITY_WARN, "Cliente", "Ocurrió un error durante el proceso de modificacipon de la ruta del cliente."); + } + } + } + + /** + * + */ + public void deleteRow() { + try { + customerService.updatePeopleByStatus(ActiveStatus.DISABLED, getSelectedCustomerView().getId(), getLoggedUser().getUser().getId()); + + setSelectedCustomerView(null); + showMessage(FacesMessage.SEVERITY_INFO, "Cliente", "Se eliminó correctamente."); + } catch (Exception e) { + showMessage(FacesMessage.SEVERITY_ERROR, "Cliente", "No se eliminó correctamente."); + } + } + + /** + * + */ + public void updatePeopleTypeById() { + if (getSelectedCustomerView().getPeopleType().equals(PeopleType.BOTH)) { + showMessage(FacesMessage.SEVERITY_WARN, "Advertencia", "El cliente ya se encuentra como Aval."); + return; + } + try { + customerService.updatePeopleTypeById(PeopleType.BOTH, getSelectedCustomerView().getId(), getLoggedUser().getUser().getId()); + setSelectedCustomerView(null); + // TODO cargar de nuevo el lazy data model para poder actualizar la datatable + showMessage(FacesMessage.SEVERITY_INFO, "Cliente", "Se modificó correctamente."); + } catch (Exception e) { + logger.error("updatePeopleTypeById", e); + showMessage(FacesMessage.SEVERITY_INFO, "Cliente", "No se modificó correctamente."); + } + } + + /** + * + * @param outcome + * @return + */ + public String detailCustomer(String outcome) { + return outcome; + } + + /** + * + */ + public void calculationFunction() { + if (loanTypeId != null && !loanTypeId.isEmpty()) { + total = loanTypeService.getLoanTypeById(loanTypeId).getPaymentTotal().add(totalFee).subtract(totalPayment); + } else { + total = BigDecimal.ZERO; + } + } + + /** + * + */ + public void addRow() { + try { + Loan loanSave = new Loan(); + loanSave.setComments(getComments()); + loanSave.setCustomer(getAutoCompleteCustomer()); + loanSave.setEndorsement(getAutoCompleteEndorsement()); + loanSave.setLoanType(new LoanType(getLoanTypeId())); + if (isAprobado()) { + loanSave.setLoanStatus(LoanStatus.APPROVED); + } else if (isTerminado()) { + loanSave.setLoanStatus(LoanStatus.FINISH); + } else { + loanSave.setLoanStatus(LoanStatus.PENDING); + } + loanSave.setAmountPaid(getTotalPayment()); + loanSave.setRouteCtlg(peopleService.findPeopleById(getAutoCompleteCustomer().getId()).getRouteCtlg()); + if (getTotalPayment().compareTo(BigDecimal.ZERO) == 0 && getTotalFee().compareTo(BigDecimal.ZERO) == 0) { + loanSave.setLastReferenceNumber(0); + } + if (getTotalPayment().compareTo(BigDecimal.ZERO) > 0 && getTotalFee().compareTo(BigDecimal.ZERO) == 0) { + loanSave.setLastReferenceNumber(1); + } + if (getTotalPayment().compareTo(BigDecimal.ZERO) == 0 && getTotalFee().compareTo(BigDecimal.ZERO) > 0) { + loanSave.setLastReferenceNumber(1); + } + if (getTotalPayment().compareTo(BigDecimal.ZERO) > 0 && getTotalFee().compareTo(BigDecimal.ZERO) > 0) { + loanSave.setLastReferenceNumber(2); + } + loanSave.setAmountToPay(loanTypeService.getLoanTypeById(getLoanTypeId()).getPaymentTotal().add(getTotalFee())); + loanSave.setCreatedBy(getUserId()); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(getCreatedOn()); + calendar.set(Calendar.HOUR_OF_DAY, 12); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + loanSave.setCreatedOn(new Date()); + loanSave.setLastUpdatedOn(new Date()); + + if (loanService.saveLoan(loanSave)) { + Loan temp = loanService.getLoanById(loanSave.getId()); + String userName = ""; + for (User user : getUsers()) { + if (user.getId().equalsIgnoreCase(getUserId())) { + userName = user.getHumanResource().getFirstName() + " " + + user.getHumanResource().getLastName(); + break; + } + } + Calendar fechaAct = Calendar.getInstance(); + if (fechaAct.before(calendar)) { + Bitacora bitacora = new Bitacora(); + bitacora.setAction("Préstamo postfechado"); + bitacora.setCommentsUser(""); + bitacora.setCreatedBy(getLoggedUser().getUser().getId()); + bitacora.setCreatedOn(new Date()); + bitacora.setDescription("El usuario " + userName + " postfechó el préstamo del cliente " + temp.getCustomer().getFullName() + + ", con cantidad de $" + temp.getLoanType().getPayment() + " al día " + temp.getCreatedOn()); + bitacora.setNameUser(getLoggedUser().getUser().getUserName()); + bitacora.setOffice(new Office(getLoggedUser().getOffice().getId())); + bitacoraService.saveBitacora(bitacora); + } + + LoanByUser loanByUser = new LoanByUser(); + LoanByUserId idRelation = new LoanByUserId(); + + idRelation.setIdLoan(loanSave.getId()); + idRelation.setIdUser(getUserId()); + + loanByUser.setId(idRelation); + loanByUser.setComments(getComments()); + loanByUser.setCreatedBy(getLoggedUser().getUser().getId()); + if (isAprobado()) { + loanByUser.setLoanByUserStatus(LoanStatus.APPROVED); + } else if (isTerminado()) { + loanByUser.setLoanByUserStatus(LoanStatus.FINISH); + } else { + loanByUser.setLoanByUserStatus(LoanStatus.PENDING); + } + loanByUser.setLoan(loanSave); + loanByUser.setOrderInList(0); + loanByUser.setOwnerLoan(OwnerLoan.CURRENT_OWNER); + loanByUser.setUser(new User(getUserId())); + loanService.saveLoanByUser(loanByUser); + + int contador = 1; + if (getTotalPayment().compareTo(BigDecimal.ZERO) > 0) { + LoanDetails detail = new LoanDetails(); + detail.setComments(getComments()); + detail.setCreatedBy(getLoggedUser().getUser().getId()); + detail.setCreatedOn(getCreatedOn()); + detail.setLoan(loanSave); + detail.setLoanDetailsType(LoanDetailsType.PAYMENT); + detail.setPaymentAmount(getTotalPayment()); + detail.setPeopleType(PeopleType.CUSTOMER); + detail.setReferenceNumber(contador); + detail.setUser(new User(getUserId())); + if (loanService.saveLoanDetail(detail)) { + contador++; + } + } + if (getTotalFee().compareTo(BigDecimal.ZERO) > 0) { + LoanDetails detail = new LoanDetails(); + detail.setComments(getComments()); + detail.setCreatedBy(getLoggedUser().getUser().getId()); + detail.setCreatedOn(getCreatedOn()); + detail.setLoan(loanSave); + detail.setLoanDetailsType(LoanDetailsType.FEE); + detail.setPaymentAmount(getTotalFee()); + detail.setPeopleType(PeopleType.CUSTOMER); + detail.setReferenceNumber(contador); + detail.setUser(new User(getUserId())); + if (loanService.saveLoanDetail(detail)) { + contador++; + } + } + + } + //loan.clear(); + setCreatedOn(new Date()); + setComments(""); + //customerId = ""; + //endorsementId = ""; + setLoanTypeId(""); + setUserId(""); + setTotal(BigDecimal.ZERO); + setTotalFee(BigDecimal.ZERO); + setTotalPayment(BigDecimal.ZERO); + setAprobado(false); + setTerminado(false); + setAutoCompleteCustomer(null); + setAutoCompleteEndorsement(null); + //loan = fillDatatableLoan(); + showMessage(FacesMessage.SEVERITY_INFO, "Cliente", "Se agrego el prestamo al cliente correctamente."); + } catch (Exception e) { + logger.error("", e); + + showMessage(FacesMessage.SEVERITY_INFO, "Cliente", "No se agrego el nuevo prestamos al cliente."); + } + } + + /** + * + */ + public void addPeople() { + try { + logger.debug("addPeople"); + getSavePeople().setOffice(new Office(getLoggedUser().getOffice().getId())); + getSavePeople().setActiveStatus(ActiveStatus.ENEBLED); + getSavePeople().setRouteCtlg(new RouteCtlg(routeId)); + getSavePeople().setLetraCuenta(""); + getSavePeople().setThumbnail(""); + getSavePeople().setClassification(CustomerClassification.WHITE); + getSavePeople().setDatosCreditoVendedor(userVId); + getSavePeople().setDatosCreditoAsignado(userAId); + getSavePeople().setDatosCreditoInvestigador(userIId); + + if (isCustomer() == true && isEndorsement() == false) { + getSavePeople().setPeopleType(PeopleType.CUSTOMER); + } + if (isCustomer() == true && isEndorsement() == true) { + getSavePeople().setPeopleType(PeopleType.BOTH); + } + if (isCustomer() == false && isEndorsement() == true) { + getSavePeople().setPeopleType(PeopleType.ENDORSEMENT); + } + if (isCustomer() == false && isEndorsement() == false) { + getSavePeople().setPeopleType(PeopleType.BOTH); + } + + String messafeFormat = getBundlePropertyFile().getString("message.format.failure"); + FacesMessage.Severity severity = FacesMessage.SEVERITY_WARN; + + if (getSavePeople().getId() != null) { + getSavePeople().setLastUpdatedBy(getLoggedUser().getUser().getId()); + getSavePeople().setLastUpdatedOn(new Date()); + if (getPeopleCtrl().updateByPeopleId(getSavePeople())) { + messafeFormat = "Datos actualizados"; + severity = FacesMessage.SEVERITY_INFO; + } + } else { + getSavePeople().setCreatedBy(getLoggedUser().getUser().getId()); + getSavePeople().setCreatedOn(new Date()); + if (getPeopleCtrl().savePeople(getSavePeople())) { + messafeFormat = getBundlePropertyFile().getString("message.format.sucess"); + severity = FacesMessage.SEVERITY_INFO; + } + } + + Object[] param = {getBundlePropertyFile().getString("people"), getBundlePropertyFile().getString("created")}; + + buildAndSendMessage(param, messafeFormat, severity, getBundlePropertyFile().getString("people")); + } catch (Exception e) { + logger.error("savePeople", e); + Object[] param = {getBundlePropertyFile().getString("created")}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + getBundlePropertyFile().getString("people") + ); + } + } + + public void limpiarForm() { + setSavePeople(new People()); + setCustomer(false); + setEndorsement(false); + } + + /** + * + */ + private void loadingLazyDataTable() { + try { + setCustomerViews(new LazyDataModel() { + private List lazyEntityList; + + @Override + public List load(int first, int pageSize, String sortField, SortOrder sortOrder, Map filterBy) { + try { + Long total = customerService.countPaginator(filterBy); + + setRowCount(total.intValue()); + + lazyEntityList = customerService.lazyEntityListPaginator(first, pageSize, sortField, sortOrder, filterBy); + + return lazyEntityList; + } catch (Exception e) { + logger.error("lazy Entity List", e); + setRowCount(0); + return new ArrayList<>(); + } + } + + @Override + public String getRowKey(CustomerView row) { + return row.getId(); + } + + @Override + public CustomerView getRowData(String rowKey) { + return lazyEntityList + .stream() + .filter(row -> rowKey.equals(row.getId())) + .findFirst() + .orElse(null); + } + } + ); + } catch (Exception e) { + logger.error("Lazy Data Model Customer View ", e); + } + } + + public void CustomerClassification(String colorClassification) { + try { + customerService.updatePeopleByClassification(CustomerClassification.valueOf(colorClassification), getSelectedCustomerView().getId(), getLoggedUser().getUser().getId()); + + setSelectedCustomerView(null); + showMessage(FacesMessage.SEVERITY_INFO, "Cliente", "Se clasificó correctamente."); + } catch (Exception e) { + showMessage(FacesMessage.SEVERITY_ERROR, "Cliente", "No se clasificó correctamente."); + } + } + + @PostConstruct + public void init() { + try { + loadBundlePropertyFile(); + loadingLazyDataTable(); + genericCtrl = new GenericController(); + peopleCtrl = new PeopleController(); + setRoutes(routeService.fillRoutesDatatable(getLoggedUser().getOffice().getId())); + setLoanType(loanTypeService.fillLoanTypeDatatable(getLoggedUser().getOffice().getId())); + setUsers(userService.getAllUsersByOffice(getLoggedUser().getOffice().getId())); + user = genericCtrl.getAllUsersByOffice(getLoggedUser().getOffice().getId()); + setTotalPayment(BigDecimal.ZERO); + setTotalFee(BigDecimal.ZERO); + setTotal(BigDecimal.ZERO); + setSavePeople(new People()); + } catch (Exception e) { + logger.error("PersonCustomerBean init", e); + } + } + + final Logger logger = LogManager.getLogger(getClass()); + + @Inject + private CustomerService customerService; + @Inject + private PeopleService peopleService; + @Inject + private RouteService routeService; + @Inject + private LoanTypeService loanTypeService; + @Inject + private LoanService loanService; + @Inject + private BitacoraService bitacoraService; + @Inject + private UserService userService; + @Inject + private PeopleAutoCompleteService peopleAutoCompleteService; + + private LazyDataModel customerViews; + private CustomerView selectedCustomerView; + private GenericController genericCtrl; + private PeopleController peopleCtrl; + private List customers; + private List routes; + private String routeId; + private String comments; + + private People autoCompleteCustomer; + private People autoCompleteEndorsement; + private People savePeople; + private List loanType; + private List users; + + private String customerId; + private String endorsementId; + private String loanTypeId; + private String userId; + + private Date createdOn; + private BigDecimal totalPayment; + private BigDecimal totalFee; + private BigDecimal total; + private boolean aprobado; + private boolean terminado; + boolean customer; + boolean endorsement; + + private List user; + String userVId; + String userIId; + String userAId; + String routeLetra; + + public PeopleController getPeopleCtrl() { + return peopleCtrl; + } + + public void setPeopleCtrl(PeopleController peopleCtrl) { + this.peopleCtrl = peopleCtrl; + } + + public CustomerService getCustomerService() { + return customerService; + } + + public void setCustomerService(CustomerService customerService) { + this.customerService = customerService; + } + + public PeopleService getPeopleService() { + return peopleService; + } + + public void setPeopleService(PeopleService peopleService) { + this.peopleService = peopleService; + } + + public RouteService getRouteService() { + return routeService; + } + + public void setRouteService(RouteService routeService) { + this.routeService = routeService; + } + + public LoanTypeService getLoanTypeService() { + return loanTypeService; + } + + public void setLoanTypeService(LoanTypeService loanTypeService) { + this.loanTypeService = loanTypeService; + } + + public LoanService getLoanService() { + return loanService; + } + + public void setLoanService(LoanService loanService) { + this.loanService = loanService; + } + + public BitacoraService getBitacoraService() { + return bitacoraService; + } + + public void setBitacoraService(BitacoraService bitacoraService) { + this.bitacoraService = bitacoraService; + } + + public UserService getUserService() { + return userService; + } + + public void setUserService(UserService userService) { + this.userService = userService; + } + + public PeopleAutoCompleteService getPeopleAutoCompleteService() { + return peopleAutoCompleteService; + } + + public void setPeopleAutoCompleteService(PeopleAutoCompleteService peopleAutoCompleteService) { + this.peopleAutoCompleteService = peopleAutoCompleteService; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public List getUser() { + return user; + } + + public void setUser(List user) { + this.user = user; + } + + public String getUserVId() { + return userVId; + } + + public void setUserVId(String userVId) { + this.userVId = userVId; + } + + public String getUserIId() { + return userIId; + } + + public void setUserIId(String userIId) { + this.userIId = userIId; + } + + public String getUserAId() { + return userAId; + } + + public void setUserAId(String userAId) { + this.userAId = userAId; + } + + public String getRouteLetra() { + return routeLetra; + } + + public void setRouteLetra(String routeLetra) { + this.routeLetra = routeLetra; + } + + public LazyDataModel getCustomerViews() { + return customerViews; + } + + public void setCustomerViews(LazyDataModel customerViews) { + this.customerViews = customerViews; + } + + public CustomerView getSelectedCustomerView() { + return selectedCustomerView; + } + + public void setSelectedCustomerView(CustomerView selectedCustomerView) { + this.selectedCustomerView = selectedCustomerView; + } + + public List getCustomers() { + return customers; + } + + public void setCustomers(List customers) { + this.customers = customers; + } + + public List getRoutes() { + return routes; + } + + public void setRoutes(List routes) { + this.routes = routes; + } + + public String getRouteId() { + return routeId; + } + + public void setRouteId(String routeId) { + this.routeId = routeId; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public List getLoanType() { + return loanType; + } + + public void setLoanType(List loanType) { + this.loanType = loanType; + } + + public List getUsers() { + return users; + } + + public void setUsers(List users) { + this.users = users; + } + + public String getCustomerId() { + return customerId; + } + + public void setCustomerId(String customerId) { + this.customerId = customerId; + } + + public String getEndorsementId() { + return endorsementId; + } + + public void setEndorsementId(String endorsementId) { + this.endorsementId = endorsementId; + } + + public String getLoanTypeId() { + return loanTypeId; + } + + public void setLoanTypeId(String loanTypeId) { + this.loanTypeId = loanTypeId; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public Date getCreatedOn() { + return createdOn; + } + + public void setCreatedOn(Date createdOn) { + this.createdOn = createdOn; + } + + public BigDecimal getTotalPayment() { + return totalPayment; + } + + public void setTotalPayment(BigDecimal totalPayment) { + this.totalPayment = totalPayment; + } + + public BigDecimal getTotalFee() { + return totalFee; + } + + public void setTotalFee(BigDecimal totalFee) { + this.totalFee = totalFee; + } + + public BigDecimal getTotal() { + return total; + } + + public void setTotal(BigDecimal total) { + this.total = total; + } + + public boolean isAprobado() { + return aprobado; + } + + public void setAprobado(boolean aprobado) { + this.aprobado = aprobado; + } + + public boolean isTerminado() { + return terminado; + } + + public void setTerminado(boolean terminado) { + this.terminado = terminado; + } + + public People getAutoCompleteCustomer() { + return autoCompleteCustomer; + } + + public void setAutoCompleteCustomer(People autoCompleteCustomer) { + this.autoCompleteCustomer = autoCompleteCustomer; + } + + public People getAutoCompleteEndorsement() { + return autoCompleteEndorsement; + } + + public void setAutoCompleteEndorsement(People autoCompleteEndorsement) { + this.autoCompleteEndorsement = autoCompleteEndorsement; + } + + public People getSavePeople() { + return savePeople; + } + + public void setSavePeople(People savePeople) { + this.savePeople = savePeople; + } + + public boolean isCustomer() { + return customer; + } + + public void setCustomer(boolean customer) { + this.customer = customer; + } + + public boolean isEndorsement() { + return endorsement; + } + + public void setEndorsement(boolean endorsement) { + this.endorsement = endorsement; + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/catalog/LoanTypeBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/catalog/LoanTypeBean.java new file mode 100644 index 0000000..797e47a --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/catalog/LoanTypeBean.java @@ -0,0 +1,384 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.catalog; + +import com.arrebol.apc.controller.admin.AjustarInventariosController; +import com.arrebol.apc.controller.catalog.LoanTypeController; +import com.arrebol.apc.model.catalog.MovimientosInventario; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.DaysInWeekend; +import com.arrebol.apc.model.enums.GenericEnumType; +import com.arrebol.apc.model.loan.LoanType; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("loanTypeManager") +@ViewScoped +public class LoanTypeBean extends GenericBean implements Serializable, Datatable { + + public List fillDatatableLoanType() { + + return loanTypeCtrl.fillLoanTypeDatatable(getLoggedUser().getOffice().getId()); + } + + @Override + public void editRow(RowEditEvent event) { + LoanType loanType = (LoanType) event.getObject(); + if (loanType != null) { + loanTypeCtrl.updateByLoanTypeId(loanType); + showMessage(FacesMessage.SEVERITY_INFO, "Registro Editado", "Se hizo el cambio correctamente."); + } + } + + @Override + public void onRowCancel(RowEditEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Edición Cancelada", ((LoanType) event.getObject()).getLoanTypeName()); + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + try { + logger.debug("addRowLoanType"); + getSaveLoanType().setCreatedBy(getLoggedUser().getUser().getId()); + getSaveLoanType().setOffice(new Office(getLoggedUser().getOffice().getId())); + BigDecimal total = getSaveLoanType().getPaymentDaily().multiply(new BigDecimal(getSaveLoanType().getTotalDays())); + getSaveLoanType().setPaymentTotal(total); + + if (isMonday() == true) { + getSaveLoanType().setMonday(DaysInWeekend.MONDAY); + } else { + getSaveLoanType().setMonday(null); + } + + if (isTuesday() == true) { + getSaveLoanType().setTuesday(DaysInWeekend.TUESDAY); + } else { + getSaveLoanType().setTuesday(null); + } + + if (isWednesday() == true) { + getSaveLoanType().setWednesday(DaysInWeekend.WEDNESDAY); + } else { + getSaveLoanType().setWednesday(null); + } + + if (isThrusday() == true) { + getSaveLoanType().setThursday(DaysInWeekend.THURSDAY); + } else { + getSaveLoanType().setThursday(null); + } + + if (isFriday() == true) { + getSaveLoanType().setFriday(DaysInWeekend.FRIDAY); + } else { + getSaveLoanType().setFriday(null); + } + + if (isSaturday() == true) { + getSaveLoanType().setSaturday(DaysInWeekend.SATURDAY); + } else { + getSaveLoanType().setSaturday(null); + } + + if (isSunday() == true) { + getSaveLoanType().setSunday(DaysInWeekend.SUNDAY); + } else { + getSaveLoanType().setSunday(null); + } + + getSaveLoanType().setConvenio(ActiveStatus.DISABLED); + + String messafeFormat = getBundlePropertyFile().getString("message.format.failure"); + FacesMessage.Severity severity = FacesMessage.SEVERITY_WARN; + + if (getLoanTypeCtrl().saveLoanType(getSaveLoanType())) { + setSaveLoanType(new LoanType()); + messafeFormat = getBundlePropertyFile().getString("message.format.sucess"); + severity = FacesMessage.SEVERITY_INFO; + } + + Object[] param = {getBundlePropertyFile().getString("loanType"), getBundlePropertyFile().getString("created")}; + + buildAndSendMessage(param, messafeFormat, severity, getBundlePropertyFile().getString("loanType")); + + } catch (Exception e) { + logger.error("saveLoanType", e); + Object[] param = {getBundlePropertyFile().getString("created")}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + getBundlePropertyFile().getString("loanType") + ); + } + } + + public void guardarMoviminento() { + logger.info("guardarMoviminento()"); + try { + + if (getMovimiento().getTipo() == null) { + showMessage(FacesMessage.SEVERITY_FATAL, "ERROR", "Debe de seleccionar el tipo de movimiento"); + return; + } + + // Valores iniciales + Double cantidadInicial = getSelectedLoanType().getCantidadExistente().doubleValue(); + Double cantidadMovimiento = getMovimiento().getCantidadMovimiento().doubleValue(); + Double cantidadNueva = 0.0; + + // Lógica según el tipo de movimiento + switch (getMovimiento().getTipo().toString()) { + case "ENTRADA": + // Sumar al inventario existente + cantidadNueva = cantidadInicial + cantidadMovimiento; + break; + case "SALIDA": + // Restar del inventario existente + if (cantidadMovimiento <= cantidadInicial) { + cantidadNueva = cantidadInicial - cantidadMovimiento; + } else { + showMessage(FacesMessage.SEVERITY_ERROR, "ERROR", "La cantidad del movimiento excede el inventario disponible"); + throw new Exception("La cantidad del movimiento excede el inventario disponible."); + } + break; + case "AJUSTE": + // Ajustar directamente al valor de cantidadMovimiento + cantidadNueva = cantidadMovimiento; + break; + default: + showMessage(FacesMessage.SEVERITY_FATAL, "ERROR", "Tipo de movimiento no reconocido"); + logger.error("Tipo de movimiento no reconocido."); + return; + } + + // Configuración inicial del movimiento + getMovimiento().setLoanType(getSelectedLoanType()); + getMovimiento().setCreatedBy(getLoggedUser().getUser().getId()); + getMovimiento().setCreatedOn(new Date()); + getMovimiento().setEstatusActivo(GenericEnumType.ENABLED); + getMovimiento().setCantidadMovimiento(new BigDecimal(cantidadMovimiento)); + getMovimiento().setInventarioAntiguo(new BigDecimal(cantidadInicial)); + getMovimiento().setInventarioNuevo(new BigDecimal(cantidadNueva)); + + // Guardar los cambios en el inventario + getSelectedLoanType().setCantidadExistente(new BigDecimal(cantidadNueva)); + getSelectedLoanType().setLastUpdatedBy(getLoggedUser().getUser().getId()); + getSelectedLoanType().setLastUpdatedOn(new Date()); + getAjustarInventariosController().addMovimientosInventario(getMovimiento(), getLoggedUser().getUser(), true); + getLoanTypeCtrl().updateByLoanTypeId(getSelectedLoanType()); + + // Limpiar el movimiento + limpiaMoviminento(); + showMessage(FacesMessage.SEVERITY_INFO, "Movimiento realizado", "El ajuste sé a realizado correctamente"); + } catch (Exception e) { + logger.error("guardarMoviminento(): " + e); + showMessage(FacesMessage.SEVERITY_ERROR, "ERROR", "Ocurrió un error al tratar de ajustar el inventario"); + } + } + + public void limpiaMoviminento() { + setMovimiento(new MovimientosInventario()); + loanType = fillDatatableLoanType(); + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + public LoanTypeController getLoanTypeCtrl() { + return loanTypeCtrl; + } + + public void setLoanTypeCtrl(LoanTypeController loanTypeCtrl) { + this.loanTypeCtrl = loanTypeCtrl; + } + + public List getLoanType() { + return loanType; + } + + public void setLoanType(List loanType) { + this.loanType = loanType; + } + + public LoanType getSelectedLoanType() { + return selectedLoanType; + } + + public void setSelectedLoanType(LoanType selectedLoanType) { + this.selectedLoanType = selectedLoanType; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public LoanType getSaveLoanType() { + return saveLoanType; + } + + public void setSaveLoanType(LoanType saveLoanType) { + this.saveLoanType = saveLoanType; + } + + public boolean isMonday() { + return monday; + } + + public void setMonday(boolean monday) { + this.monday = monday; + } + + public boolean isTuesday() { + return tuesday; + } + + public void setTuesday(boolean tuesday) { + this.tuesday = tuesday; + } + + public boolean isWednesday() { + return wednesday; + } + + public void setWednesday(boolean wednesday) { + this.wednesday = wednesday; + } + + public boolean isThrusday() { + return thrusday; + } + + public void setThrusday(boolean thrusday) { + this.thrusday = thrusday; + } + + public boolean isFriday() { + return friday; + } + + public void setFriday(boolean friday) { + this.friday = friday; + } + + public boolean isSaturday() { + return saturday; + } + + public void setSaturday(boolean saturday) { + this.saturday = saturday; + } + + public boolean isSunday() { + return sunday; + } + + public void setSunday(boolean sunday) { + this.sunday = sunday; + } + + public boolean isConvenio() { + return convenio; + } + + public void setConvenio(boolean convenio) { + this.convenio = convenio; + } + + public MovimientosInventario getMovimiento() { + return movimiento; + } + + public void setMovimiento(MovimientosInventario movimiento) { + this.movimiento = movimiento; + } + + public AjustarInventariosController getAjustarInventariosController() { + return ajustarInventariosController; + } + + public void setAjustarInventariosController(AjustarInventariosController ajustarInventariosController) { + this.ajustarInventariosController = ajustarInventariosController; + } + + private LoanTypeController loanTypeCtrl; + private List loanType; + private LoanType selectedLoanType; + private LoanType saveLoanType; + private String id; + private String name; + + final Logger logger = LogManager.getLogger(LoanTypeBean.class); + + boolean monday; + boolean tuesday; + boolean wednesday; + boolean thrusday; + boolean friday; + boolean saturday; + boolean sunday; + boolean convenio; + + private MovimientosInventario movimiento; + private AjustarInventariosController ajustarInventariosController; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + loanTypeCtrl = new LoanTypeController(); + setSaveLoanType(new LoanType()); + setAjustarInventariosController(new AjustarInventariosController()); + loanType = fillDatatableLoanType(); + monday = false; + tuesday = false; + wednesday = false; + thrusday = false; + friday = false; + saturday = false; + sunday = false; + convenio = false; + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/catalog/RoleBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/catalog/RoleBean.java new file mode 100644 index 0000000..21624f7 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/catalog/RoleBean.java @@ -0,0 +1,132 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.catalog; + +import com.arrebol.apc.controller.catalog.RoleController; +import com.arrebol.apc.model.catalog.RoleCtlg; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("roleManager") +@ViewScoped +public class RoleBean extends GenericBean implements Serializable, Datatable { + + public List fillDatatableRole() { + + return roleCtrl.fillRolesDatatable(); + } + + @Override + public void editRow(RowEditEvent event) { + RoleCtlg role = (RoleCtlg) event.getObject(); + if (role != null) { + roleCtrl.updateByRoleId(role); + showMessage(FacesMessage.SEVERITY_INFO, "Registro Editado", "Se hizo el cambio correctamente."); + } + } + + @Override + public void addRow() { + RoleCtlg roleObj = new RoleCtlg(); + roleObj.setRole(name); + roleObj.setActiveStatus(ActiveStatus.ENEBLED); + roleObj.setCreatedBy(getLoggedUser().getUser().getId()); + + roleCtrl.saveRoles(roleObj); + role.add(roleObj); + FacesMessage msg = new FacesMessage("Nuevo puesto", "Se agregó correctamente"); + FacesContext.getCurrentInstance().addMessage(null, msg); + } + + @Override + public void deleteRow() { + roleCtrl.updateRoleByStatus(ActiveStatus.DISABLED, selectedRole.getId(), getLoggedUser().getUser().getId()); + role.remove(selectedRole); + selectedRole = null; + showMessage(FacesMessage.SEVERITY_INFO, "Puesto Eliminado", "Se eliminó correctamente."); + } + + @Override + public void onRowCancel(RowEditEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Edición Cancelada", ((RoleCtlg) event.getObject()).getRole()); + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + public RoleController getRoleCtrl() { + return roleCtrl; + } + + public void setRoleCtrl(RoleController roleCtrl) { + this.roleCtrl = roleCtrl; + } + + public List getRole() { + return role; + } + + public void setRole(List role) { + this.role = role; + } + + public RoleCtlg getSelectedRole() { + return selectedRole; + } + + public void setSelectedRole(RoleCtlg selectedRole) { + this.selectedRole = selectedRole; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + private RoleController roleCtrl; + + private List role; + + private RoleCtlg selectedRole; + + private String id; + private String name; + + @PostConstruct + public void init() { + roleCtrl = new RoleController(); + role = fillDatatableRole(); + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/catalog/RouteBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/catalog/RouteBean.java new file mode 100644 index 0000000..92394c5 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/catalog/RouteBean.java @@ -0,0 +1,135 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.catalog; + +import com.arrebol.apc.controller.catalog.RouteController; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("routeManager") +@ViewScoped +public class RouteBean extends GenericBean implements Serializable, Datatable{ + + public List fillDatatableRoute() { + + return routeCtrl.fillRoutesDatatable(getLoggedUser().getOffice().getId()); + } + + @Override + public void editRow(RowEditEvent event) { + RouteCtlg route = (RouteCtlg) event.getObject(); + if (route != null) { + routeCtrl.updateByRouteId(route); + showMessage(FacesMessage.SEVERITY_INFO, "Registro Editado", "Se hizo el cambio correctamente."); + } + } + + @Override + public void onRowCancel(RowEditEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Edición Cancelada", ((RouteCtlg) event.getObject()).getRoute()); + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + RouteCtlg routeObj = new RouteCtlg(); + routeObj.setRoute(name); + routeObj.setOffice(new Office(getLoggedUser().getOffice().getId())); + routeObj.setActiveStatus(ActiveStatus.ENEBLED); + routeObj.setCreatedBy(getLoggedUser().getUser().getId()); + + routeCtrl.saveRoute(routeObj); + route.add(routeObj); + FacesMessage msg = new FacesMessage("Nueva ruta", "Se agregó correctamente"); + FacesContext.getCurrentInstance().addMessage(null, msg); + } + + @Override + public void deleteRow() { + routeCtrl.updateRouteByStatus(ActiveStatus.DISABLED, selectedRoute.getId(), getLoggedUser().getUser().getId()); + route.remove(selectedRoute); + selectedRoute = null; + showMessage(FacesMessage.SEVERITY_INFO, "Ruta Eliminada", "Se eliminó correctamente."); + } + + public RouteController getRouteCtrl() { + return routeCtrl; + } + + public void setRouteCtrl(RouteController routeCtrl) { + this.routeCtrl = routeCtrl; + } + + public List getRoute() { + return route; + } + + public void setRoute(List route) { + this.route = route; + } + + public RouteCtlg getSelectedRoute() { + return selectedRoute; + } + + public void setSelectedRoute(RouteCtlg selectedRoute) { + this.selectedRoute = selectedRoute; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + private RouteController routeCtrl; + + private List route; + + private RouteCtlg selectedRoute; + + private String id; + private String name; + + @PostConstruct + public void init() { + routeCtrl = new RouteController(); + route = fillDatatableRoute(); + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/dashboard/CustomerWithoutLoanDetailBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/dashboard/CustomerWithoutLoanDetailBean.java new file mode 100644 index 0000000..1600091 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/dashboard/CustomerWithoutLoanDetailBean.java @@ -0,0 +1,172 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.dashboard; + +import com.arrebol.apc.controller.admin.CustomerController; +import com.arrebol.apc.controller.admin.LoanController; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.loan.LoanDetails; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named(value = "customerWithoutLoanDetailManager") +@ViewScoped +public class CustomerWithoutLoanDetailBean extends GenericBean implements Serializable, Datatable { + + public List getDetails(String id) { + try { + loanDetails = loanCtrl.getLoanDetailsbyId(id); + + } catch (Exception e) { + } + return null == loanDetails ? new ArrayList<>() : loanDetails; + } + + public People getCustomerDetail(String peopleId) { + return customerCtrl.findPeopleById(peopleId); + } + + public List getLoanByPeople(String peopleId) { + return customerCtrl.findLoanByCustomer(peopleId); + } + + public void editPeople() { + if (customer.getBirthdate() == null) { + showMessage(FacesMessage.SEVERITY_FATAL, "Campo obligatorio", "La fecha de cumpleaños es obligatoria"); + return; + } + if (customer.getFirstName() == null) { + showMessage(FacesMessage.SEVERITY_FATAL, "Campo obligatorio", "El primer nombre es obligatoria"); + return; + } + if (customer.getLastName() == null) { + showMessage(FacesMessage.SEVERITY_FATAL, "Campo obligatorio", "El apellido paterno es obligatoria"); + return; + } + if (customer.getMiddleName() == null) { + showMessage(FacesMessage.SEVERITY_FATAL, "Campo obligatorio", "El apellido materno es obligatoria"); + return; + } + if (customer.getPhoneHome() == null) { + showMessage(FacesMessage.SEVERITY_FATAL, "Campo obligatorio", "El teléfono de casa es obligatoria"); + return; + } + if (customer.getAddressHome() == null) { + showMessage(FacesMessage.SEVERITY_FATAL, "Campo obligatorio", "El domicilio personal es obligatoria"); + return; + } + if (customerCtrl.updateByPeopleId(customer)) { + showMessage(FacesMessage.SEVERITY_INFO, "Cliente modificado", "Se modificó correctamente."); + } + } + + @Override + public void editRow(RowEditEvent event) { + + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + public CustomerController getCustomerCtrl() { + return customerCtrl; + } + + public void setCustomerCtrl(CustomerController customerCtrl) { + this.customerCtrl = customerCtrl; + } + + public People getCustomer() { + return customer; + } + + public void setCustomer(People customer) { + this.customer = customer; + } + + public String getCustomerId() { + return customerId; + } + + public void setCustomerId(String customerId) { + this.customerId = customerId; + } + + public List getLoan() { + return loan; + } + + public void setLoan(List loan) { + this.loan = loan; + } + + public LoanController getLoanCtrl() { + return loanCtrl; + } + + public void setLoanCtrl(LoanController loanCtrl) { + this.loanCtrl = loanCtrl; + } + + public List getLoanDetails() { + return loanDetails; + } + + public void setLoanDetails(List loanDetails) { + this.loanDetails = loanDetails; + } + + private CustomerController customerCtrl; + private LoanController loanCtrl; + private People customer; + private String customerId; + private List loan; + private List loanDetails; + + @PostConstruct + public void init() { + customerCtrl = new CustomerController(); + loanCtrl = new LoanController(); + setCustomerId(externalContext().getRequestParameterMap().get("selectedId")); + customer = getCustomerDetail(getCustomerId()); + loan = getLoanByPeople(getCustomerId()); + + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/dashboard/DashboardBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/dashboard/DashboardBean.java new file mode 100644 index 0000000..386a3dd --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/dashboard/DashboardBean.java @@ -0,0 +1,37 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.dashboard; + +import com.arrebol.apc.controller.dashboard.CustomerWithoutRenovationViewService; +import com.arrebol.apc.service.admin.CustomerService; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import javax.annotation.PostConstruct; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named(value = "dashboardManager") +@ViewScoped +public class DashboardBean extends GenericBean implements Serializable { + + @Inject + private CustomerWithoutRenovationViewService customerWithoutRenovationViewService; + @Inject + private CustomerService customerService; + + @PostConstruct + public void init() { + + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/dashboard/LoanDetailBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/dashboard/LoanDetailBean.java new file mode 100644 index 0000000..292b363 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/dashboard/LoanDetailBean.java @@ -0,0 +1,245 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.dashboard; + +import com.arrebol.apc.controller.admin.CustomerController; +import com.arrebol.apc.controller.admin.EndorsementController; +import com.arrebol.apc.controller.admin.LoanController; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.enums.LoanDetailsType; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.loan.LoanDetails; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named(value = "loanDetailManager") +@ViewScoped +public class LoanDetailBean extends GenericBean implements Serializable, Datatable { + + public List getDetails(String id) { + try { + loanDetails = loanCtrl.getLoanDetailsbyId(id); + getSaldoInsolutoAbono(); + } catch (Exception e) { + } + return null == loanDetails ? new ArrayList<>() : loanDetails; + } + + public void getSaldoInsolutoAbono( ) { + Double sumaAbonosAnteriores; + Double totalAPagar; + Double saldoInsoluto; + Double saldoMultas; + // + for (LoanDetails detail : loanDetails) { + sumaAbonosAnteriores = loanDetails.stream().filter(p -> p.getReferenceNumber() <= detail.getReferenceNumber() && !p.getLoanDetailsType().equals(LoanDetailsType.FEE) ) + .mapToDouble(LoanDetails::getAbonoD) + .sum(); + saldoMultas = loanDetails.stream().filter(p -> p.getReferenceNumber() <= detail.getReferenceNumber() && p.getLoanDetailsType().equals(LoanDetailsType.FEE)) + .mapToDouble(LoanDetails::getAbonoD) + .sum(); + + totalAPagar = detail.getLoan().getLoanType().getPaymentTotal().doubleValue(); + saldoInsoluto = totalAPagar - sumaAbonosAnteriores + saldoMultas; + + detail.setSaldoInsoluto(new BigDecimal(saldoInsoluto)); + } + } + + public People getCustomerDetail(String peopleId) { + return customerCtrl.findPeopleById(peopleId); + } + + public List getLoanByCustomer(String peopleId) { + return customerCtrl.findLoanByCustomer(peopleId); + } + + public List getLoanByEndorsement(String peopleId) { + return endorsementCtrl.findLoanByEndorsement(peopleId); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + public CustomerController getCustomerCtrl() { + return customerCtrl; + } + + public void setCustomerCtrl(CustomerController customerCtrl) { + this.customerCtrl = customerCtrl; + } + + public People getCustomer() { + return customer; + } + + public void setCustomer(People customer) { + this.customer = customer; + } + + public List getLoanCustomer() { + return loanCustomer; + } + + public void setLoanCustomer(List loanCustomer) { + this.loanCustomer = loanCustomer; + } + + public String getCustomerId() { + return customerId; + } + + public void setCustomerId(String customerId) { + this.customerId = customerId; + } + + public LoanController getLoanCtrl() { + return loanCtrl; + } + + public void setLoanCtrl(LoanController loanCtrl) { + this.loanCtrl = loanCtrl; + } + + public String getLoanId() { + return loanId; + } + + public void setLoanId(String loanId) { + this.loanId = loanId; + } + + public Loan getLoan() { + return loan; + } + + public void setLoan(Loan loan) { + this.loan = loan; + } + + public EndorsementController getEndorsementCtrl() { + return endorsementCtrl; + } + + public void setEndorsementCtrl(EndorsementController endorsementCtrl) { + this.endorsementCtrl = endorsementCtrl; + } + + public People getEndorsement() { + return endorsement; + } + + public void setEndorsement(People endorsement) { + this.endorsement = endorsement; + } + + public String getEndorsementId() { + return endorsementId; + } + + public void setEndorsementId(String endorsementId) { + this.endorsementId = endorsementId; + } + + public List getLoanEndorsement() { + return loanEndorsement; + } + + public void setLoanEndorsement(List loanEndorsement) { + this.loanEndorsement = loanEndorsement; + } + + public Loan getSelectedLoanCustomer() { + return selectedLoanCustomer; + } + + public void setSelectedLoanCustomer(Loan selectedLoanCustomer) { + this.selectedLoanCustomer = selectedLoanCustomer; + } + + public List getLoanDetails() { + return loanDetails; + } + + public void setLoanDetails(List loanDetails) { + this.loanDetails = loanDetails; + } + + private CustomerController customerCtrl; + private LoanController loanCtrl; + private EndorsementController endorsementCtrl; + + private People customer; + private Loan loan; + private People endorsement; + + private String customerId; + private String loanId; + private String endorsementId; + + private List loanEndorsement; + private List loanCustomer; + private Loan selectedLoanCustomer; + + private List loanDetails; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + customerCtrl = new CustomerController(); + loanCtrl = new LoanController(); + endorsementCtrl = new EndorsementController(); + + setLoanId(externalContext().getRequestParameterMap().get("selectedId")); + loan = loanCtrl.getLoanById(getLoanId()); + customer = loan.getCustomer(); + endorsement = loan.getEndorsement(); + loanEndorsement = getLoanByEndorsement(loan.getEndorsement().getId()); + loanCustomer = getLoanByCustomer(loan.getCustomer().getId()); + + if(loanCustomer.size() > 2){ + loanCustomer = getLoanByCustomer(loan.getCustomer().getId()).subList(0, 2); + } + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/dashboard/LoanDetailEndorsementBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/dashboard/LoanDetailEndorsementBean.java new file mode 100644 index 0000000..41a7e1d --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/dashboard/LoanDetailEndorsementBean.java @@ -0,0 +1,218 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.dashboard; + +import com.arrebol.apc.controller.admin.CustomerController; +import com.arrebol.apc.controller.admin.EndorsementController; +import com.arrebol.apc.controller.admin.LoanController; +import com.arrebol.apc.model.catalog.People; +import com.arrebol.apc.model.loan.Loan; +import com.arrebol.apc.model.loan.LoanDetails; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named(value = "loanDetailEndorsementManager") +@ViewScoped +public class LoanDetailEndorsementBean extends GenericBean implements Serializable, Datatable { + + public List getDetails(String id) { + try { + loanDetails = loanCtrl.getLoanDetailsbyId(id); + + } catch (Exception e) { + } + return null == loanDetails ? new ArrayList<>() : loanDetails; + } + + public People getCustomerDetail(String peopleId){ + return customerCtrl.findPeopleById(peopleId); + } + + public List getLoanByCustomer(String peopleId){ + return customerCtrl.findLoanByCustomer(peopleId); + } + + public List getLoanByEndorsement(String peopleId){ + return endorsementCtrl.findLoanByEndorsement(peopleId); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + public CustomerController getCustomerCtrl() { + return customerCtrl; + } + + public void setCustomerCtrl(CustomerController customerCtrl) { + this.customerCtrl = customerCtrl; + } + + public People getCustomer() { + return customer; + } + + public void setCustomer(People customer) { + this.customer = customer; + } + + public List getLoanCustomer() { + return loanCustomer; + } + + public void setLoanCustomer(List loanCustomer) { + this.loanCustomer = loanCustomer; + } + + public String getCustomerId() { + return customerId; + } + + public void setCustomerId(String customerId) { + this.customerId = customerId; + } + + public LoanController getLoanCtrl() { + return loanCtrl; + } + + public void setLoanCtrl(LoanController loanCtrl) { + this.loanCtrl = loanCtrl; + } + + public String getLoanId() { + return loanId; + } + + public void setLoanId(String loanId) { + this.loanId = loanId; + } + + public Loan getLoan() { + return loan; + } + + public void setLoan(Loan loan) { + this.loan = loan; + } + + public EndorsementController getEndorsementCtrl() { + return endorsementCtrl; + } + + public void setEndorsementCtrl(EndorsementController endorsementCtrl) { + this.endorsementCtrl = endorsementCtrl; + } + + public People getEndorsement() { + return endorsement; + } + + public void setEndorsement(People endorsement) { + this.endorsement = endorsement; + } + + public String getEndorsementId() { + return endorsementId; + } + + public void setEndorsementId(String endorsementId) { + this.endorsementId = endorsementId; + } + + public List getLoanEndorsement() { + return loanEndorsement; + } + + public void setLoanEndorsement(List loanEndorsement) { + this.loanEndorsement = loanEndorsement; + } + + public Loan getSelectedLoanCustomer() { + return selectedLoanCustomer; + } + + public void setSelectedLoanCustomer(Loan selectedLoanCustomer) { + this.selectedLoanCustomer = selectedLoanCustomer; + } + + public List getLoanDetails() { + return loanDetails; + } + + public void setLoanDetails(List loanDetails) { + this.loanDetails = loanDetails; + } + + private CustomerController customerCtrl; + private LoanController loanCtrl; + private EndorsementController endorsementCtrl; + + private People customer; + private Loan loan; + private People endorsement; + + private String customerId; + private String loanId; + private String endorsementId; + + private List loanEndorsement; + private List loanCustomer; + private Loan selectedLoanCustomer; + + private List loanDetails; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + customerCtrl = new CustomerController(); + loanCtrl = new LoanController(); + endorsementCtrl = new EndorsementController(); + + setLoanId(externalContext().getRequestParameterMap().get("selectedId")); + loan = loanCtrl.getLoanById(getLoanId()); + customer = loan.getCustomer(); + endorsement = loan.getEndorsement(); + loanEndorsement = getLoanByEndorsement(loan.getEndorsement().getId()); + loanCustomer = getLoanByCustomer(loan.getCustomer().getId()); + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/login/LoginBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/login/LoginBean.java new file mode 100644 index 0000000..961068c --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/login/LoginBean.java @@ -0,0 +1,220 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.login; + +import com.arrebol.apc.controller.login.LoginService; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.web.beans.GenericBean; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.core.UserByOffice; +import com.arrebol.apc.security.APCSecure; +import java.io.IOException; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import javax.enterprise.context.SessionScoped; +import javax.faces.application.FacesMessage; +import javax.faces.context.ExternalContext; +import javax.faces.context.FacesContext; +import javax.inject.Inject; +import javax.inject.Named; +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Named +@SessionScoped +public class LoginBean extends GenericBean implements Serializable { + + /** + * Authentication and authorization user. + * + * @throws IOException from {@link ExternalContext#redirect(String)} + */ + public void login() throws IOException { + ExternalContext externalContext = externalContext(); + HttpServletRequest request = (HttpServletRequest) externalContext.getRequest(); + + try { + logger.info("User: " + getUsername()); + request.login(getUsername() + getOfficeId(), getPassword()); + + User user = new User("", getUsername()); + Office office = new Office(getOfficeId(), getOfficeName()); + + setLoggedUser(loginService.findUserLoggedController(new UserByOffice(user, office))); + + externalContext.redirect(forwardUrl); + + } catch (ServletException | IOException e) { + logger.error("Login() - " + e, e); + //logout(); + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("error.access.title"), getBundlePropertyFile().getString("error.access.details")); + //showMessage(FacesMessage.SEVERITY_ERROR, "¡Acceso denegado!", "Verifica tus datos de ingreso."); + } catch (Exception e) { + logger.error("Login() - " + e, e); + //logout(); + showMessage(FacesMessage.SEVERITY_FATAL, getBundlePropertyFile().getString("fatal.access.title"), getBundlePropertyFile().getString("fatal.access.details")); + //showMessage(FacesMessage.SEVERITY_ERROR, "¡Acceso denegado!", "Por favor contacta a tu administrador."); + } + } + + /** + * Remove current user from session. + * + * @throws IOException from {@link ExternalContext#redirect(String)} + */ + public void logout() throws IOException { + try { + ExternalContext externalContext = externalContext(); + + externalContext.invalidateSession(); + externalContext.redirect(externalContext.getRequestContextPath() + LOGIN); + } catch (IOException e) { + logger.error("logout() - " + e, e); + } + } + + /** + * Check if currently user has the given role. + * + * @param role Role to be search. + * @return true if user has given role otherwise false.. + */ + public boolean isUserInRole(String role) { + FacesContext context = facesContext(); + ExternalContext externalContext = context.getExternalContext(); + + return externalContext.isUserInRole(role); + } + + /** + * + * @return + */ + private String extractRequestedUrlBeforeLogin() { + ExternalContext externalContext = externalContext(); + + String requestedUrl = (String) externalContext.getRequestMap().get(RequestDispatcher.FORWARD_REQUEST_URI); + if (null == requestedUrl) { + return externalContext.getRequestContextPath() + LOGIN; + } + + String queryString = (String) externalContext.getRequestMap().get(RequestDispatcher.FORWARD_QUERY_STRING); + + return requestedUrl + (queryString == null ? "" : "?" + queryString); + } + + /** + * Class contants. + */ + private static final long serialVersionUID = -6130715794722525144L; + + private static final String LOGIN = "/"; + + final Logger logger = LogManager.getLogger(LoginBean.class); + + /** + * Class variables. + */ + @Inject + private LoginService loginService; + + private String forwardUrl; + private String password; + private String username; + private String officeName; + private String officeId; + //private LoginController controller; + List offices; + + /** + * Contructors and pre/post contructors. + */ + @PostConstruct + public void init() { + try { + loadBundlePropertyFile(); + this.forwardUrl = extractRequestedUrlBeforeLogin(); + setOffices(loginService.getAllActiveOfficeController()); + } catch (Exception e) { + logger.error(e.getClass() + " --> " + e.getMessage(), e); + } + } + + @PreDestroy + public void finish() { + try { + logout(); + } catch (Exception e) { + logger.error(e.getClass() + " --> " + e.getMessage(), e); + } + } + + /** + * Getters and Setters. + * + * @return + */ + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = new APCSecure(APP, password).getPassword(); + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getOfficeName() { + try { + int index = offices.indexOf(new Office(officeId)); + officeName = offices.get(index).getOfficeName(); + } catch (Exception e) { + } + return officeName; + } + + public void setOfficeName(String officeName) { + this.officeName = officeName; + } + + public String getOfficeId() { + return officeId; + } + + public void setOfficeId(String officeId) { + this.officeId = officeId; + } + + public List getOffices() { + if (null == offices) { + offices = new ArrayList<>(); + } + return offices; + } + + public void setOffices(List offices) { + this.offices = offices; + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/system/bitacora/BitacoraBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/system/bitacora/BitacoraBean.java new file mode 100644 index 0000000..fe6a465 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/system/bitacora/BitacoraBean.java @@ -0,0 +1,127 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.system.bitacora; + +import com.arrebol.apc.controller.BitacoraController; + +import com.arrebol.apc.model.system.logs.Bitacora; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.Calendar; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("bitacoraManager") +@ViewScoped +public class BitacoraBean extends GenericBean implements Serializable, Datatable { + + public void searchHistoricalAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setBitacora(fillDatatableBitacoraByDate()); + } + } catch (Exception e) { + } + } + + public void searchAllAction() { + try { + if (getStarDate().after(getEndDate())) { + showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("generic.start.date"), getBundlePropertyFile().getString("generic.end.date.error")); + } else { + setBitacora(fillDatatableBitacora()); + } + } catch (Exception e) { + } + } + + public List fillDatatableBitacora() { + + return bitacoraCtrl.fillBitacoraDatatable(getLoggedUser().getOffice().getId()); + } + + public List fillDatatableBitacoraByDate() { + + return bitacoraCtrl.fillBitacoraDatatableByDate(getLoggedUser().getOffice().getId(), getStarDate(), getEndDate()); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + } + + @Override + public void deleteRow() { + + } + + public BitacoraController getBitacoraCtrl() { + return bitacoraCtrl; + } + + public void setBitacoraCtrl(BitacoraController bitacoraCtrl) { + this.bitacoraCtrl = bitacoraCtrl; + } + + public List getBitacora() { + return bitacora; + } + + public void setBitacora(List bitacora) { + this.bitacora = bitacora; + } + + public Bitacora getSelectedBitacora() { + return selectedBitacora; + } + + public void setSelectedBitacora(Bitacora selectedBitacora) { + this.selectedBitacora = selectedBitacora; + } + + private BitacoraController bitacoraCtrl; + + private List bitacora; + + private Bitacora selectedBitacora; + + @PostConstruct + public void init() { + loadBundlePropertyFile(); + initStartAndEndDates(Calendar.DAY_OF_WEEK, 2); + bitacoraCtrl = new BitacoraController(); + bitacora = fillDatatableBitacora(); + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/system/employee/EmployeeBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/system/employee/EmployeeBean.java new file mode 100644 index 0000000..0b10e19 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/system/employee/EmployeeBean.java @@ -0,0 +1,622 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.system.employee; + +import com.arrebol.apc.controller.catalog.RoleController; +import com.arrebol.apc.controller.system.employee.EmployeeController; +import com.arrebol.apc.model.admin.Bonus; +import com.arrebol.apc.model.catalog.RoleCtlg; +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.HumanResourceByOffice; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.ApplicationOwner; +import com.arrebol.apc.model.enums.HumanResourceStatus; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Named +@ViewScoped +public class EmployeeBean extends GenericBean implements Serializable { + + public void saveHR() { + logger.debug("saveHR"); + try { + getSaveHumanResource().setAvatar("images/avatar.png"); + getSaveHumanResource().setRoleCtlg(new RoleCtlg(role)); + getSaveHumanResource().setHumanResourceStatus(HumanResourceStatus.ENEBLED); + getSaveHumanResource().setCreatedBy(getLoggedUser().getUser().getId()); + getSaveHumanResource().setBalance(BigDecimal.ZERO); + + if (getSaveHumanResource().getEmployeeSaving() == null) { + getSaveHumanResource().setEmployeeSaving(BigDecimal.ZERO); + } + + String messafeFormat = getBundlePropertyFile().getString("message.format.failure"); + FacesMessage.Severity severity = FacesMessage.SEVERITY_WARN; + + HumanResourceByOffice humanResourceByOffice = new HumanResourceByOffice( + new Office(getLoggedUser().getOffice().getId()), + getLoggedUser().getUser().getId(), + new Date(), + ApplicationOwner.APP_USER + ); + + if (null != getBonusId() && getBonusId().length() == 36) { + getSaveHumanResource().setBonus(new Bonus(getBonusId())); + } + + if (getController().saveHRController(humanResourceByOffice, getSaveHumanResource())) { + setSaveHumanResource(new HumanResource()); + + messafeFormat = getBundlePropertyFile().getString("message.format.sucess"); + severity = FacesMessage.SEVERITY_INFO; + + refreshDropBox(); + } + Object[] param = {getBundlePropertyFile().getString("employee"), getBundlePropertyFile().getString("created")}; + + buildAndSendMessage(param, messafeFormat, severity, getBundlePropertyFile().getString("employee")); + } catch (Exception e) { + logger.error("saveHR", e); + Object[] param = {getBundlePropertyFile().getString("created")}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + getBundlePropertyFile().getString("employee") + ); + } + } + + /** + * + * @param action 1 = TO DISABLED, 2 = TO ENEBLED, 3 = TO DELETED, 4 NOT + * ALLOWED + */ + public void actionDropBox(int action) { + logger.debug("actionDropBox"); + try { + String messageTitle = getBundlePropertyFile().getString("employee"); + String actionUserIdSelected = null; + String messageAction = null; + + HumanResourceStatus status = null; + + switch (action) { + case 1: + actionUserIdSelected = getEnebledId(); + messageAction = getBundlePropertyFile().getString("disabled"); + status = HumanResourceStatus.DISABLED; + break; + case 2: + actionUserIdSelected = getDisabledId(); + messageAction = getBundlePropertyFile().getString("enebled"); + status = HumanResourceStatus.ENEBLED; + break; + case 3: + actionUserIdSelected = getDeletedId(); + messageAction = getBundlePropertyFile().getString("deleted"); + status = HumanResourceStatus.DELETED; + break; + default: + throw new Exception(action + " is NOT valid a option"); + } + + if (executeAction(status, actionUserIdSelected, messageTitle, messageAction)) { + refreshDropBox(); + } + } catch (Exception e) { + logger.error("actionDropBox", e); + Object[] param = {getBundlePropertyFile().getString("employee")}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + getBundlePropertyFile().getString("process") + ); + } + } + + public void updateSlctBtnHRAction() { + logger.debug("updateHR"); + try { + getUpdateHumanResource().setLastUpdatedBy(getLoggedUser().getUser().getId()); + getUpdateHumanResource().setLastUpdatedOn(new Date()); + getUpdateHumanResource().setRoleCtlg(new RoleCtlg(roleUpdate)); + + if (getUpdateHumanResource().getEmployeeSaving() == null) { + getUpdateHumanResource().setEmployeeSaving(BigDecimal.ZERO); + } + + String messafeFormat = getBundlePropertyFile().getString("message.format.failure"); + FacesMessage.Severity severity = FacesMessage.SEVERITY_WARN; + + if (null != getBonusId() && getBonusId().length() == 36) { + getUpdateHumanResource().setBonus(new Bonus(getBonusId())); + } + + if (getController().updateByHumanResourceId(getUpdateHumanResource(), false)) { + messafeFormat = getBundlePropertyFile().getString("message.format.sucess"); + severity = FacesMessage.SEVERITY_INFO; + } + + Object[] param = {getBundlePropertyFile().getString("employee"), getBundlePropertyFile().getString("updated")}; + + buildAndSendMessage(param, messafeFormat, severity, getBundlePropertyFile().getString("employee")); + } catch (Exception e) { + logger.error("updateSlctBtnHRActionListener", e); + Object[] param = {getBundlePropertyFile().getString("updated")}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + getBundlePropertyFile().getString("employee") + ); + } + } + + public void loadUserToUpdate() { + try { + setUpdateHumanResource(getController().findHumanResourceById(getUpdateId())); + setRoleUpdate(getUpdateHumanResource().getBonus().getId()); + updateBonusId = getRoleUpdate(); + } catch (Exception e) { + logger.error("updateSlctBtnHRActionListener", e); + Object[] param = {getBundlePropertyFile().getString("searching")}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + getBundlePropertyFile().getString("employee") + ); + } + } + + /** + * + * @param option 1 = to disabled, 2 = to enebled, 4 = to updated + */ + public void enebledDisabledDropBoxListener(int option) { + logger.debug("enebledDisabledDropBoxListener"); + try { + HumanResourceStatus status = HumanResourceStatus.ENEBLED; + + boolean goAHead = false; + + switch (option) { + case 1: + if (isEnebledHR()) { + goAHead = isEnebledHR(); + } else { + setEnebledHumanResourcesLst(null); + } + break; + case 2: + if (isDisabledHR()) { + goAHead = isDisabledHR(); + } else { + setDeletedHumanResourcesLst(null); + } + break; + case 4: + if (isSelectedUpdateHR()) { + goAHead = isSelectedUpdateHR(); + } else { + setUpdateHumanResourcesLst(null); + setUpdateHumanResource(new HumanResource()); + setRoleUpdate("N/A"); + } + break; + } + + if (goAHead) { + if (2 == option) { + status = HumanResourceStatus.DISABLED; + } + + List results = getController().findEmployeesByType( + new Office(getLoggedUser().getOffice().getId()), + status, + getLoggedUser().getUser().getHumanResource().getId() + ); + + switch (option) { + case 1: + setEnebledHumanResourcesLst(results); + break; + case 2: + setDisabledHumanResourcesLst(results); + break; + case 4: + setUpdateHumanResourcesLst(results); + setUpdateHumanResource(new HumanResource()); + break; + } + } + } catch (Exception e) { + logger.error("enebledDisabledDropBoxListener"); + + Object[] param = {getBundlePropertyFile().getString("searching")}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + getBundlePropertyFile().getString("employee") + ); + } + } + + public void deletedHRListener() { + try { + if (isDeletedHR()) { + List statusLst = new ArrayList<>(); + + statusLst.add(HumanResourceStatus.ENEBLED); + statusLst.add(HumanResourceStatus.DISABLED); + + setDeletedHumanResourcesLst( + getController().findEmployeesInType( + new Office(getLoggedUser().getOffice().getId()), + statusLst, + getLoggedUser().getUser().getHumanResource().getId() + ) + ); + } else { + setDeletedHumanResourcesLst(null); + } + } catch (Exception e) { + logger.error("deletedHRListener", e); + Object[] param = {getBundlePropertyFile().getString("searching")}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + getBundlePropertyFile().getString("employee") + ); + } + } + + /** + * + * @param status + * @param userIdSelected + * @param msgTitle + * @param msgAction + */ + private boolean executeAction(HumanResourceStatus status, String userIdSelected, String msgTitle, String msgAction) { + logger.debug("executeAction"); + + boolean success = false; + + try { + String messafeFormat = getBundlePropertyFile().getString("message.format.failure"); + FacesMessage.Severity severity = FacesMessage.SEVERITY_WARN; + + success = getController().updateHRByStatus(status, userIdSelected, getLoggedUser().getUser().getId()); + + if (success) { + logger.debug("executeAction"); + + messafeFormat = getBundlePropertyFile().getString("message.format.sucess"); + severity = FacesMessage.SEVERITY_INFO; + } + + Object[] param = {msgTitle, msgAction}; + + buildAndSendMessage(param, messafeFormat, severity, msgTitle); + } catch (Exception e) { + logger.error("executeAction", e); + Object[] param = {msgTitle}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + msgTitle + ); + } + return success; + } + + private void refreshDropBox() { + try { + if (isEnebledHR()) { + enebledDisabledDropBoxListener(1); + } + if (isDisabledHR()) { + enebledDisabledDropBoxListener(2); + } + + if (isDeletedHR()) { + deletedHRListener(); + } + + if (isSelectedUpdateHR()) { + enebledDisabledDropBoxListener(4); + } + } catch (Exception e) { + logger.error("executeAction", e); + } + } + + private static final long serialVersionUID = 2969985354193657703L; + final Logger logger = LogManager.getLogger(EmployeeBean.class); + + private EmployeeController controller; + private RoleController roleCtrl; + + private HumanResource saveHumanResource; + private HumanResource updateHumanResource; + + private String role; + private List roles; + + private boolean selectedUpdateHR; + private String updateId; + + private String roleUpdate; + private List updateHumanResourcesLst; + private List typeLst; + + private boolean enebledHR; + private String enebledId; + private List enebledHumanResourcesLst; + + private boolean disabledHR; + private String disabledId; + private List disabledHumanResourcesLst; + + private boolean deletedHR; + private String deletedId; + private List deletedHumanResourcesLst; + + private String bonusId; + private List bonuses; + private String updateBonusId; + + @PostConstruct() + public void init() { + try { + loadBundlePropertyFile(); + setController(new EmployeeController()); + setRoleCtrl(new RoleController()); + setSaveHumanResource(new HumanResource()); + setUpdateHumanResource(new HumanResource()); + roles = getRoleCtrl().fillRolesDatatable(); + setBonuses(getController().findAllActiveBonus(getLoggedUser().getOffice().getId())); + } catch (Exception e) { + logger.error("init", e); + } + } + + @PreDestroy + public void finish() { + try { + setSaveHumanResource(new HumanResource()); + setUpdateHumanResource(new HumanResource()); + setController(null); + } catch (Exception e) { + logger.error("finish", e); + } + } + + public RoleController getRoleCtrl() { + return roleCtrl; + } + + public void setRoleCtrl(RoleController roleCtrl) { + this.roleCtrl = roleCtrl; + } + + public EmployeeController getController() { + return controller; + } + + public void setController(EmployeeController controller) { + this.controller = controller; + } + + public HumanResource getSaveHumanResource() { + return saveHumanResource; + } + + public void setSaveHumanResource(HumanResource saveHumanResource) { + this.saveHumanResource = saveHumanResource; + } + + public HumanResource getUpdateHumanResource() { + return updateHumanResource; + } + + public void setUpdateHumanResource(HumanResource updateHumanResource) { + this.updateHumanResource = updateHumanResource; + } + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + public List getRoles() { + if (null == roles) { + /* + roles = Stream.of( + HumanResourceType.values()) + .map(Enum::name) + .collect(Collectors.toList() + ); + */ + } + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } + + public boolean isSelectedUpdateHR() { + return selectedUpdateHR; + } + + public void setSelectedUpdateHR(boolean selectedUpdateHR) { + this.selectedUpdateHR = selectedUpdateHR; + } + + public String getUpdateId() { + return updateId; + } + + public void setUpdateId(String updateId) { + this.updateId = updateId; + } + + public String getRoleUpdate() { + return roleUpdate; + } + + public void setRoleUpdate(String roleUpdate) { + this.roleUpdate = roleUpdate; + } + + public List getUpdateHumanResourcesLst() { + return updateHumanResourcesLst; + } + + public void setUpdateHumanResourcesLst(List updateHumanResourcesLst) { + this.updateHumanResourcesLst = updateHumanResourcesLst; + } + + public List getTypeLst() { + return typeLst; + } + + public void setTypeLst(List typeLst) { + this.typeLst = typeLst; + } + + public boolean isEnebledHR() { + return enebledHR; + } + + public void setEnebledHR(boolean enebledHR) { + this.enebledHR = enebledHR; + } + + public String getEnebledId() { + return enebledId; + } + + public void setEnebledId(String enebledId) { + this.enebledId = enebledId; + } + + public List getEnebledHumanResourcesLst() { + return enebledHumanResourcesLst; + } + + public void setEnebledHumanResourcesLst(List enebledHumanResourcesLst) { + this.enebledHumanResourcesLst = enebledHumanResourcesLst; + } + + public boolean isDisabledHR() { + return disabledHR; + } + + public void setDisabledHR(boolean disabledHR) { + this.disabledHR = disabledHR; + } + + public String getDisabledId() { + return disabledId; + } + + public void setDisabledId(String disabledId) { + this.disabledId = disabledId; + } + + public List getDisabledHumanResourcesLst() { + return disabledHumanResourcesLst; + } + + public void setDisabledHumanResourcesLst(List disabledHumanResourcesLst) { + this.disabledHumanResourcesLst = disabledHumanResourcesLst; + } + + public boolean isDeletedHR() { + return deletedHR; + } + + public void setDeletedHR(boolean deletedHR) { + this.deletedHR = deletedHR; + } + + public String getDeletedId() { + return deletedId; + } + + public void setDeletedId(String deletedId) { + this.deletedId = deletedId; + } + + public List getDeletedHumanResourcesLst() { + return deletedHumanResourcesLst; + } + + public void setDeletedHumanResourcesLst(List deletedHumanResourcesLst) { + this.deletedHumanResourcesLst = deletedHumanResourcesLst; + } + + public String getBonusId() { + return bonusId; + } + + public void setBonusId(String bonusId) { + this.bonusId = bonusId; + } + + public List getBonuses() { + return bonuses; + } + + public void setBonuses(List bonuses) { + this.bonuses = bonuses; + } + + public String getUpdateBonusId() { + return updateBonusId; + } + + public void setUpdateBonusId(String updateBonusId) { + this.updateBonusId = updateBonusId; + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/system/office/OfficeBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/system/office/OfficeBean.java new file mode 100644 index 0000000..028d8dd --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/system/office/OfficeBean.java @@ -0,0 +1,142 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.system.office; + +import com.arrebol.apc.controller.system.office.OfficeController; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.enums.OfficeStatus; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("officeManager") +@ViewScoped +public class OfficeBean extends GenericBean implements Serializable, Datatable{ + + public List fillDatatableOffice() { + + return officeCtrl.fillOfficeDatatable(); + } + + @Override + public void editRow(RowEditEvent event) { + Office office = (Office) event.getObject(); + if (office != null) { + officeCtrl.updateByOfficeId(office); + showMessage(FacesMessage.SEVERITY_INFO, "Registro Editado", "Se hizo el cambio correctamente."); + } } + + @Override + public void onRowCancel(RowEditEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Edición Cancelada", ((Office) event.getObject()).getOfficeName()); + } + + @Override + public void onRowReorder(ReorderEvent event) { + showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1)); + } + + @Override + public void addRow() { + Office officeObj = new Office(); + officeObj.setOfficeName(name); + officeObj.setAddress(address); + officeObj.setOfficeStatus(OfficeStatus.ENEBLED); + officeObj.setCreatedBy(getLoggedUser().getUser().getId()); + + officeCtrl.saveOffice(officeObj); + office.add(officeObj); + FacesMessage msg = new FacesMessage("Nueva oficina", "Se agregó correctamente"); + FacesContext.getCurrentInstance().addMessage(null, msg); + } + + @Override + public void deleteRow() { + officeCtrl.updateOfficeByStatus(OfficeStatus.DISABLED, selectedOffice.getId(), getLoggedUser().getUser().getId()); + office.remove(selectedOffice); + selectedOffice = null; + showMessage(FacesMessage.SEVERITY_INFO, "Oficina eliminada", "Se eliminó correctamente."); + } + + public OfficeController getOfficeCtrl() { + return officeCtrl; + } + + public void setOfficeCtrl(OfficeController officeCtrl) { + this.officeCtrl = officeCtrl; + } + + public List getOffice() { + return office; + } + + public void setOffice(List office) { + this.office = office; + } + + public Office getSelectedOffice() { + return selectedOffice; + } + + public void setSelectedOffice(Office selectedOffice) { + this.selectedOffice = selectedOffice; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + private OfficeController officeCtrl; + + private List office; + + private Office selectedOffice; + + private String id; + private String name; + private String address; + + @PostConstruct + public void init() { + officeCtrl = new OfficeController(); + office = fillDatatableOffice(); + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/system/user/UserAccessBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/system/user/UserAccessBean.java new file mode 100644 index 0000000..5a32052 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/system/user/UserAccessBean.java @@ -0,0 +1,195 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.system.user; + +import com.arrebol.apc.controller.system.user.UserAccessController; +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.Permission; +import com.arrebol.apc.model.core.UserByOffice; +import com.arrebol.apc.model.enums.UserStatus; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.primefaces.model.DualListModel; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Named +@ViewScoped +public class UserAccessBean extends GenericBean implements Serializable { + + public void dropBoxOnchange() { + try { + List source = new ArrayList<>(); + List target = new ArrayList<>(); + + setHr(new HumanResource()); + setDualPermissionLst(new DualListModel<>(source, target)); + setUpdateForm(false); + } catch (Exception e) { + logger.error("saveHR", e); + Object[] param = {getBundlePropertyFile().getString("searching")}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + getBundlePropertyFile().getString("user") + ); + } + } + + public void loadUserByOfficePermissionLst() { + try { + UserByOffice loadUserByOffice = new UserByOffice(getUserByOfficeId()); + + List source = getController().loadUserByOfficePermissionLst(loadUserByOffice, true); + List target = getController().loadUserByOfficePermissionLst(loadUserByOffice, false); + + int index = getUserByOfficeLst().indexOf(loadUserByOffice); + + setHr(getUserByOfficeLst().get(index).getUser().getHumanResource()); + setDualPermissionLst(new DualListModel<>(source, target)); + setUpdateForm(true); + } catch (Exception e) { + logger.error("saveHR", e); + Object[] param = {getBundlePropertyFile().getString("searching")}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + getBundlePropertyFile().getString("user") + ); + } + } + + public void savePermission() { + logger.debug("savePermission"); + + String messafeFormat = getBundlePropertyFile().getString("message.format.fatal"); + String messageTitle = getBundlePropertyFile().getString("user"); + String messageAction = getBundlePropertyFile().getString("updated"); + + FacesMessage.Severity severity = FacesMessage.SEVERITY_FATAL; + try { + if (getController().updatePermissionsController(dualPermissionLst.getTarget(), getUserByOfficeId(), getLoggedUser().getUser().getId())) { + messafeFormat = getBundlePropertyFile().getString("message.format.sucess"); + severity = FacesMessage.SEVERITY_INFO; + } else { + messafeFormat = getBundlePropertyFile().getString("message.format.failure"); + severity = FacesMessage.SEVERITY_WARN; + } + + Object[] param = {messageTitle, messageAction}; + + buildAndSendMessage(param, messafeFormat, severity, messageTitle); + } catch (Exception e) { + logger.error("savePermission", e); + Object[] param = {messageAction}; + + buildAndSendMessage(param, messafeFormat, severity, messageTitle); + } + } + + private static final long serialVersionUID = 6738057461247413139L; + final Logger logger = LogManager.getLogger(UserAccessBean.class); + + private UserAccessController controller; + private String userByOfficeId; + private List userByOfficeLst; + private DualListModel dualPermissionLst; + private HumanResource hr; + private boolean updateForm; + + @PostConstruct + public void init() { + try { + loadBundlePropertyFile(); + + setController(new UserAccessController()); + + List statuses = new ArrayList<>(); + + statuses.add(UserStatus.ENEBLED); + + setUserByOfficeLst( + getController().findUsersInOfficeInStatuses( + statuses, + getLoggedUser().getOffice().getId(), + getLoggedUser().getUser().getId() + ) + ); + + List source = new ArrayList<>(); + List target = new ArrayList<>(); + + setDualPermissionLst(new DualListModel<>(source, target)); + } catch (Exception e) { + logger.error("init", e); + } + } + + public UserAccessController getController() { + return controller; + } + + public void setController(UserAccessController controller) { + this.controller = controller; + } + + public String getUserByOfficeId() { + return userByOfficeId; + } + + public void setUserByOfficeId(String userByOfficeId) { + this.userByOfficeId = userByOfficeId; + } + + public List getUserByOfficeLst() { + return userByOfficeLst; + } + + public void setUserByOfficeLst(List userByOfficeLst) { + this.userByOfficeLst = userByOfficeLst; + } + + public DualListModel getDualPermissionLst() { + return dualPermissionLst; + } + + public void setDualPermissionLst(DualListModel dualPermissionLst) { + this.dualPermissionLst = dualPermissionLst; + } + + public HumanResource getHr() { + return hr; + } + + public void setHr(HumanResource hr) { + this.hr = hr; + } + + public boolean isUpdateForm() { + return updateForm; + } + + public void setUpdateForm(boolean updateForm) { + this.updateForm = updateForm; + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/system/user/UserAdminBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/system/user/UserAdminBean.java new file mode 100644 index 0000000..decbbc5 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/system/user/UserAdminBean.java @@ -0,0 +1,567 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.system.user; + +import com.arrebol.apc.controller.system.user.UserAdminController; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.core.UserByOffice; +import com.arrebol.apc.model.enums.UserStatus; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.primefaces.model.DualListModel; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Named +@ViewScoped +public class UserAdminBean extends GenericBean implements Serializable { + + /** + * + * @param option 1 = enebled,2 = disabled, 3 = deleted, 4 = username, 5 = + * password, 6 = avatar, 7 = routes + */ + public void enebledDisabledListener(int option) { + try { + boolean goAHead = false; + + List statuses = new ArrayList<>(); + + switch (option) { + case 1: + if (isEnebled()) { + goAHead = true; + statuses.add(UserStatus.ENEBLED); + } else { + setEnebledLst(null); + } + break; + case 2: + if (isDisabled()) { + goAHead = true; + statuses.add(UserStatus.DISABLED); + } else { + setDisabledLst(null); + } + break; + case 3: + if (isDeleted()) { + goAHead = true; + statuses.add(UserStatus.ENEBLED); + statuses.add(UserStatus.DISABLED); + } else { + setDeletedLst(null); + } + break; + case 4: + if (isUsername()) { + goAHead = true; + statuses.add(UserStatus.ENEBLED); + } else { + setUserNameLst(null); + } + break; + case 5: + if (isPwd()) { + goAHead = true; + statuses.add(UserStatus.ENEBLED); + } else { + setPwdLst(null); + } + break; + case 6: + if (isAvatar()) { + goAHead = true; + statuses.add(UserStatus.ENEBLED); + } else { + setAvatarLst(null); + } + case 7: + if (isRoute()) { + goAHead = true; + statuses.add(UserStatus.ENEBLED); + } else { + setRouteLst(null); + } + break; + } + + if (goAHead) { + loadDropBoxData(statuses, option); + } + } catch (Exception e) { + logger.error("enebledDisabledListener", e); + Object[] param = {getBundlePropertyFile().getString("searching")}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + getBundlePropertyFile().getString("user") + ); + } + } + + /** + * + * @param option 1 = enebled, 2 = disabled, 3 = deleted, 4 = username, 5 = + * password, 6 = avatar: + */ + public void dropBoxListener(int option) { + switch (option) { + case 1: + setEnebledSelected(getEnebledLst().get(getEnebledLst().indexOf(new UserByOffice(getEnebledId())))); + break; + case 2: + setDisabledSelected(getDisabledLst().get(getDisabledLst().indexOf(new UserByOffice(getDisabledId())))); + break; + case 3: + setDeletedSelected(getDeletedLst().get(getDeletedLst().indexOf(new UserByOffice(getDeletedId())))); + break; + case 4: + setUserNameSelected(getUserNameLst().get(getUserNameLst().indexOf(new UserByOffice(getUsernameId())))); + break; + case 5: + setPwdSelected(getPwdLst().get(getPwdLst().indexOf(new UserByOffice(getPwdId())))); + break; + case 6: + setAvatarSelect(getAvatarLst().get(getAvatarLst().indexOf(new UserByOffice(getAvatarId())))); + break; + case 7: + setRouteSelect(getRouteLst().get(getRouteLst().indexOf(new UserByOffice(getRouteId())))); + // getRouteId() = user selected id + + break; + } + } + + /** + * + */ + public void onUserTypeSlctChange() { + if (null == getUserType() || getUserType().equals("WEB") || getUserType().equals("N/A")) { + setCertifier(false); + setRouteCtlgLst(new ArrayList<>()); + setDualRouteCtlgLst(new DualListModel<>(new ArrayList<>(), new ArrayList<>())); + } else if (getUserType().equals("BOTH") || getUserType().equals("MOBILE")) { + try { + setRouteCtlgLst(getController().findRoutesByOffice(getLoggedUser().getOffice().getId())); + setDualRouteCtlgLst(new DualListModel<>(getController().findRoutesWithNoCertifierUser(getLoggedUser().getOffice().getId()), new ArrayList<>())); + } catch (Exception ex) { + logger.error("onUserTypeSlctChange", ex); + } + } + } + + /** + * + */ + public void onCertifiedChange() { + try { + if (isCertifier()) { + setDualRouteCtlgLst( + new DualListModel<>( + getController().findRoutesWithNoCertifierUser(getLoggedUser().getOffice().getId()), + new ArrayList<>() + ) + ); + setRouteCtlgLst(new ArrayList<>()); + } else { + setDualRouteCtlgLst(new DualListModel<>(new ArrayList<>(), new ArrayList<>())); + setRouteCtlgLst(getController().findRoutesByOffice(getLoggedUser().getOffice().getId())); + } + } catch (Exception e) { + logger.error("onCertifiedChange", e); + } + } + + /** + * + * @param option 1 = enebled, 2 = disabled, 3 = deleted, 4 = username, 5 = + * password, 6 = avatar: + */ + private void loadDropBoxData(List statuses, int option) { + try { + + List retults = getController().findUsersInOfficeInStatuses(statuses, getLoggedUser().getOffice().getId(), getLoggedUser().getUser().getId()); + + switch (option) { + case 1: + setEnebledLst(retults); + break; + case 2: + setDisabledLst(retults); + break; + case 3: + setDeletedLst(retults); + break; + case 4: + setUserNameLst(retults); + break; + case 5: + setPwdLst(retults); + break; + case 6: + setAvatarLst(retults); + break; + case 7: + setRouteLst(retults); + break; + } + } catch (Exception e) { + logger.error("loadDropBoxData", e); + throw e; + } + } + + private static final long serialVersionUID = -2325684946201829629L; + final Logger logger = LogManager.getLogger(UserAdminBean.class); + + private UserAdminController controller; + + private List enebledLst; + private List disabledLst; + private List deletedLst; + private List userNameLst; + private List pwdLst; + private List avatarLst; + private List routeLst; + + private UserByOffice enebledSelected; + private UserByOffice disabledSelected; + private UserByOffice deletedSelected; + private UserByOffice userNameSelected; + private UserByOffice pwdSelected; + private UserByOffice avatarSelect; + private UserByOffice routeSelect; + + private String enebledId; + private String disabledId; + private String deletedId; + private String usernameId; + private String pwdId; + private String avatarId; + private String routeId; + + private boolean enebled; + private boolean disabled; + private boolean deleted; + private boolean username; + private boolean pwd; + private boolean avatar; + private boolean route; + + private String userType; + private boolean certifier; + private boolean enebledGrants; + private String routeSelectedId; + private List routeCtlgLst; + private DualListModel dualRouteCtlgLst; + + @PostConstruct + public void init() { + try { + loadBundlePropertyFile(); + + setController(new UserAdminController()); + } catch (Exception e) { + logger.error("init", e); + } + } + + public UserAdminController getController() { + return controller; + } + + public void setController(UserAdminController controller) { + this.controller = controller; + } + + public List getEnebledLst() { + return enebledLst; + } + + public void setEnebledLst(List enebledLst) { + this.enebledLst = enebledLst; + } + + public List getDisabledLst() { + return disabledLst; + } + + public void setDisabledLst(List disabledLst) { + this.disabledLst = disabledLst; + } + + public List getDeletedLst() { + return deletedLst; + } + + public void setDeletedLst(List deletedLst) { + this.deletedLst = deletedLst; + } + + public List getUserNameLst() { + return userNameLst; + } + + public void setUserNameLst(List userNameLst) { + this.userNameLst = userNameLst; + } + + public List getPwdLst() { + return pwdLst; + } + + public void setPwdLst(List pwdLst) { + this.pwdLst = pwdLst; + } + + public List getAvatarLst() { + return avatarLst; + } + + public void setAvatarLst(List avatarLst) { + this.avatarLst = avatarLst; + } + + public List getRouteLst() { + return routeLst; + } + + public void setRouteLst(List routeLst) { + this.routeLst = routeLst; + } + + public UserByOffice getEnebledSelected() { + return enebledSelected; + } + + public void setEnebledSelected(UserByOffice enebledSelected) { + this.enebledSelected = enebledSelected; + } + + public UserByOffice getDisabledSelected() { + return disabledSelected; + } + + public void setDisabledSelected(UserByOffice disabledSelected) { + this.disabledSelected = disabledSelected; + } + + public UserByOffice getDeletedSelected() { + return deletedSelected; + } + + public void setDeletedSelected(UserByOffice deletedSelected) { + this.deletedSelected = deletedSelected; + } + + public UserByOffice getUserNameSelected() { + return userNameSelected; + } + + public void setUserNameSelected(UserByOffice userNameSelected) { + this.userNameSelected = userNameSelected; + } + + public UserByOffice getPwdSelected() { + return pwdSelected; + } + + public void setPwdSelected(UserByOffice pwdSelected) { + this.pwdSelected = pwdSelected; + } + + public UserByOffice getAvatarSelect() { + return avatarSelect; + } + + public void setAvatarSelect(UserByOffice avatarSelect) { + this.avatarSelect = avatarSelect; + } + + public UserByOffice getRouteSelect() { + return routeSelect; + } + + public void setRouteSelect(UserByOffice routeSelect) { + this.routeSelect = routeSelect; + } + + public String getEnebledId() { + return enebledId; + } + + public void setEnebledId(String enebledId) { + this.enebledId = enebledId; + } + + public String getDisabledId() { + return disabledId; + } + + public void setDisabledId(String disabledId) { + this.disabledId = disabledId; + } + + public String getDeletedId() { + return deletedId; + } + + public void setDeletedId(String deletedId) { + this.deletedId = deletedId; + } + + public String getUsernameId() { + return usernameId; + } + + public void setUsernameId(String usernameId) { + this.usernameId = usernameId; + } + + public String getPwdId() { + return pwdId; + } + + public void setPwdId(String pwdId) { + this.pwdId = pwdId; + } + + public String getAvatarId() { + return avatarId; + } + + public void setAvatarId(String avatarId) { + this.avatarId = avatarId; + } + + public String getRouteId() { + return routeId; + } + + public void setRouteId(String routeId) { + this.routeId = routeId; + } + + public boolean isEnebled() { + return enebled; + } + + public void setEnebled(boolean enebled) { + this.enebled = enebled; + } + + public boolean isDisabled() { + return disabled; + } + + public void setDisabled(boolean disabled) { + this.disabled = disabled; + } + + public boolean isDeleted() { + return deleted; + } + + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } + + public boolean isUsername() { + return username; + } + + public void setUsername(boolean username) { + this.username = username; + } + + public boolean isPwd() { + return pwd; + } + + public void setPwd(boolean pwd) { + this.pwd = pwd; + } + + public boolean isAvatar() { + return avatar; + } + + public void setAvatar(boolean avatar) { + this.avatar = avatar; + } + + public boolean isRoute() { + return route; + } + + public void setRoute(boolean route) { + this.route = route; + } + + public String getUserType() { + return userType; + } + + public void setUserType(String userType) { + this.userType = userType; + } + + public boolean isCertifier() { + return certifier; + } + + public void setCertifier(boolean certifier) { + this.certifier = certifier; + } + + public boolean isEnebledGrants() { + return enebledGrants; + } + + public void setEnebledGrants(boolean enebledGrants) { + this.enebledGrants = enebledGrants; + } + + public String getRouteSelectedId() { + return routeSelectedId; + } + + public void setRouteSelectedId(String routeSelectedId) { + this.routeSelectedId = routeSelectedId; + } + + public List getRouteCtlgLst() { + return routeCtlgLst; + } + + public void setRouteCtlgLst(List routeCtlgLst) { + this.routeCtlgLst = routeCtlgLst; + } + + public DualListModel getDualRouteCtlgLst() { + return dualRouteCtlgLst; + } + + public void setDualRouteCtlgLst(DualListModel dualRouteCtlgLst) { + this.dualRouteCtlgLst = dualRouteCtlgLst; + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/system/user/UserCreateBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/system/user/UserCreateBean.java new file mode 100644 index 0000000..997eb9e --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/system/user/UserCreateBean.java @@ -0,0 +1,428 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.system.user; + +import com.arrebol.apc.controller.system.user.UserCreateController; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.core.HumanResource; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.model.core.Permission; +import com.arrebol.apc.model.core.User; +import com.arrebol.apc.model.core.UserByOffice; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.ApplicationOwner; +import com.arrebol.apc.model.enums.HumanResourceStatus; +import com.arrebol.apc.model.enums.UserByOfficeStatus; +import com.arrebol.apc.model.enums.UserStatus; +import com.arrebol.apc.model.enums.UserType; +import com.arrebol.apc.security.APCSecure; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.primefaces.model.DualListModel; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Named +@ViewScoped +public class UserCreateBean extends GenericBean implements Serializable { + + /** + * 1) Verifica que el usuario aun este disponible 2) Verifica que tipo de + * usuario se va a crear y en todos los casos se debera de guardar usuario y + * oficina más las carecteristicas propias de cada tipo de usuario: A) WEB + * debe guardar permisos B) MOBILE debe guardar rutas C) BOTH debe guardar + * rutas y permisos. + */ + public void saveUser() { + logger.debug("saveUser"); + + try { + FacesMessage.Severity severity = FacesMessage.SEVERITY_WARN; + String messafeFormat = getBundlePropertyFile().getString("message.format.failure"); + String messageTitle = getBundlePropertyFile().getString("user"); + String messageAction = getBundlePropertyFile().getString("available"); + + if (null != getUserType() && (getUserType().equals("MOBILE") || getUserType().equals("BOTH"))) { + getUser().setCertifier(isCertifier() ? ActiveStatus.ENEBLED : ActiveStatus.DISABLED); + getUser().setManagement(isManagement()? ActiveStatus.ENEBLED : ActiveStatus.DISABLED); + } else { + getUser().setCertifier(ActiveStatus.DISABLED); + getUser().setManagement(ActiveStatus.DISABLED); + } + + getUser().setPassword(new APCSecure(APP, getPwdConfirm()).getPassword()); + getUser().setHumanResource(new HumanResource(getIdHRSelected())); + getUser().setApplicationOwner(ApplicationOwner.APP_USER); + getUser().setUserStatus(UserStatus.ENEBLED); + getUser().setUserType(UserType.valueOf(getUserType())); + getUser().setCreatedBy(getLoggedUser().getUser().getId()); + + List selectedRoutes = new ArrayList<>(); + List selectedPermissions = new ArrayList<>(); + + if (UserType.MOBILE.equals(getUser().getUserType()) + || UserType.BOTH.equals(getUser().getUserType())) { + selectedRoutes.addAll(getDualRouteCtlgLst().getTarget()); + } + + if (UserType.WEB.equals(getUser().getUserType()) + || UserType.BOTH.equals(getUser().getUserType())) { + selectedPermissions.addAll(getDualPermissionLst().getTarget()); + } + + if (isAvailableUserName()) { + messageAction = getBundlePropertyFile().getString("created"); + + setUserByOffice( + new UserByOffice( + new Office(getLoggedUser().getOffice().getId()), + UserByOfficeStatus.ENEBLED, + ApplicationOwner.APP_USER, + getLoggedUser().getUser().getId(), + new Date() + ) + ); + + if (getController().saveUserController(getUser(), getUserByOffice(), selectedRoutes, selectedPermissions)) { + messafeFormat = getBundlePropertyFile().getString("message.format.sucess"); + severity = FacesMessage.SEVERITY_INFO; + cleanForm(); + } else { + severity = FacesMessage.SEVERITY_WARN; + } + } + + Object[] param = {messageTitle, messageAction}; + + buildAndSendMessage(param, messafeFormat, severity, messageTitle); + } catch (Exception e) { + logger.error("saveUser", e); + Object[] param = {getBundlePropertyFile().getString("created")}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + getBundlePropertyFile().getString("user") + ); + } + } + + /** + * + */ + private void savePermission() { + logger.debug("savePermission"); + + String messafeFormat = getBundlePropertyFile().getString("message.format.fatal"); + String messageTitle = getBundlePropertyFile().getString("user"); + String messageAction = getBundlePropertyFile().getString("updated"); + + FacesMessage.Severity severity = FacesMessage.SEVERITY_FATAL; + try { + if (!isUpdatePermissions()) { + if (getController().saveManyController(dualPermissionLst.getTarget(), getUserByOffice().getId(), getLoggedUser().getUser().getId())) { + setUpdatePermissions(true); + + messafeFormat = getBundlePropertyFile().getString("message.format.sucess"); + severity = FacesMessage.SEVERITY_INFO; + } else { + messafeFormat = getBundlePropertyFile().getString("message.format.failure"); + severity = FacesMessage.SEVERITY_WARN; + } + } else { + if (getController().updatePermissionsController(dualPermissionLst.getTarget(), getUserByOffice().getId(), getLoggedUser().getUser().getId())) { + setUpdatePermissions(true); + + messafeFormat = getBundlePropertyFile().getString("message.format.sucess"); + severity = FacesMessage.SEVERITY_INFO; + } else { + messafeFormat = getBundlePropertyFile().getString("message.format.failure"); + severity = FacesMessage.SEVERITY_WARN; + } + } + Object[] param = {messageTitle, messageAction}; + + buildAndSendMessage(param, messafeFormat, severity, messageTitle); + } catch (Exception e) { + logger.error("savePermission", e); + Object[] param = {messageAction}; + + buildAndSendMessage(param, messafeFormat, severity, messageTitle); + } + } + + /** + * + */ + public void isUsernameAvailable() { + logger.debug("isUsernameAvailable"); + try { + if (null != getUser().getUserName() + && getUser().getUserName().trim().length() >= 5 + && getController().isUsernameAvailableController(getUser().getUserName(), getLoggedUser().getOffice().getId())) { + setAvailableUserName(true); + } else { + setAvailableUserName(false); + } + } catch (Exception e) { + logger.error("isUsernameAvailable", e); + Object[] param = {getBundlePropertyFile().getString("searching")}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + getBundlePropertyFile().getString("user")); + } + } + + /** + * SE TIENE QUE ACTUALIZAR A SOLO MOSTRAR TODAS LAS RUTAS + */ + public void onUserTypeSlctChange() { + if (null == getUserType() || getUserType().equals("WEB") || getUserType().equals("N/A")) { + setCertifier(false); + setManagement(false); + setDualRouteCtlgLst(new DualListModel<>(new ArrayList<>(), new ArrayList<>())); + } else if (getUserType().equals("BOTH") || getUserType().equals("MOBILE")) { + try { + setDualRouteCtlgLst(new DualListModel<>(controller.findRoutesByOffice(getLoggedUser().getOffice().getId()), new ArrayList<>())); + } catch (Exception ex) { + setDualRouteCtlgLst(new DualListModel<>(new ArrayList<>(), new ArrayList<>())); + logger.error("onUserTypeSlctChange", ex); + } + } + } + + private void cleanForm() { + logger.info("cleanForm"); + try { + setIdHRSelected(null); + setUser(null); + setCertifier(false); + setManagement(false); + setUserType("N/A"); + setPwdConfirm(""); + List source = getController().getAllActivePermissionController(); + List target = new ArrayList<>(); + + setDualPermissionLst(new DualListModel<>(source, target)); + + loadHumanResourcesAvailables(); + setDualRouteCtlgLst(new DualListModel<>(new ArrayList<>(), new ArrayList<>())); + } catch (Exception e) { + logger.error("cleanForm", e); + } + } + + private void loadHumanResourcesAvailables() { + try { + setHumanResourcesAvailables( + getController().findAllHRsWithoutUser( + new Office(getLoggedUser().getOffice().getId()), + HumanResourceStatus.ENEBLED + ) + ); + } catch (Exception e) { + logger.error("loadHumanResourcesAvailables", e); + } + } + + private static final long serialVersionUID = 1501878035779416819L; + final Logger logger = LogManager.getLogger(UserCreateBean.class); + + private UserCreateController controller; + private User user; + private List roles; + private String pwdConfirm; + private boolean availableUserName; + private String role; + private DualListModel dualPermissionLst; + private boolean updatePermissions; + private List humanResourcesAvailables; + private String idHRSelected; + private UserByOffice userByOffice; + private String userType; + private boolean certifier; + private boolean management; + + private DualListModel dualRouteCtlgLst; + + @PostConstruct + public void init() { + try { + loadBundlePropertyFile(); + + setController(new UserCreateController()); + + List source = getController().getAllActivePermissionController(); + List target = new ArrayList<>(); + + setDualPermissionLst(new DualListModel<>(source, target)); + + loadHumanResourcesAvailables(); + setDualRouteCtlgLst(new DualListModel<>(new ArrayList<>(), new ArrayList<>())); + } catch (Exception e) { + logger.error("init", e); + } + } + + @PreDestroy + public void finish() { + setUser(null); + setHumanResourcesAvailables(null); + setDualPermissionLst(null); + setController(null); + } + + public UserCreateController getController() { + return controller; + } + + public void setController(UserCreateController controller) { + this.controller = controller; + } + + public User getUser() { + if (null == user) { + user = new User(); + } + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public List getRoles() { + if (null == roles) { + /* + roles = Stream.of( + HumanResourceType.values()) + .map(Enum::name) + .collect(Collectors.toList() + ); + */ + } + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } + + public String getPwdConfirm() { + return pwdConfirm; + } + + public void setPwdConfirm(String pwdConfirm) { + this.pwdConfirm = pwdConfirm; + } + + public boolean isAvailableUserName() { + return availableUserName; + } + + public void setAvailableUserName(boolean availableUserName) { + this.availableUserName = availableUserName; + } + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + public DualListModel getDualPermissionLst() { + return dualPermissionLst; + } + + public void setDualPermissionLst(DualListModel dualPermissionLst) { + this.dualPermissionLst = dualPermissionLst; + } + + public boolean isUpdatePermissions() { + return updatePermissions; + } + + public void setUpdatePermissions(boolean updatePermissions) { + this.updatePermissions = updatePermissions; + } + + public List getHumanResourcesAvailables() { + return humanResourcesAvailables; + } + + public void setHumanResourcesAvailables(List humanResourcesAvailables) { + this.humanResourcesAvailables = humanResourcesAvailables; + } + + public String getIdHRSelected() { + return idHRSelected; + } + + public void setIdHRSelected(String idHRSelected) { + this.idHRSelected = idHRSelected; + } + + public UserByOffice getUserByOffice() { + return userByOffice; + } + + public void setUserByOffice(UserByOffice userByOffice) { + this.userByOffice = userByOffice; + } + + public String getUserType() { + return userType; + } + + public void setUserType(String userType) { + this.userType = userType; + } + + public boolean isCertifier() { + return certifier; + } + + public void setCertifier(boolean certifier) { + this.certifier = certifier; + } + + public boolean isManagement() { + return management; + } + + public void setManagement(boolean management) { + this.management = management; + } + + public DualListModel getDualRouteCtlgLst() { + return dualRouteCtlgLst; + } + + public void setDualRouteCtlgLst(DualListModel dualRouteCtlgLst) { + this.dualRouteCtlgLst = dualRouteCtlgLst; + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/system/user/UserUpdateBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/system/user/UserUpdateBean.java new file mode 100644 index 0000000..e7a2632 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/system/user/UserUpdateBean.java @@ -0,0 +1,663 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.system.user; + +import com.arrebol.apc.controller.system.user.UserUpdateController; +import com.arrebol.apc.model.catalog.RouteCtlg; +import com.arrebol.apc.model.core.Permission; +import com.arrebol.apc.model.core.UserByOffice; +import com.arrebol.apc.model.enums.ActiveStatus; +import com.arrebol.apc.model.enums.PermissionType; +import com.arrebol.apc.model.enums.UserStatus; +import com.arrebol.apc.model.enums.UserType; +import com.arrebol.apc.security.APCSecure; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.primefaces.model.DualListModel; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Named +@ViewScoped +public class UserUpdateBean extends GenericBean implements Serializable { + + public void onClickUpdateUserBtn() { + logger.info("onClickUpdateUserBtn"); + try { + FacesMessage.Severity severity = FacesMessage.SEVERITY_WARN; + + String messafeFormat = getBundlePropertyFile().getString("message.format.failure"); + String messageTitle = getBundlePropertyFile().getString("user"); + String messageAction = getBundlePropertyFile().getString("updated"); + + UserType userType = UserType.valueOf(getIdUserType()); + getUserByOfficeUpdateSelected().setCreatedBy(getLoggedUser().getUser().getId()); + + List routes = new ArrayList<>(); + List permissions = new ArrayList<>(); + ActiveStatus certifierUser = ActiveStatus.DISABLED; + ActiveStatus managementUser = ActiveStatus.DISABLED; + + + switch (userType) { + case WEB: + permissions.addAll(getGeneralPublicPermissionLst()); + permissions.addAll(getDualPermissionLst().getTarget()); + break; + case MOBILE: + routes = getDualRouteCtlgLst().getTarget(); + certifierUser = isCertifier() ? ActiveStatus.ENEBLED : ActiveStatus.DISABLED; + managementUser = isManagment() ? ActiveStatus.ENEBLED : ActiveStatus.DISABLED; + break; + case BOTH: + permissions.addAll(getGeneralPublicPermissionLst()); + permissions.addAll(getDualPermissionLst().getTarget()); + + routes = getDualRouteCtlgLst().getTarget(); + certifierUser = isCertifier() ? ActiveStatus.ENEBLED : ActiveStatus.DISABLED; + managementUser = isManagment() ? ActiveStatus.ENEBLED : ActiveStatus.DISABLED; + break; + } + + if (getController().updateUser(userType, getUserByOfficeUpdateSelected(), routes, permissions, certifierUser,managementUser)) { + severity = FacesMessage.SEVERITY_INFO; + messafeFormat = getBundlePropertyFile().getString("message.format.sucess"); + + cleanFormFields(); + refreshUserEnebledLst(); + } + + Object[] param = {messageTitle, messageAction}; + setAllowU(true); + + buildAndSendMessage(param, messafeFormat, severity, messageTitle); + } catch (Exception e) { + logger.error("onClickUpdateUserBtn", e); + Object[] param = {getBundlePropertyFile().getString("updated")}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + getBundlePropertyFile().getString("user") + ); + } + } + + /** + * + */ + public void onClickOtherActionsBtn() { + logger.info("onClickUpdateUserBtn"); + try { + FacesMessage.Severity severity = FacesMessage.SEVERITY_WARN; + + String messafeFormat = getBundlePropertyFile().getString("message.format.failure"); + String messageTitle = getBundlePropertyFile().getString("user"); + String messageAction = getBundlePropertyFile().getString("updated"); + boolean goAhead = false; + UserStatus userStatus = null; + + switch (getAction()) { + case "N/A": + break; + case "pwd": + setPwd(new APCSecure(APP, getPwdConfirm()).getPassword()); + goAhead = true; + break; + case "usr": + isUsernameAvailable(); + goAhead = isAvailableUserName(); + break; + default: + userStatus = UserStatus.valueOf(getAction().toUpperCase()); + goAhead = true; + break; + } + + if (goAhead + && getController().updateUserOtherActions( + getAction(), + getUsrOtherActionSelected().getUser().getId(), + userStatus, getPwd(), + getUserName(), + getLoggedUser().getUser().getId() + )) { + severity = FacesMessage.SEVERITY_INFO; + messafeFormat = getBundlePropertyFile().getString("message.format.sucess"); + + cleanOtherActionsFormFields(); + refreshUserEnebledLst(); + } + + Object[] param = {messageTitle, messageAction}; + + buildAndSendMessage(param, messafeFormat, severity, messageTitle); + } catch (Exception e) { + logger.error("onClickOtherActionsBtn", e); + Object[] param = {getBundlePropertyFile().getString("updated")}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + getBundlePropertyFile().getString("user") + ); + } + } + + /** + * + */ + public void onUsrEnebledSlctChange() { + logger.info("onUsrEnebledSlctChange"); + if(getUserByOfficeUpdateSelected()==null){ + cleanFormFields(); + setAllowU(true); + return; + } + try { + cleanFormFields(); + setIdUserType(getUserByOfficeUpdateSelected().getUser().getUserType().toString()); + fillUBOData(); + } catch (Exception e) { + logger.error("onUsrEnebledSlctChange", e); + } + } + + /** + * + */ + public void onUserTypeSlctChange() { + logger.info("onUserTypeSlctChange"); + try { + fillUBOData(); + + switch (getUserByOfficeUpdateSelected().getUser().getUserType()) { + //Si USUARIO es WEB y selecciona tipo web no se debe hacer nada + //Si USUARIO es WEB y selecciona tipo mobile, se deberá cargar rutas + //Si USUARIO es WEB y seleccion tipo both, se deberà cargar rutas + case WEB: + if ("MOBILE".equals(getIdUserType()) + || "BOTH".equals(getIdUserType())) { + setDualRouteCtlgLst(new DualListModel<>(getGeneralRouteCtlgLst(), new ArrayList<>())); + } + break; + //Si USUARIO es MOBILE y selecciona tipo web, se debe cargar permisos privados + //Si USUARIO es MOBILE y selecciona tipo mobile, hacer nada + //Si USUARIO es MOBILE y seleccion tipo both, se debe cargar permisos privados + case MOBILE: + if ("WEB".equals(getIdUserType()) + || "BOTH".equals(getIdUserType())) { + setDualPermissionLst(new DualListModel<>(getGeneralPrivatePermissionLst(), new ArrayList<>())); + } + break; + } + } catch (Exception e) { + logger.error("onUserTypeSlctChange", e); + } + } + + /** + * + */ + public void onSelectedOtherUserAction() { + try { + boolean goAhead = true; + + List statuses = new ArrayList<>(); + + switch (getAction()) { + case "pwd": + statuses.add(UserStatus.ENEBLED); + statuses.add(UserStatus.DISABLED); + break; + case "usr": + statuses.add(UserStatus.ENEBLED); + statuses.add(UserStatus.DISABLED); + break; + case "enebled": + statuses.add(UserStatus.DISABLED); + break; + case "disabled": + statuses.add(UserStatus.ENEBLED); + break; + case "deleted": + statuses.add(UserStatus.ENEBLED); + statuses.add(UserStatus.DISABLED); + break; + default: + goAhead = false; + break; + } + + if (goAhead) { + setPwd(null); + setPwdConfirm(null); + setUserName(null); + setUsrOtherActionSelected(null); + setUsrOtherActionLst( + getController().findUsersInOfficeInStatuses( + statuses, + getLoggedUser().getOffice().getId(), + getLoggedUser().getUser().getId() + ) + ); + } else { + setUsrOtherActionLst(new ArrayList<>()); + } + } catch (Exception e) { + logger.error("enebledDisabledListener", e); + Object[] param = {getBundlePropertyFile().getString("searching")}; + + setUsrOtherActionLst(new ArrayList<>()); + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + getBundlePropertyFile().getString("user") + ); + } + } + + /** + * + */ + public void isUsernameAvailable() { + logger.debug("isUsernameAvailable"); + try { + if (null != getUserName() + && getUserName().trim().length() >= 5 + && getController().isUsernameAvailableController(getUserName(), getLoggedUser().getOffice().getId())) { + setAvailableUserName(true); + } else { + setAvailableUserName(false); + } + } catch (Exception e) { + logger.error("isUsernameAvailable", e); + Object[] param = {getBundlePropertyFile().getString("searching")}; + + buildAndSendMessage( + param, + getBundlePropertyFile().getString("message.format.fatal"), + FacesMessage.SEVERITY_FATAL, + getBundlePropertyFile().getString("user")); + } + } + + /** + * + */ + private void refreshUserEnebledLst() { + logger.info("refreshUserEnebledLst"); + try { + List statuses = new ArrayList<>(); + statuses.add(UserStatus.ENEBLED); + + setUserByOfficeUpdateSelected(null); + setUserEnebledLst( + getController().findUsersInOfficeInStatuses( + statuses, + getLoggedUser().getOffice().getId(), + getLoggedUser().getUser().getId() + ) + ); + } catch (Exception e) { + logger.error("refreshUserEnebledLst", e); + setUserEnebledLst(new ArrayList<>()); + } + } + + /** + * + */ + private void fillUBOData() { + logger.debug("fillUBOData"); + try { + switch (getUserByOfficeUpdateSelected().getUser().getUserType()) { + // Bring all grants + case WEB: + setDualPermissionLst( + new DualListModel<>( + findAllPermissionsByUBO(false, false, getUserByOfficeUpdateSelected().getId()), + findAllPermissionsByUBO(false, true, getUserByOfficeUpdateSelected().getId()) + ) + ); + setCertifier(false); + break; + //Bring all routes + case MOBILE: + setDualRouteCtlgLst( + new DualListModel<>( + findAllRoutesByHRHR(true, false, getUserByOfficeUpdateSelected().getUser().getHumanResource().getId(), getLoggedUser().getOffice().getId()), + findAllRoutesByHRHR(true, true, getUserByOfficeUpdateSelected().getUser().getHumanResource().getId(), getLoggedUser().getOffice().getId()) + ) + ); + setCertifier(ActiveStatus.ENEBLED.equals(getUserByOfficeUpdateSelected().getUser().getCertifier())); + setManagment(ActiveStatus.ENEBLED.equals(getUserByOfficeUpdateSelected().getUser().getManagement())); + break; + // Bring all grants and routes + case BOTH: + setDualPermissionLst( + new DualListModel<>( + findAllPermissionsByUBO(false, false, getUserByOfficeUpdateSelected().getId()), + findAllPermissionsByUBO(false, true, getUserByOfficeUpdateSelected().getId()) + ) + ); + setDualRouteCtlgLst( + new DualListModel<>( + findAllRoutesByHRHR(true, false, getUserByOfficeUpdateSelected().getUser().getHumanResource().getId(), getLoggedUser().getOffice().getId()), + findAllRoutesByHRHR(true, true, getUserByOfficeUpdateSelected().getUser().getHumanResource().getId(), getLoggedUser().getOffice().getId()) + ) + ); + setCertifier(ActiveStatus.ENEBLED.equals(getUserByOfficeUpdateSelected().getUser().getCertifier())); + setManagment(ActiveStatus.ENEBLED.equals(getUserByOfficeUpdateSelected().getUser().getManagement())); + break; + } + + setAllowU(false); + } catch (Exception e) { + logger.error("fillUBOData", e); + } + } + + /** + * Find all permissions that has assigned the User By Office selected. + * + * @param uboId User By Office Identification number. + * @return + */ + private List findAllPermissionsByUBO(boolean isRuoute, boolean in, String uboId) { + logger.info("findAllPermissionsByUBO"); + List results = new ArrayList<>(); + + try { + results = getController().findList(isRuoute, in, uboId, null, null); + } catch (Exception e) { + logger.error("findAllPermissionsByUBO", e); + } + return results; + } + + /** + * Find all routes that has assigned the User By Office selected. + * + * @param hrhrId Human Resources Has Route Identification number. + * @param officeId + * @return + */ + private List findAllRoutesByHRHR(boolean isRuoute, boolean in, String hrhrId, String officeId) { + logger.info("findAllRoutesByHRHR"); + List results = new ArrayList<>(); + + try { + results = getController().findList(isRuoute, in, null, hrhrId, officeId); + } catch (Exception e) { + logger.error("findAllRoutesByHRHR", e); + } + return results; + } + + /** + * Clean all forms fields values + */ + private void cleanFormFields() { + logger.info("clean"); + try { + setIdUserType("N/A"); + setCertifier(false); + setDualPermissionLst(new DualListModel<>(new ArrayList<>(), new ArrayList<>())); + setDualRouteCtlgLst(new DualListModel<>(new ArrayList<>(), new ArrayList<>())); + } catch (Exception e) { + logger.error("clean", e); + } + } + + /** + * + */ + private void cleanOtherActionsFormFields() { + logger.info("cleanOtherActionsFormFields"); + try { + setAction("N/A"); + setUsrOtherActionSelected(null); + setUserName(null); + setPwd(null); + setPwdConfirm(null); + } catch (Exception e) { + logger.error("cleanOtherActionsFormFields", e); + } + } + + private static final long serialVersionUID = -3695498920999228355L; + final Logger logger = LogManager.getLogger(UserUpdateBean.class); + + @PostConstruct + public void init() { + try { + loadBundlePropertyFile(); + + List statuses = new ArrayList<>(); + List types = new ArrayList<>(); + + types.add(PermissionType.PRIVATE); + statuses.add(UserStatus.ENEBLED); + + setController(new UserUpdateController()); + setUserEnebledLst(getController().findUsersInOfficeInStatuses(statuses, getLoggedUser().getOffice().getId(), getLoggedUser().getUser().getId())); + setGeneralRouteCtlgLst(getController().findGeneralList(true, null, getLoggedUser().getOffice().getId())); + setGeneralPrivatePermissionLst(getController().findGeneralList(false, types, null)); + + types.clear(); + types.add(PermissionType.PUBLIC); + + setGeneralPublicPermissionLst(getController().findGeneralList(false, types, null)); + + cleanFormFields(); + + allowU=true; + } catch (Exception e) { + logger.error("init", e); + } + } + + private UserUpdateController controller; + private List userEnebledLst; + private UserByOffice userByOfficeUpdateSelected; + private DualListModel dualPermissionLst; + private DualListModel dualRouteCtlgLst; + private boolean refresh; + private String idUserType; + private boolean certifier; + private boolean managment; + private boolean allowU; + private List generalPrivatePermissionLst; + private List generalPublicPermissionLst; + private List generalRouteCtlgLst; + private String action; + private List usrOtherActionLst; + private UserByOffice usrOtherActionSelected; + private boolean availableUserName; + private String userName; + private String pwd; + private String pwdConfirm; + + public UserUpdateController getController() { + return controller; + } + + public void setController(UserUpdateController controller) { + this.controller = controller; + } + + public List getUserEnebledLst() { + return userEnebledLst; + } + + public void setUserEnebledLst(List userEnebledLst) { + this.userEnebledLst = userEnebledLst; + } + + public UserByOffice getUserByOfficeUpdateSelected() { + return userByOfficeUpdateSelected; + } + + public void setUserByOfficeUpdateSelected(UserByOffice userByOfficeUpdateSelected) { + this.userByOfficeUpdateSelected = userByOfficeUpdateSelected; + } + + public DualListModel getDualPermissionLst() { + return dualPermissionLst; + } + + public void setDualPermissionLst(DualListModel dualPermissionLst) { + this.dualPermissionLst = dualPermissionLst; + } + + public DualListModel getDualRouteCtlgLst() { + return dualRouteCtlgLst; + } + + public void setDualRouteCtlgLst(DualListModel dualRouteCtlgLst) { + this.dualRouteCtlgLst = dualRouteCtlgLst; + } + + public boolean isRefresh() { + return refresh; + } + + public void setRefresh(boolean refresh) { + this.refresh = refresh; + } + + public String getIdUserType() { + return idUserType; + } + + public void setIdUserType(String idUserType) { + this.idUserType = idUserType; + } + + public boolean isCertifier() { + return certifier; + } + + public void setCertifier(boolean certifier) { + this.certifier = certifier; + } + + public boolean isManagment() { + return managment; + } + + public void setManagment(boolean managment) { + this.managment = managment; + } + + public boolean isAllowU() { + return allowU; + } + + public void setAllowU(boolean allowU) { + this.allowU = allowU; + } + + + + + public List getGeneralPrivatePermissionLst() { + return generalPrivatePermissionLst; + } + + public void setGeneralPrivatePermissionLst(List generalPrivatePermissionLst) { + this.generalPrivatePermissionLst = generalPrivatePermissionLst; + } + + public List getGeneralPublicPermissionLst() { + return generalPublicPermissionLst; + } + + public void setGeneralPublicPermissionLst(List generalPublicPermissionLst) { + this.generalPublicPermissionLst = generalPublicPermissionLst; + } + + public List getGeneralRouteCtlgLst() { + return generalRouteCtlgLst; + } + + public void setGeneralRouteCtlgLst(List generalRouteCtlgLst) { + this.generalRouteCtlgLst = generalRouteCtlgLst; + } + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public List getUsrOtherActionLst() { + return usrOtherActionLst; + } + + public void setUsrOtherActionLst(List usrOtherActionLst) { + this.usrOtherActionLst = usrOtherActionLst; + } + + public UserByOffice getUsrOtherActionSelected() { + return usrOtherActionSelected; + } + + public void setUsrOtherActionSelected(UserByOffice usrOtherActionSelected) { + this.usrOtherActionSelected = usrOtherActionSelected; + } + + public boolean isAvailableUserName() { + return availableUserName; + } + + public void setAvailableUserName(boolean availableUserName) { + this.availableUserName = availableUserName; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getPwd() { + return pwd; + } + + public void setPwd(String pwd) { + this.pwd = pwd; + } + + public String getPwdConfirm() { + return pwdConfirm; + } + + public void setPwdConfirm(String pwdConfirm) { + this.pwdConfirm = pwdConfirm; + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/topbar/PrivacyBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/topbar/PrivacyBean.java new file mode 100644 index 0000000..5a9bfb2 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/topbar/PrivacyBean.java @@ -0,0 +1,119 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.topbar; + +import com.arrebol.apc.controller.topbar.PrivacyController; +import com.arrebol.apc.security.APCSecure; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import javax.annotation.PostConstruct; +import javax.faces.application.FacesMessage; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Named +@ViewScoped +public class PrivacyBean extends GenericBean implements Serializable { + + /** + * + */ + public void updatePassword() { + String messafeFormat = getBundlePropertyFile().getString("message.format.fatal"); + String messageTitle = getBundlePropertyFile().getString("user"); + String messageAction = getBundlePropertyFile().getString("modified"); + + FacesMessage.Severity severity = FacesMessage.SEVERITY_FATAL; + try { + if (validatePwd() && getController().updatePasswordByUserId(new APCSecure(APP, getPwd()).getPassword(), getLoggedUser().getUser().getId())) { + + messageTitle = getBundlePropertyFile().getString("password"); + messafeFormat = getBundlePropertyFile().getString("message.format.sucess"); + severity = FacesMessage.SEVERITY_INFO; + } else { + messageTitle = getBundlePropertyFile().getString("password"); + messafeFormat = getBundlePropertyFile().getString("message.format.failure"); + severity = FacesMessage.SEVERITY_WARN; + } + + Object[] param = {messageTitle, messageAction}; + + buildAndSendMessage(param, messafeFormat, severity, messageTitle); + } catch (Exception e) { + logger.error("savePermission", e); + Object[] param = {messageAction}; + + buildAndSendMessage(param, messafeFormat, severity, messageTitle); + } + } + + @PostConstruct + public void init() { + try { + loadBundlePropertyFile(); + setController(new PrivacyController()); + } catch (Exception e) { + logger.error("init", e); + } + } + + /** + * + * @return + */ + private boolean validatePwd() { + boolean isValidPwd = false; + try { + if (getPwd().trim().length() > 4) { + isValidPwd = true; + } + } catch (Exception e) { + logger.error("validatePwd", e); + } + return isValidPwd; + } + + private static final long serialVersionUID = 9192662395164473848L; + + final Logger logger = LogManager.getLogger(PrivacyBean.class); + + private PrivacyController controller; + private String pwd; + private String confirmPwd; + + public PrivacyController getController() { + return controller; + } + + public void setController(PrivacyController controller) { + this.controller = controller; + } + + public String getPwd() { + return pwd; + } + + public void setPwd(String pwd) { + this.pwd = pwd; + } + + public String getConfirmPwd() { + return confirmPwd; + } + + public void setConfirmPwd(String confirmPwd) { + this.confirmPwd = confirmPwd; + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/beans/topbar/TopBarBean.java b/apc-web/src/main/java/com/arrebol/apc/web/beans/topbar/TopBarBean.java new file mode 100644 index 0000000..06082f2 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/beans/topbar/TopBarBean.java @@ -0,0 +1,64 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.beans.topbar; + +import com.arrebol.apc.controller.topbar.TopBarController; +import com.arrebol.apc.model.core.Office; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Named +@ViewScoped +public class TopBarBean extends GenericBean implements Serializable { + + private static final long serialVersionUID = -410735400441974978L; + final Logger logger = LogManager.getLogger(TopBarBean.class); + + private TopBarController controller; + private List offices; + + @PostConstruct + public void init() { + try { + loadBundlePropertyFile(); + + setController(new TopBarController()); + //setLoggedUser(getController().findUserLogged(userByOffice)); + setOffices(getController().findAllOfficesByUserController(getLoggedUser().getUser().getId())); + } catch (Exception e) { + logger.error("Topbar init", e); + } + } + + public TopBarController getController() { + return controller; + } + + public void setController(TopBarController controller) { + this.controller = controller; + } + + public List getOffices() { + return offices; + } + + public void setOffices(List offices) { + this.offices = offices; + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/converters/GenericConverter.java b/apc-web/src/main/java/com/arrebol/apc/web/converters/GenericConverter.java new file mode 100644 index 0000000..280e1c5 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/converters/GenericConverter.java @@ -0,0 +1,41 @@ +package com.arrebol.apc.web.converters; + +import javax.faces.component.UIComponent; +import javax.faces.context.FacesContext; +import javax.faces.convert.Converter; +import javax.faces.convert.FacesConverter; +import org.primefaces.component.picklist.PickList; +import org.primefaces.model.DualListModel; + +/** + * + * @author Carlos Janitzio Zavala Lopez. + */ +@FacesConverter("genericConverter") +public class GenericConverter implements Converter { + + @Override + public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) { + PickList p = (PickList) component; + DualListModel dl = (DualListModel) p.getValue(); + for (int i = 0; i < dl.getSource().size(); i++) { + if (dl.getSource().get(i).toString().contentEquals(submittedValue)) { + return dl.getSource().get(i); + } + } + for (int i = 0; i < dl.getTarget().size(); i++) { + if (dl.getTarget().get(i).toString().contentEquals(submittedValue)) { + return dl.getTarget().get(i); + } + } + return null; + } + + @Override + public String getAsString(FacesContext facesContext, UIComponent component, Object value) { + PickList p = (PickList) component; + DualListModel dl = (DualListModel) p.getValue(); + return value.toString(); + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/converters/PeopleConverter.java b/apc-web/src/main/java/com/arrebol/apc/web/converters/PeopleConverter.java new file mode 100644 index 0000000..ad50c9a --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/converters/PeopleConverter.java @@ -0,0 +1,44 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.converters; + +import com.arrebol.apc.model.catalog.People; +import javax.faces.application.FacesMessage; +import javax.faces.component.UIComponent; +import javax.faces.context.FacesContext; +import javax.faces.convert.Converter; +import javax.faces.convert.ConverterException; +import javax.faces.convert.FacesConverter; +import javax.inject.Named; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@Named +@FacesConverter(value = "peopleConverter", managed = true) +public class PeopleConverter implements Converter { + + @Override + public People getAsObject(FacesContext context, UIComponent component, String id) { + try { + return new People(id); + } catch (Exception e) { + throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error en búsqueda", "No se pudo obtener los datos de la persona búscada.")); + } + } + + @Override + public String getAsString(FacesContext context, UIComponent component, People value) { + if (value != null) { + return value.getId(); + } else { + return null; + } + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/converters/PerseonSearchConverter.java b/apc-web/src/main/java/com/arrebol/apc/web/converters/PerseonSearchConverter.java new file mode 100644 index 0000000..c509405 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/converters/PerseonSearchConverter.java @@ -0,0 +1,42 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.converters; + +import com.arrebol.apc.model.views.AdministrationPersonSerchView; +import javax.faces.application.FacesMessage; +import javax.faces.component.UIComponent; +import javax.faces.context.FacesContext; +import javax.faces.convert.Converter; +import javax.faces.convert.ConverterException; +import javax.faces.convert.FacesConverter; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@FacesConverter("perseonSearchConverter") +public class PerseonSearchConverter implements Converter { + + @Override + public AdministrationPersonSerchView getAsObject(FacesContext context, UIComponent component, String id) { + try { + return new AdministrationPersonSerchView(id); + } catch (Exception e) { + throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error en búsqueda", "No se pudo obtener los datos de la persona búscada.")); + } + } + + @Override + public String getAsString(FacesContext context, UIComponent component, AdministrationPersonSerchView value) { + if (value != null) { + return value.getId(); + } else { + return null; + } + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/converters/UserByOfficeConverter.java b/apc-web/src/main/java/com/arrebol/apc/web/converters/UserByOfficeConverter.java new file mode 100644 index 0000000..0b6f589 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/converters/UserByOfficeConverter.java @@ -0,0 +1,82 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.converters; + +import com.arrebol.apc.model.core.UserByOffice; +import java.util.List; +import javax.faces.application.FacesMessage; +import javax.faces.component.UIComponent; +import javax.faces.component.UISelectItem; +import javax.faces.component.UISelectItems; +import javax.faces.context.FacesContext; +import javax.faces.convert.Converter; +import javax.faces.convert.ConverterException; +import javax.faces.convert.FacesConverter; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@FacesConverter("userByOfficeConverter") +public class UserByOfficeConverter implements Converter { + + @Override + public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) { + try { + + if (!component.getChildren().isEmpty()) { + + for (final UIComponent chidren : component.getChildren()) { + if (chidren instanceof UISelectItems) { + return convertFromSelect(chidren, submittedValue); + } + } + } + return null; + } catch (Exception e) { + throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Usuario/s no validos")); + } + } + + @Override + public String getAsString(FacesContext fc, UIComponent uic, Object object) { + if (object != null) { + return String.valueOf(((UserByOffice) object).getId()); + } else { + return null; + } + } + + /** + * + * @param component + * @param submittedValue + * @return + */ + private Object convertFromSelect(UIComponent component, String submittedValue) { + if (component instanceof UISelectItem) { + final UISelectItem item = (UISelectItem) component; + final UserByOffice value = (UserByOffice) item.getValue(); + if (submittedValue.equals(value.getId())) { + return value; + } + } + if (component instanceof UISelectItems) { + UISelectItems items = (UISelectItems) component; + List elements = (List) items.getValue(); + + for (UserByOffice element : elements) { + if (submittedValue.equals(element.getId())) { + return element; + } + } + } + return null; + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/drive/DriverBean.java b/apc-web/src/main/java/com/arrebol/apc/web/drive/DriverBean.java new file mode 100644 index 0000000..3d6bacf --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/drive/DriverBean.java @@ -0,0 +1,589 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.drive; + +import com.arrebol.apc.controller.drive.DriverController; +import com.arrebol.apc.model.views.CobranzaWeekByUserView; +import com.arrebol.apc.model.views.ColocationWeekByUserView; +import com.arrebol.apc.model.views.InformationLoanWeekView; +import com.arrebol.apc.model.views.ResumeNewCustomerLastWeekView; +import com.arrebol.apc.model.views.ResumeNewCustomerWeekView; +import com.arrebol.apc.model.views.ResumenInOutWeekByUserView; +import com.arrebol.apc.model.views.ResumenTotalWeekView; +import com.arrebol.apc.model.views.SubtotalWeekByUserView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFFont; +import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.hssf.util.HSSFColor; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("driverManager") +@ViewScoped +public class DriverBean extends GenericBean implements Serializable, Datatable { + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + public DriverController getDriverCtrl() { + return driverCtrl; + } + + public void setDriverCtrl(DriverController driverCtrl) { + this.driverCtrl = driverCtrl; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public InformationLoanWeekView getSelectedData() { + return selectedData; + } + + public void setSelectedData(InformationLoanWeekView selectedData) { + this.selectedData = selectedData; + } + + public List getDataColocation() { + return dataColocation; + } + + public void setDataColocation(List dataColocation) { + this.dataColocation = dataColocation; + } + + public ColocationWeekByUserView getSelectedColocation() { + return selectedColocation; + } + + public void setSelectedColocation(ColocationWeekByUserView selectedColocation) { + this.selectedColocation = selectedColocation; + } + + public List getDataSubtotal() { + return dataSubtotal; + } + + public void setDataSubtotal(List dataSubtotal) { + this.dataSubtotal = dataSubtotal; + } + + public SubtotalWeekByUserView getSelectedSubtotal() { + return selectedSubtotal; + } + + public void setSelectedSubtotal(SubtotalWeekByUserView selectedSubtotal) { + this.selectedSubtotal = selectedSubtotal; + } + + public List getDataResumen() { + return dataResumen; + } + + public void setDataResumen(List dataResumen) { + this.dataResumen = dataResumen; + } + + public ResumenInOutWeekByUserView getSelectedResumen() { + return selectedResumen; + } + + public void setSelectedResumen(ResumenInOutWeekByUserView selectedResumen) { + this.selectedResumen = selectedResumen; + } + + public List getDataCobranza() { + return dataCobranza; + } + + public void setDataCobranza(List dataCobranza) { + this.dataCobranza = dataCobranza; + } + + public CobranzaWeekByUserView getSelectedCobranza() { + return selectedCobranza; + } + + public void setSelectedCobranza(CobranzaWeekByUserView selectedCobranza) { + this.selectedCobranza = selectedCobranza; + } + + public List getDataTotal() { + return dataTotal; + } + + public void setDataTotal(List dataTotal) { + this.dataTotal = dataTotal; + } + + public ResumenTotalWeekView getSelectedTotal() { + return selectedTotal; + } + + public void setSelectedTotal(ResumenTotalWeekView selectedTotal) { + this.selectedTotal = selectedTotal; + } + + public List getDataCtesNvos() { + return dataCtesNvos; + } + + public void setDataCtesNvos(List dataCtesNvos) { + this.dataCtesNvos = dataCtesNvos; + } + + public ResumeNewCustomerWeekView getSelectedCtesNvos() { + return selectedCtesNvos; + } + + public void setSelectedCtesNvos(ResumeNewCustomerWeekView selectedCtesNvos) { + this.selectedCtesNvos = selectedCtesNvos; + } + + public void paintDataXLS(Object document) { + HSSFWorkbook wb = (HSSFWorkbook) document; + HSSFSheet sheet = wb.getSheetAt(0); + HSSFRow header = sheet.getRow(0); + HSSFCellStyle cellStyle = wb.createCellStyle(); + HSSFFont font = wb.createFont(); + font.setBold(true); + cellStyle.setFont(font); + cellStyle.setBorderTop(BorderStyle.DOUBLE); + cellStyle.setBorderBottom(BorderStyle.DOUBLE); + cellStyle.setBorderLeft(BorderStyle.DOUBLE); + cellStyle.setBorderRight(BorderStyle.DOUBLE); + cellStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.LEMON_CHIFFON.getIndex()); + cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + short dataFormat = wb.createDataFormat().getFormat("$#,##0.00"); + + initCellStyle(wb); + + for (int i = 0; i < header.getPhysicalNumberOfCells(); i++) { + HSSFCell cell = header.getCell(i); + cell.setCellStyle(cellStyle); + } + + String aux = ""; + for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) { + HSSFRow row = sheet.getRow(i); + InformationLoanWeekView loanWeekData = data.get(i - 1); + HSSFCell cell; + String rowRenov = loanWeekData.getConditionRenovation(); + //cellStyleRow = getCellStyle(rowRenov); + // Row General + for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) { + cell = row.getCell(j); + cell.setCellStyle(getCellStyle(rowRenov)); + + if ((j >= 7 && j <= 22) || (j == 2 || j == 3)) { + cell.getCellStyle().setDataFormat(dataFormat); + aux = cell.getStringCellValue().replace("$", ""); + aux = aux.replace(",", ""); + cell.setCellValue(Double.parseDouble(aux)); + cell.setCellType(CellType.NUMERIC); + } + } + + // Lunes + cell = row.getCell(10); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionLunes())); + cell.getCellStyle().setDataFormat(dataFormat); + cell = row.getCell(11); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionLunes())); + cell.getCellStyle().setDataFormat(dataFormat); + + // Martes + cell = row.getCell(12); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionMartes())); + cell.getCellStyle().setDataFormat(dataFormat); + cell = row.getCell(13); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionMartes())); + cell.getCellStyle().setDataFormat(dataFormat); + + // Miércoles + cell = row.getCell(14); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionMiercoles())); + cell.getCellStyle().setDataFormat(dataFormat); + cell = row.getCell(15); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionMiercoles())); + cell.getCellStyle().setDataFormat(dataFormat); + + // Jueves + cell = row.getCell(16); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionJueves())); + cell.getCellStyle().setDataFormat(dataFormat); + cell = row.getCell(17); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionJueves())); + cell.getCellStyle().setDataFormat(dataFormat); + + // Viernes + cell = row.getCell(18); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionViernes())); + cell.getCellStyle().setDataFormat(dataFormat); + cell = row.getCell(19); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionViernes())); + cell.getCellStyle().setDataFormat(dataFormat); + + // Sábado + cell = row.getCell(20); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionSabado())); + cell.getCellStyle().setDataFormat(dataFormat); + cell = row.getCell(21); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionSabado())); + cell.getCellStyle().setDataFormat(dataFormat); + } + + String ruta = data.get(0).getRouteName(); + int regInsertados = 0; + + for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) { + //HSSFRow row = sheet.getRow(i); + //InformationLoanWeekView loanWeekData = data.get(i - 1 - regInsertados); + + if (!ruta.equalsIgnoreCase(data.get(i - 1 - regInsertados).getRouteName())) { + creaRegistroTotales(ruta, sheet, dataFormat, false, i); + ruta = data.get(i - 1 - regInsertados).getRouteName(); + regInsertados++; + } + } + creaRegistroTotales(ruta, sheet, dataFormat, true, sheet.getPhysicalNumberOfRows() + 1); + } + + private void creaRegistroTotales(String ruta, HSSFSheet sheet, short dataFormat, boolean lastRow, int i) { + HSSFRow r; + HSSFCell cellNew; + String rutaAux = ruta; + if (lastRow) { + r = sheet.createRow(sheet.getPhysicalNumberOfRows() + 1); + } else { + sheet.shiftRows(i, sheet.getLastRowNum(), 1, true, false); + r = sheet.createRow(i); + } + + // Apoyos + cellNew = r.createCell(3); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + BigDecimal suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux) && p.getWeekLoanDate() == p.getWeekCurrentDate())).map((py) -> py.getApoyos()).reduce(BigDecimal::add).isPresent() + ? data.stream().filter((p) -> (p.getRouteName().equals(rutaAux) && p.getWeekLoanDate() == p.getWeekCurrentDate())).map((py) -> py.getApoyos()).reduce(BigDecimal::add).get() + : BigDecimal.ZERO; + cellNew.setCellValue(suma.doubleValue()); + // Comsion por apertura + cellNew = r.createCell(4); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux) && p.getWeekLoanDate() == p.getWeekCurrentDate())).map((py) -> py.getComisionApertura()).reduce(BigDecimal::add).isPresent() + ? data.stream().filter((p) -> (p.getRouteName().equals(rutaAux) && p.getWeekLoanDate() == p.getWeekCurrentDate())).map((py) -> py.getComisionApertura()).reduce(BigDecimal::add).get() + : BigDecimal.ZERO; + cellNew.setCellValue(suma.doubleValue()); + + //Totales + cellNew = r.createCell(9); + cellNew.setCellType(CellType.STRING); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.setCellValue("TOTALES: "); + // Lunes + cellNew = r.createCell(10); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getPaymentMonday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + cellNew = r.createCell(11); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFeeMonday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + // Martes + cellNew = r.createCell(12); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getPaymentTuesday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + cellNew = r.createCell(13); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFeeTuesday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + // Miércoles + cellNew = r.createCell(14); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getPaymentWednesday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + cellNew = r.createCell(15); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFeeWednesday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + // Jueves + cellNew = r.createCell(16); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getPaymentThursday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + cellNew = r.createCell(17); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFeeThursday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + // Viernes + cellNew = r.createCell(18); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getPaymentFriday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + cellNew = r.createCell(19); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFeeFriday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + // Sábado + cellNew = r.createCell(20); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getPaymentSaturday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + cellNew = r.createCell(21); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFeeSaturday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + // Faltante + cellNew = r.createCell(22); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFaltante()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + } + + private HSSFCellStyle getCellStyle(String cellStyleColor) { + if (cellStyleColor == null) { + cellStyleColor = "White"; + } + + switch (cellStyleColor) { + case "redRow": + return cellStyleRed; + case "greenRow": + return cellStyleGreen; + case "yellowRow": + return cellStyleYellow; + case "blueRow": + return cellStyleBlue; + case "blueLightRow": + return cellStyleBlueLight; + case "greenLigthRow": + return cellStyleGreenLight; + case "greenStrongRow": + return cellStyleGreenStrong; + case "greyRow": + return cellStyleGrey; + case "orangeRow": + return cellStyleOrange; + default: + return cellStyleWhite; + } + } + + private void initCellStyle(HSSFWorkbook wb) { + // MULTA + fontRed = wb.createFont(); + cellStyleRed = wb.createCellStyle(); + fontRed.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleRed.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleRed.setFillForegroundColor(IndexedColors.RED.getIndex()); + //cellStyleRed.setFont(fontRed); + + // ABONO 0 + fontGreen = wb.createFont(); + cellStyleGreen = wb.createCellStyle(); + fontGreen.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleGreen.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleGreen.setFillForegroundColor(IndexedColors.SEA_GREEN.getIndex()); + //cellStyleGreen.setFont(fontGreen); + + // ABONÓ MENOS + fontYellow = wb.createFont(); + cellStyleYellow = wb.createCellStyle(); + fontYellow.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleYellow.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleYellow.setFillForegroundColor(IndexedColors.LIGHT_YELLOW.getIndex()); + //cellStyleYellow.setFont(fontYellow); + + // ABONÓ DE MÃS + fontBlue = wb.createFont(); + cellStyleBlue = wb.createCellStyle(); + fontBlue.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleBlue.setFillPattern(FillPatternType.SOLID_FOREGROUND); + //cellStyleBlue.setFillForegroundColor(HSSFColor.HSSFColorPredefined.BLUE.getIndex()); + cellStyleBlue.setFillForegroundColor(IndexedColors.TURQUOISE.getIndex()); + //cellStyleBlue.setFont(fontBlue); + + // PAGO CONGELADO + fontBlueLight = wb.createFont(); + cellStyleBlueLight = wb.createCellStyle(); + fontBlueLight.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleBlueLight.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleBlueLight.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex()); + + // RENOVÓ + fontGreenLight = wb.createFont(); + cellStyleGreenLight = wb.createCellStyle(); + fontGreenLight.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleGreenLight.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleGreenLight.setFillForegroundColor(IndexedColors.BRIGHT_GREEN.getIndex()); + //cellStyleGreenLight.setFont(fontGreenLight); + + // getSaldoInsoluto == 0 + fontGreenStrong = wb.createFont(); + cellStyleGreenStrong = wb.createCellStyle(); + fontGreenStrong.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleGreenStrong.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleGreenStrong.setFillForegroundColor(IndexedColors.GREEN.getIndex()); + //cellStyleGreenStrong.setFont(fontGreenStrong); + + // CLIENTE NUEVO + fontOrange = wb.createFont(); + cellStyleOrange = wb.createCellStyle(); + fontOrange.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleOrange.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleOrange.setFillForegroundColor(IndexedColors.ORANGE.getIndex()); + //cellStyleGreenLight.setFont(fontGreenLight); + + // Totales + fontGrey = wb.createFont(); + cellStyleGrey = wb.createCellStyle(); + fontGrey.setColor(HSSFColor.HSSFColorPredefined.WHITE.getIndex()); + cellStyleGrey.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleGrey.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex()); + cellStyleGrey.setFont(fontGrey); + + cellStyleWhite = wb.createCellStyle(); + cellStyleWhite.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleWhite.setFillForegroundColor(HSSFColor.HSSFColorPredefined.WHITE.getIndex()); + } + + private DriverController driverCtrl; + private List data; + private InformationLoanWeekView selectedData; + + private List dataColocation; + private ColocationWeekByUserView selectedColocation; + + private List dataSubtotal; + private SubtotalWeekByUserView selectedSubtotal; + + private List dataResumen; + private ResumenInOutWeekByUserView selectedResumen; + + private List dataCobranza; + private CobranzaWeekByUserView selectedCobranza; + + private List dataTotal; + private ResumenTotalWeekView selectedTotal; + + private List dataCtesNvos; + private ResumeNewCustomerWeekView selectedCtesNvos; + + // Datos para pintar las celdas + HSSFCellStyle cellStyleRed; + HSSFFont fontRed; + HSSFCellStyle cellStyleGreen; + HSSFFont fontGreen; + HSSFCellStyle cellStyleYellow; + HSSFFont fontYellow; + HSSFCellStyle cellStyleBlue; + HSSFFont fontBlue; + HSSFCellStyle cellStyleBlueLight; + HSSFFont fontBlueLight; + HSSFCellStyle cellStyleGreenLight; + HSSFFont fontGreenLight; + HSSFCellStyle cellStyleGreenStrong; + HSSFFont fontGreenStrong; + HSSFCellStyle cellStyleOrange; + HSSFFont fontOrange; + HSSFCellStyle cellStyleWhite; + HSSFCellStyle cellStyleGrey; + HSSFFont fontGrey; + + @PostConstruct + public void init() { + driverCtrl = new DriverController(); + data = driverCtrl.getAllLoanThisWeekByOffice(getLoggedUser().getOffice().getId()); + dataColocation = driverCtrl.getAllColocationWeekByOffice(getLoggedUser().getOffice().getId()); + dataSubtotal = driverCtrl.getAllSubtotalThisWeekByOffice(getLoggedUser().getOffice().getId()); + dataResumen = driverCtrl.getAllResumenInOutThisWeekByOffice(getLoggedUser().getOffice().getId()); + dataCobranza = driverCtrl.getAllCobranzaThisWeekByOffice(getLoggedUser().getOffice().getId()); + dataTotal = driverCtrl.getAllResumenTotalWeekByOffice(getLoggedUser().getOffice().getId()); + + dataCtesNvos = driverCtrl.getAllResumenNewCustomerWeekByOffice(); + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/drive/DriverDateBean.java b/apc-web/src/main/java/com/arrebol/apc/web/drive/DriverDateBean.java new file mode 100644 index 0000000..b6812a3 --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/drive/DriverDateBean.java @@ -0,0 +1,871 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.drive; + +import com.arrebol.apc.controller.GenericController; +import com.arrebol.apc.controller.admin.LoanController; +import com.arrebol.apc.controller.drive.DriverController; +import com.arrebol.apc.model.enums.LoanDetailsType; +import com.arrebol.apc.model.loan.LoanDetails; +import com.arrebol.apc.model.views.CobranzaWeekByUserView; +import com.arrebol.apc.model.views.ColocationWeekByUserView; +import com.arrebol.apc.model.views.InformationLoanWeekView; +import com.arrebol.apc.model.views.ResumenInOutWeekByUserView; +import com.arrebol.apc.model.views.ResumenTotalWeekView; +import com.arrebol.apc.model.views.SubtotalWeekByUserView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import java.util.stream.Stream; +import javax.annotation.PostConstruct; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFFont; +import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.hssf.util.HSSFColor; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("driverDateManager") +@ViewScoped +public class DriverDateBean extends GenericBean implements Serializable, Datatable { + + public void searchLoanWeekByDate() { + try { + setData(fillDataTable()); + searchResumenDataWeekByDate(); + } catch (Exception e) { + } + } + + public List getDetails(String id) { + try { + loanDetails = loanCtrl.getLoanDetailsbyId(id); + getSaldoInsolutoAbono(); + } catch (Exception e) { + } + return null == loanDetails ? new ArrayList<>() : loanDetails; + } + + public void getSaldoInsolutoAbono( ) { + Double sumaAbonosAnteriores; + Double totalAPagar; + Double saldoInsoluto; + Double saldoMultas; + // + for (LoanDetails detail : loanDetails) { + sumaAbonosAnteriores = loanDetails.stream().filter(p -> p.getReferenceNumber() <= detail.getReferenceNumber() && !p.getLoanDetailsType().equals(LoanDetailsType.FEE) ) + .mapToDouble(LoanDetails::getAbonoD) + .sum(); + saldoMultas = loanDetails.stream().filter(p -> p.getReferenceNumber() <= detail.getReferenceNumber() && p.getLoanDetailsType().equals(LoanDetailsType.FEE)) + .mapToDouble(LoanDetails::getAbonoD) + .sum(); + + totalAPagar = detail.getLoan().getLoanType().getPaymentTotal().doubleValue(); + saldoInsoluto = totalAPagar - sumaAbonosAnteriores + saldoMultas; + + detail.setSaldoInsoluto(new BigDecimal(saldoInsoluto)); + } + } + + public void searchResumenDataWeekByDate() { + try { + SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); + String date = DATE_FORMAT.format(getStarDate()); + + dataColocation = driverCtrl.getAllColocationWeekByOfficeMySQLQuery(date, getLoggedUser().getOffice().getId()); + dataSubtotal = driverCtrl.getAllSubtotalThisWeekByOfficeMySQLQuery(date, getLoggedUser().getOffice().getId()); + dataResumen = driverCtrl.getAllResumenInOutThisWeekByOfficeMySQLQuery(date, getLoggedUser().getOffice().getId()); + dataCobranza = driverCtrl.getAllCobranzaThisWeekByOfficeMySQLQuery(date, getLoggedUser().getOffice().getId()); + dataTotal = driverCtrl.getAllResumenTotalWeekByOfficeMySQLQuery(date, getLoggedUser().getOffice().getId()); + } catch (Exception e) { + } + } + + public List fillDataTable() { + SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); + String starDate = ""; + if (getStarDate() != null) { + starDate = DATE_FORMAT.format(getStarDate()); + } + return getDriverCtrl().getAllLoanWeekByOfficeMySQLQuery(starDate, getLoggedUser().getOffice().getId()); + } + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + public DriverController getDriverCtrl() { + return driverCtrl; + } + + public void setDriverCtrl(DriverController driverCtrl) { + this.driverCtrl = driverCtrl; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public InformationLoanWeekView getSelectedData() { + return selectedData; + } + + public void setSelectedData(InformationLoanWeekView selectedData) { + this.selectedData = selectedData; + } + + public List getDataColocation() { + return dataColocation; + } + + public void setDataColocation(List dataColocation) { + this.dataColocation = dataColocation; + } + + public ColocationWeekByUserView getSelectedColocation() { + return selectedColocation; + } + + public void setSelectedColocation(ColocationWeekByUserView selectedColocation) { + this.selectedColocation = selectedColocation; + } + + public List getDataSubtotal() { + return dataSubtotal; + } + + public void setDataSubtotal(List dataSubtotal) { + this.dataSubtotal = dataSubtotal; + } + + public SubtotalWeekByUserView getSelectedSubtotal() { + return selectedSubtotal; + } + + public void setSelectedSubtotal(SubtotalWeekByUserView selectedSubtotal) { + this.selectedSubtotal = selectedSubtotal; + } + + public List getDataResumen() { + return dataResumen; + } + + public void setDataResumen(List dataResumen) { + this.dataResumen = dataResumen; + } + + public ResumenInOutWeekByUserView getSelectedResumen() { + return selectedResumen; + } + + public void setSelectedResumen(ResumenInOutWeekByUserView selectedResumen) { + this.selectedResumen = selectedResumen; + } + + public List getDataCobranza() { + return dataCobranza; + } + + public void setDataCobranza(List dataCobranza) { + this.dataCobranza = dataCobranza; + } + + public CobranzaWeekByUserView getSelectedCobranza() { + return selectedCobranza; + } + + public void setSelectedCobranza(CobranzaWeekByUserView selectedCobranza) { + this.selectedCobranza = selectedCobranza; + } + + public List getDataTotal() { + return dataTotal; + } + + public void setDataTotal(List dataTotal) { + this.dataTotal = dataTotal; + } + + public ResumenTotalWeekView getSelectedTotal() { + return selectedTotal; + } + + public void setSelectedTotal(ResumenTotalWeekView selectedTotal) { + this.selectedTotal = selectedTotal; + } + + public GenericController getGenericCtrl() { + return genericCtrl; + } + + public void setGenericCtrl(GenericController genericCtrl) { + this.genericCtrl = genericCtrl; + } + + public void paintDataXLS(Object document) { + HSSFWorkbook wb = (HSSFWorkbook) document; + HSSFSheet sheet = wb.getSheetAt(0); + HSSFRow header = sheet.getRow(0); + HSSFCellStyle cellStyle = wb.createCellStyle(); + HSSFFont font = wb.createFont(); + font.setBold(true); + cellStyle.setFont(font); + cellStyle.setBorderTop(BorderStyle.DOUBLE); + cellStyle.setBorderBottom(BorderStyle.DOUBLE); + cellStyle.setBorderLeft(BorderStyle.DOUBLE); + cellStyle.setBorderRight(BorderStyle.DOUBLE); + cellStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.LEMON_CHIFFON.getIndex()); + cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + short dataFormat = wb.createDataFormat().getFormat("$#,##0.00"); + + initCellStyle(wb); + HSSFCell cellNew; + + + for (int i = 0; i < header.getPhysicalNumberOfCells(); i++) { + HSSFCell cell = header.getCell(i); + cell.setCellStyle(cellStyle); + } + + String aux = ""; + for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) { + HSSFRow row = sheet.getRow(i); + InformationLoanWeekView loanWeekData = data.get(i - 1); + HSSFCell cell; + String rowRenov = loanWeekData.getConditionRenovation(); + //cellStyleRow = getCellStyle(rowRenov); + // Row General + for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) { + cell = row.getCell(j); + cell.setCellStyle(getCellStyle(rowRenov)); + + if ((j >= 5 && j <= 23) || (j == 2) || (j==3)) { + cell.getCellStyle().setDataFormat(dataFormat); + aux = cell.getStringCellValue().replace("$", ""); + aux = aux.replace(",", ""); + cell.setCellValue(Double.parseDouble(aux)); + cell.setCellType(CellType.NUMERIC); + } + } + + // Lunes + cell = row.getCell(9); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionLunes())); + cell.getCellStyle().setDataFormat(dataFormat); + cell = row.getCell(10); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionLunes())); + cell.getCellStyle().setDataFormat(dataFormat); + + // Martes + cell = row.getCell(11); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionMartes())); + cell.getCellStyle().setDataFormat(dataFormat); + cell = row.getCell(12); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionMartes())); + cell.getCellStyle().setDataFormat(dataFormat); + + // Miércoles + cell = row.getCell(13); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionMiercoles())); + cell.getCellStyle().setDataFormat(dataFormat); + cell = row.getCell(14); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionMiercoles())); + cell.getCellStyle().setDataFormat(dataFormat); + + // Jueves + cell = row.getCell(15); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionJueves())); + cell.getCellStyle().setDataFormat(dataFormat); + cell = row.getCell(16); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionJueves())); + cell.getCellStyle().setDataFormat(dataFormat); + + // Viernes + cell = row.getCell(17); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionViernes())); + cell.getCellStyle().setDataFormat(dataFormat); + cell = row.getCell(18); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionViernes())); + cell.getCellStyle().setDataFormat(dataFormat); + + // Sábado + cell = row.getCell(19); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionSabado())); + cell.getCellStyle().setDataFormat(dataFormat); + cell = row.getCell(20); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionSabado())); + cell.getCellStyle().setDataFormat(dataFormat); + + /* cell = row.createCell(24); + BigDecimal suma = loanWeekData.getPaymentMonday().add(loanWeekData.getPaymentTuesday().add(loanWeekData.getPaymentWednesday() + .add(loanWeekData.getPaymentThursday().add(loanWeekData.getPaymentFriday().add(loanWeekData.getPaymentSaturday()))))); + if (suma.compareTo(suma.subtract(loanWeekData.getFaltante())) != 0) { + cell.setCellStyle(getCellStyle("difRow")); + } + cell.setCellType(CellType.NUMERIC); + cell.setCellValue(suma.doubleValue()); + cell.getCellStyle().setDataFormat(dataFormat); + + cell = row.createCell(25); + if (suma.compareTo(suma.subtract(loanWeekData.getFaltante())) != 0) { + cell.setCellStyle(getCellStyle("difRow")); + } + cell.setCellType(CellType.NUMERIC); + BigDecimal dif = suma.subtract(loanWeekData.getFaltante()); + cell.setCellValue(dif.doubleValue()); + cell.getCellStyle().setDataFormat(dataFormat);*/ + } + + String ruta = data.get(0).getRouteName(); + int regInsertados = 0; + int regSize = sheet.getPhysicalNumberOfRows(); + + for (int i = 1; i < regSize; i++) { + if (!ruta.equalsIgnoreCase(data.get(i - 1 - regInsertados).getRouteName())) { + //creaRegistroTotalesGeneral(ruta, sheet, dataFormat, false, i); + creaRegistroTotales(ruta, sheet, dataFormat, false, i); + ruta = data.get(i - 1 - regInsertados).getRouteName(); + regInsertados++; + } + } + + ruta = data.get(0).getRouteName(); + regInsertados = 0; + int recorrido= 1; + for (int i = 1; i < regSize; i++) { + if (!ruta.equalsIgnoreCase(data.get(i - 1 - regInsertados).getRouteName())) { + creaRegistroTotalesGeneral(ruta, sheet, dataFormat, false, i+recorrido); + //creaRegistroTotales(ruta, sheet, dataFormat, false, i); + ruta = data.get(i - 1 - regInsertados).getRouteName(); + regInsertados++; + recorrido++; + } + } + + creaRegistroTotales(ruta, sheet, dataFormat, true, sheet.getPhysicalNumberOfRows() + 1); + creaRegistroTotalesGeneral(ruta, sheet, dataFormat, true, sheet.getPhysicalNumberOfRows() + 1); + + + } + + private void creaRegistroTotales(String ruta, HSSFSheet sheet, short dataFormat, boolean lastRow, int i) { + HSSFRow r; + HSSFCell cellNew; + String rutaAux = ruta; + if (lastRow) { + r = sheet.createRow(sheet.getPhysicalNumberOfRows() + 1); + } else { + sheet.shiftRows(i, sheet.getLastRowNum(), 1, true, false); + r = sheet.createRow(i); + } + + Calendar c2 = Calendar.getInstance(); + c2.setTime(getStarDate()); + int weekDate = c2.get(Calendar.WEEK_OF_YEAR); + + // Apoyos + cellNew = r.createCell(2); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + BigDecimal suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux) && p.getWeekLoanDate() == weekDate)).map((py) -> py.getApoyos()).reduce(BigDecimal::add).isPresent() + ? data.stream().filter((p) -> (p.getRouteName().equals(rutaAux) && p.getWeekLoanDate() == weekDate)).map((py) -> py.getApoyos()).reduce(BigDecimal::add).get() + : BigDecimal.ZERO; + cellNew.setCellValue(suma.doubleValue()); + // Comsion por apertura + /*cellNew = r.createCell(3); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux) && p.getWeekLoanDate() == weekDate)).map((py) -> py.getComisionApertura()).reduce(BigDecimal::add).isPresent() + ? data.stream().filter((p) -> (p.getRouteName().equals(rutaAux) && p.getWeekLoanDate() == weekDate)).map((py) -> py.getComisionApertura()).reduce(BigDecimal::add).get() + : BigDecimal.ZERO; + cellNew.setCellValue(suma.doubleValue());*/ + + //Totales + cellNew = r.createCell(7); + cellNew.setCellType(CellType.STRING); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.setCellValue("TOTALES: "); + // Lunes + cellNew = r.createCell(9); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getPaymentMonday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + cellNew = r.createCell(10); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFeeMonday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + // Martes + cellNew = r.createCell(11); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getPaymentTuesday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + cellNew = r.createCell(12); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFeeTuesday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + // Miércoles + cellNew = r.createCell(13); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getPaymentWednesday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + cellNew = r.createCell(14); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFeeWednesday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + // Jueves + cellNew = r.createCell(15); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getPaymentThursday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + cellNew = r.createCell(16); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFeeThursday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + // Viernes + cellNew = r.createCell(17); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getPaymentFriday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + cellNew = r.createCell(18); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFeeFriday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + // Sábado + cellNew = r.createCell(19); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getPaymentSaturday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + cellNew = r.createCell(20); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFeeSaturday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + // Faltante + cellNew = r.createCell(22); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFaltante()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + + + } + + private void creaRegistroTotalesGeneral(String ruta, HSSFSheet sheet, short dataFormat, boolean lastRow, int i) { + HSSFRow r; + HSSFCell cellNew; + String rutaAux = ruta; + if (lastRow) { + r = sheet.createRow(sheet.getPhysicalNumberOfRows() + 1); + } else { + sheet.shiftRows(i, sheet.getLastRowNum(), 1, true, false); + r = sheet.createRow(i); + } + + Calendar calendar = Calendar.getInstance(); + Calendar calendarFor = Calendar.getInstance(); + calendar.setTime(getStarDate()); + int numberWeekOfYear = calendar.get(Calendar.WEEK_OF_YEAR); + + // Falta sacar el calculo + + Entrego = BigDecimal.ZERO; + ComisionAp = BigDecimal.ZERO; + AbonosSemana = BigDecimal.ZERO; + Presto = BigDecimal.ZERO; + data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).forEach(py -> { + calendarFor.setTime(py.getFecha()); + + if (numberWeekOfYear == calendarFor.get(Calendar.WEEK_OF_YEAR)) { + setComisionAp(py.getComisionApertura()); + setAbonosSemana(py.getPaymentMonday()); + setAbonosSemana(py.getPaymentTuesday()); + setAbonosSemana(py.getPaymentWednesday()); + setAbonosSemana(py.getPaymentThursday()); + setAbonosSemana(py.getPaymentFriday()); + setAbonosSemana(py.getPaymentSaturday()); + setPresto(py.getApoyos()); + } + }); + Entrego = Entrego.add(ComisionAp.add(AbonosSemana)); + + Long BonosNuevos = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).filter((py) -> (py.getNewCustomer().equalsIgnoreCase("Si"))).count(); + BigDecimal sumaAbonosSemana = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getPaymentMonday().add(py.getPaymentTuesday() + .add(py.getPaymentWednesday().add(py.getPaymentThursday().add(py.getPaymentFriday().add(py.getPaymentSaturday())))))).reduce(BigDecimal::add).get(); + BigDecimal sumaFaltante = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFaltante()).reduce(BigDecimal::add).get(); + BigDecimal faltanteReal = sumaAbonosSemana.subtract(sumaFaltante); + + //(FALTANTE REAL* 100) / ENTREGO + BigDecimal porcentajeReal = faltanteReal.multiply(BigDecimal.valueOf(100.0)); + double entr = Entrego.doubleValue(); + double porcReal = porcentajeReal.doubleValue(); + + if (Entrego.compareTo(BigDecimal.ZERO) > 0 && porcentajeReal.compareTo(BigDecimal.ZERO) != 0) { + porcentajeReal = new BigDecimal(porcReal/entr); + } + else{ + porcentajeReal = BigDecimal.ZERO; + } + + //Totales + cellNew = r.createCell(1); + cellNew.setCellType(CellType.STRING); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.setCellValue("TOTALES GENERAL: "); + + //Entregó + cellNew = r.createCell(2); + cellNew.setCellType(CellType.STRING); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.setCellValue("Entregó: "); + cellNew = r.createCell(3); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + cellNew.setCellValue(Entrego.doubleValue()); + + //Prestó + cellNew = r.createCell(4); + cellNew.setCellType(CellType.STRING); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.setCellValue("Prestó: "); + cellNew = r.createCell(5); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + cellNew.setCellValue(Presto.doubleValue()); + + //Faltante Real + cellNew = r.createCell(6); + cellNew.setCellType(CellType.STRING); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.setCellValue("Faltante Real: "); + cellNew = r.createCell(7); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + cellNew.setCellValue(faltanteReal.doubleValue()); + + //Porcentaje Real + cellNew = r.createCell(8); + cellNew.setCellType(CellType.STRING); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.setCellValue("Porcentaje Real: "); + cellNew = r.createCell(9); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + cellNew.setCellValue(porcentajeReal.doubleValue()); + + //Bonos Nuevos + cellNew = r.createCell(10); + cellNew.setCellType(CellType.STRING); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.setCellValue("Bonos Nuevos: "); + cellNew = r.createCell(11); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.setCellValue(BonosNuevos); + + } + // Se calcula el campo Entrego y Presto + BigDecimal Entrego = BigDecimal.ZERO; + BigDecimal ComisionAp = BigDecimal.ZERO; + BigDecimal AbonosSemana = BigDecimal.ZERO; + BigDecimal Presto = BigDecimal.ZERO; + + public BigDecimal getComisionAp() { + return ComisionAp; + } + + public void setComisionAp(BigDecimal ComisionAp) { + this.ComisionAp = this.ComisionAp.add(ComisionAp); + } + + public BigDecimal getAbonosSemana() { + return AbonosSemana; + } + + public void setAbonosSemana(BigDecimal AbonosSemana) { + this.AbonosSemana = this.AbonosSemana.add(AbonosSemana); + } + + public BigDecimal getPresto() { + return Presto; + } + + public void setPresto(BigDecimal Presto) { + this.Presto = this.Presto.add(Presto); + } + + private HSSFCellStyle getCellStyle(String cellStyleColor) { + if (cellStyleColor == null) { + cellStyleColor = "White"; + } + + switch (cellStyleColor) { + case "redRow": + return cellStyleRed; + case "greenRow": + return cellStyleGreen; + case "yellowRow": + return cellStyleYellow; + case "blueRow": + return cellStyleBlue; + case "blueLightRow": + return cellStyleBlueLight; + case "greenLigthRow": + return cellStyleGreenLight; + case "greenStrongRow": + return cellStyleGreenStrong; + case "greyRow": + return cellStyleGrey; + case "orangeRow": + return cellStyleOrange; + case "difRow": + return cellStyleDif; + case "whiteRow": + return cellStyleWhite; + case "limeGreenRow": + return cellStyleLimeGreen; + default: + return cellStyleWhite; + } + } + + private void initCellStyle(HSSFWorkbook wb) { + // MULTA + fontRed = wb.createFont(); + cellStyleRed = wb.createCellStyle(); + fontRed.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleRed.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleRed.setFillForegroundColor(IndexedColors.RED.getIndex()); + //cellStyleRed.setFont(fontRed); + + // ABONO 0 + fontGreen = wb.createFont(); + cellStyleGreen = wb.createCellStyle(); + fontGreen.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleGreen.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleGreen.setFillForegroundColor(IndexedColors.SEA_GREEN.getIndex()); + //cellStyleGreen.setFont(fontGreen); + + // ABONÓ MENOS + fontYellow = wb.createFont(); + cellStyleYellow = wb.createCellStyle(); + fontYellow.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleYellow.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleYellow.setFillForegroundColor(IndexedColors.LIGHT_YELLOW.getIndex()); + //cellStyleYellow.setFont(fontYellow); + + // ABONÓ DE MÃS + fontBlue = wb.createFont(); + cellStyleBlue = wb.createCellStyle(); + fontBlue.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleBlue.setFillPattern(FillPatternType.SOLID_FOREGROUND); + //cellStyleBlue.setFillForegroundColor(HSSFColor.HSSFColorPredefined.BLUE.getIndex()); + cellStyleBlue.setFillForegroundColor(IndexedColors.TURQUOISE.getIndex()); + //cellStyleBlue.setFont(fontBlue); + + // PAGO CONGELADO + fontBlueLight = wb.createFont(); + cellStyleBlueLight = wb.createCellStyle(); + fontBlueLight.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleBlueLight.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleBlueLight.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex()); + + // RENOVÓ + fontGreenLight = wb.createFont(); + cellStyleGreenLight = wb.createCellStyle(); + fontGreenLight.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleGreenLight.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleGreenLight.setFillForegroundColor(IndexedColors.BRIGHT_GREEN.getIndex()); + //cellStyleGreenLight.setFont(fontGreenLight); + + // getSaldoInsoluto == 0 + fontGreenStrong = wb.createFont(); + cellStyleGreenStrong = wb.createCellStyle(); + fontGreenStrong.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleGreenStrong.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleGreenStrong.setFillForegroundColor(IndexedColors.GREEN.getIndex()); + //cellStyleGreenStrong.setFont(fontGreenStrong); + + //Reactivacion + fontLimeGreen= wb.createFont(); + cellStyleLimeGreen = wb.createCellStyle(); + fontLimeGreen.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleLimeGreen.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleLimeGreen.setFillForegroundColor(IndexedColors.LIME.getIndex()); + + // CLIENTE NUEVO + fontOrange = wb.createFont(); + cellStyleOrange = wb.createCellStyle(); + fontOrange.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleOrange.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleOrange.setFillForegroundColor(IndexedColors.ORANGE.getIndex()); + //cellStyleGreenLight.setFont(fontGreenLight); + + // Totales + fontGrey = wb.createFont(); + cellStyleGrey = wb.createCellStyle(); + fontGrey.setColor(HSSFColor.HSSFColorPredefined.WHITE.getIndex()); + cellStyleGrey.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleGrey.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex()); + cellStyleGrey.setFont(fontGrey); + + // Totales + fontDif = wb.createFont(); + cellStyleDif = wb.createCellStyle(); + fontDif.setColor(HSSFColor.HSSFColorPredefined.RED.getIndex()); + //cellStyleDif.setFillPattern(FillPatternType.SOLID_FOREGROUND); + //cellStyleDif.setFillForegroundColor(IndexedColors.WHITE.getIndex()); + cellStyleDif.setFont(fontDif); + + cellStyleWhite = wb.createCellStyle(); + cellStyleWhite.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleWhite.setFillForegroundColor(HSSFColor.HSSFColorPredefined.WHITE.getIndex()); + } + + private DriverController driverCtrl; + private GenericController genericCtrl; + private List data; + private InformationLoanWeekView selectedData; + private LoanController loanCtrl; + + private List dataColocation; + private ColocationWeekByUserView selectedColocation; + + private List dataSubtotal; + private SubtotalWeekByUserView selectedSubtotal; + + private List dataResumen; + private ResumenInOutWeekByUserView selectedResumen; + + private List dataCobranza; + private CobranzaWeekByUserView selectedCobranza; + + private List dataTotal; + private ResumenTotalWeekView selectedTotal; + + private List loanDetails; + + // Datos para pintar las celdas + HSSFCellStyle cellStyleRed; + HSSFFont fontRed; + HSSFCellStyle cellStyleGreen; + HSSFFont fontGreen; + HSSFCellStyle cellStyleYellow; + HSSFFont fontYellow; + HSSFCellStyle cellStyleBlue; + HSSFFont fontBlue; + HSSFCellStyle cellStyleBlueLight; + HSSFFont fontBlueLight; + HSSFCellStyle cellStyleGreenLight; + HSSFFont fontGreenLight; + HSSFCellStyle cellStyleGreenStrong; + HSSFFont fontGreenStrong; + HSSFCellStyle cellStyleOrange; + HSSFFont fontOrange; + HSSFCellStyle cellStyleWhite; + HSSFCellStyle cellStyleGrey; + HSSFFont fontGrey; + HSSFCellStyle cellStyleDif; + HSSFFont fontDif; + HSSFCellStyle cellStyleLimeGreen; + HSSFFont fontLimeGreen; + + + @PostConstruct + public void init() { + SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); + loadBundlePropertyFile(); + initStartAndEndDates(Calendar.DAY_OF_WEEK, 2); + String date = DATE_FORMAT.format(getStarDate()); + + driverCtrl = new DriverController(); + genericCtrl = new GenericController(); + loanCtrl = new LoanController(); + data = fillDataTable(); + dataColocation = driverCtrl.getAllColocationWeekByOfficeMySQLQuery(date, getLoggedUser().getOffice().getId()); + dataSubtotal = driverCtrl.getAllSubtotalThisWeekByOfficeMySQLQuery(date, getLoggedUser().getOffice().getId()); + dataResumen = driverCtrl.getAllResumenInOutThisWeekByOfficeMySQLQuery(date, getLoggedUser().getOffice().getId()); + dataCobranza = driverCtrl.getAllCobranzaThisWeekByOfficeMySQLQuery(date, getLoggedUser().getOffice().getId()); + dataTotal = driverCtrl.getAllResumenTotalWeekByOfficeMySQLQuery(date, getLoggedUser().getOffice().getId()); + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/drive/DriverLastBean.java b/apc-web/src/main/java/com/arrebol/apc/web/drive/DriverLastBean.java new file mode 100644 index 0000000..3ccf22a --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/drive/DriverLastBean.java @@ -0,0 +1,593 @@ +/* + * Arrebol Consultancy copyright. + * + * This code belongs to Arrebol Consultancy + * its use, redistribution or modification are prohibited + * without written authorization from Arrebol Consultancy. + */ +package com.arrebol.apc.web.drive; + +import com.arrebol.apc.controller.drive.DriverController; +import com.arrebol.apc.model.views.CobranzaLastWeekByUserView; +import com.arrebol.apc.model.views.ColocationLastWeekByUserView; +import com.arrebol.apc.model.views.InformationLoanLastWeekView; +import com.arrebol.apc.model.views.ResumeNewCustomerLastWeekView; +import com.arrebol.apc.model.views.ResumenInOutLastWeekByUserView; +import com.arrebol.apc.model.views.ResumenTotalLastWeekView; +import com.arrebol.apc.model.views.SubtotalLastWeekByUserView; +import com.arrebol.apc.web.beans.Datatable; +import com.arrebol.apc.web.beans.GenericBean; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFFont; +import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.hssf.util.HSSFColor; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.primefaces.event.ReorderEvent; +import org.primefaces.event.RowEditEvent; + +/** + * + * @author Oscar Armando Vargas Cardenas + */ +@Named("driverLastManager") +@ViewScoped +public class DriverLastBean extends GenericBean implements Serializable, Datatable{ + + @Override + public void editRow(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowCancel(RowEditEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void onRowReorder(ReorderEvent event) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void addRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public void deleteRow() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + public DriverController getDriverCtrl() { + return driverCtrl; + } + + public void setDriverCtrl(DriverController driverCtrl) { + this.driverCtrl = driverCtrl; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public InformationLoanLastWeekView getSelectedData() { + return selectedData; + } + + public void setSelectedData(InformationLoanLastWeekView selectedData) { + this.selectedData = selectedData; + } + + public List getDataColocation() { + return dataColocation; + } + + public void setDataColocation(List dataColocation) { + this.dataColocation = dataColocation; + } + + public ColocationLastWeekByUserView getSelectedColocation() { + return selectedColocation; + } + + public void setSelectedColocation(ColocationLastWeekByUserView selectedColocation) { + this.selectedColocation = selectedColocation; + } + + public List getDataSubtotal() { + return dataSubtotal; + } + + public void setDataSubtotal(List dataSubtotal) { + this.dataSubtotal = dataSubtotal; + } + + public SubtotalLastWeekByUserView getSelectedSubtotal() { + return selectedSubtotal; + } + + public void setSelectedSubtotal(SubtotalLastWeekByUserView selectedSubtotal) { + this.selectedSubtotal = selectedSubtotal; + } + + public List getDataResumen() { + return dataResumen; + } + + public void setDataResumen(List dataResumen) { + this.dataResumen = dataResumen; + } + + public ResumenInOutLastWeekByUserView getSelectedResumen() { + return selectedResumen; + } + + public void setSelectedResumen(ResumenInOutLastWeekByUserView selectedResumen) { + this.selectedResumen = selectedResumen; + } + + public List getDataCobranza() { + return dataCobranza; + } + + public void setDataCobranza(List dataCobranza) { + this.dataCobranza = dataCobranza; + } + + public CobranzaLastWeekByUserView getSelectedCobranza() { + return selectedCobranza; + } + + public void setSelectedCobranza(CobranzaLastWeekByUserView selectedCobranza) { + this.selectedCobranza = selectedCobranza; + } + + public List getDataTotal() { + return dataTotal; + } + + public void setDataTotal(List dataTotal) { + this.dataTotal = dataTotal; + } + + public ResumenTotalLastWeekView getSelectedTotal() { + return selectedTotal; + } + + public void setSelectedTotal(ResumenTotalLastWeekView selectedTotal) { + this.selectedTotal = selectedTotal; + } + + public List getDataCtesNvos() { + return dataCtesNvos; + } + + public void setDataCtesNvos(List dataCtesNvos) { + this.dataCtesNvos = dataCtesNvos; + } + + public ResumeNewCustomerLastWeekView getSelectedCtesNvos() { + return selectedCtesNvos; + } + + public void setSelectedCtesNvos(ResumeNewCustomerLastWeekView selectedCtesNvos) { + this.selectedCtesNvos = selectedCtesNvos; + } + + public void paintDataXLS(Object document) { + HSSFWorkbook wb = (HSSFWorkbook) document; + HSSFSheet sheet = wb.getSheetAt(0); + HSSFRow header = sheet.getRow(0); + HSSFCellStyle cellStyle = wb.createCellStyle(); + HSSFFont font = wb.createFont(); + font.setBold(true); + cellStyle.setFont(font); + cellStyle.setBorderTop(BorderStyle.DOUBLE); + cellStyle.setBorderBottom(BorderStyle.DOUBLE); + cellStyle.setBorderLeft(BorderStyle.DOUBLE); + cellStyle.setBorderRight(BorderStyle.DOUBLE); + cellStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.LEMON_CHIFFON.getIndex()); + cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + short dataFormat = wb.createDataFormat().getFormat("$#,##0.00"); + + initCellStyle(wb); + + for (int i = 0; i < header.getPhysicalNumberOfCells(); i++) { + HSSFCell cell = header.getCell(i); + cell.setCellStyle(cellStyle); + } + + String aux = ""; + for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) { + HSSFRow row = sheet.getRow(i); + InformationLoanLastWeekView loanWeekData = data.get(i-1); + HSSFCell cell; + String rowRenov = loanWeekData.getConditionRenovation(); + //cellStyleRow = getCellStyle(rowRenov); + // Row General + for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) { + cell = row.getCell(j); + cell.setCellStyle(getCellStyle(rowRenov)); + + if((j >= 7 && j <= 22) || (j == 2 || j == 3)){ + cell.getCellStyle().setDataFormat(dataFormat); + aux = cell.getStringCellValue().replace("$", ""); + aux = aux.replace(",", ""); + cell.setCellValue(Double.parseDouble(aux)); + cell.setCellType(CellType.NUMERIC); + } + } + + // Lunes + cell = row.getCell(10); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionLunes())); + cell.getCellStyle().setDataFormat(dataFormat); + cell = row.getCell(11); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionLunes())); + cell.getCellStyle().setDataFormat(dataFormat); + + // Martes + cell = row.getCell(12); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionMartes())); + cell.getCellStyle().setDataFormat(dataFormat); + cell = row.getCell(13); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionMartes())); + cell.getCellStyle().setDataFormat(dataFormat); + + // Miércoles + cell = row.getCell(14); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionMiercoles())); + cell.getCellStyle().setDataFormat(dataFormat); + cell = row.getCell(15); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionMiercoles())); + cell.getCellStyle().setDataFormat(dataFormat); + + // Jueves + cell = row.getCell(16); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionJueves())); + cell.getCellStyle().setDataFormat(dataFormat); + cell = row.getCell(17); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionJueves())); + cell.getCellStyle().setDataFormat(dataFormat); + + // Viernes + cell = row.getCell(18); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionViernes())); + cell.getCellStyle().setDataFormat(dataFormat); + cell = row.getCell(19); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionViernes())); + cell.getCellStyle().setDataFormat(dataFormat); + + // Sábado + cell = row.getCell(20); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionSabado())); + cell.getCellStyle().setDataFormat(dataFormat); + cell = row.getCell(21); + cell.setCellStyle(getCellStyle(loanWeekData.getConditionSabado())); + cell.getCellStyle().setDataFormat(dataFormat); + } + + String ruta = data.get(0).getRouteName(); + int regInsertados = 0; + + for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) { + HSSFRow row = sheet.getRow(i); + InformationLoanLastWeekView loanWeekData = data.get(i-1-regInsertados); + + if(!ruta.equalsIgnoreCase(data.get(i-1-regInsertados).getRouteName())){ + creaRegistroTotales(ruta, sheet, dataFormat, false, i); + ruta = data.get(i-1-regInsertados).getRouteName(); + regInsertados++; + } + } + creaRegistroTotales(ruta, sheet, dataFormat, true, sheet.getPhysicalNumberOfRows()+1); + } + + private void creaRegistroTotales(String ruta, HSSFSheet sheet, short dataFormat, boolean lastRow, int i){ + HSSFRow r; + HSSFCell cellNew; + String rutaAux = ruta; + if (lastRow) { + r = sheet.createRow(sheet.getPhysicalNumberOfRows() + 1); + } else { + sheet.shiftRows(i, sheet.getLastRowNum(), 1, true, false); + r = sheet.createRow(i); + } + + // Apoyos + cellNew = r.createCell(3); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + BigDecimal suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux) && p.getWeekLoanDate() == p.getWeekCurrentDate())).map((py) -> py.getApoyos()).reduce(BigDecimal::add).isPresent() + ? data.stream().filter((p) -> (p.getRouteName().equals(rutaAux) && p.getWeekLoanDate() == p.getWeekCurrentDate())).map((py) -> py.getApoyos()).reduce(BigDecimal::add).get() + : BigDecimal.ZERO; + cellNew.setCellValue(suma.doubleValue()); + // Comsion por apertura + cellNew = r.createCell(4); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux) && p.getWeekLoanDate() == p.getWeekCurrentDate())).map((py) -> py.getComisionApertura()).reduce(BigDecimal::add).isPresent() + ? data.stream().filter((p) -> (p.getRouteName().equals(rutaAux) && p.getWeekLoanDate() == p.getWeekCurrentDate())).map((py) -> py.getComisionApertura()).reduce(BigDecimal::add).get() + : BigDecimal.ZERO; + cellNew.setCellValue(suma.doubleValue()); + + //Totales + cellNew = r.createCell(9); + cellNew.setCellType(CellType.STRING); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.setCellValue("TOTALES: "); + // Lunes + cellNew = r.createCell(10); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getPaymentMonday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + cellNew = r.createCell(11); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFeeMonday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + // Martes + cellNew = r.createCell(12); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getPaymentTuesday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + cellNew = r.createCell(13); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFeeTuesday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + // Miércoles + cellNew = r.createCell(14); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getPaymentWednesday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + cellNew = r.createCell(15); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFeeWednesday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + // Jueves + cellNew = r.createCell(16); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getPaymentThursday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + cellNew = r.createCell(17); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFeeThursday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + // Viernes + cellNew = r.createCell(18); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getPaymentFriday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + cellNew = r.createCell(19); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFeeFriday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + // Sábado + cellNew = r.createCell(20); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getPaymentSaturday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + cellNew = r.createCell(21); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFeeSaturday()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + // Faltante + cellNew = r.createCell(22); + cellNew.setCellType(CellType.NUMERIC); + cellNew.setCellStyle(getCellStyle("greyRow")); + cellNew.getCellStyle().setDataFormat(dataFormat); + suma = data.stream().filter((p) -> (p.getRouteName().equals(rutaAux))).map((py) -> py.getFaltante()).reduce(BigDecimal::add).get(); + cellNew.setCellValue(suma.doubleValue()); + } + + private HSSFCellStyle getCellStyle (String cellStyleColor){ + if(cellStyleColor == null){ + cellStyleColor = "White"; + } + + switch(cellStyleColor){ + case "redRow": + return cellStyleRed; + case "greenRow": + return cellStyleGreen; + case "yellowRow": + return cellStyleYellow; + case "blueRow": + return cellStyleBlue; + case "blueLightRow": + return cellStyleBlueLight; + case "greenLigthRow": + return cellStyleGreenLight; + case "greenStrongRow": + return cellStyleGreenStrong; + case "greyRow": + return cellStyleGrey; + case "orangeRow": + return cellStyleOrange; + default: + return cellStyleWhite; + } + } + + private void initCellStyle(HSSFWorkbook wb){ + // MULTA + fontRed = wb.createFont(); + cellStyleRed = wb.createCellStyle(); + fontRed.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleRed.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleRed.setFillForegroundColor(IndexedColors.RED.getIndex()); + //cellStyleRed.setFont(fontRed); + + // ABONO 0 + fontGreen = wb.createFont(); + cellStyleGreen = wb.createCellStyle(); + fontGreen.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleGreen.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleGreen.setFillForegroundColor(IndexedColors.SEA_GREEN.getIndex()); + //cellStyleGreen.setFont(fontGreen); + + // ABONÓ MENOS + fontYellow = wb.createFont(); + cellStyleYellow = wb.createCellStyle(); + fontYellow.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleYellow.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleYellow.setFillForegroundColor(IndexedColors.LIGHT_YELLOW.getIndex()); + //cellStyleYellow.setFont(fontYellow); + + // ABONÓ DE MÃS + fontBlue = wb.createFont(); + cellStyleBlue = wb.createCellStyle(); + fontBlue.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleBlue.setFillPattern(FillPatternType.SOLID_FOREGROUND); + //cellStyleBlue.setFillForegroundColor(HSSFColor.HSSFColorPredefined.BLUE.getIndex()); + cellStyleBlue.setFillForegroundColor(IndexedColors.TURQUOISE.getIndex()); + //cellStyleBlue.setFont(fontBlue); + + // PAGO CONGELADO + fontBlueLight = wb.createFont(); + cellStyleBlueLight = wb.createCellStyle(); + fontBlueLight.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleBlueLight.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleBlueLight.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex()); + + // RENOVÓ + fontGreenLight = wb.createFont(); + cellStyleGreenLight = wb.createCellStyle(); + fontGreenLight.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleGreenLight.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleGreenLight.setFillForegroundColor(IndexedColors.BRIGHT_GREEN.getIndex()); + //cellStyleGreenLight.setFont(fontGreenLight); + + // getSaldoInsoluto == 0 + fontGreenStrong = wb.createFont(); + cellStyleGreenStrong = wb.createCellStyle(); + fontGreenStrong.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleGreenStrong.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleGreenStrong.setFillForegroundColor(IndexedColors.GREEN.getIndex()); + //cellStyleGreenStrong.setFont(fontGreenStrong); + + // CLIENTE NUEVO + fontOrange = wb.createFont(); + cellStyleOrange = wb.createCellStyle(); + fontOrange.setColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex()); + cellStyleOrange.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleOrange.setFillForegroundColor(IndexedColors.ORANGE.getIndex()); + //cellStyleGreenLight.setFont(fontGreenLight); + + // Totales + fontGrey = wb.createFont(); + cellStyleGrey = wb.createCellStyle(); + fontGrey.setColor(HSSFColor.HSSFColorPredefined.WHITE.getIndex()); + cellStyleGrey.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleGrey.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex()); + cellStyleGrey.setFont(fontGrey); + + cellStyleWhite = wb.createCellStyle(); + cellStyleWhite.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cellStyleWhite.setFillForegroundColor(HSSFColor.HSSFColorPredefined.WHITE.getIndex()); + } + + private DriverController driverCtrl; + private List data; + private InformationLoanLastWeekView selectedData; + + private List dataColocation; + private ColocationLastWeekByUserView selectedColocation; + + private List dataSubtotal; + private SubtotalLastWeekByUserView selectedSubtotal; + + private List dataResumen; + private ResumenInOutLastWeekByUserView selectedResumen; + + private List dataCobranza; + private CobranzaLastWeekByUserView selectedCobranza; + + private List dataTotal; + private ResumenTotalLastWeekView selectedTotal; + + private List dataCtesNvos; + private ResumeNewCustomerLastWeekView selectedCtesNvos; + + // Datos para pintar las celdas + HSSFCellStyle cellStyleRed; + HSSFFont fontRed; + HSSFCellStyle cellStyleGreen; + HSSFFont fontGreen; + HSSFCellStyle cellStyleYellow; + HSSFFont fontYellow; + HSSFCellStyle cellStyleBlue; + HSSFFont fontBlue; + HSSFCellStyle cellStyleBlueLight; + HSSFFont fontBlueLight; + HSSFCellStyle cellStyleGreenLight; + HSSFFont fontGreenLight; + HSSFCellStyle cellStyleGreenStrong; + HSSFFont fontGreenStrong; + HSSFCellStyle cellStyleOrange; + HSSFFont fontOrange; + HSSFCellStyle cellStyleWhite; + HSSFCellStyle cellStyleGrey; + HSSFFont fontGrey; + + @PostConstruct + public void init() { + driverCtrl = new DriverController(); + data = driverCtrl.getAllLoanLastWeekByOffice(getLoggedUser().getOffice().getId()); + dataColocation = driverCtrl.getAllColocationLastWeekByOffice(getLoggedUser().getOffice().getId()); + dataSubtotal = driverCtrl.getAllSubtotalLastWeekByOffice(getLoggedUser().getOffice().getId()); + dataResumen = driverCtrl.getAllResumenInOutLastWeekByOffice(getLoggedUser().getOffice().getId()); + dataCobranza = driverCtrl.getAllCobranzaLastWeekByOffice(getLoggedUser().getOffice().getId()); + dataTotal = driverCtrl.getAllResumenTotalLastWeekByOffice(getLoggedUser().getOffice().getId()); + dataCtesNvos = driverCtrl.getAllResumenNewCustomerLastWeekByOffice(); + + for(SubtotalLastWeekByUserView subtotal : dataSubtotal) + { + Double sumFaltante = data.stream().filter(p -> p.getIdUser().equalsIgnoreCase(subtotal.getId())).mapToDouble(h -> h.getFaltante().doubleValue()).sum(); + subtotal.setFaltante(new BigDecimal(sumFaltante)); + } + } + +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/validators/GenericValidator.java b/apc-web/src/main/java/com/arrebol/apc/web/validators/GenericValidator.java new file mode 100644 index 0000000..406713e --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/validators/GenericValidator.java @@ -0,0 +1,42 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.arrebol.apc.web.validators; + +import java.util.ResourceBundle; +import javax.faces.application.FacesMessage; +import javax.faces.validator.ValidatorException; + +/** + * + * @author Picasso + */ +public abstract class GenericValidator { + + /** + * Raise a message with SEVERITY_ERROR.s + * + * @param message + * @throws ValidatorException + */ + protected void errorSeverity(String message) throws ValidatorException { + FacesMessage msg = new FacesMessage(message); + + msg.setSeverity(FacesMessage.SEVERITY_ERROR); + + throw new ValidatorException(msg); + } + + protected ResourceBundle bundlePropertyFile; + private final String PROPERTY_FILE = "com.arrebol.apc.i18n.app_background"; + + public ResourceBundle getBundlePropertyFile() { + return bundlePropertyFile; + } + + public synchronized void loadBundlePropertyFile() { + this.bundlePropertyFile = ResourceBundle.getBundle(PROPERTY_FILE); + } +} diff --git a/apc-web/src/main/java/com/arrebol/apc/web/validators/SelectOneMenuValidator.java b/apc-web/src/main/java/com/arrebol/apc/web/validators/SelectOneMenuValidator.java new file mode 100644 index 0000000..813e8bb --- /dev/null +++ b/apc-web/src/main/java/com/arrebol/apc/web/validators/SelectOneMenuValidator.java @@ -0,0 +1,27 @@ +package com.arrebol.apc.web.validators; + +import javax.faces.component.UIComponent; +import javax.faces.context.FacesContext; +import javax.faces.validator.FacesValidator; +import javax.faces.validator.Validator; +import javax.faces.validator.ValidatorException; + +/** + * + * @author Carlos Janitzio Zavala Lopez + */ +@FacesValidator("selectOneMenuValidator") +public class SelectOneMenuValidator extends GenericValidator implements Validator { + + @Override + public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { + loadBundlePropertyFile(); + + if (null == value + || "".equals(value.toString()) + || "N/A".equals(value.toString())) { + errorSeverity(getBundlePropertyFile().getString("validator.select.one.menu.invalid.option")); + } + } + +} diff --git a/apc-web/src/main/resources/com/arrebol/apc/i18n/app.properties b/apc-web/src/main/resources/com/arrebol/apc/i18n/app.properties new file mode 100644 index 0000000..883a8d5 --- /dev/null +++ b/apc-web/src/main/resources/com/arrebol/apc/i18n/app.properties @@ -0,0 +1,601 @@ +project.short.name=SISVECOM +project.complete.name=SISTEMA DE VENTA Y COBRANZA M\u00d3VIL\u00a0 +arrebol.reserved=Todos los Derechos Reservados. +############### +# ERROR PAGES # +############### +error.title=Ha ocurrido un error +error.return.dashboard=Regresar al tablero +error.contact.admin=Por favor contacte al administrador +error.forbidden=Acceso denegado +error.not.found=P\u00e1gina no encontrada +######### +# Login # +######### +user=Usuario +password=Contrase\u00f1a +confirm=Confirmar +sign.in=Iniciar sesi\u00f3n +sign.out=Cerrar sesi\u00f3n +password.reset=Restablecer contrase\u00f1a +remember.me=\u00bfRecordarme? +new.account=\u00bfNo tienes una cuenta? +now=ahora +sign.up=Reg\u00edstrate +require.msg.user.empty=Ingrese el usuario. +require.msg.password.empty=Ingrese la contrase\u00f1a. +############# +# Dashboard # +############# +dashboard.title=Tablero +########## +# System # +########## +system.title=Sistema +system.users=Usuarios +system.users.add=Alta +system.users.setting=Actualizaci\u00f3n +system.users.permission=Accesos +user.create=Crear usuario +user.update=Actualizar usuario +user.add.access=Asignar accesos +user.update.access=Asignar accesos +user.update.routes=Actualizar ruta de usuario +access.from=Permisos disponibles +access.to=Permisos asignados +access.updte=Modificar accesos +permission.add=Agregar permisos +permission.update=Actualizar permisos +user.disable=Deshabilitar usuarios +user.disable.btn=Deshabilitar usuario +user.eneble=Habilitar usuarios +user.eneble.btn=Habilitar usuario +user.delete=Borrar usuarios +user.delete.btn=Borrar usuario +user.update.pwd=Actualizaci\u00f3n de contrase\u00f1a +user.update.pwd.btn=Actualizar contrase\u00f1a +user.update.username.btn=Modificar nombre de usuario +select.user=Elegir usuario +load.user.access=Cargar accesos del usuario +user.confirm.header=Datos del usuario +user.confirm.question=\u00bfLos datos del usuario son correctos? +user.are.you.sure.enebled=\u00bfEstas seguro de habilitar al usuario? +user.are.you.sure.disabled=\u00bfEstas seguro deshabilitar al usuario? +user.are.you.sure.deleted=\u00bfEstas seguro de eliminar al usuario? +user.are.you.sure.username=\u00bfEstas seguro de modificar el nombre de usuario? +user.are.you.sure.pwd=\u00bfEstas seguro de modificar la contrase\u00f1a? +user.are.you.sure.avatar=\u00bfEstas seguro de modificar la imagen del usuario? +system.office=Oficina +system.office.datatable.empty=No hay oficina para mostrar +system.office.datatable.column.name=Nombre +system.office.datatable.column.address=Domicilio +system.office.dialog.require.msg.name.empty=El nombre de la oficina es obligatorio +system.office.dialog.require.msg.address.empty=La direcci\u00f3n de la oficina es obligatorio +system.bitacora=Bit\u00e1cora +system.bitacoras.datatable.empty=No hay registros por mostrar +system.bitacoras.datatable.column.action=Acci\u00f3n +system.bitacoras.datatable.column.description=Descripci\u00f3n +system.bitacoras.datatable.column.commentsUser=Comentarios del usuario +system.bitacoras.datatable.column.user=Usuario +system.bitacoras.datatable.column.createdOn=Fecha +################## +# Human Resource # +################## +hr=Empleado +add.hr=Alta empleado +first.name=Nombre +second.name=Segundo nombre +last.name=Apellido paterno +middle.name=Apellido materno +date.birthdate=Fecha de nacimiento +date.addmission=Fecha de ingreso +role=Puesto +role.choose=Seleccione el puesto +SECRETARY=Secretaria +CEO=Director ejecutivo +ADVISER=Supervisor +hr.create.btn=Crear empleado +hr.update.btn=Actualizar empleado +first.name.required=Nombre obligatorio +last.name.required=Apellido paterno obligatorio +middle.name.required=Apellido materno obligatoio +role.choose.required=Puesto es obligatorio +user.type.required=Tipo usuario es obligatorio +hr.confirm.header=Datos del empleado +hr.confirm.question=\u00bfLos datos del empleado son correctos? +employee.disable=Deshabilitar empleados +employee.disable.btn=Deshabilitar empleado +employee.eneble=Habilitar empleados +employee.eneble.btn=Habilitar empleado +employee.delete=Borrar empleados +employee.delete.btn=Borrar empleado +employee.update.load.btn=Cargar datos del empleado +employee.update.pwd=Actualizaci\u00f3n de contrase\u00f1a +employee.update.pwd.btn=Actualizar contrase\u00f1a +select.employee=Elegir empleado +select.employee.required=Empleado es obligatorio +########### +# Catalog # +########### +catalog.title=Cat\u00e1logos +catalog.roles=Puestos +catalog.typeLoan=Listado de\u00a0Productos +catalog.route=Rutas +catalog.roles.datatable.empty=No hay puestos para mostrar +catalog.roles.datatable.column.name=Nombre +catalog.roles.dialog.title=Puesto +catalog.roles.dialog.require.msg.color.empty=El nombre del puesto es obligatorio +catalog.routes.datatable.empty=No hay rutas para mostrar +catalog.routes.datatable.column.name=Nombre +catalog.routes.dialog.title=Rutas +catalog.routes.dialog.require.msg.color.empty=El nombre de la ruta es obligatorio +catalog.loanTypes.datatable.empty=No hay tipos de pr\u00e9stamo para mostrar +catalog.loanTypes.datatable.column.name=Nombre +catalog.loanTypes.datatable.column.totalDays=Total d\u00edas +catalog.loanTypes.datatable.column.fee=Multa +catalog.loanTypes.datatable.column.payment=Precio +catalog.loanTypes.datatable.column.paymentDaily=Abono diario +catalog.loanTypes.datatable.column.paymentTotal=Total a pagar +catalog.loanTypes.datatable.column.openingFee=Comisi\u00f3n por apertura +catalog.loanTypes.dialog.name.require.msg.empty=El nombre es obligatorio +catalog.loanTypes.dialog.name.title=Nombre +catalog.loanTypes.dialog.totalDays.require.msg.empty=El total de d\u00edas es obligatorio +catalog.loanTypes.dialog.totalDays.title=Total de d\u00edas +catalog.loanTypes.dialog.payment.require.msg.empty=El valor del pr\u00e9stamo es obligatorio +catalog.loanTypes.dialog.payment.title=Precio +catalog.loanTypes.dialog.fee.require.msg.empty=El valor de la multa es obligatorio +catalog.loanTypes.dialog.fee.title=Multa +catalog.loanTypes.dialog.paymentDaily.require.msg.empty=El valor del abono diario es obligatorio +catalog.loanTypes.dialog.paymentDaily.title=Abono diario +catalog.loanTypes.dialog.openingFee.require.msg.empty=La comisi\u00f3n por apertura es obligatoria +catalog.loanTypes.dialog.openingFee.title=Comisi\u00f3n por apertura +catalog.loanTypes.dialog.monday.title=Lunes +catalog.loanTypes.dialog.tuesday.title=Martes +catalog.loanTypes.dialog.wednesday.title=Miercoles +catalog.loanTypes.dialog.thursday.title=Jueves +catalog.loanTypes.dialog.friday.title=Viernes +catalog.loanTypes.dialog.saturday.title=Sabado +catalog.loanTypes.dialog.sunday.title=Domingo +########### +# Admin # +########### +admin.title=Administraci\u00f3n +admin.people.title=Clientes/Avales +admin.customer=Clientes +admin.endorsement=Avales +admin.people.add=Crear cliente/aval +admin.loan=Ventas +admin.loan.to.approve=Por autorizar +admin.loan.history=Historial +admin.loan.historyJuridical=Historial jur\u00eddico +admin.loan.detail.title=Detalle del pr\u00e9stamo +admin.financial=Financiero +admin.financial.transfer=Transferencias +admin.financial.moneyDaily=Inicios +admin.financial.closingDay=Corte del d\u00eda +admin.financial.closingDayHistory=Historial de cortes +admin.financial.otherExpense=Gastos +admin.payroll=N\u00f3mina +admin.payroll.goals=Metas +admin.payroll.bonus=Bonos +admin.payroll.advance=Adelantos +admin.payroll.create=Crear n\u00f3mina +admin.payroll.history=Historial n\u00f3mina +admin.payroll.loanemployee=Pr\u00e9stamos +admin.stats.fees=Multas +admin.stats.closingday=Corte caja chica +admin.stats.openingfee=Comisi\u00f3n por apertura +admin.stats.payment=Cobro de cartera +admin.stats.paymentroute=Cobro de cartera por ruta +admin.stats.paymentrenovation=Pagos renovados +admin.stats.payroll=N\u00f3mina +admin.stats.summary=Res\u00famen asesor +admin.general.box=Caja general +admin.stats.deposits=Dep\u00f3sitos bancarios +admin.stats.zeropayments=Abonos en cero +admin.stats.employeesaving=Ahorro empleados +admin.stats.advances=Adelantos +admin.stats.gasoline=Gasolinas +admin.stats.vehicle=Veh\u00edculos +admin.general.box.expenseCompanyIn=Entradas +admin.general.box.expenseCompanyOut=Gastos administrativos +admin.general.box.expense.company.in=Entradas +admin.general.box.expense.company.out=Gastos administrativos +admin.general.box.stable=Cuadre de caja +admin.general.box.stable.history=Historial de cuadre de caja +admin.customers.datatable.empty=No hay clientes para mostrar +admin.customers.datatable.column.name=Nombre +admin.customers.datatable.column.companyName=Negocio +admin.customers.datatable.column.addressBusiness=Direcci\u00f3n negocio +admin.customers.datatable.column.addressPersonal=Direcci\u00f3n personal +admin.customers.datatable.column.routeCtlg=Ruta +admin.customers.datatable.column.peopleType=Tipo +admin.customers.datatable.column.office=Sucursal +admin.customers.detail.title=Detalle del cliente +admin.customers.company.title=Informaci\u00f3n del negocio +admin.customers.loan.title=Historial de pr\u00e9stamos +admin.customers.detail.field.name=Nombre +admin.customers.detail.field.firstName=Primer nombre +admin.customers.detail.field.secondName=Segundo nombre +admin.customers.detail.field.lastName=Apellido paterno +admin.customers.detail.field.middleName=Apellido materno +admin.customers.detail.field.birthdate=Fecha de nacimiento +admin.customers.detail.field.phoneHome=Tel\u00e9fono de casa +admin.customers.detail.field.addressHome=Domicilio personal +admin.customers.detail.field.peopleType=Tipo +admin.customers.detail.field.routeCtlg=Ruta +admin.customers.detail.field.companyName=Nombre del negocio +admin.customers.detail.field.phoneBusiness=Tel\u00e9fono del negocio +admin.customers.detail.field.addressBusiness=Direcci\u00f3n del negocio +admin.customers.detail.datatable.empty=No hay pr\u00e9stamos por mostrar +admin.customers.detail.datatable.column.endorsement=Aval +admin.customers.detail.datatable.column.loanStatus=Estatus +admin.customers.detail.datatable.column.amountToPay=Monto a pagar +admin.customers.detail.datatable.column.amountPaid=Monto pagado +admin.customers.detail.datatable.column.createdOn=Fecha +admin.customers.detail.datatable.column.routeCtlg=Ruta +admin.customers.detail.datatable.column.comments=Observaciones +admin.customers.detail.datatable.column.totalFee=No. de multas +admin.endorsements.datatable.empty=No hay avales para mostrar +admin.endorsements.datatable.column.name=Nombre +admin.endorsements.datatable.column.phoneHome=Tel\u00e9fono +admin.endorsements.datatable.column.addressHome=Domicilio personal +admin.endorsements.datatable.column.routeCtlg=Ruta +admin.endorsements.datatable.column.peopleType=Tipo +admin.endorsements.detail.title=Detalle del aval +admin.endorsements.company.title=Informaci\u00f3n del negocio +admin.endorsements.loan.title=Historial de pr\u00e9stamos como aval +admin.endorsements.detail.field.name=Nombre +admin.endorsements.detail.field.birthdate=Fecha de nacimiento +admin.endorsements.detail.field.phoneHome=Tel\u00e9fono de casa +admin.endorsements.detail.field.addressHome=Domicilio personal +admin.endorsements.detail.field.peopleType=Tipo +admin.endorsements.detail.field.routeCtlg=Ruta +admin.endorsements.detail.field.companyName=Nombre del negocio +admin.endorsements.detail.field.phoneBusiness=Tel\u00e9fono del negocio +admin.endorsements.detail.field.addressBusiness=Direcci\u00f3n del negocio +admin.endorsements.detail.datatable.empty=No hay pr\u00e9stamos por mostrar +admin.endorsements.detail.datatable.column.customer=Cliente +admin.endorsements.detail.datatable.column.loanStatus=Estatus +admin.endorsements.detail.datatable.column.amountToPay=Monto a pagar +admin.endorsements.detail.datatable.column.amountPaid=Monto pagado +admin.endorsements.detail.datatable.column.createdOn=Fecha +admin.endorsements.detail.datatable.column.routeCtlg=Ruta +admin.endorsements.detail.datatable.column.comments=Observaciones +admin.endorsements.detail.datatable.column.totalFee=No. de multas +admin.people.form.firstName.require.msg.empty=El primer nombre es obligatorio +admin.people.dialog.firstName.title=Primer nombre +admin.people.dialog.secondName.title=Segundo +admin.people.form.lastName.require.msg.empty=El apellido paterno es obligatorio +admin.people.dialog.lastName.title=Apellido paterno +admin.people.form.middleName.require.msg.empty=El apellido materno es obligatorio +admin.people.dialog.middleName.title=Apellido materno +admin.people.dialog.isCustomer.title=Es cliente +admin.people.dialog.isEndorsement.title=Es aval +admin.people.form.phoneHome.require.msg.empty=El tel\u00e9fono personal es obligatorio +admin.people.dialog.phoneHome.title=Tel\u00e9fono personal +admin.people.form.addressHome.require.msg.empty=El domicilio particular es obligatorio +admin.people.dialog.addressHome.title=Domicilio particular +admin.people.form.phoneBusiness.require.msg.empty=El tel\u00e9fono del negocio es obligatorio +admin.people.dialog.phoneBusiness.title=Tel\u00e9fono del negocio +admin.people.form.addressBusiness.require.msg.empty=El domicilio del negocio es obligatorio +admin.people.dialog.addressBusiness.title=Domicilio del negocio +admin.people.form.companyName.require.msg.empty=El nombre del negocio es obligatorio +admin.people.dialog.companyName.title=Nombre del negocio +admin.people.form.birthdate.require.msg.empty=La fecha de nacimiento es obligatorio +admin.people.dialog.birthdate.title=Fecha de nacimiento +admin.people.form.route.require.msg.empty=La ruta es obligatoria +admin.loans.datatable.empty=No hay pr\u00e9stamos por mostrar. +admin.loans.datatable.column.customer=Cliente +admin.loans.datatable.column.routeCtlg=Ruta +admin.loans.datatable.column.endorsement=Aval +admin.loans.datatable.column.amountPaid=Monto a prestar +admin.loans.datatable.column.loan.amountPaid=Monto pagado +admin.loans.datatable.column.loan.amountToPaid=Monto a pagar +admin.loans.datatable.column.loan.saldo=Saldo insoluto +admin.loans.datatable.column.loanFeeNotifications=No. de multas +admin.loans.datatable.column.asesor=Asesor +admin.loans.datatable.column.createdOn=Fecha +admin.loans.datatable.column.loanStatus=Estatus +admin.loans.datatable.column.comments=Comentarios +admin.loans.datatable.column.office=Sucursal +admin.loan.form.typeLoan.require.msg.empty=El producto es obligatorio +admin.loan.form.customer.require.msg.empty=El cliente es obligatorio +admin.loan.form.endorsement.require.msg.empty=El aval es obligatorio +admin.loan.form.user.require.msg.empty=El asesor es obligatorio +admin.loan.form.loanStatus.require.msg.empty=El estatus es obligatorio +admin.loan.form.field.comments=Comentarios +admin.loan.form.field.createdOn=Fecha +admin.loan.form.field.totalPayment=Total abonado +admin.loan.form.field.totalFee=Total en multas +admin.transfers.datatable.empty=No hay transferencias por mostrar +admin.transfers.datatable.column.userTransmitter=Asesor emisor +admin.transfers.datatable.column.userReceiver=Asesor receptor +admin.transfers.datatable.column.amountToTransfer=Monto +admin.transfers.datatable.column.actionStatus=Estatus +admin.transfer.form.userSend.require.msg.empty=El usuario emisor es obligatorio +admin.transfer.form.userReceive.require.msg.empty=El usuario receptor es obligatorio +admin.transfer.form.field.amountToTransfer=Monto a transferir +admin.moneyDailys.datatable.empty=No hay registros por mostrar +admin.moneyDailys.datatable.column.moneyDailyDate=Fecha +admin.moneyDailys.datatable.column.amount=Monto +admin.moneyDailys.datatable.column.user=Empleado +admin.moneyDaily.form.user.require.msg.empty=El empleado es obligatorio +admin.moneyDaily.form.field.amount=Monto +admin.closingDays.datatable.empty=No hay registros por mostrar +admin.closingDays.datatable.column.user=Usuario +admin.closingDays.datatable.column.amountPaid=Monto reportado +admin.closingDays.datatable.column.amountExpected=Monto a reportar +admin.closingDays.datatable.column.createdOn=Fecha +admin.closingDays.datatable.column.comments=Comentarios +admin.closingDays.form.user.require.msg.empty=El usuario es obligatorio +admin.closingDays.dialog.paymentDaily.title=Monto recuperado +admin.closingDays.dialog.transferSender.title=Monto enviado por transferencia +admin.closingDays.dialog.transferReceiver.title=Monto recibido por transferencia +admin.closingDays.dialog.moneyDaily.title=Monto de inicio +admin.closingDays.dialog.delivery.title=Entrega de prestamos +admin.closingDays.dialog.otherExpense.title=Gastos +admin.closingDays.dialog.total.title=Total +admin.closingDays.dialog.transferPending.title=Transferencias sin autorizar +admin.otherExpenses.datatable.empty=No hay gastos por mostrar +admin.otherExpenses.datatable.column.user=Usuario +admin.otherExpenses.datatable.column.expense=Monto +admin.otherExpenses.datatable.column.description=Comentarios +admin.otherExpense.form.user.require.msg.empty=Debes seleccionar un usuario +admin.otherExpense.form.field.expense=Monto +admin.otherExpense.form.field.description=Descripci\u00f3n +admin.advances.datatable.empty=No hay registros por mostrar. +admin.gasoline.datatable.empty=No hay registros por mostrar. +admin.advances.datatable.column.humanResource=Empleado +admin.advances.datatable.column.amount=Monto +admin.advance.form.humanResource.require.msg.empty=El empleado es obligatorio +admin.advance.form.field.amount=Monto +admin.goals.datatable.empty=No hay registros por mostrar. +admin.goals.datatable.column.startDate=Fecha inicial +admin.goals.datatable.column.endDate=Fecha final +admin.goals.datatable.column.amount=Monto +admin.goal.form.startDate.require.msg.empty=La fecha inicial es obligatoria. +admin.goal.dialog.startDate.title=Fecha inicial +admin.goal.form.endDate.require.msg.empty=La fecha final es obligatoria. +admin.goal.dialog.endDate.title=Fecha final +admin.goal.form.field.amount=Monto +admin.fees.datatable.column.startDate=Fecha inicial +admin.fees.datatable.column.endDate=Fecha final +admin.closingday.datatable.column.startDate=Fecha inicial +admin.closingday.datatable.column.endDate=Fecha final +admin.openingfees.datatable.column.startDate=Fecha inicial +admin.openingfees.datatable.column.endDate=Fecha final +admin.payment.datatable.column.startDate=Fecha inicial +admin.payment.datatable.column.endDate=Fecha final +admin.payroll.datatable.column.startDate=Fecha inicial +admin.payroll.datatable.column.endDate=Fecha final +admin.payroll.datatable.empty=No hay registros por mostrar. +admin.deposits.datatable.column.startDate=Fecha inicial +admin.deposits.datatable.column.endDate=Fecha final +admin.zeropayments.datatable.column.startDate=Fecha inicial +admin.zeropayments.datatable.column.endDate=Fecha final +admin.employeesaving.datatable.column.startDate=Fecha inicial +admin.employeesaving.datatable.column.endDate=Fecha final +admin.advances.datatable.column.startDate=Fecha inicial +admin.advances.datatable.column.endDate=Fecha final +admin.gasoline.datatable.column.startDate=Fecha inicial +admin.gasoline.datatable.column.endDate=Fecha final +admin.expenseCompany.datatable.empty=No hay registros por mostrar +admin.expenseCompany.datatable.column.createdOn=Fecha +admin.expenseCompany.datatable.column.amount=Monto +admin.expenseCompany.datatable.column.description=Motivo +admin.expenseCompany.form.field.amount=Monto +admin.expenseCompany.form.field.comments=Motivo +admin.stableGeneralBox.datatable.empty=No hay registros por mostrar +admin.stableGeneralBox.datatable.column.createdOn=Fecha +admin.stableGeneralBox.datatable.column.totalGeneralBox=Total en caja +admin.stableGeneralBox.datatable.column.totalEnvelope=Deje en sobres +admin.stableGeneralBox.datatable.column.totalBankNote=Efectivo +admin.stableGeneralBox.datatable.column.totalCoin=Monedas +admin.stableGeneralBox.datatable.column.totalStable=Diferencia +admin.stableGeneralBox.datatable.column.description=Descripci\u00f3n +admin.stableSmallBox.datatable.empty=No hay registros por mostrar +admin.stableSmallBox.datatable.column.createdOn=Fecha +admin.stableSmallBox.datatable.column.totalSmallBox=Total en caja chica +admin.stableSmallBox.datatable.column.totalEnvelope=Deje en sobres +admin.stableSmallBox.datatable.column.totalBankNote=Efectivo +admin.stableSmallBox.datatable.column.totalCoin=Monedas +admin.stableSmallBox.datatable.column.totalStable=Diferencia +admin.stableSmallBox.datatable.column.description=Descripci\u00f3n +admin.bonuss.datatable.empty=No hay registros por mostrar +admin.bonuss.datatable.column.name=Nombre +admin.bonuss.datatable.column.loanBonus=Porcentaje/Monto por colocaci\u00f3n +admin.bonuss.datatable.column.moraBonus=Porcentaje/Monto por mora +admin.bonuss.datatable.column.newCustomerBonus=Porcentaje/Monto por nuevos clientes +admin.bonuss.datatable.column.administrative=Administrativo +admin.payroll.form.user.require.msg.empty=El usuario es requerido +admin.payroll.form.field.dateInit=Fecha inicial +admin.payroll.form.field.dateEnd=Fecha final +admin.payroll.dialog.salary.title=Salario +admin.payroll.dialog.imss.title=IMSS +admin.payroll.dialog.advances.title=Adelantos +admin.payroll.dialog.bonusColocation.title=Bono de colocaci\u00f3n +admin.payroll.dialog.newCustomer.title=Bono por clientes nuevos +admin.payroll.dialog.bonusMora.title=Bono por mora +admin.payroll.dialog.granTotal.title=Total +admin.payrolls.datatable.empty=Sin registros que mostrar +admin.payrolls.datatable.column.hr=Empleado +admin.payrolls.datatable.column.salary=Salario +admin.payrolls.datatable.column.imss=Imss +admin.payrolls.datatable.column.advance=Adelantos +admin.payrolls.datatable.column.totalBonusNewCustomer=Bono por clientes nuevos +admin.payrolls.datatable.column.totalBonusColocation=Bono por colocaci\u00f3n +admin.payrolls.datatable.column.totalBonusMora=Bono por mora +admin.payrolls.datatable.column.discounts=Descuentos +admin.payrolls.datatable.column.commentsDiscounts=Comentarios por descuentos +admin.payrolls.datatable.column.increases=Incremento extra +admin.payrolls.datatable.column.commentsIncreases=Comentarios por incremento +admin.payrolls.datatable.column.totalPayment=Total n\u00f3mina +admin.payrolls.datatable.column.totalDaysSalary=D\u00edas para salario +admin.payrolls.datatable.column.totalDaysBonus=D\u00edas para bonos +admin.payrolls.datatable.column.observation=Observaciones +admin.payrolls.datatable.column.createdOn=Fecha +############ +# Outcomes # +############ +outcome.dashboard=/dashboard +outcome.system.user.add=/app/system/user/add/main +outcome.system.user.setting=/app/system/user/setting/main +outcome.system.user.access=/app/system/user/access/main +outcome.system.log=/app/system/log/main +outcome.system.office=/app/system/office/index +outcome.employee=/app/system/employee/main +outcome.employee.employeeList=/app/system/employee/employeeList +outcome.catalog.role=/app/catalog/role/index +outcome.catalog.typeLoan=/app/catalog/loanType/index +outcome.catalog.typeLoan.add=/app/catalog/loanType/add +outcome.catalog.route=/app/catalog/route/index +outcome.admin.customer=/app/admin/customer/index +outcome.admin.customer.detail=/app/admin/customer/detail +outcome.admin.endorsement=/app/admin/endorsement/index +outcome.admin.endorsement.detail=/app/admin/endorsement/detail +outcome.admin.endorsement.customer.add=/app/admin/customer/add +outcome.admin.loan.pending=/app/admin/loan/index +outcome.admin.loan.pending.detail=/app/admin/loan/detail +outcome.admin.loan.history=/app/admin/loan/history +outcome.admin.loan.loanDetailTransfer=/app/admin/loan/loanDetailTransfer +outcome.admin.loan.historyJuridical=/app/admin/loan/historyJuridical +outcome.admin.loan.drive=/app/admin/loan/drive +outcome.admin.loan.renovation=/app/admin/loan/loanRenovationWeekly +outcome.admin.loan.drive.last=/app/admin/loan/driveLast +outcome.admin.loan.drive.date=/app/admin/loan/driveDate +outcome.admin.loan.history.detail=/app/admin/loan/historyDetail +outcome.admin.loan.change.owner=/app/admin/loan/changeOwner +outcome.admin.financial.transfer=/app/admin/transfer/index +outcome.admin.financial.moneyDaily=/app/admin/moneyDaily/index +outcome.admin.financial.closingDay=/app/admin/closingDay/index +outcome.admin.financial.closingDayHistory=/app/admin/closingDay/history +outcome.admin.financial.closingDayHistory.detail=/app/admin/closingDay/detail +outcome.admin.financial.stableSmallBox=/app/admin/stableSmallBox/index +outcome.admin.financial.stableSmallBoxHistory=/app/admin/stableSmallBox/history +outcome.admin.financial.otherExpense=/app/admin/otherExpense/index +outcome.admin.payroll.goal=/app/payroll/goal/index +outcome.admin.payroll.bonus=/app/payroll/bonus/index +outcome.admin.payroll.advance=/app/payroll/advance/index +outcome.admin.payroll.create=/app/payroll/createPayroll/index +outcome.admin.payroll.history=/app/payroll/history +outcome.admin.vehicles.addvehicle=/app/admin/vehicles/main +outcome.admin.fees.fees=/app/stats/feesByRoute/index +outcome.admin.stats.fees=/app/stats/fees/index +outcome.admin.stats.closingday=/app/stats/closingDay/index +outcome.admin.stats.openingfee=/app/stats/openingFee/index +outcome.admin.stats.payment=/app/stats/payment/index +outcome.admin.stats.paymentroute=/app/stats/paymentRoute/index +outcome.admin.stats.payroll=/app/stats/payroll/index +outcome.admin.stats.deposits=/app/stats/deposits/index +outcome.admin.stats.zeropayments=/app/stats/zeroPayments/index +outcome.admin.stats.employeesaving=/app/stats/employeeSaving/index +outcome.admin.stats.advances=/app/stats/advances/index +outcome.admin.stats.paymentrenovation=/app/stats/paymentRenovation/index +outcome.admin.stats.gasoline=/app/stats/gasoline/index +outcome.admin.stats.vehicle=/app/stats/vehicles/index +outcome.admin.stats.summary=/app/stats/summary/index +outcome.payroll.loanemployee=/app/payroll/loanEmployee/index +outcome.admin.general.box.expense.company.in=/app/generalBox/expenseCompanyIn/index +outcome.admin.general.box.expense.company.out=/app/generalBox/expenseCompanyOut/index +outcome.admin.general.box.stable=/app/generalBox/stableGeneralBox/index +outcome.admin.general.box.history=/app/generalBox/stableGeneralBox/history +outcome.privacy=/app/topbar/privacy +outcome.admin.customer.without.loan.detail=/customerWithoutLoanDetail +outcome.dashboard.loan.detail=/loanDetail +outcome.dashboard.loan.detailEndorsement=/loanDetailEndorsement +outcome.system.bitacora=/app/system/bitacora/index + +outcome.admin.inventarios=/app/admin/inventarios/index +########### +# General # +########### +profile=Perfil +privacy=Privacidad +setting=Configuraci\u00f3n +logout=Salir +choose.office=Seleccione la sucursal +office=Sucursal +office.selected=Sucursal {0} +photo.add=Agregar imagen +select=Seleccionar +upload=Cargar +cancel=Cancelar +add=Agregar +add.all=Agregar todos +remove=Quitar +remove.all=Quitar todos +arrebol.reserved=Todos los Derechos Reservados. +validator.select.office=Oficina no v\u00e1lida. +office.confirm.header=Cambiar de sucursal +office.confirm.question=\u00bfEstas seguro que deseas cambiar de sucursal? +pwd.promptLabel=Introduce tu contrase\u00f1a +pwd.weakLabel=Contrase\u00f1a d\u00e9bil +pwd.goodLabel=Contrase segura +pwd.strongLabel=Contrase\u00f1a s\u00faper segura +pwd.promptLabel.confirm=Confirma tu contrase\u00f1a +pwd.match.passwords=Las contrase\u00f1as son diferentes. +pattern.date=dd - MMMM - yyyy +pick.down=Bajar +pick.up=Subir +pick.bottom=Mover al fondo +pick.top=Mover al inicio +pick.add=Agregar +pick.add.all=Agregar todos +pick.remove=Remover +pick.remove.all=Remover todos +dual.list.permissions.required=Seleccione al menos un permiso +dual.list.permissions.available=Permisos disponibles +dual.list.permissions.taken=Permisos asignados +dual.list.routes.required=Seleccione al menos una ruta +dual.list.routes.available=Rutas disponibles +dual.list.routes.taken=Rutas asignadas +permission.add.btn=Asisgar permisos +permission.update.btn=Actualizar permisos +permission.confirm.header=Datos del trabajador +permission.confirm.question=\u00bfLos datos del trabajador son correctos? +permission=Permiso +screen=Pantalla +confirm.yes=Aceptar +confirm.no=Rechazar +invalid.file=Imagen no v\u00e1lida. +invalid.size=Imagen muy grande. +user.required=Usuario requerido. +user.load.permission=\u00bfQuiere buscar los permisos del usuario? +button.add=Agregar +general.search=Buscar +button.edit=Editar +button.save=Guardar +button.authorize=Autorizar +general.confirm.header=Validaci\u00f3n de informaci\u00f3n +general.confirm.confirm=\u00bfEst\u00e1s seguro de continuar con la acci\u00f3n? +salario=Salario +imss=IMSS +payment.required=Salario obligatorio +imss.required=IMSS obligatorio +other.actions=Otras acciones +choose.action=Elegir acci\u00f3n +execute.action=Ejecutar acci\u00f3n +change.owner=Cambiar asesor +change.owner.of.loans=Cambiar los prestamos al asesor destino +current.owner.select=Elegir asesor origen +current.owner.select.name=Nombre del asesor origen +new.owner.select=Elegir asesor destino +new.owner.select.name=Nombre del asesor destino +current.owner.from=Prestamos asesor origen +current.owner.to=Prestamos asesor destino +dual.list.current.owner.required=Seleccione al menos un presamo a cambiar de asesor +change.owner.confirm.question=\u00bfDesea cambiar los prestamos al asesor destino? +stats.closingday=Corte +stats.openingFees=Comisi\u00f3n por apertura +stats.openingFees.comisiones=Comisiones +stats.payment=Cobro de cartera +stats.paymentrenovation=Pagos renovados +stats.paymentroute=Cobro de cartera por ruta +stats.payment.cobros=Cobros +stats.payroll=N\u00f3mina +stats.deposits=Dep\u00f3sitos +stats.zeropayments=Abonos en cero +stats.employeesaving=Ahorro empleados +stats.advances=Adelantos +stats.gasoline=Gasolinas \ No newline at end of file diff --git a/apc-web/src/main/resources/com/arrebol/apc/i18n/app_background.properties b/apc-web/src/main/resources/com/arrebol/apc/i18n/app_background.properties new file mode 100644 index 0000000..d59dfe6 --- /dev/null +++ b/apc-web/src/main/resources/com/arrebol/apc/i18n/app_background.properties @@ -0,0 +1,45 @@ +############################ +# Login and Recovery forms # +############################ +error.access.title=\u00a1Acceso denegado! +error.access.details=Verifica tus datos de ingreso. +fatal.access.title=\u00a1APC fuera de l\u00ednea! +fatal.access.details=Por favor contacta a tu administrador. +############## +# Validators # +############## +validators.email=Correo no v\u00e1lido. +validators.password=Contrase\u00f1a no v\u00e1lida. +validator.select.one.menu.invalid.option=Opci\u00f3n no v\u00e1lida. +user=Usuario +employee=Empleado +loanType=Tipo de pr\u00e9stamo +people=Persona +prmssn.update.title=Actualizaci\u00f3n de Permisos +prmssn.add.true=Se asignaron los permisos al usuario. +prmssn.add.false=No asignaron los permisos al usuario. +prmssn.add.exception=Grave error al asignar los permisos al usuario. +############## +# generic # +############## +updated=actualizado +deleted=borrado +created=creado +enebled=habilitado +disabled=deshabilitado +searching=cargado de datos +available=disponible +process=procesamiento +password=contrase\u00f1a +modified=modificada +change.owner.upper=Cambio de Asesor +change.owner=Cambio de asesor +message.format.sucess=\u00a1{0} {1}! +message.format.failure=\u00a1{0} no {1}! +message.format.fatal=Grave error en el {0} +generic.title=APC +generic.true=\u00a1Operaci\u00f3n exitosa! +generic.false=\u00a1No se pudo realizar la operac\u00f3n! +generic.exception=\u00a1Error! Contacte al administrado. +generic.start.date=Fecha inicio +generic.end.date.error=La fecha de inicio no puede ser mayor a la fecha final \ No newline at end of file diff --git a/apc-web/src/main/resources/com/arrebol/apc/i18n/app_permission.properties b/apc-web/src/main/resources/com/arrebol/apc/i18n/app_permission.properties new file mode 100644 index 0000000..847cd39 --- /dev/null +++ b/apc-web/src/main/resources/com/arrebol/apc/i18n/app_permission.properties @@ -0,0 +1,357 @@ +################## +# DASHBOARD Menu # +################## +public.access=Acceso Publico +############### +# SYSTEM Menu # +############### +#Add users +system.employee=Empleado +system.employee.description=Men\u00fa empleado. +system.employee.path=Sistema / Empleado + +system.employee.add=Crear empleado +system.employee.add.description=Permite crear empleados. +system.employee.add.path=Sistema / Empleado (crear) + +system.employee.enebled=Habilitar empleado +system.employee.enebled.description=Permite habilitar empleados. +system.employee.enebled.path=Sistema / Empleado (Habilitar) + +system.employee.disabled=Deshabilitar empleado +system.employee.disabled.description=Permite deshabilitar empleados. +system.employee.disabled.path=Sistema / Empleado (Deshabilitar) + +system.employee.deleted=Borrar empleado +system.employee.deleted.description=Permite borrar empleados. +system.employee.deleted.path=Sistema / Empleado (Borrar) + +system.employee.updated=Actualizar empleado +system.employee.updated.description=Permite actualizar empleados. +system.employee.updated.path=Sistema / Empleado (Actualizar) +#Add users +system.user.create=Crear usuarios +system.user.create.description=Permite agregar Usuarios. +system.user.create.path=Sistema / Usuarios / Alta + +system.user.create.permission=Asignar permisos +system.user.create.permission.description=Permite asignar permisos a usuarios nuevos. +system.user.create.permission.path=Sistema / Usuarios / Alta (Asignar permisos) +#Settings users +system.user.admin=Actualizaci\u00f3n +system.user.admin.description=Permite la actualizaci\u00f3n de los usuarios del sistema. +system.user.admin.path=Sistema / Usuarios / Actualizaci\u00f3n + +system.user.admin.enebled=Habilitar usuarios +system.user.admin.enebled.description=Permite habilitar usuarios. +system.user.admin.enebled.path=Sistema / Usuarios / Actualizaci\u00f3n (Habilitar) + +system.user.admin.disabled=Deshabilitar usuarios +system.user.admin.disabled.description=Permite deshabilitar usuarios. +system.user.admin.disabled.path=Sistema / Usuarios / Actualizaci\u00f3n (Deshabilitar) + +system.user.admin.deleted=Borrar usuarios +system.user.admin.deleted.description=Permite borrar usuarios. +system.user.admin.deleted.path=Sistema / Usuarios / Actualizaci\u00f3n (Borrar) + +system.user.admin.updated=Cambiar nombre de usuarios +system.user.admin.updated.description=Permite cambiar nombre de usuarios. +system.user.admin.updated.path=Sistema / Usuarios / Actualizaci\u00f3n (Nombre de usuario) + +system.user.admin.pwd=Modificar contrase\u00f1a de usuarios +system.user.admin.pwd.description=Permite modificar contrase\u00f1a de usuarios. +system.user.admin.pwd.path=Sistema / Usuarios / Actualizaci\u00f3n (Modificar Contrase\u00f1a) + +system.user.admin.avatar=Cargar imagen de usuarios +system.user.admin.avatar.description=Permite cargar imagen de usuarios. +system.user.admin.avatar.path=Sistema / Usuarios / Actualizaci\u00f3n (Cargar imagen) +#Access users +system.user.access=Acceso +system.user.access.description=Permite agregar/eliminar accesos a los usuairos del sistema. +system.user.access.path=Sistema / Usuarios / Acceso +#Office +system.office=Oficina +system.office.description=Men\u00fa oficina. +system.office.path=Sistema / Oficina + +system.office.add=Crear oficina +system.office.add.description=Permite crear una oficina. +system.office.add.path=Sistema / Oficina / Alta + +system.office.updated=Editar oficina +system.office.updated.description=Permite editar una oficina. +system.office.updated.path=Sistema / Oficina / Editar + +system.office.deleted=Eliminar oficina +system.office.deleted.description=Permite eliminar una oficina. +system.office.deleted.path=Sistema / Oficina / Eliminar + +############### +# CATALOG Menu # +############### +#Puestos +catalog.role=Puesto +catalog.role.description=Men\u00fa puesto. +catalog.role.path=Cat\u00e1logo / Puesto + +catalog.role.add=Crear puesto +catalog.role.add.description=Men\u00fa puesto. +catalog.role.add.path=Cat\u00e1logo / Puesto (crear) + +catalog.role.updated=Editar puesto +catalog.role.updated.description=Permite editar puesto. +catalog.role.updated.path=Cat\u00e1logo / Puesto (editar) + +catalog.role.deleted=Eliminar puesto +catalog.role.deleted.description=Permite eliminar puesto. +catalog.role.deleted.path=Cat\u00e1logo / Puesto (eliminar) +#Tipo prestamo +catalog.typeLoan=Productos +catalog.typeLoan.description=Men\u00fa de productos. +catalog.typeLoan.path=Cat\u00e1logo / Productos + +catalog.typeLoan.add=Crear producto +catalog.typeLoan.add.description=Men\u00fa de productos. +catalog.typeLoan.add.path=Cat\u00e1logo / Producto (crear) + +catalog.typeLoan.updated=Editar tipo de pr\u00e9stamos +catalog.typeLoan.updated.description=Permite editar tipo de pr\u00e9stamos. +catalog.typeLoan.updated.path=Cat\u00e1logo / Tipo de pr\u00e9stamos (editar) + +catalog.typeLoan.deleted=Eliminar tipo de pr\u00e9stamos +catalog.typeLoan.deleted.description=Permite eliminar tipo de pr\u00e9stamos. +catalog.typeLoan.deleted.path=Cat\u00e1logo / Tipo de pr\u00e9stamos (eliminar) +#Rutas +catalog.route=Rutas +catalog.route.description=Men\u00fa de rutas. +catalog.route.path=Cat\u00e1logo / Rutas + +catalog.route.add=Crear rutas +catalog.route.add.description=Men\u00fa rutas. +catalog.route.add.path=Cat\u00e1logo / Rutas (crear) + +catalog.route.updated=Editar rutas +catalog.route.updated.description=Permite editar rutas. +catalog.route.updated.path=Cat\u00e1logo / Rutas (editar) + +catalog.route.deleted=Eliminar rutas +catalog.route.deleted.description=Permite eliminar rutas. +catalog.route.deleted.path=Cat\u00e1logo / Rutas (eliminar) +#Clientes +admin.customer=Clientes +admin.customer.description=Men\u00fa de clientes. +admin.customer.path=Administraci\u00f3n / Clientes + +admin.customer.add=Crear clientes +admin.customer.add.description=Men\u00fa de clientes. +admin.customer.add.path=Administraci\u00f3n / Clientes (crear) + +admin.customer.updated=Editar clientes +admin.customer.updated.description=Permite editar clientes. +admin.customer.updated.path=Administraci\u00f3n / Clientes (editar) + +admin.customer.deleted=Eliminar clientes +admin.customer.deleted.description=Permite eliminar clientes. +admin.customer.deleted.path=Administraci\u00f3n / Clientes (eliminar) +#Avales +admin.endorsement=Avales +admin.endorsement.description=Men\u00fa de avales. +admin.endorsement.path=Administraci\u00f3n / Avales + +admin.endorsement.add=Crear avales +admin.endorsement.add.description=Men\u00fa de avales. +admin.endorsement.add.path=Administraci\u00f3n / Avales (crear) + +admin.endorsement.updated=Editar avales +admin.endorsement.updated.description=Permite editar avales. +admin.endorsement.updated.path=Administraci\u00f3n / Avales (editar) + +admin.endorsement.deleted=Eliminar avales +admin.endorsement.deleted.description=Permite eliminar avales. +admin.endorsement.deleted.path=Administraci\u00f3n / Avales (eliminar) +#Prestamos +admin.loan=Pr\u00e9stamos +admin.loan.description=Men\u00fa de pr\u00e9stamos. +admin.loan.path=Administraci\u00f3n / Pr\u00e9stamos + +admin.loan.add=Crear pr\u00e9stamos +admin.loan.add.description=Men\u00fa de pr\u00e9stamos. +admin.loan.add.path=Administraci\u00f3n / Pr\u00e9stamos (crear) + +admin.loan.updated=Editar pr\u00e9stamos +admin.loan.updated.description=Permite editar pr\u00e9stamos. +admin.loan.updated.path=Administraci\u00f3n / Pr\u00e9stamos (editar) + +admin.loan.deleted=Eliminar pr\u00e9stamos +admin.loan.deleted.description=Permite eliminar pr\u00e9stamos. +admin.loan.deleted.path=Administraci\u00f3n / Pr\u00e9stamos (eliminar) + +admin.loan.change.owner=Cambiar asesor +admin.loan.change.owner.description=Submen\u00fa cambiar asesor. +admin.loan.change.owner.path=Administraci\u00f3n / Pr\u00e9stamos / Cambiar asesor + +admin.loan.change.owner.update=Cambiar prestamo asesor +admin.loan.change.owner.update.description=Permite cambiar el prestamo de asesor origen para el asesor destino. +admin.loan.change.owner.update.path=Administraci\u00f3n / Pr\u00e9stamos / Cambiar asesor (bot\u00f3n cambiar asesor) +#Transferencias +admin.transfer=Transferencias +admin.transfer.description=Men\u00fa de transferencias. +admin.transfer.path=Administraci\u00f3n / Transferencias + +admin.transfer.add=Crear transferencias +admin.transfer.add.description=Men\u00fa de transferencias. +admin.transfer.add.path=Administraci\u00f3n / Transferencias (crear) + +admin.transfer.updated=Editar transferencias +admin.transfer.updated.description=Permite editar transferencias. +admin.transfer.updated.path=Administraci\u00f3n / Transferencias (editar) + +admin.transfer.deleted=Eliminar transferencias +admin.transfer.deleted.description=Permite eliminar transferencias. +admin.transfer.deleted.path=Administraci\u00f3n / Transferencias (eliminar) +#Entregas diarias +admin.moneyDaily=Entregas diarias +admin.moneyDaily.description=Men\u00fa de entregas diarias. +admin.moneyDaily.path=Administraci\u00f3n / Entregas diarias + +admin.moneyDaily.add=Crear entregas diarias +admin.moneyDaily.add.description=Men\u00fa de entregas diarias. +admin.moneyDaily.add.path=Administraci\u00f3n / Entregas diarias (crear) + +admin.moneyDaily.updated=Editar entregas diarias +admin.moneyDaily.updated.description=Permite editar entregas diarias. +admin.moneyDaily.updated.path=Administraci\u00f3n / Entregas diarias (editar) + +admin.moneyDaily.deleted=Eliminar entregas diarias +admin.moneyDaily.deleted.description=Permite eliminar entregas diarias. +admin.moneyDaily.deleted.path=Administraci\u00f3n / Entregas diarias (eliminar) +#Cierre del dia +admin.closingDay=Corte del d\u00eda +admin.closingDay.description=Men\u00fa del corte del d\u00eda. +admin.closingDay.path=Administraci\u00f3n / Corte del d\u00eda + +admin.closingDay.add=Crear del corte del d\u00eda +admin.closingDay.add.description=Men\u00fa del corte del d\u00eda. +admin.closingDay.add.path=Administraci\u00f3n / Corte del d\u00eda (crear) + +admin.closingDay.updated=Editar el corte del d\u00eda +admin.closingDay.updated.description=Permite editar el corte del d\u00eda. +admin.closingDay.updated.path=Administraci\u00f3n / Corte del d\u00eda (editar) + +admin.closingDay.deleted=Eliminar el corte del d\u00eda +admin.closingDay.deleted.description=Permite eliminar el corte del d\u00eda. +admin.closingDay.deleted.path=Administraci\u00f3n / Corte del d\u00eda (eliminar) +#Otros gastos +admin.otherExpense=Gastos +admin.otherExpense.description=Men\u00fa de gastos. +admin.otherExpense.path=Administraci\u00f3n / Gastos + +admin.otherExpense.add=Crear gastos +admin.otherExpense.add.description=Men\u00fa de gastos. +admin.otherExpense.add.path=Administraci\u00f3n / Gastos (crear) + +admin.otherExpense.updated=Editar gastos +admin.otherExpense.updated.description=Permite editar gastos. +admin.otherExpense.updated.path=Administraci\u00f3n / Gastos (editar) + +admin.otherExpense.deleted=Eliminar gastos +admin.otherExpense.deleted.description=Permite eliminar gastos. +admin.otherExpense.deleted.path=Administraci\u00f3n / Gastos (eliminar) +#Metas +admin.goal=Metas +admin.goal.description=Men\u00fa de metas. +admin.goal.path=Administraci\u00f3n / Metas + +admin.goal.add=Crear metas +admin.goal.add.description=Men\u00fa de metas. +admin.goal.add.path=Administraci\u00f3n / Metas (crear) + +admin.goal.updated=Editar metas +admin.goal.updated.description=Permite editar metas. +admin.goal.updated.path=Administraci\u00f3n / Metas (editar) + +admin.goal.deleted=Eliminar metas +admin.goal.deleted.description=Permite eliminar metas. +admin.goal.deleted.path=Administraci\u00f3n / Metas (eliminar) +#Bonos +admin.bonus=Bonos +admin.bonus.description=Men\u00fa de bonos. +admin.bonus.path=Administraci\u00f3n / Bonos + +admin.bonus.add=Crear bonos +admin.bonus.add.description=Men\u00fa de bonos. +admin.bonus.add.path=Administraci\u00f3n / Bonos (crear) + +admin.bonus.updated=Editar bonos +admin.bonus.updated.description=Permite editar bonos. +admin.bonus.updated.path=Administraci\u00f3n / Bonos (editar) + +admin.bonus.deleted=Eliminar bonos +admin.bonus.deleted.description=Permite eliminar bonos. +admin.bonus.deleted.path=Administraci\u00f3n / Bonos (eliminar) +#Adelantos +admin.advance=Adelantos +admin.advance.description=Men\u00fa de adelantos. +admin.advance.path=Administraci\u00f3n / Adelantos + +admin.advance.add=Crear adelantos +admin.advance.add.description=Men\u00fa de adelantos. +admin.advance.add.path=Administraci\u00f3n / Adelantos (crear) + +admin.advance.updated=Editar adelantos +admin.advance.updated.description=Permite editar adelantos. +admin.advance.updated.path=Administraci\u00f3n / Adelantos (editar) + +admin.advance.deleted=Eliminar adelantos +admin.advance.deleted.description=Permite eliminar adelantos. +admin.advance.deleted.path=Administraci\u00f3n / Adelantos (eliminar) +#Entradas caja general +admin.expenseCompanyIn=Entradas +admin.expenseCompanyIn.description=Men\u00fa de entradas. +admin.expenseCompanyIn.path=Administraci\u00f3n / Entradas + +admin.expenseCompanyIn.add=Crear entradas +admin.expenseCompanyIn.add.description=Men\u00fa de entradas. +admin.expenseCompanyIn.add.path=Administraci\u00f3n / Entradas (crear) + +admin.expenseCompanyIn.updated=Editar entradas +admin.expenseCompanyIn.updated.description=Permite editar entradas. +admin.expenseCompanyIn.updated.path=Administraci\u00f3n / Entradas (editar) + +admin.expenseCompanyIn.deleted=Eliminar entradas +admin.expenseCompanyIn.deleted.description=Permite eliminar entradas. +admin.expenseCompanyIn.deleted.path=Administraci\u00f3n / Entradas (eliminar) +#Salidas caja general +admin.expenseCompanyOut=Salidas +admin.expenseCompanyOut.description=Men\u00fa de salidas. +admin.expenseCompanyOut.path=Administraci\u00f3n / Salidas + +admin.expenseCompanyOut.add=Crear salidas +admin.expenseCompanyOut.add.description=Men\u00fa de salidas. +admin.expenseCompanyOut.add.path=Administraci\u00f3n / Salidas (crear) + +admin.expenseCompanyOut.updated=Editar salidas +admin.expenseCompanyOut.updated.description=Permite editar salidas. +admin.expenseCompanyOut.updated.path=Administraci\u00f3n / Salidas (editar) + +admin.expenseCompanyOut.deleted=Eliminar salidas +admin.expenseCompanyOut.deleted.description=Permite eliminar salidas. +admin.expenseCompanyOut.deleted.path=Administraci\u00f3n / Salidas (eliminar) +#Cuadres caja general +admin.stableGeneralBox=Cuadre de caja +admin.stableGeneralBox.description=Men\u00fa de cuadre de caja. +admin.stableGeneralBox.path=Administraci\u00f3n / Cuadre de caja + +admin.stableGeneralBox.add=Crear cuadre de caja +admin.stableGeneralBox.add.description=Men\u00fa de cuadre de caja. +admin.stableGeneralBox.add.path=Administraci\u00f3n / Cuadre de caja (crear) + +admin.stableGeneralBox.updated=Editar cuadre de caja +admin.stableGeneralBox.updated.description=Permite editar cuadre de caja. +admin.stableGeneralBox.updated.path=Administraci\u00f3n / Cuadre de caja (editar) + +admin.stableGeneralBox.deleted=Eliminar cuadre de caja +admin.stableGeneralBox.deleted.description=Permite eliminar cuadre de caja. +admin.stableGeneralBox.deleted.path=Administraci\u00f3n / Cuadre de caja (eliminar) +#Estad\u00edsticas/Multas +admin.fees=Multas \ No newline at end of file diff --git a/apc-web/src/main/resources/log4j2.xml b/apc-web/src/main/resources/log4j2.xml new file mode 100644 index 0000000..fc24817 --- /dev/null +++ b/apc-web/src/main/resources/log4j2.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + %d{dd-MM-yyyy HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-web/src/main/webapp/META-INF/context.xml b/apc-web/src/main/webapp/META-INF/context.xml new file mode 100644 index 0000000..81a8317 --- /dev/null +++ b/apc-web/src/main/webapp/META-INF/context.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + diff --git a/apc-web/src/main/webapp/WEB-INF/error-pages/access.xhtml b/apc-web/src/main/webapp/WEB-INF/error-pages/access.xhtml new file mode 100644 index 0000000..0d4e1e2 --- /dev/null +++ b/apc-web/src/main/webapp/WEB-INF/error-pages/access.xhtml @@ -0,0 +1,37 @@ + + + + + + + + + + + + #{i18n['project.short.name']} + + + +
+
+ +
+ +
+
+ +
+

#{i18n['error.forbidden']}

+

#{i18n['error.contact.admin']}

+ +
+
+ + +
+ + \ No newline at end of file diff --git a/apc-web/src/main/webapp/WEB-INF/error-pages/error.xhtml b/apc-web/src/main/webapp/WEB-INF/error-pages/error.xhtml new file mode 100644 index 0000000..31fbba2 --- /dev/null +++ b/apc-web/src/main/webapp/WEB-INF/error-pages/error.xhtml @@ -0,0 +1,38 @@ + + + + + + + + + + + + #{i18n['project.short.name']} + + + +
+
+ +
+ +
+ +
+ +
+

#{i18n['error.title']}

+

#{i18n['error.contact.admin']}

+ +
+
+ + +
+ + diff --git a/apc-web/src/main/webapp/WEB-INF/error-pages/notfound.xhtml b/apc-web/src/main/webapp/WEB-INF/error-pages/notfound.xhtml new file mode 100644 index 0000000..72b9bb4 --- /dev/null +++ b/apc-web/src/main/webapp/WEB-INF/error-pages/notfound.xhtml @@ -0,0 +1,37 @@ + + + + + + + + + + + #{i18n['project.short.name']} + + + +
+
+ +
+ +
+ +
+ +
+

#{i18n['error.not.found']}

+

#{i18n['error.contact.admin']}

+ +
+
+ + +
+ + \ No newline at end of file diff --git a/apc-web/src/main/webapp/WEB-INF/faces-config.xml b/apc-web/src/main/webapp/WEB-INF/faces-config.xml new file mode 100644 index 0000000..ca7d5d9 --- /dev/null +++ b/apc-web/src/main/webapp/WEB-INF/faces-config.xml @@ -0,0 +1,46 @@ + + + + + + + + com.arrebol.apc.i18n.app + i18n + + + com.arrebol.apc.i18n.app_permission + permission + + + + com.arrebol.apc.i18n.app_background + + + + taxiservicios + + + org.primefaces.component.SerenityMenu + org.primefaces.serenity.component.SerenityMenu + + + + + org.primefaces.component + org.primefaces.component.SerenityMenuRenderer + org.primefaces.serenity.component.SerenityMenuRenderer + + + \ No newline at end of file diff --git a/apc-web/src/main/webapp/WEB-INF/footer.xhtml b/apc-web/src/main/webapp/WEB-INF/footer.xhtml new file mode 100644 index 0000000..aff3f44 --- /dev/null +++ b/apc-web/src/main/webapp/WEB-INF/footer.xhtml @@ -0,0 +1,15 @@ + + + + \ No newline at end of file diff --git a/apc-web/src/main/webapp/WEB-INF/primefaces-serenity.taglib.xml b/apc-web/src/main/webapp/WEB-INF/primefaces-serenity.taglib.xml new file mode 100644 index 0000000..6fa2673 --- /dev/null +++ b/apc-web/src/main/webapp/WEB-INF/primefaces-serenity.taglib.xml @@ -0,0 +1,66 @@ + + + + http://primefaces.org/serenity + + + + menu + + org.primefaces.component.SerenityMenu + org.primefaces.component.SerenityMenuRenderer + + + + id + false + java.lang.String + + + + rendered + false + java.lang.Boolean + + + + binding + false + javax.faces.component.UIComponent + + + + widgetVar + false + java.lang.String + + + + model + false + org.primefaces.model.menu.MenuModel + + + + style + false + java.lang.String + + + + styleClass + false + java.lang.String + + + + closeDelay + false + java.lang.Integer + 250 + + + \ No newline at end of file diff --git a/apc-web/src/main/webapp/WEB-INF/sidebar.xhtml b/apc-web/src/main/webapp/WEB-INF/sidebar.xhtml new file mode 100644 index 0000000..4e5a28c --- /dev/null +++ b/apc-web/src/main/webapp/WEB-INF/sidebar.xhtml @@ -0,0 +1,419 @@ + + +
+ + +
+ +
+
+ +
diff --git a/apc-web/src/main/webapp/WEB-INF/template.xhtml b/apc-web/src/main/webapp/WEB-INF/template.xhtml new file mode 100644 index 0000000..e9782a0 --- /dev/null +++ b/apc-web/src/main/webapp/WEB-INF/template.xhtml @@ -0,0 +1,71 @@ + + + + + + + + + + + <ui:insert name="title">#{i18n['project.short.name']}</ui:insert> + + + + + + + +
+ + +
+ + +
+
    +
  • +
  • /
  • + +
+ +
+ + + + + +
+
+ +
+ +
+ + + +
+
+
+ + + + + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/apc-web/src/main/webapp/WEB-INF/topbar.xhtml b/apc-web/src/main/webapp/WEB-INF/topbar.xhtml new file mode 100644 index 0000000..eb2432b --- /dev/null +++ b/apc-web/src/main/webapp/WEB-INF/topbar.xhtml @@ -0,0 +1,109 @@ + + +
+ + + + + + + + + + + + +
+ + + + +
+
+ +
\ No newline at end of file diff --git a/apc-web/src/main/webapp/WEB-INF/web.xml b/apc-web/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..199d61a --- /dev/null +++ b/apc-web/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,241 @@ + + + + + + 120 + + + dashboard.jsf + + + javax.faces.STATE_SAVING_METHOD + server + + + javax.faces.PROJECT_STAGE + Development + + + primefaces.THEME + serenity-green + + + primefaces.FONT_AWESOME + true + + + javax.faces.FACELETS_LIBRARIES + /WEB-INF/primefaces-serenity.taglib.xml + + + + org.apache.webbeans.servlet.WebBeansConfigurationListener + + + com.sun.faces.config.ConfigureListener + + + Character Encoding Filter + org.primefaces.serenity.filter.CharacterEncodingFilter + + + Character Encoding Filter + Faces Servlet + + + Faces Servlet + javax.faces.webapp.FacesServlet + + + Faces Servlet + *.jsf + + + ttf + application/font-sfnt + + + woff + application/font-woff + + + png + image/png + + + woff2 + application/font-woff2 + + + eot + application/vnd.ms-fontobject + + + eot?#iefix + application/vnd.ms-fontobject + + + svg + image/svg+xml + + + svg#exosemibold + image/svg+xml + + + svg#exobolditalic + image/svg+xml + + + svg#exomedium + image/svg+xml + + + svg#exoregular + image/svg+xml + + + svg#fontawesomeregular + image/svg+xml + + + + FORM + + /login.jsf + /WEB-INF/error-pages/access.jsf + + + + + + + Views only available when logged has a DASHBOARD grant + /dashboard.jsf + + + Views only available when user has a PROFILE/PRIVACY/SETTINGS grant + /app/topbar/* + + + public.access + + + + + + Views only available when logged has a EMPLOYEE grant + /app/system/employee/main.jsf + + + system.employee + + + + + Views only available when logged has a USER CREATE grant + /app/system/user/add/main.jsf + + + system.user.create + + + + + Views only available when logged has a USER SETTINGS grant + /app/system/user/setting/main.jsf + + + system.user.admin + + + + + Views only available when logged has a USER ACCESS grant + /app/system/user/access/main.jsf + + + system.user.access + + + + + Views only available when logged has a CHANGE LOANS BETWEEN USER grant + /app/admin/loan/changeOwner.jsf + + + admin.loan.change.owner + + + + + + + + public.access + + + + system.employee + + + system.user.create + + + system.user.admin + + + system.user.access + + + admin.loan.change.owner + + + + 403 + /WEB-INF/error-pages/access.jsf + + + 404 + /WEB-INF/error-pages/notfound.jsf + + + 500 + /WEB-INF/error-pages/error.jsf + + + + DB Connection + jdbc/apcAuth + javax.sql.DataSource + Container + + \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/closingDay/detail.xhtml b/apc-web/src/main/webapp/app/admin/closingDay/detail.xhtml new file mode 100644 index 0000000..2dbd2c7 --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/closingDay/detail.xhtml @@ -0,0 +1,145 @@ + + + + + + #{i18n['project.short.name']} - #{permission['admin.closingDay']} + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{i18n['admin.financial.closingDayHistory']}
  • +
  • /
  • +
  • Detalle del corte
  • +
    + + +
    +
    + + +
    +
    + + + +

    Información del corte

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + + +

    Detalle del corte

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/closingDay/history.xhtml b/apc-web/src/main/webapp/app/admin/closingDay/history.xhtml new file mode 100644 index 0000000..faf8a3c --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/closingDay/history.xhtml @@ -0,0 +1,170 @@ + + #{i18n['project.short.name']} - #{permission['admin.closingDay']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{i18n['admin.financial.closingDayHistory']}
  • +
    + + +
    +
    +
    +

    #{i18n['admin.financial.closingDayHistory']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +

    + + + + + + +

    +
    + +
    +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/closingDay/index.xhtml b/apc-web/src/main/webapp/app/admin/closingDay/index.xhtml new file mode 100644 index 0000000..3a4266e --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/closingDay/index.xhtml @@ -0,0 +1,372 @@ + + + + + + #{i18n['project.short.name']} - #{permission['admin.closingDay.add']} + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.closingDay.add']}
  • +
    + + +
    +
    + +
    +
    + + +

    #{permission['admin.closingDay.add']}

    + + + + + + + + + + + + + + +
    + + +
    +
    +
    + + + + + +

    Totales

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +



    + +

    Detalle del corte

    + + + +
    + + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + +
    +
    +

    Abonos en ceros

    + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +

    Resumen del día

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +

    Caja chica

    + + + + + + + +
    +
    + +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/customer/add.xhtml b/apc-web/src/main/webapp/app/admin/customer/add.xhtml new file mode 100644 index 0000000..86d1fee --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/customer/add.xhtml @@ -0,0 +1,1208 @@ + + + + + + #{i18n['project.short.name']} - #{i18n['admin.people.add']} + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{i18n['admin.people.add']}
  • +
    + + +
    + +
    +
    + + + + +

    #{i18n['admin.people.add']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #{i18n['admin.people.dialog.isCustomer.title']} + + + + + #{i18n['admin.people.dialog.isEndorsement.title']} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + + + + + + + + +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/customer/detail.xhtml b/apc-web/src/main/webapp/app/admin/customer/detail.xhtml new file mode 100644 index 0000000..c211331 --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/customer/detail.xhtml @@ -0,0 +1,315 @@ + + + + + + #{i18n['project.short.name']} - #{permission['admin.customer']} + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.customer']}
  • +
  • /
  • +
  • #{i18n['admin.customers.detail.title']}
  • +
    + + +
    +
    + +
    +
    + + + + +

    #{i18n['admin.customers.detail.title']}

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + + + +

    #{i18n['admin.customers.company.title']}

    +

    + + + + + + +



    + + + + +



    + + + + + + + + + + + +
    +
    +
    +
    +
    + + + +

    Información adicional

    +

    + + + + + +



    + + + + + +
    +
    +
    +
    + +
    + +
    +
    + +

    #{i18n['admin.customers.loan.title']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + + + + Detalle de pagos + + + + Fecha + Pago + Tipo + No. Referencia + Comentarios + + + + + + + + + + + + + + + + + + #{detail.loanDetailsType.value} + #{detail.referenceNumber} + #{detail.comments} + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/customer/index.xhtml b/apc-web/src/main/webapp/app/admin/customer/index.xhtml new file mode 100644 index 0000000..4680370 --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/customer/index.xhtml @@ -0,0 +1,1467 @@ + + #{i18n['project.short.name']} - #{permission['admin.customer']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.customer']}
  • +
    + + +
    +
    +
    +

    #{i18n['admin.customer']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +

    + + + + + + + +

    +
    + +
    +
    +
    + + + + +

    + + + + + + +

    + + + + + + + + + +

    + + + + + + +

    + + + + + + +

    + + + + + + + +

    +

    + + + + + + + + +

    + + + + + + + + +

    + + + + + + +

    + + + + + + +

    + + Cambiar a estatus Aprobado + + + +

    + + Cambiar a estatus Terminado + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #{i18n['admin.people.dialog.isCustomer.title']} + + + + + #{i18n['admin.people.dialog.isEndorsement.title']} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/customer/index_old.xhtml b/apc-web/src/main/webapp/app/admin/customer/index_old.xhtml new file mode 100644 index 0000000..a2b1604 --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/customer/index_old.xhtml @@ -0,0 +1,431 @@ + + #{i18n['project.short.name']} - #{permission['admin.customer']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.customer']}
  • +
    + + +
    +
    +
    +

    #{i18n['admin.customer']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +- + + + + + + + + + + + + + + + + + + +
    +
    + + + + +

    + + + + + + + +

    +
    + +
    +
    +
    + + + + +

    + + + + + + +

    + + + + + + + + + +

    + + + + + + + +

    + + + + + + + +

    + + + + + + + +

    +

    + + + + + + + + +

    + + + + + + + + +

    + + + + + + +

    + + + + + + +

    + + Cambiar a estatus Aprobado + + + +

    + + Cambiar a estatus Terminado + + + +

    +
    + +
    +
    +
    + + + + +

    + +

    #{i18n['admin.people.add']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #{i18n['admin.people.dialog.isCustomer.title']} + + + + + #{i18n['admin.people.dialog.isEndorsement.title']} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/endorsement/detail.xhtml b/apc-web/src/main/webapp/app/admin/endorsement/detail.xhtml new file mode 100644 index 0000000..5736a8a --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/endorsement/detail.xhtml @@ -0,0 +1,258 @@ + + + + + + #{i18n['project.short.name']} - #{permission['admin.endorsement']} + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.endorsement']}
  • +
  • /
  • +
  • #{i18n['admin.endorsements.detail.title']}
  • +
    + + +
    +
    + +
    +
    + + + + +

    #{i18n['admin.endorsements.detail.title']}

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +

    #{i18n['admin.endorsements.company.title']}

    +

    + + + + + + +



    + + + + +



    + + + + + + + + + + +
    +
    +
    +
    +
    + + + +

    Información adicional

    +

    + + + + + +



    + + + + + +
    +
    +
    +
    + +
    + +
    +
    + +

    #{i18n['admin.endorsements.loan.title']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/endorsement/index.xhtml b/apc-web/src/main/webapp/app/admin/endorsement/index.xhtml new file mode 100644 index 0000000..cf0caa1 --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/endorsement/index.xhtml @@ -0,0 +1,162 @@ + + #{i18n['project.short.name']} - #{permission['admin.endorsement']} + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.endorsement']}
  • +
    + + +
    +
    +
    +

    #{i18n['admin.endorsement']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/inventarios/index.xhtml b/apc-web/src/main/webapp/app/admin/inventarios/index.xhtml new file mode 100644 index 0000000..640471e --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/inventarios/index.xhtml @@ -0,0 +1,93 @@ + + #{i18n['project.short.name']} - Ajustes inventario + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • Ajustes inventario
  • +
    + + +
    + +
    +
    +

    Ajustes inventario

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/loan/changeOwner.xhtml b/apc-web/src/main/webapp/app/admin/loan/changeOwner.xhtml new file mode 100644 index 0000000..004b88d --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/loan/changeOwner.xhtml @@ -0,0 +1,212 @@ + + + + + + #{i18n['project.short.name']} - #{permission['admin.loan.change.owner']} + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.loan']}
  • +
  • /
  • +
  • #{permission['admin.loan.change.owner']}
  • +
    + + +
    +
    +
    + + + + +

    + + + +

    +

    + #{permission['admin.loan.change.owner']} +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #{i18n['current.owner.from']} + + + + + #{i18n['current.owner.to']} + + + + + + + #{i18n['admin.endorsements.detail.datatable.column.customer']}: + + + + + + #{i18n['admin.loans.datatable.column.endorsement']}: + + + + + + #{i18n['admin.loans.datatable.column.amountPaid']}: + + + + + + + + #{i18n['admin.payrolls.datatable.column.createdOn']} (dd-mm-yyyy): + + + + + + + + #{i18n['admin.customers.datatable.column.routeCtlg']}: + + + + + + + + + + + + + + + + +
    +
    +
    + + + + + + + + +
    +
    +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/loan/detail.xhtml b/apc-web/src/main/webapp/app/admin/loan/detail.xhtml new file mode 100644 index 0000000..6203ee8 --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/loan/detail.xhtml @@ -0,0 +1,641 @@ + + + + + + #{i18n['project.short.name']} - #{permission['admin.loan']} + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.loan']}
  • +
  • /
  • +
  • #{i18n['admin.loan.detail.title']}
  • +
    + + + + +
    +
    + +
    +
    + + + +

    #{i18n['admin.customers.detail.title']}

    +

    + + + + + + +



    + + + + +



    + + + + +



    + + + + +



    + + + + +



    + + + + + +
    +
    +
    +
    +
    + + + +

    #{i18n['admin.customers.company.title']}

    +

    + + + + + + +



    + + + + +



    + + + + +



    +

    Buscador de clientes

    + + + + + + + + +
    +
    +
    +
    + +
    + +
    +
    + +

    #{i18n['admin.customers.loan.title']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + + + + Detalle de pagos + + + + Fecha + Pago + Tipo + No. Referencia + Comentarios + + + + + + + + + + + + + + + + + + #{detail.loanDetailsType.value} + #{detail.referenceNumber} + #{detail.comments} + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + +

    #{i18n['admin.endorsements.detail.title']}

    +

    + + + + + + +



    + + + + +



    + + + + +



    + + + + +



    + + + + +



    + + + + + +
    +
    +
    +
    +
    + + + +

    #{i18n['admin.endorsements.company.title']}

    +

    + + + + + + +



    + + + + +



    + + + + + +
    +
    +
    +
    + +
    + +
    +
    + +

    #{i18n['admin.endorsements.loan.title']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + + + +

    Préstamo

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +

    +

    Modificar el tipo de préstamo

    + + + + + + + + + + + + + + + +

    +

    +

    Modificar fecha de entrega

    + + + + + + + + + + + + + +

    + + + + + +
    +
    +
    +
    +
    +
    + + +
    +
    +
    + +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/loan/drive.xhtml b/apc-web/src/main/webapp/app/admin/loan/drive.xhtml new file mode 100644 index 0000000..7864507 --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/loan/drive.xhtml @@ -0,0 +1,902 @@ + + #{i18n['project.short.name']} - Google Drive semana actual + + + + +
  • #{i18n['admin.title']}
  • +
    + + + + +
    +
    +
    +

    Semana actual

    + + + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +

    Colocación

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    Subtotales de cobros y comisión por apertura por cartera de asesor

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +

    Préstamos enviados a Cobranza

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +

    Resumen de cortes

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +

    Resumen de gastos

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +

    Resumen de inicios

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +

    Clientes nuevos

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + +

    Resumen total de la semana

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/loan/driveDate.xhtml b/apc-web/src/main/webapp/app/admin/loan/driveDate.xhtml new file mode 100644 index 0000000..dff0e42 --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/loan/driveDate.xhtml @@ -0,0 +1,1035 @@ + + #{i18n['project.short.name']} - Google Drive + + + + + +
  • #{i18n['admin.title']}
  • +
    + + + + +
    +
    +
    +

    Google Drive

    + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + + + + Detalles + + + + Cantidad Pagada Actual + Tipo de Prestamo + Abono Diario + Comisión por Apertura + Cliente Nuevo + Numero de accion + Multas Acumuladas + Multas Semana + + + + + + + + + + + + + + #{driver.loanTypeName} + + + + + + + + + + + #{driver.newCustomer} + #{driver.numPagosAll} + + + + + + + + + + + + + + + + + + + + + Detalle de pagos + + + + Fecha + Pago + Saldo insoluto + Tipo + No. Referencia + Comentarios + + + + + + + + + + + + + + + + + + + + + + + #{detail.loanDetailsType.value} + #{detail.referenceNumber} + #{detail.comments} + + + + +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +

    Colocación

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    Subtotales de cobros y comisión por apertura por cartera de asesor

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +

    Préstamos enviados a Cobranza

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +

    Resumen de cortes

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +

    Resumen de gastos

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +

    Resumen de inicios

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +

    Resumen total de la semana

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/loan/driveLast.xhtml b/apc-web/src/main/webapp/app/admin/loan/driveLast.xhtml new file mode 100644 index 0000000..ed72318 --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/loan/driveLast.xhtml @@ -0,0 +1,898 @@ + + #{i18n['project.short.name']} - Google Drive semana anterior + + + + +
  • #{i18n['admin.title']}
  • +
    + + + + +
    +
    +
    +

    Semana anterior

    + + + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +

    Colocación

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +

    Subtotales de cobros y comisión por apertura por cartera de asesor

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +

    Préstamos enviados a Cobranza

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +

    Resumen de cortes

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +

    Resumen de gastos

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +

    Resumen de inicios

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +

    Clientes nuevos

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + +
    +
    + +

    Resumen total de la semana

    + + + + + +
    + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/loan/history.xhtml b/apc-web/src/main/webapp/app/admin/loan/history.xhtml new file mode 100644 index 0000000..14e5f8e --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/loan/history.xhtml @@ -0,0 +1,299 @@ + + #{i18n['project.short.name']} - #{permission['admin.loan']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.loan']}
  • +
    + + +
    +
    +
    +

    #{i18n['admin.loan.history']}

    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + +
    +
    +
    + + + + +

    + + + + + + + +

    +
    + +
    +
    +
    + + + + +

    + + + + + + +

    + + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    + + + + +

    + + + + + + +

    + + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    + + + + +

    + + + + + + + +

    +
    + +
    +
    +
    + + + + +

    + + + + + + + +

    +
    + +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/loan/historyDetail.xhtml b/apc-web/src/main/webapp/app/admin/loan/historyDetail.xhtml new file mode 100644 index 0000000..536ecfe --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/loan/historyDetail.xhtml @@ -0,0 +1,523 @@ + + + + + + #{i18n['project.short.name']} - #{permission['admin.loan']} + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.loan']}
  • +
  • /
  • +
  • #{i18n['admin.loan.detail.title']}
  • +
    + + + + +
    +
    + +
    +
    + + + +

    #{i18n['admin.customers.detail.title']}

    +

    + + + + + + +



    + + + + +



    + + + + +



    + + + + +



    + + + + +



    + + + + + +
    +
    +
    +
    +
    + + + +

    #{i18n['admin.customers.company.title']}

    +

    + + + + + + +



    + + + + +



    + + + + + +
    +
    +
    +
    + +
    + +
    +
    + +

    #{i18n['admin.customers.loan.title']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + + + + Detalle de pagos + + + + Fecha + Pago + Tipo + No. Referencia + Comentarios + + + + + + + + + + + + + + + + + + #{detail.loanDetailsType.value} + #{detail.referenceNumber} + #{detail.comments} + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + +

    #{i18n['admin.endorsements.detail.title']}

    +

    + + + + + + +



    + + + + +



    + + + + +



    + + + + +



    + + + + +



    + + + + + +
    +
    +
    +
    +
    + + + +

    #{i18n['admin.endorsements.company.title']}

    +

    + + + + + + +



    + + + + +



    + + + + + +
    +
    +
    +
    + +
    + +
    +
    + +

    #{i18n['admin.endorsements.loan.title']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + + + +

    Préstamo

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + + +
    +
    +
    + +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/loan/historyJuridical.xhtml b/apc-web/src/main/webapp/app/admin/loan/historyJuridical.xhtml new file mode 100644 index 0000000..fd737c3 --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/loan/historyJuridical.xhtml @@ -0,0 +1,144 @@ + + #{i18n['project.short.name']} - #{permission['admin.loan']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.loan']}
  • +
    + + +
    +
    +
    +

    #{i18n['admin.loan.history']}

    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/loan/index.xhtml b/apc-web/src/main/webapp/app/admin/loan/index.xhtml new file mode 100644 index 0000000..0abd5e5 --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/loan/index.xhtml @@ -0,0 +1,219 @@ + + #{i18n['project.short.name']} - #{permission['admin.loan']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.loan']}
  • +
    + + +
    +
    +
    +

    #{i18n['admin.loan.to.approve']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + +
    +
    + + + +

    + + + + + + +

    + + + + + + + + + +

    + + + + + + + +

    + + + + + + + +

    + + + + + + + +

    +

    + + + + + + + + +

    + + + + + + + + +

    + + + + + + +

    + + + + + + +

    + + Cambiar a estatus Aprobado + + + +

    + + Cambiar a estatus Terminado + + + +

    +
    + +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/loan/loanDetailTransfer.xhtml b/apc-web/src/main/webapp/app/admin/loan/loanDetailTransfer.xhtml new file mode 100644 index 0000000..a1fa280 --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/loan/loanDetailTransfer.xhtml @@ -0,0 +1,112 @@ + + #{i18n['project.short.name']} - #{permission['admin.loan']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.loan']}
  • +
    + + +
    +
    +
    +

    Confirmacion de Trasnferencias

    + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + + + +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/loan/loanRenovationWeekly.xhtml b/apc-web/src/main/webapp/app/admin/loan/loanRenovationWeekly.xhtml new file mode 100644 index 0000000..d2ac398 --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/loan/loanRenovationWeekly.xhtml @@ -0,0 +1,118 @@ + + #{i18n['project.short.name']} - #{permission['admin.loan']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • Colocación de Renovación
  • +
    + + +
    +
    +
    +

    Colocación de Renovación

    + + + + + + + + + + +
    + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    +
    + + +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/moneyDaily/index.xhtml b/apc-web/src/main/webapp/app/admin/moneyDaily/index.xhtml new file mode 100644 index 0000000..9ebb6cb --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/moneyDaily/index.xhtml @@ -0,0 +1,243 @@ + + #{i18n['project.short.name']} - #{permission['admin.moneyDaily']} + + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.moneyDaily']}
  • +
    + + +
    +
    +
    +
    +

    #{i18n['admin.financial.moneyDaily']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    + +
    + +
    +
    +
    +

    Inicio propuesto para certificadores

    + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + + +

    + + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    + + +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/otherExpense/index.xhtml b/apc-web/src/main/webapp/app/admin/otherExpense/index.xhtml new file mode 100644 index 0000000..90db859 --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/otherExpense/index.xhtml @@ -0,0 +1,214 @@ + + #{i18n['project.short.name']} - #{permission['admin.otherExpense']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.otherExpense']}
  • +
    + + +
    +
    +
    +

    #{i18n['admin.financial.otherExpense']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    + + + + +

    + + + + + + + +

    + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/stableSmallBox/history.xhtml b/apc-web/src/main/webapp/app/admin/stableSmallBox/history.xhtml new file mode 100644 index 0000000..b80ce7d --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/stableSmallBox/history.xhtml @@ -0,0 +1,189 @@ + + #{i18n['project.short.name']} - Caja chica + + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • Historia cuadre caja chica
  • +
    + + +
    +
    +
    +

    Historial cuadre caja chica

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/stableSmallBox/index.xhtml b/apc-web/src/main/webapp/app/admin/stableSmallBox/index.xhtml new file mode 100644 index 0000000..144da2f --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/stableSmallBox/index.xhtml @@ -0,0 +1,141 @@ + + + + + + #{i18n['project.short.name']} - Caja chica + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • Cuadre de caja chica
  • +
    + + +
    +
    +
    + +
    +
    + +

    Cuadre de caja chica

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/transfer/index.xhtml b/apc-web/src/main/webapp/app/admin/transfer/index.xhtml new file mode 100644 index 0000000..c62ca5f --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/transfer/index.xhtml @@ -0,0 +1,213 @@ + + #{i18n['project.short.name']} - #{permission['admin.transfer']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.transfer']}
  • +
    + + +
    +
    +
    +

    #{i18n['admin.financial.transfer']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    + + + +

    + + + + + + + +

    + + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/transfer/index_backup.xhtml b/apc-web/src/main/webapp/app/admin/transfer/index_backup.xhtml new file mode 100644 index 0000000..b714974 --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/transfer/index_backup.xhtml @@ -0,0 +1,208 @@ + + #{i18n['project.short.name']} - #{permission['admin.transfer']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.transfer']}
  • +
    + + +
    +
    +
    +

    #{i18n['admin.financial.transfer']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    + + + +

    + + + + + + + +

    + + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/admin/vehicles/main.xhtml b/apc-web/src/main/webapp/app/admin/vehicles/main.xhtml new file mode 100644 index 0000000..9557f20 --- /dev/null +++ b/apc-web/src/main/webapp/app/admin/vehicles/main.xhtml @@ -0,0 +1,278 @@ + + + + + + #{i18n['project.short.name']} - #{permission['system.employee']} + + +
  • #{i18n['system.title']}
  • +
  • /
  • +
  • #{i18n['system.users']}
  • +
  • /
  • +
  • #{permission['system.employee']}
  • +
    + + +
    + + +
    +
    + + + +

    + + + +

    +

    Alta vehículo

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GPS + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + + + + + + + + + +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/catalog/loanType/add.xhtml b/apc-web/src/main/webapp/app/catalog/loanType/add.xhtml new file mode 100644 index 0000000..a24623c --- /dev/null +++ b/apc-web/src/main/webapp/app/catalog/loanType/add.xhtml @@ -0,0 +1,203 @@ + + + + + + #{i18n['project.short.name']} - #{permission['catalog.typeLoan.add']} + + +
  • #{i18n['catalog.title']}
  • +
  • /
  • +
  • #{permission['catalog.typeLoan']}
  • +
  • /
  • +
  • #{permission['catalog.typeLoan.add']}
  • +
    + + +
    +
    +
    + +
    +
    + + + + +

    #{permission['catalog.typeLoan.add']}

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Días de cobro

    +
    + + + #{i18n['catalog.loanTypes.dialog.monday.title']} + + + + + #{i18n['catalog.loanTypes.dialog.tuesday.title']} + + + + + #{i18n['catalog.loanTypes.dialog.wednesday.title']} + + + + + #{i18n['catalog.loanTypes.dialog.thursday.title']} + + + + + #{i18n['catalog.loanTypes.dialog.friday.title']} + + + + + #{i18n['catalog.loanTypes.dialog.saturday.title']} + + + + + #{i18n['catalog.loanTypes.dialog.sunday.title']} + + + + + + + + + + + + + +
    +
    +
    +
    +
    + + + + + + + +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/catalog/loanType/index.xhtml b/apc-web/src/main/webapp/app/catalog/loanType/index.xhtml new file mode 100644 index 0000000..75dded4 --- /dev/null +++ b/apc-web/src/main/webapp/app/catalog/loanType/index.xhtml @@ -0,0 +1,180 @@ + + #{i18n['project.short.name']} - #{permission['catalog.typeLoan']} + + + + +
  • #{i18n['catalog.title']}
  • +
  • /
  • +
  • #{permission['catalog.typeLoan']}
  • +
    + + +
    +
    +
    +

    #{i18n['catalog.typeLoan']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/catalog/role/index.xhtml b/apc-web/src/main/webapp/app/catalog/role/index.xhtml new file mode 100644 index 0000000..7ad9b95 --- /dev/null +++ b/apc-web/src/main/webapp/app/catalog/role/index.xhtml @@ -0,0 +1,90 @@ + + #{i18n['project.short.name']} - #{permission['catalog.role']} + + + + +
  • #{i18n['catalog.title']}
  • +
  • /
  • +
  • #{permission['catalog.role']}
  • +
    + + +
    +
    +
    +

    #{i18n['catalog.roles']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +

    + + + + + + +

    +
    + +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/catalog/route/index.xhtml b/apc-web/src/main/webapp/app/catalog/route/index.xhtml new file mode 100644 index 0000000..7f69ce5 --- /dev/null +++ b/apc-web/src/main/webapp/app/catalog/route/index.xhtml @@ -0,0 +1,90 @@ + + #{i18n['project.short.name']} - #{permission['catalog.route']} + + + + +
  • #{i18n['catalog.title']}
  • +
  • /
  • +
  • #{permission['catalog.route']}
  • +
    + + +
    +
    +
    +

    #{i18n['catalog.route']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +

    + + + + + + +

    +
    + +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/generalBox/expenseCompanyIn/index.xhtml b/apc-web/src/main/webapp/app/generalBox/expenseCompanyIn/index.xhtml new file mode 100644 index 0000000..4787cd1 --- /dev/null +++ b/apc-web/src/main/webapp/app/generalBox/expenseCompanyIn/index.xhtml @@ -0,0 +1,179 @@ + + #{i18n['project.short.name']} - #{permission['admin.expenseCompanyIn']} + + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.expenseCompanyIn']}
  • +
    + + +
    +
    +
    +

    #{i18n['admin.general.box.expenseCompanyIn']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +

    + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    + + + + + + + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/generalBox/expenseCompanyOut/index.xhtml b/apc-web/src/main/webapp/app/generalBox/expenseCompanyOut/index.xhtml new file mode 100644 index 0000000..3678280 --- /dev/null +++ b/apc-web/src/main/webapp/app/generalBox/expenseCompanyOut/index.xhtml @@ -0,0 +1,189 @@ + + #{i18n['project.short.name']} - #{permission['admin.expenseCompanyOut']} + + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.expenseCompanyOut']}
  • +
    + + +
    +
    +
    +

    #{i18n['admin.general.box.expenseCompanyOut']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +

    + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    + + + + + + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/generalBox/stableGeneralBox/history.xhtml b/apc-web/src/main/webapp/app/generalBox/stableGeneralBox/history.xhtml new file mode 100644 index 0000000..a1aa101 --- /dev/null +++ b/apc-web/src/main/webapp/app/generalBox/stableGeneralBox/history.xhtml @@ -0,0 +1,188 @@ + + #{i18n['project.short.name']} - #{permission['admin.stableGeneralBox']} + + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.stableGeneralBox']}
  • +
    + + +
    +
    +
    +

    #{i18n['admin.general.box.stable.history']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/generalBox/stableGeneralBox/index.xhtml b/apc-web/src/main/webapp/app/generalBox/stableGeneralBox/index.xhtml new file mode 100644 index 0000000..6d3c4a0 --- /dev/null +++ b/apc-web/src/main/webapp/app/generalBox/stableGeneralBox/index.xhtml @@ -0,0 +1,142 @@ + + + + + + #{i18n['project.short.name']} - #{permission['admin.stableGeneralBox.add']} + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.stableGeneralBox.add']}
  • +
    + + +
    +
    +
    + +
    +
    + +

    #{permission['admin.stableGeneralBox.add']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/payroll/advance/index.xhtml b/apc-web/src/main/webapp/app/payroll/advance/index.xhtml new file mode 100644 index 0000000..c08900b --- /dev/null +++ b/apc-web/src/main/webapp/app/payroll/advance/index.xhtml @@ -0,0 +1,184 @@ + + #{i18n['project.short.name']} - #{permission['admin.advance']} + + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.advance']}
  • +
    + + +
    +
    +
    +

    #{i18n['admin.payroll.advance']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    +
    +
    + + + +

    + + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/payroll/bonus/index.xhtml b/apc-web/src/main/webapp/app/payroll/bonus/index.xhtml new file mode 100644 index 0000000..b74713d --- /dev/null +++ b/apc-web/src/main/webapp/app/payroll/bonus/index.xhtml @@ -0,0 +1,168 @@ + + #{i18n['project.short.name']} - #{permission['admin.bonus']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.bonus']}
  • +
    + + +
    +
    +
    +

    #{i18n['admin.payroll.bonus']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +

    + + + + + + +

    + + + + + + +

    + + + + + + +

    + + + + + + +

    + + Administrativo + + + +

    +

    Cuando un bono no es administrativo, los valores que pones en bono de mora y colocación se toman como porcentaje, de lo contrario como un monto.

    +
    + +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/payroll/createPayroll/index.xhtml b/apc-web/src/main/webapp/app/payroll/createPayroll/index.xhtml new file mode 100644 index 0000000..2dc0b4d --- /dev/null +++ b/apc-web/src/main/webapp/app/payroll/createPayroll/index.xhtml @@ -0,0 +1,432 @@ + + + + + + #{i18n['project.short.name']} - #{i18n['admin.payroll.create']} + + +
  • #{i18n['admin.payroll']}
  • +
  • /
  • +
  • #{i18n['admin.payroll.create']}
  • +
    + + +
    +
    + +
    +
    + +

    #{i18n['admin.payroll.create']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Resumen de nómina - percepciones

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Resumen nómina - deducciones

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Registro

    + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +

    Meta

    + + + + + + + + +

    Bono

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Detalles

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/payroll/goal/index.xhtml b/apc-web/src/main/webapp/app/payroll/goal/index.xhtml new file mode 100644 index 0000000..6569d28 --- /dev/null +++ b/apc-web/src/main/webapp/app/payroll/goal/index.xhtml @@ -0,0 +1,164 @@ + + #{i18n['project.short.name']} - #{permission['admin.goal']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.goal']}
  • +
    + + +
    +
    +
    +

    #{i18n['admin.payroll.goals']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +

    + + + + + + +

    + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/payroll/history.xhtml b/apc-web/src/main/webapp/app/payroll/history.xhtml new file mode 100644 index 0000000..1634dbe --- /dev/null +++ b/apc-web/src/main/webapp/app/payroll/history.xhtml @@ -0,0 +1,232 @@ + + #{i18n['project.short.name']} - #{i18n['admin.payroll.history']} + + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{i18n['admin.payroll.history']}
  • +
    + + +
    +
    +
    +

    #{i18n['admin.payroll.history']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/payroll/loanEmployee/index.xhtml b/apc-web/src/main/webapp/app/payroll/loanEmployee/index.xhtml new file mode 100644 index 0000000..c6136de --- /dev/null +++ b/apc-web/src/main/webapp/app/payroll/loanEmployee/index.xhtml @@ -0,0 +1,262 @@ + + Préstamos a empleados + + + + + +
  • #{grant['admin.name']}
  • +
  • /
  • +
  • Préstamos empleados
  • +
    + + +
    +
    +
    +

    Préstamos de empleados

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + Total #{fn:length(loanEmployeeListBean.loanEmployeeView)} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Abonos + + + + Fecha + Monto + Número + + + + + + + + + + + + + #{detailDetail.paymentAmount} + #{detailDetail.referenceNumber} + + + + + + + + + + + + + + + + + + + + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    + + + + +

    + + + + + + + +

    +

    + + + + + + +

    + + + + + + +
    + +
    +
    +
    + + + + +

    + + + + + + +
    + +
    +
    +
    +
    +
    +
    +
    + +
    diff --git a/apc-web/src/main/webapp/app/stats/advances/index.xhtml b/apc-web/src/main/webapp/app/stats/advances/index.xhtml new file mode 100644 index 0000000..70ed097 --- /dev/null +++ b/apc-web/src/main/webapp/app/stats/advances/index.xhtml @@ -0,0 +1,109 @@ + + + #{i18n['project.short.name']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{i18n['admin.stats.advances']}
  • +
    + +
    +
    +
    +

    #{i18n['admin.stats.advances']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/stats/closingDay/index.xhtml b/apc-web/src/main/webapp/app/stats/closingDay/index.xhtml new file mode 100644 index 0000000..655b239 --- /dev/null +++ b/apc-web/src/main/webapp/app/stats/closingDay/index.xhtml @@ -0,0 +1,114 @@ + + + #{i18n['project.short.name']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{i18n['admin.stats.closingday']}
  • +
    + +
    +
    +
    +

    #{i18n['admin.stats.closingday']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/stats/deposits/index.xhtml b/apc-web/src/main/webapp/app/stats/deposits/index.xhtml new file mode 100644 index 0000000..18c5fc8 --- /dev/null +++ b/apc-web/src/main/webapp/app/stats/deposits/index.xhtml @@ -0,0 +1,138 @@ + + + #{i18n['project.short.name']} + + + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{i18n['admin.stats.deposits']}
  • +
    + +
    +
    +
    +

    #{i18n['admin.stats.deposits']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/stats/employeeSaving/index.xhtml b/apc-web/src/main/webapp/app/stats/employeeSaving/index.xhtml new file mode 100644 index 0000000..1a19507 --- /dev/null +++ b/apc-web/src/main/webapp/app/stats/employeeSaving/index.xhtml @@ -0,0 +1,184 @@ + + + #{i18n['project.short.name']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{i18n['admin.stats.employeesaving']}
  • +
    + +
    +
    +
    +

    #{i18n['admin.stats.employeesaving']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Ahorros + + + + Fecha + Monto + Tipo + + + + + + + + + + + + + #{employeeSaving.employeeSaving} + #{employeeSaving.typeText} + + + + + + + + + + + + + + +

    + + + + + + +

    +

    + + + + + + + +

    +
    + +
    +
    + +
    + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/stats/fees/index.xhtml b/apc-web/src/main/webapp/app/stats/fees/index.xhtml new file mode 100644 index 0000000..c7af0aa --- /dev/null +++ b/apc-web/src/main/webapp/app/stats/fees/index.xhtml @@ -0,0 +1,116 @@ + + + #{i18n['project.short.name']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.fees']}
  • +
    + +
    +
    +
    +

    #{i18n['admin.stats.fees']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/stats/feesByRoute/index.xhtml b/apc-web/src/main/webapp/app/stats/feesByRoute/index.xhtml new file mode 100644 index 0000000..c9e9dae --- /dev/null +++ b/apc-web/src/main/webapp/app/stats/feesByRoute/index.xhtml @@ -0,0 +1,111 @@ + + + #{i18n['project.short.name']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{permission['admin.fees']}
  • +
    + +
    +
    +
    +

    #{i18n['admin.stats.fees']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/stats/gasoline/index.xhtml b/apc-web/src/main/webapp/app/stats/gasoline/index.xhtml new file mode 100644 index 0000000..ff7be2f --- /dev/null +++ b/apc-web/src/main/webapp/app/stats/gasoline/index.xhtml @@ -0,0 +1,119 @@ + + + #{i18n['project.short.name']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{i18n['admin.stats.gasoline']}
  • +
    + +
    +
    +
    +

    #{i18n['admin.stats.gasoline']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/stats/openingFee/index.xhtml b/apc-web/src/main/webapp/app/stats/openingFee/index.xhtml new file mode 100644 index 0000000..63c4bb1 --- /dev/null +++ b/apc-web/src/main/webapp/app/stats/openingFee/index.xhtml @@ -0,0 +1,113 @@ + + + #{i18n['project.short.name']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{i18n['admin.stats.openingfee']}
  • +
    + +
    +
    +
    +

    #{i18n['admin.stats.openingfee']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/stats/payment/index.xhtml b/apc-web/src/main/webapp/app/stats/payment/index.xhtml new file mode 100644 index 0000000..aca0658 --- /dev/null +++ b/apc-web/src/main/webapp/app/stats/payment/index.xhtml @@ -0,0 +1,113 @@ + + + #{i18n['project.short.name']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{i18n['admin.stats.payment']}
  • +
    + +
    +
    +
    +

    #{i18n['admin.stats.payment']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/stats/paymentRenovation/index.xhtml b/apc-web/src/main/webapp/app/stats/paymentRenovation/index.xhtml new file mode 100644 index 0000000..b9669f1 --- /dev/null +++ b/apc-web/src/main/webapp/app/stats/paymentRenovation/index.xhtml @@ -0,0 +1,112 @@ + + + #{i18n['project.short.name']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{i18n['admin.stats.paymentrenovation']}
  • +
    + +
    +
    +
    +

    #{i18n['admin.stats.paymentrenovation']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/stats/paymentRoute/index.xhtml b/apc-web/src/main/webapp/app/stats/paymentRoute/index.xhtml new file mode 100644 index 0000000..5da2410 --- /dev/null +++ b/apc-web/src/main/webapp/app/stats/paymentRoute/index.xhtml @@ -0,0 +1,114 @@ + + + #{i18n['project.short.name']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{i18n['admin.stats.paymentroute']}
  • +
    + +
    +
    +
    +

    #{i18n['admin.stats.paymentroute']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/stats/payroll/index.xhtml b/apc-web/src/main/webapp/app/stats/payroll/index.xhtml new file mode 100644 index 0000000..42de611 --- /dev/null +++ b/apc-web/src/main/webapp/app/stats/payroll/index.xhtml @@ -0,0 +1,110 @@ + + + #{i18n['project.short.name']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{i18n['admin.stats.payroll']}
  • +
    + +
    +
    +
    +

    #{i18n['admin.stats.payroll']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/stats/summary/index.xhtml b/apc-web/src/main/webapp/app/stats/summary/index.xhtml new file mode 100644 index 0000000..e354976 --- /dev/null +++ b/apc-web/src/main/webapp/app/stats/summary/index.xhtml @@ -0,0 +1,145 @@ + + + #{i18n['project.short.name']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{i18n['admin.stats.summary']}
  • +
    + +
    +
    +
    +

    #{i18n['admin.stats.summary']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/stats/vehicles/index.xhtml b/apc-web/src/main/webapp/app/stats/vehicles/index.xhtml new file mode 100644 index 0000000..76433ad --- /dev/null +++ b/apc-web/src/main/webapp/app/stats/vehicles/index.xhtml @@ -0,0 +1,93 @@ + + + #{i18n['project.short.name']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{i18n['admin.stats.vehicle']}
  • +
    + +
    +
    +
    +

    #{i18n['admin.stats.vehicle']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/stats/zeroPayments/index.xhtml b/apc-web/src/main/webapp/app/stats/zeroPayments/index.xhtml new file mode 100644 index 0000000..c670c22 --- /dev/null +++ b/apc-web/src/main/webapp/app/stats/zeroPayments/index.xhtml @@ -0,0 +1,112 @@ + + + #{i18n['project.short.name']} + + + + + +
  • #{i18n['admin.title']}
  • +
  • /
  • +
  • #{i18n['admin.stats.zeropayments']}
  • +
    + +
    +
    +
    +

    #{i18n['admin.stats.zeropayments']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/system/bitacora/index.xhtml b/apc-web/src/main/webapp/app/system/bitacora/index.xhtml new file mode 100644 index 0000000..63a242c --- /dev/null +++ b/apc-web/src/main/webapp/app/system/bitacora/index.xhtml @@ -0,0 +1,104 @@ + + #{i18n['project.short.name']} - Bitácora} + + + + + +
  • #{i18n['system.title']}
  • +
  • /
  • +
  • Bitácora
  • +
    + + +
    +
    +
    +

    #{i18n['system.bitacora']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/system/employee/employeeList.xhtml b/apc-web/src/main/webapp/app/system/employee/employeeList.xhtml new file mode 100644 index 0000000..8d66337 --- /dev/null +++ b/apc-web/src/main/webapp/app/system/employee/employeeList.xhtml @@ -0,0 +1,95 @@ + + + + + + #{i18n['project.short.name']} - #{permission['system.employee']} + + +
  • #{i18n['system.title']}
  • +
  • /
  • +
  • #{i18n['system.users']}
  • +
  • /
  • +
  • #{permission['system.employee']}
  • +
    + + +
    + + +
    +
    +

    + + + +

    + + + + + + + + + + + + + +
    + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + + + + +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/system/employee/main.xhtml b/apc-web/src/main/webapp/app/system/employee/main.xhtml new file mode 100644 index 0000000..cf88d1d --- /dev/null +++ b/apc-web/src/main/webapp/app/system/employee/main.xhtml @@ -0,0 +1,621 @@ + + + + + + #{i18n['project.short.name']} - #{permission['system.employee']} + + +
  • #{i18n['system.title']}
  • +
  • /
  • +
  • #{i18n['system.users']}
  • +
  • /
  • +
  • #{permission['system.employee']}
  • +
    + + +
    + + +
    +
    + + + +

    + + + +

    +

    #{i18n['add.hr']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + +
    +
    + + + +

    + + + +

    +

    + #{i18n['employee.disable']} + + + +

    + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + +
    +
    + + + +

    + + + +

    +

    + #{i18n['employee.eneble']} + + + +

    + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + +
    +
    + + + +

    + + + +

    +

    #{i18n['employee.delete']} + + + +

    + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + +
    +
    + + + +

    + + + +

    +

    + #{i18n['hr.update.btn']} + + + +

    +
    + + + +
    + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/system/log/main.xhtml b/apc-web/src/main/webapp/app/system/log/main.xhtml new file mode 100644 index 0000000..1b60134 --- /dev/null +++ b/apc-web/src/main/webapp/app/system/log/main.xhtml @@ -0,0 +1,25 @@ + + #{i18n.project} - #{grant['system.submenu.log.name']} + + +
  • #{grant['system.menu.name']}
  • +
  • /
  • +
  • #{grant['system.submenu.log.name']}
  • +
    + + +
    +
    +
    +

    DASHBOARD

    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/system/office/index.xhtml b/apc-web/src/main/webapp/app/system/office/index.xhtml new file mode 100644 index 0000000..d871bef --- /dev/null +++ b/apc-web/src/main/webapp/app/system/office/index.xhtml @@ -0,0 +1,104 @@ + + #{i18n['project.short.name']} - #{permission['system.office']} + + + + +
  • #{i18n['system.title']}
  • +
  • /
  • +
  • #{permission['system.office']}
  • +
    + + +
    +
    +
    +

    #{i18n['system.office']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +

    + + + + + + +

    + + + + + + +

    +
    + +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/system/user/access/main.xhtml b/apc-web/src/main/webapp/app/system/user/access/main.xhtml new file mode 100644 index 0000000..d6975a6 --- /dev/null +++ b/apc-web/src/main/webapp/app/system/user/access/main.xhtml @@ -0,0 +1,172 @@ + + + #{i18n['project.short.name']} - #{i18n['system.users']} + + +
  • #{i18n['system.title']}
  • +
  • /
  • +
  • #{i18n['system.users']}
  • +
  • /
  • +
  • #{permission['system.user.access']}
  • +
    + + +
    +
    +
    + + +

    + + + +

    +

    #{i18n['access.updte']}

    + +
    + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + #{i18n['dual.list.permissions.available']} + + + + + #{i18n['dual.list.permissions.taken']} + + + + + + + #{i18n.screen}: + + + + + + #{i18n.permission}: + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/system/user/add/main.xhtml b/apc-web/src/main/webapp/app/system/user/add/main.xhtml new file mode 100644 index 0000000..9a27e2b --- /dev/null +++ b/apc-web/src/main/webapp/app/system/user/add/main.xhtml @@ -0,0 +1,275 @@ + + + + + + #{i18n['project.short.name']} - #{i18n['system.users']} + + +
  • #{i18n['system.title']}
  • +
  • /
  • +
  • #{i18n['system.users']}
  • +
  • /
  • +
  • #{permission['system.user.create']}
  • +
    + + + +
    + + +
    +
    + + +

    + + + +

    +

    #{i18n['user.create']}

    + + + + + + + + + + + + + + + + + + + + + + + + Certificador + + + + + Gerencia + + + + + +
    + + + + + + + + + + #{userCreateBean.user.userName eq null or userCreateBean.user.userName.trim() eq "" ? 'thumbs_up_down' : (userCreateBean.availableUserName ? 'thumb_up': 'thumb_down')} + + +
    + +
    + + + + + + + + + + + + +
    + + + + + + + #{i18n['dual.list.permissions.available']} + + + + + #{i18n['dual.list.permissions.taken']} + + + + + + + #{i18n.screen}: + + + + + + #{i18n.permission}: + + + + + + + + + + + + + + + #{i18n['dual.list.routes.available']} + + + + + #{i18n['dual.list.routes.taken']} + + + + + + + + + + + + + + +
    +
    +
    + + + + + + + + +
    +
    + +
    diff --git a/apc-web/src/main/webapp/app/system/user/setting/main.xhtml b/apc-web/src/main/webapp/app/system/user/setting/main.xhtml new file mode 100644 index 0000000..d82fadd --- /dev/null +++ b/apc-web/src/main/webapp/app/system/user/setting/main.xhtml @@ -0,0 +1,450 @@ + + + #{i18n['project.short.name']} - #{i18n['system.users']} + + +
  • #{i18n['system.title']}
  • +
  • /
  • +
  • #{i18n['system.users']}
  • +
  • /
  • +
  • #{permission['system.user.admin']}
  • +
    + + +
    + + +
    +
    + + + + +

    + + + +

    +

    + #{i18n['user.update']} +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Certificador + + + + + Gerencia + + + + + + + + + #{i18n['dual.list.permissions.available']} + + + + + #{i18n['dual.list.permissions.taken']} + + + + + + + #{i18n.screen}: + + + + + + #{i18n.permission}: + + + + + + + + + + + + + + + #{i18n['dual.list.routes.available']} + + + + + #{i18n['dual.list.routes.taken']} + + + + + + + + + + + + + + +
    +
    +
    + + +
    +
    + + + + +

    + + + +

    +

    + #{i18n['other.actions']} + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + #{userUpdateBean.userName eq null or userUpdateBean.userName.trim() eq "" ? 'thumbs_up_down' : (userUpdateBean.availableUserName ? 'thumb_up': 'thumb_down')} + + +
    + +
    +
    + + + + + + + + + +
    +
    +
    + + + + + + + + +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/system/user/setting/main_1.xhtml b/apc-web/src/main/webapp/app/system/user/setting/main_1.xhtml new file mode 100644 index 0000000..d23c57c --- /dev/null +++ b/apc-web/src/main/webapp/app/system/user/setting/main_1.xhtml @@ -0,0 +1,663 @@ + + + #{i18n['project.short.name']} - #{i18n['system.users']} + + +
  • #{i18n['system.title']}
  • +
  • /
  • +
  • #{i18n['system.users']}
  • +
  • /
  • +
  • #{permission['system.user.admin']}
  • +
    + + +
    + + +
    +
    + + + + +

    + + + +

    +

    + #{i18n['user.disable']} + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + +
    +
    + + + + +

    + + + +

    +

    + #{i18n['user.eneble']} + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + +
    +
    + + + + +

    + + + +

    +

    + #{i18n['user.delete']} + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + +
    +
    + + + + +

    + + + +

    +

    + #{i18n['user.update']} + + + +

    + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + #{userCreateBean.user.userName eq null or userCreateBean.user.userName.trim() eq "" ? 'thumbs_up_down' : (userCreateBean.availableUserName ? 'thumb_up': 'thumb_down')} + + +
    + +
    +
    + + + + + + + + + +
    +
    +
    + + + + + + + + + + +
    +
    + + + + +

    + + + +

    +

    + #{i18n['user.update.routes']} + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Certificador + + + + + + + + + + + + + + + + + + + #{i18n['dual.list.routes.available']} + + + + + #{i18n['dual.list.routes.taken']} + + + + + + + + + + + + + + + +
    +
    +
    + + + + + + + + + + + +
    +
    + + + + +

    + + + +

    +

    + #{i18n['user.update.pwd.btn']} + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + +
    +
    + + +

    + + + +

    +

    #{i18n['photo.add']}

    + + +
    +
    +
    + + + + + + + + +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/app/topbar/privacy.xhtml b/apc-web/src/main/webapp/app/topbar/privacy.xhtml new file mode 100644 index 0000000..4641532 --- /dev/null +++ b/apc-web/src/main/webapp/app/topbar/privacy.xhtml @@ -0,0 +1,87 @@ + + #{i18n['project.short.name']} - #{i18n['user.update.pwd']} + + +
  • #{i18n['user.update.pwd']}
  • +
    + + +
    +
    +
    + + + + +

    + #{i18n['user.update.pwd']} +

    + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + + + + + + + +
    +
    + +
    diff --git a/apc-web/src/main/webapp/customerWithoutLoanDetail.xhtml b/apc-web/src/main/webapp/customerWithoutLoanDetail.xhtml new file mode 100644 index 0000000..1d34e1d --- /dev/null +++ b/apc-web/src/main/webapp/customerWithoutLoanDetail.xhtml @@ -0,0 +1,311 @@ + + + + + + #{i18n['project.short.name']} - #{permission['admin.customer']} + + +
  • #{i18n['admin.customers.detail.title']}
  • +
    + + +
    +
    + +
    +
    + + + + +

    #{i18n['admin.customers.detail.title']}

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + + + +

    #{i18n['admin.customers.company.title']}

    +

    + + + + + + +



    + + + + +



    + + + + + + + + + + + +
    +
    +
    +
    +
    + + + +

    Información adicional

    +

    + + + + + +



    + + + + + +
    +
    +
    +
    + +
    + +
    +
    + +

    #{i18n['admin.customers.loan.title']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + + + + Detalle de pagos + + + + Fecha + Pago + Tipo + No. Referencia + Comentarios + + + + + + + + + + + + + + + + + + #{detail.loanDetailsType.value} + #{detail.referenceNumber} + #{detail.comments} + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/dashboard.xhtml b/apc-web/src/main/webapp/dashboard.xhtml new file mode 100644 index 0000000..dd69cac --- /dev/null +++ b/apc-web/src/main/webapp/dashboard.xhtml @@ -0,0 +1,31 @@ + + + + + +
  • #{i18n['dashboard.title']}
  • +
    + + +
    +
    + + + +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    diff --git a/apc-web/src/main/webapp/loanDetail.xhtml b/apc-web/src/main/webapp/loanDetail.xhtml new file mode 100644 index 0000000..95c6450 --- /dev/null +++ b/apc-web/src/main/webapp/loanDetail.xhtml @@ -0,0 +1,530 @@ + + + + + + #{i18n['project.short.name']} - #{permission['admin.loan']} + + +
  • #{i18n['admin.loan.detail.title']}
  • +
    + + + + +
    +
    + +
    +
    + + + +

    #{i18n['admin.customers.detail.title']}

    +

    + + + + + + +



    + + + + +



    + + + + +



    + + + + +



    + + + + +



    + + + + + +
    +
    +
    +
    +
    + + + +

    #{i18n['admin.customers.company.title']}

    +

    + + + + + + +



    + + + + +



    + + + + + +
    +
    +
    +
    + +
    + +
    +
    + +

    #{i18n['admin.customers.loan.title']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + + + + Detalle de pagos + + + + Fecha + Pago + Saldo insoluto + Tipo + No. Referencia + Comentarios + + + + + + + + + + + + + + + + + + + + + + + #{detail.loanDetailsType.value} + #{detail.referenceNumber} + #{detail.comments} + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + +

    #{i18n['admin.endorsements.detail.title']}

    +

    + + + + + + +



    + + + + +



    + + + + +



    + + + + +



    + + + + +



    + + + + + +
    +
    +
    +
    +
    + + + +

    #{i18n['admin.endorsements.company.title']}

    +

    + + + + + + +



    + + + + +



    + + + + + +
    +
    +
    +
    + +
    + +
    +
    + +

    #{i18n['admin.endorsements.loan.title']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + + + +

    Préstamo

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + + +
    +
    +
    + +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/loanDetailEndorsement.xhtml b/apc-web/src/main/webapp/loanDetailEndorsement.xhtml new file mode 100644 index 0000000..c29797f --- /dev/null +++ b/apc-web/src/main/webapp/loanDetailEndorsement.xhtml @@ -0,0 +1,524 @@ + + + + + + #{i18n['project.short.name']} - #{permission['admin.loan']} + + +
  • #{i18n['admin.loan.detail.title']}
  • +
    + + + + +
    +
    + +
    +
    + + + +

    #{i18n['admin.customers.detail.title']}

    +

    + + + + + + +



    + + + + +



    + + + + +



    + + + + +



    + + + + +



    + + + + + +
    +
    +
    +
    +
    + + + +

    #{i18n['admin.customers.company.title']}

    +

    + + + + + + +



    + + + + +



    + + + + + +
    +
    +
    +
    + +
    + +
    +
    + +

    #{i18n['admin.customers.loan.title']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    +
    + + + + Detalle de pagos + + + + Fecha + Pago + Tipo + No. Referencia + Comentarios + + + + + + + + + + + + + + + + + + #{detail.loanDetailsType.value} + #{detail.referenceNumber} + #{detail.comments} + + + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + +

    #{i18n['admin.endorsements.detail.title']}

    +

    + + + + + + +



    + + + + +



    + + + + +



    + + + + +



    + + + + +



    + + + + + +
    +
    +
    +
    +
    + + + +

    #{i18n['admin.endorsements.company.title']}

    +

    + + + + + + +



    + + + + +



    + + + + + +
    +
    +
    +
    + +
    + +
    +
    + +

    #{i18n['admin.endorsements.loan.title']}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + + + +

    Préstamo

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + + +
    +
    +
    + +
    + +
    \ No newline at end of file diff --git a/apc-web/src/main/webapp/login.xhtml b/apc-web/src/main/webapp/login.xhtml new file mode 100644 index 0000000..29260db --- /dev/null +++ b/apc-web/src/main/webapp/login.xhtml @@ -0,0 +1,85 @@ + + + + + + + + + + + #{i18n['project.short.name']} + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/js/scriptGeneric/bitacora.js b/apc-web/src/main/webapp/resources/js/scriptGeneric/bitacora.js new file mode 100644 index 0000000..1473bb9 --- /dev/null +++ b/apc-web/src/main/webapp/resources/js/scriptGeneric/bitacora.js @@ -0,0 +1,7 @@ +function deleteEventBitacora(xhr, status, args) { + if (undefined === args.validationFailed || false === args.validationFailed) { + PF('deleteEventBitacora').hide(); + } else { + PF('deleteEventBitacora').show(); + } +} \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/js/scriptGeneric/dialogGeneric.js b/apc-web/src/main/webapp/resources/js/scriptGeneric/dialogGeneric.js new file mode 100644 index 0000000..5bd74b9 --- /dev/null +++ b/apc-web/src/main/webapp/resources/js/scriptGeneric/dialogGeneric.js @@ -0,0 +1,96 @@ +function validNewObjectGeneric(xhr, status, args) { + if (undefined === args.validationFailed || false === args.validationFailed) { + PF('dlg2').hide(); + } else { + PF('dlg2').show(); + } +} + +function validNewObjectGeneric2(xhr, status, args) { + if (undefined === args.validationFailed || false === args.validationFailed) { + PF('dlg3').hide(); + } else { + PF('dlg3').show(); + } +} + +function validNewObjectGeneric3(xhr, status, args) { + if (undefined === args.validationFailed || false === args.validationFailed) { + PF('dlg4').hide(); + } else { + PF('dlg4').show(); + } +} + +function validNewObjectGeneric4(xhr, status, args) { + if (undefined === args.validationFailed || false === args.validationFailed) { + PF('dlg5').hide(); + } else { + PF('dlg5').show(); + } +} + +function validNewObjectGeneric5(xhr, status, args) { + if (undefined === args.validationFailed || false === args.validationFailed) { + PF('dlg6').hide(); + } else { + PF('dlg6').show(); + } +} + +function validNewObjectGeneric6(xhr, status, args) { + if (undefined === args.validationFailed || false === args.validationFailed) { + PF('dlg7').hide(); + } else { + PF('dlg7').show(); + } +} + +function validNewObjectGeneric7(xhr, status, args) { + if (undefined === args.validationFailed || false === args.validationFailed) { + PF('dlg8').hide(); + } else { + PF('dlg8').show(); + } +} + +function validNewObjectGeneric8(xhr, status, args) { + if (undefined === args.validationFailed || false === args.validationFailed) { + PF('dlg9').hide(); + } else { + PF('dlg9').show(); + } +} + +function validNewObjectGeneric9(xhr, status, args) { + if (undefined === args.validationFailed || false === args.validationFailed) { + PF('dlg10').hide(); + } else { + PF('dlg10').show(); + } +} + +function validNewObjectGeneric10(xhr, status, args) { + if (undefined === args.validationFailed || false === args.validationFailed) { + PF('dlg11').hide(); + } else { + PF('dlg11').show(); + } +} + +function validNewObjectGeneric11(xhr, status, args) { + if (undefined === args.validationFailed || false === args.validationFailed) { + PF('dlg12').hide(); + } else { + PF('dlg12').show(); + } +} + +function deleteEventBitacora(xhr, status, args) { + if (undefined === args.validationFailed || false === args.validationFailed) { + PF('deleteEventBitacora').hide(); + } else { + PF('deleteEventBitacora').show(); + } +} +; diff --git a/apc-web/src/main/webapp/resources/primefaces-serenity-green/theme.css b/apc-web/src/main/webapp/resources/primefaces-serenity-green/theme.css new file mode 100644 index 0000000..d5df32d --- /dev/null +++ b/apc-web/src/main/webapp/resources/primefaces-serenity-green/theme.css @@ -0,0 +1,7653 @@ +@charset "UTF-8"; +/******************************/ +/* Common */ +/******************************/ +/* Predefined Colors */ +body .ui-widget, +body .ui-widget .ui-widget { + font-family: "Roboto", "Helvetica Neue", sans-serif; + text-decoration: none; +} +body .ui-widget-content { + background-color: #ffffff; + border: 1px solid #d8d8d8; + padding: 8px 14px; +} +body .ui-widget-content .ui-icon { + color: #757575; +} +body .ui-widget-header { + background-color: #4384D9; + color: #ffffff; + border: 1px solid #4384D9; + padding: 8px 14px; +} +body .ui-widget-header .ui-icon { + color: #ffffff; +} +body .ui-state-active, body .ui-state-highlight { + background-color: #1B4159; + color: #ffffff; +} +body .ui-state-active .ui-icon, body .ui-state-highlight .ui-icon { + color: #ffffff; +} +body .ui-state-disabled { + opacity: 0.35; + filter: Alpha(Opacity=35); + background-image: none; +} +body .ui-corner-all { + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; +} +body .ui-corner-top { + -moz-border-radius-topleft: 0px; + -webkit-border-top-left-radius: 0px; + border-top-left-radius: 0px; + -moz-border-radius-topright: 0px; + -webkit-border-top-right-radius: 0px; + border-top-right-radius: 0px; +} +body .ui-corner-bottom { + -moz-border-radius-bottomleft: 0px; + -webkit-border-bottom-left-radius: 0px; + border-bottom-left-radius: 0px; + -moz-border-radius-bottomright: 0px; + -webkit-border-bottom-right-radius: 0px; + border-bottom-right-radius: 0px; +} +body .ui-corner-left { + -moz-border-radius-topleft: 0px; + -webkit-border-top-left-radius: 0px; + border-top-left-radius: 0px; + -moz-border-radius-bottomleft: 0px; + -webkit-border-bottom-left-radius: 0px; + border-bottom-left-radius: 0px; +} +body .ui-corner-right { + -moz-border-radius-topright: 0px; + -webkit-border-top-right-radius: 0px; + border-top-right-radius: 0px; + -moz-border-radius-bottomright: 0px; + -webkit-border-bottom-right-radius: 0px; + border-bottom-right-radius: 0px; +} +body .ui-widget-overlay { + background-color: #58575c; + opacity: 0.8; + filter: alpha(opacity=80); +} +body .ui-icon { + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 20px; + display: inline-block; + width: 20px; + height: 20px; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + text-indent: 0; + overflow: visible; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; +} +body .material-icons { + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; +} +body .fa { + font-family: "FontAwesome"; +} +body a { + color: #4384D9; + text-decoration: none; +} + +body .ui-inputfield { + background: white no-repeat; + background-image: linear-gradient(to bottom, #1B4159, #1B4159), linear-gradient(to bottom, #bdbdbd, #bdbdbd); + background-size: 0 2px, 100% 1px; + background-position: 50% 100%, 50% 100%; + transition: background-size 0.3s cubic-bezier(0.64, 0.09, 0.08, 1); + border-width: 0; + padding: 2px 2px 2px 2px; + font-size: 14px; + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; +} +body .ui-inputfield.ui-state-focus { + border-width: 0; + background-size: 100% 2px, 100% 1px; + outline: none; + padding-bottom: 2px; +} +body .ui-inputfield.ui-state-disabled { + border-bottom: 1px dotted; +} +body .ui-inputfield.ui-widget-content { + border-width: 1px; + background: transparent; + background-image: none; +} +body .ui-inputfield.ui-state-error { + border-color: #e62a10; +} +body .ui-inputfield:-webkit-autofill { + border-color: #bdbdbd; + border-style: solid; + border-width: 0px 0px 1px 0px; +} +body .ui-inputfield:-webkit-autofill.ui-state-focus { + padding-bottom: 0px; +} +body .md-inputfield { + display: block; + position: relative; +} +body .md-inputfield input:focus ~ label, +body .md-inputfield input.ui-state-filled ~ label, +body .md-inputfield textarea:focus ~ label, +body .md-inputfield textarea.ui-state-filled ~ label, +body .md-inputfield .md-inputwrapper-focus ~ label, +body .md-inputfield .md-inputwrapper-filled ~ label { + top: -20px; + font-size: 12px; + color: #4384D9; +} +body .md-inputfield input:-webkit-autofill ~ label { + top: -20px; + font-size: 12px; + color: #4384D9; +} +body .md-inputfield label { + color: #999; + font-weight: normal; + position: absolute; + pointer-events: none; + left: 5px; + top: 1px; + transition: 0.3s ease all; + -moz-transition: 0.3s ease all; + -webkit-transition: 0.3s ease all; +} +body .md-inputfield input.ui-state-error ~ label { + color: #e62a10; +} +body .ui-selectonelistbox { + background-color: #ffffff; + border: 0 none; + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; +} +body .ui-selectonelistbox.ui-inputfield { + padding: 0; +} +body .ui-selectonelistbox .ui-selectlistbox-list { + padding: 0; + border: 1px solid #d8d8d8; +} +body .ui-selectonelistbox .ui-selectlistbox-item { + overflow: hidden; + padding: 6px 10px; + margin: 0; + position: relative; + overflow: hidden; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +body .ui-selectonelistbox .ui-selectlistbox-item.ui-state-hover { + background-color: #e8e8e8; + color: #000000; +} +body .ui-selectonelistbox .ui-selectlistbox-filter-container { + margin: 0; + padding: 6px 10px; + background-color: #4384D9; + -moz-border-radius-topleft: 0px; + -webkit-border-top-left-radius: 0px; + border-top-left-radius: 0px; + -moz-border-radius-topright: 0px; + -webkit-border-top-right-radius: 0px; + border-top-right-radius: 0px; +} +body .ui-selectonelistbox .ui-selectlistbox-filter-container .ui-inputfield { + border-color: #d9d9d9; + color: #ffffff; + width: 100%; + padding-left: 2px; + padding-right: 20px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +body .ui-selectonelistbox .ui-selectlistbox-filter-container .ui-inputfield.ui-state-focus { + border-color: #ffffff; +} +body .ui-selectonelistbox .ui-selectlistbox-filter-container .ui-icon { + color: #ffffff; + top: 6px; + right: 12px; +} +body .ui-multiselectlistbox .ui-multiselectlistbox-header { + padding: 6px 10px; + position: relative; + bottom: -1px; +} +body .ui-multiselectlistbox .ui-multiselectlistbox-list { + padding: 0; + background-color: #ffffff; +} +body .ui-multiselectlistbox li.ui-multiselectlistbox-item { + padding: 6px 10px; + margin: 0; + position: relative; + overflow: hidden; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; +} +body .ui-multiselectlistbox li.ui-multiselectlistbox-item.ui-state-hover { + background-color: #e8e8e8; + color: #000000; +} +body .ui-button { + overflow: hidden; + background-color: #4384D9; + color: #ffffff; + height: 30px; + padding: 0 14px; + border: 0 none; + -moz-box-shadow: 0 1px 2.5px 0 rgba(0, 0, 0, 0.26), 0 1px 5px 0 rgba(0, 0, 0, 0.16); + -webkit-box-shadow: 0 1px 2.5px 0 rgba(0, 0, 0, 0.26), 0 1px 5px 0 rgba(0, 0, 0, 0.16); + box-shadow: 0 1px 2.5px 0 rgba(0, 0, 0, 0.26), 0 1px 5px 0 rgba(0, 0, 0, 0.16); + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; +} +body .ui-button.ui-state-hover { + background-color: #3767A6; +} +body .ui-button.ui-state-focus { + outline: 0 none; + background-color: #6ec071; +} +body .ui-button .ui-button-text { + padding: 0; + line-height: 30px; + font-size: 14px; +} +body .ui-button .ui-icon { + color: #ffffff; +} +body .ui-button.ui-button-icon-only { + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; + width: 30px; + height: 30px; +} +body .ui-button.ui-button-icon-only .ui-icon { + margin-top: -10px; + margin-left: -10px; +} +body .ui-button.ui-button-text-icon-left .ui-icon, body .ui-button.ui-button-text-icon-right .ui-icon { + margin-top: -10px; +} +body .ui-button.ui-button-text-icon-left { + padding-left: 36px; +} +body .ui-button.ui-button-text-icon-right { + padding-right: 36px; +} +body .ui-button.secondary-btn { + background-color: #1B4159; + color: #ffffff; +} +body .ui-button.secondary-btn.ui-state-hover { + background-color: #B8860B; +} +body .ui-button.secondary-btn.ui-state-focus { + outline: 0 none; + background-color: #ddc061; +} +body .ui-button.secondary-btn .ui-icon { + color: #ffffff; +} +body .ui-button.blue-grey-btn { + background-color: #607D8B; +} +body .ui-button.blue-grey-btn.ui-state-hover { + background-color: #37474F; +} +body .ui-button.blue-grey-btn.ui-state-focus { + outline: 0 none; + background-color: #7b96a3; +} +body .ui-button.cyan-btn { + background-color: #00BCD4; +} +body .ui-button.cyan-btn.ui-state-hover { + background-color: #00838F; +} +body .ui-button.cyan-btn.ui-state-focus { + outline: 0 none; + background-color: #08e3ff; +} +body .ui-button.teal-btn { + background-color: #009688; +} +body .ui-button.teal-btn.ui-state-hover { + background-color: #00695C; +} +body .ui-button.teal-btn.ui-state-focus { + outline: 0 none; + background-color: #00c9b6; +} +body .ui-button.red-btn { + background-color: #F44336; +} +body .ui-button.red-btn.ui-state-hover { + background-color: #C62828; +} +body .ui-button.red-btn.ui-state-focus { + outline: 0 none; + background-color: #f77066; +} +body .ui-button.green-btn { + background-color: #4384D9; +} +body .ui-button.green-btn.ui-state-hover { + background-color: #2E7D32; +} +body .ui-button.green-btn.ui-state-focus { + outline: 0 none; + background-color: #6ec071; +} +body .ui-button.deep-orange-btn { + background-color: #FF5722; +} +body .ui-button.deep-orange-btn.ui-state-hover { + background-color: #D84315; +} +body .ui-button.deep-orange-btn.ui-state-focus { + outline: 0 none; + background-color: #ff7e55; +} +body .ui-button.purple-btn { + background-color: #673AB7; +} +body .ui-button.purple-btn.ui-state-hover { + background-color: #4527A0; +} +body .ui-button.purple-btn.ui-state-focus { + outline: 0 none; + background-color: #8259cb; +} +body .ui-button.pink-btn { + background-color: #E91E63; +} +body .ui-button.pink-btn.ui-state-hover { + background-color: #AD1457; +} +body .ui-button.pink-btn.ui-state-focus { + outline: 0 none; + background-color: #ee4c83; +} +body .ui-button.amber-btn { + background-color: #FFC107; + color: #212121; +} +body .ui-button.amber-btn.ui-state-hover { + background-color: #FF8F00; +} +body .ui-button.amber-btn.ui-state-focus { + outline: 0 none; + background-color: #ffce3a; +} +body .ui-button.orange-btn { + background-color: #FF9800; +} +body .ui-button.orange-btn.ui-state-hover { + background-color: #EF6C00; +} +body .ui-button.orange-btn.ui-state-focus { + outline: 0 none; + background-color: #ffad33; +} +body .ui-button.brown-btn { + background-color: #795548; +} +body .ui-button.brown-btn.ui-state-hover { + background-color: #4E342E; +} +body .ui-button.brown-btn.ui-state-focus { + outline: 0 none; + background-color: #996b5b; +} +body .ui-button.flat { + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; +} +body .ui-buttonset .ui-state-active { + background-color: #1B4159; + color: #ffffff; +} +body .ui-splitbutton { + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; + -moz-box-shadow: 0 1px 2.5px 0 rgba(0, 0, 0, 0.26), 0 1px 5px 0 rgba(0, 0, 0, 0.16); + -webkit-box-shadow: 0 1px 2.5px 0 rgba(0, 0, 0, 0.26), 0 1px 5px 0 rgba(0, 0, 0, 0.16); + box-shadow: 0 1px 2.5px 0 rgba(0, 0, 0, 0.26), 0 1px 5px 0 rgba(0, 0, 0, 0.16); +} +body .ui-splitbutton > .ui-button { + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; +} +body .ui-splitbutton > .ui-button.ui-state-active { + background-color: #6ec071; +} +body .ui-splitbutton .ui-splitbutton-menubutton { + height: 30px; + -moz-border-radius-topleft: 0; + -webkit-border-top-left-radius: 0; + border-top-left-radius: 0; + -moz-border-radius-bottomleft: 0; + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-topright: 3px; + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; +} +body .ui-selectbooleanbutton.ui-state-active { + background-color: #1B4159; + color: #ffffff; +} +body .ui-selectbooleanbutton.ui-state-active .ui-icon { + color: #ffffff; +} +body .ui-chkbox { + display: inline-block; + vertical-align: middle; + width: 18px; + height: 18px; + cursor: default; + margin: 0 4px 0 0; +} +body .ui-chkbox .ui-chkbox-box { + border: 2px solid #757575; + width: 14px; + height: 14px; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; +} +body .ui-chkbox .ui-chkbox-box .ui-chkbox-icon { + font-size: 18px; + margin-left: -2px; + margin-top: -2px; +} +body .ui-chkbox .ui-chkbox-box.ui-state-active { + border-color: #4384D9; + background-color: #4384D9; +} +body .ui-chkbox .ui-chkbox-box.ui-state-active .ui-chkbox-icon { + color: #ffffff; +} +body .ui-chkbox .ui-chkbox-box.ui-state-active.ui-state-focus .ui-chkbox-icon { + color: #ffffff; +} +body .ui-chkbox .ui-chkbox-box.ui-state-focus { + border-color: #4384D9; + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); + -moz-transition: box-shadow 0.3s; + -o-transition: box-shadow 0.3s; + -webkit-transition: box-shadow 0.3s; + transition: box-shadow 0.3s; +} +body .ui-chkbox .ui-chkbox-box.ui-state-focus .ui-chkbox-icon { + color: #4384D9; +} +body .ui-radiobutton { + position: relative; + margin: 0 4px 0 0; + display: inline-block; + vertical-align: middle; +} +body .ui-radiobutton .ui-radiobutton-box { + width: 14px -1px; + height: 14px -1px; + border: 2px solid #757575; + -moz-transition: box-shadow 0.3s; + -o-transition: box-shadow 0.3s; + -webkit-transition: box-shadow 0.3s; + transition: box-shadow 0.3s; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; +} +body .ui-radiobutton .ui-radiobutton-box.ui-state-focus { + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); +} +body .ui-radiobutton .ui-radiobutton-box.ui-state-active { + border-color: #4384D9; + background-color: transparent; +} +body .ui-radiobutton .ui-radiobutton-box .ui-radiobutton-icon { + top: 0; + left: 0; + width: 20px; + height: 20px; + display: block; + box-sizing: border-box; + position: absolute; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; + transition: -webkit-transform ease 0.28s; + transition: transform ease 0.28s; + -webkit-transform: scale(0); + transform: scale(0); +} +body .ui-radiobutton .ui-radiobutton-box .ui-icon-bullet { + background-color: #4384D9; + -webkit-transform: scale(0.5); + transform: scale(0.5); + margin-left: 0; +} +body .ui-selectmanycheckbox.ui-widget label, body .ui-selectoneradio.ui-widget label { + display: inline-block; + vertical-align: middle; + margin-top: 0; +} +body .ui-autocomplete-panel { + padding: 0; + border: 0 none; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +body .ui-autocomplete-panel.ui-shadow { + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); +} +body .ui-autocomplete-panel .ui-autocomplete-list { + padding: 0; +} +body .ui-autocomplete-panel .ui-autocomplete-list .ui-autocomplete-item { + padding: 6px 10px; + margin: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; +} +body .ui-autocomplete-panel .ui-autocomplete-list .ui-autocomplete-item .ui-autocomplete-query { + font-weight: 700; +} +body .ui-autocomplete-panel .ui-autocomplete-list .ui-autocomplete-group { + padding: 6px 10px; +} +body .ui-autocomplete .ui-autocomplete-dropdown { + right: 0; + margin-right: 0; +} +body .ui-autocomplete .ui-autocomplete-dropdown.ui-button.ui-button-icon-only { + background-color: transparent; + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + height: 20px; + width: 20px; + padding: 0; +} +body .ui-autocomplete .ui-autocomplete-dropdown.ui-button.ui-button-icon-only .ui-button-text { + display: none; +} +body .ui-autocomplete .ui-autocomplete-dropdown.ui-button.ui-button-icon-only .ui-icon { + color: #757575; +} +body .ui-autocomplete.ui-autocomplete-multiple .ui-autocomplete-multiple-container.ui-inputfield { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 2px 2px 1px 2px; +} +body .ui-autocomplete.ui-autocomplete-multiple .ui-autocomplete-multiple-container.ui-state-focus { + padding-bottom: 0; +} +body .ui-autocomplete.ui-autocomplete-multiple .ui-autocomplete-input-token { + float: none; + display: inline-block; + margin: 0 1px; + vertical-align: middle; +} +body .ui-autocomplete.ui-autocomplete-multiple .ui-autocomplete-input-token > input { + padding: 0; + font-size: 14px; + margin: 0; +} +body .ui-autocomplete.ui-autocomplete-multiple .ui-autocomplete-token { + display: inline-block; + float: none; + vertical-align: middle; +} +body .ui-autocomplete.ui-autocomplete-multiple .ui-autocomplete-token .ui-autocomplete-token-icon { + margin-top: -10px; +} +body .ui-selectonemenu { + border-width: 0; + background: white no-repeat; + background-image: linear-gradient(to bottom, #3F51B5, #3F51B5), linear-gradient(to bottom, #bdbdbd, #bdbdbd); + background-size: 0 2px, 100% 1px; + background-position: 50% 100%, 50% 100%; + transition: background-size 0.3s cubic-bezier(0.64, 0.09, 0.08, 1); + padding-bottom: 2px; + box-sizing: border-box; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +body .ui-selectonemenu.ui-state-focus { + border-width: 0; + background-size: 100% 2px, 100% 1px; + outline: none; + padding-bottom: 2px; +} +body .ui-selectonemenu .ui-selectonemenu-trigger { + height: 20px; + width: 20px; + font-size: 20px; + margin-top: 0; + padding: 0; + top: 0; + margin-right: 0; +} +body .ui-selectonemenu .ui-selectonemenu-trigger .ui-icon { + height: 20px; + width: 20px; + margin-top: 0; + color: #757575; +} +body .ui-selectonemenu .ui-selectonemenu-label.ui-inputfield { + background: none; + font-family: "Roboto", "Helvetica Neue", sans-serif; +} +body .ui-selectonemenu-panel { + padding: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +body .ui-selectonemenu-panel .ui-selectonemenu-list { + padding: 0; +} +body .ui-selectonemenu-panel .ui-selectonemenu-item { + margin: 0; + padding: 6px 10px; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +body .ui-selectonemenu-panel .ui-selectonemenu-item.ui-state-hover { + background-color: #e8e8e8; + color: #000000; +} +body .ui-selectonemenu-panel .ui-selectonemenu-item-group { + padding: 8px; +} +body .ui-selectonemenu-panel.ui-shadow { + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); +} +body .ui-selectonemenu-panel .ui-selectonemenu-filter-container .ui-icon { + top: 5px; + right: 8px; +} +body .ui-selectcheckboxmenu { + border-bottom: 1px solid #bdbdbd; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +body .ui-selectcheckboxmenu .ui-selectcheckboxmenu-label-container { + display: block; +} +body .ui-selectcheckboxmenu .ui-selectcheckboxmenu-label-container .ui-selectcheckboxmenu-label { + padding-top: 2px; + padding-bottom: 1px; + padding-left: 2px; +} +body .ui-selectcheckboxmenu .ui-selectcheckboxmenu-trigger { + height: 20px; + width: 20px; + font-size: 20px; + padding: 0; +} +body .ui-selectcheckboxmenu .ui-selectcheckboxmenu-trigger .ui-icon { + height: 20px; + width: 20px; + margin-top: 0; + color: #757575; +} +body .ui-selectcheckboxmenu-panel { + padding: 0; + border: 0 none; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); +} +body .ui-selectcheckboxmenu-panel .ui-selectcheckboxmenu-header { + padding: 6px 10px; + margin: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +body .ui-selectcheckboxmenu-panel .ui-selectcheckboxmenu-header .ui-chkbox { + float: none; + margin: 0 8px 0 1px; +} +body .ui-selectcheckboxmenu-panel .ui-selectcheckboxmenu-header .ui-chkbox .ui-chkbox-box { + border-color: #ffffff; +} +body .ui-selectcheckboxmenu-panel .ui-selectcheckboxmenu-header .ui-chkbox .ui-chkbox-box .ui-chkbox-icon { + border-color: #ffffff; +} +body .ui-selectcheckboxmenu-panel .ui-selectcheckboxmenu-header .ui-chkbox .ui-chkbox-box.ui-state-active .ui-chkbox-icon { + border-color: #ffffff; +} +body .ui-selectcheckboxmenu-panel .ui-selectcheckboxmenu-header .ui-chkbox .ui-chkbox-box.ui-state-focus { + background-color: #81C784; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; +} +body .ui-selectcheckboxmenu-panel .ui-selectcheckboxmenu-header .ui-selectcheckboxmenu-filter-container { + width: 70%; + display: inline-block; + vertical-align: middle; + float: none; +} +body .ui-selectcheckboxmenu-panel .ui-selectcheckboxmenu-header .ui-selectcheckboxmenu-filter-container .ui-icon { + top: -2px; + right: 0px; + color: #ffffff; +} +body .ui-selectcheckboxmenu-panel .ui-selectcheckboxmenu-header .ui-selectcheckboxmenu-filter-container .ui-inputfield { + border-color: #d9d9d9; + padding-right: 30px; + width: 100%; + border-color: #ffffff; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +body .ui-selectcheckboxmenu-panel .ui-selectcheckboxmenu-header .ui-selectcheckboxmenu-filter-container .ui-inputfield:focus { + border-color: #ffffff; +} +body .ui-selectcheckboxmenu-panel .ui-selectcheckboxmenu-header .ui-selectcheckboxmenu-close { + margin-right: -6px; +} +body .ui-selectcheckboxmenu-panel .ui-selectcheckboxmenu-header .ui-selectcheckboxmenu-close span { + color: #ffffff; + -moz-transition: color 0.3s; + -o-transition: color 0.3s; + -webkit-transition: color 0.3s; + transition: color 0.3s; +} +body .ui-selectcheckboxmenu-panel .ui-selectcheckboxmenu-header .ui-selectcheckboxmenu-close.ui-state-hover { + padding: 1px; +} +body .ui-selectcheckboxmenu-panel .ui-selectcheckboxmenu-header .ui-selectcheckboxmenu-close.ui-state-hover span { + color: #1B4159; +} +body .ui-selectcheckboxmenu-panel .ui-selectcheckboxmenu-items-wrapper { + padding: 0; +} +body .ui-selectcheckboxmenu-panel .ui-selectcheckboxmenu-items-wrapper .ui-selectcheckboxmenu-items { + padding: 0; +} +body .ui-selectcheckboxmenu-panel .ui-selectcheckboxmenu-item { + padding: 6px 10px; +} +body .ui-selectcheckboxmenu-panel .ui-selectcheckboxmenu-item label { + vertical-align: middle; + display: inline-block; +} +body .ui-selectcheckboxmenu-panel .ui-selectcheckboxmenu-item .ui-chkbox { + margin-left: 2px; +} +body .ui-fluid .ui-selectonemenu .ui-selectonemenu-trigger { + width: 20px; + padding: 0; +} +body #keypad-div { + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +body #keypad-div .keypad-key { + border: 0 none; + background-color: #ffffff; + font-size: 14px; + padding: 4px; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; +} +body #keypad-div .keypad-key.ui-state-hover { + background-color: #e8e8e8; + color: #000000; +} +body #keypad-div .keypad-shift, body #keypad-div .keypad-enter, body #keypad-div .keypad-spacebar, body #keypad-div .keypad-back, body #keypad-div .keypad-close, body #keypad-div .keypad-clear { + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + background-color: #4384D9; + color: #ffffff; +} +body #keypad-div .keypad-shift.ui-state-hover, body #keypad-div .keypad-enter.ui-state-hover, body #keypad-div .keypad-spacebar.ui-state-hover, body #keypad-div .keypad-back.ui-state-hover, body #keypad-div .keypad-close.ui-state-hover, body #keypad-div .keypad-clear.ui-state-hover { + background-color: #3767A6; + color: #ffffff; +} +body #keypad-div.ui-shadow { + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); +} +body .ui-selectmanymenu { + padding: 0; + background-color: #ffffff; + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; +} +body .ui-selectmanymenu .ui-selectlistbox-item { + padding: 6px 10px; + margin: 0; + position: relative; + overflow: hidden; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +body .ui-selectmanymenu .ui-selectlistbox-item.ui-state-hover { + background-color: #e8e8e8; + color: #000000; +} +body .ui-selectmanymenu .ui-selectlistbox-item .ui-chkbox { + background-color: transparent; + margin: -2px 8px 0 0; +} +body .ui-selectmanymenu .ui-selectlistbox-item .ui-chkbox .ui-chkbox-box.ui-state-active { + border-color: #ffffff; + background-color: #1B4159; +} +body .ui-selectmanymenu .ui-selectlistbox-filter-container { + margin: 0; + padding: 6px 10px; + background-color: #4384D9; + -moz-border-radius-topleft: 0px; + -webkit-border-top-left-radius: 0px; + border-top-left-radius: 0px; + -moz-border-radius-topright: 0px; + -webkit-border-top-right-radius: 0px; + border-top-right-radius: 0px; +} +body .ui-selectmanymenu .ui-selectlistbox-filter-container .ui-inputfield { + border-color: #d9d9d9; + color: #ffffff; + width: 100%; + padding-left: 2px; + padding-right: 20px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +body .ui-selectmanymenu .ui-selectlistbox-filter-container .ui-inputfield.ui-state-focus { + border-color: #ffffff; +} +body .ui-selectmanymenu .ui-selectlistbox-filter-container .ui-icon { + color: #ffffff; + top: 6px; + right: 12px; +} +body .ui-selectmanymenu tr.ui-selectlistbox-item td { + padding: 6px; +} +body .ui-spinner .ui-spinner-button { + width: 18px; + height: 10px; + padding: 0; + margin-right: 0; + background-color: transparent; + color: #212121; + z-index: auto; + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; +} +body .ui-spinner .ui-spinner-button .ui-icon-triangle-1-n { + color: #212121; +} +body .ui-spinner .ui-spinner-button .ui-icon-triangle-1-s { + color: #212121; +} +body .ui-spinner .ui-spinner-button .ui-icon { + top: 0px; + height: 12px; + color: #757575; +} +body .ui-spinner .ui-spinner-up .ui-icon { + top: 4px; +} +body .ui-spinner .ui-spinner-down .ui-icon { + top: 2px; +} +body .ui-spinner .ui-spinner-input { + padding-right: 30px; +} +body .ui-fluid .ui-spinner .ui-spinner-button { + width: 25px; + height: 10px; +} +body .ui-fluid .ui-spinner .ui-spinner-input { + padding-right: 30px; +} +body .ui-inputswitch { + height: 14px; + width: 34px !important; + overflow: visible; + background-color: #9e9e9e; + border-color: #9e9e9e; + padding: 0; + -moz-border-radius: 8px; + -webkit-border-radius: 8px; + border-radius: 8px; +} +body .ui-inputswitch .ui-inputswitch-handle { + top: -3px; + background-color: #ffffff; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; + width: 20px !important; + height: 20px !important; + -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0px 1px 3px 0px, rgba(0, 0, 0, 0.137255) 0px 1px 1px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 1px -1px; + -moz-box-shadow: rgba(0, 0, 0, 0.2) 0px 1px 3px 0px, rgba(0, 0, 0, 0.137255) 0px 1px 1px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 1px -1px; + box-shadow: rgba(0, 0, 0, 0.2) 0px 1px 3px 0px, rgba(0, 0, 0, 0.137255) 0px 1px 1px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 1px -1px; +} +body .ui-inputswitch .ui-inputswitch-on { + visibility: hidden; +} +body .ui-inputswitch .ui-inputswitch-off span, body .ui-inputswitch .ui-inputswitch-on span { + visibility: hidden; +} +body .ui-inputswitch.ui-inputswitch-checked { + background-color: #A1887F; + border-color: #A1887F; +} +body .ui-inputswitch.ui-inputswitch-checked .ui-inputswitch-handle { + background-color: #1B4159; + color: #ffffff; +} +body .ui-slider { + padding: 0; +} +body .ui-slider .ui-slider-handle { + background-color: #1B4159; + color: #ffffff; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; + width: 20px; + height: 20px; + transform: scale(0.7); + -moz-transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); + -o-transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); + -webkit-transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); + transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); +} +body .ui-slider .ui-slider-handle.ui-state-hover, body .ui-slider .ui-slider-handle.ui-state-focus { + transform: scale(1); +} +body .ui-slider .ui-slider-handle:focus { + outline: 0 none; +} +body .ui-slider.ui-slider-horizontal { + height: 2px; + border: 0 none; + background-color: #bdbdbd; +} +body .ui-slider.ui-slider-horizontal .ui-slider-handle { + top: -0.65em; +} +body .ui-slider.ui-slider-vertical { + width: 2px; + border: 0 none; + background-color: #bdbdbd; +} +body .ui-slider.ui-slider-vertical .ui-slider-handle { + left: -9px; +} +body .ui-slider .ui-slider-range { + padding: 0; + background-color: #1B4159; + color: #ffffff; +} +body .ui-calendar .ui-datepicker-trigger { + top: 7px; + right: 28px; + background-color: transparent; + color: #212121; + height: 20px; + width: 20px; + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +body .ui-calendar .ui-datepicker-trigger .ui-icon { + color: #757575; +} +body .ui-datepicker { + padding: 0; + width: 275px; +} +body .ui-datepicker.ui-shadow { + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); +} +body .ui-datepicker .ui-datepicker-header { + padding: 8px 14px; + background: #3767A6; + border-color: #3767A6; + -moz-border-radius-topleft: 2px; + -webkit-border-top-left-radius: 2px; + border-top-left-radius: 2px; + -moz-border-radius-topright: 2px; + -webkit-border-top-right-radius: 2px; + border-top-right-radius: 2px; + -moz-border-radius-bottomleft: 0; + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-bottomright: 0; + -webkit-border-bottom-right-radius: 0; + border-bottom-right-radius: 0; +} +body .ui-datepicker .ui-datepicker-header .ui-datepicker-next { + cursor: pointer; + top: 8px; + font-size: 20px; + right: 8px; + color: #ffffff; + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; +} +body .ui-datepicker .ui-datepicker-header .ui-datepicker-next:before { + content: ""; +} +body .ui-datepicker .ui-datepicker-header .ui-datepicker-next .ui-icon { + display: none; +} +body .ui-datepicker .ui-datepicker-header .ui-datepicker-next.ui-datepicker-next-hover { + right: 8px; +} +body .ui-datepicker .ui-datepicker-header .ui-datepicker-prev { + cursor: pointer; + top: 8px; + font-size: 20px; + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -o-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); + left: 8px; + color: #ffffff; +} +body .ui-datepicker .ui-datepicker-header .ui-datepicker-prev:before { + content: ""; +} +body .ui-datepicker .ui-datepicker-header .ui-datepicker-prev .ui-icon { + display: none; +} +body .ui-datepicker .ui-datepicker-header .ui-datepicker-prev.ui-datepicker-prev-hover { + left: 8px; +} +body .ui-datepicker table { + table-layout: fixed; + border-spacing: 0; + border-collapse: collapse; +} +body .ui-datepicker thead tr { + color: #ffffff; + background: #4384D9; +} +body .ui-datepicker tbody td { + padding: 2px; + box-sizing: border-box; +} +body .ui-datepicker tbody td a, body .ui-datepicker tbody td span { + padding: 0.2em; + margin: 0; + text-align: center; + color: #212121; + display: inline-block; + height: 28px; + width: 28px; + line-height: 28px; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; +} +body .ui-datepicker tbody td a.ui-state-hover, body .ui-datepicker tbody td span.ui-state-hover { + background-color: #e8e8e8; + color: #000000; +} +body .ui-datepicker tbody td a.ui-state-active, body .ui-datepicker tbody td span.ui-state-active { + color: #ffffff; + background-color: #1B4159; + color: #ffffff; +} +body .ui-datepicker tbody td.ui-datepicker-today a, body .ui-datepicker tbody td.ui-datepicker-today span { + color: #212121; + background-color: #ffffff; + border: 1px solid #1B4159; +} +body .ui-datepicker tbody td.ui-datepicker-today a.ui-state-active, body .ui-datepicker tbody td.ui-datepicker-today span.ui-state-active { + color: #ffffff; + background-color: #1B4159; + color: #ffffff; +} +body .ui-datepicker.ui-datepicker-multi .ui-datepicker-header { + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +body .ui-datepicker.ui-datepicker-multi .ui-datepicker-group table { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +body .ui-datepicker .ui-timepicker-div .ui_tpicker_time input { + border-color: #bdbdbd; + -moz-transition: border-color 0.3s; + -o-transition: border-color 0.3s; + -webkit-transition: border-color 0.3s; + transition: border-color 0.3s; + width: 100%; + position: relative; + top: 5px; + left: -5px; +} +body .ui-datepicker .ui-timepicker-div .ui_tpicker_time input.ui-state-focus { + border-width: 0 0 2px 0; + border-color: #4384D9; + padding-bottom: 0px; +} +body .ui-datepicker .ui-timepicker-div dl { + margin: -16px 0 40px 0; +} +body .ui-datepicker .ui-timepicker-div dl dt { + padding: 6px 10px; +} +body .ui-datepicker .ui-timepicker-div dl dd { + margin-top: 42px; +} +body .ui-fluid .ui-calendar .ui-datepicker-trigger.ui-button { + top: -4px; + width: 24px; +} +body .ui-rating .ui-rating-cancel { + text-indent: 0; +} +body .ui-rating .ui-rating-cancel a { + color: #757575; + background: none; + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; + font-size: 20px; +} +body .ui-rating .ui-rating-cancel a:before { + content: "î—‰"; +} +body .ui-rating .ui-rating-star { + text-indent: 0; +} +body .ui-rating .ui-rating-star a { + font-size: 20px; + color: #757575; + background: none; + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; + font-size: 20px; +} +body .ui-rating .ui-rating-star a:before { + content: "î º"; +} +body .ui-rating .ui-rating-star.ui-rating-star-on a { + color: #1B4159; + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; + font-size: 20px; +} +body .ui-rating .ui-rating-star.ui-rating-star-on a:before { + content: "î ¸"; +} +body .ui-password-panel.ui-shadow { + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); +} +body .ui-fileupload .ui-fileupload-buttonbar { + padding: 8px 14px; +} +body .ui-fileupload .ui-fileupload-buttonbar .ui-icon-arrowreturnthick-1-n:before { + content: "file_upload"; +} +body .ui-fileupload .ui-fileupload-buttonbar .ui-button { + background-color: #1B4159; + color: #ffffff; + margin-right: 6px; +} +body .ui-fileupload .ui-fileupload-buttonbar .ui-button .ui-icon { + color: #ffffff; +} +body .ui-fileupload .ui-fileupload-buttonbar .ui-button.ui-state-hover { + background-color: #B8860B; +} +body .ui-fileupload .ui-fileupload-content .ui-messages-error .ui-icon { + color: #ffffff; +} +body .ui-editor.ui-widget-content { + padding: 0px; +} +body .ui-inputgroup { + height: 100%; +} +body .ui-inputgroup .ui-inputgroup-addon, +body .ui-inputgroup .ui-inputgroup-addon-checkbox { + padding: 2px 2px 1px 2px; + border-color: #bdbdbd; + background-color: transparent; + color: #757575; + min-width: 28px; + border-left: 0; + border-right: 0; + border-top: 0; +} +body .ui-inputgroup .ui-inputgroup-addon:first-child, +body .ui-inputgroup .ui-inputgroup-addon-checkbox:first-child { + -moz-border-radius-topleft: 0; + -webkit-border-top-left-radius: 0; + border-top-left-radius: 0; + -moz-border-radius-bottomleft: 0; + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; +} +body .ui-inputgroup .ui-inputgroup-addon:last-child, +body .ui-inputgroup .ui-inputgroup-addon-checkbox:last-child { + -moz-border-radius-topright: 0px; + -webkit-border-top-right-radius: 0px; + border-top-right-radius: 0px; + -moz-border-radius-bottomright: 0px; + -webkit-border-bottom-right-radius: 0px; + border-bottom-right-radius: 0px; +} +body .ui-inputgroup .ui-inputgroup-addon { + align-self: flex-end; +} +body .ui-inputgroup .ui-inputgroup-addon > i { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + align-self: flex-end; + font-size: 1.5em; +} +body .ui-inputgroup .ui-inputtext { + align-self: flex-end; +} +body .ui-inputgroup .md-inputfield { + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + width: 1%; + display: inherit; +} +body .ui-inputgroup .md-inputfield label { + top: 5px; +} +body .ui-inputgroup .ui-button .ui-button-text { + padding: 0; +} +body .ui-inputgroup .ui-inputgroup-addon-checkbox { + padding: 0; + position: relative; +} +body .ui-inputgroup .ui-inputgroup-addon-checkbox .ui-chkbox { + vertical-align: baseline; + position: absolute; + top: 50%; + left: 50%; + margin-top: -9px; + margin-left: -9px; +} +body .ui-fluid .ui-inputgroup .ui-button.ui-button-icon-only { + width: 1.643em; + height: 1.643em; + min-width: 0; + padding: 0; +} +body .ui-fluid .ui-inputgroup .ui-button.ui-button-icon-only .ui-button-icon-left { + margin-left: -0.45em; +} + +body .ui-paginator { + padding: 6px 10px; + background-color: #3767A6; +} +body .ui-paginator > a { + margin-top: -1px; + box-sizing: border-box; + color: #ffffff; +} +body .ui-paginator > a span { + display: none; +} +body .ui-paginator > a.ui-state-hover { + background-color: #81C784; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; +} +body .ui-paginator .ui-paginator-next { + padding: 0 6px; + vertical-align: middle; + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; +} +body .ui-paginator .ui-paginator-next:before { + content: "î‰"; +} +body .ui-paginator .ui-paginator-next:before { + position: relative; + left: -6px; +} +body .ui-paginator .ui-paginator-last { + padding: 0 6px; + vertical-align: middle; + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; +} +body .ui-paginator .ui-paginator-last:before { + content: "î—"; +} +body .ui-paginator .ui-paginator-last:before { + position: relative; + left: -6px; +} +body .ui-paginator .ui-paginator-prev { + padding: 0 6px; + vertical-align: middle; + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; +} +body .ui-paginator .ui-paginator-prev:before { + content: "îˆ"; +} +body .ui-paginator .ui-paginator-prev:before { + position: relative; + left: -5px; +} +body .ui-paginator .ui-paginator-first { + padding: 0 6px; + vertical-align: middle; + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; +} +body .ui-paginator .ui-paginator-first:before { + content: "î—œ"; +} +body .ui-paginator .ui-paginator-first:before { + position: relative; + left: -5px; +} +body .ui-paginator .ui-paginator-pages { + vertical-align: middle; + margin: 0 6px 0 12px; + padding: 0; +} +body .ui-paginator .ui-paginator-pages a { + color: #ffffff; + padding: 0; + width: 24px; + height: 24px; + line-height: 24px; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; +} +body .ui-paginator .ui-paginator-pages a.ui-state-active { + color: #ffffff; +} +body .ui-paginator .ui-paginator-pages a.ui-state-hover { + background-color: #81C784; +} +body .ui-datagrid .ui-datagrid-header { + padding: 8px 14px; +} +body .ui-datagrid .ui-panel .ui-panel-titlebar { + background-color: #ffffff; + color: #212121; + border-color: #dbdbdb; +} +body .ui-datalist .ui-datalist-header { + padding: 8px 14px; +} +body .ui-datatable .ui-datatable-header, +body .ui-datatable .ui-datatable-footer { + padding: 8px 14px; +} +body .ui-datatable .ui-datatable-header .ui-inputfield, +body .ui-datatable .ui-datatable-footer .ui-inputfield { + color: #ffffff; +} +body .ui-datatable .ui-datatable-header .ui-inputfield:focus, +body .ui-datatable .ui-datatable-footer .ui-inputfield:focus { + border-color: #ffffff; +} +body .ui-datatable .ui-paginator { + padding: 6px 10px; +} +body .ui-datatable thead th { + padding: 6px 10px; + border: 0 none; + border-top: 1px solid #d8d8d8; + background-color: #ffffff; +} +body .ui-datatable thead th:first-child { + border-left: 1px solid #d8d8d8; +} +body .ui-datatable thead th:last-child { + border-right: 1px solid #d8d8d8; +} +body .ui-datatable thead th.ui-state-hover { + background-color: #e8e8e8; + color: #000000; +} +body .ui-datatable thead th .ui-sortable-column-icon { + vertical-align: middle; + margin: -4px 0 0 0; + color: #757575; +} +body .ui-datatable thead th .ui-sortable-column-icon.ui-icon-carat-2-n-s { + margin-left: 4px; +} +body .ui-datatable thead th .ui-column-resizer { + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; + font-size: 16px; + color: #757575; +} +body .ui-datatable thead th .ui-column-resizer:before { + content: ""; +} +body .ui-datatable thead th.ui-state-active, body .ui-datatable thead th.ui-state-highlight { + background-color: #1B4159; + color: #ffffff; + border-top-color: #1B4159; +} +body .ui-datatable thead th.ui-state-active .ui-icon, body .ui-datatable thead th.ui-state-highlight .ui-icon { + color: #ffffff; +} +body .ui-datatable thead th.ui-state-active .ui-inputfield, body .ui-datatable thead th.ui-state-highlight .ui-inputfield { + color: #ffffff; +} +body .ui-datatable thead th.ui-state-active .ui-inputfield.ui-state-focus, body .ui-datatable thead th.ui-state-highlight .ui-inputfield.ui-state-focus { + border-color: #ffffff; +} +body .ui-datatable thead tr th { + border: 1px solid #d8d8d8; +} +body .ui-datatable tfoot td { + padding: 6px 10px; + border: 1px solid #d8d8d8; + background-color: #ffffff; +} +body .ui-datatable tbody tr.ui-datatable-even { + background-color: #f4f4f4; +} +body .ui-datatable tbody tr.ui-datatable-even.ui-state-hover { + background-color: #e8e8e8; + color: #000000; +} +body .ui-datatable tbody tr.ui-datatable-even.ui-state-highlight { + background-color: #1B4159; + color: #ffffff; +} +body .ui-datatable tbody tr td { + border: 1px solid #d8d8d8; + padding: 6px 10px; +} +body .ui-datatable tbody tr td .ui-row-toggler { + display: inherit; +} +body .ui-datatable tbody tr td.ui-state-highlight .ui-inputfield { + color: #ffffff; + border-color: #ffffff; +} +body .ui-datatable tbody tr td.ui-state-highlight .ui-inputfield:focus { + border-color: #ffffff; +} +body .ui-datatable tbody tr td.ui-state-error { + background-color: #e62a10; + border-color: #e62a10; + color: #ffffff; +} +body .ui-datatable tbody tr.ui-widget-content { + border: 0 none; +} +body .ui-datatable tbody tr.ui-state-highlight  { + background-color: #1B4159; + color: #ffffff; +} +body .ui-datatable tbody tr .ui-cell-editor-input input { + color: #ffffff; +} +body .ui-datatable tbody tr.ui-state-hover { + background-color: #e8e8e8; + color: #000000; +} +body .ui-datatable tbody tr.ui-state-error { + background-color: #e62a10; + border-color: #e62a10; + color: #ffffff; +} +body .ui-datatable tbody tr.ui-state-error .ui-inputfield, +body .ui-datatable tbody tr.ui-state-error .ui-inputfield.ui-state-error { + border-color: #ffffff; +} +body .ui-datatable tbody tr.ui-state-highlight td { + border-right-color: #B8860B; +} +body .ui-datatable tbody tr.ui-state-highlight td:last-child { + border-right-color: #d8d8d8; +} +body .ui-datatable tbody tr.ui-state-highlight td.ui-selection-column .ui-radiobutton-box { + border-color: #ffffff; + background-color: transparent; +} +body .ui-datatable tbody tr.ui-state-highlight td.ui-selection-column .ui-radiobutton-box .ui-radiobutton-icon { + background-color: #ffffff; +} +body .ui-datatable tbody tr.ui-state-highlight td.ui-selection-column .ui-chkbox-box { + border-color: #ffffff; + background-color: transparent; +} +body .ui-datatable tbody tr.ui-state-highlight td.ui-selection-column .ui-chkbox-box .ui-chkbox-icon { + color: #ffffff; + margin-left: -3px; +} +body .ui-datatable tbody tr.ui-state-highlight .ui-inputfield { + color: #ffffff; + border-color: #ffffff; +} +body .ui-datatable tbody tr.ui-state-highlight .ui-inputfield:focus { + border-color: #ffffff; +} +body .ui-datatable > .ui-icon-arrowthick-1-s { + font-size: 18px; + color: #1B4159; +} +body .ui-datatable > .ui-icon-arrowthick-1-n { + display: none !important; +} +body .ui-datatable.ui-datatable-scrollable .ui-datatable-scrollable-header, body .ui-datatable.ui-datatable-scrollable .ui-datatable-scrollable-footer { + border: 0 none; + background-color: transparent; + padding: 0px; +} +body .ui-datatable.ui-datatable-scrollable .ui-datatable-scrollable-header .ui-datatable-data tr.ui-widget-content, body .ui-datatable.ui-datatable-scrollable .ui-datatable-scrollable-footer .ui-datatable-data tr.ui-widget-content { + padding: 0px; +} +body .ui-datatable.ui-datatable-scrollable .ui-datatable-scrollable-header .ui-datatable-data td, body .ui-datatable.ui-datatable-scrollable .ui-datatable-scrollable-footer .ui-datatable-data td { + color: #212121; +} +body .ui-datatable.ui-datatable-scrollable thead tr th { + color: #212121; + font-size: 14px; +} +body .ui-datatable.ui-datatable-scrollable tfoot tr td { + color: #212121; + font-size: 14px; +} +body .ui-draggable-dragging.ui-state-default { + background-color: #4384D9; +} +body .ui-picklist .ui-picklist-list { + padding: 0; +} +body .ui-picklist .ui-picklist-caption { + padding: 8px 14px; +} +body .ui-picklist li.ui-picklist-item { + padding: 6px 10px; + margin: 0; + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; +} +body .ui-picklist li.ui-picklist-item.ui-state-hover { + background-color: #e8e8e8; + color: #000000; +} +body .ui-picklist .ui-picklist-buttons { + width: 48px; +} +body .ui-picklist .ui-picklist-buttons .ui-button.ui-button-icon-only { + width: 32px; + margin-right: 0; + display: inline-block; + margin-bottom: 4px; +} +body .ui-picklist .ui-picklist-buttons-cell { + text-align: center; +} +body .ui-picklist .ui-picklist-filter-container { + margin-bottom: 4px; +} +body .ui-picklist .ui-picklist-filter-container .ui-picklist-filter { + width: 100%; +} +body .ui-picklist .ui-picklist-filter-container .ui-icon { + color: #757575; + top: 0px; +} +body .ui-picklist.ui-picklist-responsive .ui-picklist-buttons { + width: 48px; +} +body .ui-picklist.ui-picklist-responsive .ui-picklist-buttons .ui-button.ui-button-icon-only { + margin: 0 auto; + display: block; + margin-bottom: 8px; +} +body .ui-picklist.ui-picklist-responsive .ui-picklist-list .ui-picklist-item .ui-chkbox { + margin-right: 8px; + vertical-align: top; +} +body .ui-picklist.ui-picklist-responsive .ui-picklist-list .ui-picklist-item .ui-chkbox, body .ui-picklist.ui-picklist-responsive .ui-picklist-list .ui-picklist-item .ui-chkbox * { + box-sizing: content-box; +} +body .ui-picklist.ui-picklist-responsive .ui-chkbox-box { + width: 14px; + height: 14px; +} +body .ui-orderlist .ui-orderlist-caption { + padding: 8px 14px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +body .ui-orderlist .ui-orderlist-list { + padding: 0; + box-sizing: border-box; +} +body .ui-orderlist .ui-orderlist-list li.ui-orderlist-item { + padding: 6px 10px; + margin: 0; + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; +} +body .ui-orderlist .ui-orderlist-list li.ui-orderlist-item.ui-state-hover { + background-color: #e8e8e8; + color: #000000; +} +body .ui-orderlist .ui-orderlist-controls { + width: 60px; + text-align: center; +} +body .ui-orderlist .ui-orderlist-controls .ui-button.ui-button-icon-only { + width: 32px; + margin: 0 0 8px 0; + display: inline-block; +} +body .ui-carousel { + padding: 0; + border: 0 none; +} +body .ui-carousel .ui-carousel-header { + margin: 0; +} +body .ui-carousel .ui-carousel-header .ui-icon { + color: #ffffff; +} +body .ui-carousel .ui-carousel-header .ui-carousel-dropdown, +body .ui-carousel .ui-carousel-header .ui-carousel-mobile-dropdown { + margin: 5px 10px; +} +body .ui-carousel .ui-carousel-footer { + margin: 0; + padding: 8px 14px-2px; + font-size: 12px; +} +body .ui-carousel .ui-carousel-page-links { + margin-top: 2px; +} +body .ui-tree { + padding: 4px 7px; +} +body .ui-tree .ui-treenode-children { + padding-left: 28px; +} +body .ui-tree .ui-treenode-leaf-icon { + width: 23px; +} +body .ui-tree .ui-tree-container { + overflow: visible; +} +body .ui-tree .ui-treenode-content .ui-chkbox { + margin: 0 4px 0 4px; +} +body .ui-tree .ui-treenode-content .ui-chkbox .ui-icon { + color: #757575; +} +body .ui-tree .ui-treenode-content .ui-tree-toggler { + vertical-align: middle; +} +body .ui-tree .ui-treenode-content .ui-treenode-icon { + vertical-align: middle; + margin: 0 4px 0 4px; +} +body .ui-tree .ui-treenode-content .ui-treenode-label { + padding: 0 4px; + margin: 0; + vertical-align: middle; +} +body .ui-tree .ui-tree-droppoint.ui-state-hover { + background-color: #1B4159; +} +body .ui-tree.ui-tree-horizontal { + padding-left: 0; + padding-right: 0; +} +body .ui-tree.ui-tree-horizontal .ui-treenode-content { + background-color: #ffffff; + border: 1px solid #d8d8d8; +} +body .ui-tree.ui-tree-horizontal .ui-treenode-content .ui-tree-toggler { + vertical-align: middle; +} +body .ui-tree.ui-tree-horizontal .ui-treenode-content .ui-treenode-icon { + vertical-align: middle; + margin-right: 4px; +} +body .ui-tree.ui-tree-horizontal .ui-treenode-content.ui-state-highlight { + background-color: #1B4159; + color: #ffffff; +} +body .ui-tree.ui-tree-horizontal .ui-treenode-content.ui-state-highlight .ui-chkbox-box { + border-color: #ffffff; +} +body .ui-tree.ui-tree-horizontal .ui-treenode-content.ui-state-highlight .ui-chkbox-box .ui-chkbox-icon { + color: #ffffff; +} +body .ui-tree-draghelper { + border: 1px solid #4384D9; +} +body .fc .fc-button-group .ui-icon { + margin-top: 3px; +} +body .fc .fc-button-group .ui-state-active { + background-color: #1B4159; + color: #ffffff; +} +body .fc .fc-event { + background-color: #81C784; + color: #ffffff; +} +body .fc table { + box-sizing: border-box; +} +body .fc div.ui-widget-content { + padding-left: 0px; + padding-right: 0px; +} +body .ui-treetable .ui-treetable-header, +body .ui-treetable .ui-treetable-footer { + padding: 8px 14px; +} +body .ui-treetable thead th { + background-color: #ffffff; + padding: 6px 10px; + border: 0 none; + border-top: 1px solid #d8d8d8; +} +body .ui-treetable thead th .ui-icon { + color: #757575; +} +body .ui-treetable thead th:first-child { + border-left: 1px solid #d8d8d8; +} +body .ui-treetable thead th:last-child { + border-right: 1px solid #d8d8d8; +} +body .ui-treetable thead th.ui-state-hover { + background-color: #e8e8e8; + color: #000000; +} +body .ui-treetable thead th .ui-sortable-column-icon { + vertical-align: middle; + margin: -4px 0 0 0; + color: #757575; +} +body .ui-treetable thead th .ui-sortable-column-icon.ui-icon-carat-2-n-s { + margin-left: 4px; +} +body .ui-treetable thead th.ui-state-active { + background-color: #1B4159; + color: #ffffff; +} +body .ui-treetable thead th.ui-state-active .ui-icon { + color: #ffffff; +} +body .ui-treetable thead th .ui-column-resizer { + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; + font-size: 16px; + color: #757575; +} +body .ui-treetable thead th .ui-column-resizer:before { + content: ""; +} +body .ui-treetable tr th { + border: 1px solid #d8d8d8; +} +body .ui-treetable tfoot td { + border: 0 none; + padding: 10px 14px; +} +body .ui-treetable tbody tr td { + border: 1px solid #d8d8d8; + padding: 6px 10px; +} +body .ui-treetable tbody tr td .ui-treetable-toggler { + display: inline-block; + vertical-align: middle; + margin: 0 4px; + float: none; +} +body .ui-treetable tbody tr td .ui-chkbox { + margin-right: 8px; +} +body .ui-treetable tbody tr td .ui-chkbox .ui-chkbox-icon { + color: #757575; +} +body .ui-treetable tbody tr.ui-state-hover { + background-color: #e8e8e8; + color: #000000; +} +body .ui-treetable tbody tr.ui-state-highlight .ui-chkbox .ui-chkbox-box { + border-color: #ffffff; +} +body .ui-treetable tbody tr.ui-state-highlight .ui-chkbox .ui-chkbox-box .ui-icon { + color: #ffffff; +} +body .ui-treetable.ui-treetable-scrollable .ui-treetable-scrollable-header, body .ui-treetable.ui-treetable-scrollable .ui-treetable-scrollable-footer { + background-color: transparent; + border: 0 none; + padding: 0px; +} +body .ui-treetable.ui-treetable-scrollable thead th { + background-color: #ffffff; + color: #212121; + border-bottom: 1px solid #dbdbdb; + border-top: 1px solid #dbdbdb; +} +body .ui-treetable.ui-treetable-scrollable thead th.ui-state-active { + background-color: #1B4159; + color: #ffffff; +} +body .ui-treetable.ui-treetable-scrollable thead.ui-treetable-scrollable-theadclone th { + padding-bottom: 0px; + padding-top: 0px; + line-height: 0px; + border-top: 0 none; +} +body .ui-treetable.ui-treetable-scrollable tbody.ui-widget-content { + padding: 0px; +} +body .ui-treetable.ui-treetable-scrollable tbody tr.ui-widget-content { + padding: 0px; +} +body .ui-panelgrid tbody tr.ui-widget-content { + border: 1px solid #d8d8d8; +} + +body .ui-panel { + padding: 0; +} +body .ui-panel .ui-panel-titlebar { + border: 0 none; + padding: 8px 14px; + -moz-border-radius-topleft: 2px; + -webkit-border-top-left-radius: 2px; + border-top-left-radius: 2px; + -moz-border-radius-topright: 2px; + -webkit-border-top-right-radius: 2px; + border-top-right-radius: 2px; + -moz-border-radius-bottomleft: 0px; + -webkit-border-bottom-left-radius: 0px; + border-bottom-left-radius: 0px; + -moz-border-radius-bottomright: 0px; + -webkit-border-bottom-right-radius: 0px; + border-bottom-right-radius: 0px; +} +body .ui-panel .ui-panel-titlebar .ui-panel-title { + margin: 0; + line-height: 20px; +} +body .ui-panel .ui-panel-titlebar .ui-panel-titlebar-icon { + width: 20px; + height: 20px; + color: #ffffff; + margin: 0; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; +} +body .ui-panel .ui-panel-titlebar .ui-panel-titlebar-icon:hover { + background-color: #81C784; +} +body .ui-panel .ui-panel-content { + height: 100%; + box-sizing: border-box; + padding: 8px 14px; +} +body .ui-panel .ui-panel-footer { + padding: 8px 14px; + border: 0 none; + border-top: 1px solid #dbdbdb; + margin: 0; +} +body .ui-panel.ui-panel-collapsed-h .ui-panel-titlebar { + padding-left: 40px; +} +body .ui-fieldset { + padding: 8px 14px; +} +body .ui-fieldset .ui-fieldset-legend { + padding: 8px 14px; + padding-left: 2px; + padding-right: 8px; + color: #4384D9; +} +body .ui-fieldset .ui-fieldset-legend .ui-fieldset-toggler { + padding: 8px; + background-color: #4384D9; + color: #ffffff; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; + margin-top: -10px; + margin-right: 8px; + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); +} +body .ui-fieldset .ui-fieldset-legend .ui-fieldset-toggler:hover { + background-color: #3767A6; +} +body .ui-fieldset .ui-fieldset-legend.ui-state-focus { + background-color: transparent; +} +body .ui-fieldset .ui-fieldset-legend.ui-state-active { + background-color: transparent; +} +body .ui-notificationbar { + background-color: #1B4159; + color: #ffffff; +} +body .ui-panelgrid .ui-panelgrid-cell { + padding: 8px 14px; +} +body .ui-panelgrid .ui-panelgrid-header > .ui-widget-header, +body .ui-panelgrid .ui-panelgrid-footer > .ui-widget-header { + border-color: #3767A6; +} +body .ui-panelgrid tbody .ui-panelgrid-cell.ui-widget-header { + background-color: #81C784; +} +body .ui-accordion .ui-accordion-header { + background-color: #4384D9; + padding: 8px 14px; + padding-left: 36px; + font-size: 14px; + color: #ffffff; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; +} +body .ui-accordion .ui-accordion-header.ui-state-hover { + background-color: #3767A6; +} +body .ui-accordion .ui-accordion-header.ui-state-active { + background-color: #1B4159; + color: #ffffff; +} +body .ui-accordion .ui-accordion-header.ui-state-active.ui-tabs-outline { + outline: 0 none; + background-color: #ddc061; +} +body .ui-accordion .ui-accordion-header .ui-icon-triangle-1-e { + margin-top: -10px; +} +body .ui-accordion .ui-accordion-header .ui-icon-triangle-1-s { + margin-top: -10px; +} +body .ui-accordion .ui-accordion-header.ui-tabs-outline { + background-color: #6ec071; +} +body .ui-accordion .ui-accordion-content { + padding: 8px 14px; + line-height: 18px; +} +body .ui-scrollpanel { + padding: 0; +} +body .ui-scrollpanel .ui-scrollpanel-track { + background-color: #ffffff; + border-color: transparent; + padding: 0; +} +body .ui-scrollpanel .ui-scrollpanel-drag { + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + background-color: #dbdbdb; +} +body .ui-toolbar { + background-color: #3767A6; + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); + padding: 10px; +} +body .ui-toolbar .ui-button { + margin-right: 6px; +} +body .ui-tabs { + padding: 0; +} +body .ui-tabs .ui-tabs-nav { + background-color: #ffffff; + border: 0 none; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +body .ui-tabs .ui-tabs-nav > li { + padding: 0; + -moz-transition: border-color 0.3s; + -o-transition: border-color 0.3s; + -webkit-transition: border-color 0.3s; + transition: border-color 0.3s; +} +body .ui-tabs .ui-tabs-nav > li > a { + padding: 8px 14px; +} +body .ui-tabs .ui-tabs-nav > li > a:focus { + outline: 0 none; +} +body .ui-tabs .ui-tabs-nav > li > .ui-icon-close { + margin: 7px 0 0 0; + -moz-transition: color 0.3s; + -o-transition: color 0.3s; + -webkit-transition: color 0.3s; + transition: color 0.3s; + color: #757575; +} +body .ui-tabs .ui-tabs-nav > li.ui-state-default a { + color: #757575; +} +body .ui-tabs .ui-tabs-nav > li.ui-state-hover { + background-color: #ffffff; +} +body .ui-tabs .ui-tabs-nav > li.ui-state-active { + background-color: #ffffff; + border-color: #1B4159; + border-style: solid; +} +body .ui-tabs .ui-tabs-nav > li.ui-state-active a { + color: #4384D9; + font-weight: 700; +} +body .ui-tabs .ui-tabs-nav > li.ui-state-active > .ui-icon-close { + color: #1B4159; +} +body .ui-tabs .ui-tabs-nav > li.ui-tabs-outline { + outline: 0 none; + border-color: #A1887F; +} +body .ui-tabs .ui-tabs-panel { + padding: 8px 14px; +} +body .ui-tabs.ui-tabs-top > .ui-tabs-nav { + padding: 0; + margin: 0; + -moz-border-radius-topleft: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #dbdbdb; +} +body .ui-tabs.ui-tabs-top > .ui-tabs-nav > li { + border-style: solid; + border-width: 0 0 2px 0; +} +body .ui-tabs.ui-tabs-bottom > .ui-tabs-nav { + padding: 0; + margin: 0; + -moz-border-radius-bottomleft: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomright: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + border-top: 1px solid #dbdbdb; +} +body .ui-tabs.ui-tabs-bottom > .ui-tabs-nav > li { + border-width: 2px 0 0 0; +} +body .ui-tabs.ui-tabs-left > .ui-tabs-nav { + padding: 0; + margin: 0; + -moz-border-radius-topleft: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + border-right: 1px solid #dbdbdb; +} +body .ui-tabs.ui-tabs-left > .ui-tabs-nav > li { + box-sizing: border-box; + border-width: 0 2px 0 0; +} +body .ui-tabs.ui-tabs-left > .ui-tabs-nav > li > a { + width: 100%; + box-sizing: border-box; +} +body .ui-tabs.ui-tabs-right > .ui-tabs-nav { + padding: 0; + -moz-border-radius-topright: 4px; + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + border-left: 1px solid #dbdbdb; +} +body .ui-tabs.ui-tabs-right > .ui-tabs-nav > li { + box-sizing: border-box; + border-width: 0 0 0 2px; +} +body .ui-tabs.ui-tabs-right > .ui-tabs-nav > li > a { + width: 100%; + box-sizing: border-box; +} +body .ui-tabs.ui-tabs-right > .ui-tabs-nav > li.ui-state-active > a { + padding-left: 14px; +} +body .ui-tabs.ui-tabs-scrollable .ui-tabs-navscroller > .ui-tabs-navscroller-btn { + outline: 0 none; + width: 18px; + display: block; + height: 42px; + background-color: #ffffff; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; +} +body .ui-tabs.ui-tabs-scrollable .ui-tabs-navscroller > .ui-tabs-navscroller-btn > span { + margin-top: 10px; +} +body .ui-tabs.ui-tabs-scrollable .ui-tabs-navscroller > .ui-tabs-navscroller-btn:hover { + background-color: #e8e8e8; + color: #000000; +} +body .ui-tabs.ui-tabs-scrollable .ui-tabs-navscroller > .ui-tabs-navscroller-btn-left { + z-index: 1; + left: 0; + border-right: 1px solid #dbdbdb; +} +body .ui-tabs.ui-tabs-scrollable .ui-tabs-navscroller > .ui-tabs-navscroller-btn-left > span:before { + position: relative; + left: -2px; +} +body .ui-tabs.ui-tabs-scrollable .ui-tabs-navscroller > .ui-tabs-navscroller-btn-right { + z-index: 1; + right: 0; + border-left: 1px solid #dbdbdb; +} +body .ui-tabs.ui-tabs-scrollable .ui-tabs-navscroller > .ui-tabs-navscroller-btn-right > span:before { + position: relative; + right: 2px; +} +body .ui-tabs.ui-tabs-scrollable .ui-tabs-navscroller .ui-tabs-nav > li { + margin: 0; +} +body .ui-tabs.ui-tabs-scrollable.ui-tabs-top .ui-tabs-navscroller > .ui-tabs-nav { + border-bottom: 1px solid #dbdbdb; +} +body .ui-tabs.ui-tabs-scrollable.ui-tabs-top .ui-tabs-navscroller > .ui-tabs-nav > li { + border-style: solid; + border-width: 0 0 2px 0; +} +body .ui-tabs.ui-tabs-scrollable.ui-tabs-top .ui-tabs-navscroller > .ui-tabs-navscroller-btn-left { + border-top: 0 none; + border-bottom: 1px solid #dbdbdb; +} +body .ui-tabs.ui-tabs-scrollable.ui-tabs-bottom .ui-tabs-navscroller > .ui-tabs-nav { + border-top: 1px solid #dbdbdb; +} +body .ui-tabs.ui-tabs-scrollable.ui-tabs-bottom .ui-tabs-navscroller > .ui-tabs-nav > li { + border-style: solid; + border-width: 2px 0 0 0; +} +body .ui-tabs.ui-tabs-scrollable.ui-tabs-bottom .ui-tabs-navscroller > .ui-tabs-navscroller-btn-left { + border-bottom: 0 none; + border-top: 1px solid #dbdbdb; +} +body .ui-tabs.ui-tabs-scrollable.ui-tabs-bottom .ui-tabs-navscroller > .ui-tabs-navscroller-btn-right { + border-top: 1px solid #dbdbdb; +} +body .ui-wizard .ui-wizard-step-titles { + background-color: #3767A6; + -moz-border-radius-topleft: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-topright: 3px; + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; +} +body .ui-wizard .ui-wizard-step-titles > li { + padding: 8px 14px; + color: #ffffff; +} +body .ui-wizard .ui-wizard-step-titles > li.ui-state-highlight { + color: #ffffff; + background-color: transparent; + border-bottom: 2px solid #1B4159; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +body .ui-wizard .ui-wizard-content { + margin: 0; +} +body .ui-wizard .ui-wizard-content .ui-panel .ui-panel-titlebar { + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} + +body .ui-breadcrumb a { + color: #ffffff; +} +body .ui-breadcrumb li:first-child a { + position: relative; + font-size: 20px; + margin-top: 0; +} +body .ui-breadcrumb li:first-child a span { + display: none; +} +body .ui-steps { + position: relative; +} +body .ui-steps .ui-steps-item { + background-color: transparent; +} +body .ui-steps .ui-steps-item.ui-state-disabled { + opacity: 1; + filter: alpha(opacity=100); +} +body .ui-steps .ui-steps-item .ui-menuitem-link { + display: inline-block; + text-align: left; + background-color: #ffffff; + overflow: hidden; +} +body .ui-steps .ui-steps-item .ui-menuitem-link .ui-steps-number { + display: inline-block; + background-color: #757575; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; + padding: 4px 8px; + font-size: 16px; + color: #ffffff; +} +body .ui-steps .ui-steps-item .ui-menuitem-link .ui-steps-title { + display: inline; + margin-left: 10px; + color: #757575; +} +body .ui-steps .ui-steps-item.ui-state-highlight .ui-steps-number { + background-color: #4384D9; +} +body .ui-steps .ui-steps-item.ui-state-highlight .ui-steps-title { + font-weight: 700; + color: #212121; +} +body .ui-steps .ui-steps-item:last-child .ui-menuitem-link { + display: block; +} +body .ui-steps:before { + content: " "; + border: 1px solid #dbdbdb; + width: 90%; + top: 45%; + left: 0; + display: block; + position: absolute; +} +body .ui-menu { + padding: 8px 0; +} +body .ui-menu .ui-shadow, body .ui-menu.ui-shadow { + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); +} +body .ui-menu .ui-menu-list { + padding: 0; + margin: 0; +} +body .ui-menu .ui-menu-list li.ui-widget-header { + margin: 0 0 1px 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + border: 0 none; + width: 100%; + box-sizing: border-box; + padding: 0; +} +body .ui-menu .ui-menu-list li.ui-widget-header h3 { + display: block; + float: none; + font-size: 14px; + padding: 6px 10px; + font-weight: 400; +} +body .ui-menu .ui-menu-list li.ui-widget-header h3 .ui-icon.ui-icon-triangle-1-s, body .ui-menu .ui-menu-list li.ui-widget-header h3 .ui-icon.ui-icon-triangle-1-e { + margin: -12px 0 0 0; +} +body .ui-menu .ui-menu-list li.ui-menuitem { + margin: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +body .ui-menu .ui-menu-list li.ui-menuitem.ui-state-hover { + background-color: #e8e8e8; + color: #000000; +} +body .ui-menu .ui-menu-list li.ui-menuitem .ui-menuitem-link { + border: 0 none; + padding: 6px 10px; + width: 100%; + min-height: 32px; + box-sizing: border-box; + color: #212121; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + position: relative; +} +body .ui-menu .ui-menu-list li.ui-menuitem .ui-menuitem-link.ui-state-hover { + background-color: #e8e8e8; + color: #000000; +} +body .ui-menu .ui-menu-list li.ui-menuitem .ui-menuitem-link .ui-menuitem-icon { + margin-right: 8px; + display: inline-block; + vertical-align: middle; + float: none; + font-size: 18px; + height: auto; +} +body .ui-menu .ui-menu-list li.ui-menuitem .ui-menuitem-link .ui-menuitem-text { + display: inline-block; + vertical-align: middle; + float: none; +} +body .ui-menu .ui-menu-list .ui-separator { + height: 1px; + background-color: #dbdbdb; + width: 100%; + box-sizing: border-box; +} +body .ui-menu.ui-menu-toggleable .ui-menu-list li.ui-widget-header { + padding-left: 30px; +} +body .ui-menu.ui-menu-toggleable .ui-menu-list li.ui-widget-header .ui-icon { + color: #ffffff; +} +body .ui-menu.ui-menu-toggleable .ui-menu-list li.ui-widget-header .ui-icon.ui-icon-triangle-1-s { + margin-top: -10px; +} +body .ui-menu.ui-menu-toggleable .ui-menu-list li.ui-widget-header .ui-icon.ui-icon-triangle-1-e { + margin-top: -10px; +} +body .ui-menu.ui-tieredmenu .ui-icon-triangle-1-e { + position: absolute; + right: 8px; + top: 6px; + float: none; +} +body .ui-menu.ui-tieredmenu .ui-menu-child { + padding: 8px 0; +} +body .ui-menu.ui-menubar { + padding: 0; +} +body .ui-menu.ui-menubar .ui-menu-child { + padding: 8px 0; +} +body .ui-menu.ui-menubar .ui-menubar-options { + padding: 0 10px; +} +body .ui-menu.ui-menubar.ui-megamenu.ui-megamenu-vertical > .ui-menu-list { + padding: 8px 0; +} +body .ui-menu.ui-slidemenu .ui-menu-parent .ui-menu-child { + padding: 0; + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; +} +body .ui-menu.ui-slidemenu .ui-slidemenu-backward { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +body .ui-tabmenu { + padding: 0; +} +body .ui-tabmenu .ui-tabmenu-nav { + padding: 0; + background-color: #ffffff; + border: 0 none; + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; +} +body .ui-tabmenu .ui-tabmenu-nav > .ui-tabmenuitem { + top: auto; + margin: 0 4px 0 0; + padding: 0; + border-style: solid; + border-width: 0 0 2px 0; + -moz-transition: border-color 0.3s; + -o-transition: border-color 0.3s; + -webkit-transition: border-color 0.3s; + transition: border-color 0.3s; +} +body .ui-tabmenu .ui-tabmenu-nav > .ui-tabmenuitem > a { + padding: 8px 14px; +} +body .ui-tabmenu .ui-tabmenu-nav > .ui-tabmenuitem > a:focus { + outline: 0 none; +} +body .ui-tabmenu .ui-tabmenu-nav > .ui-tabmenuitem > a .ui-menuitem-icon, body .ui-tabmenu .ui-tabmenu-nav > .ui-tabmenuitem > a .ui-menuitem-text { + float: none; + display: inline-block; + vertical-align: middle; +} +body .ui-tabmenu .ui-tabmenu-nav > .ui-tabmenuitem > a .ui-menuitem-icon { + margin-right: 12px; +} +body .ui-tabmenu .ui-tabmenu-nav > .ui-tabmenuitem.ui-state-default a { + color: #757575; +} +body .ui-tabmenu .ui-tabmenu-nav > .ui-tabmenuitem.ui-state-default a .ui-icon { + color: #757575; +} +body .ui-tabmenu .ui-tabmenu-nav > .ui-tabmenuitem.ui-state-hover { + background-color: #ffffff; +} +body .ui-tabmenu .ui-tabmenu-nav > .ui-tabmenuitem.ui-state-active { + background-color: #ffffff; + border-color: #1B4159; + border-style: solid; +} +body .ui-tabmenu .ui-tabmenu-nav > .ui-tabmenuitem.ui-state-active a { + color: #4384D9; +} +body .ui-tabmenu .ui-tabmenu-nav > .ui-tabmenuitem.ui-state-active a .ui-icon { + color: #4384D9; +} +body .ui-panelmenu .ui-panelmenu-header { + background-color: #4384D9; + margin-bottom: 1px; +} +body .ui-panelmenu .ui-panelmenu-header a { + padding: 6px 10px 6px 36px; + color: #ffffff; + font-size: 14px; +} +body .ui-panelmenu .ui-panelmenu-header .ui-icon { + color: #ffffff; + margin-top: -10px; + font-size: 18px; + height: auto; +} +body .ui-panelmenu .ui-panelmenu-header.ui-state-active { + background-color: #1B4159; + -moz-border-radius-bottomleft: 0; + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-bottomright: 0; + -webkit-border-bottom-right-radius: 0; + border-bottom-right-radius: 0; +} +body .ui-panelmenu .ui-panelmenu-header.ui-state-active a, body .ui-panelmenu .ui-panelmenu-header.ui-state-active .ui-icon { + color: #ffffff; +} +body .ui-panelmenu .ui-panelmenu-content { + padding: 0; +} +body .ui-panelmenu .ui-panelmenu-content .ui-menuitem { + margin: 0; +} +body .ui-panelmenu .ui-panelmenu-content .ui-menuitem .ui-menuitem-link { + border: 0 none; + padding: 6px 10px; + width: 100%; + min-height: 30px; + box-sizing: border-box; + color: #212121; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + position: relative; +} +body .ui-panelmenu .ui-panelmenu-content .ui-menuitem .ui-menuitem-link.ui-state-hover { + background-color: #e8e8e8; + color: #000000; +} +body .ui-panelmenu .ui-panelmenu-content .ui-menuitem .ui-menuitem-link .ui-menuitem-text { + display: inline-block; + vertical-align: middle; + float: none; +} +body .ui-panelmenu .ui-panelmenu-content .ui-menuitem .ui-menuitem-link .ui-icon { + position: static; + display: inline-block; + vertical-align: middle; + margin-right: 6px; + font-size: 18px; + height: auto; +} + +body { + /* Messages */ + /* Info */ + /* Error */ + /* Warn */ + /* Fatal */ +} +body .ui-messages > div { + padding: 10px 16px; +} +body .ui-messages ul { + display: inline-block; + margin-left: 0; +} +body .ui-messages .ui-messages-info { + background-color: #2196F3; + border-color: #2196F3; + color: #ffffff; +} +body .ui-messages .ui-messages-info .ui-messages-close:hover { + background-color: #6ab8f7; +} +body .ui-messages .ui-messages-warn { + background-color: #ffc107; + border-color: #ffc107; + color: #000000; +} +body .ui-messages .ui-messages-warn .ui-messages-close:hover { + background-color: #ffd454; +} +body .ui-messages .ui-messages-error { + background-color: #e62a10; + border-color: #e62a10; + color: #ffffff; +} +body .ui-messages .ui-messages-error .ui-messages-close:hover { + background-color: #f36450; +} +body .ui-messages .ui-messages-fatal { + background-color: #212121; + border-color: #212121; + color: #ffffff; +} +body .ui-messages .ui-messages-fatal .ui-messages-close:hover { + background-color: #474747; +} +body .ui-message { + padding: 4px 8px; +} +body .ui-message.ui-message-info { + background-color: #2196F3; + border-color: #2196F3; + color: #ffffff; +} +body .ui-message.ui-message-warn { + background-color: #ffc107; + border-color: #ffc107; + color: #ffffff; +} +body .ui-message.ui-message-error { + background-color: #e62a10; + border-color: #e62a10; + color: #ffffff; +} +body .ui-message.ui-message-fatal { + background-color: #212121; + border-color: #212121; + color: #ffffff; +} +body .ui-message.ui-message-icon-only { + text-align: center; +} +body .ui-message.ui-message-icon-only span { + float: none; + margin-top: -1px; + position: static; +} +body .ui-messages .ui-messages-info-icon, body .ui-message .ui-message-info-icon { + background: none; + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; + font-size: 24px; + color: #fff; +} +body .ui-messages .ui-messages-info-icon:before, body .ui-message .ui-message-info-icon:before { + content: ""; +} +body .ui-message .ui-message-info-icon { + margin-top: -1px; + font-size: 18px; + right: 1px; +} +body .ui-messages .ui-messages-error-icon, body .ui-message .ui-message-error-icon { + background: none; + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; + font-size: 24px; + color: #fff; +} +body .ui-messages .ui-messages-error-icon:before, body .ui-message .ui-message-error-icon:before { + content: ""; +} +body .ui-message .ui-message-error-icon { + margin-top: -1px; + font-size: 18px; + right: 1px; +} +body .ui-messages .ui-messages-warn-icon, body .ui-message .ui-message-warn-icon { + background: none; + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; + font-size: 24px; + color: #212121; +} +body .ui-messages .ui-messages-warn-icon:before, body .ui-message .ui-message-warn-icon:before { + content: ""; +} +body .ui-messages .ui-messages-warn .ui-messages-close { + color: #212121; +} +body .ui-message .ui-message-warn-icon { + margin-top: -1px; + font-size: 18px; + right: 1px; +} +body .ui-messages .ui-messages-fatal-icon, body .ui-message .ui-message-fatal-icon { + background: none; + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; + font-size: 24px; + color: #fff; +} +body .ui-messages .ui-messages-fatal-icon:before, body .ui-message .ui-message-fatal-icon:before { + content: ""; +} +body .ui-message .ui-message-fatal-icon { + margin-top: -1px; + font-size: 18px; +} +body .ui-messages-close { + text-decoration: none; + color: #fff; + width: 20px; + height: 20px; + margin-top: -2px; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; +} +body .md-inputfield .ui-message.ui-message-error { + background-color: transparent; + border: 0 none; + margin: 0px; + color: #e62a10; + font-size: 11px; +} +body .md-inputfield .ui-message.ui-message-error .ui-message-error-icon { + color: #e62a10; + font-size: 13px; +} +body .ui-growl { + top: 90px; +} +body .ui-growl > .ui-growl-item-container { + opacity: 1; +} +body .ui-growl > .ui-growl-item-container.ui-growl-info { + background-color: #2196F3; +} +body .ui-growl > .ui-growl-item-container.ui-growl-warn { + background-color: #ffc107; +} +body .ui-growl > .ui-growl-item-container.ui-growl-error { + background-color: #e62a10; +} +body .ui-growl > .ui-growl-item-container.ui-growl-fatal { + background-color: #212121; +} +body .ui-growl > .ui-growl-item-container.ui-shadow { + -webkit-box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); + -moz-box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); +} +body .ui-growl .ui-growl-item .ui-growl-image { + background: none; + color: #ffffff; + padding: 4px; +} +body .ui-growl .ui-growl-item .ui-growl-image.ui-growl-image-info { + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; + font-size: 36px; +} +body .ui-growl .ui-growl-item .ui-growl-image.ui-growl-image-info:before { + content: ""; +} +body .ui-growl .ui-growl-item .ui-growl-image.ui-growl-image-error { + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; + font-size: 36px; +} +body .ui-growl .ui-growl-item .ui-growl-image.ui-growl-image-error:before { + content: ""; +} +body .ui-growl .ui-growl-item .ui-growl-image.ui-growl-image-warn { + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; + font-size: 36px; +} +body .ui-growl .ui-growl-item .ui-growl-image.ui-growl-image-warn:before { + content: ""; +} +body .ui-growl .ui-growl-item .ui-growl-image.ui-growl-image-fatal { + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; + font-size: 36px; +} +body .ui-growl .ui-growl-item .ui-growl-image.ui-growl-image-fatal:before { + content: ""; +} +body .ui-growl .ui-growl-item .ui-growl-message { + color: #ffffff; +} +body .ui-growl .ui-growl-item .ui-growl-icon-close { + font-family: "Material Icons"; + font-weight: normal; + font-style: normal; + font-size: 24px; + /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + font-feature-settings: "liga"; + font-size: 24px; + color: #ffffff; +} +body .ui-growl .ui-growl-item .ui-growl-icon-close:before { + content: "î—"; +} + +body .jqplot-target { + font-family: "Roboto", "Helvetica Neue", sans-serif; +} +body .ui-progressbar { + height: 16px; + padding: 0; + border-color: #d8d8d8; +} +body .ui-progressbar .ui-progressbar-value { + height: 16px; + padding: 0; +} +body .ui-progressbar .ui-progressbar-label { + color: #1B4159; +} +body .ui-galleria { + padding: 0; +} +body .ui-galleria .ui-galleria-nav-prev { + left: 2px; +} +body .ui-galleria .ui-galleria-nav-next { + right: 2px; +} +body .ui-log .ui-log-header { + padding: 8px 14px; + height: auto; +} +body .ui-log .ui-log-header > .ui-log-button { + line-height: 16px; + position: static; + display: inline-block; + vertical-align: middle; + margin-right: 4px; + border: 1px solid transparent; + padding: 1px 3px; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; +} +body .ui-log .ui-log-header > .ui-log-button.ui-state-hover { + background-color: #81C784; +} +body .ui-tagcloud li { + margin: 4px 0px; +} +body .ui-tagcloud li a { + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +body .ui-tagcloud li a:hover { + background-color: #e8e8e8; + color: #000000; +} +body .timeline-frame .timeline-event { + border-color: #d8d8d8; + background-color: #ffffff; +} +body .timeline-frame .timeline-event.ui-state-active { + background-color: #1B4159; + border-color: #1B4159; + color: #ffffff; +} +body .timeline-frame .timeline-axis { + border-color: #dbdbdb; +} +body .timeline-frame .timeline-navigation { + height: 36px; +} + +body .ui-dialog.ui-shadow { + -webkit-box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); + -moz-box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); +} +body .ui-dialog .ui-dialog-titlebar { + background-color: #ffffff; + color: #212121; + padding: 8px 14px; +} +body .ui-dialog .ui-dialog-titlebar .ui-dialog-title { + font-weight: 700; +} +body .ui-dialog .ui-dialog-titlebar .ui-dialog-titlebar-icon { + padding: 0; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; +} +body .ui-dialog .ui-dialog-titlebar .ui-dialog-titlebar-icon.ui-state-hover, body .ui-dialog .ui-dialog-titlebar .ui-dialog-titlebar-icon.ui-state-focus { + background-color: #e8e8e8; + color: #000000; +} +body .ui-dialog .ui-dialog-titlebar .ui-dialog-titlebar-icon .ui-icon { + color: #757575; +} +body .ui-dialog .ui-dialog-titlebar .ui-dialog-titlebar-icon .ui-icon-extlink:before { + content: "fullscreen"; +} +body .ui-dialog .ui-dialog-titlebar .ui-dialog-titlebar-icon .ui-icon-newwin:before { + content: "fullscreen_exit"; +} +body .ui-dialog .ui-dialog-buttonpane, body .ui-dialog .ui-dialog-footer { + text-align: right; +} +body .ui-dialog .ui-dialog-buttonpane .ui-button, body .ui-dialog .ui-dialog-footer .ui-button { + background-color: #ffffff; + color: #212121; + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; +} +body .ui-dialog .ui-dialog-buttonpane .ui-button .ui-icon, body .ui-dialog .ui-dialog-footer .ui-button .ui-icon { + color: #757575; +} +body .ui-dialog .ui-dialog-buttonpane .ui-button.ui-state-hover, body .ui-dialog .ui-dialog-footer .ui-button.ui-state-hover { + background-color: #e8e8e8; + color: #000000; +} +body .ui-dialog .ui-confirm-dialog-severity { + margin: 0px 12px; +} +body .ui-sidebar .ui-sidebar-close:hover { + padding: 1px; +} +body .ui-sidebar .ui-button { + width: auto; +} +body .ui-lightbox.ui-shadow { + -webkit-box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); + -moz-box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); +} +body .ui-lightbox .ui-lightbox-caption { + padding: 8px 14px; +} +body .ui-lightbox .ui-lightbox-caption .ui-lightbox-caption-text { + margin: 0; +} +body .ui-lightbox .ui-lightbox-caption .ui-lightbox-close { + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; + padding: 0; + margin: 0; + width: 20px; + height: 20px; +} +body .ui-lightbox .ui-lightbox-caption .ui-lightbox-close.ui-state-hover { + background-color: #81C784; + color: #000000; + padding: 0; +} +body .ui-lightbox .ui-lightbox-content-wrapper .ui-lightbox-nav-right, body .ui-lightbox .ui-lightbox-content-wrapper .ui-lightbox-nav-left { + top: 40%; +} +body .ui-lightbox .ui-lightbox-content-wrapper .ui-lightbox-nav-right .ui-icon, body .ui-lightbox .ui-lightbox-content-wrapper .ui-lightbox-nav-left .ui-icon { + -moz-transition: color 0.3s; + -o-transition: color 0.3s; + -webkit-transition: color 0.3s; + transition: color 0.3s; + font-size: 48px; + color: #81C784; +} +body .ui-lightbox .ui-lightbox-content-wrapper .ui-lightbox-nav-right:hover .ui-icon, body .ui-lightbox .ui-lightbox-content-wrapper .ui-lightbox-nav-left:hover .ui-icon { + color: #ffffff; +} +body .ui-lightbox .ui-lightbox-content-wrapper .ui-lightbox-nav-right { + right: 24px; +} +body .ui-overlaypanel.ui-shadow { + -webkit-box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); + -moz-box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); +} +body .ui-overlaypanel .ui-overlaypanel-close { + background-color: #1B4159; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; + padding: 2px 4px; + right: -16px; + top: -16px; + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); +} +body .ui-overlaypanel .ui-overlaypanel-close span { + color: #ffffff; +} +body .ui-overlaypanel .ui-overlaypanel-close span:before { + position: relative; + top: 2px; +} +body .ui-overlaypanel .ui-overlaypanel-close.ui-state-hover { + background-color: #B8860B; +} +body .ui-tooltip { + opacity: 0.9; + filter: alpha(opacity=90); + font-size: 12px; +} +body .ui-tooltip .ui-tooltip-text { + background-color: #323232; + -webkit-box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); + -moz-box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); +} +body .ui-tooltip.ui-tooltip-top .ui-tooltip-arrow { + border-top-color: #323232; +} +body .ui-tooltip.ui-tooltip-bottom .ui-tooltip-arrow { + border-bottom-color: #323232; +} +body .ui-tooltip.ui-tooltip-left .ui-tooltip-arrow { + border-left-color: #323232; +} +body .ui-tooltip.ui-tooltip-right .ui-tooltip-arrow { + border-right-color: #323232; +} +body .ui-state-error, +body .ui-widget.ui-state-error, +body .ui-widget-content .ui-state-error, +body .ui-widget-header .ui-state-error { + border-color: #e62a10; +} + +@media (max-width: 640px) { + body .ui-panelgrid .ui-grid-responsive .ui-grid-row { + border: 0 none; + } + body .ui-steps .ui-steps-item .ui-menuitem-link .ui-steps-title { + display: none; + } + body .ui-picklist.ui-picklist-responsive .ui-picklist-list-wrapper { + margin-bottom: 8px; + } + body .ui-picklist.ui-picklist-responsive .ui-picklist-buttons .ui-button.ui-button-icon-only { + display: inline-block; + margin-right: 4px; + } + body .ui-picklist.ui-picklist-responsive .ui-picklist-buttons .ui-icon-arrow-1-e { + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -o-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); + } + body .ui-picklist.ui-picklist-responsive .ui-picklist-buttons .ui-icon-arrow-1-e:before { + content: ""; + } + body .ui-picklist.ui-picklist-responsive .ui-picklist-buttons .ui-icon-arrowstop-1-e { + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); + } + body .ui-picklist.ui-picklist-responsive .ui-picklist-buttons .ui-icon-arrowstop-1-e:before { + content: "î…"; + } + body .ui-picklist.ui-picklist-responsive .ui-picklist-buttons .ui-icon-arrow-1-w { + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); + } + body .ui-picklist.ui-picklist-responsive .ui-picklist-buttons .ui-icon-arrow-1-w:before { + content: ""; + } + body .ui-picklist.ui-picklist-responsive .ui-picklist-buttons .ui-icon-arrowstop-1-w { + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); + } + body .ui-picklist.ui-picklist-responsive .ui-picklist-buttons .ui-icon-arrowstop-1-w:before { + content: "î„"; + } + body .ui-orderlist.ui-grid-responsive .ui-orderlist-controls { + text-align: center; + width: auto; + margin-bottom: 8px; + } + body .ui-orderlist.ui-grid-responsive .ui-orderlist-controls .ui-button { + margin-right: 4px; + } + body .ui-buttonset > .ui-button { + display: block; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + } + body .ui-buttonset > .ui-button:first-child { + -moz-border-radius-topleft: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-topright: 3px; + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; + } + body .ui-buttonset > .ui-button:last-child { + -moz-border-radius-bottomleft: 3px; + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; + } +} +.ui-icon-carat-2-n-s:before { + content: "î…¤"; +} + +.ui-icon-triangle-1-n:before { + content: ""; +} + +.ui-icon-triangle-1-e:before { + content: ""; +} + +.ui-icon-triangle-1-s:before { + content: ""; +} + +.ui-icon-triangle-1-w:before { + content: ""; +} + +.ui-icon-carat-1-n:before { + content: ""; +} + +.ui-icon-carat-1-e:before { + content: ""; +} + +.ui-icon-carat-1-s:before { + content: ""; +} + +.ui-icon-carat-1-w:before { + content: ""; +} + +.ui-icon-arrow-1-n { + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); +} +.ui-icon-arrow-1-n:before { + content: ""; +} + +.ui-icon-arrowstop-1-n { + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); +} +.ui-icon-arrowstop-1-n:before { + content: "î„"; +} + +.ui-icon-arrow-1-s { + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -o-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.ui-icon-arrow-1-s:before { + content: ""; +} + +.ui-icon-arrowstop-1-s { + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); +} +.ui-icon-arrowstop-1-s:before { + content: "î…"; +} + +.ui-icon-arrow-1-w { + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -o-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.ui-icon-arrow-1-w:before { + content: ""; +} + +.ui-icon-arrowstop-1-w:before { + content: ""; +} + +.ui-icon-arrow-1-e:before { + content: ""; +} + +.ui-icon-arrowstop-1-e:before { + content: ""; +} + +.ui-icon-arrowthick-1-s { + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -o-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.ui-icon-arrowthick-1-s:before { + content: ""; +} + +.ui-icon-arrowthick-1-n { + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); +} +.ui-icon-arrowthick-1-n:before { + content: ""; +} + +.ui-icon-circle-triangle-e:before { + content: ""; +} + +.ui-icon-circle-triangle-w { + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -o-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.ui-icon-circle-triangle-w:before { + content: ""; +} + +.ui-icon-circle-triangle-s { + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -o-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.ui-icon-circle-triangle-s:before { + content: ""; +} + +.ui-icon-radio-off:before { + content: "î ¶"; +} + +.ui-icon-radio-on:before { + content: "î ·"; +} + +.ui-icon-folder-collapsed:before { + content: ""; +} + +.ui-icon-document:before { + content: "î…"; +} + +.ui-icon-video:before { + content: ""; +} + +.ui-icon-music:before { + content: "î…"; +} + +.ui-icon-plus:before { + content: "î……"; +} + +.ui-icon-minus:before { + content: "î…›"; +} + +.ui-icon-plusthick:before { + content: "î……"; +} + +.ui-icon-minusthick:before { + content: "î…›"; +} + +.ui-icon-pencil:before { + content: "î‰"; +} + +.ui-icon-closethick:before { + content: "î—"; +} + +.ui-icon-circle-close:before { + content: "î—‰"; +} + +.ui-icon-gear:before { + content: ""; +} + +.ui-icon-calendar:before { + content: ""; +} + +.ui-icon-trash:before { + content: ""; +} + +.ui-icon-notice:before { + content: "î€"; +} + +.ui-icon-alert:before { + content: ""; +} + +.ui-icon-circle-zoomin:before { + content: ""; +} + +.ui-icon-circle-zoomout:before { + content: ""; +} + +.ui-icon-circle-arrow-e:before { + content: ""; +} + +.ui-icon-circle-arrow-w { + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -o-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.ui-icon-circle-arrow-w:before { + content: ""; +} + +.ui-icon-3d-rotation:before { + content: "î¡"; +} + +.ui-icon-ac-unit:before { + content: ""; +} + +.ui-icon-access-alarm:before { + content: "î†"; +} + +.ui-icon-access-alarms:before { + content: ""; +} + +.ui-icon-access-time:before { + content: ""; +} + +.ui-icon-accessibility:before { + content: "î¡Ž"; +} + +.ui-icon-accessible:before { + content: ""; +} + +.ui-icon-account-balance:before { + content: "î¡"; +} + +.ui-icon-account-balance-wallet:before { + content: "î¡"; +} + +.ui-icon-account-box:before { + content: "î¡‘"; +} + +.ui-icon-account-circle:before { + content: "î¡“"; +} + +.ui-icon-adb:before { + content: ""; +} + +.ui-icon-add:before { + content: "î……"; +} + +.ui-icon-add-a-photo:before { + content: "î¹"; +} + +.ui-icon-add-alarm:before { + content: ""; +} + +.ui-icon-add-alert:before { + content: ""; +} + +.ui-icon-add-box:before { + content: "î…†"; +} + +.ui-icon-add-circle:before { + content: "î…‡"; +} + +.ui-icon-add-circle-outline:before { + content: "î…ˆ"; +} + +.ui-icon-add-location:before { + content: ""; +} + +.ui-icon-add-shopping-cart:before { + content: "î¡”"; +} + +.ui-icon-add-to-photos:before { + content: "îŽ"; +} + +.ui-icon-add-to-queue:before { + content: "îœ"; +} + +.ui-icon-adjust:before { + content: ""; +} + +.ui-icon-airline-seat-flat:before { + content: ""; +} + +.ui-icon-airline-seat-flat-angled:before { + content: ""; +} + +.ui-icon-airline-seat-individual-suite:before { + content: ""; +} + +.ui-icon-airline-seat-legroom-extra:before { + content: ""; +} + +.ui-icon-airline-seat-legroom-normal:before { + content: ""; +} + +.ui-icon-airline-seat-legroom-reduced:before { + content: ""; +} + +.ui-icon-airline-seat-recline-extra:before { + content: ""; +} + +.ui-icon-airline-seat-recline-normal:before { + content: ""; +} + +.ui-icon-airplanemode-active:before { + content: ""; +} + +.ui-icon-airplanemode-inactive:before { + content: ""; +} + +.ui-icon-airplay:before { + content: "î•"; +} + +.ui-icon-airport-shuttle:before { + content: ""; +} + +.ui-icon-alarm:before { + content: "î¡•"; +} + +.ui-icon-alarm-add:before { + content: "î¡–"; +} + +.ui-icon-alarm-off:before { + content: "î¡—"; +} + +.ui-icon-alarm-on:before { + content: ""; +} + +.ui-icon-album:before { + content: ""; +} + +.ui-icon-all-inclusive:before { + content: ""; +} + +.ui-icon-all-out:before { + content: ""; +} + +.ui-icon-android:before { + content: "î¡™"; +} + +.ui-icon-announcement:before { + content: "î¡š"; +} + +.ui-icon-apps:before { + content: "î—ƒ"; +} + +.ui-icon-archive:before { + content: "î…‰"; +} + +.ui-icon-arrow-back:before { + content: "î—„"; +} + +.ui-icon-arrow-downward:before { + content: "î—›"; +} + +.ui-icon-arrow-drop-down:before { + content: "î—…"; +} + +.ui-icon-arrow-drop-down-circle:before { + content: "î—†"; +} + +.ui-icon-arrow-drop-up:before { + content: "î—‡"; +} + +.ui-icon-arrow-forward:before { + content: "î—ˆ"; +} + +.ui-icon-arrow-upward:before { + content: "î—˜"; +} + +.ui-icon-art-track:before { + content: "î "; +} + +.ui-icon-aspect-ratio:before { + content: "î¡›"; +} + +.ui-icon-assessment:before { + content: "î¡œ"; +} + +.ui-icon-assignment:before { + content: "î¡"; +} + +.ui-icon-assignment-ind:before { + content: "î¡ž"; +} + +.ui-icon-assignment-late:before { + content: "î¡Ÿ"; +} + +.ui-icon-assignment-return:before { + content: "î¡ "; +} + +.ui-icon-assignment-returned:before { + content: "î¡¡"; +} + +.ui-icon-assignment-turned-in:before { + content: "î¡¢"; +} + +.ui-icon-assistant:before { + content: ""; +} + +.ui-icon-assistant-photo:before { + content: ""; +} + +.ui-icon-attach-file:before { + content: ""; +} + +.ui-icon-attach-money:before { + content: ""; +} + +.ui-icon-attachment:before { + content: ""; +} + +.ui-icon-audiotrack:before { + content: ""; +} + +.ui-icon-autorenew:before { + content: "î¡£"; +} + +.ui-icon-av-timer:before { + content: ""; +} + +.ui-icon-backspace:before { + content: "î…Š"; +} + +.ui-icon-backup:before { + content: ""; +} + +.ui-icon-battery-alert:before { + content: ""; +} + +.ui-icon-battery-charging-full:before { + content: ""; +} + +.ui-icon-battery-full:before { + content: ""; +} + +.ui-icon-battery-std:before { + content: ""; +} + +.ui-icon-battery-unknown:before { + content: ""; +} + +.ui-icon-beach-access:before { + content: ""; +} + +.ui-icon-beenhere:before { + content: "î”­"; +} + +.ui-icon-block:before { + content: "î…‹"; +} + +.ui-icon-bluetooth:before { + content: ""; +} + +.ui-icon-bluetooth-audio:before { + content: "î˜"; +} + +.ui-icon-bluetooth-connected:before { + content: ""; +} + +.ui-icon-bluetooth-disabled:before { + content: ""; +} + +.ui-icon-bluetooth-searching:before { + content: ""; +} + +.ui-icon-blur-circular:before { + content: ""; +} + +.ui-icon-blur-linear:before { + content: ""; +} + +.ui-icon-blur-off:before { + content: ""; +} + +.ui-icon-blur-on:before { + content: ""; +} + +.ui-icon-book:before { + content: "î¡¥"; +} + +.ui-icon-bookmark:before { + content: ""; +} + +.ui-icon-bookmark-border:before { + content: ""; +} + +.ui-icon-border-all:before { + content: ""; +} + +.ui-icon-border-bottom:before { + content: ""; +} + +.ui-icon-border-clear:before { + content: ""; +} + +.ui-icon-border-color:before { + content: ""; +} + +.ui-icon-border-horizontal:before { + content: ""; +} + +.ui-icon-border-inner:before { + content: ""; +} + +.ui-icon-border-left:before { + content: ""; +} + +.ui-icon-border-outer:before { + content: ""; +} + +.ui-icon-border-right:before { + content: ""; +} + +.ui-icon-border-style:before { + content: ""; +} + +.ui-icon-border-top:before { + content: ""; +} + +.ui-icon-border-vertical:before { + content: ""; +} + +.ui-icon-branding-watermark:before { + content: "î«"; +} + +.ui-icon-brightness-1:before { + content: ""; +} + +.ui-icon-brightness-2:before { + content: ""; +} + +.ui-icon-brightness-3:before { + content: ""; +} + +.ui-icon-brightness-4:before { + content: ""; +} + +.ui-icon-brightness-5:before { + content: ""; +} + +.ui-icon-brightness-6:before { + content: ""; +} + +.ui-icon-brightness-7:before { + content: ""; +} + +.ui-icon-brightness-auto:before { + content: ""; +} + +.ui-icon-brightness-high:before { + content: ""; +} + +.ui-icon-brightness-low:before { + content: ""; +} + +.ui-icon-brightness-medium:before { + content: ""; +} + +.ui-icon-broken-image:before { + content: ""; +} + +.ui-icon-brush:before { + content: ""; +} + +.ui-icon-bubble-chart:before { + content: "î›"; +} + +.ui-icon-bug-report:before { + content: ""; +} + +.ui-icon-build:before { + content: "î¡©"; +} + +.ui-icon-burst-mode:before { + content: "î¼"; +} + +.ui-icon-business:before { + content: ""; +} + +.ui-icon-business-center:before { + content: ""; +} + +.ui-icon-cached:before { + content: ""; +} + +.ui-icon-cake:before { + content: ""; +} + +.ui-icon-call:before { + content: "î‚°"; +} + +.ui-icon-call-end:before { + content: ""; +} + +.ui-icon-call-made:before { + content: ""; +} + +.ui-icon-call-merge:before { + content: ""; +} + +.ui-icon-call-missed:before { + content: "î‚´"; +} + +.ui-icon-call-missed-outgoing:before { + content: ""; +} + +.ui-icon-call-received:before { + content: ""; +} + +.ui-icon-call-split:before { + content: ""; +} + +.ui-icon-call-to-action:before { + content: "î¬"; +} + +.ui-icon-camera:before { + content: ""; +} + +.ui-icon-camera-alt:before { + content: ""; +} + +.ui-icon-camera-enhance:before { + content: ""; +} + +.ui-icon-camera-front:before { + content: ""; +} + +.ui-icon-camera-rear:before { + content: ""; +} + +.ui-icon-camera-roll:before { + content: ""; +} + +.ui-icon-cancel:before { + content: "î—‰"; +} + +.ui-icon-card-giftcard:before { + content: ""; +} + +.ui-icon-card-membership:before { + content: ""; +} + +.ui-icon-card-travel:before { + content: ""; +} + +.ui-icon-casino:before { + content: "î­€"; +} + +.ui-icon-cast:before { + content: ""; +} + +.ui-icon-cast-connected:before { + content: ""; +} + +.ui-icon-center-focus-strong:before { + content: ""; +} + +.ui-icon-center-focus-weak:before { + content: ""; +} + +.ui-icon-change-history:before { + content: "î¡«"; +} + +.ui-icon-chat:before { + content: "î‚·"; +} + +.ui-icon-chat-bubble:before { + content: ""; +} + +.ui-icon-chat-bubble-outline:before { + content: ""; +} + +.ui-icon-check:before { + content: "î—Š"; +} + +.ui-icon-check-box:before { + content: "î ´"; +} + +.ui-icon-check-box-outline-blank:before { + content: "î µ"; +} + +.ui-icon-check-circle:before { + content: ""; +} + +.ui-icon-chevron-left:before { + content: "î—‹"; +} + +.ui-icon-chevron-right:before { + content: "î—Œ"; +} + +.ui-icon-child-care:before { + content: "î­"; +} + +.ui-icon-child-friendly:before { + content: "î­‚"; +} + +.ui-icon-chrome-reader-mode:before { + content: "î¡­"; +} + +.ui-icon-class:before { + content: "î¡®"; +} + +.ui-icon-clear:before { + content: "î…Œ"; +} + +.ui-icon-clear-all:before { + content: ""; +} + +.ui-icon-close:before { + content: "î—"; +} + +.ui-icon-closed-caption:before { + content: ""; +} + +.ui-icon-cloud:before { + content: ""; +} + +.ui-icon-cloud-circle:before { + content: ""; +} + +.ui-icon-cloud-done:before { + content: ""; +} + +.ui-icon-cloud-download:before { + content: "î‹€"; +} + +.ui-icon-cloud-off:before { + content: "î‹"; +} + +.ui-icon-cloud-queue:before { + content: "î‹‚"; +} + +.ui-icon-cloud-upload:before { + content: ""; +} + +.ui-icon-code:before { + content: ""; +} + +.ui-icon-collections:before { + content: ""; +} + +.ui-icon-collections-bookmark:before { + content: "î±"; +} + +.ui-icon-color-lens:before { + content: ""; +} + +.ui-icon-colorize:before { + content: ""; +} + +.ui-icon-comment:before { + content: ""; +} + +.ui-icon-compare:before { + content: ""; +} + +.ui-icon-compare-arrows:before { + content: ""; +} + +.ui-icon-computer:before { + content: ""; +} + +.ui-icon-confirmation-number:before { + content: ""; +} + +.ui-icon-contact-mail:before { + content: "îƒ"; +} + +.ui-icon-contact-phone:before { + content: "îƒ"; +} + +.ui-icon-contacts:before { + content: ""; +} + +.ui-icon-content-copy:before { + content: "î…"; +} + +.ui-icon-content-cut:before { + content: "î…Ž"; +} + +.ui-icon-content-paste:before { + content: "î…"; +} + +.ui-icon-control-point:before { + content: ""; +} + +.ui-icon-control-point-duplicate:before { + content: ""; +} + +.ui-icon-copyright:before { + content: ""; +} + +.ui-icon-create:before { + content: "î…"; +} + +.ui-icon-create-new-folder:before { + content: "î‹Œ"; +} + +.ui-icon-credit-card:before { + content: "î¡°"; +} + +.ui-icon-crop:before { + content: ""; +} + +.ui-icon-crop-16-9:before { + content: ""; +} + +.ui-icon-crop-3-2:before { + content: ""; +} + +.ui-icon-crop-5-4:before { + content: ""; +} + +.ui-icon-crop-7-5:before { + content: "î€"; +} + +.ui-icon-crop-din:before { + content: "î"; +} + +.ui-icon-crop-free:before { + content: "î‚"; +} + +.ui-icon-crop-landscape:before { + content: "îƒ"; +} + +.ui-icon-crop-original:before { + content: "î„"; +} + +.ui-icon-crop-portrait:before { + content: "î…"; +} + +.ui-icon-crop-rotate:before { + content: "î·"; +} + +.ui-icon-crop-square:before { + content: "î†"; +} + +.ui-icon-dashboard:before { + content: ""; +} + +.ui-icon-data-usage:before { + content: ""; +} + +.ui-icon-date-range:before { + content: ""; +} + +.ui-icon-dehaze:before { + content: "î‡"; +} + +.ui-icon-delete:before { + content: ""; +} + +.ui-icon-delete-forever:before { + content: ""; +} + +.ui-icon-delete-sweep:before { + content: "î…¬"; +} + +.ui-icon-description:before { + content: ""; +} + +.ui-icon-desktop-mac:before { + content: ""; +} + +.ui-icon-desktop-windows:before { + content: ""; +} + +.ui-icon-details:before { + content: "îˆ"; +} + +.ui-icon-developer-board:before { + content: "îŒ"; +} + +.ui-icon-developer-mode:before { + content: ""; +} + +.ui-icon-device-hub:before { + content: ""; +} + +.ui-icon-devices:before { + content: ""; +} + +.ui-icon-devices-other:before { + content: ""; +} + +.ui-icon-dialer-sip:before { + content: "î‚»"; +} + +.ui-icon-dialpad:before { + content: ""; +} + +.ui-icon-directions:before { + content: "î”®"; +} + +.ui-icon-directions-bike:before { + content: ""; +} + +.ui-icon-directions-boat:before { + content: ""; +} + +.ui-icon-directions-bus:before { + content: "î”°"; +} + +.ui-icon-directions-car:before { + content: "î”±"; +} + +.ui-icon-directions-railway:before { + content: "î”´"; +} + +.ui-icon-directions-run:before { + content: ""; +} + +.ui-icon-directions-subway:before { + content: ""; +} + +.ui-icon-directions-transit:before { + content: ""; +} + +.ui-icon-directions-walk:before { + content: ""; +} + +.ui-icon-disc-full:before { + content: "î˜"; +} + +.ui-icon-dns:before { + content: ""; +} + +.ui-icon-do-not-disturb:before { + content: ""; +} + +.ui-icon-do-not-disturb-alt:before { + content: ""; +} + +.ui-icon-do-not-disturb-off:before { + content: ""; +} + +.ui-icon-do-not-disturb-on:before { + content: ""; +} + +.ui-icon-dock:before { + content: ""; +} + +.ui-icon-domain:before { + content: ""; +} + +.ui-icon-done:before { + content: ""; +} + +.ui-icon-done-all:before { + content: "î¡·"; +} + +.ui-icon-donut-large:before { + content: ""; +} + +.ui-icon-donut-small:before { + content: ""; +} + +.ui-icon-drafts:before { + content: "î…‘"; +} + +.ui-icon-drag-handle:before { + content: "î‰"; +} + +.ui-icon-drive-eta:before { + content: ""; +} + +.ui-icon-dvr:before { + content: ""; +} + +.ui-icon-edit:before { + content: "î‰"; +} + +.ui-icon-edit-location:before { + content: ""; +} + +.ui-icon-eject:before { + content: ""; +} + +.ui-icon-email:before { + content: ""; +} + +.ui-icon-enhanced-encryption:before { + content: ""; +} + +.ui-icon-equalizer:before { + content: "î€"; +} + +.ui-icon-error:before { + content: ""; +} + +.ui-icon-error-outline:before { + content: "î€"; +} + +.ui-icon-euro-symbol:before { + content: ""; +} + +.ui-icon-ev-station:before { + content: "î•­"; +} + +.ui-icon-event:before { + content: ""; +} + +.ui-icon-event-available:before { + content: ""; +} + +.ui-icon-event-busy:before { + content: ""; +} + +.ui-icon-event-note:before { + content: ""; +} + +.ui-icon-event-seat:before { + content: ""; +} + +.ui-icon-exit-to-app:before { + content: ""; +} + +.ui-icon-expand-less:before { + content: "î—Ž"; +} + +.ui-icon-expand-more:before { + content: "î—"; +} + +.ui-icon-explicit:before { + content: ""; +} + +.ui-icon-explore:before { + content: ""; +} + +.ui-icon-exposure:before { + content: "îŠ"; +} + +.ui-icon-exposure-neg-1:before { + content: "î‹"; +} + +.ui-icon-exposure-neg-2:before { + content: "îŒ"; +} + +.ui-icon-exposure-plus-1:before { + content: "î"; +} + +.ui-icon-exposure-plus-2:before { + content: "îŽ"; +} + +.ui-icon-exposure-zero:before { + content: "î"; +} + +.ui-icon-extension:before { + content: "î¡»"; +} + +.ui-icon-face:before { + content: ""; +} + +.ui-icon-fast-forward:before { + content: ""; +} + +.ui-icon-fast-rewind:before { + content: ""; +} + +.ui-icon-favorite:before { + content: ""; +} + +.ui-icon-favorite-border:before { + content: ""; +} + +.ui-icon-featured-play-list:before { + content: "î­"; +} + +.ui-icon-featured-video:before { + content: "î®"; +} + +.ui-icon-feedback:before { + content: "î¡¿"; +} + +.ui-icon-fiber-dvr:before { + content: "î"; +} + +.ui-icon-fiber-manual-record:before { + content: "î¡"; +} + +.ui-icon-fiber-new:before { + content: "îž"; +} + +.ui-icon-fiber-pin:before { + content: "îª"; +} + +.ui-icon-fiber-smart-record:before { + content: "î¢"; +} + +.ui-icon-file-download:before { + content: "î‹„"; +} + +.ui-icon-file-upload:before { + content: ""; +} + +.ui-icon-filter:before { + content: "î“"; +} + +.ui-icon-filter-1:before { + content: "î"; +} + +.ui-icon-filter-2:before { + content: "î‘"; +} + +.ui-icon-filter-3:before { + content: "î’"; +} + +.ui-icon-filter-4:before { + content: "î”"; +} + +.ui-icon-filter-5:before { + content: "î•"; +} + +.ui-icon-filter-6:before { + content: "î–"; +} + +.ui-icon-filter-7:before { + content: "î—"; +} + +.ui-icon-filter-8:before { + content: "î˜"; +} + +.ui-icon-filter-9:before { + content: "î™"; +} + +.ui-icon-filter-9-plus:before { + content: "îš"; +} + +.ui-icon-filter-b-and-w:before { + content: "î›"; +} + +.ui-icon-filter-center-focus:before { + content: "îœ"; +} + +.ui-icon-filter-drama:before { + content: "î"; +} + +.ui-icon-filter-frames:before { + content: "îž"; +} + +.ui-icon-filter-hdr:before { + content: "îŸ"; +} + +.ui-icon-filter-list:before { + content: "î…’"; +} + +.ui-icon-filter-none:before { + content: "î "; +} + +.ui-icon-filter-tilt-shift:before { + content: "î¢"; +} + +.ui-icon-filter-vintage:before { + content: "î£"; +} + +.ui-icon-find-in-page:before { + content: ""; +} + +.ui-icon-find-replace:before { + content: "î¢"; +} + +.ui-icon-fingerprint:before { + content: "î¤"; +} + +.ui-icon-first-page:before { + content: "î—œ"; +} + +.ui-icon-fitness-center:before { + content: "î­ƒ"; +} + +.ui-icon-flag:before { + content: "î…“"; +} + +.ui-icon-flare:before { + content: "î¤"; +} + +.ui-icon-flash-auto:before { + content: "î¥"; +} + +.ui-icon-flash-off:before { + content: "î¦"; +} + +.ui-icon-flash-on:before { + content: "î§"; +} + +.ui-icon-flight:before { + content: ""; +} + +.ui-icon-flight-land:before { + content: ""; +} + +.ui-icon-flight-takeoff:before { + content: ""; +} + +.ui-icon-flip:before { + content: "î¨"; +} + +.ui-icon-flip-to-back:before { + content: ""; +} + +.ui-icon-flip-to-front:before { + content: ""; +} + +.ui-icon-folder:before { + content: ""; +} + +.ui-icon-folder-open:before { + content: ""; +} + +.ui-icon-folder-shared:before { + content: ""; +} + +.ui-icon-folder-special:before { + content: ""; +} + +.ui-icon-font-download:before { + content: "î…§"; +} + +.ui-icon-format-align-center:before { + content: ""; +} + +.ui-icon-format-align-justify:before { + content: ""; +} + +.ui-icon-format-align-left:before { + content: ""; +} + +.ui-icon-format-align-right:before { + content: ""; +} + +.ui-icon-format-bold:before { + content: ""; +} + +.ui-icon-format-clear:before { + content: ""; +} + +.ui-icon-format-color-fill:before { + content: ""; +} + +.ui-icon-format-color-reset:before { + content: ""; +} + +.ui-icon-format-color-text:before { + content: ""; +} + +.ui-icon-format-indent-decrease:before { + content: ""; +} + +.ui-icon-format-indent-increase:before { + content: ""; +} + +.ui-icon-format-italic:before { + content: ""; +} + +.ui-icon-format-line-spacing:before { + content: ""; +} + +.ui-icon-format-list-bulleted:before { + content: "î‰"; +} + +.ui-icon-format-list-numbered:before { + content: ""; +} + +.ui-icon-format-paint:before { + content: ""; +} + +.ui-icon-format-quote:before { + content: ""; +} + +.ui-icon-format-shapes:before { + content: ""; +} + +.ui-icon-format-size:before { + content: ""; +} + +.ui-icon-format-strikethrough:before { + content: ""; +} + +.ui-icon-format-textdirection-l-to-r:before { + content: ""; +} + +.ui-icon-format-textdirection-r-to-l:before { + content: ""; +} + +.ui-icon-format-underlined:before { + content: ""; +} + +.ui-icon-forum:before { + content: "î‚¿"; +} + +.ui-icon-forward:before { + content: "î…”"; +} + +.ui-icon-forward-10:before { + content: "î–"; +} + +.ui-icon-forward-30:before { + content: "î—"; +} + +.ui-icon-forward-5:before { + content: "î˜"; +} + +.ui-icon-free-breakfast:before { + content: "î­„"; +} + +.ui-icon-fullscreen:before { + content: "î—"; +} + +.ui-icon-fullscreen-exit:before { + content: "î—‘"; +} + +.ui-icon-functions:before { + content: ""; +} + +.ui-icon-g-translate:before { + content: ""; +} + +.ui-icon-gamepad:before { + content: "îŒ"; +} + +.ui-icon-games:before { + content: ""; +} + +.ui-icon-gavel:before { + content: ""; +} + +.ui-icon-gesture:before { + content: "î…•"; +} + +.ui-icon-get-app:before { + content: ""; +} + +.ui-icon-gif:before { + content: ""; +} + +.ui-icon-golf-course:before { + content: "î­…"; +} + +.ui-icon-gps-fixed:before { + content: ""; +} + +.ui-icon-gps-not-fixed:before { + content: ""; +} + +.ui-icon-gps-off:before { + content: ""; +} + +.ui-icon-grade:before { + content: ""; +} + +.ui-icon-gradient:before { + content: "î©"; +} + +.ui-icon-grain:before { + content: "îª"; +} + +.ui-icon-graphic-eq:before { + content: ""; +} + +.ui-icon-grid-off:before { + content: "î«"; +} + +.ui-icon-grid-on:before { + content: "î¬"; +} + +.ui-icon-group:before { + content: ""; +} + +.ui-icon-group-add:before { + content: ""; +} + +.ui-icon-group-work:before { + content: ""; +} + +.ui-icon-hd:before { + content: "î’"; +} + +.ui-icon-hdr-off:before { + content: "î­"; +} + +.ui-icon-hdr-on:before { + content: "î®"; +} + +.ui-icon-hdr-strong:before { + content: "î±"; +} + +.ui-icon-hdr-weak:before { + content: "î²"; +} + +.ui-icon-headset:before { + content: "îŒ"; +} + +.ui-icon-headset-mic:before { + content: ""; +} + +.ui-icon-healing:before { + content: "î³"; +} + +.ui-icon-hearing:before { + content: ""; +} + +.ui-icon-help:before { + content: ""; +} + +.ui-icon-help-outline:before { + content: ""; +} + +.ui-icon-high-quality:before { + content: ""; +} + +.ui-icon-highlight:before { + content: ""; +} + +.ui-icon-highlight-off:before { + content: ""; +} + +.ui-icon-history:before { + content: ""; +} + +.ui-icon-home:before { + content: ""; +} + +.ui-icon-hot-tub:before { + content: "î­†"; +} + +.ui-icon-hotel:before { + content: ""; +} + +.ui-icon-hourglass-empty:before { + content: ""; +} + +.ui-icon-hourglass-full:before { + content: ""; +} + +.ui-icon-http:before { + content: ""; +} + +.ui-icon-https:before { + content: "î¢"; +} + +.ui-icon-image:before { + content: "î´"; +} + +.ui-icon-image-aspect-ratio:before { + content: "îµ"; +} + +.ui-icon-import-contacts:before { + content: ""; +} + +.ui-icon-import-export:before { + content: ""; +} + +.ui-icon-important-devices:before { + content: ""; +} + +.ui-icon-inbox:before { + content: "î…–"; +} + +.ui-icon-indeterminate-check-box:before { + content: ""; +} + +.ui-icon-info:before { + content: ""; +} + +.ui-icon-info-outline:before { + content: "î¢"; +} + +.ui-icon-input:before { + content: "î¢"; +} + +.ui-icon-insert-chart:before { + content: ""; +} + +.ui-icon-insert-comment:before { + content: ""; +} + +.ui-icon-insert-drive-file:before { + content: "î‰"; +} + +.ui-icon-insert-emoticon:before { + content: ""; +} + +.ui-icon-insert-invitation:before { + content: "î‰"; +} + +.ui-icon-insert-link:before { + content: "î‰"; +} + +.ui-icon-insert-photo:before { + content: ""; +} + +.ui-icon-invert-colors:before { + content: ""; +} + +.ui-icon-invert-colors-off:before { + content: ""; +} + +.ui-icon-iso:before { + content: "î¶"; +} + +.ui-icon-keyboard:before { + content: ""; +} + +.ui-icon-keyboard-arrow-down:before { + content: ""; +} + +.ui-icon-keyboard-arrow-left:before { + content: ""; +} + +.ui-icon-keyboard-arrow-right:before { + content: ""; +} + +.ui-icon-keyboard-arrow-up:before { + content: ""; +} + +.ui-icon-keyboard-backspace:before { + content: ""; +} + +.ui-icon-keyboard-capslock:before { + content: ""; +} + +.ui-icon-keyboard-hide:before { + content: ""; +} + +.ui-icon-keyboard-return:before { + content: ""; +} + +.ui-icon-keyboard-tab:before { + content: ""; +} + +.ui-icon-keyboard-voice:before { + content: "îŒ"; +} + +.ui-icon-kitchen:before { + content: "î­‡"; +} + +.ui-icon-label:before { + content: ""; +} + +.ui-icon-label-outline:before { + content: ""; +} + +.ui-icon-landscape:before { + content: "î·"; +} + +.ui-icon-language:before { + content: ""; +} + +.ui-icon-laptop:before { + content: ""; +} + +.ui-icon-laptop-chromebook:before { + content: ""; +} + +.ui-icon-laptop-mac:before { + content: ""; +} + +.ui-icon-laptop-windows:before { + content: ""; +} + +.ui-icon-last-page:before { + content: "î—"; +} + +.ui-icon-launch:before { + content: ""; +} + +.ui-icon-layers:before { + content: "î”»"; +} + +.ui-icon-layers-clear:before { + content: ""; +} + +.ui-icon-leak-add:before { + content: "î¸"; +} + +.ui-icon-leak-remove:before { + content: "î¹"; +} + +.ui-icon-lens:before { + content: "îº"; +} + +.ui-icon-library-add:before { + content: ""; +} + +.ui-icon-library-books:before { + content: ""; +} + +.ui-icon-library-music:before { + content: ""; +} + +.ui-icon-lightbulb-outline:before { + content: "î¤"; +} + +.ui-icon-line-style:before { + content: ""; +} + +.ui-icon-line-weight:before { + content: ""; +} + +.ui-icon-linear-scale:before { + content: ""; +} + +.ui-icon-link:before { + content: "î…—"; +} + +.ui-icon-linked-camera:before { + content: "î¸"; +} + +.ui-icon-list:before { + content: ""; +} + +.ui-icon-live-help:before { + content: ""; +} + +.ui-icon-live-tv:before { + content: ""; +} + +.ui-icon-local-activity:before { + content: ""; +} + +.ui-icon-local-airport:before { + content: ""; +} + +.ui-icon-local-atm:before { + content: ""; +} + +.ui-icon-local-bar:before { + content: "î•€"; +} + +.ui-icon-local-cafe:before { + content: "î•"; +} + +.ui-icon-local-car-wash:before { + content: "î•‚"; +} + +.ui-icon-local-convenience-store:before { + content: ""; +} + +.ui-icon-local-dining:before { + content: "î•–"; +} + +.ui-icon-local-drink:before { + content: "î•„"; +} + +.ui-icon-local-florist:before { + content: "î•…"; +} + +.ui-icon-local-gas-station:before { + content: ""; +} + +.ui-icon-local-grocery-store:before { + content: ""; +} + +.ui-icon-local-hospital:before { + content: ""; +} + +.ui-icon-local-hotel:before { + content: ""; +} + +.ui-icon-local-laundry-service:before { + content: "î•Š"; +} + +.ui-icon-local-library:before { + content: "î•‹"; +} + +.ui-icon-local-mall:before { + content: "î•Œ"; +} + +.ui-icon-local-movies:before { + content: "î•"; +} + +.ui-icon-local-offer:before { + content: "î•Ž"; +} + +.ui-icon-local-parking:before { + content: "î•"; +} + +.ui-icon-local-pharmacy:before { + content: "î•"; +} + +.ui-icon-local-phone:before { + content: "î•‘"; +} + +.ui-icon-local-pizza:before { + content: "î•’"; +} + +.ui-icon-local-play:before { + content: "î•“"; +} + +.ui-icon-local-post-office:before { + content: "î•”"; +} + +.ui-icon-local-printshop:before { + content: "î••"; +} + +.ui-icon-local-see:before { + content: "î•—"; +} + +.ui-icon-local-shipping:before { + content: ""; +} + +.ui-icon-local-taxi:before { + content: "î•™"; +} + +.ui-icon-location-city:before { + content: ""; +} + +.ui-icon-location-disabled:before { + content: ""; +} + +.ui-icon-location-off:before { + content: ""; +} + +.ui-icon-location-on:before { + content: ""; +} + +.ui-icon-location-searching:before { + content: ""; +} + +.ui-icon-lock:before { + content: ""; +} + +.ui-icon-lock-open:before { + content: ""; +} + +.ui-icon-lock-outline:before { + content: ""; +} + +.ui-icon-looks:before { + content: "î¼"; +} + +.ui-icon-looks-3:before { + content: "î»"; +} + +.ui-icon-looks-4:before { + content: "î½"; +} + +.ui-icon-looks-5:before { + content: "î¾"; +} + +.ui-icon-looks-6:before { + content: "î¿"; +} + +.ui-icon-looks-one:before { + content: "î€"; +} + +.ui-icon-looks-two:before { + content: "î"; +} + +.ui-icon-loop:before { + content: ""; +} + +.ui-icon-loupe:before { + content: "î‚"; +} + +.ui-icon-low-priority:before { + content: "î…­"; +} + +.ui-icon-loyalty:before { + content: ""; +} + +.ui-icon-mail:before { + content: "î…˜"; +} + +.ui-icon-mail-outline:before { + content: ""; +} + +.ui-icon-map:before { + content: "î•›"; +} + +.ui-icon-markunread:before { + content: "î…™"; +} + +.ui-icon-markunread-mailbox:before { + content: ""; +} + +.ui-icon-memory:before { + content: ""; +} + +.ui-icon-menu:before { + content: "î—’"; +} + +.ui-icon-merge-type:before { + content: ""; +} + +.ui-icon-message:before { + content: ""; +} + +.ui-icon-mic:before { + content: ""; +} + +.ui-icon-mic-none:before { + content: ""; +} + +.ui-icon-mic-off:before { + content: ""; +} + +.ui-icon-mms:before { + content: ""; +} + +.ui-icon-mode-comment:before { + content: ""; +} + +.ui-icon-mode-edit:before { + content: ""; +} + +.ui-icon-monetization-on:before { + content: ""; +} + +.ui-icon-money-off:before { + content: ""; +} + +.ui-icon-monochrome-photos:before { + content: "îƒ"; +} + +.ui-icon-mood:before { + content: ""; +} + +.ui-icon-mood-bad:before { + content: ""; +} + +.ui-icon-more:before { + content: ""; +} + +.ui-icon-more-horiz:before { + content: "î—“"; +} + +.ui-icon-more-vert:before { + content: "î—”"; +} + +.ui-icon-motorcycle:before { + content: ""; +} + +.ui-icon-mouse:before { + content: ""; +} + +.ui-icon-move-to-inbox:before { + content: "î…¨"; +} + +.ui-icon-movie:before { + content: ""; +} + +.ui-icon-movie-creation:before { + content: "î„"; +} + +.ui-icon-movie-filter:before { + content: "îº"; +} + +.ui-icon-multiline-chart:before { + content: ""; +} + +.ui-icon-music-note:before { + content: "î…"; +} + +.ui-icon-music-video:before { + content: "î£"; +} + +.ui-icon-my-location:before { + content: "î•œ"; +} + +.ui-icon-nature:before { + content: "î†"; +} + +.ui-icon-nature-people:before { + content: "î‡"; +} + +.ui-icon-navigate-before:before { + content: "îˆ"; +} + +.ui-icon-navigate-next:before { + content: "î‰"; +} + +.ui-icon-navigation:before { + content: "î•"; +} + +.ui-icon-near-me:before { + content: "î•©"; +} + +.ui-icon-network-cell:before { + content: ""; +} + +.ui-icon-network-check:before { + content: ""; +} + +.ui-icon-network-locked:before { + content: ""; +} + +.ui-icon-network-wifi:before { + content: ""; +} + +.ui-icon-new-releases:before { + content: ""; +} + +.ui-icon-next-week:before { + content: "î…ª"; +} + +.ui-icon-nfc:before { + content: ""; +} + +.ui-icon-no-encryption:before { + content: "î™"; +} + +.ui-icon-no-sim:before { + content: ""; +} + +.ui-icon-not-interested:before { + content: ""; +} + +.ui-icon-note:before { + content: "î¯"; +} + +.ui-icon-note-add:before { + content: ""; +} + +.ui-icon-notifications:before { + content: ""; +} + +.ui-icon-notifications-active:before { + content: ""; +} + +.ui-icon-notifications-none:before { + content: ""; +} + +.ui-icon-notifications-off:before { + content: ""; +} + +.ui-icon-notifications-paused:before { + content: ""; +} + +.ui-icon-offline-pin:before { + content: ""; +} + +.ui-icon-ondemand-video:before { + content: ""; +} + +.ui-icon-opacity:before { + content: ""; +} + +.ui-icon-open-in-browser:before { + content: "î¢"; +} + +.ui-icon-open-in-new:before { + content: ""; +} + +.ui-icon-open-with:before { + content: ""; +} + +.ui-icon-pages:before { + content: ""; +} + +.ui-icon-pageview:before { + content: ""; +} + +.ui-icon-palette:before { + content: "îŠ"; +} + +.ui-icon-pan-tool:before { + content: ""; +} + +.ui-icon-panorama:before { + content: "î‹"; +} + +.ui-icon-panorama-fish-eye:before { + content: "îŒ"; +} + +.ui-icon-panorama-horizontal:before { + content: "î"; +} + +.ui-icon-panorama-vertical:before { + content: "îŽ"; +} + +.ui-icon-panorama-wide-angle:before { + content: "î"; +} + +.ui-icon-party-mode:before { + content: ""; +} + +.ui-icon-pause:before { + content: ""; +} + +.ui-icon-pause-circle-filled:before { + content: ""; +} + +.ui-icon-pause-circle-outline:before { + content: ""; +} + +.ui-icon-payment:before { + content: ""; +} + +.ui-icon-people:before { + content: ""; +} + +.ui-icon-people-outline:before { + content: ""; +} + +.ui-icon-perm-camera-mic:before { + content: ""; +} + +.ui-icon-perm-contact-calendar:before { + content: ""; +} + +.ui-icon-perm-data-setting:before { + content: ""; +} + +.ui-icon-perm-device-information:before { + content: ""; +} + +.ui-icon-perm-identity:before { + content: ""; +} + +.ui-icon-perm-media:before { + content: ""; +} + +.ui-icon-perm-phone-msg:before { + content: ""; +} + +.ui-icon-perm-scan-wifi:before { + content: ""; +} + +.ui-icon-person:before { + content: ""; +} + +.ui-icon-person-add:before { + content: ""; +} + +.ui-icon-person-outline:before { + content: ""; +} + +.ui-icon-person-pin:before { + content: "î•š"; +} + +.ui-icon-person-pin-circle:before { + content: ""; +} + +.ui-icon-personal-video:before { + content: ""; +} + +.ui-icon-pets:before { + content: "î¤"; +} + +.ui-icon-phone:before { + content: "îƒ"; +} + +.ui-icon-phone-android:before { + content: ""; +} + +.ui-icon-phone-bluetooth-speaker:before { + content: ""; +} + +.ui-icon-phone-forwarded:before { + content: ""; +} + +.ui-icon-phone-in-talk:before { + content: "î˜"; +} + +.ui-icon-phone-iphone:before { + content: ""; +} + +.ui-icon-phone-locked:before { + content: ""; +} + +.ui-icon-phone-missed:before { + content: ""; +} + +.ui-icon-phone-paused:before { + content: ""; +} + +.ui-icon-phonelink:before { + content: ""; +} + +.ui-icon-phonelink-erase:before { + content: ""; +} + +.ui-icon-phonelink-lock:before { + content: ""; +} + +.ui-icon-phonelink-off:before { + content: ""; +} + +.ui-icon-phonelink-ring:before { + content: "îƒ"; +} + +.ui-icon-phonelink-setup:before { + content: ""; +} + +.ui-icon-photo:before { + content: "î"; +} + +.ui-icon-photo-album:before { + content: "î‘"; +} + +.ui-icon-photo-camera:before { + content: "î’"; +} + +.ui-icon-photo-filter:before { + content: "î»"; +} + +.ui-icon-photo-library:before { + content: "î“"; +} + +.ui-icon-photo-size-select-actual:before { + content: "î²"; +} + +.ui-icon-photo-size-select-large:before { + content: "î³"; +} + +.ui-icon-photo-size-select-small:before { + content: "î´"; +} + +.ui-icon-picture-as-pdf:before { + content: "î•"; +} + +.ui-icon-picture-in-picture:before { + content: ""; +} + +.ui-icon-picture-in-picture-alt:before { + content: ""; +} + +.ui-icon-pie-chart:before { + content: ""; +} + +.ui-icon-pie-chart-outlined:before { + content: "î›…"; +} + +.ui-icon-pin-drop:before { + content: "î•ž"; +} + +.ui-icon-place:before { + content: "î•Ÿ"; +} + +.ui-icon-play-arrow:before { + content: ""; +} + +.ui-icon-play-circle-filled:before { + content: ""; +} + +.ui-icon-play-circle-outline:before { + content: ""; +} + +.ui-icon-play-for-work:before { + content: ""; +} + +.ui-icon-playlist-add:before { + content: ""; +} + +.ui-icon-playlist-add-check:before { + content: "î¥"; +} + +.ui-icon-playlist-play:before { + content: "îŸ"; +} + +.ui-icon-plus-one:before { + content: "î €"; +} + +.ui-icon-poll:before { + content: "î "; +} + +.ui-icon-polymer:before { + content: ""; +} + +.ui-icon-pool:before { + content: "î­ˆ"; +} + +.ui-icon-portable-wifi-off:before { + content: ""; +} + +.ui-icon-portrait:before { + content: "î–"; +} + +.ui-icon-power:before { + content: ""; +} + +.ui-icon-power-input:before { + content: ""; +} + +.ui-icon-power-settings-new:before { + content: ""; +} + +.ui-icon-pregnant-woman:before { + content: ""; +} + +.ui-icon-present-to-all:before { + content: ""; +} + +.ui-icon-print:before { + content: ""; +} + +.ui-icon-priority-high:before { + content: "î™…"; +} + +.ui-icon-public:before { + content: "î ‹"; +} + +.ui-icon-publish:before { + content: ""; +} + +.ui-icon-query-builder:before { + content: ""; +} + +.ui-icon-question-answer:before { + content: ""; +} + +.ui-icon-queue:before { + content: ""; +} + +.ui-icon-queue-music:before { + content: ""; +} + +.ui-icon-queue-play-next:before { + content: "î¦"; +} + +.ui-icon-radio:before { + content: ""; +} + +.ui-icon-radio-button-checked:before { + content: "î ·"; +} + +.ui-icon-radio-button-unchecked:before { + content: "î ¶"; +} + +.ui-icon-rate-review:before { + content: "î• "; +} + +.ui-icon-receipt:before { + content: ""; +} + +.ui-icon-recent-actors:before { + content: ""; +} + +.ui-icon-record-voice-over:before { + content: ""; +} + +.ui-icon-redeem:before { + content: ""; +} + +.ui-icon-redo:before { + content: "î…š"; +} + +.ui-icon-refresh:before { + content: "î—•"; +} + +.ui-icon-remove:before { + content: "î…›"; +} + +.ui-icon-remove-circle:before { + content: "î…œ"; +} + +.ui-icon-remove-circle-outline:before { + content: "î…"; +} + +.ui-icon-remove-from-queue:before { + content: "î§"; +} + +.ui-icon-remove-red-eye:before { + content: "î—"; +} + +.ui-icon-remove-shopping-cart:before { + content: ""; +} + +.ui-icon-reorder:before { + content: ""; +} + +.ui-icon-repeat:before { + content: "î€"; +} + +.ui-icon-repeat-one:before { + content: "î"; +} + +.ui-icon-replay:before { + content: "î‚"; +} + +.ui-icon-replay-10:before { + content: "î™"; +} + +.ui-icon-replay-30:before { + content: "îš"; +} + +.ui-icon-replay-5:before { + content: "î›"; +} + +.ui-icon-reply:before { + content: "î…ž"; +} + +.ui-icon-reply-all:before { + content: "î…Ÿ"; +} + +.ui-icon-report:before { + content: "î… "; +} + +.ui-icon-report-problem:before { + content: ""; +} + +.ui-icon-restaurant:before { + content: ""; +} + +.ui-icon-restaurant-menu:before { + content: "î•¡"; +} + +.ui-icon-restore:before { + content: ""; +} + +.ui-icon-restore-page:before { + content: ""; +} + +.ui-icon-ring-volume:before { + content: ""; +} + +.ui-icon-room:before { + content: ""; +} + +.ui-icon-room-service:before { + content: "î­‰"; +} + +.ui-icon-rotate-90-degrees-ccw:before { + content: "î˜"; +} + +.ui-icon-rotate-left:before { + content: "î™"; +} + +.ui-icon-rotate-right:before { + content: "îš"; +} + +.ui-icon-rounded-corner:before { + content: ""; +} + +.ui-icon-router:before { + content: ""; +} + +.ui-icon-rowing:before { + content: ""; +} + +.ui-icon-rss-feed:before { + content: ""; +} + +.ui-icon-rv-hookup:before { + content: ""; +} + +.ui-icon-satellite:before { + content: "î•¢"; +} + +.ui-icon-save:before { + content: "î…¡"; +} + +.ui-icon-scanner:before { + content: ""; +} + +.ui-icon-schedule:before { + content: ""; +} + +.ui-icon-school:before { + content: "î Œ"; +} + +.ui-icon-screen-lock-landscape:before { + content: ""; +} + +.ui-icon-screen-lock-portrait:before { + content: ""; +} + +.ui-icon-screen-lock-rotation:before { + content: ""; +} + +.ui-icon-screen-rotation:before { + content: "î‡"; +} + +.ui-icon-screen-share:before { + content: ""; +} + +.ui-icon-sd-card:before { + content: ""; +} + +.ui-icon-sd-storage:before { + content: ""; +} + +.ui-icon-search:before { + content: ""; +} + +.ui-icon-security:before { + content: ""; +} + +.ui-icon-select-all:before { + content: "î…¢"; +} + +.ui-icon-send:before { + content: "î…£"; +} + +.ui-icon-sentiment-dissatisfied:before { + content: "î ‘"; +} + +.ui-icon-sentiment-neutral:before { + content: "î ’"; +} + +.ui-icon-sentiment-satisfied:before { + content: "î “"; +} + +.ui-icon-sentiment-very-dissatisfied:before { + content: "î ”"; +} + +.ui-icon-sentiment-very-satisfied:before { + content: "î •"; +} + +.ui-icon-settings:before { + content: ""; +} + +.ui-icon-settings-applications:before { + content: ""; +} + +.ui-icon-settings-backup-restore:before { + content: ""; +} + +.ui-icon-settings-bluetooth:before { + content: ""; +} + +.ui-icon-settings-brightness:before { + content: ""; +} + +.ui-icon-settings-cell:before { + content: ""; +} + +.ui-icon-settings-ethernet:before { + content: ""; +} + +.ui-icon-settings-input-antenna:before { + content: ""; +} + +.ui-icon-settings-input-component:before { + content: ""; +} + +.ui-icon-settings-input-composite:before { + content: "î£"; +} + +.ui-icon-settings-input-hdmi:before { + content: ""; +} + +.ui-icon-settings-input-svideo:before { + content: ""; +} + +.ui-icon-settings-overscan:before { + content: ""; +} + +.ui-icon-settings-phone:before { + content: ""; +} + +.ui-icon-settings-power:before { + content: ""; +} + +.ui-icon-settings-remote:before { + content: ""; +} + +.ui-icon-settings-system-daydream:before { + content: ""; +} + +.ui-icon-settings-voice:before { + content: ""; +} + +.ui-icon-share:before { + content: "î "; +} + +.ui-icon-shop:before { + content: ""; +} + +.ui-icon-shop-two:before { + content: ""; +} + +.ui-icon-shopping-basket:before { + content: ""; +} + +.ui-icon-shopping-cart:before { + content: ""; +} + +.ui-icon-short-text:before { + content: ""; +} + +.ui-icon-show-chart:before { + content: ""; +} + +.ui-icon-shuffle:before { + content: "îƒ"; +} + +.ui-icon-signal-cellular-4-bar:before { + content: ""; +} + +.ui-icon-signal-cellular-connected-no-internet-4-bar:before { + content: "î‡"; +} + +.ui-icon-signal-cellular-no-sim:before { + content: ""; +} + +.ui-icon-signal-cellular-null:before { + content: "î‡"; +} + +.ui-icon-signal-cellular-off:before { + content: "î‡"; +} + +.ui-icon-signal-wifi-4-bar:before { + content: ""; +} + +.ui-icon-signal-wifi-4-bar-lock:before { + content: ""; +} + +.ui-icon-signal-wifi-off:before { + content: ""; +} + +.ui-icon-sim-card:before { + content: ""; +} + +.ui-icon-sim-card-alert:before { + content: ""; +} + +.ui-icon-skip-next:before { + content: "î„"; +} + +.ui-icon-skip-previous:before { + content: "î…"; +} + +.ui-icon-slideshow:before { + content: "î›"; +} + +.ui-icon-slow-motion-video:before { + content: "î¨"; +} + +.ui-icon-smartphone:before { + content: ""; +} + +.ui-icon-smoke-free:before { + content: "î­Š"; +} + +.ui-icon-smoking-rooms:before { + content: "î­‹"; +} + +.ui-icon-sms:before { + content: ""; +} + +.ui-icon-sms-failed:before { + content: ""; +} + +.ui-icon-snooze:before { + content: "î†"; +} + +.ui-icon-sort:before { + content: "î…¤"; +} + +.ui-icon-sort-by-alpha:before { + content: "î“"; +} + +.ui-icon-spa:before { + content: "î­Œ"; +} + +.ui-icon-space-bar:before { + content: ""; +} + +.ui-icon-speaker:before { + content: ""; +} + +.ui-icon-speaker-group:before { + content: ""; +} + +.ui-icon-speaker-notes:before { + content: "î£"; +} + +.ui-icon-speaker-notes-off:before { + content: ""; +} + +.ui-icon-speaker-phone:before { + content: ""; +} + +.ui-icon-spellcheck:before { + content: ""; +} + +.ui-icon-star:before { + content: "î ¸"; +} + +.ui-icon-star-border:before { + content: "î º"; +} + +.ui-icon-star-half:before { + content: "î ¹"; +} + +.ui-icon-stars:before { + content: "î£"; +} + +.ui-icon-stay-current-landscape:before { + content: ""; +} + +.ui-icon-stay-current-portrait:before { + content: ""; +} + +.ui-icon-stay-primary-landscape:before { + content: ""; +} + +.ui-icon-stay-primary-portrait:before { + content: ""; +} + +.ui-icon-stop:before { + content: "î‡"; +} + +.ui-icon-stop-screen-share:before { + content: ""; +} + +.ui-icon-storage:before { + content: ""; +} + +.ui-icon-store:before { + content: ""; +} + +.ui-icon-store-mall-directory:before { + content: "î•£"; +} + +.ui-icon-straighten:before { + content: "îœ"; +} + +.ui-icon-streetview:before { + content: "î•®"; +} + +.ui-icon-strikethrough-s:before { + content: ""; +} + +.ui-icon-style:before { + content: "î"; +} + +.ui-icon-subdirectory-arrow-left:before { + content: "î—™"; +} + +.ui-icon-subdirectory-arrow-right:before { + content: "î—š"; +} + +.ui-icon-subject:before { + content: ""; +} + +.ui-icon-subscriptions:before { + content: "î¤"; +} + +.ui-icon-subtitles:before { + content: "îˆ"; +} + +.ui-icon-subway:before { + content: ""; +} + +.ui-icon-supervisor-account:before { + content: ""; +} + +.ui-icon-surround-sound:before { + content: "î‰"; +} + +.ui-icon-swap-calls:before { + content: ""; +} + +.ui-icon-swap-horiz:before { + content: ""; +} + +.ui-icon-swap-vert:before { + content: ""; +} + +.ui-icon-swap-vertical-circle:before { + content: ""; +} + +.ui-icon-switch-camera:before { + content: "îž"; +} + +.ui-icon-switch-video:before { + content: "îŸ"; +} + +.ui-icon-sync:before { + content: ""; +} + +.ui-icon-sync-disabled:before { + content: ""; +} + +.ui-icon-sync-problem:before { + content: ""; +} + +.ui-icon-system-update:before { + content: ""; +} + +.ui-icon-system-update-alt:before { + content: ""; +} + +.ui-icon-tab:before { + content: ""; +} + +.ui-icon-tab-unselected:before { + content: ""; +} + +.ui-icon-tablet:before { + content: ""; +} + +.ui-icon-tablet-android:before { + content: ""; +} + +.ui-icon-tablet-mac:before { + content: ""; +} + +.ui-icon-tag-faces:before { + content: "î "; +} + +.ui-icon-tap-and-play:before { + content: ""; +} + +.ui-icon-terrain:before { + content: ""; +} + +.ui-icon-text-fields:before { + content: ""; +} + +.ui-icon-text-format:before { + content: "î…¥"; +} + +.ui-icon-textsms:before { + content: ""; +} + +.ui-icon-texture:before { + content: "î¡"; +} + +.ui-icon-theaters:before { + content: ""; +} + +.ui-icon-thumb-down:before { + content: ""; +} + +.ui-icon-thumb-up:before { + content: ""; +} + +.ui-icon-thumbs-up-down:before { + content: "î£"; +} + +.ui-icon-time-to-leave:before { + content: ""; +} + +.ui-icon-timelapse:before { + content: "î¢"; +} + +.ui-icon-timeline:before { + content: ""; +} + +.ui-icon-timer:before { + content: "î¥"; +} + +.ui-icon-timer-10:before { + content: "î£"; +} + +.ui-icon-timer-3:before { + content: "î¤"; +} + +.ui-icon-timer-off:before { + content: "î¦"; +} + +.ui-icon-title:before { + content: ""; +} + +.ui-icon-toc:before { + content: ""; +} + +.ui-icon-today:before { + content: ""; +} + +.ui-icon-toll:before { + content: ""; +} + +.ui-icon-tonality:before { + content: "î§"; +} + +.ui-icon-touch-app:before { + content: ""; +} + +.ui-icon-toys:before { + content: ""; +} + +.ui-icon-track-changes:before { + content: ""; +} + +.ui-icon-traffic:before { + content: "î•¥"; +} + +.ui-icon-train:before { + content: "î•°"; +} + +.ui-icon-tram:before { + content: ""; +} + +.ui-icon-transfer-within-a-station:before { + content: ""; +} + +.ui-icon-transform:before { + content: "î¨"; +} + +.ui-icon-translate:before { + content: ""; +} + +.ui-icon-trending-down:before { + content: ""; +} + +.ui-icon-trending-flat:before { + content: ""; +} + +.ui-icon-trending-up:before { + content: ""; +} + +.ui-icon-tune:before { + content: "î©"; +} + +.ui-icon-turned-in:before { + content: ""; +} + +.ui-icon-turned-in-not:before { + content: ""; +} + +.ui-icon-tv:before { + content: ""; +} + +.ui-icon-unarchive:before { + content: "î…©"; +} + +.ui-icon-undo:before { + content: "î…¦"; +} + +.ui-icon-unfold-less:before { + content: "î—–"; +} + +.ui-icon-unfold-more:before { + content: "î——"; +} + +.ui-icon-update:before { + content: ""; +} + +.ui-icon-usb:before { + content: ""; +} + +.ui-icon-verified-user:before { + content: ""; +} + +.ui-icon-vertical-align-bottom:before { + content: ""; +} + +.ui-icon-vertical-align-center:before { + content: ""; +} + +.ui-icon-vertical-align-top:before { + content: ""; +} + +.ui-icon-vibration:before { + content: ""; +} + +.ui-icon-video-call:before { + content: "î°"; +} + +.ui-icon-video-label:before { + content: "î±"; +} + +.ui-icon-video-library:before { + content: "îŠ"; +} + +.ui-icon-videocam:before { + content: "î‹"; +} + +.ui-icon-videocam-off:before { + content: "îŒ"; +} + +.ui-icon-videogame-asset:before { + content: ""; +} + +.ui-icon-view-agenda:before { + content: ""; +} + +.ui-icon-view-array:before { + content: ""; +} + +.ui-icon-view-carousel:before { + content: ""; +} + +.ui-icon-view-column:before { + content: ""; +} + +.ui-icon-view-comfy:before { + content: "îª"; +} + +.ui-icon-view-compact:before { + content: "î«"; +} + +.ui-icon-view-day:before { + content: ""; +} + +.ui-icon-view-headline:before { + content: ""; +} + +.ui-icon-view-list:before { + content: ""; +} + +.ui-icon-view-module:before { + content: ""; +} + +.ui-icon-view-quilt:before { + content: ""; +} + +.ui-icon-view-stream:before { + content: ""; +} + +.ui-icon-view-week:before { + content: ""; +} + +.ui-icon-vignette:before { + content: "îµ"; +} + +.ui-icon-visibility:before { + content: ""; +} + +.ui-icon-visibility-off:before { + content: ""; +} + +.ui-icon-voice-chat:before { + content: ""; +} + +.ui-icon-voicemail:before { + content: ""; +} + +.ui-icon-volume-down:before { + content: "î"; +} + +.ui-icon-volume-mute:before { + content: "îŽ"; +} + +.ui-icon-volume-off:before { + content: "î"; +} + +.ui-icon-volume-up:before { + content: "î"; +} + +.ui-icon-vpn-key:before { + content: ""; +} + +.ui-icon-vpn-lock:before { + content: ""; +} + +.ui-icon-wallpaper:before { + content: ""; +} + +.ui-icon-warning:before { + content: ""; +} + +.ui-icon-watch:before { + content: ""; +} + +.ui-icon-watch-later:before { + content: ""; +} + +.ui-icon-wb-auto:before { + content: "î¬"; +} + +.ui-icon-wb-cloudy:before { + content: "î­"; +} + +.ui-icon-wb-incandescent:before { + content: "î®"; +} + +.ui-icon-wb-iridescent:before { + content: "î¶"; +} + +.ui-icon-wb-sunny:before { + content: "î°"; +} + +.ui-icon-wc:before { + content: ""; +} + +.ui-icon-web:before { + content: "î‘"; +} + +.ui-icon-web-asset:before { + content: "î©"; +} + +.ui-icon-weekend:before { + content: "î…«"; +} + +.ui-icon-whatshot:before { + content: "î Ž"; +} + +.ui-icon-widgets:before { + content: ""; +} + +.ui-icon-wifi:before { + content: ""; +} + +.ui-icon-wifi-lock:before { + content: ""; +} + +.ui-icon-wifi-tethering:before { + content: ""; +} + +.ui-icon-work:before { + content: ""; +} + +.ui-icon-wrap-text:before { + content: ""; +} + +.ui-icon-youtube-searched-for:before { + content: ""; +} + +.ui-icon-zoom-in:before { + content: ""; +} + +.ui-icon-zoom-out:before { + content: ""; +} + +.ui-icon-zoom-out-map:before { + content: "î•«"; +} + +/* Add your customizations of theme here */ diff --git a/apc-web/src/main/webapp/resources/primefaces-serenity-green/theme.scss b/apc-web/src/main/webapp/resources/primefaces-serenity-green/theme.scss new file mode 100644 index 0000000..eb1744d --- /dev/null +++ b/apc-web/src/main/webapp/resources/primefaces-serenity-green/theme.scss @@ -0,0 +1,11 @@ +$primaryColor:#4384D9; +$primaryDarkColor:#3767A6; +$primaryLightColor:#81C784; +$primaryLightestColor:#E8F5E9; +$primaryTextColor:#ffffff; +$accentColor:#1B4159; +$accentDarkColor: #B8860B; +$accentLightColor: #A1887F; +$accentTextColor: #ffffff; + +@import '../sass/theme/_theme'; diff --git a/apc-web/src/main/webapp/resources/sass/_fonts.scss b/apc-web/src/main/webapp/resources/sass/_fonts.scss new file mode 100644 index 0000000..01221e2 --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/_fonts.scss @@ -0,0 +1,51 @@ +/* roboto-300 - latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: url("\#{resource['serenity-layout:fonts/roboto-v15-latin-300.eot']}"); /* IE9 Compat Modes */ + src: local('Roboto Light'), local('Roboto-Light'), + url("\#{resource['serenity-layout:fonts/roboto-v15-latin-300.eot']}#iefix") format('embedded-opentype'), /* IE6-IE8 */ + url("\#{resource['serenity-layout:fonts/roboto-v15-latin-300.woff2']}") format('woff2'), /* Super Modern Browsers */ + url("\#{resource['serenity-layout:fonts/roboto-v15-latin-300.woff']}") format('woff'), /* Modern Browsers */ + url("\#{resource['serenity-layout:fonts/roboto-v15-latin-300.ttf']}") format('truetype'), /* Safari, Android, iOS */ + url("\#{resource['serenity-layout:fonts/roboto-v15-latin-300.svg']}#Roboto") format('svg'); /* Legacy iOS */ +} +/* roboto-regular - latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: url("\#{resource['serenity-layout:fonts/roboto-v15-latin-regular.eot']}"); /* IE9 Compat Modes */ + src: local('Roboto'), local('Roboto-Regular'), + url("\#{resource['serenity-layout:fonts/roboto-v15-latin-regular.eot']}#iefix") format('embedded-opentype'), /* IE6-IE8 */ + url("\#{resource['serenity-layout:fonts/roboto-v15-latin-regular.woff2']}") format('woff2'), /* Super Modern Browsers */ + url("\#{resource['serenity-layout:fonts/roboto-v15-latin-regular.woff']}") format('woff'), /* Modern Browsers */ + url("\#{resource['serenity-layout:fonts/roboto-v15-latin-regular.ttf']}") format('truetype'), /* Safari, Android, iOS */ + url("\#{resource['serenity-layout:fonts/roboto-v15-latin-regular.svg']}#Roboto") format('svg'); /* Legacy iOS */ +} +/* roboto-700 - latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + src: url("\#{resource['serenity-layout:fonts/roboto-v15-latin-700.eot']}"); /* IE9 Compat Modes */ + src: local('Roboto Bold'), local('Roboto-Bold'), + url("\#{resource['serenity-layout:fonts/roboto-v15-latin-700.eot']}#iefix") format('embedded-opentype'), /* IE6-IE8 */ + url("\#{resource['serenity-layout:fonts/roboto-v15-latin-700.woff2']}") format('woff2'), /* Super Modern Browsers */ + url("\#{resource['serenity-layout:fonts/roboto-v15-latin-700.woff']}") format('woff'), /* Modern Browsers */ + url("\#{resource['serenity-layout:fonts/roboto-v15-latin-700.ttf']}") format('truetype'), /* Safari, Android, iOS */ + url("\#{resource['serenity-layout:fonts/roboto-v15-latin-700.svg']}#Roboto") format('svg'); /* Legacy iOS */ +} + +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: url("\#{resource['serenity-layout:fonts/MaterialIcons-Regular.eot']}"); /* For IE6-8 */ + src: local('Material Icons'), + local('MaterialIcons-Regular'), + url("\#{resource['serenity-layout:fonts/MaterialIcons-Regular.woff2']}") format('woff2'), + url("\#{resource['serenity-layout:fonts/MaterialIcons-Regular.woff']}") format('woff'), + url("\#{resource['serenity-layout:fonts/MaterialIcons-Regular.ttf']}") format('truetype'); +} \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/sass/_layout_styles.scss b/apc-web/src/main/webapp/resources/sass/_layout_styles.scss new file mode 100644 index 0000000..bff78a4 --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/_layout_styles.scss @@ -0,0 +1 @@ +/* Add your customizations of layout here */ \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/sass/_mixins.scss b/apc-web/src/main/webapp/resources/sass/_mixins.scss new file mode 100644 index 0000000..c726b8e --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/_mixins.scss @@ -0,0 +1,225 @@ +@mixin border-radius($val) { + -moz-border-radius: $val; + -webkit-border-radius: $val; + border-radius: $val; +} + +@mixin border-radius-right($val) { + -moz-border-radius-topright: $val; + -webkit-border-top-right-radius: $val; + border-top-right-radius: $val; + -moz-border-radius-bottomright: $val; + -webkit-border-bottom-right-radius: $val; + border-bottom-right-radius: $val; +} + +@mixin border-radius-left($val) { + -moz-border-radius-topleft: $val; + -webkit-border-top-left-radius: $val; + border-top-left-radius: $val; + -moz-border-radius-bottomleft: $val; + -webkit-border-bottom-left-radius: $val; + border-bottom-left-radius: $val; +} + +@mixin border-radius-top($val) { + -moz-border-radius-topleft: $val; + -webkit-border-top-left-radius: $val; + border-top-left-radius: $val; + -moz-border-radius-topright: $val; + -webkit-border-top-right-radius: $val; + border-top-right-radius: $val; +} + +@mixin border-radius-bottom($val) { + -moz-border-radius-bottomleft: $val; + -webkit-border-bottom-left-radius: $val; + border-bottom-left-radius: $val; + -moz-border-radius-bottomright: $val; + -webkit-border-bottom-right-radius: $val; + border-bottom-right-radius: $val; +} + +@mixin gradient($deg, $color1, $color2) { + background: -moz-linear-gradient($deg, $color1 0%, $color2 100%); /* ff3.6+ */ + background: -webkit-gradient(linear, left bottom, right top, color-stop(0%, $color1), color-stop(100%, $color2)); /* safari4+,chrome */ + background: -webkit-linear-gradient($deg, $color1 0%, $color2 100%); /* safari5.1+,chrome10+ */ + background: -o-linear-gradient($deg, $color1 0%, $color2 100%); /* opera 11.10+ */ + background: -ms-linear-gradient($deg, $color1 0%, $color2 100%); /* ie10+ */ + background: linear-gradient($deg, $color1 0%, $color2 100%); /* w3c */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#{$color1}', endColorstr='#{$color2}',GradientType=1 ); /* ie6-9 */ +} + +@mixin background-gradient-left2right($start-color, $end-color) { + background-color: $start-color; + background-image: -webkit-gradient(linear, left top, right top, from($start-color), to($end-color)); + background-image: -webkit-linear-gradient(left, $start-color, $end-color); + background-image: -moz-linear-gradient(left, $start-color, $end-color); + background-image: -ms-linear-gradient(left, $start-color, $end-color); + background-image: -o-linear-gradient(left, $start-color, $end-color); + background-image: linear-gradient(left, $start-color, $end-color); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{$start-color}', endColorstr='#{$end-color}', gradientType='1'); +} + +@mixin background-gradient-top2bottom($start-color, $end-color) { + background-color: $start-color; + background-image: -webkit-gradient(linear, left top, left bottom, from($start-color), to($end-color)); + background-image: -webkit-linear-gradient(top, $start-color, $end-color); + background-image: -moz-linear-gradient(top, $start-color, $end-color); + background-image: -ms-linear-gradient(top, $start-color, $end-color); + background-image: -o-linear-gradient(top, $start-color, $end-color); + background-image: linear-gradient(to bottom, $start-color, $end-color); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{$start-color}', endColorstr='#{$end-color}'); +} + +@mixin transition($transition...) { + -moz-transition: $transition; + -o-transition: $transition; + -webkit-transition: $transition; + transition: $transition; +} + +@mixin content-shadow() { + box-shadow: 0 1px 3px 0 rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 2px 1px -1px rgba(0,0,0,.12); + -webkit-box-shadow: 0 1px 3px 0 rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 2px 1px -1px rgba(0,0,0,.12); + -moz-box-shadow: 0 1px 3px 0 rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 2px 1px -1px rgba(0,0,0,.12) +} + +@mixin overlay-shadow { + -webkit-box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.3); + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.3); +} + +@mixin overlay-content-shadow() { + -webkit-box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23); + -moz-box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23); + box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23); +} + +@mixin overlay-input-shadow() { + -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); + -moz-box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); + box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); +} + +@mixin no-shadow() { + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; +} + +@mixin shadow($value) { + -webkit-box-shadow: $value; + -moz-box-shadow: $value; + box-shadow: $value; +} + +@mixin multi-shadow($value1, $value2, $value3) { + -webkit-box-shadow: $value1, $value2, $value3; + -moz-box-shadow: $value1, $value2, $value3; + box-shadow: $value1, $value2, $value3; +} + +@mixin box-sizing($box-model) { + -webkit-box-sizing: $box-model; + -moz-box-sizing: $box-model; + box-sizing: $box-model; +} + +@mixin hover-element { + background-color: $hoverBgColor; + color: $hoverTextColor; +} + +@mixin hover-element-primary { + background-color: $primaryLightColor; + color: $hoverTextColor; +} + +@mixin opacity($opacity) { + opacity: $opacity; + $opacity-ie: $opacity * 100; + filter: alpha(opacity=$opacity-ie); +} + +@mixin icon-override($icon) { + &:before { + content: $icon; + } +} + +@mixin border-box-sizing() { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@mixin material-icon($icon) { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + + /* Support for IE. */ + font-feature-settings: 'liga'; + + &:before { + content: $icon; + } +} + +@mixin rotate($deg) { + -webkit-transform: rotate($deg); + -moz-transform: rotate($deg); + -o-transform: rotate($deg); + -ms-transform: rotate($deg); + transform: rotate($deg); +} + +@mixin scale($deg) { + -webkit-transform: scale($deg); + -moz-transform: scale($deg); + -o-transform: scale($deg); + -ms-transform: scale($deg); + transform: scale($deg); +} + +@mixin rippleitem() { + position: relative; + overflow: hidden; +} + +@mixin clearfix() { + &:before, + &:after { + content: ""; + display: table; + } + &:after { + clear: both; + } +} + +@mixin flex() { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/sass/_theme_styles.scss b/apc-web/src/main/webapp/resources/sass/_theme_styles.scss new file mode 100644 index 0000000..3b23bff --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/_theme_styles.scss @@ -0,0 +1 @@ +/* Add your customizations of theme here */ \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/sass/layout/_dashboard.scss b/apc-web/src/main/webapp/resources/sass/layout/_dashboard.scss new file mode 100644 index 0000000..92f13bc --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/layout/_dashboard.scss @@ -0,0 +1,768 @@ +.dashboard { + + .task-box { + @include multi-shadow(0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14)); + + .task-box-header { + @include clearfix(); + padding: 8px 14px; + + i { + float: right; + color: #ffffff; + } + } + + .task-box-content { + background-color: #ffffff; + padding: 8px 14px; + + h3 { + font-weight: bold; + font-size: $fontSize; + margin: 14px 0 7px 0; + padding: 0; + } + + p { + color: $textSecondaryColor; + margin: 0 0 28px 0; + padding: 0; + } + } + + .task-box-footer { + @include clearfix(); + background-color: #ffffff; + padding: 8px 14px; + + img { + width: 32px; + float: right; + margin-left: 4px; + } + + .task-status { + @include border-radius(9px); + padding: 2px 8px; + color: #ffffff; + } + } + + &.task-box-1 { + .task-box-header { + background-color: #e91e63; + } + + .task-box-footer { + .task-status { + background-color: #e91e63; + } + } + } + + &.task-box-2 { + .task-box-header { + background-color: #ffc107; + } + + .task-box-footer { + .task-status { + background-color: #ffc107; + } + } + } + + &.task-box-3 { + .task-box-header { + background-color: #00bcd4; + } + + .task-box-footer { + .task-status { + background-color: #00bcd4; + } + } + } + } + + .overview-box { + text-align: center; + color: #ffffff; + @include multi-shadow(0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14)); + + .overview-box-header { + height: 24px; + } + + .overview-box-content { + padding: 8px 14px 14px 14px; + + .overview-box-icon { + @include border-radius(50%); + width: 40px; + height: 40px; + line-height: 40px; + margin: 0 auto; + margin-top: -28px; + + i { + line-height: inherit; + font-size: 28px; + } + } + + .overview-box-title { + font-size: 16px; + } + + .overview-box-count { + font-size: 24px; + } + } + + &.overview-box-1 { + .overview-box-header { + background-color: #f06292; + } + + .overview-box-content { + background-color: #e91e63; + + .overview-box-icon { + background-color: #e91e63; + } + } + } + + &.overview-box-2 { + .overview-box-header { + background-color: #4dd0e1; + } + + .overview-box-content { + background-color: #00bcd4; + + .overview-box-icon { + background-color: #00bcd4; + } + } + } + + &.overview-box-3 { + .overview-box-header { + background-color: #ffd54f; + } + + .overview-box-content { + background-color: #ffc107; + + .overview-box-icon { + background-color: #ffc107; + } + } + } + + &.overview-box-4 { + .overview-box-header { + background-color: #9e9e9e; + } + + .overview-box-content { + background-color: #616161; + + .overview-box-icon { + background-color: #616161; + } + } + } + } + + .task-list { + overflow: hidden; + + > .ui-panel { + min-height: 340px; + border: 0 none; + @include multi-shadow(0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14)); + } + + .ui-panel-content { + padding: 10px 0 !important; + } + + button { + margin-top: -25px; + margin-right: 10px; + float: right; + } + + ul { + list-style-type: none; + margin: 0; + padding: 0; + + li { + padding: 9.76px 14px; + border-bottom: 1px solid #dbdbdb; + + &:first-child { + margin-top: 10px; + } + } + + .ui-chkbox { + vertical-align: middle; + margin-right: 5px; + } + + .task-name { + vertical-align: middle; + } + + i { + color: $textSecondaryColor; + float: right; + } + } + } + + .contact-form { + overflow: hidden; + + .ui-panel { + min-height: 340px; + border: 0 none; + @include multi-shadow(0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14)); + } + + .ui-g-12 { + padding: 16px 10px; + } + + .ui-button { + margin-top: 20px; + } + } + + .messages { + overflow: hidden; + + > .ui-panel { + min-height: 340px; + border: 0 none; + @include multi-shadow(0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14)); + } + + .ui-panel-content { + padding: 15px 0 10px 0 !important; + } + + ul { + list-style-type: none; + padding: 0; + margin: 0; + + li { + border-bottom: 1px solid #d8d8d8; + + a { + padding: 9px; + width: 100%; + box-sizing: border-box; + text-decoration: none; + position: relative; + display: block; + @include border-radius(2px); + @include transition(background-color .2s); + @include clearfix(); + + img { + float: left; + } + + > div { + float: left; + margin-left: 10px; + + .name { + font-size: 14px; + font-weight: 700; + display: block; + color: $textColor; + } + + .message { + font-size: 14px; + color: $textSecondaryColor; + } + } + + button { + position: absolute; + top: 15px; + + &.message-btn { + right: 20px; + } + + &.remove-btn { + right: 60px; + } + } + + &:hover { + cursor: pointer; + background-color: #e8e8e8; + } + } + + &:last-child { + border: 0; + } + } + } + } + + .chat { + .ui-panel { + border: 0 none; + @include multi-shadow(0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14)); + } + + .ui-panel-content { + padding: 0 !important; + } + + .ui-tabs { + border-color: transparent; + } + + ul { + padding: 12px; + margin: 0; + list-style-type: none; + + li { + padding: 6px 0; + @include clearfix(); + + img { + width: 36px; + float: left; + } + + span { + padding: 6px 12px; + float: left; + display: inline-block; + margin: 4px 0; + @include border-radius(10px); + } + + &.message-from { + img, span { + float: left; + } + + img { + margin-right: 8px; + } + + span { + background-color: #e8eaf6; + } + } + + &.message-own { + img, span { + float: right; + } + + img { + margin-left: 8px; + } + + span { + background: #c8e6c9; + color: #000000; + } + } + } + } + + .new-message { + height: 40px; + border-top: 1px solid #dce2e7; + color: #afafc0; + + .message-attachment { + display: inline-block; + border-right: 1px solid #dce2e7; + width: 40px; + line-height: 40px; + height: 100%; + text-align: center; + + i { + line-height: inherit; + font-size: 24px; + } + } + + .message-input { + position: relative; + top: -6px; + width: calc(100% - 100px); + display: inline-block; + + input { + border: 0 none; + font-size: 14px; + width: 100%; + background-color: transparent; + outline: 0 none; + color: $textSecondaryColor; + } + } + } + } + + .global-sales { + .header-helper { + float:right; + @include opacity(.7); + } + + .ui-panel { + border: 0 none; + @include multi-shadow(0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14)); + } + + .ui-panel-content { + padding: 14px 9px 0px 9px; + } + + table { + width: 100%; + border-collapse: collapse; + + th { + font-weight: 700; + text-align: left; + padding: 8px 5px; + } + + tbody { + tr { + border-top: 1px solid $dividerColor; + + img { + width: 36px; + height: 36px; + } + + td { + padding: 8px 5px; + + &:nth-child(1) { + font-weight: 700; + text-align: center; + } + + &:nth-child(3) { + font-weight: 700; + } + + &:nth-child(7) { + text-align: right; + + button { + margin-left: 10px; + } + } + + .up-arrow { + color: #cddc39; + } + + .down-arrow { + color: #e91e63; + } + } + } + } + } + } + + .status-bars { + ul { + margin: 0; + padding: 0; + list-style-type: none; + + li { + padding: 8px 14px; + position: relative; + + span { + position: absolute; + right: 36px; + top: 8px; + } + + i { + position: absolute; + right: 4px; + top: 4px; + } + } + } + + .status-bar { + height: 18px; + width: 75%; + background-color: #d8d8d8; + @include border-radius(6px); + + .status-bar-value { + height: 100%; + color: #ffffff; + text-align: right; + padding-right: 4px; + padding-top: 1px; + @include box-sizing(border-box); + @include border-radius(6px); + } + + &.status-bar-1 { + .status-bar-value { + background-color: #e91e63; + } + + ~ i { + color: #e91e63; + } + } + + &.status-bar-2 { + .status-bar-value { + background-color: #00bcd4; + } + + ~ i { + color: #00bcd4; + } + } + + &.status-bar-3 { + .status-bar-value { + background-color: #ffc107; + } + + ~ i { + color: #ffc107; + } + } + + &.status-bar-4 { + .status-bar-value { + background-color: #cddc39; + } + + ~ i { + color: #cddc39; + } + } + + &.status-bar-5 { + .status-bar-value { + background-color: #ff9800; + } + + ~ i { + color: #ff9800; + } + } + } + } + + .image-box { + .card { + padding: 0; + img { + width: 100%; + } + + .image-box-content { + padding: 16px; + + h3 { + font-weight: 700; + margin-top: 0; + } + + .image-box-tag { + width: 40px; + text-align: left; + color: #ffffff; + background-color: #e91e63; + padding: 0 8px; + @include border-radius(6px); + } + } + + .image-box-footer { + text-align: right; + } + } + } + + .user-card { + border:1px solid $dividerColor; + padding: 0; + @include border-radius($borderRadius); + + .user-card-header { + height: 100px; + overflow: hidden; + + img { + width: 100%; + } + } + + .user-card-content { + min-height: 340px; + background-color: #ffffff; + position: relative; + + img { + position: absolute; + top: -90px; + left: 24px; + } + + .ui-button { + position: absolute; + width: 36px; + height: 36px; + top: -18px; + right: 24px; + } + + .user-card-name { + font-size: 20px; + color: $textColor; + position: absolute; + top: -60px; + margin-left: 110px; + font-weight: 700; + white-space: nowrap; + } + + .user-detail { + text-align: left; + + ul { + padding: 0px 0 32px 0; + margin: 0; + list-style-type: none; + + li { + padding: 16px 24px; + border-top: 1px solid $dividerColor; + + &:last-child { + border-bottom: 1px solid $dividerColor; + } + + i { + font-size: 24px; + margin-right: 8px; + width: 32px; + vertical-align: middle; + } + + .project-title { + font-weight: 700; + margin-right: 8px; + } + + .project-detail { + color: $textSecondaryColor; + } + + .project-progressbar { + display: inline-block; + width: 100px; + background-color: $dividerColor; + float: right; + margin-top: 12px; + + .project-progressbar-value { + background-color: $primaryColor; + height: 4px; + } + } + } + } + } + } + } + + .map { + .ui-panel { + border: 0 none; + @include multi-shadow(0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14)); + + .ui-panel-content { + padding: 8px; + + img { + width: 100%; + } + } + } + } + + .schedule { + .ui-panel { + border: 0 none; + @include multi-shadow(0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14)); + + .fc-today-button { + display: none; + } + } + } +} + +@media (max-width: 640px) { + .dashboard { + .status-bars { + .status-bar { + width: 65%; + } + } + + .global-sales { + table { + tbody { + tr td:nth-child(7) { + text-align: left; + + button { + display: block; + margin-left: 0; + + &:first-child { + margin-bottom: 4px; + } + } + } + } + } + } + } +} diff --git a/apc-web/src/main/webapp/resources/sass/layout/_exception.scss b/apc-web/src/main/webapp/resources/sass/layout/_exception.scss new file mode 100644 index 0000000..2d36c76 --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/layout/_exception.scss @@ -0,0 +1,168 @@ +.exception-body { + height: 100%; + background-position: center; + background-repeat: no-repeat; + background-size: cover; + + &.error { + background-image: url("\#{resource['serenity-layout:images/exception/error-bg.jpg']}"); + + .exception-panel { + .exception-code { + background-color: #e91e63; + + img { + margin-left: -194px; + } + } + + .exception-icon { + background-color: #e91e63; + } + } + } + + &.notfound { + background-image: url("\#{resource['serenity-layout:images/exception/notfound-bg.jpg']}"); + + .exception-panel { + .exception-code { + background-color: #e91e63; + + img { + margin-left: -206px; + } + } + + .exception-icon { + background-color: #e91e63; + } + } + } + + &.accessdenied { + background-image: url("\#{resource['serenity-layout:images/exception/access-bg.jpg']}"); + + .exception-panel { + .exception-code { + background-color: #ffb300; + + img { + margin-left: -178px; + } + } + + .exception-icon { + background-color: #ffb300; + } + } + } + + .exception-panel { + width: 550px; + height: 480px; + background-color: #ffffff; + position: absolute; + left: 50%; + top: 50%; + margin-left: -275px; + margin-top: -240px; + padding: 0; + text-align: center; + @include border-radius(2px); + @include multi-shadow(0 3px 5px 0 rgba(0, 0, 0, 0.2), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 6px 10px 0 rgba(0, 0, 0, 0.14)); + + .exception-code { + height: 240px; + position: relative; + + img { + position: absolute; + bottom: 0; + height: 190px; + left: 50%; + } + } + + .exception-detail { + height: 240px; + position: relative; + padding: 60px 0 0 0; + + .exception-icon { + width: 90px; + height: 90px; + line-height: 90px; + text-align: center; + display: inline-block; + z-index: 100; + position: absolute; + top: -45px; + left: 50%; + margin-left: -45px; + @include border-radius(50%); + @include multi-shadow(0 1px 2px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.12), 0 0 1px 0 rgba(0, 0, 0, 0.14)); + + i { + font-size: 45px; + line-height: inherit; + color: #ffffff; + } + } + + h1 { + font-size: 15px; + font-weight: bold; + margin: 10px 0 8px 0; + } + + p { + color: $textSecondaryColor; + margin: 0 0 60px 0; + } + } + } +} + +@media (max-width: 640px) { + .exception-body { + .exception-panel { + left: 0; + margin-left: 0; + width: 100%; + } + + &.error { + .exception-panel { + .exception-code { + img { + height: 150px; + margin-left: -150px; + } + } + } + } + + &.notfound { + .exception-panel { + .exception-code { + img { + height: 150px; + margin-left: -163px; + } + } + } + } + + &.accessdenied { + .exception-panel { + .exception-code { + img { + height: 150px; + margin-left: -141px; + } + } + } + } + } +} diff --git a/apc-web/src/main/webapp/resources/sass/layout/_horizontal.scss b/apc-web/src/main/webapp/resources/sass/layout/_horizontal.scss new file mode 100644 index 0000000..7e54e9e --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/layout/_horizontal.scss @@ -0,0 +1,453 @@ +@media (min-width: 1025px) { + .layout-wrapper { + &.layout-menu-horizontal { + + .layout-sidebar { + width: 100%; + height: auto; + top: 64px; + left: 0; + z-index: 99; + + @if variable-exists(horizontalMenuBgImageLight) { + background-image: url("\#{resource['serenity-layout:images/special/#{$horizontalMenuBgImageLight}']}"); + background-size: auto; + background-repeat: no-repeat; + background-color: $horizontalMenuBgColor; + } + + .sidebar-logo { + display: none; + } + + > .nano { + overflow: visible; + + > .nano-content { + margin-right: 0 !important; + display: inherit; + height: auto; + position: static; + overflow: visible; + overflow-x: visible; + + &.sidebar-scroll-content .layout-menu { + padding-bottom: 0; + } + } + + > .nano-pane { + display: none !important; + } + } + + .layout-menu { + margin: 0; + + > li { + width: auto; + padding: 0; + position: relative; + float: left; + + > a { + height: 44px; + padding-top: 12px; + @include box-sizing(border-box); + @include border-radius(0); + + &:hover { + background-color: $horizontalSubmenuitemHoverBgColor; + } + + .menuitem-text { + vertical-align: middle; + } + + i { + float: none; + position: static; + vertical-align: middle; + margin-top: 0; + top: auto; + right: auto; + margin-right: 5px; + + &.layout-submenu-toggler { + display: inline-block; + margin-top: 2px; + } + } + } + + &.active-menuitem { + > a { + color: $horizontalMenuActiveTextColor; + + i { + color: $horizontalMenuActiveTextColor; + } + + &:hover { + color: $horizontalMenuActiveHoverTextColor; + + i { + color: $horizontalMenuActiveHoverTextColor; + } + } + } + } + + > ul { + top: 44px; + left: 0; + width: 230px; + position: absolute; + padding: 0; + margin: 0; + z-index: 100; + overflow: auto; + max-height: 450px; + @include overlay-content-shadow(); + + li { + a { + padding-left: 40px; + + &:hover { + background-color: $horizontalSubmenuitemHoverBgColor; + } + + i { + float: none; + left: 10px; + + &:last-child { + right: 10px; + left: auto; + } + } + + .layout-submenu-toggler { + display: block; + left: auto; + right: 10px; + } + } + + ul { + li { + a { + padding-left: 50px; + + &:hover { + background-color: $horizontalSubmenuitemHoverBgColor; + } + + i:first-child { + left: 20px; + } + } + } + + ul { + li { + a { + padding-left: 60px; + + &:hover { + background-color: $horizontalSubmenuitemHoverBgColor; + } + + i:first-child { + left: 30px; + } + } + } + } + } + } + } + + &.active-menuitem { + > ul { + background-color: $horizontalSubmenuBgColor; + } + } + } + + li { + + a { + &:hover { + background-color: $horizontalSubmenuitemHoverBgColor; + color: $horizontalMenuActiveHoverTextColor; + i { + color: $horizontalMenuActiveHoverTextColor; + } + } + + .menuitem-badge { + left: 18px; + top: 15px; + display: block; + } + } + } + } + + &.layout-sidebar-dark { + background-color: $horizontalDarkSubmenuBgColor; + + @if variable-exists(horizontalMenuBgImageDark) { + background-image: url("\#{resource['serenity-layout:images/special/#{$horizontalMenuBgImageDark}']}"); + background-color: $horizontalDarkMenuBgColor; + } + + .layout-menu { + > li { + > a { + &:hover { + background-color: $horizontalSubmenuitemDarkHoverBgColor; + color: $horizontalSubmenuitemDarkHoverTextColor; + + i { + color:$horizontalDarkMenuActiveTextColor; + } + } + } + + > ul { + li { + a { + &:hover { + background-color: $horizontalSubmenuitemDarkHoverBgColor; + } + } + } + } + } + + li { + a { + &:hover { + color: $horizontalSubmenuitemDarkHoverTextColor; + + i { + color: $horizontalSubmenuitemDarkHoverTextColor; + } + } + } + + &.active-menuitem { + > a { + @if not variable-exists(horizontalMenuBgImageDark) { + color: lighten($primaryLightColor, 6%); + + i { + color: lighten($primaryLightColor, 6%); + } + } + + &:hover { + color: $horizontalDarkMenuActiveHoverTextColor; + + i { + color: $horizontalDarkMenuActiveHoverTextColor; + } + } + } + } + } + + > li { + &.active-menuitem { + > a { + color: $horizontalDarkMenuActiveTextColor; + + i { + color: $horizontalDarkMenuActiveTextColor; + } + } + + > ul { + background-color: $horizontalDarkSubmenuBgColor; + } + } + } + } + } + } + + .layout-main { + margin-left: 0px; + } + + .layout-topbar { + width: 100%; + + .topbar-logo { + float: left; + margin-top: -10px; + margin-right: 20px; + display: inline-block; + + img { + height: 56px; + vertical-align: middle; + } + + .app-name { + color: $primaryTextColor; + font-size: 26px; + } + } + + .layout-topbar-menu-wrapper { + .topbar-menu { + > li.profile-item { + float: right; + margin-left: 20px; + + > ul { + left: auto; + right: 105px; + + &:before { + left: 232px; + } + } + } + } + + } + } + + .layout-breadcrumb { + padding-top: 108px; + } + + &.layout-rtl { + .layout-main { + margin-right: 0px; + + .layout-topbar { + .layout-topbar-menu-wrapper { + .topbar-menu { + > li { + &.profile-item { + float: left; + margin-right: 20px; + margin-left: auto; + + > ul { + left: 105px; + right: auto; + + &:before { + left: auto; + right: 232px; + } + } + } + } + } + } + + .topbar-logo { + float: right; + margin-right: auto; + margin-left: 20px; + } + } + } + + .layout-sidebar { + @include transition(right 0s); + + .layout-menu { + > li { + float: right; + + > a { + i { + margin-right: auto; + margin-left: 5px; + } + } + + > ul { + left: auto; + + li { + a { + padding-right: 40px; + padding-left: 0px; + + i { + right: 10px; + left: auto; + + &:last-child { + left: 10px; + right: auto; + } + } + + .layout-submenu-toggler { + right: auto; + left: 10px; + } + } + + ul { + li { + a { + padding-right: 50px; + padding-left: 0px; + + i:first-child { + right: 20px; + left: auto; + } + } + } + + ul { + li { + a { + padding-right: 60px; + padding-left: 0px; + + i:first-child { + right: 30px; + left: auto; + } + } + } + } + } + } + } + } + + li { + a { + .menuitem-badge { + right: 18px; + left: auto; + } + + i { + &:last-child { + margin-right: 3px; + } + } + } + } + } + } + } + } + } + } diff --git a/apc-web/src/main/webapp/resources/sass/layout/_landing.scss b/apc-web/src/main/webapp/resources/sass/layout/_landing.scss new file mode 100644 index 0000000..e1ed1c0 --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/layout/_landing.scss @@ -0,0 +1,551 @@ +.landing-body { + background-color: $bodyBgColor; + + * { + @include border-box-sizing(); + } + + p { + line-height: 1.5; + } + + #header { + background-color: $bodyBgColor; + + > div { + width: 960px; + margin: 0 auto; + height: 90px; + padding: 15px 0; + + img { + height: 60px; + } + + #landing-menu { + float: right; + list-style-type: none; + padding: 0; + margin: 20px 0 0 0; + + > li { + display: inline-block; + + a { + border-bottom: 5px solid transparent; + color: #616161; + display: inline-block; + min-width: 80px; + text-align: center; + height: 55px; + font-size: 15px; + @include transition(border-color $transitionDuration); + } + + &:hover { + a { + color: #3f51b5; + border-color: #3f51b5; + } + } + } + } + + #landing-menu-button { + color: #3f51b5; + display: none; + float: right; + margin-right: 15px; + margin-top: 5px; + + i { + font-size: 48px; + } + } + } + } + + #introduction { + > div { + background: url("\#{resource['serenity-layout:images/landing/landing-header.png']}") no-repeat; + min-height: 400px; + color: #ffffff; + text-align: center; + padding-top: 120px; + background-size: cover; + + h1 { + padding: 0; + margin: 0 0 20px 0; + } + + p { + max-width: 400px; + margin: 0 auto; + margin-bottom: 40px; + } + + button { + min-width: 180px; + } + } + } + + #features { + > div { + width: 960px; + margin: 0 auto; + padding: 60px 0; + + .feature-box { + @include clearfix(); + padding: 30px 15px 30px 0; + + img { + float: left; + margin-right: 30px; + } + + > div { + padding: 16px 0; + + h3 { + font-size: 15px; + margin: 0; + } + + p { + color: $textSecondaryColor; + margin: 8px; + } + } + } + } + } + + #stats { + @include background-gradient-top2bottom(#212121, #424242); + + > div { + width: 960px; + margin: 0 auto; + padding: 40px 0; + + .ui-g-12 { + padding: 20px; + } + + .stat-box { + @include border-radius($borderRadius); + background-color: #ffffff; + @include multi-shadow(0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14)); + padding: 18px; + text-align: center; + color: #e91e63; + + h3 { + font-weight: 400; + margin: 0; + } + + p { + margin: 0; + } + + &.stat-box-active { + background-color: #e91e63; + color: #ffffff; + } + } + } + } + + #video { + @include multi-shadow(0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14)); + + > div { + width: 960px; + margin: 0 auto; + padding: 60px 0; + + .video-description { + padding-top: 80px; + padding-right: 50px; + + h3 { + font-weight: 400; + font-size: 24px; + margin: 0 0 12px 0; + } + + p { + margin: 0 0 24px 0; + } + } + } + } + + #pricing { + > div { + width: 960px; + margin: 0 auto; + padding: 60px 0; + text-align: center; + + > h2 { + font-size: 24px; + font-weight: normal; + margin: 0 0 12px 0; + } + + > p { + color: $textSecondaryColor; + margin: 0 0 40px 0; + } + + .pricing-box { + width: 100%; + text-align: left; + @include border-radius($borderRadius); + + .pricing-header { + background-color: #212121; + padding: 16px; + text-align: center; + + h3 { + margin: 0; + color: #ffffff; + font-size: 15px; + font-weight: 400; + padding-bottom: 4px; + border-bottom: 1px solid #a7a5a5; + } + + p { + color: #a7a5a5; + margin: 0; + padding: 4px 0 0 0; + } + } + + .pricing-content { + padding: 16px; + min-height: 350px; + position: relative; + @include multi-shadow(0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14)); + + ul { + list-style-type: none; + margin: 0; + padding: 0; + + + li { + padding: 8px 0; + + i { + color: #4caf50; + vertical-align: middle; + margin-right: 6px; + } + } + } + + button { + position: absolute; + min-width: 180px; + bottom: 20px; + left: 50%; + margin-left: -90px; + } + + .pricing-fee { + position: absolute; + top: -24px; + right: 14px; + margin-left: -90px; + text-align: center; + font-size: 16px; + width: 48px; + height: 48px; + line-height: 48px; + background-color: #e91e63; + color: #ffffff; + @include border-radius(50%); + @include multi-shadow(0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14)); + } + } + + &.pricing-box-pro { + .pricing-header { + background-color: #e91e63; + color: #ffffff; + + h3 { + border-bottom: 1px solid #ffffff; + } + + p { + color: #ffffff; + } + } + + .pricing-content { + .pricing-fee { + background-color: #212121; + color: #ffffff; + } + } + } + } + } + } + + #contact { + background-color: #424242; + + > div { + width: 960px; + margin: 0 auto; + padding: 60px 0; + text-align: center; + + > h2 { + font-size: 24px; + font-weight: normal; + margin: 0 0 12px 0; + color: #f5f5f5; + } + + > p { + margin: 0 0 40px 0; + color: #e0e0e0; + } + + .contact-form { + text-align: left; + + > div { + padding: 1em .5em; + } + + button { + width: auto; + min-width: 180px; + margin-left: 15px; + margin-top: 40px; + } + + .md-inputfield { + input:focus ~ label, + input.ui-state-filled ~ label, + textarea:focus ~ label, + textarea.ui-state-filled ~ label, + .md-inputwrapper-focus ~ label, + .md-inputwrapper-filled ~ label { + color:$primaryLightColor; + } + + input:-webkit-autofill ~ label { + color:$primaryLightColor; + } + + input:focus { + border-color: $primaryLightColor; + } + + input { + color: #ffffff; + } + } + } + } + } + + #footer { + background-color: #212121; + color: #ffffff; + + > div { + width: 960px; + margin: 0 auto; + padding: 30px 0; + + .footer-logo { + height: 54px; + float: left; + margin-right: 14px; + } + + h4 { + margin: 0 0 8px 0; + font-weight: 700; + } + + p { + margin: 0; + line-height: 1.5; + + &:last-child { + margin-top: 8px; + } + } + + i { + vertical-align: middle; + } + + .footer-social { + a { + margin-right: 14px; + @include opacity(.7); + + img { + width: 30px; + height: 30px; + } + + &:hover { + @include opacity(1); + } + } + } + } + } +} + +@media screen and (max-width: 64em) { + + .landing-body { + padding-top: 90px; + + #header { + position: fixed; + top: 0; + z-index: 100; + width: 100%; + @include multi-shadow(0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14)); + + > div { + width: 100%; + padding-left: 15px; + + #landing-menu-button { + display: block; + } + + #landing-menu { + -webkit-animation-duration: .5s; + -moz-animation-duration: .5s; + animation-duration: .5s; + display: none; + float: none; + width: 100%; + text-align: center; + background-color: $bodyBgColor; + position: fixed; + top: 70px; + left: 0; + @include multi-shadow(0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14)); + + li { + display: block; + + a { + height: auto; + border-bottom: 0 none; + padding: 15px; + } + } + + &.landing-menu-active { + display: block; + } + } + } + } + + #introduction { + width: 100%; + + > div { + h1, p { + padding-left: 15px; + padding-right: 15px; + } + } + } + + #features { + > div { + width: 100%; + padding-left: 15px; + } + } + + #stats { + > div { + width: 100%; + } + } + + #video { + > div { + width: 100%; + text-align: center; + padding-left: 15px; + padding-right: 15px; + + .video-description { + padding-top: 0; + padding-right: 0; + } + + iframe { + width: 300px; + height: 200px; + } + } + } + + #pricing { + > div { + width: 100%; + adding-left: 15px; + padding-right: 15px; + } + } + + #contact { + > div { + width: 100%; + text-align: center; + + .contact-map { + text-align: center; + + img { + width: 100%; + } + } + + .contact-form { + .ui-g-12 { + padding: 15px; + } + } + } + } + + #footer { + > div { + width: 100%; + + .ui-g-12 { + padding-top: 24px; + } + } + } + } +} diff --git a/apc-web/src/main/webapp/resources/sass/layout/_layout.scss b/apc-web/src/main/webapp/resources/sass/layout/_layout.scss new file mode 100644 index 0000000..148d6c2 --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/layout/_layout.scss @@ -0,0 +1,11 @@ +@import '../variables/_layout'; +@import '../_mixins'; +@import '../_fonts'; +@import './_utils'; +@import './_dashboard'; +@import './_login'; +@import './_exception'; +@import './_landing'; +@import './_main'; +@import './_horizontal'; +@import '../_layout_styles.scss'; \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/sass/layout/_login.scss b/apc-web/src/main/webapp/resources/sass/layout/_login.scss new file mode 100644 index 0000000..34e3e67 --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/layout/_login.scss @@ -0,0 +1,82 @@ +.login-body { + background-image: url("\#{resource['serenity-layout:images/login/login-bg.jpg']}"); + height: 100%; + background-position: center; + background-repeat: no-repeat; + background-size: cover; + + .login-panel { + width: 550px; + height: 480px; + background-color: #ffffff; + position: absolute; + left: 50%; + top: 50%; + margin-left: -275px; + margin-top: -240px; + padding: 0; + @include border-radius(2px); + @include multi-shadow(0 3px 5px 0 rgba(0, 0, 0, 0.2), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 6px 10px 0 rgba(0, 0, 0, 0.14)); + + .login-panel-header { + background-color: $accentColor; + text-align: center; + padding: 8px 14px; + + img { + vertical-align: middle; + width: 135px; + } + } + + .login-panel-content { + padding: 50px 100px; + + h1 { + font-size: 16px; + margin-top: 0; + margin-bottom: 16px; + text-align: center; + } + + .ui-g-12, .ui-g-6 { + padding: 1em; + + &:last-child { + text-align: center; + + a { + color: $accentColor; + } + } + } + + .password-reset { + text-align: right; + + a { + color: $textSecondaryColor; + } + } + + .ui-chkbox-label { + margin: 0 0 0 8px; + vertical-align: middle; + } + } + } +} + +@media (max-width: 640px) { + .login-body { + .login-panel { + left: 0; + margin-left: 0; + width: 100%; + + .login-panel-content { + padding: 50px 25px; + } + } + } +} diff --git a/apc-web/src/main/webapp/resources/sass/layout/_main.scss b/apc-web/src/main/webapp/resources/sass/layout/_main.scss new file mode 100644 index 0000000..9f8ed14 --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/layout/_main.scss @@ -0,0 +1,1399 @@ +html { + height: 100%; +} + +body { + font-family: $fontFamily; + font-size: $fontSize; + color: $textColor; + -webkit-font-smoothing: antialiased; + padding: 0; + margin: 0; + min-height: 100%; + background-color: $bodyBgColor; + + .ajax-loader { + font-size: 32px; + color: $accentColor; + } +} + +.layout-wrapper { + + .layout-sidebar { + width: 240px; + height: 100%; + position: fixed; + left: -180px; + top: 0; + -webkit-transition-timing-function: cubic-bezier(0.86, 0, 0.07, 1); + transition-timing-function: cubic-bezier(0.86, 0, 0.07, 1); + z-index: 999999; + background-color: $sidebarBgColor; + @include box-sizing(border-box); + @include transition(left $transitionDuration); + @include shadow(3px 0 6px rgba(0, 0, 0, 0.3)); + + @if variable-exists(menuBgImageLight) { + background-image: url("\#{resource['serenity-layout:images/special/#{$menuBgImageLight}']}"); + background-size: 240px 100%; + background-repeat: no-repeat; + } + + .sidebar-logo { + height: 64px; + background-color: $sidebarLogoBgColor; + padding-top: 8px; + @include box-sizing(border-box); + + img { + height: 48px; + margin-left: 12px; + vertical-align: middle; + } + + .sidebar-anchor { + display: none; + width: 18px; + height: 18px; + border: 2px solid $primaryTextColor; + background-color: $primaryColor; + vertical-align: middle; + float: right; + margin-right: 8px; + margin-top: 12px; + @include border-radius(50%); + @include transition(background-color $transitionDuration); + } + + .app-name { + color: $primaryTextColor; + vertical-align: middle; + font-size: 26px; + } + } + + .layout-menu { + list-style-type: none; + margin: 10px 0 0 0; + padding: 0; + + li { + padding: 4px 10px; + width: 100%; + @include box-sizing(border-box); + + &.active-menuitem { + > a { + color: $subMenuitemActiveTextColor; + + i { + color: $subMenuitemActiveIconTextColor; + } + + i.layout-submenu-toggler { + @include rotate(-180deg); + } + } + } + + > a { + color: $menuitemTextColor; + display: block; + padding: 10px 10px 10px 10px; + position: relative; + @include border-radius(0); + @include box-sizing(border-box); + @include transition(all $transitionDuration); + + &:hover { + background-color: $menuitemHoverBgColor; + color: $menuitemHoverTextColor; + + i { + color: $menuitemHoverIconTextColor; + } + } + + > .menuitem-text { + display: inline-block; + max-width: 145px; + word-break: break-all; + } + + i { + color: $menuitemIconTextColor; + float: right; + width: 20px; + height: 20px; + font-size: 20px; + position: absolute; + right: 10px; + top: 50%; + margin-top: -10px; + + &.layout-submenu-toggler { + @include transition(all $transitionDuration); + right: 34px; + display: none; + } + } + + .menuitem-badge { + display: none; + position: absolute; + right: 54px; + top: 50%; + margin-top: -8px; + } + } + + ul { + display: none; + list-style-type: none; + margin: 0; + padding: 0; + + li { + padding: 4px 0; + + a { + padding-left: 20px; + } + + ul { + li { + a { + padding-left: 30px; + } + + ul { + li { + a { + padding-left: 40px; + } + } + + ul { + li { + a { + padding-left: 50px; + } + } + + ul { + li { + a { + padding-left: 60px; + } + } + + ul { + li { + a { + padding-left: 70px; + } + } + + ul { + li { + a { + padding-left: 80px; + } + } + } + } + } + } + } + } + } + } + } + } + + > li { + > a { + @include border-radius(6px); + } + + &.active-menuitem { + > a { + color: $menuitemActiveTextColor; + background-color: $menuitemActiveBgColor; + @include border-radius(6px); + @include border-radius-bottom(0); + @include multi-shadow(0 4px 20px 0 rgba(0,0,0,.14), 0 7px 10px -5px rgba(60,72,88,.3),0 7px 10px -5px rgba(60,72,88,.1)); + + i { + color: $menuitemActiveIconTextColor; + } + } + + > ul { + background-color: $submenuBgColor; + @include border-radius-bottom(6px); + } + } + } + + .menuitem-badge { + float: right; + display: inline-block; + width: 16px; + height: 16px; + margin-right: 6px; + text-align: center; + background-color: $accentColor; + color: $accentTextColor; + font-size: $fontSize - 2; + font-weight: 700; + line-height: 16px; + @include border-radius(50%); + } + } + + &.layout-sidebar-active { + left: 0; + + .sidebar-logo { + img { + display: inline; + } + + .sidebar-anchor { + display: inline-block; + } + } + + .layout-menu { + li { + a { + i.layout-submenu-toggler { + display: inline-block; + } + + .menuitem-badge { + display: inline-block; + } + } + } + } + } + + .nano { + .sidebar-scroll-content { + display: block; + height: 100%; + position: relative; + + .layout-menu { + padding-bottom: 120px; + } + } + + .nano-pane .nano-slider { + background-color: $nanoSliderBgColor; + opacity: 0.3; + filter: alpha(opacity=30); + } + } + + &.layout-sidebar-dark { + background-color: $darkSidebarBgColor; + + @if variable-exists(menuBgImageDark) { + background-image: url("\#{resource['serenity-layout:images/special/#{$menuBgImageDark}']}"); + } + + .layout-menu { + li { + > a { + color: $darkMenuitemTextColor; + + &:hover { + background-color: $darkMenuitemHoverBgColor; + color: $darkMenuitemHoverTextColor; + + i { + color: $darkMenuitemHoverIconTextColor; + } + } + + i { + color: $darkMenuitemIconTextColor; + } + } + + &.active-menuitem { + > a { + color: $darksubMenuitemActiveTextColor; + + i { + color: $darksubMenuitemActiveIconTextColor; + } + } + } + } + + > li { + &.active-menuitem { + > a { + background-color: $darkMenuitemActiveBgColor; + color: $darkMenuitemActiveTextColor; + + i { + color: $darkMenuitemActiveIconTextColor; + } + } + + > ul { + background-color: $darkSubmenuBgColor; + } + } + } + } + } + } + + .layout-main { + margin-left: 60px; + @include transition(margin-left $transitionDuration); + @include box-sizing(border-box); + + .layout-topbar { + height: 64px; + background-color: $primaryColor; + padding: 16px 42px 16px 24px; + position: fixed; + width: calc(100% - 40px); + @include transition(width $transitionDuration); + @include multi-shadow(0 2px 4px 0 rgba(0, 0, 0, 0.2), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 4px 5px 0 rgba(0, 0, 0, 0.14)); + @include box-sizing(border-box); + z-index: 999997; + + .topbar-logo { + display: none; + } + + .menu-btn { + display: none; + color: $topbarIconColor; + float: left; + + i { + font-size: 32px; + } + } + + .topbar-menu-btn { + display: none; + color: $topbarIconColor; + float: right; + + i { + font-size: 32px; + } + } + + .mobile-logo { + display: none; + height: 48px; + margin-top: -8px; + } + + .layout-topbar-menu-wrapper { + .sidebar-logo { + display: none; + } + + .topbar-menu { + list-style-type: none; + margin: 0; + padding: 0; + vertical-align: middle; + margin: 0; + -webkit-animation-duration: 0s; + -moz-animation-duration: 0s; + animation-duration: 0s; + @include clearfix(); + + .topbar-badge { + width: 16px; + height: 16px; + text-align: center; + background-color: $accentColor; + color: $accentTextColor; + font-size: $fontSize - 2; + font-weight: 700; + line-height: 16px; + @include border-radius(50%); + } + + > li { + float: right; + position: relative; + margin-left: 20px; + + > a { + color: $topbarTextColor; + position: relative; + + .topbar-item-name { + display: none; + } + + i { + font-size: 32px; + color: $topbarTextColor; + @include transition(color $transitionDuration); + + &:hover { + color: darken($topbarTextColor, 10%); + } + } + + .topbar-badge { + position: absolute; + right: -4px; + top: -24px; + } + } + + &.profile-item { + float: left; + margin-left: 0; + padding-top: 4px; + + > a { + display: inline-block; + position: relative; + top: -10px; + color: $topbarTextColor; + + .profile-image-wrapper { + display: inline-block; + vertical-align: middle; + border: 2px solid transparent; + width: 40px; + height: 40px; + @include border-radius(50%); + @include transition(border-color $transitionDuration); + + img { + width: 40px; + height: 40px; + } + } + + .profile-name { + display: inline-block; + margin-left: 6px; + vertical-align: middle; + margin-top: -4px; + } + + &:hover { + .profile-image-wrapper { + border-color: $accentColor; + } + } + } + + > ul { + right: auto; + left: 5px; + + &:before { + left: 8px; + } + } + } + + &.search-item { + position: relative; + display: inline-block; + vertical-align: middle; + height: 40px; + @include box-sizing(border-box); + + input { + border: 0 none; + width: 150px; + padding: 6px 24px 6px 6px; + border-bottom: 1px solid $topbarTextColor; + @include transition(all $transitionDuration); + outline: 0 none; + color: $topbarTextColor; + + &:focus { + border-bottom-color: $primaryTextColor; + + label { + color: $topbarTextColor; + } + } + } + + i { + position: absolute; + right: 0; + top: 0; + color: $topbarTextColor; + font-size: 28px; + } + + label { + color: $topbarTextColor; + margin-top: 6px; + } + + input:focus ~ i { + color: $primaryTextColor; + } + } + + > ul { + position: absolute; + top: 60px; + right: 5px; + display: none; + width: 250px; + background-color: $topbarSubmenuBgColor; + -webkit-animation-duration: .5s; + -moz-animation-duration: .5s; + animation-duration: .5s; + list-style-type: none; + margin: 0; + padding: 8px 0; + border-top: 4px solid $primaryColor; + @include overlay-content-shadow(); + + a { + padding: 10px 10px 10px 10px; + display: block; + width: 100%; + box-sizing: border-box; + color: $textColor; + + i { + color: $textSecondaryColor; + margin-right: 8px; + } + + img { + margin-right: 8px; + } + + i,img,span { + vertical-align: middle; + display: inline-block; + } + + .topbar-submenuitem-badge { + background-color: $accentColor; + padding: 2px 4px; + display: block; + font-size: 12px; + @include border-radius($borderRadius); + color: $accentTextColor; + float: right; + } + + &:hover { + background-color: $topbarSubmenuHoverBgColor; + @include transition(background-color $transitionDuration); + + i { + color: $textColor; + } + } + } + + &:before { + width: 0; + height: 0; + border-left: 8px solid transparent; + border-right: 8px solid transparent; + border-bottom: 15px solid $primaryColor; + content: " "; + position: absolute; + top: -15px; + left: 232px; + } + } + + &.active-topmenuitem { + > ul { + display: block; + } + } + } + } + } + } + + .layout-breadcrumb { + background-color: $breadcrumbBgColor; + @include shadow(inset 0 -2px 4px 0 rgba(0, 0, 0, 0.14)); + min-height: 42px; + padding-top: 64px; + @include clearfix(); + + ul { + margin: 8px 0 0 0; + padding: 0 0 0 20px; + list-style: none; + color: $textSecondaryColor; + display: inline-block; + + li { + display: inline-block; + vertical-align: middle; + color: $textSecondaryColor; + + &:nth-child(even) { + font-size: 20px; + } + + &:first-child(even) { + color: $primaryColor; + } + + a { + color: $textSecondaryColor; + } + } + } + + .layout-breadcrumb-options { + float: right; + padding: 0px 20px 0 0; + height: 100%; + + a { + color: $textSecondaryColor; + display: inline-block; + width: 42px; + height: 42px; + line-height: 42px; + text-align: center; + @include transition(background-color $transitionDuration); + + &:hover { + background-color: $hoverBgColor; + } + + i { + line-height: inherit; + } + } + } + } + + .layout-content { + padding: 17px 17px 24px 17px; + } + + .layout-main-mask { + display: none; + } + + .layout-footer { + padding: 16px 24px; + border: 0 none; + border: 1px solid $dividerColor; + background: $footerBgColor; + + img { + margin-top: 5px; + width: 100px; + } + + .footer-text-right { + float: right; + margin-top: 10px; + + span { + vertical-align: middle; + } + } + } + } +} + +.layout-wrapper-static { + .layout-sidebar { + left: 0; + + .sidebar-logo { + .sidebar-anchor { + display: inline-block; + background-color: $primaryTextColor; + } + } + + .layout-menu { + li { + a { + i.layout-submenu-toggler { + display: inline-block; + } + + .menuitem-badge { + display: inline-block; + } + } + } + } + } + + .layout-main { + margin-left: 240px; + + .layout-topbar { + width: calc(100% - 240px); + } + } +} + +.layout-wrapper-static-restore { + .layout-sidebar { + @include transition(none); + } +} + +@media (max-width: $mobileBreakpoint) { + .layout-wrapper { + .layout-sidebar { + left: -240px; + + .sidebar-logo { + .sidebar-anchor { + display: none !important; + } + } + } + + .layout-main { + margin-left: 0; + left: 0; + @include transition(left $transitionDuration); + -webkit-transition-timing-function: cubic-bezier(0.86, 0, 0.07, 1); + transition-timing-function: cubic-bezier(0.86, 0, 0.07, 1); + + .layout-topbar { + width: 100%; + @include clearfix(); + text-align: center; + padding: 16px 24px; + + .menu-btn { + display: inline-block; + } + + .topbar-menu-btn { + display: inline-block; + } + + .mobile-logo { + display: inline; + } + + .layout-topbar-menu-wrapper { + + .topbar-menu { + display: none; + -webkit-animation-duration: .5s; + -moz-animation-duration: .5s; + animation-duration: .5s; + text-align: left; + @include overlay-shadow(); + + &:before { + width: 0; + height: 0; + border-left: 8px solid transparent; + border-right: 8px solid transparent; + border-bottom: 15px solid $primaryColor; + content: " "; + position: absolute; + top: -15px; + left: 232px; + } + + &.topbar-menu-active { + position: fixed; + top: 75px; + right: 30px; + width: 250px; + display: block; + padding: 8px 0; + background-color: $topbarMobileMenuBgColor; + border-top: 4px solid $primaryColor; + + > li { + float: none; + display: block; + margin: 0; + + > a { + padding: 8px 14px; + display: block; + color: $textColor; + + &:hover { + background-color: $hoverBgColor; + + i { + color: $textColor; + } + } + + i { + color: $textSecondaryColor; + display: inline-block; + vertical-align: middle; + margin-right: 8px; + } + + .topbar-item-name { + display: inline-block; + vertical-align: middle; + } + + .topbar-badge { + position: static; + float: right; + margin-top: 4px; + } + } + + > ul { + position: static; + @include no-shadow(); + padding: 0; + width: 100%; + border-top: 0 none; + @include box-sizing(border-box); + + &:before { + display: none; + } + + a { + padding-left: 28px; + } + } + + &.profile-item { + img { + width: 24px; + height: 24px; + } + } + } + } + + li { + a { + font-size: $fontSize; + + i { + font-size: 24px; + } + } + + &.search-item { + padding: 8px 14px; + + input { + padding: 2px 2px 1px 2px; + border-color: $textSecondaryColor; + border-width: 0 0 1px 0; + border-style: solid; + color: $textColor; + margin-left: 28px; + width: 85%; + + &:focus { + border-bottom-color: $primaryColor; + border-width: 0 0 2px 0; + width: 85%; + + ~ i { + color: $primaryColor; + } + + ~ label { + color: $primaryColor; + top: -15px; + } + } + } + + i { + color: $textSecondaryColor; + right: auto; + left: 0px; + } + + label { + color: $textSecondaryColor; + left: 32px; + margin-top: 0; + } + } + } + } + } + } + } + + &.layout-wrapper-active { + overflow: hidden; + + .layout-sidebar { + left: 0; + @include no-shadow(); + + .layout-menu { + li { + a { + i.layout-submenu-toggler { + display: inline-block; + } + + .menuitem-badge { + display: inline-block; + } + } + } + } + } + + .layout-main { + position: fixed; + left: 240px; + width: calc(100%); + @include shadow(inset 3px 0px 6px 1px rgba(0, 0, 0, 0.3)); + + .layout-topbar { + @include shadow(inset 3px 0px 6px 1px rgba(0, 0, 0, 0.3)); + } + + .layout-breadcrumb { + @include shadow(inset 3px 0px 6px 1px rgba(0, 0, 0, 0.3)); + + .layout-breadcrumb-options { + display: none; + } + } + } + + .layout-main-mask { + z-index: 999998; + position: absolute; + left: 0; + top: 0; + background-color: $contentMobileMaskBgColor; + display: block; + @include opacity(.5); + width: 100%; + height: 100%; + overflow: hidden; + } + } + } + + body { + &.hidden-overflow { + overflow: hidden; + } + } +} + +.layout-rtl { + + &.layout-wrapper { + + .layout-sidebar { + left: auto; + right: -180px; + @include transition(right .3s); + direction: rtl; + + .sidebar-logo { + direction: rtl; + + img { + margin-left: 0px; + margin-right: 12px; + } + + .sidebar-anchor { + float: left; + margin-right: 0px; + margin-left: 8px; + } + } + + .layout-menu { + direction: rtl; + + li { + > a { + i { + float: left; + right: auto; + left: 10px; + + &.layout-submenu-toggler { + right: auto; + left: 34px; + } + } + + .menuitem-badge { + right: auto; + left: 54px; + } + } + + ul { + li { + a { + padding-right: 20px; + padding-left: 0px; + } + + ul { + li { + a { + padding-right: 30px; + padding-left: 0px; + } + + ul { + li { + a { + padding-right: 40px; + padding-left: 0px; + } + } + + ul { + li { + a { + padding-right: 50px; + padding-left: 0px; + } + } + + ul { + li { + a { + padding-right: 60px; + padding-left: 0px; + } + } + + ul { + li { + a { + padding-right: 70px; + padding-left: 0px; + } + } + + ul { + li { + a { + padding-right: 80px; + padding-left: 0px; + } + } + } + } + } + } + } + } + } + } + } + } + + .menuitem-badge { + float: left; + margin-right: 0px; + margin-left: 6px; + } + } + + &.layout-sidebar-active { + left: auto; + right: 0px; + } + + .nano { + + .nano-pane { + right: auto; + left: 0; + } + } + } + + .layout-main { + margin-left: 0px; + margin-right: 60px; + @include transition(margin-right .3s); + + .layout-topbar { + .menu-btn { + float: right; + } + + .topbar-menu-btn { + float: left; + } + + .layout-topbar-menu-wrapper { + .topbar-menu { + > li { + float: left; + margin-left: 0px; + margin-right: 20px; + + > a { + .topbar-badge { + left: -4px; + right: auto; + } + } + + &.profile-item { + float: right; + margin-left: 0px; + margin-right: 0px; + + > a { + .profile-name { + margin-left: 0px; + margin-right: 6px; + margin-top: 13px; + float: left; + } + } + + > ul { + left: auto; + right: 5px; + direction: rtl; + text-align: right; + + &:before { + left: auto; + right: 8px; + } + } + } + + &.search-item { + direction: rtl; + + input { + padding: 6px 6px 6px 24px; + } + + i { + right: auto; + left: 0; + } + + label { + right: 5px; + left: auto; + } + } + + > ul { + left: 5px; + right: auto; + direction: rtl; + text-align: right; + + a { + i, img { + margin-right: 0px; + margin-left: 8px; + } + + .topbar-submenuitem-badge { + float: left; + } + } + + &:before { + left: auto; + right: 232px; + } + } + } + } + } + } + + .layout-breadcrumb { + direction: rtl; + + ul { + padding: 0 20px 0 0; + } + + .layout-breadcrumb-options { + float: left; + padding: 0px 0px 0 20px; + } + } + + .layout-footer { + direction: rtl; + + .footer-text-right { + float: left; + margin-top: 10px; + } + } + } + } + + &.layout-wrapper-static { + .layout-sidebar { + left: auto; + right: 0; + } + + .layout-main { + margin-left: 0px; + margin-right: 240px; + } + } + + &.layout-wrapper-static-restore { + .layout-sidebar { + @include transition(none); + } + } + + @media (max-width: $mobileBreakpoint) { + &.layout-wrapper { + .layout-sidebar { + left: auto; + right: -240px; + } + + .layout-main { + margin-right: 0px; + margin-left: 0px; + left: auto; + right: 0; + @include transition(right .3s); + + .layout-topbar { + + .layout-topbar-menu-wrapper { + + .topbar-menu { + direction: rtl; + text-align: right; + + &:before { + right: 232px; + left: auto; + } + + &.topbar-menu-active { + left: 30px; + right: auto; + + > li { + float: none; + margin: 0px; + + > a { + i { + margin-right: 0px; + margin-left: 8px; + } + + .topbar-badge { + float: left; + } + } + + > ul { + a { + padding-left: 0px; + padding-right: 28px; + } + } + } + } + + > li { + &.profile-item { + > a { + .profile-name { + float: none; + } + } + } + } + + li { + &.search-item { + input { + margin-left: 0px; + margin-right: 28px; + padding: 2px 2px 1px 2px; + } + + i { + left: auto; + right: 0px; + } + + label { + right: 32px; + left: auto; + } + } + } + } + } + } + } + + &.layout-wrapper-active { + .layout-sidebar { + right: 0; + left: auto; + } + + .layout-main { + left: auto; + right: 240px; + } + + .layout-main-mask { + left: auto; + right: 0; + } + } + } + } +} + + diff --git a/apc-web/src/main/webapp/resources/sass/layout/_utils.scss b/apc-web/src/main/webapp/resources/sass/layout/_utils.scss new file mode 100644 index 0000000..a0f5354 --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/layout/_utils.scss @@ -0,0 +1,169 @@ +/* Utils */ +.clearfix:after { + content:" "; + display:block; + clear:both; +} + +.card { + @include content-shadow(); + @include border-radius(2px); + background: #ffffff; + padding: 16px; + margin-bottom: 16px; + box-sizing: border-box; + + &.card-w-title { + padding-bottom: 32px; + } + + h1 { + font-size: 24px; + font-weight: 400; + margin: 24px 0; + + &:first-child { + margin-top: 16px; + } + } + + h2 { + font-size: 22px; + font-weight: 400; + } + + h3 { + font-size: 20px; + font-weight: 400; + } + + h4 { + font-size: 18px; + font-weight: 400; + } +} + +.nopad { + padding: 0; + + .ui-panel-content { + padding: 0; + } +} + +@-webkit-keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInDown { + from { + opacity: 0; + transform: translate3d(0, -20px, 0); + } + + to { + opacity: 1; + transform: none; + } +} + +@-webkit-keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } +} + +@keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } +} + +.fadeInDown { + -webkit-animation: fadeInDown 5s; /* Safari 4.0 - 8.0 */ + animation: fadeInDown 5s; +} + +.fadeOutUp { + -webkit-animation: fadeOutUp $transitionDuration; /* Safari 4.0 - 8.0 */ + animation: fadeOutUp $transitionDuration; +} + +.ui-shadow-1 { + -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); + -moz-box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); + box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); +} + +.ui-shadow-2 { + -webkit-box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); + -moz-box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); + box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); +} + +.ui-shadow-3 { + -webkit-box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23); + -moz-box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23); + box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23); +} + +.ui-shadow-4 { + -webkit-box-shadow: 0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22); + -moz-box-shadow: 0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22); + box-shadow: 0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22); +} + +.ui-shadow-5 { + -webkit-box-shadow: 0 19px 38px rgba(0,0,0,0.30), 0 15px 12px rgba(0,0,0,0.22); + -moz-box-shadow: 0 19px 38px rgba(0,0,0,0.30), 0 15px 12px rgba(0,0,0,0.22); + box-shadow: 0 19px 38px rgba(0,0,0,0.30), 0 15px 12px rgba(0,0,0,0.22); +} + +.ui-g { + -ms-flex-wrap: wrap; + + &.form-group { + > div { + padding: 12px 16px; + } + } +} + +.ui-panelgrid { + &.form-group { + .ui-panelgrid-cell { + padding: 12px 16px; + } + } +} + +.ui-selectoneradio, .ui-selectmanycheckbox { + &.form-group { + .ui-grid-row > div { + padding: 8px 16px; + } + } +} + diff --git a/apc-web/src/main/webapp/resources/sass/theme/_common.scss b/apc-web/src/main/webapp/resources/sass/theme/_common.scss new file mode 100644 index 0000000..07144c4 --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/theme/_common.scss @@ -0,0 +1,138 @@ +body { + .ui-widget, + .ui-widget .ui-widget { + font-family:$fontFamily; + text-decoration: none; + } + + .ui-widget-content { + background-color: $contentBgColor; + border: 1px solid $contentBorderColor; + padding: $contentPadding; + + .ui-icon { + color: $textSecondaryColor; + } + } + + .ui-widget-header { + background-color: $primaryColor; + color: $headerTextColor; + border: 1px solid $primaryColor; + padding: $headerPadding; + + .ui-icon { + color: $headerTextColor; + } + } + + .ui-state-active, .ui-state-highlight { + background-color: $accentColor; + color: $accentTextColor; + + .ui-icon { + color: $accentTextColor; + } + } + + .ui-state-disabled { + opacity: .35; + filter: Alpha(Opacity=35); + background-image: none; + } + + .ui-corner-all { + @include border-radius($borderRadius); + } + + .ui-corner-top { + @include border-radius-top($borderRadius); + } + + .ui-corner-bottom { + @include border-radius-bottom($borderRadius); + } + + .ui-corner-left { + @include border-radius-left($borderRadius); + } + + .ui-corner-right { + @include border-radius-right($borderRadius); + } + + .ui-widget-overlay { + background-color: #58575c; + @include opacity(.8); + } + + .ui-shadow { + + } + + .ui-icon { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: $iconFontSize; + display: inline-block; + width: $iconWidth; + height: $iconHeight; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + text-indent: 0; + overflow: visible; + + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + + /* Support for IE. */ + font-feature-settings: 'liga'; + } + + .material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + + /* Support for IE. */ + font-feature-settings: 'liga'; + } + + .fa { + font-family: 'FontAwesome'; + } + + a { + color: $primaryColor; + text-decoration: none; + } + +} \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/sass/theme/_data.scss b/apc-web/src/main/webapp/resources/sass/theme/_data.scss new file mode 100644 index 0000000..82dc389 --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/theme/_data.scss @@ -0,0 +1,779 @@ +body { + .ui-paginator { + padding: $paginatorPadding; + background-color: $primaryDarkColor; + + > a { + margin-top: -1px; + box-sizing: border-box; + color: #ffffff; + + span { + display: none; + } + + &.ui-state-hover { + background-color: $primaryLightColor; + @include border-radius(50%); + @include transition(background-color $transitionDuration); + } + } + + .ui-paginator-next { + padding: 0 6px; + vertical-align: middle; + @include material-icon("\e409"); + + &:before { + position: relative; + left: -6px; + } + } + + .ui-paginator-last { + padding: 0 6px; + vertical-align: middle; + @include material-icon("\e5dd"); + + &:before { + position: relative; + left: -6px; + } + } + + .ui-paginator-prev { + padding: 0 6px; + vertical-align: middle; + @include material-icon("\e408"); + + &:before { + position: relative; + left: -5px; + } + } + + .ui-paginator-first { + padding: 0 6px; + vertical-align: middle; + @include material-icon("\e5dc"); + + &:before { + position: relative; + left: -5px; + } + } + + .ui-paginator-pages { + vertical-align: middle; + margin: 0 6px 0 12px; + padding: 0; + + a { + color: $headerTextColor; + padding: 0; + width: 24px; + height: 24px; + line-height: 24px; + @include border-radius(50%); + @include transition(background-color $transitionDuration); + + &.ui-state-active { + color: $accentTextColor; + } + + &.ui-state-hover { + background-color: $primaryLightColor; + } + } + } + } + + .ui-datagrid { + .ui-datagrid-header { + padding: $headerPadding; + } + + .ui-panel { + .ui-panel-titlebar { + background-color: #ffffff; + color: $textColor; + border-color: $dividerColor; + } + } + } + + .ui-datalist { + .ui-datalist-header { + padding: $headerPadding; + } + } + + .ui-datatable { + .ui-datatable-header, + .ui-datatable-footer { + padding: $headerPadding; + + .ui-inputfield { + color: $inputBgColor; + + &:focus { + border-color: $inputBgColor; + } + } + } + + .ui-paginator { + padding: $paginatorPadding; + } + + thead { + th { + padding: $listItemPadding; + border: 0 none; + border-top: 1px solid $contentBorderColor; + background-color: #ffffff; + + &:first-child { + border-left: 1px solid $contentBorderColor; + } + + &:last-child { + border-right: 1px solid $contentBorderColor; + } + + &.ui-state-hover { + @include hover-element(); + } + + .ui-sortable-column-icon { + vertical-align: middle; + margin: -4px 0 0 0; + color: $textSecondaryColor; + + &.ui-icon-carat-2-n-s { + margin-left: 4px; + } + } + + .ui-column-resizer { + @include material-icon("\e86f"); + font-size: $fontSize + 2; + color: $textSecondaryColor; + } + + &.ui-state-active,&.ui-state-highlight { + background-color: $accentColor; + color: $accentTextColor; + border-top-color: $accentColor; + + .ui-icon { + color: $accentTextColor; + } + + .ui-inputfield { + color: $accentTextColor; + + &.ui-state-focus { + border-color: $accentTextColor; + } + } + } + } + + tr { + th { + border: 1px solid $contentBorderColor; + } + } + } + + tfoot { + td { + padding: $listItemPadding; + border: 1px solid $contentBorderColor; + background-color: $contentBgColor; + } + } + + tbody { + tr.ui-datatable-even { + background-color: $dataTableRowBgColorEven; + + &.ui-state-hover { + @include hover-element(); + } + + &.ui-state-highlight { + background-color: $accentColor; + color: $accentTextColor; + } + } + + tr { + td { + border: 1px solid $contentBorderColor; + padding: $listItemPadding; + + .ui-row-toggler { + display: inherit; + } + + &.ui-state-highlight { + .ui-inputfield { + color: $inputBgColor; + border-color: $inputBgColor; + + &:focus { + border-color: $inputBgColor; + } + } + } + + &.ui-state-error { + background-color: #e62a10; + border-color: #e62a10; + color: #ffffff; + } + } + + &.ui-widget-content { + border: 0 none; + } + + &.ui-state-highlight { + background-color: $accentColor; + color: $accentTextColor; + } + + .ui-cell-editor-input { + input { + color: $accentTextColor; + } + } + } + + tr.ui-state-hover { + @include hover-element(); + } + + tr.ui-state-error { + background-color: #e62a10; + border-color: #e62a10; + color: #ffffff; + + .ui-inputfield, + .ui-inputfield.ui-state-error { + border-color: #ffffff; + } + } + + tr.ui-state-highlight { + td { + border-right-color: $accentDarkColor; + + &:last-child { + border-right-color: $contentBorderColor; + } + + &.ui-selection-column { + .ui-radiobutton-box { + border-color: $accentTextColor; + background-color: transparent; + + .ui-radiobutton-icon { + background-color: $accentTextColor; + } + } + + .ui-chkbox-box { + border-color: $accentTextColor; + background-color: transparent; + + .ui-chkbox-icon { + color: $accentTextColor; + margin-left: -3px; + } + } + } + } + + .ui-inputfield { + color: $inputBgColor; + border-color: $inputBgColor; + + &:focus { + border-color: $inputBgColor; + } + } + } + } + + > .ui-icon-arrowthick-1-s { + font-size: 18px; + color: $accentColor; + } + + > .ui-icon-arrowthick-1-n { + display: none !important; + } + + &.ui-datatable-scrollable { + .ui-datatable-scrollable-header, .ui-datatable-scrollable-footer { + border: 0 none; + background-color: transparent; + padding: 0px; + + .ui-datatable-data { + tr { + &.ui-widget-content { + padding: 0px; + } + } + + td { + color: $textColor; + } + } + } + + thead { + tr { + th { + color: $textColor; + font-size: $fontSize; + } + } + } + + tfoot { + tr { + td { + color: $textColor; + font-size: $fontSize; + } + } + } + } + } + + .ui-draggable-dragging.ui-state-default { + background-color: $primaryColor; + } + + .ui-picklist { + .ui-picklist-list { + padding: 0; + } + + .ui-picklist-caption { + padding: $headerPadding; + } + + li.ui-picklist-item { + padding: $listItemPadding; + margin: 0; + @include border-radius(0px); + + &.ui-state-hover { + @include hover-element(); + } + } + + .ui-picklist-buttons { + width: 48px; + + .ui-button { + &.ui-button-icon-only { + width: 32px; + margin-right: 0; + display: inline-block; + margin-bottom: 4px; + } + } + } + + .ui-picklist-buttons-cell { + text-align: center; + } + + .ui-picklist-filter-container { + margin-bottom: 4px; + + .ui-picklist-filter { + width: 100%; + } + + .ui-icon { + color: $textSecondaryColor; + top: 0px; + } + } + + &.ui-picklist-responsive { + .ui-picklist-buttons { + width: 48px; + + .ui-button { + &.ui-button-icon-only { + margin: 0 auto; + display: block; + margin-bottom: 8px; + } + } + } + + .ui-picklist-list { + .ui-picklist-item { + .ui-chkbox { + margin-right: 8px; + vertical-align: top; + } + + .ui-chkbox,.ui-chkbox * { + box-sizing: content-box; + } + } + } + + .ui-chkbox-box { + width: $iconWidth - 6px; + height: $iconHeight - 6px; + } + } + } + + .ui-orderlist { + .ui-orderlist-caption { + padding: $headerPadding; + @include border-box-sizing(); + } + + .ui-orderlist-list { + padding: 0; + box-sizing: border-box; + + li.ui-orderlist-item { + padding: $listItemPadding; + margin: 0; + @include border-radius(0px); + + &.ui-state-hover { + @include hover-element(); + } + } + } + + .ui-orderlist-controls { + width: 60px; + text-align: center; + + .ui-button { + &.ui-button-icon-only { + width: 32px; + margin: 0 0 8px 0; + display: inline-block; + } + } + } + } + + .ui-carousel { + padding: 0; + border: 0 none; + + .ui-carousel-header { + margin: 0; + + .ui-icon { + color: $headerTextColor; + } + + .ui-carousel-dropdown, + .ui-carousel-mobile-dropdown { + margin: 5px 10px; + } + } + + .ui-carousel-footer { + margin: 0; + padding: $headerPadding - 2px; + font-size: $fontSize - 2px; + } + + .ui-carousel-page-links { + margin-top: 2px; + } + } + + .ui-tree { + padding: 4px 7px; + + .ui-treenode-children { + padding-left: 28px; + } + + .ui-treenode-leaf-icon { + width: 23px; + } + + .ui-tree-container { + overflow: visible; + } + + .ui-treenode-content { + + .ui-chkbox { + margin: 0 4px 0 4px; + + .ui-icon { + color: #757575; + } + } + + .ui-tree-toggler { + vertical-align: middle; + } + + .ui-treenode-icon { + vertical-align: middle; + margin: 0 4px 0 4px; + } + + .ui-treenode-label { + padding: 0 4px; + margin: 0; + vertical-align: middle; + } + } + + .ui-tree-droppoint.ui-state-hover { + background-color: $accentColor; + } + + &.ui-tree-horizontal { + padding-left: 0; + padding-right: 0; + + .ui-treenode-content { + background-color: $contentBgColor; + border: 1px solid $contentBorderColor; + + .ui-tree-toggler { + vertical-align: middle; + } + + .ui-treenode-icon { + vertical-align: middle; + margin-right: 4px; + } + + &.ui-state-highlight { + background-color: $accentColor; + color: $accentTextColor; + + .ui-chkbox-box { + border-color: $accentTextColor; + + .ui-chkbox-icon { + color: $accentTextColor; + } + } + } + } + } + } + + .ui-tree-draghelper { + border: 1px solid $primaryColor; + } + + .fc { + .fc-button-group { + .ui-icon { + margin-top: 3px; + } + + .ui-state-active { + background-color: $accentColor; + color: $accentTextColor; + } + } + + .fc-event { + background-color: $primaryLightColor; + color: $primaryTextColor; + } + + table { + box-sizing: border-box; + } + + div.ui-widget-content { + padding-left: 0px; + padding-right: 0px; + } + } + + .ui-treetable { + .ui-treetable-header, + .ui-treetable-footer { + padding: $headerPadding; + } + + thead { + th { + background-color: $contentBgColor; + padding: $listItemPadding; + border: 0 none; + border-top: 1px solid $contentBorderColor; + + .ui-icon { + color: $textSecondaryColor; + } + + &:first-child { + border-left: 1px solid $contentBorderColor; + } + + &:last-child { + border-right: 1px solid $contentBorderColor; + } + + &.ui-state-hover { + @include hover-element(); + } + + .ui-sortable-column-icon { + vertical-align: middle; + margin: -4px 0 0 0; + color: $textSecondaryColor; + + &.ui-icon-carat-2-n-s { + margin-left: 4px; + } + } + + &.ui-state-active { + background-color: $accentColor; + color: $accentTextColor; + + .ui-icon { + color: $accentTextColor; + } + } + + .ui-column-resizer { + @include material-icon("\e86f"); + font-size: 16px; + color: $textSecondaryColor; + } + } + } + + tr { + th { + border: 1px solid $contentBorderColor; + } + } + + tfoot { + td { + border: 0 none; + padding: 10px 14px; + } + } + + tbody { + tr { + td { + border: 1px solid $contentBorderColor; + padding: $listItemPadding; + + .ui-treetable-toggler { + display: inline-block; + vertical-align: middle; + margin: 0 4px; + float: none; + } + + .ui-chkbox { + margin-right: 8px; + + .ui-chkbox-icon { + color: $textSecondaryColor; + } + } + } + + &.ui-state-hover { + @include hover-element(); + } + + &.ui-state-highlight { + .ui-chkbox { + .ui-chkbox-box { + border-color: $accentTextColor; + + .ui-icon { + color: $accentTextColor; + } + } + } + } + } + } + + &.ui-treetable-scrollable { + .ui-treetable-scrollable-header, .ui-treetable-scrollable-footer { + background-color: transparent; + border: 0 none; + padding: 0px; + } + + thead { + th { + background-color: #ffffff; + color: $textColor; + border-bottom: 1px solid $dividerColor; + border-top: 1px solid $dividerColor; + + &.ui-state-active { + background-color: $accentColor; + color: $accentTextColor; + } + } + + &.ui-treetable-scrollable-theadclone { + th { + padding-bottom: 0px; + padding-top: 0px; + line-height: 0px; + border-top: 0 none; + } + } + } + + tbody { + &.ui-widget-content { + padding: 0px; + } + + tr { + &.ui-widget-content { + padding: 0px; + } + } + } + } + } + + .ui-panelgrid { + tbody { + tr { + &.ui-widget-content { + border: 1px solid #d8d8d8; + } + } + } + } +} \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/sass/theme/_forms.scss b/apc-web/src/main/webapp/resources/sass/theme/_forms.scss new file mode 100644 index 0000000..2db5c6a --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/theme/_forms.scss @@ -0,0 +1,1419 @@ +body { + .ui-inputfield { + background: white no-repeat; + background-image: linear-gradient(to bottom, #1B4159, #1B4159), linear-gradient(to bottom, #bdbdbd, #bdbdbd); + background-size: 0 2px, 100% 1px; + background-position: 50% 100%, 50% 100%; + transition: background-size 0.3s cubic-bezier(0.64, 0.09, 0.08, 1); + border-width: 0; + padding: 2px 2px 2px 2px; + font-size: $fontSize; + @include border-radius(0px); + + &.ui-state-focus { + border-width: 0; + background-size: 100% 2px, 100% 1px; + outline: none; + padding-bottom: 2px; + } + + &.ui-state-disabled { + border-bottom: 1px dotted; + } + + &.ui-widget-content { + border-width: 1px; + background: transparent; + background-image: none; + } + + &.ui-state-error { + border-color: $inputInvalidBorderColor; + } + } + + .ui-inputfield:-webkit-autofill { + border-color: #bdbdbd; + border-style: solid; + border-width: 0px 0px 1px 0px; + + &.ui-state-focus { + padding-bottom: 0px; + } + } + + .md-inputfield { + display: block; + position:relative; + + input:focus ~ label, + input.ui-state-filled ~ label, + textarea:focus ~ label, + textarea.ui-state-filled ~ label, + .md-inputwrapper-focus ~ label, + .md-inputwrapper-filled ~ label { + top:-20px; + font-size:12px; + color:$primaryColor; + } + + input:-webkit-autofill ~ label { + top:-20px; + font-size:12px; + color:$primaryColor; + } + + label { + color:#999; + font-weight:normal; + position:absolute; + pointer-events:none; + left:5px; + top:1px; + transition: $transitionDuration ease all; + -moz-transition: $transitionDuration ease all; + -webkit-transition: $transitionDuration ease all; + } + + input.ui-state-error ~ label { + color: $inputErrorTextColor; + } + } + + .ui-selectonelistbox { + background-color: $inputBgColor; + border: 0 none; + @include border-radius($borderRadius); + + &.ui-inputfield { + padding: 0; + } + + .ui-selectlistbox-list { + padding: 0; + border: 1px solid $contentBorderColor; + } + + .ui-selectlistbox-item { + overflow: hidden; + padding: $listItemPadding; + margin: 0; + @include rippleitem(); + @include transition(background-color $transitionDuration); + @include border-radius(0); + + &.ui-state-hover { + @include hover-element(); + } + } + + .ui-selectlistbox-filter-container { + margin: 0; + padding: $inputHeaderPadding; + background-color: $primaryColor; + @include border-radius-top($borderRadius); + + .ui-inputfield { + border-color: darken($headerTextColor, 15%); + color: $headerTextColor; + width: 100%; + padding-left: 2px; + padding-right: $iconWidth; + @include border-box-sizing(); + + &.ui-state-focus { + border-color: $headerTextColor; + } + } + + .ui-icon { + color: $headerTextColor; + top: 6px; + right: 12px; + } + } + } + + .ui-multiselectlistbox { + .ui-multiselectlistbox-header { + padding: $inputHeaderPadding; + position: relative; + bottom: -1px; + } + + .ui-multiselectlistbox-list { + padding: 0; + background-color: $contentBgColor; + } + + li.ui-multiselectlistbox-item { + padding: $listItemPadding; + margin: 0; + @include rippleitem(); + @include transition(background-color $transitionDuration); + @include border-radius(0px); + + &.ui-state-hover { + @include hover-element(); + } + } + } + + .ui-button { + overflow: hidden; + background-color: $primaryColor; + color: $buttonTextColor; + height: 30px; + padding: 0 14px; + border: 0 none; + -moz-box-shadow: 0 1px 2.5px 0 rgba(0, 0, 0, 0.26), 0 1px 5px 0 rgba(0, 0, 0, 0.16); + -webkit-box-shadow: 0 1px 2.5px 0 rgba(0, 0, 0, 0.26), 0 1px 5px 0 rgba(0, 0, 0, 0.16); + box-shadow: 0 1px 2.5px 0 rgba(0, 0, 0, 0.26), 0 1px 5px 0 rgba(0, 0, 0, 0.16); + @include transition(background-color $transitionDuration); + + &.ui-state-hover { + background-color: $primaryDarkColor; + } + + &.ui-state-focus { + outline: 0 none; + background-color: lighten($primaryColor,10%); + } + + .ui-button-text { + padding: 0; + line-height: 30px; + font-size: $fontSize; + } + + .ui-icon { + color: #ffffff; + } + + &.ui-button-icon-only { + @include border-radius(50%); + width: 30px; + height: 30px; + + .ui-icon { + margin-top: -1 * $iconWidth / 2; + margin-left: -1 * $iconHeight / 2; + } + } + + &.ui-button-text-icon-left, + &.ui-button-text-icon-right { + .ui-icon { + margin-top: -1 * $iconWidth / 2; + } + } + + &.ui-button-text-icon-left { + padding-left: 36px; + } + + &.ui-button-text-icon-right { + padding-right: 36px; + } + + &.secondary-btn { + background-color: $accentColor; + color: $accentTextColor; + + &.ui-state-hover { + background-color: $accentDarkColor; + } + + &.ui-state-focus { + outline: 0 none; + background-color: lighten($accentColor,10%); + } + + .ui-icon { + color: $accentTextColor; + } + } + + &.blue-grey-btn { + background-color: #607D8B; + + &.ui-state-hover { + background-color: #37474F; + } + + &.ui-state-focus { + outline: 0 none; + background-color: lighten(#607D8B,10%); + } + } + + &.cyan-btn { + background-color: #00BCD4; + + &.ui-state-hover { + background-color: #00838F; + } + + &.ui-state-focus { + outline: 0 none; + background-color: lighten(#00BCD4,10%); + } + } + + &.teal-btn { + background-color: #009688; + + &.ui-state-hover { + background-color: #00695C; + } + + &.ui-state-focus { + outline: 0 none; + background-color: lighten(#009688,10%); + } + } + + &.red-btn { + background-color: #F44336; + + &.ui-state-hover { + background-color: #C62828; + } + + &.ui-state-focus { + outline: 0 none; + background-color: lighten(#F44336,10%); + } + } + + &.green-btn { + background-color: #4384D9; + + &.ui-state-hover { + background-color: #2E7D32; + } + + &.ui-state-focus { + outline: 0 none; + background-color: lighten(#4384D9,10%); + } + } + + &.deep-orange-btn { + background-color: #FF5722; + + &.ui-state-hover { + background-color: #D84315; + } + + &.ui-state-focus { + outline: 0 none; + background-color: lighten(#FF5722,10%); + } + } + + &.purple-btn { + background-color: #673AB7; + + &.ui-state-hover { + background-color: #4527A0; + } + + &.ui-state-focus { + outline: 0 none; + background-color: lighten(#673AB7,10%); + } + } + + &.pink-btn { + background-color: #E91E63; + + &.ui-state-hover { + background-color: #AD1457; + } + + &.ui-state-focus { + outline: 0 none; + background-color: lighten(#E91E63,10%); + } + } + + &.amber-btn { + background-color: #FFC107; + color: #212121; + + &.ui-state-hover { + background-color: #FF8F00; + } + + &.ui-state-focus { + outline: 0 none; + background-color: lighten(#FFC107,10%); + } + } + + &.orange-btn { + background-color: #FF9800; + + &.ui-state-hover { + background-color: #EF6C00; + } + + &.ui-state-focus { + outline: 0 none; + background-color: lighten(#FF9800,10%); + } + } + + &.brown-btn { + background-color: #795548; + + &.ui-state-hover { + background-color: #4E342E; + } + + &.ui-state-focus { + outline: 0 none; + background-color: lighten(#795548,10%); + } + } + + &.flat { + @include no-shadow(); + } + } + + .ui-buttonset { + .ui-state-active { + background-color: $accentColor; + color: $accentTextColor; + } + } + + .ui-splitbutton { + @include border-radius($borderRadius); + -moz-box-shadow: 0 1px 2.5px 0 rgba(0, 0, 0, 0.26), 0 1px 5px 0 rgba(0, 0, 0, 0.16); + -webkit-box-shadow: 0 1px 2.5px 0 rgba(0, 0, 0, 0.26), 0 1px 5px 0 rgba(0, 0, 0, 0.16); + box-shadow: 0 1px 2.5px 0 rgba(0, 0, 0, 0.26), 0 1px 5px 0 rgba(0, 0, 0, 0.16); + + > .ui-button { + @include no-shadow(); + + &.ui-state-active { + background-color: lighten($primaryColor,10%); + } + } + + .ui-splitbutton-menubutton { + height: 30px; + @include border-radius-left(0); + @include border-radius-right(3px); + } + } + + .ui-selectbooleanbutton { + &.ui-state-active { + background-color: $accentColor; + color: $accentTextColor; + + .ui-icon { + color: $accentTextColor; + } + } + } + + .ui-chkbox { + display: inline-block; + vertical-align: middle; + width: $iconWidth - 2px; + height: $iconHeight - 2px; + cursor: default; + margin: 0 4px 0 0; + + .ui-chkbox-box { + border: 2px solid $checkboxBorderColor; + width: $iconWidth - 6px; + height: $iconHeight - 6px; + + @include transition(background-color $transitionDuration); + + .ui-chkbox-icon { + font-size: $fontSize + 4; + margin-left: -2px; + margin-top: -2px; + } + + &.ui-state-active { + border-color: $primaryColor; + background-color: $primaryColor; + + .ui-chkbox-icon { + color: $primaryTextColor; + } + + &.ui-state-focus { + .ui-chkbox-icon { + color: $primaryTextColor; + } + } + } + + &.ui-state-focus { + border-color: $primaryColor; + @include content-shadow(); + @include transition(box-shadow $transitionDuration); + + .ui-chkbox-icon { + color: $primaryColor; + } + } + } + } + + .ui-radiobutton { + position: relative; + margin: 0 4px 0 0; + display: inline-block; + vertical-align: middle; + + .ui-radiobutton-box { + width: $fontSize -1px; + height: $fontSize -1px; + border: 2px solid $radioButtonBorderColor; + @include transition(box-shadow $transitionDuration); + @include border-radius(50%); + + &.ui-state-focus { + @include content-shadow(); + } + + &.ui-state-active { + border-color: $primaryColor; + background-color: transparent; + } + + .ui-radiobutton-icon { + top: 0; + left: 0; + width: 20px; + height: 20px; + display: block; + box-sizing: border-box; + position: absolute; + @include border-radius(50%); + transition: -webkit-transform ease .28s; + transition: transform ease .28s; + -webkit-transform: scale(0); + transform: scale(0); + } + + .ui-icon-bullet { + background-color: $primaryColor; + -webkit-transform: scale(0.5); + transform: scale(0.5); + margin-left: 0; + } + } + } + + .ui-selectmanycheckbox, .ui-selectoneradio { + &.ui-widget { + label { + display: inline-block; + vertical-align: middle; + margin-top: 0; + } + } + } + + .ui-autocomplete-panel { + padding: 0; + border: 0 none; + @include border-radius(0); + + &.ui-shadow { + @include overlay-input-shadow(); + } + + .ui-autocomplete-list { + padding: 0; + + .ui-autocomplete-item { + padding: $listItemPadding; + margin: 0; + @include border-radius(0); + @include transition(background-color $transitionDuration); + + .ui-autocomplete-query { + font-weight: 700; + } + } + + .ui-autocomplete-group { + padding: $listItemPadding; + } + } + } + + .ui-autocomplete { + .ui-autocomplete-dropdown { + right: 0; + margin-right: 0; + + &.ui-button.ui-button-icon-only { + background-color: transparent; + @include no-shadow(); + height: 20px; + width: 20px; + padding: 0; + + .ui-button-text { + display: none; + } + + .ui-icon { + color: $textSecondaryColor; + } + } + } + + &.ui-autocomplete-multiple { + .ui-autocomplete-multiple-container { + &.ui-inputfield { + @include border-box-sizing(); + padding: 2px 2px 1px 2px; + } + + &.ui-state-focus { + padding-bottom: 0; + } + } + + .ui-autocomplete-input-token { + float: none; + display: inline-block; + margin: 0 1px; + vertical-align: middle; + + > input { + padding: 0; + font-size: $fontSize; + margin: 0; + } + } + + .ui-autocomplete-token { + display: inline-block; + float: none; + vertical-align: middle; + + .ui-autocomplete-token-icon { + margin-top: -10px; + } + } + } + } + + .ui-selectonemenu { + border-width: 0; + background: white no-repeat; + background-image: linear-gradient(to bottom, #3F51B5, #3F51B5), linear-gradient(to bottom, #bdbdbd, #bdbdbd); + background-size: 0 2px, 100% 1px; + background-position: 50% 100%, 50% 100%; + transition: background-size 0.3s cubic-bezier(0.64, 0.09, 0.08, 1); + padding-bottom: 2px; + box-sizing: border-box; + @include border-radius(0); + + &.ui-state-focus { + border-width: 0; + background-size: 100% 2px, 100% 1px; + outline: none; + padding-bottom: 2px; + } + + .ui-selectonemenu-trigger { + height: $iconHeight; + width: $iconWidth; + font-size: $iconFontSize; + margin-top: 0; + padding: 0; + top: 0; + margin-right: 0; + + .ui-icon { + height: $iconHeight; + width: $iconWidth; + margin-top: 0; + color: $textSecondaryColor; + } + } + + .ui-selectonemenu-label { + &.ui-inputfield { + background: none; + font-family: $fontFamily; + } + } + } + + .ui-selectonemenu-panel { + padding: 0; + @include border-radius(0); + + .ui-selectonemenu-list { + padding: 0; + } + + .ui-selectonemenu-item { + margin: 0; + padding: $listItemPadding; + @include transition(background-color $transitionDuration); + @include border-radius(0); + + &.ui-state-hover { + @include hover-element(); + } + } + + .ui-selectonemenu-item-group { + padding: 8px; + } + + &.ui-shadow { + @include overlay-input-shadow(); + } + + .ui-selectonemenu-filter-container { + .ui-icon { + top: 5px; + right: 8px; + } + } + } + + .ui-selectcheckboxmenu { + border-bottom: 1px solid $inputBorderColor; + @include border-box-sizing(); + @include border-radius(0); + + .ui-selectcheckboxmenu-label-container { + display: block; + + .ui-selectcheckboxmenu-label { + padding-top: 2px; + padding-bottom: 1px; + padding-left: 2px; + } + } + + .ui-selectcheckboxmenu-trigger { + height: $iconHeight; + width: $iconWidth; + font-size: $iconFontSize; + padding: 0; + + .ui-icon { + height: $iconHeight; + width: $iconWidth; + margin-top: 0; + color: $textSecondaryColor; + } + } + } + + .ui-selectcheckboxmenu-panel { + padding: 0; + border: 0 none; + @include border-radius(0); + @include overlay-input-shadow(); + + .ui-selectcheckboxmenu-header { + padding: $inputHeaderPadding; + margin: 0; + @include border-radius(0); + + .ui-chkbox { + float: none; + margin: 0 8px 0 1px; + + .ui-chkbox-box { + border-color: $headerTextColor; + + .ui-chkbox-icon { + border-color: $headerTextColor; + } + + &.ui-state-active { + .ui-chkbox-icon { + border-color: $headerTextColor; + } + } + + &.ui-state-focus { + background-color: $primaryLightColor; + @include transition(background-color $transitionDuration); + } + } + } + + .ui-selectcheckboxmenu-filter-container { + width: 70%; + display: inline-block; + vertical-align: middle; + float: none; + + .ui-icon { + top: -2px; + right: 0px; + color: $headerTextColor; + } + + .ui-inputfield { + border-color: darken($headerTextColor, 15%); + padding-right: 30px; + width: 100%; + border-color: $headerTextColor; + @include border-box-sizing(); + + &:focus { + border-color: $headerTextColor; + } + } + } + + .ui-selectcheckboxmenu-close { + margin-right: -6px; + + span { + color: #ffffff; + @include transition(color $transitionDuration); + } + + &.ui-state-hover { + padding: 1px; + + span { + color: $accentColor; + } + } + } + } + + .ui-selectcheckboxmenu-items-wrapper { + padding: 0; + + .ui-selectcheckboxmenu-items { + padding: 0; + } + } + + .ui-selectcheckboxmenu-item { + padding: $listItemPadding; + + label { + vertical-align: middle; + display: inline-block; + } + + .ui-chkbox { + margin-left: 2px; + } + } + } + + .ui-fluid { + .ui-selectonemenu { + .ui-selectonemenu-trigger { + width: $iconWidth; + padding: 0; + } + } + } + + #keypad-div { + @include border-radius(0); + + .keypad-key { + border: 0 none; + background-color: #ffffff; + font-size: $fontSize; + padding: 4px; + @include border-radius(50%); + @include transition(background-color $transitionDuration); + + &.ui-state-hover { + @include hover-element(); + } + } + + .keypad-shift, .keypad-enter, .keypad-spacebar, .keypad-back, .keypad-close, .keypad-clear { + @include border-radius(0); + background-color: $primaryColor; + color: #ffffff; + + &.ui-state-hover { + background-color: $primaryDarkColor; + color: #ffffff; + } + } + + &.ui-shadow { + @include overlay-input-shadow(); + } + } + + .ui-selectmanymenu { + padding: 0; + background-color: $inputBgColor; + @include border-radius($borderRadius); + + .ui-selectlistbox-item { + padding: $listItemPadding; + margin: 0; + position: relative; + overflow: hidden; + @include border-radius(0); + + &.ui-state-hover { + @include hover-element(); + } + + .ui-chkbox { + background-color: transparent; + margin: -2px 8px 0 0; + + .ui-chkbox-box { + &.ui-state-active { + border-color: #ffffff; + background-color: $accentColor; + } + } + } + } + + .ui-selectlistbox-filter-container { + margin: 0; + padding: $inputHeaderPadding; + background-color: $primaryColor; + @include border-radius-top($borderRadius); + + .ui-inputfield { + border-color: darken($headerTextColor, 15%); + color: $headerTextColor; + width: 100%; + padding-left: 2px; + padding-right: $iconWidth; + @include border-box-sizing(); + + &.ui-state-focus { + border-color: $headerTextColor; + } + } + + .ui-icon { + color: $headerTextColor; + top: 6px; + right: 12px; + } + } + + tr { + &.ui-selectlistbox-item { + td { + padding: 6px; + } + } + } + } + + .ui-spinner { + .ui-spinner-button { + width: 18px; + height: 10px; + padding: 0; + margin-right: 0; + background-color: transparent; + color: $textColor; + z-index: auto; + @include no-shadow(); + + .ui-icon-triangle-1-n { + color: $textColor; + } + + .ui-icon-triangle-1-s { + color: $textColor; + } + + .ui-icon { + top: 0px; + height: 12px; + color: $textSecondaryColor; + } + } + + .ui-spinner-up { + .ui-icon { + top: 4px; + } + } + + .ui-spinner-down { + .ui-icon { + top: 2px; + } + } + + .ui-spinner-input { + padding-right: 30px; + } + } + + .ui-fluid { + .ui-spinner { + .ui-spinner-button { + width: 25px; + height: 10px; + } + + .ui-spinner-input { + padding-right: 30px; + } + } + } + + .ui-inputswitch { + height: 14px; + width: 34px !important; + overflow: visible; + background-color: rgb(158,158,158); + border-color: rgb(158,158,158); + padding: 0; + @include border-radius(8px); + + .ui-inputswitch-handle { + top: -3px; + background-color: #ffffff; + @include border-radius(50%); + @include transition(background-color $transitionDuration); + width: 20px !important; + height: 20px !important; + -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0px 1px 3px 0px, rgba(0, 0, 0, 0.137255) 0px 1px 1px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 1px -1px; + -moz-box-shadow: rgba(0, 0, 0, 0.2) 0px 1px 3px 0px, rgba(0, 0, 0, 0.137255) 0px 1px 1px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 1px -1px; + box-shadow: rgba(0, 0, 0, 0.2) 0px 1px 3px 0px, rgba(0, 0, 0, 0.137255) 0px 1px 1px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 1px -1px; + } + + .ui-inputswitch-on { + visibility: hidden; + } + + .ui-inputswitch-off, .ui-inputswitch-on { + span { + visibility: hidden; + } + } + + &.ui-inputswitch-checked { + background-color: $accentLightColor; + border-color: $accentLightColor; + + .ui-inputswitch-handle { + background-color: $accentColor; + color: $accentTextColor; + } + } + } + + .ui-slider { + padding: 0; + + .ui-slider-handle { + background-color: $accentColor; + color: $accentTextColor; + @include border-radius(50%); + width: 20px; + height: 20px; + transform: scale(.7); + @include transition(all .4s cubic-bezier(.25,.8,.25,1)); + + &.ui-state-hover, + &.ui-state-focus { + transform: scale(1); + } + + &:focus { + outline: 0 none; + } + } + + &.ui-slider-horizontal { + height: 2px; + border: 0 none; + background-color: #bdbdbd; + + .ui-slider-handle { + top: -.65em; + } + } + + &.ui-slider-vertical { + width: 2px; + border: 0 none; + background-color: #bdbdbd; + + .ui-slider-handle { + left: -9px; + } + } + + .ui-slider-range { + padding: 0; + background-color: $accentColor; + color: $accentTextColor; + } + } + + .ui-calendar { + .ui-datepicker-trigger { + top: 7px; + right: 28px; + background-color: transparent; + color: $textColor; + height: $iconHeight; + width: $iconWidth; + @include no-shadow(); + @include border-radius(0); + + .ui-icon { + color: $textSecondaryColor; + } + } + } + + .ui-datepicker { + padding: 0; + width: 275px; + + &.ui-shadow { + @include overlay-input-shadow(); + } + + .ui-datepicker-header { + padding: $headerPadding; + background: $primaryDarkColor; + border-color: $primaryDarkColor; + @include border-radius-top(2px); + @include border-radius-bottom(0); + + .ui-datepicker-next { + cursor: pointer; + top: 8px; + font-size: $iconFontSize; + right: 8px; + color: #ffffff; + @include material-icon("\e039"); + + .ui-icon { + display: none; + } + + &.ui-datepicker-next-hover { + right: 8px; + } + } + + .ui-datepicker-prev { + cursor: pointer; + top: 8px; + font-size: $iconFontSize; + @include material-icon("\e039"); + @include rotate(180deg); + left: 8px; + color: #ffffff; + + .ui-icon { + display: none; + } + + &.ui-datepicker-prev-hover { + left: 8px; + } + } + } + + table { + table-layout: fixed; + border-spacing: 0; + border-collapse: collapse; + } + + thead { + tr { + color: #ffffff; + background: $primaryColor; + } + } + + tbody { + td { + padding: 2px; + box-sizing: border-box; + + a,span { + padding: .2em; + margin: 0; + text-align: center; + color: $textColor; + display: inline-block; + height: 28px; + width: 28px; + line-height: 28px; + @include border-radius(50%); + + &.ui-state-hover { + @include hover-element(); + } + + &.ui-state-active { + color: #ffffff; + background-color: $accentColor; + color: $accentTextColor; + } + } + + &.ui-datepicker-today { + a,span { + color: $textColor; + background-color: #ffffff; + border: 1px solid $accentColor; + + &.ui-state-active { + color: #ffffff; + background-color: $accentColor; + color: $accentTextColor; + } + } + } + } + } + + &.ui-datepicker-multi { + .ui-datepicker-header { + @include border-radius(0); + } + + .ui-datepicker-group { + table { + width: 100%; + @include border-box-sizing(); + } + } + } + + .ui-timepicker-div { + .ui_tpicker_time { + input { + border-color: #bdbdbd; + @include transition(border-color $transitionDuration); + width: 100%; + position: relative; + top: 5px; + left: -5px; + + &.ui-state-focus { + border-width: 0 0 2px 0; + border-color: $primaryColor; + padding-bottom: 0px; + } + } + } + + dl { + margin: -16px 0 40px 0; + + dt { + padding: $listItemPadding; + } + + dd { + margin-top: 42px; + } + } + } + + } + + .ui-fluid { + .ui-calendar { + .ui-datepicker-trigger.ui-button { + top: -4px; + width: 24px; + } + } + } + + .ui-rating { + .ui-rating-cancel { + text-indent: 0; + + a { + color: $textSecondaryColor; + background: none; + @include material-icon("\e5c9"); + font-size: $iconFontSize; + } + } + + .ui-rating-star { + text-indent: 0; + + a { + font-size: $iconFontSize; + color: $textSecondaryColor; + background: none; + @include material-icon("\e83a"); + font-size: $iconFontSize; + } + + &.ui-rating-star-on { + a { + color: $accentColor; + @include material-icon("\e838"); + font-size: $iconFontSize; + } + } + } + } + + .ui-password-panel { + &.ui-shadow { + @include overlay-input-shadow(); + } + } + + .ui-fileupload { + .ui-fileupload-buttonbar { + padding: $headerPadding; + + .ui-icon-arrowreturnthick-1-n { + @include icon_override('file_upload'); + } + + .ui-button { + background-color: $accentColor; + color: $accentTextColor; + margin-right: 6px; + + .ui-icon { + color: $accentTextColor; + } + + &.ui-state-hover { + background-color: $accentDarkColor; + } + } + } + + .ui-fileupload-content { + .ui-messages-error { + .ui-icon { + color: #ffffff; + } + } + } + } + + .ui-editor { + &.ui-widget-content { + padding: 0px; + } + } + + .ui-inputgroup { + height: 100%; + + .ui-inputgroup-addon, + .ui-inputgroup-addon-checkbox { + padding: $inputGroupPadding; + border-color: $inputGroupBorderColor; + background-color: $inputGroupBgColor; + color: $inputGroupTextColor; + min-width: $inputGroupAddonMinWidth; + border-left: 0; + border-right: 0; + border-top: 0; + + &:first-child { + @include border-radius-left(0); + } + + &:last-child { + @include border-radius-right($borderRadius); + } + } + + .ui-inputgroup-addon { + align-self: flex-end; + + > i { + @include flex(); + align-self: flex-end; + font-size: $inputGroupIconFontSize; + } + } + + .ui-inputtext { + align-self: flex-end; + } + + .md-inputfield { + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + width: 1%; + display: inherit; + + label { + top: 5px; + } + } + + .ui-button { + .ui-button-text { + padding: 0; + } + } + + .ui-inputgroup-addon-checkbox { + padding: 0; + position: relative; + + .ui-chkbox { + vertical-align: baseline; + position: absolute; + top: 50%; + left: 50%; + margin-top: -1 * $checkboxHeight / 2; + margin-left: -1 * $checkboxWidth / 2; + } + } + } + + .ui-fluid { + .ui-inputgroup { + .ui-button { + &.ui-button-icon-only { + width: 1.643em; + height: 1.643em; + min-width: 0; + padding: 0; + + .ui-button-icon-left { + margin-left: -.45em; + } + } + } + } + } +} \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/sass/theme/_icons.scss b/apc-web/src/main/webapp/resources/sass/theme/_icons.scss new file mode 100644 index 0000000..30e9d4f --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/theme/_icons.scss @@ -0,0 +1,977 @@ +.ui-icon-carat-2-n-s {@include icon-override("\e164");} +.ui-icon-triangle-1-n { @include icon-override("\e316"); } +.ui-icon-triangle-1-e { @include icon-override("\e315"); } +.ui-icon-triangle-1-s { @include icon-override("\e313"); } +.ui-icon-triangle-1-w { @include icon-override("\e314"); } +.ui-icon-carat-1-n { @include icon-override("\e316"); } +.ui-icon-carat-1-e { @include icon-override("\e315"); } +.ui-icon-carat-1-s { @include icon-override("\e313"); } +.ui-icon-carat-1-w { @include icon-override("\e314"); } +.ui-icon-arrow-1-n { @include icon-override("\e037"); @include rotate(-90deg);} +.ui-icon-arrowstop-1-n { @include icon-override("\e044"); @include rotate(-90deg);} +.ui-icon-arrow-1-s { @include icon-override("\e037"); @include rotate(90deg);} +.ui-icon-arrowstop-1-s { @include icon-override("\e045"); @include rotate(-90deg);} +.ui-icon-arrow-1-w { @include icon-override("\e037"); @include rotate(180deg);} +.ui-icon-arrowstop-1-w { @include icon-override("\e020"); } +.ui-icon-arrow-1-e { @include icon-override("\e037"); } +.ui-icon-arrowstop-1-e { @include icon-override("\e01f"); } +.ui-icon-arrowthick-1-s { @include icon-override("\e037"); @include rotate(90deg);} +.ui-icon-arrowthick-1-n { @include icon-override("\e037"); @include rotate(-90deg);} +.ui-icon-circle-triangle-e {@include icon-override("\e039"); } +.ui-icon-circle-triangle-w {@include icon-override("\e039"); @include rotate(180deg);} +.ui-icon-circle-triangle-s {@include icon-override("\e039"); @include rotate(90deg);} +.ui-icon-radio-off {@include icon-override("\e836");} +.ui-icon-radio-on {@include icon-override("\e837");} +.ui-icon-folder-collapsed {@include icon-override("\e2c7");} +.ui-icon-document {@include icon-override("\e14f");} +.ui-icon-video {@include icon-override("\e02c");} +.ui-icon-music {@include icon-override("\e405");} +.ui-icon-plus {@include icon-override("\e145");} +.ui-icon-minus {@include icon-override("\e15b");} +.ui-icon-plusthick {@include icon-override("\e145");} +.ui-icon-minusthick {@include icon-override("\e15b");} +.ui-icon-pencil {@include icon-override("\e3c9");} +.ui-icon-closethick { @include icon-override("\e5cd"); } +.ui-icon-circle-close { @include icon-override("\e5c9"); } +.ui-icon-gear { @include icon-override("\e8b8"); } +.ui-icon-calendar { @include icon-override("\e916"); } +.ui-icon-trash { @include icon-override("\e92b"); } +.ui-icon-notice { @include icon-override("\e001"); } +.ui-icon-alert { @include icon-override("\e002"); } +.ui-icon-circle-zoomin { @include icon-override("\e8ff"); } +.ui-icon-circle-zoomout { @include icon-override("\e900"); } +.ui-icon-circle-arrow-e { @include icon-override("\e039"); } +.ui-icon-circle-arrow-w { @include icon-override("\e039"); @include rotate(180deg); } + +.ui-icon-3d-rotation { @include icon-override("\e84d"); } +.ui-icon-ac-unit { @include icon-override("\eb3b"); } +.ui-icon-access-alarm { @include icon-override("\e190"); } +.ui-icon-access-alarms { @include icon-override("\e191"); } +.ui-icon-access-time { @include icon-override("\e192"); } +.ui-icon-accessibility { @include icon-override("\e84e"); } +.ui-icon-accessible { @include icon-override("\e914"); } +.ui-icon-account-balance { @include icon-override("\e84f"); } +.ui-icon-account-balance-wallet { @include icon-override("\e850"); } +.ui-icon-account-box { @include icon-override("\e851"); } +.ui-icon-account-circle { @include icon-override("\e853"); } +.ui-icon-adb { @include icon-override("\e60e"); } +.ui-icon-add { @include icon-override("\e145"); } +.ui-icon-add-a-photo { @include icon-override("\e439"); } +.ui-icon-add-alarm { @include icon-override("\e193"); } +.ui-icon-add-alert { @include icon-override("\e003"); } +.ui-icon-add-box { @include icon-override("\e146"); } +.ui-icon-add-circle { @include icon-override("\e147"); } +.ui-icon-add-circle-outline { @include icon-override("\e148"); } +.ui-icon-add-location { @include icon-override("\e567"); } +.ui-icon-add-shopping-cart { @include icon-override("\e854"); } +.ui-icon-add-to-photos { @include icon-override("\e39d"); } +.ui-icon-add-to-queue { @include icon-override("\e05c"); } +.ui-icon-adjust { @include icon-override("\e39e"); } +.ui-icon-airline-seat-flat { @include icon-override("\e630"); } +.ui-icon-airline-seat-flat-angled { @include icon-override("\e631"); } +.ui-icon-airline-seat-individual-suite { @include icon-override("\e632"); } +.ui-icon-airline-seat-legroom-extra { @include icon-override("\e633"); } +.ui-icon-airline-seat-legroom-normal { @include icon-override("\e634"); } +.ui-icon-airline-seat-legroom-reduced { @include icon-override("\e635"); } +.ui-icon-airline-seat-recline-extra { @include icon-override("\e636"); } +.ui-icon-airline-seat-recline-normal { @include icon-override("\e637"); } +.ui-icon-airplanemode-active { @include icon-override("\e195"); } +.ui-icon-airplanemode-inactive { @include icon-override("\e194"); } +.ui-icon-airplay { @include icon-override("\e055"); } +.ui-icon-airport-shuttle { @include icon-override("\eb3c"); } +.ui-icon-alarm { @include icon-override("\e855"); } +.ui-icon-alarm-add { @include icon-override("\e856"); } +.ui-icon-alarm-off { @include icon-override("\e857"); } +.ui-icon-alarm-on { @include icon-override("\e858"); } +.ui-icon-album { @include icon-override("\e019"); } +.ui-icon-all-inclusive { @include icon-override("\eb3d"); } +.ui-icon-all-out { @include icon-override("\e90b"); } +.ui-icon-android { @include icon-override("\e859"); } +.ui-icon-announcement { @include icon-override("\e85a"); } +.ui-icon-apps { @include icon-override("\e5c3"); } +.ui-icon-archive { @include icon-override("\e149"); } +.ui-icon-arrow-back { @include icon-override("\e5c4"); } +.ui-icon-arrow-downward { @include icon-override("\e5db"); } +.ui-icon-arrow-drop-down { @include icon-override("\e5c5"); } +.ui-icon-arrow-drop-down-circle { @include icon-override("\e5c6"); } +.ui-icon-arrow-drop-up { @include icon-override("\e5c7"); } +.ui-icon-arrow-forward { @include icon-override("\e5c8"); } +.ui-icon-arrow-upward { @include icon-override("\e5d8"); } +.ui-icon-art-track { @include icon-override("\e060"); } +.ui-icon-aspect-ratio { @include icon-override("\e85b"); } +.ui-icon-assessment { @include icon-override("\e85c"); } +.ui-icon-assignment { @include icon-override("\e85d"); } +.ui-icon-assignment-ind { @include icon-override("\e85e"); } +.ui-icon-assignment-late { @include icon-override("\e85f"); } +.ui-icon-assignment-return { @include icon-override("\e860"); } +.ui-icon-assignment-returned { @include icon-override("\e861"); } +.ui-icon-assignment-turned-in { @include icon-override("\e862"); } +.ui-icon-assistant { @include icon-override("\e39f"); } +.ui-icon-assistant-photo { @include icon-override("\e3a0"); } +.ui-icon-attach-file { @include icon-override("\e226"); } +.ui-icon-attach-money { @include icon-override("\e227"); } +.ui-icon-attachment { @include icon-override("\e2bc"); } +.ui-icon-audiotrack { @include icon-override("\e3a1"); } +.ui-icon-autorenew { @include icon-override("\e863"); } +.ui-icon-av-timer { @include icon-override("\e01b"); } +.ui-icon-backspace { @include icon-override("\e14a"); } +.ui-icon-backup { @include icon-override("\e864"); } +.ui-icon-battery-alert { @include icon-override("\e19c"); } +.ui-icon-battery-charging-full { @include icon-override("\e1a3"); } +.ui-icon-battery-full { @include icon-override("\e1a4"); } +.ui-icon-battery-std { @include icon-override("\e1a5"); } +.ui-icon-battery-unknown { @include icon-override("\e1a6"); } +.ui-icon-beach-access { @include icon-override("\eb3e"); } +.ui-icon-beenhere { @include icon-override("\e52d"); } +.ui-icon-block { @include icon-override("\e14b"); } +.ui-icon-bluetooth { @include icon-override("\e1a7"); } +.ui-icon-bluetooth-audio { @include icon-override("\e60f"); } +.ui-icon-bluetooth-connected { @include icon-override("\e1a8"); } +.ui-icon-bluetooth-disabled { @include icon-override("\e1a9"); } +.ui-icon-bluetooth-searching { @include icon-override("\e1aa"); } +.ui-icon-blur-circular { @include icon-override("\e3a2"); } +.ui-icon-blur-linear { @include icon-override("\e3a3"); } +.ui-icon-blur-off { @include icon-override("\e3a4"); } +.ui-icon-blur-on { @include icon-override("\e3a5"); } +.ui-icon-book { @include icon-override("\e865"); } +.ui-icon-bookmark { @include icon-override("\e866"); } +.ui-icon-bookmark-border { @include icon-override("\e867"); } +.ui-icon-border-all { @include icon-override("\e228"); } +.ui-icon-border-bottom { @include icon-override("\e229"); } +.ui-icon-border-clear { @include icon-override("\e22a"); } +.ui-icon-border-color { @include icon-override("\e22b"); } +.ui-icon-border-horizontal { @include icon-override("\e22c"); } +.ui-icon-border-inner { @include icon-override("\e22d"); } +.ui-icon-border-left { @include icon-override("\e22e"); } +.ui-icon-border-outer { @include icon-override("\e22f"); } +.ui-icon-border-right { @include icon-override("\e230"); } +.ui-icon-border-style { @include icon-override("\e231"); } +.ui-icon-border-top { @include icon-override("\e232"); } +.ui-icon-border-vertical { @include icon-override("\e233"); } +.ui-icon-branding-watermark { @include icon-override("\e06b"); } +.ui-icon-brightness-1 { @include icon-override("\e3a6"); } +.ui-icon-brightness-2 { @include icon-override("\e3a7"); } +.ui-icon-brightness-3 { @include icon-override("\e3a8"); } +.ui-icon-brightness-4 { @include icon-override("\e3a9"); } +.ui-icon-brightness-5 { @include icon-override("\e3aa"); } +.ui-icon-brightness-6 { @include icon-override("\e3ab"); } +.ui-icon-brightness-7 { @include icon-override("\e3ac"); } +.ui-icon-brightness-auto { @include icon-override("\e1ab"); } +.ui-icon-brightness-high { @include icon-override("\e1ac"); } +.ui-icon-brightness-low { @include icon-override("\e1ad"); } +.ui-icon-brightness-medium { @include icon-override("\e1ae"); } +.ui-icon-broken-image { @include icon-override("\e3ad"); } +.ui-icon-brush { @include icon-override("\e3ae"); } +.ui-icon-bubble-chart { @include icon-override("\e6dd"); } +.ui-icon-bug-report { @include icon-override("\e868"); } +.ui-icon-build { @include icon-override("\e869"); } +.ui-icon-burst-mode { @include icon-override("\e43c"); } +.ui-icon-business { @include icon-override("\e0af"); } +.ui-icon-business-center { @include icon-override("\eb3f"); } +.ui-icon-cached { @include icon-override("\e86a"); } +.ui-icon-cake { @include icon-override("\e7e9"); } +.ui-icon-call { @include icon-override("\e0b0"); } +.ui-icon-call-end { @include icon-override("\e0b1"); } +.ui-icon-call-made { @include icon-override("\e0b2"); } +.ui-icon-call-merge { @include icon-override("\e0b3"); } +.ui-icon-call-missed { @include icon-override("\e0b4"); } +.ui-icon-call-missed-outgoing { @include icon-override("\e0e4"); } +.ui-icon-call-received { @include icon-override("\e0b5"); } +.ui-icon-call-split { @include icon-override("\e0b6"); } +.ui-icon-call-to-action { @include icon-override("\e06c"); } +.ui-icon-camera { @include icon-override("\e3af"); } +.ui-icon-camera-alt { @include icon-override("\e3b0"); } +.ui-icon-camera-enhance { @include icon-override("\e8fc"); } +.ui-icon-camera-front { @include icon-override("\e3b1"); } +.ui-icon-camera-rear { @include icon-override("\e3b2"); } +.ui-icon-camera-roll { @include icon-override("\e3b3"); } +.ui-icon-cancel { @include icon-override("\e5c9"); } +.ui-icon-card-giftcard { @include icon-override("\e8f6"); } +.ui-icon-card-membership { @include icon-override("\e8f7"); } +.ui-icon-card-travel { @include icon-override("\e8f8"); } +.ui-icon-casino { @include icon-override("\eb40"); } +.ui-icon-cast { @include icon-override("\e307"); } +.ui-icon-cast-connected { @include icon-override("\e308"); } +.ui-icon-center-focus-strong { @include icon-override("\e3b4"); } +.ui-icon-center-focus-weak { @include icon-override("\e3b5"); } +.ui-icon-change-history { @include icon-override("\e86b"); } +.ui-icon-chat { @include icon-override("\e0b7"); } +.ui-icon-chat-bubble { @include icon-override("\e0ca"); } +.ui-icon-chat-bubble-outline { @include icon-override("\e0cb"); } +.ui-icon-check { @include icon-override("\e5ca"); } +.ui-icon-check-box { @include icon-override("\e834"); } +.ui-icon-check-box-outline-blank { @include icon-override("\e835"); } +.ui-icon-check-circle { @include icon-override("\e86c"); } +.ui-icon-chevron-left { @include icon-override("\e5cb"); } +.ui-icon-chevron-right { @include icon-override("\e5cc"); } +.ui-icon-child-care { @include icon-override("\eb41"); } +.ui-icon-child-friendly { @include icon-override("\eb42"); } +.ui-icon-chrome-reader-mode { @include icon-override("\e86d"); } +.ui-icon-class { @include icon-override("\e86e"); } +.ui-icon-clear { @include icon-override("\e14c"); } +.ui-icon-clear-all { @include icon-override("\e0b8"); } +.ui-icon-close { @include icon-override("\e5cd"); } +.ui-icon-closed-caption { @include icon-override("\e01c"); } +.ui-icon-cloud { @include icon-override("\e2bd"); } +.ui-icon-cloud-circle { @include icon-override("\e2be"); } +.ui-icon-cloud-done { @include icon-override("\e2bf"); } +.ui-icon-cloud-download { @include icon-override("\e2c0"); } +.ui-icon-cloud-off { @include icon-override("\e2c1"); } +.ui-icon-cloud-queue { @include icon-override("\e2c2"); } +.ui-icon-cloud-upload { @include icon-override("\e2c3"); } +.ui-icon-code { @include icon-override("\e86f"); } +.ui-icon-collections { @include icon-override("\e3b6"); } +.ui-icon-collections-bookmark { @include icon-override("\e431"); } +.ui-icon-color-lens { @include icon-override("\e3b7"); } +.ui-icon-colorize { @include icon-override("\e3b8"); } +.ui-icon-comment { @include icon-override("\e0b9"); } +.ui-icon-compare { @include icon-override("\e3b9"); } +.ui-icon-compare-arrows { @include icon-override("\e915"); } +.ui-icon-computer { @include icon-override("\e30a"); } +.ui-icon-confirmation-number { @include icon-override("\e638"); } +.ui-icon-contact-mail { @include icon-override("\e0d0"); } +.ui-icon-contact-phone { @include icon-override("\e0cf"); } +.ui-icon-contacts { @include icon-override("\e0ba"); } +.ui-icon-content-copy { @include icon-override("\e14d"); } +.ui-icon-content-cut { @include icon-override("\e14e"); } +.ui-icon-content-paste { @include icon-override("\e14f"); } +.ui-icon-control-point { @include icon-override("\e3ba"); } +.ui-icon-control-point-duplicate { @include icon-override("\e3bb"); } +.ui-icon-copyright { @include icon-override("\e90c"); } +.ui-icon-create { @include icon-override("\e150"); } +.ui-icon-create-new-folder { @include icon-override("\e2cc"); } +.ui-icon-credit-card { @include icon-override("\e870"); } +.ui-icon-crop { @include icon-override("\e3be"); } +.ui-icon-crop-16-9 { @include icon-override("\e3bc"); } +.ui-icon-crop-3-2 { @include icon-override("\e3bd"); } +.ui-icon-crop-5-4 { @include icon-override("\e3bf"); } +.ui-icon-crop-7-5 { @include icon-override("\e3c0"); } +.ui-icon-crop-din { @include icon-override("\e3c1"); } +.ui-icon-crop-free { @include icon-override("\e3c2"); } +.ui-icon-crop-landscape { @include icon-override("\e3c3"); } +.ui-icon-crop-original { @include icon-override("\e3c4"); } +.ui-icon-crop-portrait { @include icon-override("\e3c5"); } +.ui-icon-crop-rotate { @include icon-override("\e437"); } +.ui-icon-crop-square { @include icon-override("\e3c6"); } +.ui-icon-dashboard { @include icon-override("\e871"); } +.ui-icon-data-usage { @include icon-override("\e1af"); } +.ui-icon-date-range { @include icon-override("\e916"); } +.ui-icon-dehaze { @include icon-override("\e3c7"); } +.ui-icon-delete { @include icon-override("\e872"); } +.ui-icon-delete-forever { @include icon-override("\e92b"); } +.ui-icon-delete-sweep { @include icon-override("\e16c"); } +.ui-icon-description { @include icon-override("\e873"); } +.ui-icon-desktop-mac { @include icon-override("\e30b"); } +.ui-icon-desktop-windows { @include icon-override("\e30c"); } +.ui-icon-details { @include icon-override("\e3c8"); } +.ui-icon-developer-board { @include icon-override("\e30d"); } +.ui-icon-developer-mode { @include icon-override("\e1b0"); } +.ui-icon-device-hub { @include icon-override("\e335"); } +.ui-icon-devices { @include icon-override("\e1b1"); } +.ui-icon-devices-other { @include icon-override("\e337"); } +.ui-icon-dialer-sip { @include icon-override("\e0bb"); } +.ui-icon-dialpad { @include icon-override("\e0bc"); } +.ui-icon-directions { @include icon-override("\e52e"); } +.ui-icon-directions-bike { @include icon-override("\e52f"); } +.ui-icon-directions-boat { @include icon-override("\e532"); } +.ui-icon-directions-bus { @include icon-override("\e530"); } +.ui-icon-directions-car { @include icon-override("\e531"); } +.ui-icon-directions-railway { @include icon-override("\e534"); } +.ui-icon-directions-run { @include icon-override("\e566"); } +.ui-icon-directions-subway { @include icon-override("\e533"); } +.ui-icon-directions-transit { @include icon-override("\e535"); } +.ui-icon-directions-walk { @include icon-override("\e536"); } +.ui-icon-disc-full { @include icon-override("\e610"); } +.ui-icon-dns { @include icon-override("\e875"); } +.ui-icon-do-not-disturb { @include icon-override("\e612"); } +.ui-icon-do-not-disturb-alt { @include icon-override("\e611"); } +.ui-icon-do-not-disturb-off { @include icon-override("\e643"); } +.ui-icon-do-not-disturb-on { @include icon-override("\e644"); } +.ui-icon-dock { @include icon-override("\e30e"); } +.ui-icon-domain { @include icon-override("\e7ee"); } +.ui-icon-done { @include icon-override("\e876"); } +.ui-icon-done-all { @include icon-override("\e877"); } +.ui-icon-donut-large { @include icon-override("\e917"); } +.ui-icon-donut-small { @include icon-override("\e918"); } +.ui-icon-drafts { @include icon-override("\e151"); } +.ui-icon-drag-handle { @include icon-override("\e25d"); } +.ui-icon-drive-eta { @include icon-override("\e613"); } +.ui-icon-dvr { @include icon-override("\e1b2"); } +.ui-icon-edit { @include icon-override("\e3c9"); } +.ui-icon-edit-location { @include icon-override("\e568"); } +.ui-icon-eject { @include icon-override("\e8fb"); } +.ui-icon-email { @include icon-override("\e0be"); } +.ui-icon-enhanced-encryption { @include icon-override("\e63f"); } +.ui-icon-equalizer { @include icon-override("\e01d"); } +.ui-icon-error { @include icon-override("\e000"); } +.ui-icon-error-outline { @include icon-override("\e001"); } +.ui-icon-euro-symbol { @include icon-override("\e926"); } +.ui-icon-ev-station { @include icon-override("\e56d"); } +.ui-icon-event { @include icon-override("\e878"); } +.ui-icon-event-available { @include icon-override("\e614"); } +.ui-icon-event-busy { @include icon-override("\e615"); } +.ui-icon-event-note { @include icon-override("\e616"); } +.ui-icon-event-seat { @include icon-override("\e903"); } +.ui-icon-exit-to-app { @include icon-override("\e879"); } +.ui-icon-expand-less { @include icon-override("\e5ce"); } +.ui-icon-expand-more { @include icon-override("\e5cf"); } +.ui-icon-explicit { @include icon-override("\e01e"); } +.ui-icon-explore { @include icon-override("\e87a"); } +.ui-icon-exposure { @include icon-override("\e3ca"); } +.ui-icon-exposure-neg-1 { @include icon-override("\e3cb"); } +.ui-icon-exposure-neg-2 { @include icon-override("\e3cc"); } +.ui-icon-exposure-plus-1 { @include icon-override("\e3cd"); } +.ui-icon-exposure-plus-2 { @include icon-override("\e3ce"); } +.ui-icon-exposure-zero { @include icon-override("\e3cf"); } +.ui-icon-extension { @include icon-override("\e87b"); } +.ui-icon-face { @include icon-override("\e87c"); } +.ui-icon-fast-forward { @include icon-override("\e01f"); } +.ui-icon-fast-rewind { @include icon-override("\e020"); } +.ui-icon-favorite { @include icon-override("\e87d"); } +.ui-icon-favorite-border { @include icon-override("\e87e"); } +.ui-icon-featured-play-list { @include icon-override("\e06d"); } +.ui-icon-featured-video { @include icon-override("\e06e"); } +.ui-icon-feedback { @include icon-override("\e87f"); } +.ui-icon-fiber-dvr { @include icon-override("\e05d"); } +.ui-icon-fiber-manual-record { @include icon-override("\e061"); } +.ui-icon-fiber-new { @include icon-override("\e05e"); } +.ui-icon-fiber-pin { @include icon-override("\e06a"); } +.ui-icon-fiber-smart-record { @include icon-override("\e062"); } +.ui-icon-file-download { @include icon-override("\e2c4"); } +.ui-icon-file-upload { @include icon-override("\e2c6"); } +.ui-icon-filter { @include icon-override("\e3d3"); } +.ui-icon-filter-1 { @include icon-override("\e3d0"); } +.ui-icon-filter-2 { @include icon-override("\e3d1"); } +.ui-icon-filter-3 { @include icon-override("\e3d2"); } +.ui-icon-filter-4 { @include icon-override("\e3d4"); } +.ui-icon-filter-5 { @include icon-override("\e3d5"); } +.ui-icon-filter-6 { @include icon-override("\e3d6"); } +.ui-icon-filter-7 { @include icon-override("\e3d7"); } +.ui-icon-filter-8 { @include icon-override("\e3d8"); } +.ui-icon-filter-9 { @include icon-override("\e3d9"); } +.ui-icon-filter-9-plus { @include icon-override("\e3da"); } +.ui-icon-filter-b-and-w { @include icon-override("\e3db"); } +.ui-icon-filter-center-focus { @include icon-override("\e3dc"); } +.ui-icon-filter-drama { @include icon-override("\e3dd"); } +.ui-icon-filter-frames { @include icon-override("\e3de"); } +.ui-icon-filter-hdr { @include icon-override("\e3df"); } +.ui-icon-filter-list { @include icon-override("\e152"); } +.ui-icon-filter-none { @include icon-override("\e3e0"); } +.ui-icon-filter-tilt-shift { @include icon-override("\e3e2"); } +.ui-icon-filter-vintage { @include icon-override("\e3e3"); } +.ui-icon-find-in-page { @include icon-override("\e880"); } +.ui-icon-find-replace { @include icon-override("\e881"); } +.ui-icon-fingerprint { @include icon-override("\e90d"); } +.ui-icon-first-page { @include icon-override("\e5dc"); } +.ui-icon-fitness-center { @include icon-override("\eb43"); } +.ui-icon-flag { @include icon-override("\e153"); } +.ui-icon-flare { @include icon-override("\e3e4"); } +.ui-icon-flash-auto { @include icon-override("\e3e5"); } +.ui-icon-flash-off { @include icon-override("\e3e6"); } +.ui-icon-flash-on { @include icon-override("\e3e7"); } +.ui-icon-flight { @include icon-override("\e539"); } +.ui-icon-flight-land { @include icon-override("\e904"); } +.ui-icon-flight-takeoff { @include icon-override("\e905"); } +.ui-icon-flip { @include icon-override("\e3e8"); } +.ui-icon-flip-to-back { @include icon-override("\e882"); } +.ui-icon-flip-to-front { @include icon-override("\e883"); } +.ui-icon-folder { @include icon-override("\e2c7"); } +.ui-icon-folder-open { @include icon-override("\e2c8"); } +.ui-icon-folder-shared { @include icon-override("\e2c9"); } +.ui-icon-folder-special { @include icon-override("\e617"); } +.ui-icon-font-download { @include icon-override("\e167"); } +.ui-icon-format-align-center { @include icon-override("\e234"); } +.ui-icon-format-align-justify { @include icon-override("\e235"); } +.ui-icon-format-align-left { @include icon-override("\e236"); } +.ui-icon-format-align-right { @include icon-override("\e237"); } +.ui-icon-format-bold { @include icon-override("\e238"); } +.ui-icon-format-clear { @include icon-override("\e239"); } +.ui-icon-format-color-fill { @include icon-override("\e23a"); } +.ui-icon-format-color-reset { @include icon-override("\e23b"); } +.ui-icon-format-color-text { @include icon-override("\e23c"); } +.ui-icon-format-indent-decrease { @include icon-override("\e23d"); } +.ui-icon-format-indent-increase { @include icon-override("\e23e"); } +.ui-icon-format-italic { @include icon-override("\e23f"); } +.ui-icon-format-line-spacing { @include icon-override("\e240"); } +.ui-icon-format-list-bulleted { @include icon-override("\e241"); } +.ui-icon-format-list-numbered { @include icon-override("\e242"); } +.ui-icon-format-paint { @include icon-override("\e243"); } +.ui-icon-format-quote { @include icon-override("\e244"); } +.ui-icon-format-shapes { @include icon-override("\e25e"); } +.ui-icon-format-size { @include icon-override("\e245"); } +.ui-icon-format-strikethrough { @include icon-override("\e246"); } +.ui-icon-format-textdirection-l-to-r { @include icon-override("\e247"); } +.ui-icon-format-textdirection-r-to-l { @include icon-override("\e248"); } +.ui-icon-format-underlined { @include icon-override("\e249"); } +.ui-icon-forum { @include icon-override("\e0bf"); } +.ui-icon-forward { @include icon-override("\e154"); } +.ui-icon-forward-10 { @include icon-override("\e056"); } +.ui-icon-forward-30 { @include icon-override("\e057"); } +.ui-icon-forward-5 { @include icon-override("\e058"); } +.ui-icon-free-breakfast { @include icon-override("\eb44"); } +.ui-icon-fullscreen { @include icon-override("\e5d0"); } +.ui-icon-fullscreen-exit { @include icon-override("\e5d1"); } +.ui-icon-functions { @include icon-override("\e24a"); } +.ui-icon-g-translate { @include icon-override("\e927"); } +.ui-icon-gamepad { @include icon-override("\e30f"); } +.ui-icon-games { @include icon-override("\e021"); } +.ui-icon-gavel { @include icon-override("\e90e"); } +.ui-icon-gesture { @include icon-override("\e155"); } +.ui-icon-get-app { @include icon-override("\e884"); } +.ui-icon-gif { @include icon-override("\e908"); } +.ui-icon-golf-course { @include icon-override("\eb45"); } +.ui-icon-gps-fixed { @include icon-override("\e1b3"); } +.ui-icon-gps-not-fixed { @include icon-override("\e1b4"); } +.ui-icon-gps-off { @include icon-override("\e1b5"); } +.ui-icon-grade { @include icon-override("\e885"); } +.ui-icon-gradient { @include icon-override("\e3e9"); } +.ui-icon-grain { @include icon-override("\e3ea"); } +.ui-icon-graphic-eq { @include icon-override("\e1b8"); } +.ui-icon-grid-off { @include icon-override("\e3eb"); } +.ui-icon-grid-on { @include icon-override("\e3ec"); } +.ui-icon-group { @include icon-override("\e7ef"); } +.ui-icon-group-add { @include icon-override("\e7f0"); } +.ui-icon-group-work { @include icon-override("\e886"); } +.ui-icon-hd { @include icon-override("\e052"); } +.ui-icon-hdr-off { @include icon-override("\e3ed"); } +.ui-icon-hdr-on { @include icon-override("\e3ee"); } +.ui-icon-hdr-strong { @include icon-override("\e3f1"); } +.ui-icon-hdr-weak { @include icon-override("\e3f2"); } +.ui-icon-headset { @include icon-override("\e310"); } +.ui-icon-headset-mic { @include icon-override("\e311"); } +.ui-icon-healing { @include icon-override("\e3f3"); } +.ui-icon-hearing { @include icon-override("\e023"); } +.ui-icon-help { @include icon-override("\e887"); } +.ui-icon-help-outline { @include icon-override("\e8fd"); } +.ui-icon-high-quality { @include icon-override("\e024"); } +.ui-icon-highlight { @include icon-override("\e25f"); } +.ui-icon-highlight-off { @include icon-override("\e888"); } +.ui-icon-history { @include icon-override("\e889"); } +.ui-icon-home { @include icon-override("\e88a"); } +.ui-icon-hot-tub { @include icon-override("\eb46"); } +.ui-icon-hotel { @include icon-override("\e53a"); } +.ui-icon-hourglass-empty { @include icon-override("\e88b"); } +.ui-icon-hourglass-full { @include icon-override("\e88c"); } +.ui-icon-http { @include icon-override("\e902"); } +.ui-icon-https { @include icon-override("\e88d"); } +.ui-icon-image { @include icon-override("\e3f4"); } +.ui-icon-image-aspect-ratio { @include icon-override("\e3f5"); } +.ui-icon-import-contacts { @include icon-override("\e0e0"); } +.ui-icon-import-export { @include icon-override("\e0c3"); } +.ui-icon-important-devices { @include icon-override("\e912"); } +.ui-icon-inbox { @include icon-override("\e156"); } +.ui-icon-indeterminate-check-box { @include icon-override("\e909"); } +.ui-icon-info { @include icon-override("\e88e"); } +.ui-icon-info-outline { @include icon-override("\e88f"); } +.ui-icon-input { @include icon-override("\e890"); } +.ui-icon-insert-chart { @include icon-override("\e24b"); } +.ui-icon-insert-comment { @include icon-override("\e24c"); } +.ui-icon-insert-drive-file { @include icon-override("\e24d"); } +.ui-icon-insert-emoticon { @include icon-override("\e24e"); } +.ui-icon-insert-invitation { @include icon-override("\e24f"); } +.ui-icon-insert-link { @include icon-override("\e250"); } +.ui-icon-insert-photo { @include icon-override("\e251"); } +.ui-icon-invert-colors { @include icon-override("\e891"); } +.ui-icon-invert-colors-off { @include icon-override("\e0c4"); } +.ui-icon-iso { @include icon-override("\e3f6"); } +.ui-icon-keyboard { @include icon-override("\e312"); } +.ui-icon-keyboard-arrow-down { @include icon-override("\e313"); } +.ui-icon-keyboard-arrow-left { @include icon-override("\e314"); } +.ui-icon-keyboard-arrow-right { @include icon-override("\e315"); } +.ui-icon-keyboard-arrow-up { @include icon-override("\e316"); } +.ui-icon-keyboard-backspace { @include icon-override("\e317"); } +.ui-icon-keyboard-capslock { @include icon-override("\e318"); } +.ui-icon-keyboard-hide { @include icon-override("\e31a"); } +.ui-icon-keyboard-return { @include icon-override("\e31b"); } +.ui-icon-keyboard-tab { @include icon-override("\e31c"); } +.ui-icon-keyboard-voice { @include icon-override("\e31d"); } +.ui-icon-kitchen { @include icon-override("\eb47"); } +.ui-icon-label { @include icon-override("\e892"); } +.ui-icon-label-outline { @include icon-override("\e893"); } +.ui-icon-landscape { @include icon-override("\e3f7"); } +.ui-icon-language { @include icon-override("\e894"); } +.ui-icon-laptop { @include icon-override("\e31e"); } +.ui-icon-laptop-chromebook { @include icon-override("\e31f"); } +.ui-icon-laptop-mac { @include icon-override("\e320"); } +.ui-icon-laptop-windows { @include icon-override("\e321"); } +.ui-icon-last-page { @include icon-override("\e5dd"); } +.ui-icon-launch { @include icon-override("\e895"); } +.ui-icon-layers { @include icon-override("\e53b"); } +.ui-icon-layers-clear { @include icon-override("\e53c"); } +.ui-icon-leak-add { @include icon-override("\e3f8"); } +.ui-icon-leak-remove { @include icon-override("\e3f9"); } +.ui-icon-lens { @include icon-override("\e3fa"); } +.ui-icon-library-add { @include icon-override("\e02e"); } +.ui-icon-library-books { @include icon-override("\e02f"); } +.ui-icon-library-music { @include icon-override("\e030"); } +.ui-icon-lightbulb-outline { @include icon-override("\e90f"); } +.ui-icon-line-style { @include icon-override("\e919"); } +.ui-icon-line-weight { @include icon-override("\e91a"); } +.ui-icon-linear-scale { @include icon-override("\e260"); } +.ui-icon-link { @include icon-override("\e157"); } +.ui-icon-linked-camera { @include icon-override("\e438"); } +.ui-icon-list { @include icon-override("\e896"); } +.ui-icon-live-help { @include icon-override("\e0c6"); } +.ui-icon-live-tv { @include icon-override("\e639"); } +.ui-icon-local-activity { @include icon-override("\e53f"); } +.ui-icon-local-airport { @include icon-override("\e53d"); } +.ui-icon-local-atm { @include icon-override("\e53e"); } +.ui-icon-local-bar { @include icon-override("\e540"); } +.ui-icon-local-cafe { @include icon-override("\e541"); } +.ui-icon-local-car-wash { @include icon-override("\e542"); } +.ui-icon-local-convenience-store { @include icon-override("\e543"); } +.ui-icon-local-dining { @include icon-override("\e556"); } +.ui-icon-local-drink { @include icon-override("\e544"); } +.ui-icon-local-florist { @include icon-override("\e545"); } +.ui-icon-local-gas-station { @include icon-override("\e546"); } +.ui-icon-local-grocery-store { @include icon-override("\e547"); } +.ui-icon-local-hospital { @include icon-override("\e548"); } +.ui-icon-local-hotel { @include icon-override("\e549"); } +.ui-icon-local-laundry-service { @include icon-override("\e54a"); } +.ui-icon-local-library { @include icon-override("\e54b"); } +.ui-icon-local-mall { @include icon-override("\e54c"); } +.ui-icon-local-movies { @include icon-override("\e54d"); } +.ui-icon-local-offer { @include icon-override("\e54e"); } +.ui-icon-local-parking { @include icon-override("\e54f"); } +.ui-icon-local-pharmacy { @include icon-override("\e550"); } +.ui-icon-local-phone { @include icon-override("\e551"); } +.ui-icon-local-pizza { @include icon-override("\e552"); } +.ui-icon-local-play { @include icon-override("\e553"); } +.ui-icon-local-post-office { @include icon-override("\e554"); } +.ui-icon-local-printshop { @include icon-override("\e555"); } +.ui-icon-local-see { @include icon-override("\e557"); } +.ui-icon-local-shipping { @include icon-override("\e558"); } +.ui-icon-local-taxi { @include icon-override("\e559"); } +.ui-icon-location-city { @include icon-override("\e7f1"); } +.ui-icon-location-disabled { @include icon-override("\e1b6"); } +.ui-icon-location-off { @include icon-override("\e0c7"); } +.ui-icon-location-on { @include icon-override("\e0c8"); } +.ui-icon-location-searching { @include icon-override("\e1b7"); } +.ui-icon-lock { @include icon-override("\e897"); } +.ui-icon-lock-open { @include icon-override("\e898"); } +.ui-icon-lock-outline { @include icon-override("\e899"); } +.ui-icon-looks { @include icon-override("\e3fc"); } +.ui-icon-looks-3 { @include icon-override("\e3fb"); } +.ui-icon-looks-4 { @include icon-override("\e3fd"); } +.ui-icon-looks-5 { @include icon-override("\e3fe"); } +.ui-icon-looks-6 { @include icon-override("\e3ff"); } +.ui-icon-looks-one { @include icon-override("\e400"); } +.ui-icon-looks-two { @include icon-override("\e401"); } +.ui-icon-loop { @include icon-override("\e028"); } +.ui-icon-loupe { @include icon-override("\e402"); } +.ui-icon-low-priority { @include icon-override("\e16d"); } +.ui-icon-loyalty { @include icon-override("\e89a"); } +.ui-icon-mail { @include icon-override("\e158"); } +.ui-icon-mail-outline { @include icon-override("\e0e1"); } +.ui-icon-map { @include icon-override("\e55b"); } +.ui-icon-markunread { @include icon-override("\e159"); } +.ui-icon-markunread-mailbox { @include icon-override("\e89b"); } +.ui-icon-memory { @include icon-override("\e322"); } +.ui-icon-menu { @include icon-override("\e5d2"); } +.ui-icon-merge-type { @include icon-override("\e252"); } +.ui-icon-message { @include icon-override("\e0c9"); } +.ui-icon-mic { @include icon-override("\e029"); } +.ui-icon-mic-none { @include icon-override("\e02a"); } +.ui-icon-mic-off { @include icon-override("\e02b"); } +.ui-icon-mms { @include icon-override("\e618"); } +.ui-icon-mode-comment { @include icon-override("\e253"); } +.ui-icon-mode-edit { @include icon-override("\e254"); } +.ui-icon-monetization-on { @include icon-override("\e263"); } +.ui-icon-money-off { @include icon-override("\e25c"); } +.ui-icon-monochrome-photos { @include icon-override("\e403"); } +.ui-icon-mood { @include icon-override("\e7f2"); } +.ui-icon-mood-bad { @include icon-override("\e7f3"); } +.ui-icon-more { @include icon-override("\e619"); } +.ui-icon-more-horiz { @include icon-override("\e5d3"); } +.ui-icon-more-vert { @include icon-override("\e5d4"); } +.ui-icon-motorcycle { @include icon-override("\e91b"); } +.ui-icon-mouse { @include icon-override("\e323"); } +.ui-icon-move-to-inbox { @include icon-override("\e168"); } +.ui-icon-movie { @include icon-override("\e02c"); } +.ui-icon-movie-creation { @include icon-override("\e404"); } +.ui-icon-movie-filter { @include icon-override("\e43a"); } +.ui-icon-multiline-chart { @include icon-override("\e6df"); } +.ui-icon-music-note { @include icon-override("\e405"); } +.ui-icon-music-video { @include icon-override("\e063"); } +.ui-icon-my-location { @include icon-override("\e55c"); } +.ui-icon-nature { @include icon-override("\e406"); } +.ui-icon-nature-people { @include icon-override("\e407"); } +.ui-icon-navigate-before { @include icon-override("\e408"); } +.ui-icon-navigate-next { @include icon-override("\e409"); } +.ui-icon-navigation { @include icon-override("\e55d"); } +.ui-icon-near-me { @include icon-override("\e569"); } +.ui-icon-network-cell { @include icon-override("\e1b9"); } +.ui-icon-network-check { @include icon-override("\e640"); } +.ui-icon-network-locked { @include icon-override("\e61a"); } +.ui-icon-network-wifi { @include icon-override("\e1ba"); } +.ui-icon-new-releases { @include icon-override("\e031"); } +.ui-icon-next-week { @include icon-override("\e16a"); } +.ui-icon-nfc { @include icon-override("\e1bb"); } +.ui-icon-no-encryption { @include icon-override("\e641"); } +.ui-icon-no-sim { @include icon-override("\e0cc"); } +.ui-icon-not-interested { @include icon-override("\e033"); } +.ui-icon-note { @include icon-override("\e06f"); } +.ui-icon-note-add { @include icon-override("\e89c"); } +.ui-icon-notifications { @include icon-override("\e7f4"); } +.ui-icon-notifications-active { @include icon-override("\e7f7"); } +.ui-icon-notifications-none { @include icon-override("\e7f5"); } +.ui-icon-notifications-off { @include icon-override("\e7f6"); } +.ui-icon-notifications-paused { @include icon-override("\e7f8"); } +.ui-icon-offline-pin { @include icon-override("\e90a"); } +.ui-icon-ondemand-video { @include icon-override("\e63a"); } +.ui-icon-opacity { @include icon-override("\e91c"); } +.ui-icon-open-in-browser { @include icon-override("\e89d"); } +.ui-icon-open-in-new { @include icon-override("\e89e"); } +.ui-icon-open-with { @include icon-override("\e89f"); } +.ui-icon-pages { @include icon-override("\e7f9"); } +.ui-icon-pageview { @include icon-override("\e8a0"); } +.ui-icon-palette { @include icon-override("\e40a"); } +.ui-icon-pan-tool { @include icon-override("\e925"); } +.ui-icon-panorama { @include icon-override("\e40b"); } +.ui-icon-panorama-fish-eye { @include icon-override("\e40c"); } +.ui-icon-panorama-horizontal { @include icon-override("\e40d"); } +.ui-icon-panorama-vertical { @include icon-override("\e40e"); } +.ui-icon-panorama-wide-angle { @include icon-override("\e40f"); } +.ui-icon-party-mode { @include icon-override("\e7fa"); } +.ui-icon-pause { @include icon-override("\e034"); } +.ui-icon-pause-circle-filled { @include icon-override("\e035"); } +.ui-icon-pause-circle-outline { @include icon-override("\e036"); } +.ui-icon-payment { @include icon-override("\e8a1"); } +.ui-icon-people { @include icon-override("\e7fb"); } +.ui-icon-people-outline { @include icon-override("\e7fc"); } +.ui-icon-perm-camera-mic { @include icon-override("\e8a2"); } +.ui-icon-perm-contact-calendar { @include icon-override("\e8a3"); } +.ui-icon-perm-data-setting { @include icon-override("\e8a4"); } +.ui-icon-perm-device-information { @include icon-override("\e8a5"); } +.ui-icon-perm-identity { @include icon-override("\e8a6"); } +.ui-icon-perm-media { @include icon-override("\e8a7"); } +.ui-icon-perm-phone-msg { @include icon-override("\e8a8"); } +.ui-icon-perm-scan-wifi { @include icon-override("\e8a9"); } +.ui-icon-person { @include icon-override("\e7fd"); } +.ui-icon-person-add { @include icon-override("\e7fe"); } +.ui-icon-person-outline { @include icon-override("\e7ff"); } +.ui-icon-person-pin { @include icon-override("\e55a"); } +.ui-icon-person-pin-circle { @include icon-override("\e56a"); } +.ui-icon-personal-video { @include icon-override("\e63b"); } +.ui-icon-pets { @include icon-override("\e91d"); } +.ui-icon-phone { @include icon-override("\e0cd"); } +.ui-icon-phone-android { @include icon-override("\e324"); } +.ui-icon-phone-bluetooth-speaker { @include icon-override("\e61b"); } +.ui-icon-phone-forwarded { @include icon-override("\e61c"); } +.ui-icon-phone-in-talk { @include icon-override("\e61d"); } +.ui-icon-phone-iphone { @include icon-override("\e325"); } +.ui-icon-phone-locked { @include icon-override("\e61e"); } +.ui-icon-phone-missed { @include icon-override("\e61f"); } +.ui-icon-phone-paused { @include icon-override("\e620"); } +.ui-icon-phonelink { @include icon-override("\e326"); } +.ui-icon-phonelink-erase { @include icon-override("\e0db"); } +.ui-icon-phonelink-lock { @include icon-override("\e0dc"); } +.ui-icon-phonelink-off { @include icon-override("\e327"); } +.ui-icon-phonelink-ring { @include icon-override("\e0dd"); } +.ui-icon-phonelink-setup { @include icon-override("\e0de"); } +.ui-icon-photo { @include icon-override("\e410"); } +.ui-icon-photo-album { @include icon-override("\e411"); } +.ui-icon-photo-camera { @include icon-override("\e412"); } +.ui-icon-photo-filter { @include icon-override("\e43b"); } +.ui-icon-photo-library { @include icon-override("\e413"); } +.ui-icon-photo-size-select-actual { @include icon-override("\e432"); } +.ui-icon-photo-size-select-large { @include icon-override("\e433"); } +.ui-icon-photo-size-select-small { @include icon-override("\e434"); } +.ui-icon-picture-as-pdf { @include icon-override("\e415"); } +.ui-icon-picture-in-picture { @include icon-override("\e8aa"); } +.ui-icon-picture-in-picture-alt { @include icon-override("\e911"); } +.ui-icon-pie-chart { @include icon-override("\e6c4"); } +.ui-icon-pie-chart-outlined { @include icon-override("\e6c5"); } +.ui-icon-pin-drop { @include icon-override("\e55e"); } +.ui-icon-place { @include icon-override("\e55f"); } +.ui-icon-play-arrow { @include icon-override("\e037"); } +.ui-icon-play-circle-filled { @include icon-override("\e038"); } +.ui-icon-play-circle-outline { @include icon-override("\e039"); } +.ui-icon-play-for-work { @include icon-override("\e906"); } +.ui-icon-playlist-add { @include icon-override("\e03b"); } +.ui-icon-playlist-add-check { @include icon-override("\e065"); } +.ui-icon-playlist-play { @include icon-override("\e05f"); } +.ui-icon-plus-one { @include icon-override("\e800"); } +.ui-icon-poll { @include icon-override("\e801"); } +.ui-icon-polymer { @include icon-override("\e8ab"); } +.ui-icon-pool { @include icon-override("\eb48"); } +.ui-icon-portable-wifi-off { @include icon-override("\e0ce"); } +.ui-icon-portrait { @include icon-override("\e416"); } +.ui-icon-power { @include icon-override("\e63c"); } +.ui-icon-power-input { @include icon-override("\e336"); } +.ui-icon-power-settings-new { @include icon-override("\e8ac"); } +.ui-icon-pregnant-woman { @include icon-override("\e91e"); } +.ui-icon-present-to-all { @include icon-override("\e0df"); } +.ui-icon-print { @include icon-override("\e8ad"); } +.ui-icon-priority-high { @include icon-override("\e645"); } +.ui-icon-public { @include icon-override("\e80b"); } +.ui-icon-publish { @include icon-override("\e255"); } +.ui-icon-query-builder { @include icon-override("\e8ae"); } +.ui-icon-question-answer { @include icon-override("\e8af"); } +.ui-icon-queue { @include icon-override("\e03c"); } +.ui-icon-queue-music { @include icon-override("\e03d"); } +.ui-icon-queue-play-next { @include icon-override("\e066"); } +.ui-icon-radio { @include icon-override("\e03e"); } +.ui-icon-radio-button-checked { @include icon-override("\e837"); } +.ui-icon-radio-button-unchecked { @include icon-override("\e836"); } +.ui-icon-rate-review { @include icon-override("\e560"); } +.ui-icon-receipt { @include icon-override("\e8b0"); } +.ui-icon-recent-actors { @include icon-override("\e03f"); } +.ui-icon-record-voice-over { @include icon-override("\e91f"); } +.ui-icon-redeem { @include icon-override("\e8b1"); } +.ui-icon-redo { @include icon-override("\e15a"); } +.ui-icon-refresh { @include icon-override("\e5d5"); } +.ui-icon-remove { @include icon-override("\e15b"); } +.ui-icon-remove-circle { @include icon-override("\e15c"); } +.ui-icon-remove-circle-outline { @include icon-override("\e15d"); } +.ui-icon-remove-from-queue { @include icon-override("\e067"); } +.ui-icon-remove-red-eye { @include icon-override("\e417"); } +.ui-icon-remove-shopping-cart { @include icon-override("\e928"); } +.ui-icon-reorder { @include icon-override("\e8fe"); } +.ui-icon-repeat { @include icon-override("\e040"); } +.ui-icon-repeat-one { @include icon-override("\e041"); } +.ui-icon-replay { @include icon-override("\e042"); } +.ui-icon-replay-10 { @include icon-override("\e059"); } +.ui-icon-replay-30 { @include icon-override("\e05a"); } +.ui-icon-replay-5 { @include icon-override("\e05b"); } +.ui-icon-reply { @include icon-override("\e15e"); } +.ui-icon-reply-all { @include icon-override("\e15f"); } +.ui-icon-report { @include icon-override("\e160"); } +.ui-icon-report-problem { @include icon-override("\e8b2"); } +.ui-icon-restaurant { @include icon-override("\e56c"); } +.ui-icon-restaurant-menu { @include icon-override("\e561"); } +.ui-icon-restore { @include icon-override("\e8b3"); } +.ui-icon-restore-page { @include icon-override("\e929"); } +.ui-icon-ring-volume { @include icon-override("\e0d1"); } +.ui-icon-room { @include icon-override("\e8b4"); } +.ui-icon-room-service { @include icon-override("\eb49"); } +.ui-icon-rotate-90-degrees-ccw { @include icon-override("\e418"); } +.ui-icon-rotate-left { @include icon-override("\e419"); } +.ui-icon-rotate-right { @include icon-override("\e41a"); } +.ui-icon-rounded-corner { @include icon-override("\e920"); } +.ui-icon-router { @include icon-override("\e328"); } +.ui-icon-rowing { @include icon-override("\e921"); } +.ui-icon-rss-feed { @include icon-override("\e0e5"); } +.ui-icon-rv-hookup { @include icon-override("\e642"); } +.ui-icon-satellite { @include icon-override("\e562"); } +.ui-icon-save { @include icon-override("\e161"); } +.ui-icon-scanner { @include icon-override("\e329"); } +.ui-icon-schedule { @include icon-override("\e8b5"); } +.ui-icon-school { @include icon-override("\e80c"); } +.ui-icon-screen-lock-landscape { @include icon-override("\e1be"); } +.ui-icon-screen-lock-portrait { @include icon-override("\e1bf"); } +.ui-icon-screen-lock-rotation { @include icon-override("\e1c0"); } +.ui-icon-screen-rotation { @include icon-override("\e1c1"); } +.ui-icon-screen-share { @include icon-override("\e0e2"); } +.ui-icon-sd-card { @include icon-override("\e623"); } +.ui-icon-sd-storage { @include icon-override("\e1c2"); } +.ui-icon-search { @include icon-override("\e8b6"); } +.ui-icon-security { @include icon-override("\e32a"); } +.ui-icon-select-all { @include icon-override("\e162"); } +.ui-icon-send { @include icon-override("\e163"); } +.ui-icon-sentiment-dissatisfied { @include icon-override("\e811"); } +.ui-icon-sentiment-neutral { @include icon-override("\e812"); } +.ui-icon-sentiment-satisfied { @include icon-override("\e813"); } +.ui-icon-sentiment-very-dissatisfied { @include icon-override("\e814"); } +.ui-icon-sentiment-very-satisfied { @include icon-override("\e815"); } +.ui-icon-settings { @include icon-override("\e8b8"); } +.ui-icon-settings-applications { @include icon-override("\e8b9"); } +.ui-icon-settings-backup-restore { @include icon-override("\e8ba"); } +.ui-icon-settings-bluetooth { @include icon-override("\e8bb"); } +.ui-icon-settings-brightness { @include icon-override("\e8bd"); } +.ui-icon-settings-cell { @include icon-override("\e8bc"); } +.ui-icon-settings-ethernet { @include icon-override("\e8be"); } +.ui-icon-settings-input-antenna { @include icon-override("\e8bf"); } +.ui-icon-settings-input-component { @include icon-override("\e8c0"); } +.ui-icon-settings-input-composite { @include icon-override("\e8c1"); } +.ui-icon-settings-input-hdmi { @include icon-override("\e8c2"); } +.ui-icon-settings-input-svideo { @include icon-override("\e8c3"); } +.ui-icon-settings-overscan { @include icon-override("\e8c4"); } +.ui-icon-settings-phone { @include icon-override("\e8c5"); } +.ui-icon-settings-power { @include icon-override("\e8c6"); } +.ui-icon-settings-remote { @include icon-override("\e8c7"); } +.ui-icon-settings-system-daydream { @include icon-override("\e1c3"); } +.ui-icon-settings-voice { @include icon-override("\e8c8"); } +.ui-icon-share { @include icon-override("\e80d"); } +.ui-icon-shop { @include icon-override("\e8c9"); } +.ui-icon-shop-two { @include icon-override("\e8ca"); } +.ui-icon-shopping-basket { @include icon-override("\e8cb"); } +.ui-icon-shopping-cart { @include icon-override("\e8cc"); } +.ui-icon-short-text { @include icon-override("\e261"); } +.ui-icon-show-chart { @include icon-override("\e6e1"); } +.ui-icon-shuffle { @include icon-override("\e043"); } +.ui-icon-signal-cellular-4-bar { @include icon-override("\e1c8"); } +.ui-icon-signal-cellular-connected-no-internet-4-bar { @include icon-override("\e1cd"); } +.ui-icon-signal-cellular-no-sim { @include icon-override("\e1ce"); } +.ui-icon-signal-cellular-null { @include icon-override("\e1cf"); } +.ui-icon-signal-cellular-off { @include icon-override("\e1d0"); } +.ui-icon-signal-wifi-4-bar { @include icon-override("\e1d8"); } +.ui-icon-signal-wifi-4-bar-lock { @include icon-override("\e1d9"); } +.ui-icon-signal-wifi-off { @include icon-override("\e1da"); } +.ui-icon-sim-card { @include icon-override("\e32b"); } +.ui-icon-sim-card-alert { @include icon-override("\e624"); } +.ui-icon-skip-next { @include icon-override("\e044"); } +.ui-icon-skip-previous { @include icon-override("\e045"); } +.ui-icon-slideshow { @include icon-override("\e41b"); } +.ui-icon-slow-motion-video { @include icon-override("\e068"); } +.ui-icon-smartphone { @include icon-override("\e32c"); } +.ui-icon-smoke-free { @include icon-override("\eb4a"); } +.ui-icon-smoking-rooms { @include icon-override("\eb4b"); } +.ui-icon-sms { @include icon-override("\e625"); } +.ui-icon-sms-failed { @include icon-override("\e626"); } +.ui-icon-snooze { @include icon-override("\e046"); } +.ui-icon-sort { @include icon-override("\e164"); } +.ui-icon-sort-by-alpha { @include icon-override("\e053"); } +.ui-icon-spa { @include icon-override("\eb4c"); } +.ui-icon-space-bar { @include icon-override("\e256"); } +.ui-icon-speaker { @include icon-override("\e32d"); } +.ui-icon-speaker-group { @include icon-override("\e32e"); } +.ui-icon-speaker-notes { @include icon-override("\e8cd"); } +.ui-icon-speaker-notes-off { @include icon-override("\e92a"); } +.ui-icon-speaker-phone { @include icon-override("\e0d2"); } +.ui-icon-spellcheck { @include icon-override("\e8ce"); } +.ui-icon-star { @include icon-override("\e838"); } +.ui-icon-star-border { @include icon-override("\e83a"); } +.ui-icon-star-half { @include icon-override("\e839"); } +.ui-icon-stars { @include icon-override("\e8d0"); } +.ui-icon-stay-current-landscape { @include icon-override("\e0d3"); } +.ui-icon-stay-current-portrait { @include icon-override("\e0d4"); } +.ui-icon-stay-primary-landscape { @include icon-override("\e0d5"); } +.ui-icon-stay-primary-portrait { @include icon-override("\e0d6"); } +.ui-icon-stop { @include icon-override("\e047"); } +.ui-icon-stop-screen-share { @include icon-override("\e0e3"); } +.ui-icon-storage { @include icon-override("\e1db"); } +.ui-icon-store { @include icon-override("\e8d1"); } +.ui-icon-store-mall-directory { @include icon-override("\e563"); } +.ui-icon-straighten { @include icon-override("\e41c"); } +.ui-icon-streetview { @include icon-override("\e56e"); } +.ui-icon-strikethrough-s { @include icon-override("\e257"); } +.ui-icon-style { @include icon-override("\e41d"); } +.ui-icon-subdirectory-arrow-left { @include icon-override("\e5d9"); } +.ui-icon-subdirectory-arrow-right { @include icon-override("\e5da"); } +.ui-icon-subject { @include icon-override("\e8d2"); } +.ui-icon-subscriptions { @include icon-override("\e064"); } +.ui-icon-subtitles { @include icon-override("\e048"); } +.ui-icon-subway { @include icon-override("\e56f"); } +.ui-icon-supervisor-account { @include icon-override("\e8d3"); } +.ui-icon-surround-sound { @include icon-override("\e049"); } +.ui-icon-swap-calls { @include icon-override("\e0d7"); } +.ui-icon-swap-horiz { @include icon-override("\e8d4"); } +.ui-icon-swap-vert { @include icon-override("\e8d5"); } +.ui-icon-swap-vertical-circle { @include icon-override("\e8d6"); } +.ui-icon-switch-camera { @include icon-override("\e41e"); } +.ui-icon-switch-video { @include icon-override("\e41f"); } +.ui-icon-sync { @include icon-override("\e627"); } +.ui-icon-sync-disabled { @include icon-override("\e628"); } +.ui-icon-sync-problem { @include icon-override("\e629"); } +.ui-icon-system-update { @include icon-override("\e62a"); } +.ui-icon-system-update-alt { @include icon-override("\e8d7"); } +.ui-icon-tab { @include icon-override("\e8d8"); } +.ui-icon-tab-unselected { @include icon-override("\e8d9"); } +.ui-icon-tablet { @include icon-override("\e32f"); } +.ui-icon-tablet-android { @include icon-override("\e330"); } +.ui-icon-tablet-mac { @include icon-override("\e331"); } +.ui-icon-tag-faces { @include icon-override("\e420"); } +.ui-icon-tap-and-play { @include icon-override("\e62b"); } +.ui-icon-terrain { @include icon-override("\e564"); } +.ui-icon-text-fields { @include icon-override("\e262"); } +.ui-icon-text-format { @include icon-override("\e165"); } +.ui-icon-textsms { @include icon-override("\e0d8"); } +.ui-icon-texture { @include icon-override("\e421"); } +.ui-icon-theaters { @include icon-override("\e8da"); } +.ui-icon-thumb-down { @include icon-override("\e8db"); } +.ui-icon-thumb-up { @include icon-override("\e8dc"); } +.ui-icon-thumbs-up-down { @include icon-override("\e8dd"); } +.ui-icon-time-to-leave { @include icon-override("\e62c"); } +.ui-icon-timelapse { @include icon-override("\e422"); } +.ui-icon-timeline { @include icon-override("\e922"); } +.ui-icon-timer { @include icon-override("\e425"); } +.ui-icon-timer-10 { @include icon-override("\e423"); } +.ui-icon-timer-3 { @include icon-override("\e424"); } +.ui-icon-timer-off { @include icon-override("\e426"); } +.ui-icon-title { @include icon-override("\e264"); } +.ui-icon-toc { @include icon-override("\e8de"); } +.ui-icon-today { @include icon-override("\e8df"); } +.ui-icon-toll { @include icon-override("\e8e0"); } +.ui-icon-tonality { @include icon-override("\e427"); } +.ui-icon-touch-app { @include icon-override("\e913"); } +.ui-icon-toys { @include icon-override("\e332"); } +.ui-icon-track-changes { @include icon-override("\e8e1"); } +.ui-icon-traffic { @include icon-override("\e565"); } +.ui-icon-train { @include icon-override("\e570"); } +.ui-icon-tram { @include icon-override("\e571"); } +.ui-icon-transfer-within-a-station { @include icon-override("\e572"); } +.ui-icon-transform { @include icon-override("\e428"); } +.ui-icon-translate { @include icon-override("\e8e2"); } +.ui-icon-trending-down { @include icon-override("\e8e3"); } +.ui-icon-trending-flat { @include icon-override("\e8e4"); } +.ui-icon-trending-up { @include icon-override("\e8e5"); } +.ui-icon-tune { @include icon-override("\e429"); } +.ui-icon-turned-in { @include icon-override("\e8e6"); } +.ui-icon-turned-in-not { @include icon-override("\e8e7"); } +.ui-icon-tv { @include icon-override("\e333"); } +.ui-icon-unarchive { @include icon-override("\e169"); } +.ui-icon-undo { @include icon-override("\e166"); } +.ui-icon-unfold-less { @include icon-override("\e5d6"); } +.ui-icon-unfold-more { @include icon-override("\e5d7"); } +.ui-icon-update { @include icon-override("\e923"); } +.ui-icon-usb { @include icon-override("\e1e0"); } +.ui-icon-verified-user { @include icon-override("\e8e8"); } +.ui-icon-vertical-align-bottom { @include icon-override("\e258"); } +.ui-icon-vertical-align-center { @include icon-override("\e259"); } +.ui-icon-vertical-align-top { @include icon-override("\e25a"); } +.ui-icon-vibration { @include icon-override("\e62d"); } +.ui-icon-video-call { @include icon-override("\e070"); } +.ui-icon-video-label { @include icon-override("\e071"); } +.ui-icon-video-library { @include icon-override("\e04a"); } +.ui-icon-videocam { @include icon-override("\e04b"); } +.ui-icon-videocam-off { @include icon-override("\e04c"); } +.ui-icon-videogame-asset { @include icon-override("\e338"); } +.ui-icon-view-agenda { @include icon-override("\e8e9"); } +.ui-icon-view-array { @include icon-override("\e8ea"); } +.ui-icon-view-carousel { @include icon-override("\e8eb"); } +.ui-icon-view-column { @include icon-override("\e8ec"); } +.ui-icon-view-comfy { @include icon-override("\e42a"); } +.ui-icon-view-compact { @include icon-override("\e42b"); } +.ui-icon-view-day { @include icon-override("\e8ed"); } +.ui-icon-view-headline { @include icon-override("\e8ee"); } +.ui-icon-view-list { @include icon-override("\e8ef"); } +.ui-icon-view-module { @include icon-override("\e8f0"); } +.ui-icon-view-quilt { @include icon-override("\e8f1"); } +.ui-icon-view-stream { @include icon-override("\e8f2"); } +.ui-icon-view-week { @include icon-override("\e8f3"); } +.ui-icon-vignette { @include icon-override("\e435"); } +.ui-icon-visibility { @include icon-override("\e8f4"); } +.ui-icon-visibility-off { @include icon-override("\e8f5"); } +.ui-icon-voice-chat { @include icon-override("\e62e"); } +.ui-icon-voicemail { @include icon-override("\e0d9"); } +.ui-icon-volume-down { @include icon-override("\e04d"); } +.ui-icon-volume-mute { @include icon-override("\e04e"); } +.ui-icon-volume-off { @include icon-override("\e04f"); } +.ui-icon-volume-up { @include icon-override("\e050"); } +.ui-icon-vpn-key { @include icon-override("\e0da"); } +.ui-icon-vpn-lock { @include icon-override("\e62f"); } +.ui-icon-wallpaper { @include icon-override("\e1bc"); } +.ui-icon-warning { @include icon-override("\e002"); } +.ui-icon-watch { @include icon-override("\e334"); } +.ui-icon-watch-later { @include icon-override("\e924"); } +.ui-icon-wb-auto { @include icon-override("\e42c"); } +.ui-icon-wb-cloudy { @include icon-override("\e42d"); } +.ui-icon-wb-incandescent { @include icon-override("\e42e"); } +.ui-icon-wb-iridescent { @include icon-override("\e436"); } +.ui-icon-wb-sunny { @include icon-override("\e430"); } +.ui-icon-wc { @include icon-override("\e63d"); } +.ui-icon-web { @include icon-override("\e051"); } +.ui-icon-web-asset { @include icon-override("\e069"); } +.ui-icon-weekend { @include icon-override("\e16b"); } +.ui-icon-whatshot { @include icon-override("\e80e"); } +.ui-icon-widgets { @include icon-override("\e1bd"); } +.ui-icon-wifi { @include icon-override("\e63e"); } +.ui-icon-wifi-lock { @include icon-override("\e1e1"); } +.ui-icon-wifi-tethering { @include icon-override("\e1e2"); } +.ui-icon-work { @include icon-override("\e8f9"); } +.ui-icon-wrap-text { @include icon-override("\e25b"); } +.ui-icon-youtube-searched-for { @include icon-override("\e8fa"); } +.ui-icon-zoom-in { @include icon-override("\e8ff"); } +.ui-icon-zoom-out { @include icon-override("\e900"); } +.ui-icon-zoom-out-map { @include icon-override("\e56b"); } \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/sass/theme/_media.scss b/apc-web/src/main/webapp/resources/sass/theme/_media.scss new file mode 100644 index 0000000..ac0dda8 --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/theme/_media.scss @@ -0,0 +1,80 @@ +@media (max-width: 640px) { + body { + .ui-panelgrid { + .ui-grid-responsive { + .ui-grid-row { + border: 0 none; + } + } + } + + .ui-steps { + .ui-steps-item { + .ui-menuitem-link { + .ui-steps-title { + display: none; + } + } + } + } + + .ui-picklist { + &.ui-picklist-responsive { + .ui-picklist-list-wrapper { + margin-bottom: 8px; + } + .ui-picklist-buttons { + .ui-button { + &.ui-button-icon-only { + display: inline-block; + margin-right: 4px; + } + } + + .ui-icon-arrow-1-e { + @include icon-override("\e037"); @include rotate(90deg); + } + .ui-icon-arrowstop-1-e { + @include icon-override("\e045"); @include rotate(-90deg); + + } + .ui-icon-arrow-1-w { + @include icon-override("\e037"); @include rotate(-90deg); + } + .ui-icon-arrowstop-1-w { + @include icon-override("\e044"); @include rotate(-90deg); + } + } + } + } + + .ui-orderlist { + &.ui-grid-responsive { + .ui-orderlist-controls { + text-align: center; + width: auto; + margin-bottom: 8px; + + .ui-button { + margin-right: 4px; + } + } + } + } + + .ui-buttonset { + > .ui-button { + display: block; + @include border-radius(0); + + &:first-child { + @include border-radius-top(3px); + } + + &:last-child { + @include border-radius-bottom(3px); + } + } + } + } +} \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/sass/theme/_menus.scss b/apc-web/src/main/webapp/resources/sass/theme/_menus.scss new file mode 100644 index 0000000..7281eca --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/theme/_menus.scss @@ -0,0 +1,367 @@ +body { + .ui-breadcrumb { + a { + color: #ffffff; + } + + li:first-child { + a { + position: relative; + font-size: $iconFontSize; + margin-top: 0; + + span { + display: none; + } + } + } + } + + .ui-steps { + position: relative; + + .ui-steps-item { + background-color: transparent; + + &.ui-state-disabled { + @include opacity(1); + } + + .ui-menuitem-link { + display: inline-block; + text-align: left; + background-color: #ffffff; + overflow: hidden; + + .ui-steps-number { + display: inline-block; + background-color: $grayBgColor; + @include border-radius(50%); + padding: 4px 8px; + font-size: 16px; + color: #ffffff; + } + + .ui-steps-title { + display: inline; + margin-left: 10px; + color: $textSecondaryColor; + } + } + + &.ui-state-highlight { + .ui-steps-number { + background-color: $primaryColor; + } + + .ui-steps-title { + font-weight: 700; + color: $textColor; + } + } + + &:last-child { + .ui-menuitem-link { + display: block; + } + } + } + + &:before { + content:' '; + border: 1px solid $dividerColor; + width: 90%; + top: 45%; + left: 0; + display: block; + position: absolute; + } + } + + .ui-menu { + padding: 8px 0; + + .ui-shadow, &.ui-shadow { + @include overlay-input-shadow(); + } + + .ui-menu-list { + padding: 0; + margin: 0; + + li { + &.ui-widget-header { + margin: 0 0 1px 0; + @include border-radius(0); + border: 0 none; + width: 100%; + box-sizing: border-box; + padding: 0; + + h3 { + display: block; + float: none; + font-size: $fontSize; + padding: $menuitemPadding; + font-weight: 400; + + .ui-icon { + &.ui-icon-triangle-1-s, &.ui-icon-triangle-1-e { + margin: -12px 0 0 0; + } + } + } + } + + &.ui-menuitem { + margin: 0; + @include border-radius(0); + + &.ui-state-hover { + @include hover-element(); + } + + .ui-menuitem-link { + border: 0 none; + padding: $menuitemPadding; + width: 100%; + min-height: 32px; + box-sizing: border-box; + color: $textColor; + @include border-radius(0); + position: relative; + + &.ui-state-hover { + @include hover-element(); + } + + .ui-menuitem-icon { + margin-right: 8px; + display: inline-block; + vertical-align: middle; + float: none; + font-size: $iconFontSize - 2; + height: auto; + } + + .ui-menuitem-text { + display: inline-block; + vertical-align: middle; + float: none; + } + } + } + } + + .ui-separator { + height: 1px; + background-color: $dividerColor; + width: 100%; + box-sizing: border-box; + } + } + + &.ui-menu-toggleable { + .ui-menu-list { + li { + &.ui-widget-header { + padding-left: 30px; + + .ui-icon { + color: #ffffff; + + &.ui-icon-triangle-1-s { + margin-top: -10px; + } + + &.ui-icon-triangle-1-e { + margin-top: -10px; + } + } + } + } + } + } + + &.ui-tieredmenu { + .ui-icon-triangle-1-e { + position: absolute; + right: 8px; + top: 6px; + float: none; + } + + .ui-menu-child { + padding: 8px 0; + } + } + + &.ui-menubar { + padding: 0; + + .ui-menu-child { + padding: 8px 0; + } + + .ui-menubar-options { + padding: 0 10px; + } + + &.ui-megamenu { + &.ui-megamenu-vertical { + > .ui-menu-list { + padding: 8px 0; + } + } + } + } + + &.ui-slidemenu { + + .ui-menu-parent { + .ui-menu-child { + padding: 0; + @include no-shadow(); + } + } + + .ui-slidemenu-backward { + width: 100%; + @include border-box-sizing(); + @include border-radius(0); + } + } + } + + .ui-tabmenu { + padding: 0; + + .ui-tabmenu-nav { + padding: 0; + background-color: #ffffff; + border: 0 none; + @include border-radius(0px); + + > .ui-tabmenuitem { + top: auto; + margin: 0 4px 0 0; + padding: 0; + border-style: solid; + border-width: 0 0 2px 0; + @include transition(border-color $transitionDuration); + + > a { + padding: $headerPadding; + + &:focus { + outline: 0 none; + } + + .ui-menuitem-icon, .ui-menuitem-text { + float: none; + display: inline-block; + vertical-align: middle; + } + + .ui-menuitem-icon { + margin-right: 12px; + } + } + + &.ui-state-default { + a { + color: $textSecondaryColor; + + .ui-icon { + color: $textSecondaryColor; + } + } + } + + &.ui-state-hover { + background-color: #ffffff; + } + + &.ui-state-active { + background-color: #ffffff; + border-color: $accentColor; + border-style: solid; + + a { + color: $primaryColor; + + .ui-icon { + color: $primaryColor; + } + } + } + } + } + } + + .ui-panelmenu { + .ui-panelmenu-header { + background-color: $primaryColor; + margin-bottom: 1px; + + a { + padding: 6px 10px 6px 36px; + color: #ffffff; + font-size: $fontSize; + } + + .ui-icon { + color: #ffffff; + margin-top: -10px; + font-size: $iconFontSize - 2; + height: auto; + } + + &.ui-state-active { + background-color: $accentColor; + @include border-radius-bottom(0); + a, .ui-icon { + color: $accentTextColor; + } + } + } + + .ui-panelmenu-content { + padding: 0; + + .ui-menuitem { + margin: 0; + + .ui-menuitem-link { + border: 0 none; + padding: $menuitemPadding; + width: 100%; + min-height: 30px; + box-sizing: border-box; + color: $textColor; + @include border-radius(0); + position: relative; + + &.ui-state-hover { + @include hover-element(); + } + + .ui-menuitem-text { + display: inline-block; + vertical-align: middle; + float: none; + } + + .ui-icon { + position: static; + display: inline-block; + vertical-align: middle; + margin-right: 6px; + font-size: $iconFontSize - 2; + height: auto; + } + } + } + } + } +} \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/sass/theme/_messages.scss b/apc-web/src/main/webapp/resources/sass/theme/_messages.scss new file mode 100644 index 0000000..f8386ed --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/theme/_messages.scss @@ -0,0 +1,245 @@ +body { + /* Messages */ + .ui-messages { + > div { + padding: 10px 16px; + } + + ul { + display: inline-block; + margin-left: 0; + } + + .ui-messages-info { + background-color: #2196F3; + border-color: #2196F3; + color: #ffffff; + + .ui-messages-close:hover { + background-color: lighten(#2196F3,15%); + } + } + + .ui-messages-warn { + background-color: #ffc107; + border-color: #ffc107; + color: #000000; + + .ui-messages-close:hover { + background-color: lighten(#ffc107,15%); + } + } + + .ui-messages-error { + background-color: #e62a10; + border-color: #e62a10; + color: #ffffff; + + .ui-messages-close:hover { + background-color: lighten(#e62a10,15%); + } + } + + .ui-messages-fatal { + background-color: #212121; + border-color: #212121; + color: #ffffff; + + .ui-messages-close:hover { + background-color: lighten(#212121,15%); + } + } + } + + .ui-message { + padding: 4px 8px; + + &.ui-message-info { + background-color: #2196F3; + border-color: #2196F3; + color: #ffffff; + } + + &.ui-message-warn { + background-color: #ffc107; + border-color: #ffc107; + color: #ffffff; + } + + &.ui-message-error { + background-color: #e62a10; + border-color: #e62a10; + color: #ffffff; + } + + &.ui-message-fatal { + background-color: #212121; + border-color: #212121; + color: #ffffff; + } + + &.ui-message-icon-only { + text-align: center; + + span { + float: none; + margin-top: -1px; + position: static; + } + } + } + + /* Info */ + .ui-messages .ui-messages-info-icon,.ui-message .ui-message-info-icon { + background: none; + @include material-icon("\e88e"); + font-size: 24px; + color: #fff; + } + + .ui-message .ui-message-info-icon { + margin-top: -1px; + font-size: 18px; + right: 1px; + } + + /* Error */ + .ui-messages .ui-messages-error-icon, .ui-message .ui-message-error-icon { + background: none; + @include material-icon("\e000"); + font-size: 24px; + color: #fff; + } + + .ui-message .ui-message-error-icon { + margin-top: -1px; + font-size: 18px; + right: 1px; + } + + /* Warn */ + .ui-messages .ui-messages-warn-icon,.ui-message .ui-message-warn-icon { + background: none; + @include material-icon("\e002"); + font-size: 24px; + color: $textColor; + } + + .ui-messages .ui-messages-warn { + .ui-messages-close { + color: $textColor; + } + } + + .ui-message .ui-message-warn-icon { + margin-top: -1px; + font-size: 18px; + right: 1px; + } + + /* Fatal */ + .ui-messages .ui-messages-fatal-icon,.ui-message .ui-message-fatal-icon { + background: none; + @include material-icon("\e000"); + font-size: 24px; + color: #fff; + } + + .ui-message .ui-message-fatal-icon { + margin-top: -1px; + font-size: 18px; + } + + .ui-messages-close { + text-decoration: none; + color: #fff; + width: $iconWidth; + height: $iconWidth; + margin-top: -2px; + @include border-radius(50%); + @include transition(background-color $transitionDuration); + } + + .md-inputfield { + .ui-message { + &.ui-message-error { + background-color: transparent; + border: 0 none; + margin: 0px; + color: $inputErrorTextColor; + font-size: $errorMessageFontSize; + + .ui-message-error-icon { + color: $inputErrorTextColor; + font-size: $errorMessageIconFontSize; + } + } + } + } + + .ui-growl { + top: 90px; + + > .ui-growl-item-container { + opacity: 1; + + &.ui-growl-info { + background-color: #2196F3; + } + + &.ui-growl-warn { + background-color: #ffc107; + } + + &.ui-growl-error { + background-color: #e62a10; + } + + &.ui-growl-fatal { + background-color: #212121; + } + + &.ui-shadow { + @include overlay-content-shadow(); + } + } + + .ui-growl-item { + .ui-growl-image { + background: none; + color: #ffffff; + padding: 4px; + + &.ui-growl-image-info { + @include material-icon("\e88e"); + font-size: 36px; + } + + &.ui-growl-image-error { + @include material-icon("\e000"); + font-size: 36px; + } + + &.ui-growl-image-warn { + @include material-icon("\e002"); + font-size: 36px; + } + + &.ui-growl-image-fatal { + @include material-icon("\e000"); + font-size: 36px; + } + } + + .ui-growl-message { + color: #ffffff; + } + + .ui-growl-icon-close { + @include material-icon("\e5cd"); + font-size: 24px; + color: #ffffff; + } + } + } +} \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/sass/theme/_misc.scss b/apc-web/src/main/webapp/resources/sass/theme/_misc.scss new file mode 100644 index 0000000..941df64 --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/theme/_misc.scss @@ -0,0 +1,91 @@ +body { + .jqplot-target { + font-family: $fontFamily; + } + + .ui-progressbar { + height: 16px; + padding: 0; + border-color: $contentBorderColor; + + .ui-progressbar-value { + height: 16px; + padding: 0; + } + + .ui-progressbar-label { + color: $accentColor; + } + } + + .ui-galleria { + padding: 0; + + .ui-galleria-nav-prev { + left: 2px; + } + + .ui-galleria-nav-next { + right: 2px; + } + } + + .ui-log { + .ui-log-header { + padding: $headerPadding; + height: auto; + + > .ui-log-button { + line-height: 16px; + position: static; + display: inline-block; + vertical-align: middle; + margin-right: 4px; + border: 1px solid transparent; + padding: 1px 3px; + @include border-radius(50%); + @include transition(background-color $transitionDuration); + + &.ui-state-hover { + background-color: $primaryLightColor; + } + } + } + } + + .ui-tagcloud { + li { + margin: 4px 0px; + + a { + @include transition(background-color $transitionDuration); + @include border-radius(3px); + + &:hover { + @include hover-element(); + } + } + } + } + + .timeline-frame { + .timeline-event { + border-color: $contentBorderColor; + background-color: $contentBgColor; + + &.ui-state-active { + background-color: $accentColor; + border-color: $accentColor; + color: $accentTextColor; + } + } + + .timeline-axis { + border-color: $dividerColor; + } + + .timeline-navigation { + height: 36px; + } + } +} \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/sass/theme/_overlays.scss b/apc-web/src/main/webapp/resources/sass/theme/_overlays.scss new file mode 100644 index 0000000..e207b44 --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/theme/_overlays.scss @@ -0,0 +1,193 @@ +body { + .ui-dialog { + &.ui-shadow { + @include overlay-content-shadow(); + } + + .ui-dialog-titlebar { + background-color: #ffffff; + color: $textColor; + padding: $headerPadding; + + .ui-dialog-title { + font-weight: 700; + } + + .ui-dialog-titlebar-icon { + padding: 0; + @include border-radius(50%); + @include transition(background-color $transitionDuration); + + &.ui-state-hover, &.ui-state-focus { + @include hover-element(); + } + + .ui-icon { + color: $textSecondaryColor; + } + + .ui-icon-extlink { + @include icon_override('fullscreen'); + } + + .ui-icon-newwin { + @include icon_override('fullscreen_exit'); + } + } + } + + .ui-dialog-buttonpane, .ui-dialog-footer { + text-align: right; + + .ui-button { + background-color: #ffffff; + color: $textColor; + @include no-shadow(); + + .ui-icon { + color: $textSecondaryColor; + } + + &.ui-state-hover { + @include hover-element(); + } + } + } + + .ui-confirm-dialog-severity { + margin: 0px 12px; + } + } + + .ui-sidebar { + .ui-sidebar-close { + &:hover { + padding: 1px; + } + } + + .ui-button { + width: auto; + } + } + + .ui-lightbox { + &.ui-shadow { + @include overlay-content-shadow(); + } + + .ui-lightbox-caption { + padding: $headerPadding; + + .ui-lightbox-caption-text { + margin: 0; + } + + .ui-lightbox-close { + @include border-radius(50%); + @include transition(background-color $transitionDuration); + padding: 0; + margin: 0; + width: $iconWidth; + height: $iconHeight; + + &.ui-state-hover { + @include hover-element-primary(); + padding: 0; + } + } + } + + .ui-lightbox-content-wrapper { + .ui-lightbox-nav-right, .ui-lightbox-nav-left { + top: 40%; + + .ui-icon { + @include transition(color $transitionDuration); + font-size: 48px; + color: $primaryLightColor; + } + + &:hover { + .ui-icon { + color: #ffffff; + } + } + } + + .ui-lightbox-nav-right { + right: 24px; + } + } + } + + .ui-overlaypanel { + &.ui-shadow { + @include overlay-content-shadow(); + } + + .ui-overlaypanel-close { + background-color: $accentColor; + @include border-radius(50%); + @include transition(background-color $transitionDuration); + padding: 2px 4px; + right: -16px; + top: -16px; + @include content-shadow(); + + span { + color: $accentTextColor; + + &:before { + position: relative; + top: 2px; + } + } + + &.ui-state-hover { + background-color: $accentDarkColor; + } + } + } + + .ui-tooltip { + @include opacity(.9); + font-size: $fontSize - 2px; + + .ui-tooltip-text { + background-color: #323232; + @include overlay-content-shadow(); + } + + &.ui-tooltip-top { + .ui-tooltip-arrow { + border-top-color: #323232; + } + } + + &.ui-tooltip-bottom { + .ui-tooltip-arrow { + border-bottom-color: #323232; + } + } + + &.ui-tooltip-left { + .ui-tooltip-arrow { + border-left-color: #323232; + } + } + + &.ui-tooltip-right { + .ui-tooltip-arrow { + border-right-color: #323232; + } + } + } + + .ui-state-error, + .ui-widget.ui-state-error, + .ui-widget-content .ui-state-error, + .ui-widget-header .ui-state-error { + border-color: #e62a10; + } +} \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/sass/theme/_panels.scss b/apc-web/src/main/webapp/resources/sass/theme/_panels.scss new file mode 100644 index 0000000..02b4086 --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/theme/_panels.scss @@ -0,0 +1,432 @@ +body { + .ui-panel { + padding: 0; + + .ui-panel-titlebar { + border: 0 none; + padding: $headerPadding; + @include border-radius-top(2px); + @include border-radius-bottom(0px); + + .ui-panel-title { + margin: 0; + line-height: $lineHeight + 2; + } + + .ui-panel-titlebar-icon { + width: $iconWidth; + height: $iconHeight; + color: $headerTextColor; + margin: 0; + @include transition(background-color $transitionDuration); + @include border-radius(50%); + + &:hover { + background-color: $primaryLightColor; + } + } + } + + .ui-panel-content { + height: 100%; + box-sizing: border-box; + padding: $contentPadding; + } + + .ui-panel-footer { + padding: $headerPadding; + border: 0 none; + border-top: 1px solid $dividerColor; + margin: 0; + } + + &.ui-panel-collapsed-h { + .ui-panel-titlebar { + padding-left: 40px; + } + } + } + + .ui-fieldset { + padding: $contentPadding; + + .ui-fieldset-legend { + padding: $headerPadding; + padding-left: 2px; + padding-right: 8px; + color: $primaryColor; + + .ui-fieldset-toggler { + padding: 8px; + background-color: $primaryColor; + color: #ffffff; + @include border-radius(50%); + @include transition(background-color $transitionDuration); + margin-top: -10px; + margin-right: 8px; + @include content-shadow(); + + &:hover { + background-color: $primaryDarkColor; + } + } + + &.ui-state-focus { + background-color: transparent; + } + + &.ui-state-active { + background-color: transparent; + } + } + } + + .ui-notificationbar { + background-color: $accentColor; + color: $accentTextColor; + } + + .ui-panelgrid { + .ui-panelgrid-cell { + padding: $contentPadding; + } + + .ui-panelgrid-header, + .ui-panelgrid-footer { + > .ui-widget-header { + border-color: $primaryDarkColor; + } + } + + tbody { + .ui-panelgrid-cell { + &.ui-widget-header { + background-color: $primaryLightColor; + } + } + } + } + + .ui-accordion { + .ui-accordion-header { + background-color: $primaryColor; + padding: $headerPadding; + padding-left: 36px; + font-size: $fontSize; + color: $primaryTextColor; + @include transition(background-color $transitionDuration); + + &.ui-state-hover { + background-color: $primaryDarkColor; + } + + &.ui-state-active { + background-color: $accentColor; + color: $accentTextColor; + + &.ui-tabs-outline { + outline: 0 none; + background-color: lighten($accentColor, 10%); + } + } + + .ui-icon-triangle-1-e { + margin-top: -10px; + } + + .ui-icon-triangle-1-s { + margin-top: -10px; + } + + &.ui-tabs-outline { + background-color: lighten($primaryColor, 10%); + } + } + + .ui-accordion-content { + padding: $contentPadding; + line-height: $lineHeight; + } + } + + .ui-scrollpanel { + padding: 0; + + .ui-scrollpanel-track { + background-color: #ffffff; + border-color: transparent; + padding: 0; + } + + .ui-scrollpanel-drag { + @include border-radius(3px); + background-color: $dividerColor; + } + } + + .ui-toolbar { + background-color: $primaryDarkColor; + @include content-shadow(); + padding: 10px; + + .ui-button { + margin-right: 6px; + } + } + + .ui-tabs { + padding: 0; + + .ui-tabs-nav { + background-color: #ffffff; + border: 0 none; + @include border-radius(0); + + > li { + padding: 0; + @include transition(border-color $transitionDuration); + + > a { + padding: $headerPadding; + + &:focus { + outline: 0 none; + } + } + + > .ui-icon-close { + margin: 7px 0 0 0; + @include transition(color $transitionDuration); + color: $textSecondaryColor; + } + + &.ui-state-default { + a { + color: $textSecondaryColor; + } + } + + &.ui-state-hover { + background-color: #ffffff; + } + + &.ui-state-active { + background-color: #ffffff; + border-color: $accentColor; + border-style: solid; + + a { + color: $primaryColor; + font-weight: 700; + } + + > .ui-icon-close { + color: $accentColor; + } + } + + &.ui-tabs-outline { + outline: 0 none; + border-color: $accentLightColor; + } + } + } + + .ui-tabs-panel { + padding: $contentPadding; + } + + &.ui-tabs-top { + > .ui-tabs-nav { + padding: 0; + margin: 0; + @include border-radius-top(4px); + border-bottom: 1px solid $dividerColor; + + > li { + border-style: solid; + border-width: 0 0 2px 0; + } + } + } + + &.ui-tabs-bottom { + > .ui-tabs-nav { + padding: 0; + margin: 0; + @include border-radius-bottom(4px); + border-top: 1px solid $dividerColor; + + > li { + border-width: 2px 0 0 0; + } + } + } + + &.ui-tabs-left { + > .ui-tabs-nav { + padding: 0; + margin: 0; + @include border-radius-left(4px); + border-right: 1px solid $dividerColor; + + > li { + box-sizing: border-box; + border-width: 0 2px 0 0; + + > a { + width: 100%; + box-sizing: border-box; + } + } + } + } + + &.ui-tabs-right { + > .ui-tabs-nav { + padding: 0; + @include border-radius-right(4px); + border-left: 1px solid $dividerColor; + + > li { + box-sizing: border-box; + border-width: 0 0 0 2px; + + > a { + width: 100%; + box-sizing: border-box; + } + + &.ui-state-active { + > a { + padding-left: 14px; + } + } + } + } + } + + &.ui-tabs-scrollable { + .ui-tabs-navscroller { + > .ui-tabs-navscroller-btn { + outline: 0 none; + width: 18px; + display: block; + height: 42px; + background-color: #ffffff; + @include border-radius(0); + @include transition(background-color $transitionDuration); + + > span { + margin-top: 10px; + } + + &:hover { + @include hover-element(); + } + } + + > .ui-tabs-navscroller-btn-left { + z-index: 1; + left: 0; + border-right: 1px solid $dividerColor; + > span { + &:before { + position: relative; + left: -2px; + } + } + } + + > .ui-tabs-navscroller-btn-right { + z-index: 1; + right: 0; + border-left: 1px solid $dividerColor; + + > span { + &:before { + position: relative; + right: 2px; + } + } + } + + .ui-tabs-nav { + > li { + margin: 0; + } + } + } + + &.ui-tabs-top { + .ui-tabs-navscroller { + > .ui-tabs-nav { + border-bottom: 1px solid $dividerColor; + + > li { + border-style: solid; + border-width: 0 0 2px 0; + } + } + + > .ui-tabs-navscroller-btn-left { + border-top: 0 none; + border-bottom: 1px solid $dividerColor; + } + } + } + + &.ui-tabs-bottom { + .ui-tabs-navscroller { + > .ui-tabs-nav { + border-top: 1px solid $dividerColor; + + > li { + border-style: solid; + border-width: 2px 0 0 0; + } + } + + > .ui-tabs-navscroller-btn-left { + border-bottom: 0 none; + border-top: 1px solid $dividerColor; + } + + > .ui-tabs-navscroller-btn-right { + border-top: 1px solid $dividerColor; + } + } + } + } + } + + .ui-wizard { + .ui-wizard-step-titles { + background-color: $primaryDarkColor; + @include border-radius-top(3px); + + > li { + padding: $headerPadding; + color: #ffffff; + + &.ui-state-highlight { + color: #ffffff; + background-color: transparent; + border-bottom: 2px solid $accentColor; + @include border-radius(0); + } + } + } + + .ui-wizard-content { + margin: 0; + + .ui-panel { + .ui-panel-titlebar { + @include border-radius(0); + } + } + } + } + +} \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/sass/theme/_theme.scss b/apc-web/src/main/webapp/resources/sass/theme/_theme.scss new file mode 100644 index 0000000..4783066 --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/theme/_theme.scss @@ -0,0 +1,14 @@ +@import '../variables/_theme'; +@import '../_mixins'; +@import '_common'; +@import '_forms'; +@import '_data'; +@import '_panels'; +@import '_menus'; +@import '_messages'; +@import '_misc'; +@import '_overlays'; +@import '_media'; +@import '_icons'; +@import '../_theme_styles.scss'; + diff --git a/apc-web/src/main/webapp/resources/sass/variables/_common.scss b/apc-web/src/main/webapp/resources/sass/variables/_common.scss new file mode 100644 index 0000000..aec4366 --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/variables/_common.scss @@ -0,0 +1,29 @@ +/******************************/ +/* Common */ +/******************************/ +$fontSize:14px; +$fontFamily:"Roboto","Helvetica Neue",sans-serif; +$textColor:#212121; +$textSecondaryColor:#757575; +$lineHeight:18px; +$borderRadius:3px; +$dividerColor:#dbdbdb; +$dividerLightColor:#f8f8f8; +$transitionDuration:.3s; +$iconWidth:20px; +$iconHeight:20px; +$iconFontSize:20px; +$hoverBgColor:#e8e8e8; +$hoverTextColor:#000000; + +/* Predefined Colors */ +$blue:#147df0; +$pink:#ed3c76; +$green:#3e9018; +$red:#da2f31; +$orange:#ffb200; +$teal:#599597; +$purple:#633ea5; +$black:#000000; +$yellow:#ffd644; +$grayBgColor:#757575; \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/sass/variables/_layout.scss b/apc-web/src/main/webapp/resources/sass/variables/_layout.scss new file mode 100644 index 0000000..d3a3890 --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/variables/_layout.scss @@ -0,0 +1,11 @@ +@import './common'; + +$bodyBgColor:#F5F5F5; +$topbarSubmenuHoverBgColor:#f1f2f7; +$topbarMobileMenuBgColor:#ffffff; +$mobileBreakpoint:1024px; +$contentMobileMaskBgColor:#424242; +$breadcrumbBgColor:#ffffff; +$footerBgColor:#ffffff; +$nanoSliderBgColor:#aaaaaa; +$topbarSubmenuBgColor:#ffffff; diff --git a/apc-web/src/main/webapp/resources/sass/variables/_theme.scss b/apc-web/src/main/webapp/resources/sass/variables/_theme.scss new file mode 100644 index 0000000..738a81f --- /dev/null +++ b/apc-web/src/main/webapp/resources/sass/variables/_theme.scss @@ -0,0 +1,40 @@ +@import './common'; + +$headerPadding:8px 14px; +$headerTextColor:#ffffff; + +$contentPadding:8px 14px; +$contentBorderColor:#d8d8d8; +$contentBgColor:#ffffff; + +$inputBorderColor:#bdbdbd; +$inputInvalidBorderColor:#e62a10; +$inputBgColor:#ffffff; +$inputErrorTextColor:#e62a10; +$inputHeaderPadding:6px 10px; + +//groups +$inputGroupBorderColor:#bdbdbd; +$inputGroupBgColor:transparent; +$inputGroupTextColor:#757575; +$inputGroupIconColor:#bdbdbd; +$inputGroupAddonMinWidth:2*$fontSize; +$checkboxWidth:18px; +$checkboxHeight:18px; +$inputGroupPadding:2px 2px 1px 2px; +$borderRadius:0px; +$inputGroupIconFontSize: 1.5em; + +$buttonTextColor:#ffffff; + +$listItemPadding:6px 10px; + +$radioButtonBorderColor:#757575; +$checkboxBorderColor:#757575; + +$errorMessageFontSize:11px; +$errorMessageIconFontSize:13px; + +$dataTableRowBgColorEven:#f4f4f4; +$paginatorPadding:6px 10px; +$menuitemPadding:6px 10px; \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/serenity-layout/css/grid.css b/apc-web/src/main/webapp/resources/serenity-layout/css/grid.css new file mode 100644 index 0000000..5506190 --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/css/grid.css @@ -0,0 +1,347 @@ +/* + * New Grid CSS + * Only necessary to add if your PrimeFaces version is older than 5.3.14 + */ +.ui-g { + display: -webkit-box; + display: -moz-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + flex-wrap: wrap; +} + +.ui-g:after { + clear: both; + content: ""; + display: table; +} + +.ui-g-1, +.ui-g-2, +.ui-g-3, +.ui-g-4, +.ui-g-5, +.ui-g-6, +.ui-g-7, +.ui-g-8, +.ui-g-9, +.ui-g-10, +.ui-g-11, +.ui-g-12 { + float: left; + box-sizing: border-box; + padding: 0.5em; +} + +.ui-g-1 { + width: 8.3333%; +} + +.ui-g-2 { + width: 16.6667%; +} + +.ui-g-3 { + width: 25%; +} + +.ui-g-4 { + width: 33.3333%; +} + +.ui-g-5 { + width: 41.6667%; +} + +.ui-g-6 { + width: 50%; +} + +.ui-g-7 { + width: 58.3333%; +} + +.ui-g-8 { + width: 66.6667%; +} + +.ui-g-9 { + width: 75%; +} + +.ui-g-10 { + width: 83.3333%; +} + +.ui-g-11 { + width: 91.6667%; +} + +.ui-g-12 { + width: 100%; +} + +@media screen and (max-width: 40em) { + .ui-sm-1, + .ui-sm-2, + .ui-sm-3, + .ui-sm-4, + .ui-sm-5, + .ui-sm-6, + .ui-sm-7, + .ui-sm-8, + .ui-sm-9, + .ui-sm-10, + .ui-sm-11, + .ui-sm-12 { + padding: 0.5em; + } + + .ui-sm-1 { + width: 8.3333%; + } + + .ui-sm-2 { + width: 16.6667%; + } + + .ui-sm-3 { + width: 25%; + } + + .ui-sm-4 { + width: 33.3333%; + } + + .ui-sm-5 { + width: 41.6667%; + } + + .ui-sm-6 { + width: 50%; + } + + .ui-sm-7 { + width: 58.3333%; + } + + .ui-sm-8 { + width: 66.6667%; + } + + .ui-sm-9 { + width: 75%; + } + + .ui-sm-10 { + width: 83.3333%; + } + + .ui-sm-11 { + width: 91.6667%; + } + + .ui-sm-12 { + width: 100%; + } +} + +@media screen and (min-width: 40.063em) { + .ui-md-1, + .ui-md-2, + .ui-md-3, + .ui-md-4, + .ui-md-5, + .ui-md-6, + .ui-md-7, + .ui-md-8, + .ui-md-9, + .ui-md-10, + .ui-md-11, + .ui-md-12 { + padding: 0.5em; + } + + .ui-md-1 { + width: 8.3333%; + } + + .ui-md-2 { + width: 16.6667%; + } + + .ui-md-3 { + width: 25%; + } + + .ui-md-4 { + width: 33.3333%; + } + + .ui-md-5 { + width: 41.6667%; + } + + .ui-md-6 { + width: 50%; + } + + .ui-md-7 { + width: 58.3333%; + } + + .ui-md-8 { + width: 66.6667%; + } + + .ui-md-9 { + width: 75%; + } + + .ui-md-10 { + width: 83.3333%; + } + + .ui-md-11 { + width: 91.6667%; + } + + .ui-md-12 { + width: 100%; + } +} + +@media screen and (min-width: 64.063em) { + .ui-lg-1, + .ui-lg-2, + .ui-lg-3, + .ui-lg-4, + .ui-lg-5, + .ui-lg-6, + .ui-lg-7, + .ui-lg-8, + .ui-lg-9, + .ui-lg-10, + .ui-lg-11, + .ui-lg-12 { + padding: 0.5em; + } + + .ui-lg-1 { + width: 8.3333%; + } + + .ui-lg-2 { + width: 16.6667%; + } + + .ui-lg-3 { + width: 25%; + } + + .ui-lg-4 { + width: 33.3333%; + } + + .ui-lg-5 { + width: 41.6667%; + } + + .ui-lg-6 { + width: 50%; + } + + .ui-lg-7 { + width: 58.3333%; + } + + .ui-lg-8 { + width: 66.6667%; + } + + .ui-lg-9 { + width: 75%; + } + + .ui-lg-10 { + width: 83.3333%; + } + + .ui-lg-11 { + width: 91.6667%; + } + + .ui-lg-12 { + width: 100%; + } +} + +@media screen and (min-width: 90.063em) { + .ui-xl-1, + .ui-xl-2, + .ui-xl-3, + .ui-xl-4, + .ui-xl-5, + .ui-xl-6, + .ui-xl-7, + .ui-xl-8, + .ui-xl-9, + .ui-xl-10, + .ui-xl-11, + .ui-xl-12 { + padding: 0.5em; + } + + .ui-xl-1 { + width: 8.3333%; + } + + .ui-xl-2 { + width: 16.6667%; + } + + .ui-xl-3 { + width: 25%; + } + + .ui-xl-4 { + width: 33.3333%; + } + + .ui-xl-5 { + width: 41.6667%; + } + + .ui-xl-6 { + width: 50%; + } + + .ui-xl-7 { + width: 58.3333%; + } + + .ui-xl-8 { + width: 66.6667%; + } + + .ui-xl-9 { + width: 75%; + } + + .ui-xl-10 { + width: 83.3333%; + } + + .ui-xl-11 { + width: 91.6667%; + } + + .ui-xl-12 { + width: 100%; + } +} + +.ui-g-nopad { + padding: 0px; +} \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/serenity-layout/css/layout-green.css b/apc-web/src/main/webapp/resources/serenity-layout/css/layout-green.css new file mode 100644 index 0000000..215a55a --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/css/layout-green.css @@ -0,0 +1,2938 @@ +/* Sidebar */ +/* Primary */ +/* Accent */ +/* Topbar */ +/* Submenu */ +/* Default MenuItem */ +/* Hover MenuItem */ +/* Active MenuItem */ +/* Dark Default MenuItem */ +/* Dark Hover MenuItem */ +/* Dark Active MenuItem */ +/******************************/ +/* Common */ +/******************************/ +/* Predefined Colors */ +/* roboto-300 - latin */ +@font-face { + font-family: "Roboto"; + font-style: normal; + font-weight: 300; + src: url("#{resource['serenity-layout:fonts/roboto-v15-latin-300.eot']}"); + /* IE9 Compat Modes */ + src: local("Roboto Light"), local("Roboto-Light"), url("#{resource['serenity-layout:fonts/roboto-v15-latin-300.eot']}#iefix") format("embedded-opentype"), url("#{resource['serenity-layout:fonts/roboto-v15-latin-300.woff2']}") format("woff2"), url("#{resource['serenity-layout:fonts/roboto-v15-latin-300.woff']}") format("woff"), url("#{resource['serenity-layout:fonts/roboto-v15-latin-300.ttf']}") format("truetype"), url("#{resource['serenity-layout:fonts/roboto-v15-latin-300.svg']}#Roboto") format("svg"); + /* Legacy iOS */ +} +/* roboto-regular - latin */ +@font-face { + font-family: "Roboto"; + font-style: normal; + font-weight: 400; + src: url("#{resource['serenity-layout:fonts/roboto-v15-latin-regular.eot']}"); + /* IE9 Compat Modes */ + src: local("Roboto"), local("Roboto-Regular"), url("#{resource['serenity-layout:fonts/roboto-v15-latin-regular.eot']}#iefix") format("embedded-opentype"), url("#{resource['serenity-layout:fonts/roboto-v15-latin-regular.woff2']}") format("woff2"), url("#{resource['serenity-layout:fonts/roboto-v15-latin-regular.woff']}") format("woff"), url("#{resource['serenity-layout:fonts/roboto-v15-latin-regular.ttf']}") format("truetype"), url("#{resource['serenity-layout:fonts/roboto-v15-latin-regular.svg']}#Roboto") format("svg"); + /* Legacy iOS */ +} +/* roboto-700 - latin */ +@font-face { + font-family: "Roboto"; + font-style: normal; + font-weight: 700; + src: url("#{resource['serenity-layout:fonts/roboto-v15-latin-700.eot']}"); + /* IE9 Compat Modes */ + src: local("Roboto Bold"), local("Roboto-Bold"), url("#{resource['serenity-layout:fonts/roboto-v15-latin-700.eot']}#iefix") format("embedded-opentype"), url("#{resource['serenity-layout:fonts/roboto-v15-latin-700.woff2']}") format("woff2"), url("#{resource['serenity-layout:fonts/roboto-v15-latin-700.woff']}") format("woff"), url("#{resource['serenity-layout:fonts/roboto-v15-latin-700.ttf']}") format("truetype"), url("#{resource['serenity-layout:fonts/roboto-v15-latin-700.svg']}#Roboto") format("svg"); + /* Legacy iOS */ +} +@font-face { + font-family: "Material Icons"; + font-style: normal; + font-weight: 400; + src: url("#{resource['serenity-layout:fonts/MaterialIcons-Regular.eot']}"); + /* For IE6-8 */ + src: local("Material Icons"), local("MaterialIcons-Regular"), url("#{resource['serenity-layout:fonts/MaterialIcons-Regular.woff2']}") format("woff2"), url("#{resource['serenity-layout:fonts/MaterialIcons-Regular.woff']}") format("woff"), url("#{resource['serenity-layout:fonts/MaterialIcons-Regular.ttf']}") format("truetype"); +} +/* Utils */ +.clearfix:after { + content: " "; + display: block; + clear: both; +} + +.card { + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 2px 1px -1px rgba(0, 0, 0, 0.12); + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + background: #ffffff; + padding: 16px; + margin-bottom: 16px; + box-sizing: border-box; +} +.card.card-w-title { + padding-bottom: 32px; +} +.card h1 { + font-size: 24px; + font-weight: 400; + margin: 24px 0; +} +.card h1:first-child { + margin-top: 16px; +} +.card h2 { + font-size: 22px; + font-weight: 400; +} +.card h3 { + font-size: 20px; + font-weight: 400; +} +.card h4 { + font-size: 18px; + font-weight: 400; +} + +.nopad { + padding: 0; +} +.nopad .ui-panel-content { + padding: 0; +} + +@-webkit-keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} +@keyframes fadeInDown { + from { + opacity: 0; + transform: translate3d(0, -20px, 0); + } + to { + opacity: 1; + transform: none; + } +} +@-webkit-keyframes fadeOutUp { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } +} +@keyframes fadeOutUp { + from { + opacity: 1; + } + to { + opacity: 0; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } +} +.fadeInDown { + -webkit-animation: fadeInDown 5s; + /* Safari 4.0 - 8.0 */ + animation: fadeInDown 5s; +} + +.fadeOutUp { + -webkit-animation: fadeOutUp 0.3s; + /* Safari 4.0 - 8.0 */ + animation: fadeOutUp 0.3s; +} + +.ui-shadow-1 { + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); +} + +.ui-shadow-2 { + -webkit-box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23); + -moz-box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23); + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23); +} + +.ui-shadow-3 { + -webkit-box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); + -moz-box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); +} + +.ui-shadow-4 { + -webkit-box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22); + -moz-box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22); + box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22); +} + +.ui-shadow-5 { + -webkit-box-shadow: 0 19px 38px rgba(0, 0, 0, 0.3), 0 15px 12px rgba(0, 0, 0, 0.22); + -moz-box-shadow: 0 19px 38px rgba(0, 0, 0, 0.3), 0 15px 12px rgba(0, 0, 0, 0.22); + box-shadow: 0 19px 38px rgba(0, 0, 0, 0.3), 0 15px 12px rgba(0, 0, 0, 0.22); +} + +.ui-g { + -ms-flex-wrap: wrap; +} +.ui-g.form-group > div { + padding: 12px 16px; +} + +.ui-panelgrid.form-group .ui-panelgrid-cell { + padding: 12px 16px; +} + +.ui-selectoneradio.form-group .ui-grid-row > div, .ui-selectmanycheckbox.form-group .ui-grid-row > div { + padding: 8px 16px; +} + +.dashboard .task-box { + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); +} +.dashboard .task-box .task-box-header { + padding: 8px 14px; +} +.dashboard .task-box .task-box-header:before, .dashboard .task-box .task-box-header:after { + content: ""; + display: table; +} +.dashboard .task-box .task-box-header:after { + clear: both; +} +.dashboard .task-box .task-box-header i { + float: right; + color: #ffffff; +} +.dashboard .task-box .task-box-content { + background-color: #ffffff; + padding: 8px 14px; +} +.dashboard .task-box .task-box-content h3 { + font-weight: bold; + font-size: 14px; + margin: 14px 0 7px 0; + padding: 0; +} +.dashboard .task-box .task-box-content p { + color: #757575; + margin: 0 0 28px 0; + padding: 0; +} +.dashboard .task-box .task-box-footer { + background-color: #ffffff; + padding: 8px 14px; +} +.dashboard .task-box .task-box-footer:before, .dashboard .task-box .task-box-footer:after { + content: ""; + display: table; +} +.dashboard .task-box .task-box-footer:after { + clear: both; +} +.dashboard .task-box .task-box-footer img { + width: 32px; + float: right; + margin-left: 4px; +} +.dashboard .task-box .task-box-footer .task-status { + -moz-border-radius: 9px; + -webkit-border-radius: 9px; + border-radius: 9px; + padding: 2px 8px; + color: #ffffff; +} +.dashboard .task-box.task-box-1 .task-box-header { + background-color: #e91e63; +} +.dashboard .task-box.task-box-1 .task-box-footer .task-status { + background-color: #e91e63; +} +.dashboard .task-box.task-box-2 .task-box-header { + background-color: #ffc107; +} +.dashboard .task-box.task-box-2 .task-box-footer .task-status { + background-color: #ffc107; +} +.dashboard .task-box.task-box-3 .task-box-header { + background-color: #00bcd4; +} +.dashboard .task-box.task-box-3 .task-box-footer .task-status { + background-color: #00bcd4; +} +.dashboard .overview-box { + text-align: center; + color: #ffffff; + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); +} +.dashboard .overview-box .overview-box-header { + height: 24px; +} +.dashboard .overview-box .overview-box-content { + padding: 8px 14px 14px 14px; +} +.dashboard .overview-box .overview-box-content .overview-box-icon { + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; + width: 40px; + height: 40px; + line-height: 40px; + margin: 0 auto; + margin-top: -28px; +} +.dashboard .overview-box .overview-box-content .overview-box-icon i { + line-height: inherit; + font-size: 28px; +} +.dashboard .overview-box .overview-box-content .overview-box-title { + font-size: 16px; +} +.dashboard .overview-box .overview-box-content .overview-box-count { + font-size: 24px; +} +.dashboard .overview-box.overview-box-1 .overview-box-header { + background-color: #f06292; +} +.dashboard .overview-box.overview-box-1 .overview-box-content { + background-color: #e91e63; +} +.dashboard .overview-box.overview-box-1 .overview-box-content .overview-box-icon { + background-color: #e91e63; +} +.dashboard .overview-box.overview-box-2 .overview-box-header { + background-color: #4dd0e1; +} +.dashboard .overview-box.overview-box-2 .overview-box-content { + background-color: #00bcd4; +} +.dashboard .overview-box.overview-box-2 .overview-box-content .overview-box-icon { + background-color: #00bcd4; +} +.dashboard .overview-box.overview-box-3 .overview-box-header { + background-color: #ffd54f; +} +.dashboard .overview-box.overview-box-3 .overview-box-content { + background-color: #ffc107; +} +.dashboard .overview-box.overview-box-3 .overview-box-content .overview-box-icon { + background-color: #ffc107; +} +.dashboard .overview-box.overview-box-4 .overview-box-header { + background-color: #9e9e9e; +} +.dashboard .overview-box.overview-box-4 .overview-box-content { + background-color: #616161; +} +.dashboard .overview-box.overview-box-4 .overview-box-content .overview-box-icon { + background-color: #616161; +} +.dashboard .task-list { + overflow: hidden; +} +.dashboard .task-list > .ui-panel { + min-height: 340px; + border: 0 none; + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); +} +.dashboard .task-list .ui-panel-content { + padding: 10px 0 !important; +} +.dashboard .task-list button { + margin-top: -25px; + margin-right: 10px; + float: right; +} +.dashboard .task-list ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.dashboard .task-list ul li { + padding: 9.76px 14px; + border-bottom: 1px solid #dbdbdb; +} +.dashboard .task-list ul li:first-child { + margin-top: 10px; +} +.dashboard .task-list ul .ui-chkbox { + vertical-align: middle; + margin-right: 5px; +} +.dashboard .task-list ul .task-name { + vertical-align: middle; +} +.dashboard .task-list ul i { + color: #757575; + float: right; +} +.dashboard .contact-form { + overflow: hidden; +} +.dashboard .contact-form .ui-panel { + min-height: 340px; + border: 0 none; + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); +} +.dashboard .contact-form .ui-g-12 { + padding: 16px 10px; +} +.dashboard .contact-form .ui-button { + margin-top: 20px; +} +.dashboard .messages { + overflow: hidden; +} +.dashboard .messages > .ui-panel { + min-height: 340px; + border: 0 none; + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); +} +.dashboard .messages .ui-panel-content { + padding: 15px 0 10px 0 !important; +} +.dashboard .messages ul { + list-style-type: none; + padding: 0; + margin: 0; +} +.dashboard .messages ul li { + border-bottom: 1px solid #d8d8d8; +} +.dashboard .messages ul li a { + padding: 9px; + width: 100%; + box-sizing: border-box; + text-decoration: none; + position: relative; + display: block; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + -moz-transition: background-color 0.2s; + -o-transition: background-color 0.2s; + -webkit-transition: background-color 0.2s; + transition: background-color 0.2s; +} +.dashboard .messages ul li a:before, .dashboard .messages ul li a:after { + content: ""; + display: table; +} +.dashboard .messages ul li a:after { + clear: both; +} +.dashboard .messages ul li a img { + float: left; +} +.dashboard .messages ul li a > div { + float: left; + margin-left: 10px; +} +.dashboard .messages ul li a > div .name { + font-size: 14px; + font-weight: 700; + display: block; + color: #212121; +} +.dashboard .messages ul li a > div .message { + font-size: 14px; + color: #757575; +} +.dashboard .messages ul li a button { + position: absolute; + top: 15px; +} +.dashboard .messages ul li a button.message-btn { + right: 20px; +} +.dashboard .messages ul li a button.remove-btn { + right: 60px; +} +.dashboard .messages ul li a:hover { + cursor: pointer; + background-color: #e8e8e8; +} +.dashboard .messages ul li:last-child { + border: 0; +} +.dashboard .chat .ui-panel { + border: 0 none; + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); +} +.dashboard .chat .ui-panel-content { + padding: 0 !important; +} +.dashboard .chat .ui-tabs { + border-color: transparent; +} +.dashboard .chat ul { + padding: 12px; + margin: 0; + list-style-type: none; +} +.dashboard .chat ul li { + padding: 6px 0; +} +.dashboard .chat ul li:before, .dashboard .chat ul li:after { + content: ""; + display: table; +} +.dashboard .chat ul li:after { + clear: both; +} +.dashboard .chat ul li img { + width: 36px; + float: left; +} +.dashboard .chat ul li span { + padding: 6px 12px; + float: left; + display: inline-block; + margin: 4px 0; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + border-radius: 10px; +} +.dashboard .chat ul li.message-from img, .dashboard .chat ul li.message-from span { + float: left; +} +.dashboard .chat ul li.message-from img { + margin-right: 8px; +} +.dashboard .chat ul li.message-from span { + background-color: #e8eaf6; +} +.dashboard .chat ul li.message-own img, .dashboard .chat ul li.message-own span { + float: right; +} +.dashboard .chat ul li.message-own img { + margin-left: 8px; +} +.dashboard .chat ul li.message-own span { + background: #c8e6c9; + color: #000000; +} +.dashboard .chat .new-message { + height: 40px; + border-top: 1px solid #dce2e7; + color: #afafc0; +} +.dashboard .chat .new-message .message-attachment { + display: inline-block; + border-right: 1px solid #dce2e7; + width: 40px; + line-height: 40px; + height: 100%; + text-align: center; +} +.dashboard .chat .new-message .message-attachment i { + line-height: inherit; + font-size: 24px; +} +.dashboard .chat .new-message .message-input { + position: relative; + top: -6px; + width: calc(100% - 100px); + display: inline-block; +} +.dashboard .chat .new-message .message-input input { + border: 0 none; + font-size: 14px; + width: 100%; + background-color: transparent; + outline: 0 none; + color: #757575; +} +.dashboard .global-sales .header-helper { + float: right; + opacity: 0.7; + filter: alpha(opacity=70); +} +.dashboard .global-sales .ui-panel { + border: 0 none; + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); +} +.dashboard .global-sales .ui-panel-content { + padding: 14px 9px 0px 9px; +} +.dashboard .global-sales table { + width: 100%; + border-collapse: collapse; +} +.dashboard .global-sales table th { + font-weight: 700; + text-align: left; + padding: 8px 5px; +} +.dashboard .global-sales table tbody tr { + border-top: 1px solid #dbdbdb; +} +.dashboard .global-sales table tbody tr img { + width: 36px; + height: 36px; +} +.dashboard .global-sales table tbody tr td { + padding: 8px 5px; +} +.dashboard .global-sales table tbody tr td:nth-child(1) { + font-weight: 700; + text-align: center; +} +.dashboard .global-sales table tbody tr td:nth-child(3) { + font-weight: 700; +} +.dashboard .global-sales table tbody tr td:nth-child(7) { + text-align: right; +} +.dashboard .global-sales table tbody tr td:nth-child(7) button { + margin-left: 10px; +} +.dashboard .global-sales table tbody tr td .up-arrow { + color: #cddc39; +} +.dashboard .global-sales table tbody tr td .down-arrow { + color: #e91e63; +} +.dashboard .status-bars ul { + margin: 0; + padding: 0; + list-style-type: none; +} +.dashboard .status-bars ul li { + padding: 8px 14px; + position: relative; +} +.dashboard .status-bars ul li span { + position: absolute; + right: 36px; + top: 8px; +} +.dashboard .status-bars ul li i { + position: absolute; + right: 4px; + top: 4px; +} +.dashboard .status-bars .status-bar { + height: 18px; + width: 75%; + background-color: #d8d8d8; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + border-radius: 6px; +} +.dashboard .status-bars .status-bar .status-bar-value { + height: 100%; + color: #ffffff; + text-align: right; + padding-right: 4px; + padding-top: 1px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + border-radius: 6px; +} +.dashboard .status-bars .status-bar.status-bar-1 .status-bar-value { + background-color: #e91e63; +} +.dashboard .status-bars .status-bar.status-bar-1 ~ i { + color: #e91e63; +} +.dashboard .status-bars .status-bar.status-bar-2 .status-bar-value { + background-color: #00bcd4; +} +.dashboard .status-bars .status-bar.status-bar-2 ~ i { + color: #00bcd4; +} +.dashboard .status-bars .status-bar.status-bar-3 .status-bar-value { + background-color: #ffc107; +} +.dashboard .status-bars .status-bar.status-bar-3 ~ i { + color: #ffc107; +} +.dashboard .status-bars .status-bar.status-bar-4 .status-bar-value { + background-color: #cddc39; +} +.dashboard .status-bars .status-bar.status-bar-4 ~ i { + color: #cddc39; +} +.dashboard .status-bars .status-bar.status-bar-5 .status-bar-value { + background-color: #ff9800; +} +.dashboard .status-bars .status-bar.status-bar-5 ~ i { + color: #ff9800; +} +.dashboard .image-box .card { + padding: 0; +} +.dashboard .image-box .card img { + width: 100%; +} +.dashboard .image-box .card .image-box-content { + padding: 16px; +} +.dashboard .image-box .card .image-box-content h3 { + font-weight: 700; + margin-top: 0; +} +.dashboard .image-box .card .image-box-content .image-box-tag { + width: 40px; + text-align: left; + color: #ffffff; + background-color: #e91e63; + padding: 0 8px; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + border-radius: 6px; +} +.dashboard .image-box .card .image-box-footer { + text-align: right; +} +.dashboard .user-card { + border: 1px solid #dbdbdb; + padding: 0; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +.dashboard .user-card .user-card-header { + height: 100px; + overflow: hidden; +} +.dashboard .user-card .user-card-header img { + width: 100%; +} +.dashboard .user-card .user-card-content { + min-height: 340px; + background-color: #ffffff; + position: relative; +} +.dashboard .user-card .user-card-content img { + position: absolute; + top: -90px; + left: 24px; +} +.dashboard .user-card .user-card-content .ui-button { + position: absolute; + width: 36px; + height: 36px; + top: -18px; + right: 24px; +} +.dashboard .user-card .user-card-content .user-card-name { + font-size: 20px; + color: #212121; + position: absolute; + top: -60px; + margin-left: 110px; + font-weight: 700; + white-space: nowrap; +} +.dashboard .user-card .user-card-content .user-detail { + text-align: left; +} +.dashboard .user-card .user-card-content .user-detail ul { + padding: 0px 0 32px 0; + margin: 0; + list-style-type: none; +} +.dashboard .user-card .user-card-content .user-detail ul li { + padding: 16px 24px; + border-top: 1px solid #dbdbdb; +} +.dashboard .user-card .user-card-content .user-detail ul li:last-child { + border-bottom: 1px solid #dbdbdb; +} +.dashboard .user-card .user-card-content .user-detail ul li i { + font-size: 24px; + margin-right: 8px; + width: 32px; + vertical-align: middle; +} +.dashboard .user-card .user-card-content .user-detail ul li .project-title { + font-weight: 700; + margin-right: 8px; +} +.dashboard .user-card .user-card-content .user-detail ul li .project-detail { + color: #757575; +} +.dashboard .user-card .user-card-content .user-detail ul li .project-progressbar { + display: inline-block; + width: 100px; + background-color: #dbdbdb; + float: right; + margin-top: 12px; +} +.dashboard .user-card .user-card-content .user-detail ul li .project-progressbar .project-progressbar-value { + background-color: #4384D0; + height: 4px; +} +.dashboard .map .ui-panel { + border: 0 none; + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); +} +.dashboard .map .ui-panel .ui-panel-content { + padding: 8px; +} +.dashboard .map .ui-panel .ui-panel-content img { + width: 100%; +} +.dashboard .schedule .ui-panel { + border: 0 none; + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); +} +.dashboard .schedule .ui-panel .fc-today-button { + display: none; +} + +@media (max-width: 640px) { + .dashboard .status-bars .status-bar { + width: 65%; + } + .dashboard .global-sales table tbody tr td:nth-child(7) { + text-align: left; + } + .dashboard .global-sales table tbody tr td:nth-child(7) button { + display: block; + margin-left: 0; + } + .dashboard .global-sales table tbody tr td:nth-child(7) button:first-child { + margin-bottom: 4px; + } +} +.login-body { + background-image: url("#{resource['serenity-layout:images/login/login-bg.jpg']}"); + height: 100%; + background-position: center; + background-repeat: no-repeat; + background-size: cover; +} +.login-body .login-panel { + width: 550px; + height: 480px; + background-color: #ffffff; + position: absolute; + left: 50%; + top: 50%; + margin-left: -275px; + margin-top: -240px; + padding: 0; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + -webkit-box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.2), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 6px 10px 0 rgba(0, 0, 0, 0.14); + -moz-box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.2), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 6px 10px 0 rgba(0, 0, 0, 0.14); + box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.2), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 6px 10px 0 rgba(0, 0, 0, 0.14); +} +.login-body .login-panel .login-panel-header { + background-color: #1B4159; + text-align: center; + padding: 8px 14px; +} +.login-body .login-panel .login-panel-header img { + vertical-align: middle; + width: 135px; +} +.login-body .login-panel .login-panel-content { + padding: 50px 100px; +} +.login-body .login-panel .login-panel-content h1 { + font-size: 16px; + margin-top: 0; + margin-bottom: 16px; + text-align: center; +} +.login-body .login-panel .login-panel-content .ui-g-12, .login-body .login-panel .login-panel-content .ui-g-6 { + padding: 1em; +} +.login-body .login-panel .login-panel-content .ui-g-12:last-child, .login-body .login-panel .login-panel-content .ui-g-6:last-child { + text-align: center; +} +.login-body .login-panel .login-panel-content .ui-g-12:last-child a, .login-body .login-panel .login-panel-content .ui-g-6:last-child a { + color: #1B4159; +} +.login-body .login-panel .login-panel-content .password-reset { + text-align: right; +} +.login-body .login-panel .login-panel-content .password-reset a { + color: #757575; +} +.login-body .login-panel .login-panel-content .ui-chkbox-label { + margin: 0 0 0 8px; + vertical-align: middle; +} + +@media (max-width: 640px) { + .login-body .login-panel { + left: 0; + margin-left: 0; + width: 100%; + } + .login-body .login-panel .login-panel-content { + padding: 50px 25px; + } +} +.exception-body { + height: 100%; + background-position: center; + background-repeat: no-repeat; + background-size: cover; +} +.exception-body.error { + background-image: url("#{resource['serenity-layout:images/exception/error-bg.jpg']}"); +} +.exception-body.error .exception-panel .exception-code { + background-color: #e91e63; +} +.exception-body.error .exception-panel .exception-code img { + margin-left: -194px; +} +.exception-body.error .exception-panel .exception-icon { + background-color: #e91e63; +} +.exception-body.notfound { + background-image: url("#{resource['serenity-layout:images/exception/notfound-bg.jpg']}"); +} +.exception-body.notfound .exception-panel .exception-code { + background-color: #e91e63; +} +.exception-body.notfound .exception-panel .exception-code img { + margin-left: -206px; +} +.exception-body.notfound .exception-panel .exception-icon { + background-color: #e91e63; +} +.exception-body.accessdenied { + background-image: url("#{resource['serenity-layout:images/exception/access-bg.jpg']}"); +} +.exception-body.accessdenied .exception-panel .exception-code { + background-color: #ffb300; +} +.exception-body.accessdenied .exception-panel .exception-code img { + margin-left: -178px; +} +.exception-body.accessdenied .exception-panel .exception-icon { + background-color: #ffb300; +} +.exception-body .exception-panel { + width: 550px; + height: 480px; + background-color: #ffffff; + position: absolute; + left: 50%; + top: 50%; + margin-left: -275px; + margin-top: -240px; + padding: 0; + text-align: center; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + -webkit-box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.2), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 6px 10px 0 rgba(0, 0, 0, 0.14); + -moz-box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.2), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 6px 10px 0 rgba(0, 0, 0, 0.14); + box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.2), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 6px 10px 0 rgba(0, 0, 0, 0.14); +} +.exception-body .exception-panel .exception-code { + height: 240px; + position: relative; +} +.exception-body .exception-panel .exception-code img { + position: absolute; + bottom: 0; + height: 190px; + left: 50%; +} +.exception-body .exception-panel .exception-detail { + height: 240px; + position: relative; + padding: 60px 0 0 0; +} +.exception-body .exception-panel .exception-detail .exception-icon { + width: 90px; + height: 90px; + line-height: 90px; + text-align: center; + display: inline-block; + z-index: 100; + position: absolute; + top: -45px; + left: 50%; + margin-left: -45px; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; + -webkit-box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.12), 0 0 1px 0 rgba(0, 0, 0, 0.14); + -moz-box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.12), 0 0 1px 0 rgba(0, 0, 0, 0.14); + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.12), 0 0 1px 0 rgba(0, 0, 0, 0.14); +} +.exception-body .exception-panel .exception-detail .exception-icon i { + font-size: 45px; + line-height: inherit; + color: #ffffff; +} +.exception-body .exception-panel .exception-detail h1 { + font-size: 15px; + font-weight: bold; + margin: 10px 0 8px 0; +} +.exception-body .exception-panel .exception-detail p { + color: #757575; + margin: 0 0 60px 0; +} + +@media (max-width: 640px) { + .exception-body .exception-panel { + left: 0; + margin-left: 0; + width: 100%; + } + .exception-body.error .exception-panel .exception-code img { + height: 150px; + margin-left: -150px; + } + .exception-body.notfound .exception-panel .exception-code img { + height: 150px; + margin-left: -163px; + } + .exception-body.accessdenied .exception-panel .exception-code img { + height: 150px; + margin-left: -141px; + } +} +.landing-body { + background-color: #F5F5F5; +} +.landing-body * { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.landing-body p { + line-height: 1.5; +} +.landing-body #header { + background-color: #F5F5F5; +} +.landing-body #header > div { + width: 960px; + margin: 0 auto; + height: 90px; + padding: 15px 0; +} +.landing-body #header > div img { + height: 60px; +} +.landing-body #header > div #landing-menu { + float: right; + list-style-type: none; + padding: 0; + margin: 20px 0 0 0; +} +.landing-body #header > div #landing-menu > li { + display: inline-block; +} +.landing-body #header > div #landing-menu > li a { + border-bottom: 5px solid transparent; + color: #616161; + display: inline-block; + min-width: 80px; + text-align: center; + height: 55px; + font-size: 15px; + -moz-transition: border-color 0.3s; + -o-transition: border-color 0.3s; + -webkit-transition: border-color 0.3s; + transition: border-color 0.3s; +} +.landing-body #header > div #landing-menu > li:hover a { + color: #3f51b5; + border-color: #3f51b5; +} +.landing-body #header > div #landing-menu-button { + color: #3f51b5; + display: none; + float: right; + margin-right: 15px; + margin-top: 5px; +} +.landing-body #header > div #landing-menu-button i { + font-size: 48px; +} +.landing-body #introduction > div { + background: url("#{resource['serenity-layout:images/landing/landing-header.png']}") no-repeat; + min-height: 400px; + color: #ffffff; + text-align: center; + padding-top: 120px; + background-size: cover; +} +.landing-body #introduction > div h1 { + padding: 0; + margin: 0 0 20px 0; +} +.landing-body #introduction > div p { + max-width: 400px; + margin: 0 auto; + margin-bottom: 40px; +} +.landing-body #introduction > div button { + min-width: 180px; +} +.landing-body #features > div { + width: 960px; + margin: 0 auto; + padding: 60px 0; +} +.landing-body #features > div .feature-box { + padding: 30px 15px 30px 0; +} +.landing-body #features > div .feature-box:before, .landing-body #features > div .feature-box:after { + content: ""; + display: table; +} +.landing-body #features > div .feature-box:after { + clear: both; +} +.landing-body #features > div .feature-box img { + float: left; + margin-right: 30px; +} +.landing-body #features > div .feature-box > div { + padding: 16px 0; +} +.landing-body #features > div .feature-box > div h3 { + font-size: 15px; + margin: 0; +} +.landing-body #features > div .feature-box > div p { + color: #757575; + margin: 8px; +} +.landing-body #stats { + background-color: #212121; + background-image: -webkit-gradient(linear, left top, left bottom, from(#212121), to(#424242)); + background-image: -webkit-linear-gradient(top, #212121, #424242); + background-image: -moz-linear-gradient(top, #212121, #424242); + background-image: -ms-linear-gradient(top, #212121, #424242); + background-image: -o-linear-gradient(top, #212121, #424242); + background-image: linear-gradient(to bottom, #212121, #424242); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#212121", endColorstr="#424242"); +} +.landing-body #stats > div { + width: 960px; + margin: 0 auto; + padding: 40px 0; +} +.landing-body #stats > div .ui-g-12 { + padding: 20px; +} +.landing-body #stats > div .stat-box { + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + background-color: #ffffff; + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + padding: 18px; + text-align: center; + color: #e91e63; +} +.landing-body #stats > div .stat-box h3 { + font-weight: 400; + margin: 0; +} +.landing-body #stats > div .stat-box p { + margin: 0; +} +.landing-body #stats > div .stat-box.stat-box-active { + background-color: #e91e63; + color: #ffffff; +} +.landing-body #video { + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); +} +.landing-body #video > div { + width: 960px; + margin: 0 auto; + padding: 60px 0; +} +.landing-body #video > div .video-description { + padding-top: 80px; + padding-right: 50px; +} +.landing-body #video > div .video-description h3 { + font-weight: 400; + font-size: 24px; + margin: 0 0 12px 0; +} +.landing-body #video > div .video-description p { + margin: 0 0 24px 0; +} +.landing-body #pricing > div { + width: 960px; + margin: 0 auto; + padding: 60px 0; + text-align: center; +} +.landing-body #pricing > div > h2 { + font-size: 24px; + font-weight: normal; + margin: 0 0 12px 0; +} +.landing-body #pricing > div > p { + color: #757575; + margin: 0 0 40px 0; +} +.landing-body #pricing > div .pricing-box { + width: 100%; + text-align: left; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +.landing-body #pricing > div .pricing-box .pricing-header { + background-color: #212121; + padding: 16px; + text-align: center; +} +.landing-body #pricing > div .pricing-box .pricing-header h3 { + margin: 0; + color: #ffffff; + font-size: 15px; + font-weight: 400; + padding-bottom: 4px; + border-bottom: 1px solid #a7a5a5; +} +.landing-body #pricing > div .pricing-box .pricing-header p { + color: #a7a5a5; + margin: 0; + padding: 4px 0 0 0; +} +.landing-body #pricing > div .pricing-box .pricing-content { + padding: 16px; + min-height: 350px; + position: relative; + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); +} +.landing-body #pricing > div .pricing-box .pricing-content ul { + list-style-type: none; + margin: 0; + padding: 0; +} +.landing-body #pricing > div .pricing-box .pricing-content ul li { + padding: 8px 0; +} +.landing-body #pricing > div .pricing-box .pricing-content ul li i { + color: #4caf50; + vertical-align: middle; + margin-right: 6px; +} +.landing-body #pricing > div .pricing-box .pricing-content button { + position: absolute; + min-width: 180px; + bottom: 20px; + left: 50%; + margin-left: -90px; +} +.landing-body #pricing > div .pricing-box .pricing-content .pricing-fee { + position: absolute; + top: -24px; + right: 14px; + margin-left: -90px; + text-align: center; + font-size: 16px; + width: 48px; + height: 48px; + line-height: 48px; + background-color: #e91e63; + color: #ffffff; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); +} +.landing-body #pricing > div .pricing-box.pricing-box-pro .pricing-header { + background-color: #e91e63; + color: #ffffff; +} +.landing-body #pricing > div .pricing-box.pricing-box-pro .pricing-header h3 { + border-bottom: 1px solid #ffffff; +} +.landing-body #pricing > div .pricing-box.pricing-box-pro .pricing-header p { + color: #ffffff; +} +.landing-body #pricing > div .pricing-box.pricing-box-pro .pricing-content .pricing-fee { + background-color: #212121; + color: #ffffff; +} +.landing-body #contact { + background-color: #424242; +} +.landing-body #contact > div { + width: 960px; + margin: 0 auto; + padding: 60px 0; + text-align: center; +} +.landing-body #contact > div > h2 { + font-size: 24px; + font-weight: normal; + margin: 0 0 12px 0; + color: #f5f5f5; +} +.landing-body #contact > div > p { + margin: 0 0 40px 0; + color: #e0e0e0; +} +.landing-body #contact > div .contact-form { + text-align: left; +} +.landing-body #contact > div .contact-form > div { + padding: 1em 0.5em; +} +.landing-body #contact > div .contact-form button { + width: auto; + min-width: 180px; + margin-left: 15px; + margin-top: 40px; +} +.landing-body #contact > div .contact-form .md-inputfield input:focus ~ label, +.landing-body #contact > div .contact-form .md-inputfield input.ui-state-filled ~ label, +.landing-body #contact > div .contact-form .md-inputfield textarea:focus ~ label, +.landing-body #contact > div .contact-form .md-inputfield textarea.ui-state-filled ~ label, +.landing-body #contact > div .contact-form .md-inputfield .md-inputwrapper-focus ~ label, +.landing-body #contact > div .contact-form .md-inputfield .md-inputwrapper-filled ~ label { + color: #81C784; +} +.landing-body #contact > div .contact-form .md-inputfield input:-webkit-autofill ~ label { + color: #81C784; +} +.landing-body #contact > div .contact-form .md-inputfield input:focus { + border-color: #81C784; +} +.landing-body #contact > div .contact-form .md-inputfield input { + color: #ffffff; +} +.landing-body #footer { + background-color: #212121; + color: #ffffff; +} +.landing-body #footer > div { + width: 960px; + margin: 0 auto; + padding: 30px 0; +} +.landing-body #footer > div .footer-logo { + height: 54px; + float: left; + margin-right: 14px; +} +.landing-body #footer > div h4 { + margin: 0 0 8px 0; + font-weight: 700; +} +.landing-body #footer > div p { + margin: 0; + line-height: 1.5; +} +.landing-body #footer > div p:last-child { + margin-top: 8px; +} +.landing-body #footer > div i { + vertical-align: middle; +} +.landing-body #footer > div .footer-social a { + margin-right: 14px; + opacity: 0.7; + filter: alpha(opacity=70); +} +.landing-body #footer > div .footer-social a img { + width: 30px; + height: 30px; +} +.landing-body #footer > div .footer-social a:hover { + opacity: 1; + filter: alpha(opacity=100); +} + +@media screen and (max-width: 64em) { + .landing-body { + padding-top: 90px; + } + .landing-body #header { + position: fixed; + top: 0; + z-index: 100; + width: 100%; + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + } + .landing-body #header > div { + width: 100%; + padding-left: 15px; + } + .landing-body #header > div #landing-menu-button { + display: block; + } + .landing-body #header > div #landing-menu { + -webkit-animation-duration: 0.5s; + -moz-animation-duration: 0.5s; + animation-duration: 0.5s; + display: none; + float: none; + width: 100%; + text-align: center; + background-color: #F5F5F5; + position: fixed; + top: 70px; + left: 0; + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 0 2px 0 rgba(0, 0, 0, 0.14); + } + .landing-body #header > div #landing-menu li { + display: block; + } + .landing-body #header > div #landing-menu li a { + height: auto; + border-bottom: 0 none; + padding: 15px; + } + .landing-body #header > div #landing-menu.landing-menu-active { + display: block; + } + .landing-body #introduction { + width: 100%; + } + .landing-body #introduction > div h1, .landing-body #introduction > div p { + padding-left: 15px; + padding-right: 15px; + } + .landing-body #features > div { + width: 100%; + padding-left: 15px; + } + .landing-body #stats > div { + width: 100%; + } + .landing-body #video > div { + width: 100%; + text-align: center; + padding-left: 15px; + padding-right: 15px; + } + .landing-body #video > div .video-description { + padding-top: 0; + padding-right: 0; + } + .landing-body #video > div iframe { + width: 300px; + height: 200px; + } + .landing-body #pricing > div { + width: 100%; + adding-left: 15px; + padding-right: 15px; + } + .landing-body #contact > div { + width: 100%; + text-align: center; + } + .landing-body #contact > div .contact-map { + text-align: center; + } + .landing-body #contact > div .contact-map img { + width: 100%; + } + .landing-body #contact > div .contact-form .ui-g-12 { + padding: 15px; + } + .landing-body #footer > div { + width: 100%; + } + .landing-body #footer > div .ui-g-12 { + padding-top: 24px; + } +} +html { + height: 100%; +} + +body { + font-family: "Roboto", "Helvetica Neue", sans-serif; + font-size: 14px; + color: #212121; + -webkit-font-smoothing: antialiased; + padding: 0; + margin: 0; + min-height: 100%; + background-color: #F5F5F5; +} +body .ajax-loader { + font-size: 32px; + color: #1B4159; +} + +.layout-wrapper .layout-sidebar { + width: 240px; + height: 100%; + position: fixed; + left: -180px; + top: 0; + -webkit-transition-timing-function: cubic-bezier(0.86, 0, 0.07, 1); + transition-timing-function: cubic-bezier(0.86, 0, 0.07, 1); + z-index: 999999; + background-color: #ffffff; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -moz-transition: left 0.3s; + -o-transition: left 0.3s; + -webkit-transition: left 0.3s; + transition: left 0.3s; + -webkit-box-shadow: 3px 0 6px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 3px 0 6px rgba(0, 0, 0, 0.3); + box-shadow: 3px 0 6px rgba(0, 0, 0, 0.3); +} +.layout-wrapper .layout-sidebar .sidebar-logo { + height: 64px; + background-color: #1B4159; + padding-top: 8px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.layout-wrapper .layout-sidebar .sidebar-logo img { + height: 48px; + margin-left: 12px; + vertical-align: middle; +} +.layout-wrapper .layout-sidebar .sidebar-logo .sidebar-anchor { + display: none; + width: 18px; + height: 18px; + border: 2px solid #ffffff; + background-color: #4384D0; + vertical-align: middle; + float: right; + margin-right: 8px; + margin-top: 12px; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; +} +.layout-wrapper .layout-sidebar .sidebar-logo .app-name { + color: #ffffff; + vertical-align: middle; + font-size: 26px; +} +.layout-wrapper .layout-sidebar .layout-menu { + list-style-type: none; + margin: 10px 0 0 0; + padding: 0; +} +.layout-wrapper .layout-sidebar .layout-menu li { + padding: 4px 10px; + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.layout-wrapper .layout-sidebar .layout-menu li.active-menuitem > a { + color: #4384D0; +} +.layout-wrapper .layout-sidebar .layout-menu li.active-menuitem > a i { + color: #4384D0; +} +.layout-wrapper .layout-sidebar .layout-menu li.active-menuitem > a i.layout-submenu-toggler { + -webkit-transform: rotate(-180deg); + -moz-transform: rotate(-180deg); + -o-transform: rotate(-180deg); + -ms-transform: rotate(-180deg); + transform: rotate(-180deg); +} +.layout-wrapper .layout-sidebar .layout-menu li > a { + color: #212121; + display: block; + padding: 10px 10px 10px 10px; + position: relative; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -webkit-transition: all 0.3s; + transition: all 0.3s; +} +.layout-wrapper .layout-sidebar .layout-menu li > a:hover { + background-color: #E0E0E0; + color: #212121; +} +.layout-wrapper .layout-sidebar .layout-menu li > a:hover i { + color: #212121; +} +.layout-wrapper .layout-sidebar .layout-menu li > a > .menuitem-text { + display: inline-block; + max-width: 145px; + word-break: break-all; +} +.layout-wrapper .layout-sidebar .layout-menu li > a i { + color: #616161; + float: right; + width: 20px; + height: 20px; + font-size: 20px; + position: absolute; + right: 10px; + top: 50%; + margin-top: -10px; +} +.layout-wrapper .layout-sidebar .layout-menu li > a i.layout-submenu-toggler { + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -webkit-transition: all 0.3s; + transition: all 0.3s; + right: 34px; + display: none; +} +.layout-wrapper .layout-sidebar .layout-menu li > a .menuitem-badge { + display: none; + position: absolute; + right: 54px; + top: 50%; + margin-top: -8px; +} +.layout-wrapper .layout-sidebar .layout-menu li ul { + display: none; + list-style-type: none; + margin: 0; + padding: 0; +} +.layout-wrapper .layout-sidebar .layout-menu li ul li { + padding: 4px 0; +} +.layout-wrapper .layout-sidebar .layout-menu li ul li a { + padding-left: 20px; +} +.layout-wrapper .layout-sidebar .layout-menu li ul li ul li a { + padding-left: 30px; +} +.layout-wrapper .layout-sidebar .layout-menu li ul li ul li ul li a { + padding-left: 40px; +} +.layout-wrapper .layout-sidebar .layout-menu li ul li ul li ul ul li a { + padding-left: 50px; +} +.layout-wrapper .layout-sidebar .layout-menu li ul li ul li ul ul ul li a { + padding-left: 60px; +} +.layout-wrapper .layout-sidebar .layout-menu li ul li ul li ul ul ul ul li a { + padding-left: 70px; +} +.layout-wrapper .layout-sidebar .layout-menu li ul li ul li ul ul ul ul ul li a { + padding-left: 80px; +} +.layout-wrapper .layout-sidebar .layout-menu > li > a { + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + border-radius: 6px; +} +.layout-wrapper .layout-sidebar .layout-menu > li.active-menuitem > a { + color: #ffffff; + background-color: #4384D0; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + border-radius: 6px; + -moz-border-radius-bottomleft: 0; + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-bottomright: 0; + -webkit-border-bottom-right-radius: 0; + border-bottom-right-radius: 0; + -webkit-box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(60, 72, 88, 0.3), 0 7px 10px -5px rgba(60, 72, 88, 0.1); + -moz-box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(60, 72, 88, 0.3), 0 7px 10px -5px rgba(60, 72, 88, 0.1); + box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(60, 72, 88, 0.3), 0 7px 10px -5px rgba(60, 72, 88, 0.1); +} +.layout-wrapper .layout-sidebar .layout-menu > li.active-menuitem > a i { + color: #ffffff; +} +.layout-wrapper .layout-sidebar .layout-menu > li.active-menuitem > ul { + background-color: #EEEEEE; + -moz-border-radius-bottomleft: 6px; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -moz-border-radius-bottomright: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.layout-wrapper .layout-sidebar .layout-menu .menuitem-badge { + float: right; + display: inline-block; + width: 16px; + height: 16px; + margin-right: 6px; + text-align: center; + background-color: #1B4159; + color: #ffffff; + font-size: 12px; + font-weight: 700; + line-height: 16px; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; +} +.layout-wrapper .layout-sidebar.layout-sidebar-active { + left: 0; +} +.layout-wrapper .layout-sidebar.layout-sidebar-active .sidebar-logo img { + display: inline; +} +.layout-wrapper .layout-sidebar.layout-sidebar-active .sidebar-logo .sidebar-anchor { + display: inline-block; +} +.layout-wrapper .layout-sidebar.layout-sidebar-active .layout-menu li a i.layout-submenu-toggler { + display: inline-block; +} +.layout-wrapper .layout-sidebar.layout-sidebar-active .layout-menu li a .menuitem-badge { + display: inline-block; +} +.layout-wrapper .layout-sidebar .nano .sidebar-scroll-content { + display: block; + height: 100%; + position: relative; +} +.layout-wrapper .layout-sidebar .nano .sidebar-scroll-content .layout-menu { + padding-bottom: 120px; +} +.layout-wrapper .layout-sidebar .nano .nano-pane .nano-slider { + background-color: #aaaaaa; + opacity: 0.3; + filter: alpha(opacity=30); +} +.layout-wrapper .layout-sidebar.layout-sidebar-dark { + background-color: #1B4159; +} +.layout-wrapper .layout-sidebar.layout-sidebar-dark .layout-menu li > a { + color: #dee0e3; +} +.layout-wrapper .layout-sidebar.layout-sidebar-dark .layout-menu li > a:hover { + background-color: #2E7D32; + color: #ffffff; +} +.layout-wrapper .layout-sidebar.layout-sidebar-dark .layout-menu li > a:hover i { + color: #ffffff; +} +.layout-wrapper .layout-sidebar.layout-sidebar-dark .layout-menu li > a i { + color: #dee0e3; +} +.layout-wrapper .layout-sidebar.layout-sidebar-dark .layout-menu li.active-menuitem > a { + color: #81C784; +} +.layout-wrapper .layout-sidebar.layout-sidebar-dark .layout-menu li.active-menuitem > a i { + color: #81C784; +} +.layout-wrapper .layout-sidebar.layout-sidebar-dark .layout-menu > li.active-menuitem > a { + background-color: #2E7D32; + color: #ffffff; +} +.layout-wrapper .layout-sidebar.layout-sidebar-dark .layout-menu > li.active-menuitem > a i { + color: #ffffff; +} +.layout-wrapper .layout-sidebar.layout-sidebar-dark .layout-menu > li.active-menuitem > ul { + background-color: #B8860B; +} +.layout-wrapper .layout-main { + margin-left: 60px; + -moz-transition: margin-left 0.3s; + -o-transition: margin-left 0.3s; + -webkit-transition: margin-left 0.3s; + transition: margin-left 0.3s; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.layout-wrapper .layout-main .layout-topbar { + height: 64px; + background-color: #4384D0; + padding: 16px 42px 16px 24px; + position: fixed; + width: calc(100% - 40px); + -moz-transition: width 0.3s; + -o-transition: width 0.3s; + -webkit-transition: width 0.3s; + transition: width 0.3s; + -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 4px 5px 0 rgba(0, 0, 0, 0.14); + -moz-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 4px 5px 0 rgba(0, 0, 0, 0.14); + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 4px 5px 0 rgba(0, 0, 0, 0.14); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + z-index: 999997; +} +.layout-wrapper .layout-main .layout-topbar .topbar-logo { + display: none; +} +.layout-wrapper .layout-main .layout-topbar .menu-btn { + display: none; + color: #ffffff; + float: left; +} +.layout-wrapper .layout-main .layout-topbar .menu-btn i { + font-size: 32px; +} +.layout-wrapper .layout-main .layout-topbar .topbar-menu-btn { + display: none; + color: #ffffff; + float: right; +} +.layout-wrapper .layout-main .layout-topbar .topbar-menu-btn i { + font-size: 32px; +} +.layout-wrapper .layout-main .layout-topbar .mobile-logo { + display: none; + height: 48px; + margin-top: -8px; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .sidebar-logo { + display: none; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu { + list-style-type: none; + margin: 0; + padding: 0; + vertical-align: middle; + margin: 0; + -webkit-animation-duration: 0s; + -moz-animation-duration: 0s; + animation-duration: 0s; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu:before, .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu:after { + content: ""; + display: table; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu:after { + clear: both; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu .topbar-badge { + width: 16px; + height: 16px; + text-align: center; + background-color: #1B4159; + color: #ffffff; + font-size: 12px; + font-weight: 700; + line-height: 16px; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li { + float: right; + position: relative; + margin-left: 20px; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > a { + color: #ffffff; + position: relative; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > a .topbar-item-name { + display: none; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > a i { + font-size: 32px; + color: #ffffff; + -moz-transition: color 0.3s; + -o-transition: color 0.3s; + -webkit-transition: color 0.3s; + transition: color 0.3s; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > a i:hover { + color: #e6e6e6; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > a .topbar-badge { + position: absolute; + right: -4px; + top: -24px; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.profile-item { + float: left; + margin-left: 0; + padding-top: 4px; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.profile-item > a { + display: inline-block; + position: relative; + top: -10px; + color: #ffffff; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.profile-item > a .profile-image-wrapper { + display: inline-block; + vertical-align: middle; + border: 2px solid transparent; + width: 40px; + height: 40px; + -moz-border-radius: 50%; + -webkit-border-radius: 50%; + border-radius: 50%; + -moz-transition: border-color 0.3s; + -o-transition: border-color 0.3s; + -webkit-transition: border-color 0.3s; + transition: border-color 0.3s; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.profile-item > a .profile-image-wrapper img { + width: 40px; + height: 40px; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.profile-item > a .profile-name { + display: inline-block; + margin-left: 6px; + vertical-align: middle; + margin-top: -4px; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.profile-item > a:hover .profile-image-wrapper { + border-color: #1B4159; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.profile-item > ul { + right: auto; + left: 5px; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.profile-item > ul:before { + left: 8px; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.search-item { + position: relative; + display: inline-block; + vertical-align: middle; + height: 40px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.search-item input { + border: 0 none; + width: 150px; + padding: 6px 24px 6px 6px; + border-bottom: 1px solid #ffffff; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -webkit-transition: all 0.3s; + transition: all 0.3s; + outline: 0 none; + color: #ffffff; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.search-item input:focus { + border-bottom-color: #ffffff; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.search-item input:focus label { + color: #ffffff; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.search-item i { + position: absolute; + right: 0; + top: 0; + color: #ffffff; + font-size: 28px; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.search-item label { + color: #ffffff; + margin-top: 6px; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.search-item input:focus ~ i { + color: #ffffff; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > ul { + position: absolute; + top: 60px; + right: 5px; + display: none; + width: 250px; + background-color: #ffffff; + -webkit-animation-duration: 0.5s; + -moz-animation-duration: 0.5s; + animation-duration: 0.5s; + list-style-type: none; + margin: 0; + padding: 8px 0; + border-top: 4px solid #4384D0; + -webkit-box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); + -moz-box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > ul a { + padding: 10px 10px 10px 10px; + display: block; + width: 100%; + box-sizing: border-box; + color: #212121; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > ul a i { + color: #757575; + margin-right: 8px; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > ul a img { + margin-right: 8px; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > ul a i, .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > ul a img, .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > ul a span { + vertical-align: middle; + display: inline-block; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > ul a .topbar-submenuitem-badge { + background-color: #1B4159; + padding: 2px 4px; + display: block; + font-size: 12px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + color: #ffffff; + float: right; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > ul a:hover { + background-color: #f1f2f7; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > ul a:hover i { + color: #212121; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > ul:before { + width: 0; + height: 0; + border-left: 8px solid transparent; + border-right: 8px solid transparent; + border-bottom: 15px solid #4384D0; + content: " "; + position: absolute; + top: -15px; + left: 232px; +} +.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.active-topmenuitem > ul { + display: block; +} +.layout-wrapper .layout-main .layout-breadcrumb { + background-color: #ffffff; + -webkit-box-shadow: inset 0 -2px 4px 0 rgba(0, 0, 0, 0.14); + -moz-box-shadow: inset 0 -2px 4px 0 rgba(0, 0, 0, 0.14); + box-shadow: inset 0 -2px 4px 0 rgba(0, 0, 0, 0.14); + min-height: 42px; + padding-top: 64px; +} +.layout-wrapper .layout-main .layout-breadcrumb:before, .layout-wrapper .layout-main .layout-breadcrumb:after { + content: ""; + display: table; +} +.layout-wrapper .layout-main .layout-breadcrumb:after { + clear: both; +} +.layout-wrapper .layout-main .layout-breadcrumb ul { + margin: 8px 0 0 0; + padding: 0 0 0 20px; + list-style: none; + color: #757575; + display: inline-block; +} +.layout-wrapper .layout-main .layout-breadcrumb ul li { + display: inline-block; + vertical-align: middle; + color: #757575; +} +.layout-wrapper .layout-main .layout-breadcrumb ul li:nth-child(even) { + font-size: 20px; +} +.layout-wrapper .layout-main .layout-breadcrumb ul li:first-child(even) { + color: #4384D0; +} +.layout-wrapper .layout-main .layout-breadcrumb ul li a { + color: #757575; +} +.layout-wrapper .layout-main .layout-breadcrumb .layout-breadcrumb-options { + float: right; + padding: 0px 20px 0 0; + height: 100%; +} +.layout-wrapper .layout-main .layout-breadcrumb .layout-breadcrumb-options a { + color: #757575; + display: inline-block; + width: 42px; + height: 42px; + line-height: 42px; + text-align: center; + -moz-transition: background-color 0.3s; + -o-transition: background-color 0.3s; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; +} +.layout-wrapper .layout-main .layout-breadcrumb .layout-breadcrumb-options a:hover { + background-color: #e8e8e8; +} +.layout-wrapper .layout-main .layout-breadcrumb .layout-breadcrumb-options a i { + line-height: inherit; +} +.layout-wrapper .layout-main .layout-content { + padding: 17px 17px 24px 17px; +} +.layout-wrapper .layout-main .layout-main-mask { + display: none; +} +.layout-wrapper .layout-main .layout-footer { + padding: 16px 24px; + border: 0 none; + border: 1px solid #dbdbdb; + background: #ffffff; +} +.layout-wrapper .layout-main .layout-footer img { + margin-top: 5px; + width: 100px; +} +.layout-wrapper .layout-main .layout-footer .footer-text-right { + float: right; + margin-top: 10px; +} +.layout-wrapper .layout-main .layout-footer .footer-text-right span { + vertical-align: middle; +} + +.layout-wrapper-static .layout-sidebar { + left: 0; +} +.layout-wrapper-static .layout-sidebar .sidebar-logo .sidebar-anchor { + display: inline-block; + background-color: #ffffff; +} +.layout-wrapper-static .layout-sidebar .layout-menu li a i.layout-submenu-toggler { + display: inline-block; +} +.layout-wrapper-static .layout-sidebar .layout-menu li a .menuitem-badge { + display: inline-block; +} +.layout-wrapper-static .layout-main { + margin-left: 240px; +} +.layout-wrapper-static .layout-main .layout-topbar { + width: calc(100% - 240px); +} + +.layout-wrapper-static-restore .layout-sidebar { + -moz-transition: none; + -o-transition: none; + -webkit-transition: none; + transition: none; +} + +@media (max-width: 1024px) { + .layout-wrapper .layout-sidebar { + left: -240px; + } + .layout-wrapper .layout-sidebar .sidebar-logo .sidebar-anchor { + display: none !important; + } + .layout-wrapper .layout-main { + margin-left: 0; + left: 0; + -moz-transition: left 0.3s; + -o-transition: left 0.3s; + -webkit-transition: left 0.3s; + transition: left 0.3s; + -webkit-transition-timing-function: cubic-bezier(0.86, 0, 0.07, 1); + transition-timing-function: cubic-bezier(0.86, 0, 0.07, 1); + } + .layout-wrapper .layout-main .layout-topbar { + width: 100%; + text-align: center; + padding: 16px 24px; + } + .layout-wrapper .layout-main .layout-topbar:before, .layout-wrapper .layout-main .layout-topbar:after { + content: ""; + display: table; + } + .layout-wrapper .layout-main .layout-topbar:after { + clear: both; + } + .layout-wrapper .layout-main .layout-topbar .menu-btn { + display: inline-block; + } + .layout-wrapper .layout-main .layout-topbar .topbar-menu-btn { + display: inline-block; + } + .layout-wrapper .layout-main .layout-topbar .mobile-logo { + display: inline; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu { + display: none; + -webkit-animation-duration: 0.5s; + -moz-animation-duration: 0.5s; + animation-duration: 0.5s; + text-align: left; + -webkit-box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.3); + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.3); + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu:before { + width: 0; + height: 0; + border-left: 8px solid transparent; + border-right: 8px solid transparent; + border-bottom: 15px solid #4384D0; + content: " "; + position: absolute; + top: -15px; + left: 232px; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu.topbar-menu-active { + position: fixed; + top: 75px; + right: 30px; + width: 250px; + display: block; + padding: 8px 0; + background-color: #ffffff; + border-top: 4px solid #4384D0; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu.topbar-menu-active > li { + float: none; + display: block; + margin: 0; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu.topbar-menu-active > li > a { + padding: 8px 14px; + display: block; + color: #212121; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu.topbar-menu-active > li > a:hover { + background-color: #e8e8e8; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu.topbar-menu-active > li > a:hover i { + color: #212121; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu.topbar-menu-active > li > a i { + color: #757575; + display: inline-block; + vertical-align: middle; + margin-right: 8px; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu.topbar-menu-active > li > a .topbar-item-name { + display: inline-block; + vertical-align: middle; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu.topbar-menu-active > li > a .topbar-badge { + position: static; + float: right; + margin-top: 4px; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu.topbar-menu-active > li > ul { + position: static; + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + padding: 0; + width: 100%; + border-top: 0 none; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu.topbar-menu-active > li > ul:before { + display: none; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu.topbar-menu-active > li > ul a { + padding-left: 28px; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu.topbar-menu-active > li.profile-item img { + width: 24px; + height: 24px; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu li a { + font-size: 14px; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu li a i { + font-size: 24px; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu li.search-item { + padding: 8px 14px; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu li.search-item input { + padding: 2px 2px 1px 2px; + border-color: #757575; + border-width: 0 0 1px 0; + border-style: solid; + color: #212121; + margin-left: 28px; + width: 85%; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu li.search-item input:focus { + border-bottom-color: #4384D0; + border-width: 0 0 2px 0; + width: 85%; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu li.search-item input:focus ~ i { + color: #4384D0; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu li.search-item input:focus ~ label { + color: #4384D0; + top: -15px; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu li.search-item i { + color: #757575; + right: auto; + left: 0px; + } + .layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu li.search-item label { + color: #757575; + left: 32px; + margin-top: 0; + } + .layout-wrapper.layout-wrapper-active { + overflow: hidden; + } + .layout-wrapper.layout-wrapper-active .layout-sidebar { + left: 0; + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + } + .layout-wrapper.layout-wrapper-active .layout-sidebar .layout-menu li a i.layout-submenu-toggler { + display: inline-block; + } + .layout-wrapper.layout-wrapper-active .layout-sidebar .layout-menu li a .menuitem-badge { + display: inline-block; + } + .layout-wrapper.layout-wrapper-active .layout-main { + position: fixed; + left: 240px; + width: calc(100%); + -webkit-box-shadow: inset 3px 0px 6px 1px rgba(0, 0, 0, 0.3); + -moz-box-shadow: inset 3px 0px 6px 1px rgba(0, 0, 0, 0.3); + box-shadow: inset 3px 0px 6px 1px rgba(0, 0, 0, 0.3); + } + .layout-wrapper.layout-wrapper-active .layout-main .layout-topbar { + -webkit-box-shadow: inset 3px 0px 6px 1px rgba(0, 0, 0, 0.3); + -moz-box-shadow: inset 3px 0px 6px 1px rgba(0, 0, 0, 0.3); + box-shadow: inset 3px 0px 6px 1px rgba(0, 0, 0, 0.3); + } + .layout-wrapper.layout-wrapper-active .layout-main .layout-breadcrumb { + -webkit-box-shadow: inset 3px 0px 6px 1px rgba(0, 0, 0, 0.3); + -moz-box-shadow: inset 3px 0px 6px 1px rgba(0, 0, 0, 0.3); + box-shadow: inset 3px 0px 6px 1px rgba(0, 0, 0, 0.3); + } + .layout-wrapper.layout-wrapper-active .layout-main .layout-breadcrumb .layout-breadcrumb-options { + display: none; + } + .layout-wrapper.layout-wrapper-active .layout-main-mask { + z-index: 999998; + position: absolute; + left: 0; + top: 0; + background-color: #424242; + display: block; + opacity: 0.5; + filter: alpha(opacity=50); + width: 100%; + height: 100%; + overflow: hidden; + } + + body.hidden-overflow { + overflow: hidden; + } +} +.layout-rtl.layout-wrapper .layout-sidebar { + left: auto; + right: -180px; + -moz-transition: right 0.3s; + -o-transition: right 0.3s; + -webkit-transition: right 0.3s; + transition: right 0.3s; + direction: rtl; +} +.layout-rtl.layout-wrapper .layout-sidebar .sidebar-logo { + direction: rtl; +} +.layout-rtl.layout-wrapper .layout-sidebar .sidebar-logo img { + margin-left: 0px; + margin-right: 12px; +} +.layout-rtl.layout-wrapper .layout-sidebar .sidebar-logo .sidebar-anchor { + float: left; + margin-right: 0px; + margin-left: 8px; +} +.layout-rtl.layout-wrapper .layout-sidebar .layout-menu { + direction: rtl; +} +.layout-rtl.layout-wrapper .layout-sidebar .layout-menu li > a i { + float: left; + right: auto; + left: 10px; +} +.layout-rtl.layout-wrapper .layout-sidebar .layout-menu li > a i.layout-submenu-toggler { + right: auto; + left: 34px; +} +.layout-rtl.layout-wrapper .layout-sidebar .layout-menu li > a .menuitem-badge { + right: auto; + left: 54px; +} +.layout-rtl.layout-wrapper .layout-sidebar .layout-menu li ul li a { + padding-right: 20px; + padding-left: 0px; +} +.layout-rtl.layout-wrapper .layout-sidebar .layout-menu li ul li ul li a { + padding-right: 30px; + padding-left: 0px; +} +.layout-rtl.layout-wrapper .layout-sidebar .layout-menu li ul li ul li ul li a { + padding-right: 40px; + padding-left: 0px; +} +.layout-rtl.layout-wrapper .layout-sidebar .layout-menu li ul li ul li ul ul li a { + padding-right: 50px; + padding-left: 0px; +} +.layout-rtl.layout-wrapper .layout-sidebar .layout-menu li ul li ul li ul ul ul li a { + padding-right: 60px; + padding-left: 0px; +} +.layout-rtl.layout-wrapper .layout-sidebar .layout-menu li ul li ul li ul ul ul ul li a { + padding-right: 70px; + padding-left: 0px; +} +.layout-rtl.layout-wrapper .layout-sidebar .layout-menu li ul li ul li ul ul ul ul ul li a { + padding-right: 80px; + padding-left: 0px; +} +.layout-rtl.layout-wrapper .layout-sidebar .layout-menu .menuitem-badge { + float: left; + margin-right: 0px; + margin-left: 6px; +} +.layout-rtl.layout-wrapper .layout-sidebar.layout-sidebar-active { + left: auto; + right: 0px; +} +.layout-rtl.layout-wrapper .layout-sidebar .nano .nano-pane { + right: auto; + left: 0; +} +.layout-rtl.layout-wrapper .layout-main { + margin-left: 0px; + margin-right: 60px; + -moz-transition: margin-right 0.3s; + -o-transition: margin-right 0.3s; + -webkit-transition: margin-right 0.3s; + transition: margin-right 0.3s; +} +.layout-rtl.layout-wrapper .layout-main .layout-topbar .menu-btn { + float: right; +} +.layout-rtl.layout-wrapper .layout-main .layout-topbar .topbar-menu-btn { + float: left; +} +.layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li { + float: left; + margin-left: 0px; + margin-right: 20px; +} +.layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > a .topbar-badge { + left: -4px; + right: auto; +} +.layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.profile-item { + float: right; + margin-left: 0px; + margin-right: 0px; +} +.layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.profile-item > a .profile-name { + margin-left: 0px; + margin-right: 6px; + margin-top: 13px; + float: left; +} +.layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.profile-item > ul { + left: auto; + right: 5px; + direction: rtl; + text-align: right; +} +.layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.profile-item > ul:before { + left: auto; + right: 8px; +} +.layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.search-item { + direction: rtl; +} +.layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.search-item input { + padding: 6px 6px 6px 24px; +} +.layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.search-item i { + right: auto; + left: 0; +} +.layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.search-item label { + right: 5px; + left: auto; +} +.layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > ul { + left: 5px; + right: auto; + direction: rtl; + text-align: right; +} +.layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > ul a i, .layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > ul a img { + margin-right: 0px; + margin-left: 8px; +} +.layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > ul a .topbar-submenuitem-badge { + float: left; +} +.layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li > ul:before { + left: auto; + right: 232px; +} +.layout-rtl.layout-wrapper .layout-main .layout-breadcrumb { + direction: rtl; +} +.layout-rtl.layout-wrapper .layout-main .layout-breadcrumb ul { + padding: 0 20px 0 0; +} +.layout-rtl.layout-wrapper .layout-main .layout-breadcrumb .layout-breadcrumb-options { + float: left; + padding: 0px 0px 0 20px; +} +.layout-rtl.layout-wrapper .layout-main .layout-footer { + direction: rtl; +} +.layout-rtl.layout-wrapper .layout-main .layout-footer .footer-text-right { + float: left; + margin-top: 10px; +} +.layout-rtl.layout-wrapper-static .layout-sidebar { + left: auto; + right: 0; +} +.layout-rtl.layout-wrapper-static .layout-main { + margin-left: 0px; + margin-right: 240px; +} +.layout-rtl.layout-wrapper-static-restore .layout-sidebar { + -moz-transition: none; + -o-transition: none; + -webkit-transition: none; + transition: none; +} +@media (max-width: 1024px) { + .layout-rtl.layout-wrapper .layout-sidebar { + left: auto; + right: -240px; + } + .layout-rtl.layout-wrapper .layout-main { + margin-right: 0px; + margin-left: 0px; + left: auto; + right: 0; + -moz-transition: right 0.3s; + -o-transition: right 0.3s; + -webkit-transition: right 0.3s; + transition: right 0.3s; + } + .layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu { + direction: rtl; + text-align: right; + } + .layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu:before { + right: 232px; + left: auto; + } + .layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu.topbar-menu-active { + left: 30px; + right: auto; + } + .layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu.topbar-menu-active > li { + float: none; + margin: 0px; + } + .layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu.topbar-menu-active > li > a i { + margin-right: 0px; + margin-left: 8px; + } + .layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu.topbar-menu-active > li > a .topbar-badge { + float: left; + } + .layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu.topbar-menu-active > li > ul a { + padding-left: 0px; + padding-right: 28px; + } + .layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.profile-item > a .profile-name { + float: none; + } + .layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu li.search-item input { + margin-left: 0px; + margin-right: 28px; + padding: 2px 2px 1px 2px; + } + .layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu li.search-item i { + left: auto; + right: 0px; + } + .layout-rtl.layout-wrapper .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu li.search-item label { + right: 32px; + left: auto; + } + .layout-rtl.layout-wrapper.layout-wrapper-active .layout-sidebar { + right: 0; + left: auto; + } + .layout-rtl.layout-wrapper.layout-wrapper-active .layout-main { + left: auto; + right: 240px; + } + .layout-rtl.layout-wrapper.layout-wrapper-active .layout-main-mask { + left: auto; + right: 0; + } +} + +@media (min-width: 1025px) { + .layout-wrapper.layout-menu-horizontal .layout-sidebar { + width: 100%; + height: auto; + top: 64px; + left: 0; + z-index: 99; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .sidebar-logo { + display: none; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar > .nano { + overflow: visible; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar > .nano > .nano-content { + margin-right: 0 !important; + display: inherit; + height: auto; + position: static; + overflow: visible; + overflow-x: visible; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar > .nano > .nano-content.sidebar-scroll-content .layout-menu { + padding-bottom: 0; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar > .nano > .nano-pane { + display: none !important; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu { + margin: 0; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li { + width: auto; + padding: 0; + position: relative; + float: left; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li > a { + height: 44px; + padding-top: 12px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li > a:hover { + background-color: #E0E0E0; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li > a .menuitem-text { + vertical-align: middle; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li > a i { + float: none; + position: static; + vertical-align: middle; + margin-top: 0; + top: auto; + right: auto; + margin-right: 5px; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li > a i.layout-submenu-toggler { + display: inline-block; + margin-top: 2px; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li.active-menuitem > a { + color: #ffffff; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li.active-menuitem > a i { + color: #ffffff; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li.active-menuitem > a:hover { + color: #212121; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li.active-menuitem > a:hover i { + color: #212121; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li > ul { + top: 44px; + left: 0; + width: 230px; + position: absolute; + padding: 0; + margin: 0; + z-index: 100; + overflow: auto; + max-height: 450px; + -webkit-box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); + -moz-box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li > ul li a { + padding-left: 40px; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li > ul li a:hover { + background-color: #E0E0E0; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li > ul li a i { + float: none; + left: 10px; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li > ul li a i:last-child { + right: 10px; + left: auto; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li > ul li a .layout-submenu-toggler { + display: block; + left: auto; + right: 10px; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li > ul li ul li a { + padding-left: 50px; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li > ul li ul li a:hover { + background-color: #E0E0E0; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li > ul li ul li a i:first-child { + left: 20px; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li > ul li ul ul li a { + padding-left: 60px; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li > ul li ul ul li a:hover { + background-color: #E0E0E0; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li > ul li ul ul li a i:first-child { + left: 30px; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu > li.active-menuitem > ul { + background-color: #EEEEEE; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu li a:hover { + background-color: #E0E0E0; + color: #212121; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu li a:hover i { + color: #212121; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar .layout-menu li a .menuitem-badge { + left: 18px; + top: 15px; + display: block; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar.layout-sidebar-dark { + background-color: #616161; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar.layout-sidebar-dark .layout-menu > li > a:hover { + background-color: #545454; + color: #ffffff; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar.layout-sidebar-dark .layout-menu > li > a:hover i { + color: #ffffff; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar.layout-sidebar-dark .layout-menu > li > ul li a:hover { + background-color: #545454; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar.layout-sidebar-dark .layout-menu li a:hover { + color: #ffffff; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar.layout-sidebar-dark .layout-menu li a:hover i { + color: #ffffff; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar.layout-sidebar-dark .layout-menu li.active-menuitem > a { + color: #96d099; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar.layout-sidebar-dark .layout-menu li.active-menuitem > a i { + color: #96d099; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar.layout-sidebar-dark .layout-menu li.active-menuitem > a:hover { + color: #ffffff; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar.layout-sidebar-dark .layout-menu li.active-menuitem > a:hover i { + color: #ffffff; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar.layout-sidebar-dark .layout-menu > li.active-menuitem > a { + color: #ffffff; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar.layout-sidebar-dark .layout-menu > li.active-menuitem > a i { + color: #ffffff; + } + .layout-wrapper.layout-menu-horizontal .layout-sidebar.layout-sidebar-dark .layout-menu > li.active-menuitem > ul { + background-color: #616161; + } + .layout-wrapper.layout-menu-horizontal .layout-main { + margin-left: 0px; + } + .layout-wrapper.layout-menu-horizontal .layout-topbar { + width: 100%; + } + .layout-wrapper.layout-menu-horizontal .layout-topbar .topbar-logo { + float: left; + margin-top: -10px; + margin-right: 20px; + display: inline-block; + } + .layout-wrapper.layout-menu-horizontal .layout-topbar .topbar-logo img { + height: 56px; + vertical-align: middle; + } + .layout-wrapper.layout-menu-horizontal .layout-topbar .topbar-logo .app-name { + color: #ffffff; + font-size: 26px; + } + .layout-wrapper.layout-menu-horizontal .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.profile-item { + float: right; + margin-left: 20px; + } + .layout-wrapper.layout-menu-horizontal .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.profile-item > ul { + left: auto; + right: 105px; + } + .layout-wrapper.layout-menu-horizontal .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.profile-item > ul:before { + left: 232px; + } + .layout-wrapper.layout-menu-horizontal .layout-breadcrumb { + padding-top: 108px; + } + .layout-wrapper.layout-menu-horizontal.layout-rtl .layout-main { + margin-right: 0px; + } + .layout-wrapper.layout-menu-horizontal.layout-rtl .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.profile-item { + float: left; + margin-right: 20px; + margin-left: auto; + } + .layout-wrapper.layout-menu-horizontal.layout-rtl .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.profile-item > ul { + left: 105px; + right: auto; + } + .layout-wrapper.layout-menu-horizontal.layout-rtl .layout-main .layout-topbar .layout-topbar-menu-wrapper .topbar-menu > li.profile-item > ul:before { + left: auto; + right: 232px; + } + .layout-wrapper.layout-menu-horizontal.layout-rtl .layout-main .layout-topbar .topbar-logo { + float: right; + margin-right: auto; + margin-left: 20px; + } + .layout-wrapper.layout-menu-horizontal.layout-rtl .layout-sidebar { + -moz-transition: right 0s; + -o-transition: right 0s; + -webkit-transition: right 0s; + transition: right 0s; + } + .layout-wrapper.layout-menu-horizontal.layout-rtl .layout-sidebar .layout-menu > li { + float: right; + } + .layout-wrapper.layout-menu-horizontal.layout-rtl .layout-sidebar .layout-menu > li > a i { + margin-right: auto; + margin-left: 5px; + } + .layout-wrapper.layout-menu-horizontal.layout-rtl .layout-sidebar .layout-menu > li > ul { + left: auto; + } + .layout-wrapper.layout-menu-horizontal.layout-rtl .layout-sidebar .layout-menu > li > ul li a { + padding-right: 40px; + padding-left: 0px; + } + .layout-wrapper.layout-menu-horizontal.layout-rtl .layout-sidebar .layout-menu > li > ul li a i { + right: 10px; + left: auto; + } + .layout-wrapper.layout-menu-horizontal.layout-rtl .layout-sidebar .layout-menu > li > ul li a i:last-child { + left: 10px; + right: auto; + } + .layout-wrapper.layout-menu-horizontal.layout-rtl .layout-sidebar .layout-menu > li > ul li a .layout-submenu-toggler { + right: auto; + left: 10px; + } + .layout-wrapper.layout-menu-horizontal.layout-rtl .layout-sidebar .layout-menu > li > ul li ul li a { + padding-right: 50px; + padding-left: 0px; + } + .layout-wrapper.layout-menu-horizontal.layout-rtl .layout-sidebar .layout-menu > li > ul li ul li a i:first-child { + right: 20px; + left: auto; + } + .layout-wrapper.layout-menu-horizontal.layout-rtl .layout-sidebar .layout-menu > li > ul li ul ul li a { + padding-right: 60px; + padding-left: 0px; + } + .layout-wrapper.layout-menu-horizontal.layout-rtl .layout-sidebar .layout-menu > li > ul li ul ul li a i:first-child { + right: 30px; + left: auto; + } + .layout-wrapper.layout-menu-horizontal.layout-rtl .layout-sidebar .layout-menu li a .menuitem-badge { + right: 18px; + left: auto; + } + .layout-wrapper.layout-menu-horizontal.layout-rtl .layout-sidebar .layout-menu li a i:last-child { + margin-right: 3px; + } +} +/* Add your customizations of layout here */ diff --git a/apc-web/src/main/webapp/resources/serenity-layout/css/layout-green.scss b/apc-web/src/main/webapp/resources/serenity-layout/css/layout-green.scss new file mode 100644 index 0000000..615be50 --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/css/layout-green.scss @@ -0,0 +1,67 @@ +/* Sidebar */ +$sidebarLogoBgColor:#1B4159; +$sidebarBgColor:#ffffff; +$darkSidebarBgColor:#1B4159; + +/* Primary */ +$primaryColor:#4384D0; +$primaryDarkColor:#2E7D32; +$primaryLightColor:#81C784; +$primaryLightestColor:#E8F5E9; +$primaryTextColor:#ffffff; + +/* Accent */ +$accentColor:#1B4159; +$accentLightColor:#F3CF59; +$accentTextColor:#ffffff; + +/* Topbar */ +$topbarTextColor:#ffffff; +$topbarIconColor:#ffffff; + +/* Submenu */ +$submenuBgColor:#EEEEEE; +$darkSubmenuBgColor:#B8860B; +$horizontalSubmenuBgColor:#EEEEEE; +$horizontalDarkSubmenuBgColor:#616161; +$horizontalSubmenuitemHoverBgColor:#E0E0E0; +$horizontalSubmenuitemDarkHoverBgColor:#545454; +$horizontalSubmenuitemDarkHoverTextColor:#ffffff; +$horizontalMenuActiveTextColor:#ffffff; +$horizontalMenuActiveHoverTextColor:#212121; +$horizontalDarkMenuActiveTextColor:#ffffff; +$horizontalDarkMenuActiveHoverTextColor:#ffffff; + +/* Default MenuItem */ +$menuitemTextColor:#212121; +$menuitemIconTextColor:#616161; + +/* Hover MenuItem */ +$menuitemHoverBgColor:#E0E0E0; +$menuitemHoverTextColor:#212121; +$menuitemHoverIconTextColor:#212121; + +/* Active MenuItem */ +$menuitemActiveBgColor:#4384D0; +$menuitemActiveTextColor:#ffffff; +$menuitemActiveIconTextColor:#ffffff; +$subMenuitemActiveTextColor:#4384D0; +$subMenuitemActiveIconTextColor:#4384D0; + +/* Dark Default MenuItem */ +$darkMenuitemTextColor:#dee0e3; +$darkMenuitemIconTextColor:#dee0e3; + +/* Dark Hover MenuItem */ +$darkMenuitemHoverBgColor:#2E7D32; +$darkMenuitemHoverTextColor:#ffffff; +$darkMenuitemHoverIconTextColor:#ffffff; + +/* Dark Active MenuItem */ +$darkMenuitemActiveBgColor:#2E7D32; +$darkMenuitemActiveTextColor:#ffffff; +$darkMenuitemActiveIconTextColor:#ffffff; +$darksubMenuitemActiveTextColor:#81C784; +$darksubMenuitemActiveIconTextColor:#81C784; + +@import '../../sass/layout/_layout'; diff --git a/apc-web/src/main/webapp/resources/serenity-layout/css/nanoscroller.css b/apc-web/src/main/webapp/resources/serenity-layout/css/nanoscroller.css new file mode 100644 index 0000000..db3de71 --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/css/nanoscroller.css @@ -0,0 +1,58 @@ +/** initial setup **/ +.nano { + position : relative; + width : 100%; + height : 100%; + overflow : hidden; +} +.nano > .nano-content { + /* position : absolute; */ + overflow : scroll; + overflow-x : hidden; + top : 0; + right : 0; + bottom : 0; + left : 0; +} +.nano > .nano-content:focus { + outline: thin dotted; +} +.nano > .nano-content::-webkit-scrollbar { + display: none; +} +.has-scrollbar > .nano-content::-webkit-scrollbar { + display: block; +} +.nano > .nano-pane { + background : transparent; + position : absolute; + width : 10px; + right : 0; + top : 0; + bottom : 0; + visibility : hidden\9; /* Target only IE7 and IE8 with this hack */ + opacity : .01; + -webkit-transition : .2s; + -moz-transition : .2s; + -o-transition : .2s; + transition : .2s; + -moz-border-radius : 5px; + -webkit-border-radius : 5px; + border-radius : 5px; +} +.nano > .nano-pane.nano-pane-rtl { + right: auto; + left: 0; +} +.nano > .nano-pane > .nano-slider { + background:rgba(255,255,255,0.1); + position : relative; + margin : 0 1px; + -moz-border-radius : 2px; + -webkit-border-radius : 2px; + border-radius : 2px; +} +.nano:hover > .nano-pane, .nano-pane.active, .nano-pane.flashed { + visibility : visible\9; /* Target only IE7 and IE8 with this hack */ + opacity : 0.99; +} diff --git a/apc-web/src/main/webapp/resources/serenity-layout/css/ripple.css b/apc-web/src/main/webapp/resources/serenity-layout/css/ripple.css new file mode 100644 index 0000000..552d0b9 --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/css/ripple.css @@ -0,0 +1,50 @@ +/* Ripple Effect Style like Google Material Buttons Effect*/ + +.ripplelink{ + /* display:block; */ + /*color:#fff;*/ + text-decoration:none; + position:relative; + overflow:hidden; + -webkit-transition: all 0.2s ease; + -moz-transition: all 0.2s ease; + -o-transition: all 0.2s ease; + transition: all 0.2s ease; + z-index:0; +} + +.ripplelink:hover{ + /*z-index:1000;*/ +} + +.ink { + display: block; + position: absolute; + background:rgba(255, 255, 255, 0.4); + border-radius: 100%; + -webkit-transform:scale(0); + -moz-transform:scale(0); + -o-transform:scale(0); + transform:scale(0); +} + +.ripple-animate { + -webkit-animation:ripple 0.65s linear; + -moz-animation:ripple 0.65s linear; + -ms-animation:ripple 0.65s linear; + -o-animation:ripple 0.65s linear; + animation:ripple 0.65s linear; +} + +@-webkit-keyframes ripple { + 100% {opacity: 0; -webkit-transform: scale(2.5);} +} +@-moz-keyframes ripple { + 100% {opacity: 0; -moz-transform: scale(2.5);} +} +@-o-keyframes ripple { + 100% {opacity: 0; -o-transform: scale(2.5);} +} +@keyframes ripple { + 100% {opacity: 0; transform: scale(2.5);} +} \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/serenity-layout/fonts/MaterialIcons-Regular.eot b/apc-web/src/main/webapp/resources/serenity-layout/fonts/MaterialIcons-Regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..70508ebabc9992e64f1314f866b2d7ab90438c58 GIT binary patch literal 143258 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 Hzx)3OGG_Ot literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/fonts/MaterialIcons-Regular.ttf b/apc-web/src/main/webapp/resources/serenity-layout/fonts/MaterialIcons-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7015564ad166a3e9d88c82f17829f0cc01ebe29a GIT binary patch literal 128180 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 ohyj3!`#ee%L;DTjx@8!5k5~VH0QmdE^#A|> literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/fonts/MaterialIcons-Regular.woff b/apc-web/src/main/webapp/resources/serenity-layout/fonts/MaterialIcons-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..b648a3eea2d16b6ce783906d6b7d5f251b9eb56c GIT binary patch literal 57620 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

    wF7DI|Kx|V1sBQ9FYs>m5C)C zC^&s-;)-p5xIz9`m{?Ao6W*g!7;RwcsCU8+^e@V%X|~&{eJJdJ*dgd0ikksDOa=7~ z3X`}#w+*#}%7j1Ga7a+*LFono(N_&|d8I4|VUf%O5CEQL3WYhCZt{45YBo59;jgIV zlaD_^rk0DgQ%ufSz!?v!PKV-jMV!4ZkLGcCJ0os~;&7^r;TH~f#OI+eTs_S%P93=2 z@%OCCdX{OPaQL0BwA<0;l!sidA(yAi;ZD1pe&%(_tRKE|Il8>gL6>XL(b46AQ)jErfZzfDG~EcjEKKyQ_|x>K*4CU8#wYBq>Y9>a;~-;fj+ zFi@1B$R;-#%L>z%^UJT=5yBWe2=b05K0$58SShyGQY2Nv8EyFSV1Ao;pL3{0w- zMmsvk^lbz}QL7m9?H~-dO%vdR{XCrG>_%C3KE-7TDr55-8vH5GK6VXw-A7oFMy+y7 z<2TsiMbWR2-sbjNPPdZUqTOW0wQW?JMb1HX!FzlS=Q5%y0n`(KMiKidz$z;%#g&E6 z7Ws|<#qVnTEvBqTY%!_}>3Ld62wd5Nb$RL#@IHrP1>k)O$2IoDyDwmLi3_`96GxYT z8#+3E0|;(^z)0lIHje{|kyXSNZntZt@6wFOD3&kniXH;6f;Q_jJGXA~?j*!(+fYU& zB@XxHhXK{yQ7?jE7JTu+A-uQ&N^=EcsFj$GJ;MOWZ4JKHYpqBhbsjI2Fc1<8>s!C!1k~Z zTSzp^Azv+6#u%*nhKZEn^%|*(H{jaD)tEdLmZ>SQVowIUx`N>9*bCsA5xJ*1J~$8A+47~40|8+y`ra<9Xa^SB1wJALtc;?!S>*ip|U z{=B3c;OLgAw$7iMvyD)H5`&5#$i+sdme7I;HS`;l5vxJ>AB{z+`xlF+_fZ`skA%Rg zPdKm~x2^r$9$heiJdRD*?HwK6D_{#6`ns-bzc+fC$)`tex%COa6?_bF1sjr1e~>pW zWTr#fNyjRpo1|zXWD_zLp`@alnyFW5wk#6i02fi!ZkHk07`fpnOg1_SHj)fDy`W@N zaq<9~A**h)CLRucII&MY{BZKN+a838y{boUyDj zAK_mf=^jCxwvnGdzl03R?#L8ccW=6# zmCb>G4o`1ltf(ryU|2gEMN`uQ16BA+3k(!B{H_~x0ZKx?c(IqANBJjcPH*SCj>fvC zP4r&8C?^!U2ani3>n7>{>-86r@yV)!Mjzi)4v3g-#RsTrA^6u7W6e-3)w!X;pJA9L zZOAi7l5Dq0Q^$~%a?&Eqq;0nB?b6wh{XHMARI11N1zRG1YA>aqBE!koefjz4zx@0M z=t{M}2LOmL;jR=lvO|8Fj{o2i-p&@E$NN7?Uwo5(^faZCXA?~wf{{JAll@=-2mvLF znlv@lPGN88dNI%P`Mjx@wjs3}8}swPHo@N)<~gM&qP~rO54dkxGBOmg-`cs30bNIN z_R98*#|zd>S(GG>)Yig*N}_IV2kPB#&z6SXc>?6pCt`a63uI|R(@=WJJ~?**J%cXH z#WKebVE9=2T)p0~XUvO|!anVgC?fR$Jtc?d$j;02{HQ6=Y)AK!?m8G-cyS?ixMTdO z@mTy~e36zE!u~TcaY%<_3-JBh#^LMuCvCfjYZCT*q_8D7u0F*3l1!FI!)MK40y%n0 zr}cdEoOGo(fY(?B(311ZBL{CiI0Hk^O;U!c&h+`S-Xll6XXmGumZm_v2Y(yDWkfQV zG`^z?aT&PM!V27OF^&~6Uk z1pRn|Qx!ByEF^VoWsElv$OYKfVy`?9yYWL8#*5*{1}5Gx`Uch!d*uzWQ$PR6tA>Fl zVK9%2zG)%?t)tmW1E=pF8@vDXz{Ly16`1!O?pV3Qd-%S27AKD2`xV26-psu zF`1xugKFDXU^~%7El{L9+h8w4kBo`h0U=JjA1o%aJe;6lIB1&8H0c@G%XZj!?425_ zpR~qCv4#j$B3;WdkG9gUwQ5~l?aK8c!vAgdqw8(v#NT|M6>~lzWyzjm4ydEOT%N$^ z+yZPe_t@vgApvW1@;B|YZ7Wo~2GwY4(O6kCvDfI4#zzT<1SVpTOx8)fYwDn3uuLwf zV^!fh9ElC+YPi29!5$`nBFF^E@Pf?s;J0g}gp>a5<2rI0ipn442=deW&_TlE z)w4Jl8a|0MY+u+&NTKPA$64QBJV)p+GoD*@An7~dYTenu7=jW-?yvo@vC3-wqBzv`| zzhl)eJGwJ<$C^Psja!xwB_Z_H{&^-iLxkN;iG6lU|l0m{{2I zNv@xzjaBG9HO!WN7DTZoz9L&WyBX13rpP^z)AcaLL6g26o;cIX#qH31B=lk0O%&td5kyw~ZxnX*Rg(Nj5^K&!`KGj%=8q=n zm-jSjzk+>nUcAaaw1kt=1tkQFd1!D1r1;@j21?mGxetA{XW<5b#Dsf((ig@j3;QM@ z>=#<_B%=Y>A1L549)kjuKe~5i|B-v{IRYVHH(~O1N-47FF9cGw`pLw2qQfRgh?>51 zAV^~84yQsZ`oKK{`pOOd1LfEoMhA3da5D6rE83NP5g?Lp+jUJsN5==o53I(@w^* z#_;M&nN`|LvAMLSO-K9lI$`wdC`@K%>tPjqSB6fU3MCEjz`Y)2JJw3zsVrfDq?R;xgO8Cbr#d@*0S}K)`)&b>dw&%&)lYHd_c^T%3EoDMOZNPsS zn#(jz-1v@YzqZ_HhQwT`tzlo^*f7hD3N<$Th+ZsNT#3JIK2wpwz0A7Rdhc{sFSns* zZERz%?L5_X&Il5j4CdD{G4OPQjxb>rWFYB?((RA=oVCI>*o!vSoz0C1Gqg&sH}ii* z6lsur^#?z04i1`_FoUSkcagvT?_4-`>;i0(#pPYKXt6ZT(*d#qx13%J*;b5n7`t=^ zMpl`ON`9|cDEE8)U(QJ86TW@p>Oj)#iDVofin1r7?tG6vd&(RP7kv6Rf`Q5GtBy@AD-cnTW^xp=jgXQTJR=|Ak{qQx!C>4veXS!(u|F`mQ~Z1 zrf4FfvZ|q*x`8FaIBPw$0i1b%xNd6j$DdT!_0|KDj6fH07@X3Og_gB*S$b)`RYHkm z56s+}Ev;?Kq$NvmJMw&X8y$i57FAYWjh8*py_1PRknCAbTsWIQyKDEEVNZQEQSS33 z192}|!4!+T&Yszw%aZQMj`8K7HC9c^Fas}^&q-Q7OtK^pN{$nTHX&+_~vjF{Z($RO#7+dO6XO;30CQ)eFV>fnys5kK7-q@#MMAD*DAwt_$(tDbNY`^Q*Pm0Krc}f(C3R8EAucG*Vb3n)Xt0}P z=>=qeSzBINS*{~}52XETkFKmx3soDs}kGO_9L^mXvCX=l#0qbq{=8UF5Vj>(WVL#%W^Y z7Y=%p zw^43Va~Qlv^mh2h=xA>+6H;QMFd=1<0VU&fJ32SHJw$hVcKf@-f&OXDGp0rZ%AoA& zbaX=dEI~bf4eBv3osjO4o|4{+qW}uv!gA^w+$YO}+6oWF$$^U4>|4p=x!L4mY?Bm85v4R4^uc)PsVy)4_k6hCMPrVS%B2N#h5%9 z@bx%@&c0sd{M_;Tvhx`*BO4vmIvkF@g)v7@M+b9s`FchpxvtJ#E@!k)J$m=i(C)Ll z0|3?Ibv`e9T#4z~$7W~Zo{mm;bYk*>$%#QH8+WnAJ^SZ99q!#n_ZzZH_a!IyBM6&+ zV8FkpG?fjfM$?_1j)@y%6Z3Z+j*N^%aB5!|9qeL0?~kPC9Zq+b!x2dB?)p(@G&VXn zb?DGkXJ-~V9)yb>lD$sm==4kuL?Qzdoo-J@R#n-6I_kQ_Vlk)O4Pp9?gHEZaK?i|Ay338F_E#M>A}lZNJhO%zb8TS#=z%>3i|r5nd*aLmq( z-?-HHvZBE84)$y5HlQKdwqL781gpc6Wxz(~Bw&9VaU4zSzz))*E#TV2L8o$LhYOjJ zqlTqewHX0%@vv#VYy0!TxqL9cU#X#p)MN@u=qjX!sg;SBr39$urEGR7V}KR~8ApUe zCQIi2frfeI3NX4gxD6AWOYe~+_9=McLBjS$;hKk=!4Tb>Q=877YI7XO{AI8o4)n2p z-}}2!`qjyt>^SHv{UGVmVTshhWcc$PLDxgRUi_N%ehU?#rek(+4v4PNeDpM`+J!fb z)M%a~h2sNTQF~}e0`d}Qk;sOH0zU9&qr2=N(Ea1y-P!S_>2zQq6H$`$T8POWkpC>q z8qii{e}o{)%`~_Vg3sVM5O0ypz}E)`yP4Ay&uU}G0k3~G;{QXAU+&=iJD0wbz5-v5 z%!3*;5Tk>08zdVP;m5#Kj8o}sqFP@+b|F54wQUzsP$77h;>HGPYROH9fuLA}zbhL3 zwfmQGlyrnz2bL?F4~0}PuxZNYm@<7_HoUJtZOX@|Pru%Kb@s*^X90cv%mebV>C^Yi zSErB3`{C=idP@(Ky!#P|-P@)kKnlYyV4M7--5>Vee`?e>cukP)k=rA;Y%PE?b!0iZs=-(k4iYR;=3=s->K=!`|lb z9`+=$-#@-*kDLsmjy9OQHny;Iaj$1F<=vH?SX!F+d;R3?72?L-dO(GPfgg76(I@uq zoe1_Xrl~|#((F@5r#DFg}%Pp8p%3Qpd`A6=%RWD?2zb$iY_6Wr- zoqe2mW{qe`ova}aO3U!BW3nfNYZ}^>(FzCM3qLS5;Mzt@UufR8m}uL3tUY^^qubT( z^sx@7+u47?>Kg3|c^r&6JaBl192G9Z{d557JRLymR3)7iS>4ieaXOsOW+A)2 ztY{b-w69hn;QtK>)^!D6iT|y5+C*`>Dtf0fJLasl_t>brcAh`Bw3HejPbCr~Jv~2% z*tw-yv><2o{ne%6+&iYzsSAmbz(in;P;}ozcIT4RWz&%2s1R`SB}RHiLJ$lwKA+HL zTMNj7oXw5LgxR5IBCD(8`x+)rEHpy+AJZr;uC8JfoW_@|t2AnwPG2RQjz~@^k*pT9 zpESd9<|!ZICX%#d!6lEZ=4|DzQw6It27Jedn2NZdN9(eB+TYb5Y-R&o*+Ye?JobY?R5JvgcM<)Dy^$@}fuwZ^Tz)uqxhaiB0Dx{$hGjcG&oLIUm zxV)dS{ma3-mQKurZY6u5|HFLpj#{`Vm z0kTZrFBOq`!!e>Z)iUsAU_*ie^fl05Q*j5ZW8e^~aH7MK_hnlXw=JH{HU+pUDhhrn zJf_|d?Tqj4-5v1jV99i)qu1Bxa292Ex36cxanqDD6jWj{CD84NIKs)1Ty7*i^()w& zstUOunSmk;ft7tI6v~e5>f04q)O|k{@b?UPy=vc7SMQN7SJD@ZYw>OtW@_$OZu&<+ zBm^O)44?u+up`P+V&7ulA|x5YpJ<}_Wo@$*IhRGl6n6`WknajW-f_H^KdZ4gnWg;Z z1Nv-$v6Iog-GFn_ANvH_r%c@*<)$g`s&UH{T?gBgPeu2F?`^1ih-_5ux;-kQMyO=_ zGs|5RfmkECFAY_A$8GL?5)$OQ6Vc*ua56qV4nXE*UVsXcvN2+PYk6t zL)K6Wc;KD?vE)ZhzJRoXHV-M>l&s3JahyzsmhflMMRCAix&MR8=c;cR)8X$P_6yM` zYDMTgBv}iyimvEmZ>i}hK=m|^M4u?KRb1-@GR9h7n8Bc$uHRGK7tNZr&(TwYAcX%hr@gd5{?;@%R_=RkP1d2kg)pA zhhul?cgGKFhvRqacf}6h+DWe>mx_Bc6eoPdLOgHCYiMco9SIGwQ(NgJo>j1>Zxai_m1Bo?*cl=(5 z#NJGC=eg$tJUFij^lzEd8z{r$K3oMD*X*{Hg9lfJqls{6kEZQWjt2H5`IY2A^9pK`W(c6r&6!=CH#hzow9vYZ2bE zJwpptu!UA+fBQ{m#JzBRi~Y@6A;|WPLdri(5#Xr}y7mo9Zxm8~g-vd@C>N}M(nOV> zlO&F5&YeJWe5UcF2uXLiId$hkX<$=G$CZK4oK3f)cn3bgkv9DE7i+#bV=j5`scz;X zCLVU(r#7FmvMZs6UiYTkLu%6HaJZ7He`x;r?%U|J@#_RFbPJ&i)d7C)hCNdZ5t66& z*ayo4X?bejz9~69;PrXoBr`C*G)-qw_?7)3slE`iZd97s8WBAW6Fgs4J1Z^q$Hzmr>-w&L zy!(hS8zFCLVU@@<)7gmb1)BZX7h@B#SbQQLi=X`B$yjXD*;n9*uEgLBu8C))`4(bA zg*l?kX4$zd1F^KvI@kNmrp#2XtRsYP8GCrxK-b+mUyFF__42q}iV#&G=eOg2v9dY2 z2V}&C&dsse+YkJzW1x?sHu}=cY&=bU7p;SNE7YVODMq+KnlvdLkWL`|FUt@*5WR$Q z>S(%U3SvL2m; ztc5IveOFZvNndexcUz*=RNEfz3qkx7k2zc5~Nln5U z&QadCZ+=MAhWsJ5FBuyL=(jzwbYfyM{)_(ANw+JiS=ls61`$@U(hnuGQ{mSQM$^SbxMg<-CRN1g_Kq`v1v+i z9jcYIYk8YhKeca2v#W@tr3QnlUCDgU?$q@3$ShP39!49A{knmFVzdRCg*-Bv zLWJD2$a{dYO2!MB3=RAK&N6Ln;|6WD2nU!IYJS z!2u);^b$1&zfsvW#=;Iquk7e>^r%yQSJ2@Ic7|PwOMNEgb$EhKHVAW(C*8H?fLsm+urvU78w^eW004LaV_;-pU}69QI0+O% z1n<-)>@NtICO)nVA%tQkj`;9bi*sKEb3;O$YEv_B@8J zS8dKbe?S^_|8D)3Gz+T$X8EtzUiMO`?4?p^@f^=yr^i@;!d^zSKHw^4%vy~H) zDOinpKDF4KqfpZ(J=98wDbZDWh1g4rtP;VnkYF?S8Je6&gMA^3!s0mu_Z#zo`VUMo z)278>Q`EVsT#wd>$f`?aF6Ulp;zne0HSCV76Y=2HRl<6LI*(Lm@QKe6ZD`f;%5{gC z+K;GJ#)d65>T(}9qmkNLF>|s~eu;0P3Ux@k=JTHNC-fuN>|yhp%o+Bwff}QGV#HY4 z5@tB)>Bk9Ui8IR)$Gn0;q3^k~d;owwi6=;k>WBW5XbUkk!F zlyl#9+}BZ!O%$@qsnVcPoNWt>c^UGg1EV$hb0z9)U!8=J1T)m%&WWv#Z`aKs zz*J&-FzcDCtcxwrwq>WVTiL7ZbM_aPoh!<9gZbSy5iQ{h22Bk%iKrYZ#>wO$4L~1LIk+w-s z$&yn z`cQp`{?t&68pd#Ai}Bc$%)(|LbESFG{9^STsm`fs zsXqk41GH5E006LT+xFA7Z7bWhZQHhO+qP|Ym|cH6TH|+&jE#>SkNu99i;qd9PgG8f zPdrWP$$rVlse-8isb@fDAO?g$KVT(r2KWzF0wu5`I2+smUWal)2Gkpx0H(dOu1tIM8hS5%j=o2~ zqyI7mnXb%OW(9MZ`NZaB6}BV0hrP@G=i*!=ZXx%E&(9-#H+}|xT__=NLR(?Ba9DUP zW)qX5BQ6l{OZg;HY9kGhX3H`8h_XnXrY=_xs<*YwT3idXk=l0co?cA%^vU`uBah)2 zvyC%mL6bH+nRCqR<|nI&MO%%nA=V1(w)NevXsdR6dxSmP-erGq(m9Y5IJ2EwZf>`Z zyV`x?mGoM8+q@6H<?`64I^qUO=YnrQ^V0{|2O006LT z+qP}ne%sdBX0~nHwr$(CwG|v5AAWK~xe@LWb4DB)@y6gaD29E8&&J%w9>yugWybra zoTi2*r)j!rx9PpPlG$U{%nQtW&7UnfEu}0zi)vYHxn|8{ZEtm1M_Tt=KiCG?6x&AI zQ+pM=#V*)4**`g|I)*q#J9aysIQ`B?u97adYpLt9JFk1NJM5n8-sk@2>EMZb#(Um- z4PMH-!TZD4%cuEH`m_6+`AvS&e=krg5D9D#d<)hJ27)t!dxH-{Swc-i!$Y$|S3)1d zWy5-Sd-zGDeME^Ik9>%hjM}0^bW`+GtYWM~%pV&c+Y);hFA?t^Psf+WA1CT3+zBOd zFmXBYFIhWjND9eq$y>>{si7$)wITH=^*LQ9ZAlC1v*~}CA(?5JD?mlS07L-<7z4}z z)&iG+$G{gb7gz;s3U&j7;3#l0cpCf!m4jMAL!lr0k#G2DFa7eAEO`LjZC zVX!bt*dja^Yl%K_rg&Z|DGiiXNJpf1a&@_@oRC+_N94as6D6apP+qF7)U-NP-Kkzv z|7oSP)|yj0rM=dR>3wxV|6dS1Kv@w0007LkZQFK_*|u%lUfcFJH`}&t+qxNb>*sAX zw~g5r+xC2WzwL{+yW6krD6wPs4r0eSAP3L^m?xiHuZR!D z7vmCs27g6lBWe)ah$L~JEKLp~N%98yhpIyjrq)qm>Lp#29z?@THl{H%kzts#%xktd z+k_p;ZehdhEv_85oWr<-+)KU?--hRfVnSD8vET@=#gbxwF)kIA+Dn9VUd|_Xk=M!l zZ>9%%5${2uTHtlCV6b~|LGVZ@Tc~$vYDf!R31mvG`=H#Hc>3mFR>wUAXzL4B`>G4ry8UNrH-b4rrq>;zluNC z7k1{)08KD3UjP6B000Bc0I&cU0000000IC2009620000$04@Lk004Lae2z6z17QG0 zAMW%xE$&+3?hXy^?s@{wm~*7go5@<0wa<5cpo9Yo$SW)Zjv(N9)T^>QpKAUBUcd(b z0WVB+il`+O@M2m?Gsz=QeDlIJmt65iGre@v!+>no^iltgbK2GOJa9^_DIsOzhhUsw8 z5uAUJ9c-IkV~b|JPE5QrLpKXyk}j&N0DosT5CC`qV_;?gga6G8MhsX004PKOxB#p3 BJ$(QG literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/fonts/MaterialIcons-Regular.woff2 b/apc-web/src/main/webapp/resources/serenity-layout/fonts/MaterialIcons-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9fa211252080046a23b2449dbdced6abc2b0bb34 GIT binary patch literal 44300 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 QW8}wPUeo^@jR61v08@RD2LJ#7 literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-300.eot b/apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-300.eot new file mode 100644 index 0000000000000000000000000000000000000000..826acfda9102ca6aba858813c72fa34b6968da36 GIT binary patch literal 16205 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 GcK$C}BGQQf literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-300.svg b/apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-300.svg new file mode 100644 index 0000000..52b2832 --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-300.svg @@ -0,0 +1,314 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-300.ttf b/apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-300.ttf new file mode 100644 index 0000000000000000000000000000000000000000..66bc5ab8e299e9948a6fce6b7867cc638bc703c7 GIT binary patch literal 32664 zcmb`w2YeL8`#(OjyLXqKyR-{Emym>#aDfm)2bCfpJz6N5<*P)k%+N* zyR;59-~H|IF6z+E`*-7l}tkOz}3 zT?xr~L5Ntp->4B$;@Zl~2^q2u*Wb$;G9YjGUln!|GAMx%dUQaa;X{ZI2}S!jCIJI- z$7D5oZXStiWeMqfC%b=MzK;C$0PO|f`lIa3KK=hr-YF20c@xLAvT?$1yFLrgpMm3w z*?A-KhemYyf{-l0CyvS;+^4ros83#|sYhZ< zzz29~z6Gf55|@7d2#9=8&li@{$P|{0PT~h>l$oE9q=RBzodY0!T0!EC(1( zrjR`_2s{T#l%LMrrQK-nY}`}h8g^T;D7`+%#bC4;7(bmZVc+ihi`0t zcjN%|M4);?FxrCdBvrRqOcv2ZsfmgfnnEpNC3}70R4wIK_%peq|E!?LCE_GlZT*ARjvZrVTm#fux?S4+>_G>lx&4fHMGa1~54FI=`yvmYZc> zWY}o2jarkc(-<*XtXZo@M0l7!I*yhdtS_9E&^j@(bpl-?m3g@|+G>rqBqrjC^QC(9 zTRo#EUlLAiqSYo8106O)u}w7Ee2SB*hl(+w$!7NRM_4QXkz2E)lHrad(XO9Ms*-$JOh`mWh|SN+JLroJ`f6SGLP`{_M1?x>5RHRq zh6f?qmkqhEQ4XapEC@!ql=~>!Xsb|ci#E!YUFXovnsM=QaVa%xrKTi@M?{3j)QpRX z)`y2hNH_@78^U8!a5*_FBDqE_aq5DD4-TH&m1X;E^v1dK)-I&I)}~$FmwEn9{=tp& z_R#@@=Qe77a^=R0K^HCr}1ft}`jh@9s$EBEgw^CBnK2z<|zpm)wsX1@`-|N>F7HsM>pi8IB?2a7<3We+c z+=##41G;q19MHLAw&K%DINM5EK56I98O@7!ZkuK3kw2z)iymY0`zO~MZ;Rd|NA-J@Bn?Y~#L0C$m9FSck@BQ6Ng-q8#9FCrC=-n~b20mka`LbqxX^1P z5sHIQjT<6y5Xq<@P#=n0<#2UVUfoo14YyoTJ(IvUkPmXQ>l#Rb(?K%heS?A4!k`<> zG4XniDbPn~jasQR-oR)>3^S+Js->chF7A?c@Wa`=wydKIx(zNmyI_3UmEpxN#;xAb zZD$i@U{JMF`>Ri%-1xoRu6;*{r3Y?q|Dn9TaKY?CrP`uT{@(d$VcYZ@a?Y_)_P5$J zr#FLR)-9d9R!SJVrGK?SE!z$p5AjV#OK+10kTg0_j7@UN87^KzQj#B-y6UoY!<8$v z(o)o&qf`;{^u0+4G0HxnVVt9IOE5%RXw8t2RCACZgolNMm<@4)FlWfk!g6m<%4*bW zOaF2cZsrNCzo9E>r`|b4C@Ck56I((O29YRL4oVnOi4S&hDI2jy+I+F~wMODuv8g%;=~%Na)F6uS zbfB_7inf-reP|PlvhUkYUtQ`XKFZB3pu?2e6EcS@-!!7tl`k8xr?esqrRvf_;t$S4 zV@$6>VCY>mU=z9E3%8hJOb~mfWMLFNqBI?&w59SG;o%UaJbf^PUPVjwmFF~=93=)| z!{%d^C6^`vqT{(R37g!!n>bQ=UUTf^mE($WPj#W4U=$93;&G2)m8t8w=oB6&7!?cs zR%n-rx*tHF)hDZ9MU+wTVE{f1T+n$uDV1?7Q&b-$wyRdHUE;ej)vGsycA})bW3up= z>%&mo?=4u8s+(hI^6WgJckVcSB7q*tcRUsU0tW`-Y0YH6vgH{6`5A2{C+GR$;eHzD zi8v4$=lL0BldB6*dUB-e2puvCG0}o(GKM7A2njXR#F5@$3S&p9;$IK$-272|c>Cr< zDSzYU4V#4R>(_0jLNDc#@)@l|t5O|JruCI8%Gdgrl)QYQJorcXn+pH1F_Z!DLEQn^ zDIh;)g6IH`P6N(uf)E|+gk+UP7gVw!vXihiVobV}*ks{gzA}P757R|08ghuWJrMf1 z6!1`rw3U5Jm*Eu79$~^GO#ga>ySq^RvSea5kIiJ1ecca?;3t`JlR`Ct0TolL7MC)5 z1GPw{N`}xs3VUyux9Gs=!IvkW`)-Pgn3Lxx@ zk$M3LtCI0@S*ONi5PDe(WdUwkMk}UwH0jpp{Lh!K+4x1NSDx9WFZZF#Aa1?2pzi zTet!g`VK~>73kRy5~77V?p_uG7Z<$CzLK-cf(u$^xl(2a$v%32)}=sRiFG18hO;`z z&0;c$+24PkZ|@*%m~0;;lun^HGL;2%NE5N7Bvx$P9oXLnO%(ws%8@L&bomNsN(F@i z;Z&oKKpX@z{-8!r+B48V2AIJrn*teLZGlEP%nhQ!D3^8}$>n%uh>}nX>@84Bh^n#U zlOvcRqG}$)H_e5c_W8*pSD$|T@XDu8O~Xyw=C4{Sujn+snebRRGgt|0=O8zJRIVRi z^5L0}*IlUE5SW~VKKSU4kO&e(`pRO(SOyC$R6)( z+|&86J=yF6-4<+=%e#(%;_#R#A~J$!U4SknDJe!0D?%DTk*a+WTLmevl?@{cXMOto z-u7L^jCx#~6Scp?3P#VKzu;gc7I8MkZIVB#`z5jBFt|go> zk>mhpzTmnDXr}~HBv(wV#;^v93*HcZ%R6xw26TmKxa0K6NV1AA)5EqZ;KC}53-Pl* ztxB&d!cfm47ps(Jm<%pmg;j=Ha%0gJ_8RZOF4Y)~S+3k}iHZym^z@blleUlZ#fZ2K8h*{v$pGCd{NF=_yx;jbp%8V7#TG z+#eY5*Dw%*gAj%RF@&)l^N~Wlh~7(Qz#);{rWz=RTVBjGXT)O)Hxf%sYH~#q3p>nd zvBDA?(fHHBg`Z{*K0E353&o~vji6PaJ&els{Nt4luby}CBVj|&0Ywj{EqFQ^H1uPx zGD;bdEzzix^M^IP_n#m3Z2i{ZAQPZ%6QopF;~~Ei==2cBb8#ikGc9ky`FNc9L0k#S zV(|e+X+MZFq z{wjyTTS$Hq&r1yeZ;}cq_c0it9!#w>Fi#Td)C)?=V5BMHJN7zao05IPB5EyAru9*# z76QtSj=#lLpoU0LLkrngr3PQ-hp3P7(n>B@t*py}VFnnC6X+th&O}cdN=^Y6<5HCR zaCqga(u8)Q`9l3Obt+69oxeyJEqt?W*V(=^hfc2=AD5UI7hjbw9<|_P`#ufF&7V1P z)9LfOa*vJgbwH6d*Bx*VRqE+~)XgEa$lIh)uJ}$9)^YH0W58Y2YD-q_B~7Qe{ZU5C zhGeE-WFy}|?=n`c>-MeTvLqYja)QfAs|wzAAEB#_Tu10?5bUD3c;;fHHWbi5v#4hb zoEkzb(UKs9NbJDOIH95t8WK`5xrP)%nGQ$|Wh^e}ztQ#GJ*>~zu-s4Q%nAt}eLSzt zh&IW7XtR`<_;zr4{gzv^4|Gb4(A`+_c^A6|na;G<0ZA|a+-T=I8xD=kAK z=7q^^3vBXlQEKV3og&E4F{MSGlaSeRg!{ z){136pYYi&;i!Gr`uWpW4-jWhoimm3?_}toAqKS|~o;7BmRC1ivq9WSN){Aj~JGw2M*md7+WqOh8>^30PT zPJVXEOwauIVgs#w{MhF-VWa(9I$XJ_ypl_l>xU0xE5G#;1z_1tbmpv>xz!S|4} zl2P_FB|YtCMxG{EXlfDf*t>|qC8NZtC4UOrg-`5zK%4{Zw>2nOe9{*Zhg1I>`NGKx zh0M`?4Fpfkfrr9BWseoVv1b&B(@Op$Y!$ZI)7j%LpwAzGUao;&qDgnzKc=FKUc9uk zMlW)($h9-nuQ%Cv*rU<@A{)?Xs~5?~GFqw#T7qh3q!b5{#Au1jCj@brJ$0?I@@)G~ z<R#e6a!tQQan`px4hp3hI`r-V#&B{IH?_FCQ zb81);XnwYay=Qz3+rME9y}VP6o83s}B1X?y8zRQ)i_vwDC-(&zIzerwWa(L9$%%pj zv2h_rubIwfA12IW&%cJBws^h>%bz#w6{FK0$=gb%Z3_xe6?Zjp*2qW{)ywJ zwd@^!kW*G-wlfoQ%?D>QXTv@NlT?0o7L@$jI$mN0p;qglQ8sUSb!nF(b zzW~EC(PYmrx#@&J1Oz%#=?#z8p5{T%N!4Q+^(NDr!j+N(h1p;e=P2uwu^U7(-he1C zlxu9u2g3(urjOPiS8SgWuBQ#^#*c53s{0Db=vOH8Nhr3on@~z9v#G$({-Brrp&!QW zI`edvy>t%`Luurg0a=|9Oz^*T8EmJ?nFDi&$!3PeAhGmT^IEXG@6LfrL#K1R< zU?@W~1?jygC^=GCC^j1_-Fp?Sv%RuN-$JgA11B?kI~bJLOqRIMX_Jh$P^Vn=;%FCE zz{(y`a0oCrD}%V0K#gY7G^Apbgh(Kd)WE)Gu^E%}bhe^wcPMA(Qh~OkbdFf?>y?YY zJ^$j%$HL6>O7SL|M{6xTOOrQmP;Q=om2 zkrcu?ZtaQ55;@94LjjWpoq=-Wj44!ZorTAHvC zel5Q6+p{lY8yCcit&o>8sZ|prvKS*`Ak|cn;ALNE(vQtGc+j=P*sC=AOGxqZi@q88>Yn(dB>vFFO9#boSdS{8N4SRAb9J>x zUJUD{N?ebn&M-=>Ih9-M$--bCUwUD>{lO^vgK7IKRFFzuwnLkgAP}#I{=f`{Q_6d_ z?j=IKSW;6|oS3z^luSiGMk{)C6UaA^6C4UBDDehJ`(%1LF_qRIOl#LlqK5Ix>`}_W z*ow-YQOcb0bmoJbQuS9?zIiCczicNBU$EfSTmT4IQ-KKx5?HlP+tJH$@UlBxvX_mM zD_Bn`S3-JqgUNLUtS>i403}zhEbv5=h2eC?B1|v*wpdA5IxnQZE9Dl6?+V%W8us!+ zp?!+*K*01rg{MuVJ%GqHHeL{Ujg1Bo=#BxQK94EAWT78DHqZWhf&Gt#!cwtx$q4%$ zp`tj4wT~PJX&Bn~B~8?^_i9q3W)D)9CBnrCq7gb5>B+u21Ak;H^gQPBQ!L@n#L2H7 ziM>lc5$|PZ_mCbBOvlqUD(C1g`Xca7G@nXBaMY7YJOgzAABvLMy!4l=SCxabrM~n( zVOa*4_mm_#CW|^iEkfh4Ie1TAL7)ZhW70^W_eh=XpKGX1@YGiPsfetgHpP^hC-lrM z@iez#8Cp_cHqchefos?FMSs7WrGJWc+6cFV5h%zLl^cbK6~`ols!E4Ae_uSK%C zN>x;~ncX_k43TU`n8=M#&CGH!zF_7CO#t860<8P30gVEL9%#kGSC&J~0jz06z}zk~ zQcC0)k8W8I2Z1W(f;-t6;EU%$AG0aU9L~djF?v4z+B`(p=w#li+at@$&@ZOVWC z(Sa{Ti{g`itm;?$E=*7E|6azPscQ}ujF?)~l}Hc z87pE|H5j<=FNdmgUZJX$;-iufwEqJs6=IGJ4qk6W``xq5!Ugfs( zO8n~Qp?ON=rN<%CnQS>F&)CGKJ6Mdk4l{<`;TjfQ3oS+} z5sTZzq=0`x<47`K(-7#5#q|5WecP8cspngxUcW(9P!#cI-^p8KQ~!X1q0{=7RN}Ov zv=^@f<18y?vRpB~62my6vfA8&7m%DCH6Xbc6zuE^7g|ha>O>ZWl7szuFbY1A+m4jO z`86h`Jf>N|u%1(#DmA4#eQ{(pun<`aBP=y>2889Lth>YYLmr^6FyqHO&osb z=tD+h-K(q_%!o{(m2InD-TCrGX2*9|?Oi=%9ZhiPt~@(K|H{q-tx?SL6Y&zbBotBf z0PZglTgV%@L$fP50dhv?xhmQBEW#Sm2Pg~I1ha(AAF);pB9X9pck$4ni(v-0TC z;^aO#r%u`H3THon4CWV@~|Z8pCkz(Qu%dMSNH|EwW+p6S#nd z<4cNVy$`pNI2Hk$8eCzfGOWMVGxPI@(lyJJ6#B<}!7@eZrza(q$I@j=ZTmbxvIFB0 z4M@DBPZ}iJ063#hz%i=gE;uLpDd46kGFsO0IJk;U-VF`%e+x0~iY9w`pTc1Wglnq5 zJPyjU4pLvH)MY*2uxSuCf7wbiOUDcnjN(5m*a9-tBL&2R9;vTXfBzs#n%4b%B<*g< zrv~y?-mzyyeASLDtNzciROeKQ!-v42T2VM4)S0jsqW$a13g)Y zLB_R*6a~nFVOzZ;OBJFR4|&9GydczY?P)v!mNFj35z_V`Pzkg!vyq5L<{lG4;a$hv zopX~0jJY%SYvqsp^BXsu@4n^zbr*!hRWD~NU%o80`qd0-ed+u8KmS}Z7k)AH)kOy5 zN~O0Xa2U&yL2@XcSFkxPAcjRRzVo6KE_^k4>tPEqQ&aW};8yRyY@yd;P_Tu7*km)h zCyK$)|*_Vw|I^BrVM#sE~VOYrBq9U_2$284^9(WZ(L)c6FGJJsT*&b!yOXRYz}CN z7!yY3b=7e4_AvdB{83+j`f$wlrC;|>Tsv^t4z3WkE_xX!#I0bO;Oes@LP(#1&zux3 zEJ81W5To)BW`^1uWT2PuaoMFnxM0wx9We^bFa;4a`rzV*VcIM#h^snerDgO;q1V+K z<;3fTaii^}q`JFK1hS`R!sc0pr^m85O0X2H$}SSh@;FVPFE{GI{~nWLaH!mY zBsq%Lv>}Da)8I$yZADkgmHTVke6{t!?fkW4M$I2h>#c5mS3dS6 z->`AoxD_-sBey}?u=Yh;_buo(eqhJ;87(`G>Ns=L$8!db9K`x$c03hY=+a>S^pb-- z>>utpYhrE`=FF zCffP_{kK||e@AC+UohnCSzVg)q_5rDHQleTY5r{CYF`@8pj-~jUx4T^l6Ep88ZOLx znK>LV4N5Hp!X=refn*ZM^Ktwz7;{Hc)K%>WtX6Uj34-Dx^ukgp6J9_>TrDhetc$ z0$o#)nw=&SKQ;cNZvKb(4}DH6&Qm_16XqfZ^3q&7Uio0IFqwXA|HXcbUQlWY@dB2U zP!grI5^aFU2(1ECyXeGgY&dCXfN8Q?Cc&z!>PZ^FiUH&iA8&?f%gm8KX#I&wjmV5o zsv->|Jufar$)3DRocAiI_UWL0`Yt)hp9K_MfR`PB!aGW&J<&~!u1EcEqeM@H<0ZR= z1@9X=WHEXe@e`V6LpcFM{W-7nyKV{?N3s`$OVGVS`>Tk6nr@-XT z?OK!7(-+i*uq8H7BDF$OYNj%HVXy*7V{&*j;ME&^|BycW>_zFFTYvg#$2R3?ds^|n zy-AZ-H)#FVX~{o)@~!eJTlweikq0&K><{Qx=|?dXc&aUjIG-I1JQX7+&lX;63-`>0 zWqEquQY?UpFlHrJgZr-!H>jZ(HkVr~Mf!2;#COLXOs|pAFL%SVmQ%aG(>paiTPRs_ zB6WS`QA6mGV-4SHlsrBUdU%fVA*~J_^1An+S@T|8!$~C^jvI1`4KCwdmAb%6a%fB_ z^Bh>3^Pa(m!kMb~Ajq$N(q%@&P>273{CJ1I_=7HvSV)>&COU@G2fQa|5XVb|xEa%( zv18yXD@=SH44m9Dt}D)H2#i*?2!sVhLexbfo*|K@1>1dx`&?d}fB5>fPx4ou(`zA- z*~4a^GCuslOw0dV@g9va-??qPy2=$9p`-^Qt6=_SOz=H=$oKBygVzd{P8_$`m!=C-l_z_;W@iWXZ22CI$fnWfez~@H z`r^GSm3!G3|2)SJx?a+6h^kc~jbyQE0>*b6c>H`864 zcXZx4Y3#<%ul}C+plIU#qRIChFi)3ZaOFO2us1Mkt~{uGB9ZQj)=y7&D~yffa+?SNs?sLKI_+c;tjn5~U#Ki@<#^ zx_Q1*j}BIP(hW+_0;MlqgEB~|KVP^fT(z4rE~P6+X_NFz8NxG+#afr_GC(RYONLPx z*9hnc0`_86a2ad@W{I!O&(BwW7sV30cux2ecV{UksTU};7HNu{*VtywSw~}ywubP_ z+2RQ_6$_livZflv^5s{JJcC-Y7}<#3f}mM2UufYG1WQ%xryAuNuJM*Dq}FggqH-}F zBqz8oamnP$dBx;js+K$KG$DBoESvCiFW`zWmlr@lEFHxRClnFoc&S%GUbj9axAHz~ zGA;kg-gQTtu2a_R$rzc_xjPkZ-2W&4#QM#jG+e&+)UkB?fZS2d*I(>DWXiPN^rQZ> zElG0*Z8}lA&ag|us*h$5ZPT-D?*a2O`_Hvl=j5(G`QY-xk7o`~>)ARndBD79fg>_H z^ln|dY~b+DeMi*>Cg`#nWB=Rs)$r8C-?K%vdSOJLDe)z5FjHe`E&=NF4u8D)1 z%m)@~a!wVj`-6oF0%i_;5^A#BeXRS5kI@Gw0(cC=lT=~lhr0+@j#L94HIe@4T5x7d zz}&3sh!0~Fk8?(`k>b%obtGfMSgvD5wt%Q&3{oErYIXw8{z8tC)Mt}&{o_Nl%9egN zbBf02=H!)pzLCal+e)LiZc*-T-Kl)DuG10PiWbq9NA@cR&YV^b929yj-*Ejv*F87Z zFTcNGZntS0b4HD|DVO%kGk z{GbVPF!zHPvuau1njny+IL`avZSE$>LIk(={3U)GYCpn=urWGzMt;i|ED@^=R_^fJj?#TXw#y05Gv-!LFtjY7IDW|)4X z#m3@lSp6%4f5A-L3fjc+3*=uRog{7(eUQ}yibWUs0$B#EXYv%xA2u1aE#KZ+OrVo! z*&M8g%>o_%4*UfIgEdG!vO=y~zX2nqx<)1n@mq@jTAcLAHG)QuuJD=3MKw%ElyV)( z<<(rY@>V%Y-HQT+Mj4|(p~>ZWoF&=nk$@}5l}lz1FK@IZ7TcnXay=KtGLGXpFpSEg zDhjEf!6-Kg>L3+)PA3FUScEw|23jaCCZ5?tkR>r$D!H{fa!@&dtnvc~J8gxV(Uw+3 zX3X84+myRo=#{=yShQyDyS06Mvw~W6J$j)1z%Ds^gj*WXomIA70nwe^r(D{*m!`-z znzVnfa^*K=tJu6?+|8 zHW)tkzQP(^S|28N#OuN+jD#-&!U8M`z^X7lCXwiUo($n8*+7*+@$PtIH z@JRXtvM(5O5t`y~`PfhnU>*by+!nkI6PWO^-I)xsF31_oU^5AvT^Tc& zslmatZ^<$79kD@{(vlv`q6c3EvUPN=g%5?5y2H@oon#*#Syq*K5X4@PMsqwuXo3uk za3eq{mPNuN-$5{xUFT*0Am(z&Vf-4$I97_P%Pp|3i)8=@3l?Fe{WNWy(>|?B&w*=7 z=8Z~yKo1HZwxV?hwP@5Pqebq#!mP}(sb2!V=E6K-HsFgRBjhMPfI@AW(3~t!`CP*JGc)bsP z8mN1r{LJWl1CQs`MQpdf9OMz({dYK5^EE5NU}J zfIFh7#Ra$>r%fWrl&7e$ECM7f8T6WHVG*!E*AeFUR3eF2MPcfn0h`y%Fk}qvl2NX4 z_|opVZQn|*o8U76PaiL=rp3B_h$X#gO_q!CB=>4fPwI>@8L&)~7Uw*oO@f5g!m?&v z-)Ayqx*&@|T*H(`M!cUotBi>jZM~|dQE-XHqu8=}lS@o8brR`1a#>wYqIWNehYvh` z@4`iUZ3`F4xkI!24IgoCxRm?h@#AZHe)#FJwYp)`rsVe;K6S=O0xde6Y=H2wfsa>) zuoXlrX?vocC%VzPJ;;39;P{WQ9NSeig7{Da*(`j9Q8B86%KbbLOHy^Tg$2>NRs5b+ ze(-x&5@F(es3S;p$HLV$S?d24RNN-T$ay z)Y0+-Cr_L+XXKXC=XMXiFui$RQ<|n(zIcrYP+kE%7>t9nxOjbW6k-H~b;dFays}N^?m&GEo#VgQRY!zpy z1xr~B6-us{?7MzkC=L~S+gqB2HujH83!lE+Ed<8UsR|O1v+Uny**DM+#0KD=9;Cl` zM*IS@r8axR2=co*IU|i-5_#<1&zGH$sl?<1^RjitvVjL1nb+kHpCXk~{FzxcDeXbC zlGwqV5Y^Pai$_i!WKIHTEY^QACKgyysnyV~^FEP%sTY9Pcj<2JsjLZQ^%?-i~ z7Tz&|-#8~`y;gX+kXhQu4dEERvBel|W#H?BZe0GHt+dfrku@a8xz2%7cxEzEWK!dJ zb~5HGQXy$Vbw)Fr#t=-gHRCDbQCgPrCsQ-CXC6dG?Y8@i-yg7K8Z8MJE98$pe(^VP zOgsAr?|-P}EcaP=>k#d@h^5xf+5XFZ<)<~us}IG;lUe4n{@T2fn2tPk89ebZy#9AV zNr9Lz=pq}{bu32rIusC}52l)jcHFx>vL@;psMJn5uzQ$u%uAWl5!OL@7w3?q>(!%rX80dd+A-h z526%pxs`);EDc*O>q5629nRM%B8cQ(^UWubot|e9UKCLth1miu zD#`8MY62LR+dCo+&Og56!{cR|m+EjlEw8-AB%`#Rd}t9$Vpjj z{FalNt;LL{>p5wSzvV-dM|>7qJJ8e@?>}dDrfbFW+*AwHs|f{&!g@|o%VB}+yj(`D zRiAHc^{sNW3q_2t<6TE`Wwi=~f;%w54Amr86(q^nYJ=&J%%kP9)k?KE%|mA{o0^v4 z%#x7law*MB&B`zLoV)1V3CCv6%1^TBa@E7d+ox=iWcy)jJ~J20%z5OMjbZ53ARW7>2HXsLp}3NpzOu%C@kje-s%7T1&!&u^@2V!6UC*`%WCNxQ#|Wu{^eNZKiA?HNvocPA zyp7^gw~BK_ys`&eSq$YQHklyD^NlT@1uU3^^$4#b2vn(vE z%pCwOc=h42aCn*It(B62OoL(l+xG0=GkffvIl0}_diLu-Xmsn{jjzuia~ z*QE3M^E~w+Y2BrFA1|`3Dw$Dv{l(_LE+6!11F>|~R~P*U9BfqbIQpMUpuV-pLNFj@ zB^c2Hi{?kWc0tEbR7B#7rHy(>mmEwPqQ$ zW^A!sS=|E%d5C+=Q(0Zu;=V&ICdIf=*U~oC*?+D8JQH=I^x>L(?>Xl7ta*1D*8gh! z=^yRVnH5)u*PQxd#=W`?ZXN{8rQ`s!HK z6+x^#j-%$8Hxkp3XU-xxK`sZ85mlJ$$mL=&vFHliL(q>L+AeL_pe=*iyj`PulV;ZH z@92iN8#Jh0T5fJyjkn)QPIYCR%sY(3?m8-p_yWD%^ zpoX=@?)lMGqTjB~e7Lp39%-f+h868=Z;{rQ8?$rcg+021IM))qMrS`r1!tJIcmu#ga@W$EuIvBOU0cFxeV5mflHiafXqG1D-TQq*4P*o|U z1);Qn-Pea~pucPPA-_Px>%Ev?#qSHpo%AA&S8nCdFy*OeQ;I^dfPV^|g*zLPF=Cpo z3?!K^Tuv+~!7ZtHYu=2O!r7K%_>1m<+j_!cyt`^Uyz0-pTxU|wddCc4QabU=@IUvm4VbT@9JQ<*| zZ*X{paBFy@aH)q!u$PHNw+gU@bK3*HbTnfkH7}hDI3lL7JZ}^uaiw}gIfPrp>PnAW zXGUiEjTrWi^1XNhA6ovOepCI1e`Z5`ty3!z;P$4ho zmxo<9vHous_K1(bUH|P(Y2qUm>lOB7fi78&&N}3`hhg4pn(V{#9*~=Ei*RZTt{yd2 z?6o+;Yjq1xJJO6?FMmRFp_m8z|Hy#H`!qv=CWH_@GvH0(EHBK0Db|Pk_aEIkZC=>e z@qgLvLX-S_WWf*KeZ1a)6vdH;EO=%Y@Qi(N4|-(A8!STk3QvzHhSn2q4`>HGeN6*i zqYF-2e6EUF3YdNVZ-EUK{b!WNQw7y*eY_P5Jz!c5*{@>i;=Tihu%!L`ef#LH6@~wd z*3B!g=Ix^cvo`H+@Ujx%9uMG)#RzbnGgQf=S_oBgNO*=4bIT+hU+Bx;%;q9j&o{Gq zhWvQI4^ez@%SyyTBS^--qxjkbv_bQT;>!YIQy!2doR43Nrv1|fH(7z$_*i=A*`Fr%67d=?56(a?C+uT)rh*Oe5qI_sGdap? z9FD+^_I{F3*u~Bllwj|x0|(r1DX}P*Xz&yMniAy!-gvM#OZd?Bwi02l{bSeLO6bI7ojMziond?bOpW1xGbg00DSo@|$Xpq{rR0U3dues$JdH_B`^1ySA(C zV6WO{SM3Gl5^bVE;%b|{yV(s1an;V@ZAYjh;%YnW4qRCtu~z#z)Kz~zZ9^M_!}*|j z)-R>jpR6=t@4!L*c#OM&jG+%4e*s@u04lw0NWuBaD!zz=zNJCw3jAsqc)j*Wy6p|M zwLYn}Q(bM(BOkw^w$X_JwYJ_>JBQbH_Q(ZE_#K-??Ga14?#>}kR3Ue4aktK=dDuwn zoULB~7nb&@J(9F_*VZOHY_B=;VcWqbOKF->|pmuWugIukh!)rSs zchwHOgNb`ScC4o_42&{raL5?I^F>4P0%{!|4CJcC=UR7+38D#7^63kht7!i&yOcSM40$wi7EZxa05G zl2xqmRr{QC>p1(_(9K<3E3wHfECZOiwMWvTH`Gq>s{N;{?Rj`F`oG(*=2iQStM&pi7xwq-kR*E5KJBWV z!`pUZ#RYfr9a|$6E4-ijTCV!@X%Mnu-cX-~d?AT?DoxmmT-0w4n3;s?!X*@6Ny_on z!ig{NvIeDVX@y30uh$+)hrgk=M$u|*hA*}4d1TTXYFBh(K&{O%pw`aewVge3K~njS zErs{U@c{5v*F8f0*(&6Y0>=yH;b7IgCYRRY$}?9TJsBCpYv5gvnk+)#l`6W&u2$wb zlF^EDl(=+ZcC03gK8GwSt2^wfox^M6&DVIQTLSSFle*ie^&W?80h!6XZV&Cj+BCcS zEk*GW=%Dt4TybNG>l#*DlPSQGSM8BB{|&W0#tXIC2&iq(Bh%kdJH`tV2De&!0h#&+ zxIIP}ZL{%GYv=H`o#W+#yV4z`_Hhd2t4Mf1Go1bW(hUob+_Qd$IAM9c_DDL`UE8(R zM3Yx)ZPrhb3fz}o=}0xku{1r80o9%Kz#9dtHWADj|AJNUX$ zGS)NpGLAB?FrGBtGrls7G2KFD;LMO;Lf;NO9;Od#7&bHPi?E-=yM=EHe;Lsy;*?o5 z=b2AL>LY7K&W^lZ%3P{#skx;#m3mM*wsgfdS~+`p-|}(g zZYRANWO zo{Vb{w>IvR_{Q-+R5Dd+Q)ynM<&`#8I#KC%rGF~xDw`_5Q+Yt;$(7et-dFi-mF87? zR5?>Mx@ub0bqPTUo$&3Ea5~{m!XJr#iI&7ViR}}6B#ua&owyqHc8?1Y*r>%FaeiiCq}56LlP)HGpY*c2sd}aAjjMO5js;$P1O-A$$JDFSE4coDNGTsS!sOI*6Q)!M zDZbry-peTa4d2o}!*S?~f#)B*?xerEhbDe^mM_SMLTmhIkFBJWG?)z6{Y>(trzDql zC!>YAWR9?sSj0?HPMShm(HW$^(2`WAKa&r{L{c90^HF4!fhc`Z-a*-hG6|&(N)AdU z-9siIAE&-##<@JQM2aPa;s(;u(3T99VEs!!kwdx~WU{USIV8P2JmMgY=A4FeH!$(hnq6 zxg8lx; zEV+pH(q3~c7oYI`9R@R5DrJ&YQUU48?;AyOg}pcqB$>iOV#c-Q;w=(~dFn>uLy{z3 zCQ;aS5jMfAIYne_eRX58Zsio2BXz_7Iao+~=*|P@XGsD*O4dqWlPqy4nXk_z?~Aj@ zYH>3ukb00peGbm&kQ`Buv1&j%3J;Oz_Yk>sjgfCQ0+~3MNeB8D*@$uNi}T~f6=b@& z4&!-=4A%#c{`y*El(>te8(I*Pl!Rw8{C!G3mTY91{uIW3E5>CGc^7SENaM*`dX8)} zj3K#({-mckgsc+^$VjmOnV7Z6T73c;M{`MEl!mkqsVwv-{e*#}iO?SVOA*oR1Dy0B zeZ-}tAz-NoJav#3kj+wSl7v1t623<)`Fp_sJ>dVI)MK>B=t|d(SU5c}ns}`+`rx#| z=)+k+8-XYn1dBsK`9-4();F&LnqYLH6;2au+}~6f9e@Tr3q9v}0DJ%^j%z5NyT+f< zfM>zjv+>so8+&{?zZ!BC{2wCU)R$38Q{U1~nT$)$&s`!)Lumq}HPNlmCF7O~>Q?-c zWHI)2vM~1U6F)~gVwr$l3%k2{T3U0`7;$X7p1=jlGOQ5rPzoCb7H(Zc2^b9Qc8YS} z*GEEQ0{$z24$hA#N;*LlB%SLc2-uZ;^!Vs>dcC02>-Ygb^1-iw_0tmW#s|Lw4t>;p zQ70KBToOdwr8DRReylT~vMAyro+(KNg8^@1M>G5;!N*4uCB1>c!#`@nY!|IKKdg0B z5VT_knES)7xQ`@s4iQwfl*JzFGu!&1`@M+-j}8B83iyzq8wq0W~qD z@gDYJ*OED4LiCFjG7sBt)WW!9w!l3rWDOzFA!;FOZ6u+U&9`0pUP|X>9HNe?wkGBF z`ii}JCfaC1R8-S}O>DGxqD@G!(JGcio0t&Q%qGS*doMjEBWhOEtQP%eMKz1c?$h5U z#qupKWX{U4M%hS*^nv*8m~OE(&M4#B&CJNCn`o0*Gq?k_XJw#)9A^XA@>5oOqD`03 zD#|9twM%cGZYye1#@4t=Mj4AGs;TWnyL8)$CS@!c8HqN%3r4^?ZeXMets%jtuaao< zQCsMcZfjh|Mlxp2V(oQEkFnT_X3Z)y3q8<|Pk0|6qU7}xjXh5Q15FRnqIPHsn;1(O zb|S_SV*!L2O%iRs39UM$HwB0mfasTCi*K4}^G~o zjE?C@W)&X|$tYus0kBas4jF+r=Q-BPzyw?48Hb`s*Yv%WNRu*$NhR@76PypIYC|TO zO#Owb6giss{Wzd*QswfPm92_^TwX@g8s)J2u`qr>yV`tD9M!v3ExspB?%%d9-_td( ztKRal{)5ro>&CD<46b{9+P_^h*38cN*0EMBZDf0Xu6q7jdqfTlGyoiR6l9x;4wu`R z=m@!p{R}bDk#cZ3oEuz@j>KxoY`lH1H|Y%d(3T7WSDeGPH{=l^VM=cj2J6%4s6zsk zWh6wj5PwV-g-LUX5n3%wA4$UXCx}t#MnViorp7($$AC5=`6XY%-yP`O7vKR!I`>8F zF&)9`NFMt-WP`;y&+BpiJ?DN9R&?ax2sSRt2$U$y&kQ630RIS_&&1wH%)s`+y2;Ks z8iw5Hfv7bI^=cryBMIN?_@7F2Hq>Ty-TQb0vFp6xu`d$o z{mfy5Na=t7qCRVb-6>!z;Qaw{I9kl_Zc3xYP2wh6iPjZ&h=;^t@eFND6+se<1wSE7 zs3O!CdJ03tuY^g$49O^LKzSj-$&`#@w3sACh%HgNqm5Cl9o)ae<9i61#_G2iSJdxU z>fNvX;$Pzdrlx>NkIdu%L|tM@Jk}gm1`S&=y2%*L6j&CuF=q7;QEZ5;&K9I4#v%>x zQhE;~(V3)!F1x{d?*$3I7?OJ#G_$9s{s@trz4%{G`#iMu=i~ypNG>7Y!BZ>WfnK4c zw&Nz?0Y~78A$Vp4^f`kv)DZ=kjE)HW2agC6>*!3XDSrd9Fw)d<4{zvxLf%Dbfzk@4 z14<{9&W<0Ei}x7sfO|xGpv=X&CAfb%%67D|17#=5E|lFUdr(fIy;CTsQO=;8MLCCZ z9`{~AxrlNJ8s#RQcMIhkl-nqG@Z7s7lyrlQ#C|t{9@4?N6CG>8 z;k6w%NL^S_^&C%01IJzRIf{g{Hk|zhXNqyA7*s3)Go2j=aQ|77ryL@Mj!I~u4VmUZ z1jn%+_XGkPZ(%mAGi@9$ zGoxb)C}9dla|%Xt3h&cX^yw-3^b~!1iatF>pPmAO){stVDD6->IEqLY#{#tPkCuzj zauHfCLd!*Hxrkv1S40xyIEl9%KLfVE#Ze&W=q4giehGU7g=ecEVzoC84Dqi~xPH$MfF1rr|aF-rm0%`6K8EeE>0R4nO zn#aPzkzf_qL=?F;teOzmK+Tb>-vZyV&=#$cfzlq9VtLp%o$*HNuK30vKG75Z9cvc8 z@z8wBVJB^a1yc<+%-5*Pte38MLNb36`5_EoLeD#1J5wnZc z@b!UhV+AzKruKssT?6Nn@znvwnt;DHz5$p6u7jF&@x}kf#y1F=wDrN!4e&Lh9}U4B zP4NvuhHEqQzd62PyjS78R}tK5i-6tM0XbBu=&k{4W{$N|XsIS2E3Ce9jTQdiCca@Dk0vJ`83uje6IR79!&*4U zkq>Ot6r4%LH-clzmt)G0W6GanDu82(*^>=`JBF!HjwulsYJonq!dK$h(Q)kPId*jT zzuuj2z6-tv%sOQN1iESGcBE&rRVenUTBxIWRy#=!ntd;X3u0RX@__JW8sja;1x0RWi) ze2V`8ERQPP)ZWbITf6`E@qVMr>4~7q%)se87MA7P1NXmx2B4T(dzgM}0ssKpJ^*0& zSL_DE#oXA&9RLs_{q`7s;{*cmv}bN&VEnCxe{;6~@XTBVYW^*LYkl9G;2WerDj-eG zZJhs$-2nhVWxw-tbwF2}v9>e%_K7ll=h6L*9vueZzcvQ$-?@n0e8&;~2QUOMZCe8y z697OQ>6_<&`!JDp=%noJoSeV4x^E5TKi`)Pz}Vi=a=^giWgr~!P!Ja$> zLj1%JzUZ&@7il$yN7=mRozC`M8v^gi&h**K$`}@t}p0KZ)R_~kc z=u01P+<3lUW6EEUIUkq=>Brjpn^&7x(N2!tUfsO9DQ*)UC5xA@x+z&_BbzX`Jz7US z+gA3yC%&7AoxQ1kH-kMlHMgZNB;CUeB39nYTQx6FkNFRBA90o7@R=J~37->Y7~$G_49zsmHI@)|VBjHw zpW+Z0ESdDBLsMz2XI!97nl_fAX!Q^8;{(~imv(g${_eNs@qvejVCp1G_1uV1yTq>q znnSk(4G+28Gz{bRdv%%Ah73VQi@fl68S$pGRiecI3-t-54au@_^ILtz>E>a znmtpGC~ez3vu2+>!)2@G+N6gDK{hEUo&J4I?iuWJWnK9b+QHmol}D(p{K!eebA@h* zF!~cq@`?#9j|7VpN@g89;GS&ec3{IE?_<7hwPVa@iEed~XLD@bxTV8$y-mLXBUW30 z)(w$8^)uoxBbGm0ZyhRsB&{0vv02R_?}&`1zCe>&ZX zdboza@iL!;ujrn)j(Gy=rdJH zdPh7a_yg8Lx$fEz;NCmQB|`nFmzen#gZtKw^>Vwe<^&EE&i@ z5N{n!d+;fuYp!6e%rk;lQrvu4B+m8}K)SIYolm*yCLZsaR_dLRE-3Q zd~p(eA!<0>57B6k0VScR8x3ObWCW1ZC_*XmkCXwkX3T!g1j&T4LXl`8$qGI40dL9R z=N9N&yxo6bz7n{+X!~_?B6Ew36F`wR>7gV?xPl93W!GXy8RPtm8xCnsK2~CXMG^^= zxcG<$l5;)MD)dc&JBVz=Fo=*KlCU16+i@3!H9?y&h*$rvh~ONhtsl#{umHL|&gI~# zL?&$}eQ7N9Ut4HCy+6K>vXQ0LWeX?r@2|*Y#6h@D(CY%hg6B5$u1HUrGRMZ)){@IVxHw@M z4ZpOP;zE2w@IxJNr#${Tx(U@sxD=8UH(nGkM&#MKBH#eNbM~18i?&q*gv>t_wQS~g zz*`NE5Bm(#yt_|?f9VXS)z*ai85;1 z(`n9!%+BMr6YydRz(A7Z89?us4}+860!kUeOs9-M5Dk#6PWn6#kga#D?sswKi=NT> z4KVrlF?d4tZYjub(@tPW3ptra#dArWRL`t=L|eG;;MPvZ8ja0JW|1EyE+dX%-bx=w zqk_Sdp!U%Q3=&ph%F1T?aDoHJw1TsU?NEM@T-*P-N^tvvT(z$h`7ROw)BtmUCP4qY zlFA3j0c-)$fU)mcAMjrlf%>TrKn2YLAboKH;6KvJVPr^ zH`k1MT=d(EiGO1bA0YK%NEcFg`z1^_w`}1}_|Cn)!ywE;O|_smI0(NW+oU+#uulCu z=T0ZHiIteTzYL_f4kkAccc}jSb@tA#oa2R^r@P@^#3{Zf+{&m5J+OA;_+vyuvg zjNuK+H&di1Nzg86@FGFw2T`{PU;OU|f&f4P&;Zb{F94!DNRu~|0IE3ZV^&5tHn^JD1-$e{H_c;q)laLAOm*UURIljz5=|vk+ZQua z#6P0b+bCW_s+Zx= z!r+XA#sZ|EWQEX*%gac9K($vTu1N1IePT)IPHpVtsA}vSE8-byCjGD~`YUdnCkVJI zsZY@u&X1lsfu+}%MhYvc!`i~dFg9<@9L*Rt?YQvCl)MM$LLrKV<;s}fLvlaQR$y45 z%t?$CQjpiP+iz{GmdtVDQejf`XycmJh)FD$0C2D&kSF4F{sJ#1kQDWt4n#gNN@^#h zo@L?&)$8PjtZQ`E|5)&e>-F6Oc~+y&82Mh!cP-}X0Ean2xV#X}eW<`ybo4vxXx@WkNiwkZ^UiQ7uv53#nQb@n{T z0eP?N6QVfD5qy`SEWsC5n5d3GE`@$Iqqvy0ZCT*=%$;j|u6M57>~kfP*w%Q3P?5$@ zkH#iNl3e>FlGwfLBh3@kn9d z287;~q>FE6v&m;5d=#)3e*72_?(?jpNPjXA%zP~TMOM?d$8=Jom)YzdQLdJ|fp(OU zhQ>%^eWmuDk8Ahs-+1$zS|B8ol<%Ul${^ ziw>A?tw%3{%+(@6)4;eFeR2?%OM+?|)s32?m1Ov2T+YY~)bWzwf9gwCYN?qbXs+|N z>o0flZm<`MUdN8{cAG2Sg)oN9lGkiJTwNV4DD-CP;r`~e(p;1~?S_mdO9{0-ZStRYF8YfMDgK$Xx4`2Dw&B|q%9H>A%Sr1MZoDWO)B>t(Ue0^#EY5>G-?Y3dx}z+pf7N&FA*I@q8JBN#`| zh3+!C@E#g2N#PjhCQ+jW4m>@~ zia$hK#S5eS^9$~wUj`lKfVLdG)`j`Na&=mEa*##M9_bOuxS!-QTFmuGNJ}Glb@&9J z16TcQ$W$hAJqYI|(Dx))446n=@*f()>ah3<8b@KVcfzCaIeW5_GDaCaJ$gmL)0udd zO${qGA8ZeD&_dFsyL#>XEc0(Fp&?sl^~7&oaM_7`KrJvpP|<j>yknT;YYqtz|Ju9>7&!BUT|I` zBPxh}z!8%9E_?!;&S{m!l$h=;MsrcQhxBj<6dLwP;ZpFBE{rZF zG)2n=&_r$Sq@I~c4Icf8!Wtwq@^5!#<2WS-f0l7pb=;dq|H_W0ndMPY`s#y z3!QPI4ylPxsf&#vRup0sCGT6+{;NcQfOK3{JYrfyQ*9zO8#{|VPdmc1kLFAAIh%>D zZ~T{=ljTV^dAl~j>J^8^A#uZ<#C=@7&1SV!zce`-b`=-Lndo&Pw_cy^L13+3@6M`k z4oTQlaCZUWdxKC;9PH@S-+4jR))_rnZsLGs=n#KW@Nkqs(HrhEV0~B_dqFvnPh!FU zbz$!^l2z6ox-S)R(%HX2%+kO~^(&TK)(b2UZ%GM4ky?mQWGiXcC3`-Z3(8NoO`xUv^;Dg2xrQG>nq7^-!ALr3PkqY2rD?u z(gi+u^H@PbbpwBi!a^*%;1^9wjO&G-=fzO|rv}fE_Mg1|!>dzQ7Ce6v%&D%!dv)Pd zCL-3b5sGU%VVe-+)62umg~r*_q@XSKDbOUh&v5YZ{*BKL%E^9;c?Lihq^^qPML&Dn zY;ARC8VQ&DTNs?VmiqGU-I*~q_Bs$~oYU=Z_Egn86OXgK`l~e7)Qac7BPuQq>#~$u z;2o{5#!_hj(kdx1Hep@2bEwIKj7aktm_66^WSCLvLJbHoNH)t=J_jYj-6K+qt^_7M z@JE^mTjQJ^=>UAh0X_!p-b@L1J@?2WGW(N`|Kt@lfp?JbCRp?0Gs5gp|p zyX>S+CjtZ9ua~HIIZlHB$`hJU(NPA&!F1bk+?&#z$6ts332f2PU_)a|v4;|3DRWic zkg^g(3?}p$O?5R6yNu}%NCvVE;({zOgFmIYB}Ujj%tdCzElA|#yB}p7rCtKcxfTe! zn-*^!mPyXhQN8`ypYRgByp9UD%YaxNX}?UQj26LBKVJss>1;n;-1I)<$jBHnJU85l zU<~`7Df|(l$>PSaJ##%?pgs9gbK9j?{L$|TrPpI=fY6g-pMp}&#DgtkY9GI~1g@V!Wxi=0-MNQ6-pNR_OdFcfJRDFGueV<;0? zoVo?q(Fppa<;W;FVX3CS zUb~FGMo=(juv#Au)VvntWzO6reo8C3^)X0U=69Ek2X)+_AA|#^Gdr8xsYIVCupW_>mD$)2~h z=I&H;e7aD{CAa8oI!$bPipqB>pKsnW9IRuXDd~<^#lN|24{-dV76fxe!~1u&{3;QL zJ-vljUqUA)9cfzf_<1q@LPrL>zvY~Ro%Qx?)dW}FA%X&eXfd&RyMn;@n5V#384WtW zwcV4XNX9~01Pw@J5A>spe4CFFGUqYEQH5E+&?8p0Exupfo>3BKZfKWLaHW=KHgxX zZXoJc9eeB!j$w>qBe*2@M)RKIhx7(}1U*mwv^bCKn2qXydHMDr z`RJ9j%F|0lCt9>Zu-2=Z8Nl^>>!siKv}@$$^cMI6RN>2dKSlHY+ibQtpm81=@4>od@3Ro zmfd~*(=@28yjihE>6Wj^cQ7YQDJ!`T*QbB-y>+dfUNc=gE`+x|0tBy&3I0p0i~>R^x2BcdFk^`+ zh{x_})z0U&*#9KvlkBQGS0yBA@^@-z5y`;yE8)E6YN(eZX^Qd_=Xyw7=dIix!9|Cr zBycw=_h#k%p->skQN2(r0KEFOMD>ZLw!_mjDP!1g*Sl+QIjH*zZWiAU;}_5)B6zE? zl{J!2@iIr{j`$VDZp)?lPx;=wgx$ceh^7h=zRYn&)D*I_%nZumA@z1zhc^*HTy%LI zOKRS~?OLy1j6yC*pD#CGOe@uho!)cp+7u8f?@YN?fCjdxmMR*1G!s@ zwY6dk1ibE6R=HL4F8}VYpPNm`YtCbSeOvDuu1kE}TKmRs&Bg8OVfS+c=GjyA&Mv_^ z_)H8xeU!&j0^T^?ex`_EAMm`NZE&w`s7<{Atg?qs2DaJdYq#y)yR+DzIPKOWbNOg( z6kydkJ@Zr9$o~C#3y8`sr)%!ynn5)dAB)`ec4hl?iLv7K_2cYu9(h14*(G9Z!yQiB zL`9McfUNvXvkp>pOut_Tg7zqQQ&PlKMtCJRyV`bp^-NK+PO8+b1+npX(-^)%x8<#j zbJNE&^T}J6eJ~NxFwOINVnFRrXf<|gx4yMsxz9Uz0gLAq{Fp#yeSoydZRDM$sq^GK z`>z|SBDz~=;q)Ss5~39f=h!QNvdHW7KEe@G5z%W6*W3DR+`C8cT~lE3hz2UrJ2WP_ zqO9p{3xBXeC-qHsQYKiLB$}PtL1gO>2#n;)sd}!;mZ?naq5+6V@H0j=t=J{Z;O%3{ zg_)nHOWwgisNg$^$2^P~KHvKX_TD{CJ;@L)AY^6dJ4=Jz2CdGgcARs0$9>Mdb;&_u zkD$ZY#w9HJKkZHMOOaYYBaZAHRj{L}vdpB2UEp6xOl8%va?(wG6S;twRr9s(5ivq9 zHqU$Jg?4;N*ts^a(YVWm(%sk^M3xySv)Qlo7OTTZu=HW_eT(cnf5!zl)d@*N&g%#L zlLqX4U{tc;Devi_VOwSrR}6xM2}wGkxY?09D?b5kMhs7<6uBt)Yw z_*qWoz-m=4b}G_?V_S(@h}M=ie|kB1C7vwRpv#!G=v6#9s9vh)Q9eyC;pIv@rH|&V z6N~TkE&ZePhP~dZY0SUJwXW-`_SBcX#hI?Md=IcS?; zdpww1W3Ihpti73FcnQ|S0(fD8h$Py0{yx25y=k!79tQn6cY0LB$)Qld# zudCv0C$BsC2=m7b<Rozk={kEwm_U^p=eGOL#v zP=f=(dl+~p%*ZUDbBbReVkZ^89TUNo%8G~O%5A7VwHQyDcQa|%=A)cwwu*)>(fG~{ zVm~c8K$okuU{A><|1p&Wo={rol_s;pOt<@JlhqkLqCCCdee5OvY~TPfpXj4+%jFj?jHmFv27(hZMZ5T%Qx9XU8a5Oa{IZrD(i_RKw!q(@jl$ z1GU0lfIzy1v=c;|Unhh=DZB4Y&zS^BpB~ zM;9>av9|8;Edvm^AoE~PP4ihZT_;iL2M)2~lD`z1C+BqiXkgeWdq%K`=HAb-VtP}Q6mW5o$@UqeMC@MBRNwh1_xC;7^iW__4f2xjoPNm?;79rxx;VOE-- zPT5+%^4#yj-SDQ8Y6{p=%|YI&YM~;?J!U3J#i{UH?$nvuK(!0-F=7zaEa-cTc$vES z{vqU#aHx(JS|XT_Okk!3v=ayX<#O=)ZEC!7qLuf4@~6jeYQ(bpigtQbEbV?UwnWpu zdV^jkDRS(oH+mvIaOUF&^y@-BxA^EU@b&Q5Ife%rg*vWSAQkQH9CISry^J9ip$QOa zyv^E77mQ+}&niEA#bP@7n!|TbZWD9*1m$#_m*7P<*L~Y4TKw~18VbQVo8NIKb*ua= zsyxPT_TBaRpt)DKLD#*nEnBXlYp7j2VuVI8rOG~7RNe%YQhd?_>pic&E7aZo*Ch9% z6$PFw49ii20;CpJaVUIOB++=^iTu~;qLopDnB~a3`^DAsC5`R_hFfFo!Nc9$+Ps3D60836m ztiDjAXGlr5BUEtH_V>4PMiTwUMKlL1J=)~l&xI++=i1hd?psDGzLe|EM_7S5aKQCyWNANu7ESMa) z29m^SP%<08upwWJ<1#t(+o;pfDo9>b&1b6&OCx~wDx2lMTbb+>DoAXS%>+NYcG)x= zmeil4BU^{z?J!Y;`uvPksg=oOf%K9}iQE`*vU?GqbBSN2&*H;ZQ1uZ}ewpm)U4z@XAeUK1R(74!;d zyptvXMReZBy$4*bNQ!&OLA1TlX_K7G13^B9Xl&i8ZbJFa89xIXcjiwktVzKwv)DyV zYKmy-1Ht1kM$PN<{Tu9&Ne8vn%U>`+rF@YKDBqm=((7xx)oFY~>J`~bUrC6mX3P)m z`lJP72-H*iskErm;MWuQ$WiuM4HWxvsS0?h;_H6_0_%Qyu%ntjlU7g4rs?9WpKuF6 zuAk)Jzy6#e)kyfPy_bH%lS_f%3X0?0;~+a7oCu?o zO}-(?;kmztkQYk=G%0J?K&s=<+R*`lI)J4g0uc997t1FohxMtmKsu;7xw3Us1dT#+ zV#OF(#tA)}p}^%9HQRKHLG5+uk{AV#%FQsSR%XYQW^ZgLd-yDShXEC>K`h;a`5ZQs%ykzu<4slCy}o_wuW9Yy$NnuFVVex zUr?tN`&D#Vy=UDY-7#kNG0pTxlG|O-x@s&qYr5{fkMA#>(le_?ku!JD5>m(vW%WPc zFl31eBB9HpX;X^Jqieq=>yZ+Si0&rT%NL~Uk(5BAxX}0dk$PO-O-)yzFWa*6HtjDo zIlX-z+G4P1T<^@ytIr#b&MLbXR4OFeZp{Daum0l$!=KzD3DMr`u7JCa=y&A7kRgd# z^+ZgOdG5t^dcN7Z*{mAmYEG-e*4@SC>t)mAUPyQu6n7iB*8UWhih&nayVye@@*9uB z#BI#<2#i9EGcfupK-~NplQyUO42+)G(5uZo1tM!R{xX3Z?NIFai%fOMVrETMM&}Nc z`8&pntg&z38|5N2*4h!FQKMh*nJe$TwgI)6Zbs+h#WHANXt>NFYd?HOtUavstF&U^ zL64O)G({j0bEf8iOl0K;hpfhU33h2hzuhl*Qp*BoE8))Te~3Cx)|h$i46v-~tB;}X zd+cGhlT#5@2^D6ZMF;bEPX7>T&)6-@(_(qG+{Q1M%+A9+z88DVd>WG9W4Gr?gRovB zd;`#3rse7yGFhGvLGe8THFd@Zf4K1^@AZ*m#7u2rsdFL|_`+TTV1wbxH>$PlTHtL; z>s_YsJzks0HC}D}Cs(S%Rsn+p9?yFKV^igt;%t6l*)V*raMVG4^gl`a79MO zr-x(3D!5ZDIykU}jlm>!YnhJXulgs#8P9-V^w@f*6(5(MetS}>GoJ$QQF0)Gn1F`7 zg~AZet1i`PMwJTT5Ed0-V@wIifH{Jb9BZoXUKUy}91T_HNIvCQ3D&#?VOG#$bXyn7 z*F5NWK{5Y>9QqAL(7({}k^ul421p_zv;ykXEY5{-m>q=mZYi<5$4 zhk2@nD#5`$?~DaafJkwe<-543{Ego}zb@0~{saG@-y8{Qvw$aoY%YCH(#*7YQt{LA zzQu{~DnSj+NwhM?s3A%brM9JTwzgbmMDp@kJupH{REsXK_mONqpMIsDl4?arSZk!d ztb7->LQY|}$e{_YNL);&FqzE;QA6QC?Yekdz~;%I$rl~T8H%uz63sH1^7#v&>=oWm zy9ZM|GKl1tBib;$xvJxJA;+7KpX zD^qH;yklLjPWYOXoI;r_m)#pQA7@~UiAYs@k#W|xPyRUMU+ zV9Y$>>dP`K896DVr$wJs#L~ue0%T~17atnm$Gt|$=F8Ld^*RyWb$Fp|dnP;mD*~%^ zmUXY!y?6zstf%k(pGz+56^ujJr*N3S@-6Jm>&Ii!nNQEM_INP|DVig_`N$Urlo47x z*(ut3xlr8$PvKqN&tz2;SkI+XP6nTUQ!C7#?9!5F387JGK8Z~gnnw~%7b5#|vKL8A z0O8!GAIs?Ly~(`(4XNs6)TZsJ>S_hF;UI40RS_l#v_XH^h0>VCXYlLPo%NVG8cbzV z`3c9UZ^_+Q8IeH74G$%(EFKRGl(LYT4S$N_p=oIt?40Yvv78a3%^_8HK?j2ni}gr| zKtwc+ZJlzC?7u6HCfL#Ax%_@n)cO%Ig~NLd`;pU$j`}LSBx~HP-CNq*)&hqmI0q%* zo@L65%<@<{P@%etRB6z{APcB%QUWQiloD&X84If2y`?io^Y{!Y6z!oBz>^|Y%8#YW z?zUCjR2R}g1$yXfIz*;=?zP^~52rx=p@Gn!-4Eln!=-9V?)Ls}LCP(M$|d?}sa4a= zwA)_EQP9VZe7}p6elw%n>=ou0YT+9!6z-bxUtO7N5U;+`eWMrO+-fO356#Bn z?l`g&_G-C2YwM{i4;+! zDP{zUPGD=#fxCbr6sdC{{m!m0kpd^gPhH?r0C5mGZ`W$<6ScyPvzTz7On@d!fHsZ4 zOqwa~E}NX6DiN4@GZqg+vPliEm+0-2sQX*Vmx;C__6=?M$Ej+xpX@YE&R=QjYCPAl zcu8xVk{_gCbOjumGz1!L*+V}*8kn~(^}NaU7mt|nFdprAwhW7!eD!7>20I?ao;$T> z@$#(KU7Kzv;PtXkcCiz4*Blquwn)lm|3>j)vd|Z*ZrxPpEqNK;b9Oxjc@(Wb*yJ%8 z@9qfxBeC{4&Eo6z@x2Xm8Xh!a# zpSYF>S+c#}sLS9nBR05jh*8s_tL}Hht%5h4INctrkq4*Ibms0AFOqv)4b5AYnvrS< zsXBS+l2_1dY{Rmzb=J;GpF5ZNZAoCZ01gaKrusu|lQef``bVV!+%bn42M(33$YDY>f_`%>&>94o%&OSO z)y~zA>+cbhFy~iwe;F1Ae7FRoN1V(_=A$ioZlt3$73Yhb+WxgUwoRwA`R4)CGRP5l zZUj{#TqY+K_QSq6C99Wr$!gmzOLc3V=W8=VE7U~JUg{Vja?Dpir1=R$BIIo*U$;zN zdSf;_+11+#!57&C*%=&IBN^qQ=Ao93!nnwZ>>)*( zcxN8l+w%6?VeudP?D<^%YW!2n?39MK9NbooNonYFrP7P50fNY%G55H9tY%(VA@%g}k{h9GzUP|4r=Nf=|5QM;5L ze>oEH5Y)7O#+4RQ4+{7zQ-{evTNY9)Kwt{|Aqqgn?VYu zIHWZXDYT>0Es=*#itj254L*DyE(>tY>Nij!+6-mFbM$K6Rw$iA&xaw^Q@YZmG~7|; z3YjoFYnsYu&o?QKOdO&6EbZl1Z(lAHo^xXY`Wa-IZg`^uG^O#rU$M>d2^6*(uz=4h+)C3G19cU}m%#%x?;Z z%h08aJms!eF00wSV9XZKY2Q7^6N#oh@6A^V)#&wE_W%b0H>h3x1epvQWi$1>54D;h zqmI`6qUjf-iWmCaVS=Y94;Ov5Z_^~ zNh&|Biyhy5L(tLdB4j>gqwcF(&wm}9mJW z>R9Q8_O|)_UXJYQbh%iqHrhxoIB#&oX!Y^>_gbOU0*A9+;+0psjm)*L3XjujtHVz= znxI*0r|>{l!I>1sa`or28e%FEnthIwj~(xa+yz@Q)CUoqxppuX7lzCOe>hO+cX|KY zQY0lyzq|32dSH}X^%i@As-P|ecn*jJcr9`SN<>^OHnUg7 z2yQ@`_On?&ZfaQvyt~=!T~@}}`3&6!<721Cc1qVtpCySso2B?bKNzv--gvmO{}*}- zl3@EmlXI+zG>;ZEcHFF%)w1V?sSyoiiK{sg;91ZL`EPh3_MpmQS&B5edViu^6>Y@L zGPPx+2~k9ftii%I-^R-9$^-6lx0!^}zq_r|%WauTf@?-BB$By+$gL@3J0F;%2c>HV-xpX6!c)iyW=*abW@zZ-H=RjU>&URxADPYd4B@n)rx|iFunMxyMuz)S}=b^M0Z3C`o3}Lxbsy zLCy+qo(;X0to$x{?m7k2_;7vOjDz%OM!N=V9hlx5h2JT4n4 z-L1Auir&B6dsDwtvFH>WEe@jk0r{}|DJx>>B-pY%m#hufdX&Z=y);Acn(@0CtLSf0 zx|;T|Nzd~WB6Zgs)9X78^!$wx?C}eBv zy%G7(MM@>orx$dVBQ}jWUJg|**P|J!fNxz1(RX_nml>5*QYfXFER-jDX`)Z1n^)EF zk)y9EM1^d}db&!kAKT|2o%6lehm266mFAA|-6av?m5pAvqhE*#c0wHCsm;9%t7;;K zhdmai)QUk^iYVVzXSSn#uug?Us-O-xn#OdJS9N%D26H3b3?BI_ydMAZjW-I&OsA%e z!-T$b^X{@*9!=4Lbo*>OZq@2URgQ_)-LxK9z$bXjWjWpS12-5;Q*)iE&SNT3s`j*i zJtC#&Q>XE^mk_%07b`NIu}pKUlFp+&wE}?ZNc*nJ<%b*Kk_w_cYm>@uJ4-iK$J^kb z3caZD1*SC4oe>8|o=-@Wzh@AAzeNH-brl#1e|m0u)zn(cF}ImeHb%vg)%rtrHrw@@)c@3AZooX5&aR>m#su_M{4!2?G74mO4{i}4q@<|qD2UB;tr!U*tp{y+dnrm zT{+@*+2X!Q6tbJS57PZZA1XMxm~X@Ke-1y!b4mVLUt@gyyQ;?~V=#-O$P_D;<2N5z z%K~M3MU>cXH{S$VFnV365ca{q^S1kw4~(mYgMB$Wp1N9uda#Y$qkw}y;ZOYiZYcie z46JJ_XhJc)g)3OW;*92%(ZUc|%iMr8F*sWn30EtjpRi&X5;EaGSA^&2iQ|* zD^2aywj8Y;%PPxYXjPa(;9yAy>OD>)Onn1X%r$9r`<_!2)HafRVJ`3Mbn*GGdl!Zmc+8wTQ-Yo zUHADbBTm)6IzQ`M++CYx&9pw-9iPQxBud%}8@GgiWTJjyzr5p)QYwMxpu3|D5UQXB zb|C!w621)BMQeuY(4w$4=EB{tS>%$@^;Gcr7`s~l+Z0<}(dqh`w2J?}XtiTx8sj!6 z+osSf6e4$1MdLhx*VH6h6Z0;6JifZ1WzZge@C}Lli|mgPFy-zpr)D;z4z{8FF?lIC2Q$ENGl*r5B%fGbI1|L~(jCyP!n) zJ5vQi%truxDY&Cfc!_-3X%=S~y}<^r`JjqIf3kZ}npKL6-uB?qdeomNgv9i!uNYeG zkcMVbO$;M)`G7>ww|Y5B4Qtx^Q_p_ww2pnZ!{9YVPS^2I zx#}Jca)Xh^HTHA%4zY8$PlxRFuG<5P(VVH^dCTu~wMa$9O;9 zT@1LgV(*b7X1ay?tV=5M(v3&W#4pBXpBt-hrp^ZueWcTyVo?x^{F<8kVL|&x9B|ub zx?m*9+Yp8A-7;(nr>k@YK z^mNQ=-D;xfSyQ9BH>~8lUK^gHH+s?NXgw%E$WJ?L0UJyj$?N*( zE9pw(kr2*BHH4=xRhb!87XTo$T_XOp&BFOH^J<4%FP)&R!YRHd~MeB zkGHIdV*G5Q0m^|#YAm2IXiTZ-2m08^US~{U$^p;l_@mfoS`hEXqEEP~&g= z>)z5#j-rF*@vn+!;9dUbWu>bO)?5NF1>PNy(c$jeg~6hqE7nqfM9Nq+V(b$D0hdyf z|EGXMZbER4JbC)+95HJ?Y2mF;>;crBbmE$Mk$YYPl|~0E6ts9dLTQ3kl6lUVB`t;^ znqoY2LZB~cb6hV4HHx-TYk#qNv=MQWaf_`_+9AM{V)7H@Mv+0qKhnD*A9OI;T*S0E zmk9ePYAce9)^?xzSNPAO?_Gc64H5b2qRQ3gAbe1$(|b5Ahr<9_-j8Vm)2#LgjgzA6 z3^+wHOH+I=Obr%^6bXYJf6@jnyVtU?21PqQBS}kXpPFp!v@=%Md#6*gJD3l|5IzEq zK`Y~t3W7QG3dHrm%TOG7;%!(_MhUI<;}zX8#NjX#^{=)?E1L5!wyroHLXg@IMQo40 zI^8aMG=|#wwQ^Qr0C>O5JV{%kmyVhKa0max9`wT*x(nxfl@evyr=KQ>U2$U%y;>j6 z)bC%>FQ42{i1^#QPJ(^Gl3#7wZS8}CRXgGrA8q~dA{C@Ts{Lup;t4)Y;^<>YvV#4! zH4yu^{*~TzzXP?CXI1J$PapIc^))9+5mVI8wLB2rwax1ii%Y;lqm4!1V!@#1a+f)0 z8(Cn54m*6-1KPEo*gSzL20noDcyQHcrmT`ZAw9vMCH1`5No(q{I51!6b#-a(7zry8#-0cZftpUnx@lJwL2*KeAZ)`EHNo0ZhzWrr7V@qR-Jn2N>Fs z`)a{Ar}VWUH$fktUjol3C+9@oeRKY{Kf*KoysDE13^jD$E}KF9P(!W5#n3T(_eiX_ z)*}fFifkE)RX?F|F0$ zuqC|GFD=(H4B`imP#Qh0%C*egF=|HT%Q=8LMN2dE*0N_1k-HBY6-8*tHKxH7KqJNrzyP7_Ig&Jg@L~o{ZoRL?e>tSR0|4?(}xnTU()N7XY zTAk2zf||nCYEpG@A@PQO>#y?V4%<3rcb_^BPw&ObtUd@mraJ#m0JH~7_}uxPspxj3 zeMlLyT}1fsZ>TAFLt!T=&cHA^Usq{N)LKEiPS*?Be1pzYbc(bO>kPU;(HBU2s9jB$ zhCwGBQS^eVcGf%Yx62!9dGw3VFuxP%UfK=7zLH76!h96}wV}J{9so;QA1K9-I`9-n z{Yx3$MP~sr8e1nwd#Gywm+=iGI=`%ET#c72zZI&0qy3R6J0AD{IXI^iqoM9RMPDH8VYaL3k}&8fW(B)Qu<~hgoOj|{=rj8D zWV)^wvSqQRUK2;rDbhY{HDqTg`T}VWwX5ldVNfJ0$G!%vWtOa^H-K^jQ7xn|NSy$0 z6lK$IcryDRh!0U60C)jS$A{;E#&R{FCo4+})ms*;zVe5a zFZ&LJJOteU000310006202(7ZIbRPv^#B=2B000000C)joU}Rum&-us0z`$w#OW~g@rxZ{G72E{?Z2<)x0C)jy(gTnr zOBe*;tg63zo^iHq+qP{CVh3m2wr$(CZHCXbLW^9pBfhq(GR-tN5w)nVQEp(dZh)Dx z5iO-B`dV)gkoWMb4j8DXW13!ytj2|mG7k0CBvjD#P*lCaY*P@Kc>f^ULqXJys?#PK zLk-DGF0}(A)l5{7)I1l!e94JnW(`_68lks@@;$F`$SQ`hRz)0==`@PRgD~6Lj6*sr z?urMst-pA_G!EJCd2I)IFPgVJ^3k-Bj5AD2pIbdo;sOE$FA8&Fw#ao>q$>MG`|yP=EByNLZQ zj?`EnE-aIwXczI^0QmK89{&xOo`cl9w#Yn2F8eoBHqTMSTt^meTkCbGq0V6sx4&CM zFq`|+q&)`89CWlUBfx(zppIdsJcQfy#!TAVM+~#QJnx0q*vzUTTIlC! zK(%!h43mCX!|ya#zp$2>cH{XGW(g*mRm}4m`r3cNX_vwPvkh$=b@9IxLC1*sJAs3; z3k&UY%zh(tnT9%iS6dl@mFf~UIR?Y;aH5mxg;jbe`kSHfTBWekE`Z_6k8V^+bwyt7 zM0Xv88oDX>7hsO=3O{u<3s8ywQl9hFTxMatG(Zt)kIMQPMoQqeNO^2yrRI>zR(^|6hx zO|c!dy&?QW4>C?RA6N{(eUHQH$nO~DIPG}mtm9nj{O)SxI_NgJ z+qw68te)(i5uS@)x3|1^ly{-`zAx#k@7v~2`iJ>n1gOB8!2RIh;I9xFN`)?kUW7ro zZFpxykCckciX4l)it5oC(Yeu;(ZkWZ(eJSau@iA3J}`bYkw5V}*)@3}l`l0XwLM)h z{YVz&a`I?-s=PqnE8md6DHcUkiYP6V0m@uugK|VIq1ICmYcZ{YHdp8LYX8>L59v4c z4}bzukPB1-^*~oJ0?Y^7!8!00{DE!=VKG=2c7em;e7Fssg-_rgW~z~?{a^0?iZB2G00031007|n8DZy3vP8lsWk#~9rgc?A zCNwqe(N?d{fGKs^7hwXp@DL>>|FLDT0-@s~#CQQ?U}gY=|5*$v3|IgFDjxyS0C)l0 zz@xo^L7QO{BR7*a<0c+PAi15#%0N?2h=D_!VLM}Pq^prEkhz_yEB@{{JIH88Fjsp!@Wh#E2(QAQP5F|n}7FfzXWGHL|UT2ytCp4oc>PzUmn&=@3( zs82mQU`c4VL7+9gFVMIMBO;AT)`~O(rKgpx99m%QaX*vZj6s|^wkn?n2XJIs0RI%U zqm%TV$haMVZ3@~;l})#{>a!LOqY@(l!5|HkFd7i6F=H5*IWty9t@?|ya=Ax1Br{*Q z47yr$^3--mZ3rOVZ6^HSpn+q?U;1`e=nPor;ll3ldd6d~-01q%sZ+0169dk7XtTG9&G z@|_8T%t54b5PmuS|KH!r_TORtx|FQ5;-_afQWI^86xDz4Vc&octYDjASYu>oKCHoP zPJq~-iLo(L{y3|{nn*g6E?rWl%}G_H?L@1bK;PQ4d<=qhQryt2QN(h*YFP~FF#b># z1TD=NP5*yY(-oj}cP@>zlWeP)^kK_18h}Kc2vUwnx{*hhTJb^Ug#hLEM9HPq?QV3o zysVSqzq$b)!&3_CXDiesy5Y^zeZe~mD6o7OOMM>1r0WSm>k?&12|-kX)Vbrzw*T+{ zWm|97Rl>Di2nSLdi~1|j?Fs@=6Gw_V?1=C<7+yN3BoF3SmSp9^@wzl=0en#aD3xvr zjXu$5P|R0x?d2r}FsxkQkG*PU02tJ255yYJ>4D8ScZsdoESqN@$kx1^ea)}^4k|wn zwb(4I!#k!$QQnODSWw((lGJ|~F=?FkrJJE(r}%TTLm*$}0nxQJ`~1-K{y15;fS{T zLp{(7eb5gB+QIJ(!7z-#C|rZEkCbvS#_<<%dl_-iYB2y@FaX7jevkQ zXuxY;YvkBtY_`AS!JrM=p#wT~h1j^%jbY?`;$H{`gg_X?%)Uz z8=^1_BQUC~PW&6e5CUNk4@+SXhF};*U^F+TP}-6>O2xw#`y1B?T!$NQ6K?5JxF_Jl zTG)Wofj965-oP7pAN!uVaI{E3lzQwj63>uI-L;0j4!8j~;TBJfxigtOF6sAD-^HXk ze*XB2i?uLA=?B$@6bj`GVumxN`H3T6o09 zYlt;jh)|jseSm_ocKT^M`XKj|7x#X@y8^%TIGZ5lknIb;j{g4s`>)*HzeO6pAB?;U4`6g=RzJB@3 zw;S6CeduQq*uU-JJ{TGuTkv{$*vRl-e@3Pf4KMfu_rC<{uJX3iFFl*;(m%olN_)Ak zxaW!HP%ahtVF%s``_{~GSk#&c$eejk*q)Z{?j%z!TcSu8`lI@#n()E!tU+u7n!_mgZQoas9)W+ zdkelgW95PK6~C=MnXh88AIKDhKDUIsfBZqM_!`<^`(vx>H`I2QHj(OPh4|ug=6;u4 z!{;}lpW`5BZB~22&hYNW#I2&GGm1z;!Kr0UwnbY41^HJ3a{fti!)w=#!{+@ zDW);C=pPHKZD47iQMRtSCGI%=pKr~acn2FQgOxwENwb*bdk!{Z2;e36&f;1$JMQ_Yi`lY z*f5CmGM$p}XoNXD@GjYFj)^p!j729u&EZ1jaEor1P(=-OG~lC&U^3|nK?$RwG6M^C zv&2J6qAHT3l_j*%L%X>eAjc9pmToC4ts?x6I3#=FeP?{lVe{-2??Qx=H#n%FIhglR zRK{QttZ25|?$Ls%eMM6&5{z8GG{m8XoOXH)4gOV(`5~Hd-PJj1(5hzB1u$Hp04Zjp zQA#NXA*x@RvIE0pV{<<2_|(QU&xMOjC{X5rZ%D&JqW-E z0P%^DV)%jb*M#3>&zk}?@+<((ua0gD3#y?bc>zTj_AemAtCPeGZ|^Vh&H_OBCie(PpiR3Dow_udt6Ps=efkZUXa058q8C``wma^+=e|WAe6QD* ze5r3t-@vc2#NX(<2%zlq0LZ~BfW<&g0dgu}2{6`@!LSS%Uk`@m!1z`N zD}df~#LWP#1bV9xw*jyk=QSj4rMO)|_RyqHXX?O> zRQ#F30$>1u=vb&mu_I)ec%qz(j-4uV`lbjXA~JVPhM!RcLj+>23Ya2F%elw|PL;DwE)x*T_iD~KR`8SX7JWZfLZ!%{W5Cj?n=+9i*zuv-|GMWQrBobj>t})EUCWr^7Xrz4krGo- zsI@k<(VHK}(s7TTpcumsC0}ejsT~-twIvra=9v*FIu+4HsEXQSHU+5ZY9d$|MyZ2k z(=vWbO7zIaLqlb*}ycWXA#ae@V!BKX~HECma8mVpjGu*?@) zijXy7AqJ6;n+*Z^2s}mOXN0Z<^930D5w=ekn{b{XE_>6Zri>a(F2kFCRVFq+WxAw% zFbBSx!X81C?U3Yqwf(AUQScF0RTaYGDh_V4*s~I|u_R(jP;3WF7?U9>K922|F?h?$ zEro{j9&bLlfRlBi$fHxJF$B4~SsWWL8{^ulF+|z9PfkJ9dT>Up&DLRZBAOJeu0zx( zmFvQ3qfni=r6!x)m~5-+wJTA3<8f1_n0#{aP-n7mndz|GA3b_m`q&_Tiq3T@4qAj* zYc$qjbHvi=D1%>_1g_OOsQb;SF{0KhW0J?#EnaEsYOVM_2~y$#D{N(Rw3tE`{%^~8 zri7Dwt}PL{EuNm^jy86ieGW0J^b79c8L3iwBPhZs!m~iOqFzS=L?(8yT?@9POA?li zASe*f5~ctN{@aozAOXcos+1sQ%$73*T8t?Pb>kMo)wbDMLtvoK_(v zLZQw>pi!+CC^WN&y+@pBmq_z7pNB3W!!4o6`dg!N-n1)7?6s1myNMHXC3WR*g>9{k zHifcV8G+2*Be-5lmCP`{Kx0rHt6pyd4t>`T^g;Z?3Ui!SSAdF@8T1MUT0-oroK_{y6I5|c_*a|6+S0R7IXGV;1Ug|(llmT%+odd*r|Vroop zZgJf1-%GqrLFPvr++CR22O_{pd7H%3k<#By(EopWu4LE24aMzOoaCi zZUaFqKgTsKaci56aX{U7Hp_qDO~in_))B?ZOC+$R6Z1_ZCk9g`M}V-ds3jG5oO^}Z zq}6UGSX;m`Yzcr=M;v9+r!DF~c~>zxwY!<}Qc7jv5)04)N_td2ueD-ZlsBo4f^?Rz zCBLd_atJ}~%x|b6xV$OBi-yhh;Bn(}f>m3;Hp6o+v&qXCWog8E2M$7F59C3s^fr&p}a zy+h2KIG}uA{Gf7DimNi0MXjf}Bv(eQ7R3$$dNnxJN8d&HD9B~p)#{VCPnYUCHE_&j zV~ktfrCY7%t!5KkV43e-$F#1W&e)h8nKpC;w?r3;$1?JekSrz@4VNW?L=*vB%PBJT ztG=-MSC2Bq55awk6!}2%(nu0PGM-Tva}m>GDq(7w7>t-gd?R>MnRrvU?iZpRACtaL ztkeJn4RGS?hoF9gN@{bl99kPyEu~Si2oj;>E;%4qQ73qWJeI3zAp~Hi;Q)yG*aOKWjqQAMf z$(8;?buLH^MszGvO@a7+$qc2Ej5pCXl4KXrr3Kx-dCeMqDaOQAr*@Xm$`R*WeB3T$t}@wg zMmWt`U7V=Y%bgT+Sk#5qMf(XE#ahjLW~OsBnabJ3kQ6J4rZgr*Vxwiz-Rvb>upnEt zSi6Hj4+oPnXXBIshoZy-?6Q`F&4nUn+~Y6W9B!Mu?lBO?%Ct&JIbY3z9XJFoI@ zF=Xl+(3Yz6VIKbm0RoCZYdEiak8FX$hij9fz+0oYrh7bC_JCV4!I|X&V5#uxjl$ob zE7QrEzDHz+oOPK$p)@Gy^kbiIF|DTZUCTn~lmESrN0i2L_2>X}I-RZkB#1p$ zTs1x0bap6v_QCm%SJM%tl|5+;W)6vvndBAD47SceRL?(bKidWye0b*G(@8=Jn^nbV z&nNJ#Z-^^z{7!dRib)K!kwmPjqx$f8!XsRqpadT?&j5m>10n({Gj3B~-td1@J=LTR zrg(FCoj^G^?q}u$4|R472=o8;%3Mh?6jz?nftL-gI3uj9?F!j#g|wz}QbrB6jF`US zmeq&;UUOjTc?LPt+G^1Szx?@ndmw3`B&=b`z0uOZIB#obb-XMuzJtjr6h$S~#QFb; z&NsIXLb&m2iDuVq^=`#>z`pr9Ph9bet&z^qGFehA zw(NuR1c>+js$jz|#tM!28r4coPdZ-mj;X&j-EjNsMz-9rLl+C^X1}lqx(T(2;>03& zLk%dRP)pp7RGjvP{jhDErfAqzZaTs}7P&;xLwkx>8 zL}Dar+4!mL{MALI5NRHpJdh5~`}V%?{oBXt3~QFtGp~EM50#mg<=j7;{?$}g{UHC2 z|F(~JXL&UcUxQ8&04#cO7Uq5T1&_-a9-my~4DVi7s^xzbMs{a^UIY;}GmndZxVOTF zQ$B9*%$@xcVW4)I6i{etOL3r=mgdmgtCI;>Y~KuwICZ!+fJ|WF6_TYE_r&ynel{Ps z9T46}BG5)#3yPbW`B{C1T?ESA*o{NjA%=iyF_f41-5_W3#L(}yyV;|c#*^DR%Y`%Z9G3Vnf+(eRS4t!|reF?q!SwnO4lAmr(ko0jbS-Qqt6F#Ww zd;2~%zCB2eET2D2>Hl+gW$pK!0aE5DMLtL_x*f}Yu@UoXi`yhOWwiBHdz0{)>aybg zDvk^za&v7`N_}~JOnq@`a$`x%y+12;rVhf#4Z7C!ZY+gQ+$&h%g|> znv1DDAz_R##E>aA+UfbSmBBu0t!v%!T4Ho7RI9ZSeWgki1+0bF(ht<vi=AX8 z-YR4M5&aurZqaNOQVFD1`TjhVg!7Grf!u>ehv=yvc_Ug);eXp0Ay#;KOI_9b{H4~> zF2sTloKgN7NP+j7{pxtE$d@e?&4qg&Z3-@`+$CvN6y)aS$BLJ+!tjxaQBDV%3K?8B?g6kAt*<_I z3}B;b10^U|i$o>UYF4d&<+3StTV=aN9zTebhvHYeJh^zQxDBOD}Z)eO>u| zXR<8XE{r8B{BEj!b?&Fm!^;0~u&Gxvtd`%;6}mgedxTqc``$|V9ao!}N?r5DOaB{R z)hFm;vU}mBjy+fHFP_aVjD5z=HrSs>P)|}#M4pn`@1Rv#Usq3T@AD+&>AQRNt(04I zQUqWPP5jN73h3-na`58V=RG$VkY6cVtgf4XE5oYnb`8)^6ZdCFRxm8UB~E3*M>{-0Yhy zCy>pvR0~)_SaeiNlD)`giLK=}I?283uKFncRIwM-bg>C#Gog6ILB7bH9d~v}Zu{ys zbayw((t0d)hN?uG8~)wTyPG#nS0%e_0XrAVFuE$v^M0_pH2lF@V*}?$+lyCT%Bu&d z+S>K8-9J3zc{RN7`{9S;oUo4mhJyUQ_9kGJm33U|a@Otn)_f;%7P5e7U8h=(<}^k0 zRP{MxT_doWt};*oXnlEz`m4j`*K&nho^@XF?5RgDxt|Qvt2R<)a|6%DE0;`17WY4( z7mYWxx%=t>vm+bmojwnS1cDY~{KOXaVe zc*G^oyIgOBkUOr1H#QBgg6I8JxH&+j)m)sDr3m}PD=Py5*tHg##{#})Y05PzLnom_ zcd7hlirl7D;hrcAD}GC_UWGmj*%w}MQ!K=lp=~$j8d5USlE~ya{rV9xl#!51u8MYx z0MvaPc)(un4uXEnYT&m-l(M*$y16M!P3P#OSID{dpvN;Q(L9wHgCpqdWu4 z+8f!CWR-Jl?tYPvFT={9QiP1XwEJEDGmo*~ zQ?5SAuY2RG4WjNO6F;q2*h2Vmi$R$@IrGM!OQd!6%MPC`BMnP)_4pw{!SDG!lb}7R zXQ|C~<9?rRcldS0*Veb?8GgVCy)bX9@R+e@I?UvuH4TY4G#0* zA+8c;02viDS`6@5CBJl@unM5orX*o2Vx+522;c~TBTr_lW(FI9iY*9sfGB3J(fd^T z_G#Pi23rX~?gojH~-=Zp<}Z?2RJ8WE{xj&5pD$=jBWhrphWh_*Z5sesM%GH|Hvo9YXzbBUJ? z!M>NFV4^znJ8z1JuYiFjTmW?EDpnYA_RzNy)CtZO^mm(`6BIz;plYxj@;*-D6ayth zkxo+^6cd+{rJEx>&EeBQQ1`OfYtR2FPnzgc&_wzT*I;KUK4`hXnLiEzw#0fWUooDS zIzOI${<-Y9NBG*fH>MA-ik}g_FMCpSzW)mMW@$Z>Y_b#hgygUuN)FlZhjT~Jk_cxsL9*4n);zq`D^e{VZ5x+2XziCh^R7>o>8 z+pAzzs+o1v*NGjgRXyHbqioEoYmz!yrWDsQ+Xpe9iZPp_C(`U>hl~00)TH?$+a)(; zHxll1Q11B#kMTovm!|;51(Ei#^GrM1y1F z2-i9T6|cayE6g)*G0k=^QddoKoa(4mGiF&!u&Qsjuqu>{JDTd-M}Cd+#ZSrUCLGzN zQRGCrj`;Gu-~wL%B!TR;EQq<8TfZCI4&h+rhw9?s5|7ba1u>dYNcyJDJ&8dYgffJ|)D6n9K;cx`n5a zNQK;LcquV1wvrMMsEx37bn&pzXDph9g4kbHo(RvnA(#WM>?HT3CKTeX;W-H45S~Kc zmW>`~62EFYVlo@}^75YH!`5jV{J)>?0k{qI16AUy= zw)UElm~Klq><1j25*&{cvhL}yeBfQev=!X!vgeSKO6FOHlTWHgJ1p4Q)7r+#Gh-y9 z%xP^63xWozyKOc0CHO$g5GmX2ZpUmlYuW4fvT1?!0Xc6HI{^B>beY_93S=5yg~ts; zxoX{3@LY>blm7QXphKZUms7UTSA}w5`Wg%~K@nQ^AJb#xa+omDTM7hSFS9Y_irmsvX%%HDXZ9LN))W>}WqN7fe^8 zdy$t)8gXUgp*e&Obc-;)Bd!PG~A{HKu&yMzTenA54PJ;&K`!V^ z!#|4m&_)TWrkws4FG<_Cc%v)YS9${=?Mx^vt@ZmgFa3jrlh6}wF^}*+UrV3a4qCff z*{zK8SF$Se@}KiG33!<;wk7h{y<~c@yR3D&m*1?vamd?(2$b=lq2?urE9Ua<6((1G z^Hh!=``slcVFNMe3Ty0x>*Cxl_L&KuR|ZhoLGTD|czS8M)Zv#)F7?AmnY81v4%aam zfbjDdDoQ@DPCi5SgAXMN{=c>)u>&ObMOcJqa%`9?UrNNE{ZyuzIK0b?$9JARIkV1F zv6S%ZZZehegsRo3QMHjtnLPe}&*%5JGn1b-t>VJf>=IJHEO?fFU#=PZI5lmH4>Ihf z$=mN5pj<^W3~ghL~>B82y3XY^1Thr-@zW{1GJR2gLykR!hG$7pIZy!k!sZ|L+xc#v&3?{}e!C%My7;DDC8q<+H zQa$1}a&Fwj9~q4|RP)f{Ayb=gj;h?Ms;knp>st-r27*VoJN-J*E&W4HNoimKJn}Z> z8_EBZ{_D2kXk9T$t&EXAN>rx64D8bLAHN|@K5}L*!B?)*;h2x znp@of6|4QUYqe(bt?}J!VY`9xP_XfUu?I7~ETHK&FKSrU+6|Yv*nfqQ7EoDY)-G?8 zn_mwLfObxMI=*SF$^t0K1q{pDKEq{B(-Mu1VZhj9SSG@7+3=zz8b{xXM#m^RrDhci z3o|ThpA45#_Fv&wixMSf(IWuwo2cjklSqf~Lre^TvQ%N9tOqR-7b775AFLB>yWZpbG&LooB|;2( zT8NV$>vAcW7z?G0F;LD21La&FQDPR7X}T*417!smC>Mg3h*M$rMd?IxJpMGTkyk^} zhKwQ)4&wN!R{PpS<;HvYsTq-Ma%<8rw<^_?{;43kVBOh|$b_e0cIIFD8QbGXEli6JxIPnEkSg23n^|AF`I@R}ch^XMkN#lX~X|@CHK;3G-Xdl|7qlTsnYo6_B zhi?wh2kMpCO6GW<{rx{ef2Qx}_o_~=rY!?@QF6WV3fcbI1N8LsHCNlc7+18=ghL$;$0`zAFT6!7wRTx(oG50?mCMNO+ zY`hR{G(w{n>J=b=7{sqe?JY_fEc#VIbu7s((cf-*aN9 ztLhnCp37Yn=K9wAZ~O!*DAzXvK$u+Pkph5HhsDEuJ|tUek)G)RR(UJW(6b3#sn5Ww zBo0C$KU_SjDEkmg)eEehJSR%!l;TSVs?}J68Ww*05C%IXynsp71kXC2gJ=0bJ~5ZDgB{NO+ZbVJO1&x?#kvDENCV%d zdFh%qz!!#+>v(^=7r`Ags>Jy<1kp@DVJqew+Pt=-FAKNTbN*9;u zM11Yh1Ujl^k-W>rn{IMZ7$3MI05uq+8VIZCn$p-NX&P{j^#l)V>1m2$G31GRl2IB1 z4U46aiv`^bWd2E1wmE1W#(->=u$eX(EO^|&Y#Mim?Rc11@Q=X7u6PZkkj03_4l=Z@ z_Zn?qoc(wvjd2o8;{1{NSO#?!9#dlHSriZoFcy}`ZKbqL$Qkv5Shg`=%zlRW8bi1mwDAw;m`tZZ* zsDtS=#U6XwrWUZJ_a`E0HqZ;?XUf-*aJ6S+plTqxn7Q;pNJ@d+UNbmaag>0!cBtHh zkcxQyHez#&;x&vM!3IK59p3sLVTE+}xOype%AI84h;TVwGW=3xUz)PdWhAXT>u&b0 zSqsox8}916jeCn~t7SBlQY3#4iV@ZoD z%_-CP6fM!Ih9+LD`G#~pXQz_@Aj*_Ynk0F$I${cF{+2#=(bFgyOQ!ZQ0uzl)lm&i( z!#1?HT+t%u&Re@3R-4KJp1T69jkL)bN4sP8oB|CZ*HlYwiERJT4NYdZIzo8?Z8=;=~-a=5Yg`$FO|BVNqbtm70l$a)1M4?G5D(skG^*b^wZSdCQ! z0FJ2><3Q#OLwa%-+FBi_9oA5cZBE;W6)0Bbq#l8G@SPwiv@vg?ZsDkg%s^_$&8pzySA%x4AAL<239DIRI9(9PAjE z4RdG&(hCX&FA-8FqG)f(c#vA26hW7VRD(^T$Q$0P6e?S&LZHNO2RtJl>uKi>xU#KR zimQV?^H8S-2=51#?o4!y@+S#-t_%79K60f}#5$0>&Pb=uc0|b-I=5{@35eqnf48&( z=QkkoRp+8mfo2LR+&SSV#wpHB5dAj`lE?w<=5A?(MgVa$u`$KMIU{CUBwYR#9Dg4D zuVMDALAKR9Ew;n0119@*9Nb9H3?4%NJlmp=qC4mWWb8<-6;7H&(M& z0*e9JW3i-BQT)^K+iJ-t!60ihjf5vn3kW6Qy9??INT?n2S*2MyhEIxe6O^?+ zi%3zkUO>?GQ^yR(%LmlV!oXphjMLdCTuoPa3`XxAyI7H{%%s2Knb41z`jD^@C}50D zDOy6)7|=O?nt0rWJ+M+Pp9+`9wHAe+;b|!KIm8EJ>xxNNHQ}ehwF)|Y7<3BeZ^#WJ zLdB$Nn(il@tGkPxQutJ9Y{k{@5eHed>?mHUu*O`?!6T!kieh$vzVl7*PA#>V3yq_< z5#^wy#_fn2aw)(xd7JXJCY9LeD8H?f^stGD5D zPY9I*N#B)3v1LVB7_|+3S!7Y`WL;a!Xhbu+-RWVoH$#`fa zG7N_stdU7Zh{!*;tk0%w*aSrukSJA-@vMUwkxgB^p22lw%doFXoeJd8E}jacPY$h% zA4Cc@AA&rZc178gFqK*}hx_Hk=$Kg$^*EA9{80|&-cEui=D@YNo;AuzUweJKsEnVI zNTYe~Ph55iu_uTwZa)F@5GzKJw7xI-I%4>7)QCMiUu?hJ!?hRA{_h>yb`pC352;gTOE?DsU}Z0Z)tAH;PCWJ= z4pT?y=Gu#B4k(emw6jOSOuV8~g5>T@woxsyP2VBAw}z2hQ}a%>{@3}4M&8UX=a2Kx z`LBFxT*;xqjNRSb#0exem#B!dkybfhKcAql5h`nRm77=w2T=7a8BhKtag2|lF__=F zGXd?B@vi;usCzr_n10>q;c%q zAt(`0mWhQM^yM_;kIXV26HVAFPjB*s#8R`5Og)Q!?NG5Xl1wM4cLx=Tz7) zngwj#^%8AX4#nl2=qRA(yUTN%YbqNT`IPcI$$^;B9w2_*%&sqE+&bsu2DM&L9)$tn+%PQ2663MFH= zIbvScBEiA$O2Mv@x`&iWdvc^D!B`_#jX8B)Ix0wSwZuSHqr)auitWVYGXk81_5#N3 z#-c(S?az0+tdp@M?NU$q&PSPeDqH_2t zaa}-s&)?)bUFh3#49>r6!i4{YN9paC9U1sc$so+sq7W`EXUfoc4DPaE=^}TMZf>*| z&<2A%UL;XcP)OZRvLxv=hjL}w`vbc=?SKFK?!@a6Pz>TXQzhlPl;$NgXpA{W)}<0p)xv2M`R`? z=C<)mIejdm=QOuQ0$LXab(+ycR7V8rLfRi zj3riun(JMAd4AK8rI9f`j^B}(NDv+oEMpG$w!c_SI3o>Dp^C!ybcEXe75{tz4MRx~ zy|i0j2O@-^v82!6QnboHDWJDKrTk0i9p#>~uK@!Cvb_areL|5JZiToARRR8OppT&o z^i)$X{l;9e3?)A8>?h#(H`>yT10y_s=!;6Ld*Mgj=n@d{1>ga2jk^AwrYBcnQLU5Y3@wV2@O9iiw`Z;^ssR8dh;m2Ov`;$pF=tZ9ygFk`RyfC8A9F(L-@ zO_P=oE7_T-t17_-F`)C9&7VHz{Xe!|fNOjH612r)FMkv9@AR)5s)mbFfa-snpNW9V zbxRFEb)}`n@4(dmhWv~NxkP4b9QjA?%};HNaLa42_$pM|-^j1`^4b*TvDA{-%qX*r zt43jM0q+Rq(B4>?HpaWMGC&K=f^_hQeNYdRL86w`j;LwNd6%A^J>S|gQ<+WT<_N{5 z459u?Yj@PpeYDn6O4a7jWmfk6TEob-$|3F=Cd$n*y+_M_q*$V=KGa)xP8T{^7bI0b z=l-Xr`e?!|;!`iU)e!v}l+xa5P7C&=5in0PIi*M(EvJxcW)<386HKcTd1Wjm_Lx*f zP0g9Mv|(%8wNa4o$bbiCJ?knfRB|ak;o0)ym@3zl6|3l(vv0^d%qNaX`J8=@qU#Y8 zW0!!|qb01`@3FE`Us9>cYn7>eP=4HND{AL$uUoRS*zze$ZZ5Jlcazstm6ODjO+u1v z%gaYxJQprw#o?#2q?*Qvjcs4N*#2<|UEAv1WPa{Y+DDX58ZswWv-6OoIRvll$HTeX z+igyl!uqL4eC@TimIyAX^pgFQ-FTjCyk-V3V)ymGn^ldPcOBL~C zCp6_ATWOjnO@@WdQo@BwmLAShptNF3@72PE@E0gTEJT~pP5d6iCUU^?Auz_BP55@>vMNt%H@$QAMPaVJtKqU& zPk$G$IX&{-Y2}??o+hx*egiF{4{zVlMG~#s#k-1t8mI z^PSmPp>toZ`sJnipSx~TlEkpe1$_yYR|xhBWXqq+t5Iu;#EIO}tnJbS70st0x$io@ zoT5^1H1qv8fdzsp8DR1kc5X?-rg2nMAs)Je@E_49H-E?qECv4*CDtnr78re1&VZ_|h*D#J zivrtZ?nFyuH^mJm6+LU+QWE3S=IQv!zdp<%QAh&rBLyGkGhu1LIXS>2_Se7C9vVhQ zs0UVpk&QVq%i^cx1?-`}m?Z5l3a93;mPX?h$y1xy>^>Vb|6@uiM8hrE`%|A}2e)!W zWp*?xRS<0-qinXhZHqRq9wP)QXvv`Qrnr|`4S();=;12w{wd2KuC#A}5-H0|RW2%? z1NJ^?Aj$B?CqZbTqU>sd%^YWFL+(}k9(00kKj3ame~Uf;5c1`in)dwa!;NgsT`I_) zKl;0s#OZ2EEm{gX;%fd(FJlj#$4w{lV^|OmLzuT;iEC9Tcg0(wA`mH;ZEZ$PJApbtgf_)eK^0em1E8vdzoNChCWCRMB?*A}PTPNw5*_O({mgIt%j*!-hJpXQ?=PSn4L&=gc`v15?K z_&Zu)J@6dJ1B3>w1*&l}0vMq(azMU?A?fJ15L5&f^^&Yjz0G-4JwngXV*Hz!S1+$w zvae!oah)(O2e0Fz7OK!JF!uAiu)?^7hnl`7R41M<((oVDTYW+eR!x!G1mDUGdvJtv zMlQ3}cc_Poo`O1H@O^Vd!fa-(*RGA1u9^z5;Az*~0Yab(s9uL&BAPq}sdl;B2aKdt z3x^6T>dhDuB&iBg$Zk9t^&lKU$7qle`X88kPZBTj?sQHJTVB^pPH9X~4HbJVbo>*s zIF`-=0Be8qj#yr%H#)`022c%^4|9ME6msT`=tMigER`G5e`~Dfl%VC5gkeBhlk>h( zhH<|5;rEAe8Tqk=3pF0JV5h(DX**-M9bqV`q;b(Gqb$D>y}S~%*yYBuaeSzA51aOP zpU9)~=e`$VqL9TiR;NnOV|Y_a=8{sIoiC%fcVv)haTYxIEFQY0sV{rIz7|$5XR>N3 zne%dq_h66bj(_u{o0jWNFtae+lholz3AiemB9&^G-b8q%(L82LoIb!^1F+bIC&{6MSZ`wh@!pIO;Cjd0z)m zj+5;bgzSqQHO0UH`H0Z#RejiU4}qNVi?#@tARi2|C;tM)N?an|fFu4Aljy#qAbDd0*)W< zgVS{%KaicXDDLO29n(n7etCa$-ov)2Ye{*=P&2RGjo*%1UWUyrn!Jz+2EjC58Dz_| z4`7@8X)_7dtEXNjDY`t;aj7DHO2_nF>bKtf%`FkY!&v$IIbJCE+LvL~FYLE&79ME! zSPe~y()r<@GBEL(dMoju*yrpaGa1kL<{@@+Kg*!xZ*A^h^|83vy~&Sc3pA#5*maqT z-22@2$6{ExD`b!A21!xIT%EW4p^Uj9G?lMQrS{+3M2lV_$A1m@>y3%X>7q&<3-B5K zBpVyJdlkcuh>7hyB-bZ>SZ)2;+iCM|bHCuDfw;;u* zIVSr#;e$LI6$IQ3U#FWe!WCB|;?LGt(%&i_;O+kEPL7Lwj>bdTbgIc#DyVYDw*zNb zezdm#Dt9|n`WI8j>fyB5J$sYEr6}K++|PoqBQDj8dE;YLw2Ys8z=R|i*-9u!{#a^A zW66eV-wo=6*XxM-v(aTF8Mg6{u6i9C%OWZHQ{T`!Ilg-dGZ|s}S*y9M$HE?1&3~Mb zUN;`%R*rHS#do7~W`+r8#1qBWd@%Imo5}d7(Z>gxCiI@f!Ejtqut4vGTab?2p!QnM z!ez4AIIW^t4$DfyF?G?-M|DY<(a*#J6qdO)1(wAzY=_m^ClojoW3SPsQJYe6&dB_K zZku#MuJUiM947$rLeK0^2o522WxndZDk+f7!Jwj=h%OYo%M+;$G7%Xz;3IV#@ZypM z*z(56c~y2BQ8C;kGN99t)=E{{AWx!=LZm~I2Tt`pD>E8VRW zU!=!-t|4qqih@@2jG2EfLV{qYwy&8oVcRp(8CXoqZxXgSWnBFv#}}7HIAu-WH5Qp8 zc8nGp_Y52aN8I#3tGrgJj31aFt=IZ{nL0 z)(Os$BXG6M7dhaX0H-P;1;Me;K8d{T(Y9W}=s&O@o9i^qNXI1JuC?|(n=B$UwM)V1 z`@h||O30P%Ny;JQq$@3B9>m4F-I~UT@aM-@!W0w6{4AF@xKr?#*owS!^{Ob2R}%9t zhH-}x)J~F-El5qG-Z_DEDbztEOWSZ&annlRhk3HdN^4%YZZY!xMA$!#tsvLzf0aj3 zsCIc7X@Xv%?{_8&H+>F7eF~p5WqC}KxrJ9dsf`Y2y~VHfvt)^K=Z6CPKMB5@doMPj zdrZG8y2K-g<%680-D+;mR>KfWLH$%AWb2{;pD{YmM40}N2yWHy=Rd!wt9^2@Dx7b4vOrp!}03#!{lqdwk{CF0Ks6 z+3i44XJmEAUdORE(=G>_rNxZhf*-=j-Tkl|=zaQwnnZZ8>J78bwMMbKM%7A_$rq}6 z^;rAVFSi4?@PX^n#@9Z8ImP}*p=}ba4=a?Xy*0c@BJ~`pn_=+N>wZB|HF7hj^o-w0exd=8GuIs+Z1!q0wP8ytI zmezY}Go~HqO7YePnITk|;{!+&H_$a2H@QZR95lCNmXdnwgp~(+3gtfQ9Lz+XM8Np! zp^K%_C6XEPAuWi6LCck%7l$OkvjhwCU5PH8Xb2K;sSXdA6Pxt4311;vqP%KQx*L(A zEmu!_qW8z5)7OJHzbpRR##xMgi=^?Qq-C}(;{84z%Z3KnDN=;1C5+febZnxe!0rdKEdTwC`4r)}4=ERdulEsohvAjTVqdsFwUW&O&6*epH`fAZ}#_km8qb zVP9tZ8k-yC(;peJ#{`milB)INc;6@oF!@WAS<|Eovs5Qlu*u0H595xzqJER?H079F zJBHnQ3cp_lN2u11pcjXK6@owil(LL8Q*;plpm~#RHIh@Xrs08u}6N zxh0D?UFsuha*(wXZLBdw?BMypIqN3y4J9vE66vRu;i-cb2scKVPr63#jExshL>l2W zUoYR;UmKWYyES_5t%O))LTyEy?aQA$jQjXS{3|*7u$Hi_D^hGi@R*x|ol)|SNUmME zWBXkfOPuCwNQ;j)WWlZ{g8U~o!QCE%t&C4q3Mcn~W2ybFGuL~JMm7s!AUci@m02qJ zT<%<|?6*fEn7Hq0(QdBs6JwL`6_K)>50&1!X(&^9w0hbb*{K;iH6wY!t(;NnL>v7( zINuWe`DEu`$RMS1RHNj5ZRJ###;Mw)2QnC79^KxgM5@HyI&9%DP?iA6_RLCS6w((u zzNsv9K1?2OSyN41!?ZnaCRs2s%%(|_1f=Pqj}f1gOru$eXltSelRjb)w^fx- zQ^f)Md-3pT$2kgf!~YmUakdly;;sF%T0ma+yZ#VI_Q+tj|3YI?=TDia$NW0Y4${foV}wJV_i zN*^bpT}HeRs?_oJe5ou(rcLWM61yI3VuxXXQrOsKlgW`D94U=H$|Me~=YNx3bQU|3br=uK-p;8e9rU5B zCf3I28Mrfgk33V1d^a&Af2GDXioPnThh=5Z)Xu$F=6L$sQc#mYJUUB11%+*(QN)Y2AdGIJO@FTuF`DSYNM*Ep!IT4PcZoNo`QqMzxnHIYm>*y@iH9k z3QapFb)O0WzqOBJcFnIfrfBJLGYymZn1(e0Y1Y!_ms&pJb9cRWy}^ib?hLu0WXfYGV-F zjQxmiH!~NfuVFgBH|D7+@PgkxePYp0nAzq$Ta`jK=ApuZHF+M%esRGy{u2P4>06=G zREAPwSnE2U6m?>@C~+y}S4%E)yoOIqGwqAfq%S9aKQHDBzCJr9cbL~I%wxxeO5@>O z*qHV{gnx1`FjXv}Ij0e~Zec#}BE{RRRt@wu*%d%~N9^l^v*=2Pmp-zBgkQ@Oq@2r- z7|%w^t&d$!ntZgL=ya;qO6=y}bDip%HslL5aNDo`m8%>#&FCdFG0oF|S=N*K-PIQS z)kRsUwSwi?_}%S!PW~|)H5y*i=Gc(suhwhoTW)7JO!n2iA|{VkIfv^PVG}d7QgAZp z`N-WPE~FW;ytiwxE{>gaF{P4Pnm z`pT`c=Y{IGW4Vk_d121&T%IBeJyOv15 zqUwU`tzaN{*7_)6_PF5)le)_6)hB^f8mbLkKk!EwLm~fjb7WN;g$*8?amuj7k$)ozB|53|r`Huly`dH(zTCi~@X_uw%sKpb9!; zZ{BQ^cr`FGIw;gld8u(gZ-k{yZa-7Uplf!gw)0&lC*MJnUqB;@;l|$Iv|P_n(S+`? z>P$@OB1W`Z=3Dxr?~sdAt>t~uZ2x{Tz1Q)=BkrT=Lx^vd6C<_IHF=M#)%}<<^Rxu_ zKe}1IOok-RybdkIa>fzGTdgbo`+dNkcm~`I%cNdq?;D3q8kD+!G(fe-M2q^ROo2 z7t|#5l;f-^dTn6YrX)oA4(gewI%n>fAYJ0~0r8mWI8*lCs9@My`g}I=R$RH>+K%r# zOPpGECLln!jH zU!a;{_ZOE%UwWq!5V4@Mb*!Uq)*4tmvc7fK&sf?2u+6mZMdpKJ^fpH|pe5FM7W=7S zgyw2Iv9EwHG)p~2#Om!~)nN4Rt=0^VL<6E5GO@|Y0eR-!GfH7y3secX09=;JEwMl1 z{!pl4P)1Va6DNp~dYkByZ-Xz5El(7@X)RvU&EJ_%Yo4P7=jpfKa#TYIQ*UCSB@E|D zxZ58`F-Rvaj%7cL*D{CvqH%)edDkDd<(dOb>~y?I^%Vf6nzSO+p9&?GsU)j-7E4d!f*)p)U%}o>hfTqen)+scbIW_&q9%bZ46(ZkAquPdmof2h)-ZTGaZ$ z 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 N69Ue10BL+3|3BR=Qi%Wn literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-700.svg b/apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-700.svg new file mode 100644 index 0000000..fc8d42f --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-700.svg @@ -0,0 +1,310 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-700.ttf b/apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-700.ttf new file mode 100644 index 0000000000000000000000000000000000000000..19090afb10e101b0524a4dbe1f5af074dcd2a1d3 GIT binary patch literal 32500 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%0D$XrKy88VgC}G`wV# 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�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 a0Ynt=GnQ`R7YB;vi!+u207`fxkN^PiJMWMH literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-700.woff2 b/apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..11cde5d04c470947b1c88e42a684fcf0d5b396b0 GIT binary patch literal 14552 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 C(C%db literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-regular.eot b/apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..d26bc8f519b5b90a0639f82a18bfef133599196a GIT binary patch literal 16227 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 v#g4%>=-%`rNTT$Q3+IGsv=@uepU+g& + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-regular.ttf b/apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7b25f3ce940cbba3001420d38b7d0f12fb7f2142 GIT binary patch literal 32652 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 N6K0jQ!xePm{|7p>-q!#C literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-regular.woff b/apc-web/src/main/webapp/resources/serenity-layout/fonts/roboto-v15-latin-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..941dfa4bae83483cf1784641063ce1deceda1406 GIT binary patch literal 18520 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 literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/apc_card.png b/apc-web/src/main/webapp/resources/serenity-layout/images/apc_card.png new file mode 100644 index 0000000000000000000000000000000000000000..729020aedb6f16e6b93ecddfae54c62ea541145d GIT binary patch literal 264302 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 z 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

    ji@iH4Ei{V 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ͧ|cBB;Lauc>^?g2HO9it(X)EV2hmsf|35>0U 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

    x9Yg6pqJd8%8t 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 literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/arrebol.png b/apc-web/src/main/webapp/resources/serenity-layout/images/arrebol.png new file mode 100644 index 0000000000000000000000000000000000000000..51417c2e20f022535c9cc1d355ce9207b2aa546e GIT binary patch literal 125802 zcmeEuWmr^O`!|e(lu`l)3P>xhbPh^OH_}K-cgKhdDk0r4iipzP1EV5{q#&K5bV&;c zylV!_O+R#FWM>jXX))-eve zn@!X>ZA@DPm!HGhtx`-o?V&0Y3%KU}3p&VPVY~ zV_^v;U}2qhOsQ5C!NP(NT5IUI>L@A*-Ey$wFfns5HRtfOa|BOdVTpJOflE7cR})%K zJ6n4fAx}{{%pF4D8vQdT9WCY-R~u0}9Yqz|>kiK5w7eWV99(o_1hllYBF<(OLTZxI zKOP7F5~Z_pb#)Zt|K741qkFs|AmvAgNyU% z-QZCX^sho{<}MDlZs^x*+FQGdT@k_D{MVm;P3DF@h%ZgG`s%5zC+ny zeg(o2BM{*{60{frvDD>gEG!t7oTP+?C-%aKvNM&;puh}UwaluLe%I!;gi|47_;<(f z8wLh!W$^qUYr^mk%vL+l`}D)b9*U``PJD$_#H)LDOZP|1c--`1w-eACkylBnN zqBDd;v#*T#lEE&$QqYj+gFx{}Xkmd^*#Eou9~1tk3IDT#|5?HRtl)oE@c)q&&{DxK zCo3>q`{ylJ>Kc2lakwmVhlnN@ju;vXOkZ4E;Fl*V>Zw`V9m_D2j6$NDvXk}`|u|Ex-tnW(REyPUVS7Fo<(&f;tohB~#|mERPe z9*v~>;{tyRTfUYDvf|gWM{O-nJ^wNyUVKE@I~kM?b9!9@b98Q#5Y<{KO6(u0`%g#& z+lNr%e;Jdx!th6a{o|%EH@o2LFmRoYPW{_$|JT?3Z`J>C_^%=9|3hsGXcm_`O9oO6 zSUY4ROD||Wp68o-cvhPqRY2W=vM`^=$Dx&uDPfxG+LC;Wm+~boMg_N0*G{>@aA$eWxCp#bxd(NpBAjt9c{-Upxdm!AJJqytyI5gk)!*t1?I8SyxBt zWaavIc;`mDIh${k*y5AWK2C>;p0j;^uy47`R?_m|!0lYam#tS)+^{O9zL`< z9sBk*Tt~yvTmqg$k()#H@%rxwUDrW1Bo+&e4aXGk+$cZV;3EE+`BKYz**4t>w_+uG zQoAOwBZTr#KFem2THkuSuY*NWpB3y^{4PJw%{wvMmCP%ZlR-ACq?Gg#;r{9;6W&DL zt)c(opD0gpIazR5l!ss8&t&)7K+6*2BV(A1bJevX%td>fg{q2obkY0L34bXnRZc z+u;~t&AZ&oBn( z0IZJbNyacbKi5Bw9XO|{Qvx+tU_0#j#|yb-+f1>vaT18z4Z~2X4Q!Oe3LTWh8a=t* zo82aBfnh(l{~rSGq{lvG`F_sUMg9F8=fDwfOPP&xyVLgQcr7v9l`6debOWvro%>*X zb#F_2Xx25O>N1L!5^4)}z=7tY~XepcV zghI;&$CkM^#VW>xk)thnv!Zpi?~t2^y6UQl*mt#goE_Hk7ORZ{LhVtOH`sFne)_}Q z8=dtlid)Ny26l+}4(zbsX-g(PnyiS#e?!)=CSr7tffDk)JasPYNe*;avwH=H;Cw3k znHNe~m;4-cM0aNkQGBwAKe_W)3TMg#A6zxxD5$z*z7dahFNYKlp5p4Y?(mOHDxsb? zOC6>g48I5*pB+v+C5}ec8;vXzc}>Z^@pAM2beIQDw$W!^Zbi+c#@C52rH+j(TC*SF zq`#OU4w^I-OR4Os=P^A-#f(4g#Y!3YIniCI+wB-n_sB~4KG-lnFhBc~UAR5rQrP@* zUMZ*=DBC&D_=mf{b1LvMf&_sQttDY?3;Xw}_!K{1PuqD4=tQxQ5Jn?ndpf|%wA%0z zDQqgI*g)@F2|yvd#9Dc^y+~P9##wqa^{vNUla#tkclJHCjH#X}{FQ4z$%M~b^l-~k7?!-eolkVBKJ&^465CUw74cUwCmP+G= zQe6QRzpb@bNw+mm{tlXSa$?Nc;a`|DOdO{@pYrRgw@(9O($>`_a`4SAef@6x0p+j( z&pBZ>ARa|`#Fsx`FaqwWYZd$(#oM9(y4wR$8+@Q8zM$Mv76U7S$V6^~_md9=kTL)H zwSVvf2?EhKlw0G2t1hhx4m>*2$-p8d-3~a0S=w6SEpb?IO~Q{EuPnUx(o;1YPJB*o zzGVX2GwyM_oDTkkuTlS8i1LI+R=4Z&o1oiQgmpC)-yf;cPtp9;WFcm>hzxH33lYu4 z!S-f*Y5i2*z7FIGjT4>KnlHVN1!skDnyz$6?Bt2Ps1r{!s2YnnqUf&|@CqD-6fZr7 z<*_!!=9&PrBZTod0?;Vt$F0nC7*eSXc7aBS!pBY@PkFAYaL)fDlJYhwHl&Z>?y+I`I@V=ztM)75{%8({R^8#C}0yFd%wW1drBt=rTWq7aaZFr5IR1cn^VX6&D&`o z*Mrw@Z++-F0i0d-C(EB|jSX2o&DHBwuNWR-hKU~MebkjeXj4YL4xH4z`~ap5Wjiw? zCu76(n>SZVfB-=ic*UoGIHpxdQs{_#0|aO0&4zfF71%Haij3|~h2oL38=JsBj4*pa zw(&4biC)+9Q}GKBX<_D0{3+f4@B}s_Aike`cO&=pa15jA<%d6Y4AG5_?`{r%i0`Of zOxQ#2cPM4&AT=^&mWMj_z@BtuQFq|?`p--L#_9IN3z^>(2X53!2`5dNL^e7Bilh*1sWUr_)h|G!=8+m_%Mu)#pt-CVu5#so( zq!`gb`x@t7WJcAc0G)3SehMfM9C z_Ezh1i!lLiS8_x-5QuPE`{avFQzsNl{`s#6q{2tw`QgF@AA9&!UrTI^bl`fhHGlf? z?w^AHMSwRje%*pC1DmV-llgbTkKEwQBea7PO~s&}_j8s5WHaTcx0=VKKfG@mv47c1 zO51rIo}u%NM=mQXdT#f#F7Z%7^KVu`@L)v6{cl9I3T-bqSIGU4^|<7-;1*V0Iq=SR zTH{{XIS+CO&4$Fuey4h2X#XNg+^Tpfr``+z;X_h8(*PMhn~y%GU|B1tE!H7w^Ae*CG_7*%?*0VZ0A> zoW&|fK5PPv1}lJuPxv{fEctn=C|WQhZ&x+`M!Dg&K--#g#O>cV4#yt)taTGX(8Gq<5o**on!@FT^0so8BP{JKGyH!!-#<~< zc^yNS>%XCE1G2HyJM%podv;~R$2$fs0{cI(Z#Haq5RQ?{-*8YT4yZy)l)kdy)brdX zUG}3*OcJ8=mf&A`3)~k6okXC$DI3ulnK$95@n22O#0{_XCfzz@f&r4ej;1ZMxN8n7{7 zrkCc=8vhGK5HkA`jX1q4}LN9^$49#P&}TGV6fyk9T$_v;`&LzvoQ zdS3lA(uJi1SdFVe^;x4wd3OP^2-bKfLrY2cahA3x>oeLPh

    N{SD(llmzf*#PXks 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 T-$lfj00000NkvXXu0mjfEg3(p literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/avatar1.png b/apc-web/src/main/webapp/resources/serenity-layout/images/avatar1.png new file mode 100644 index 0000000000000000000000000000000000000000..c8588229500cfc16a6f5455c96f6506bc356f1f8 GIT binary patch literal 10633 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 literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/avatar2.png b/apc-web/src/main/webapp/resources/serenity-layout/images/avatar2.png new file mode 100644 index 0000000000000000000000000000000000000000..9feab7d3016eee9d9053b0df7c92cb0028b3e520 GIT binary patch literal 11191 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 VE)HdNcNPEu002ovPDHLkV1fwJav1;s literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/avatar3.png b/apc-web/src/main/webapp/resources/serenity-layout/images/avatar3.png new file mode 100644 index 0000000000000000000000000000000000000000..4b3f8e27bc4c63ad44fa72c4ee8b7b81d9621c5d GIT binary patch literal 12403 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 z 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

    Cs;&r26szCa^ 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

    dRVVTq#UYAi2dpD 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 literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/flag-belgium.png b/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/flag-belgium.png new file mode 100644 index 0000000000000000000000000000000000000000..f03e432c36dd2f9079be74e74c6dcf8463b93241 GIT binary patch literal 2141 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 R5NA{2X{zcyDps)w{ttMKRKfrN literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/flag-china.png b/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/flag-china.png new file mode 100644 index 0000000000000000000000000000000000000000..1513e31112813d07f2114ab69bc01fb2dac18235 GIT binary patch literal 4043 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 literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/flag-france.png b/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/flag-france.png new file mode 100644 index 0000000000000000000000000000000000000000..17878d8f1f498e9ef1848ea7d609358cf2aa6c4a GIT binary patch literal 2153 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

    fR)cL&voH5mSjJR5c`qPbM!p7d}!1qN9cy< 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

    |nCI4uYfHFtpiVZXREHjZ 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 literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/map.jpg b/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/map.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38b4b8ac18b718ee59b11c5fe977812b7847f04f GIT binary patch literal 60875 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 literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/sidebar-image.jpg b/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/sidebar-image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5cc3855b6695f6d3fff8e7b1db3bb6397f098d47 GIT binary patch literal 39355 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 literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/weather-icon-1.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/weather-icon-1.svg new file mode 100644 index 0000000..25bc665 --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/weather-icon-1.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/weather-icon-2.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/weather-icon-2.svg new file mode 100644 index 0000000..63792cb --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/weather-icon-2.svg @@ -0,0 +1,3 @@ + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/weather-icon-3.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/weather-icon-3.svg new file mode 100644 index 0000000..625278d --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/weather-icon-3.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/weather-icon-4.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/weather-icon-4.svg new file mode 100644 index 0000000..711ee31 --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/dashboard/weather-icon-4.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/excel-xls-icon.png b/apc-web/src/main/webapp/resources/serenity-layout/images/excel-xls-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..149024e4459e4efda83f95856994f06d0ec3097f GIT binary patch literal 5203 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 + + + 401 + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/exception/404.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/exception/404.svg new file mode 100644 index 0000000..402c9d9 --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/exception/404.svg @@ -0,0 +1,3 @@ + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/exception/500(1).svg b/apc-web/src/main/webapp/resources/serenity-layout/images/exception/500(1).svg new file mode 100644 index 0000000..500e478 --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/exception/500(1).svg @@ -0,0 +1,3 @@ + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/exception/500.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/exception/500.svg new file mode 100644 index 0000000..500e478 --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/exception/500.svg @@ -0,0 +1,3 @@ + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/exception/access-bg.jpg b/apc-web/src/main/webapp/resources/serenity-layout/images/exception/access-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c222a4e13d025c890dd7140a78975d9db65f91f GIT binary patch literal 81183 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 eU@e{M40PXH0CQ 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 WKX|!39u;%_=^H+5F!}nwiT?w>MttG` literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/exception/error-bg(1).jpg b/apc-web/src/main/webapp/resources/serenity-layout/images/exception/error-bg(1).jpg new file mode 100644 index 0000000000000000000000000000000000000000..4317a03504cfe3d53f4893b8f8afd37ba179b308 GIT binary patch literal 67960 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 xTH?5MoxEq`#GeK2h%b!@c>Q5~@81_)D + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-apple-purple.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-apple-purple.svg new file mode 100644 index 0000000..8e0f544 --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-apple-purple.svg @@ -0,0 +1,3 @@ + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-donut-red.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-donut-red.svg new file mode 100644 index 0000000..2f5bc44 --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-donut-red.svg @@ -0,0 +1,3 @@ + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-donut-yellow.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-donut-yellow.svg new file mode 100644 index 0000000..f6d93b5 --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-donut-yellow.svg @@ -0,0 +1,3 @@ + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-shop-purple.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-shop-purple.svg new file mode 100644 index 0000000..fe5275c --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-shop-purple.svg @@ -0,0 +1,3 @@ + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-shop-yellow.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-shop-yellow.svg new file mode 100644 index 0000000..0a86338 --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-shop-yellow.svg @@ -0,0 +1,3 @@ + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-taxi-yellow.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-taxi-yellow.svg new file mode 100644 index 0000000..962157a --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/exception/icon-taxi-yellow.svg @@ -0,0 +1,3 @@ + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/exception/notfound-bg.jpg b/apc-web/src/main/webapp/resources/serenity-layout/images/exception/notfound-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ecf3d7fe9a04689ff32227a71ded670689e73000 GIT binary patch literal 84627 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 PD#EWTPn$yd@9h5r0j)Yg literal 0 HcmV?d00001 diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-cleancode.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-cleancode.svg new file mode 100644 index 0000000..b9da184 --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-cleancode.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-coffee.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-coffee.svg new file mode 100644 index 0000000..64b012a --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-coffee.svg @@ -0,0 +1,3 @@ + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-facebook.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-facebook.svg new file mode 100644 index 0000000..c6421fb --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-facebook.svg @@ -0,0 +1,16 @@ + + + + icon-facebook + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-hours.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-hours.svg new file mode 100644 index 0000000..d13c031 --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-hours.svg @@ -0,0 +1,3 @@ + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-linkedin.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-linkedin.svg new file mode 100644 index 0000000..561d394 --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-linkedin.svg @@ -0,0 +1,16 @@ + + + + icon-linkedin + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-moderndesign.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-moderndesign.svg new file mode 100644 index 0000000..5fe4ba9 --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-moderndesign.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-responsive.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-responsive.svg new file mode 100644 index 0000000..5a867c7 --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-responsive.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-twitter.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-twitter.svg new file mode 100644 index 0000000..18cde8c --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-twitter.svg @@ -0,0 +1,16 @@ + + + + icon-twitter + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-ui.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-ui.svg new file mode 100644 index 0000000..766985a --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-ui.svg @@ -0,0 +1,3 @@ + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-welldocumented.svg b/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-welldocumented.svg new file mode 100644 index 0000000..ee83d9f --- /dev/null +++ b/apc-web/src/main/webapp/resources/serenity-layout/images/landing/icon-welldocumented.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apc-web/src/main/webapp/resources/serenity-layout/images/landing/landing-header.png b/apc-web/src/main/webapp/resources/serenity-layout/images/landing/landing-header.png new file mode 100644 index 0000000000000000000000000000000000000000..b6c2c0affb13d61632b27b49e121b04c1d20f4d7 GIT binary patch literal 945443 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

    aYQ`$JHvqq+U3Tk! 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μ zsq(hgKGzi3Hr^f7pc0FebusUqNXM(Fi$4y|Hu!OUnB|q-t7d!e3x?-!md|rmW6aP- z;<|!=h)~ElN+Q!(Os@1%($rFt{vZ~ zfP72e2!$n^;q*y*6rR|?g?~vU$FNr338NGYbalLn1xF#O1=GAOwE3wKsXN}PlLDyC zVMX_}WbjPeYP;;f4N7ea`uf_k;!GIOUt|6X^=wOImT5V1g#@s3Va@a;)QvK%b;;)F zLU^U|+m00GkH9}hG6OPkVbBWr_l}~AfG8{VS#N=4tl7x$GFPZOe!}|*J_KWF9VIOG;$T^PN`O0B0Sl$SPj__mi+mvQIt#A1rQQ>3W%CJ=dy-4@zJ zT0E+Wu(MUaX1Mv!;y+$^259$Xe-HV$&{X`tkkudK|K3!6#BB@`Z(CjbBda0%Q{5hm zpTK!Z9e!X1z@{w6qb;w?9+ARRsfLyP|iBqq> zucgLn=6ev1>f!^yKJln-TCSv7zu?KTZ8&9qjz5Lj>-d@BHg}O_$&)9g(>A=1O9O3M z+enR}m(L#$eHHcT8Z1HJ#rF~@BKbC_CH~fA{beSm^E3RZ<}z52oEz7#KK`8_@mlMXM)94A=GZ+r>SdQ z?m+BR^z?vZ&gJ;p!a>k>y_S~TGq1+I^lglYN9wPFzC}uBNM=7G zsSNEJxPTeH-krl-s);kJ4ZLBCprbq1O_2EW0c9EigC9??nyfi$OBwUSlHwW#QFoZxqe760lcUhQ`RFvPiZjv{x@0Z##ef zSaBYOqD5zVmgnbU-I+@^kE5IFJ*w~I0aQia3}GmTH>}(U-_H*3g+4JK{PA}_StHI&9}b!ejNyV3az$^v37jfa|?*_`w8aop3> zah3~#Q<)avM+HoEw0#Eg;#?{vA#YMDNSOb$o1U&+Q{i8@L8hbe>I#)I+W)M}H>pg9 zPwU`mpk2^c^u)x=G8*cdIWwjBG50~z3Q`Gua5IGt`>Nd4OD8)$ZJazE>36BzhgZ}b z)6x)s!t!auMZ&P_pP_k$6&b8k!n-mK1+TiE(_emDD?|R;Qt{>zi-IWcJLa6dEt$#R zY;t;m$HY_mv_ltg@&Hd*@z0mL6yVeCfV4}2zOG{%!W+_6Or~DybWS8?J>9!KAS@(6 z#Ed3F>VmfqueOEABbI-Q*2OJFEl9=#<2wG~Sl7nq4xp`>Xo`R9So(saI*$E1|8pu_ z5Bg*K`j;10^vjxQ@5`f4ey?s_zK=uF>dc}KsFG+7C36ndlRx>qhb)7EtmVJ}F4(4; zP9D-aJzK4-lep;O+0#?97aUxf@vT_VTBcNq9FEFsci? z#&zyzz>6`;yI{~#5=0EP8gP3S^OL-Og2$?-R?ta91>8;d8doz9^+I2BU4P^>-S#yt z6yLiTZhCeRZ}pYa?wITT{bF6JB&fJ(N+x=A`eCr1Dw7p11x%31^#+dqpg65$01k0P_+V((*&2mO9kiiV%3w5(A|gFY$1eZ|Ey@$Vw}Ql z??bNRLM~6Kf!K*sO6b_PeIM5pW--Qarr!y5jSS-SMp^LFQjC0P+rqL))bM;ZXl!KL zm3U9(cGlls$i=7*=7IV3w_HL%34Y@w;#;?Chzt&S$23QkrviQVmlollpnrEXII!uEWM$&!g!CAF{VDoQn=} zRF-sXLvlh{!;uwZ0O5>e=ax20x3{3I~+&%m4T@^?#4vw%tX!iLkz zdO)2NYvh*giKaBGwD~nG9A}SpViPH8IkS!h4x=roRbj6mPAK;N@TPh>phIOrZ}3r; z$|)r(QE(|be5(R<8Ro|Gw}I-zxIk81#74s>?<;g%e|05Hu(aGmkFq$9;T2WY;SjFH z4v!MHJcw1xX-gB2_D3Z^+p}M0lgHZ$u>#FuFhR!KjZ0F!hP}i0)TGFgD$08n4(T!e zgGa%N@DM(@W20W6%;Xup(2cCBbAm8L2A?_1VLaD z(jknFp@71a9Np3&G3f>sB&2h|2xT;k&W*vJ$8~)^-`|bj^?m%Wd)(WD-8g%nbDrn< zddxK#w)2YHtjct|sj0jR8xW`xSa`mHp03c2;=~DXXUojX9GaS7fIX4I=0*wz<gfVvey87jVm?azs<2Hj#Lm40`YM}g)4_gAPcNm3dNHHv zq@pe>GOXcvyEru7pgA)%BUB5#yX-5Q949_RH)L06CZ*HTl>N2sGK`mQ*@33yp$v%L zcZk29=i6C)_x1V&cTtNVGF=0`?Rx5w81+MuRAoU=D?R4~+0CZacfCtKRwqtA$Tp&(5l)z&Z4 zlZ!UoY3Mn9W8GeS{TLaa6Kc959^2sxS7OD7*L%x2U(9Jy&V2VOqd zsEfQrf0SSCl8esIYFz@C6;l&wf%^hRoS?oKG<0-Y&HiG#B=lT!O5x+tFZ$tdELNXp zJ(otpgd)4{L5X20dH(L0O3SaA#-Orz`DlkH*jmFI?Mcp5+@upGL5a!06Zbojq5H!` zg$lvIL#$~Q#FVQ+3M^Z~vzxNizy8g|X=&!!QCP zPyJ?!o~ZL1QIBM@Cavz5tw}{ql9zjpPfHXuQe4O0b+)Qb;WbXq`}01)sXf`b;M(W@ ziHg(umu3F`+9DMiycG;>wLQf7YmGQRzbFoNH`0gA`uP8{{BT;~HuL(dbR9=85%7 zdi(s)*SjtRZnVI76Cl={44+GSxu49LwBQ!lt@}Nab)bEhySRyE*j64$t85Qg_-yRo zuRT;lyR^Vc6J)$Knq(QYKkCXSyqmh36tihV4r$3mQ75Dyvl&0(T&!dU3xA!}@bK*D zyyzZZ2_4&PZDm0g{Ti&0ii%+K)s9MU6aSq{n(*=rm?8Boef}}S#ewf&t*f2;5Y%DL z46D&3NpoBO96EFFggqgFLr?3MF@-s9$&)h7=;B4|VPDw+NWc9>f*r$QRvv=BlNwo( z;8k~+xSi!f@}pyUIJ1@%Mk?7znn(kvChQn<3bG={r^|uG7lM8E1_isB@o`MYr%Ykq zrZ9NWumW{gO)Xv8+pykcuQAJafF|1x?C?M#ul0M-o@Dbw1k(197E^esS<}&z?s^<4 zv%C~B=!7Vq)%XOqsPl1N+;qykAAe-(Fc>NILn>kORQ(^edS@_;dZrwrPj^*sgfidT zuRJ#>_$#Js^qOA=+1Pxko?vxp%u_%A=Vo#G8b}^qJJ7u%mpLdzv_((|mF&J?sQPrh zgU;RvZ+Ovr0+K9CS2z4Lxy(DOxS&cYOpWS_KOm!nbaHkUw}+cfcOz9f%>=lq7`kH6 ztTe+CwRi0lk5mGa08z;=MV8+x?hF@qRTcmZ^tmX(T{VJ!58Eh&)7{{G&nrr{DXZ zSJQv`zCW~A*Dr_XLjIDhf38zV|9CP;LExVq$|9)a8r09f$O~HB?s_gB(iH9XysI%o zJu3<(e9W_ZgbVrxRUiPHT27?{V^{#6kEmSusOQB1`?KOf;xn(G6m=m5eR%##N+6pU z#7kOJ*q7y_il{?MZ4Tv|CEx z^AUFrjezC0O!&Qh_s>3!Af8u!{`|GGwY5_v6RlVMK+mH)mJE~?dWMSBMtdh48@jBWZRoQfk())jTWUeOaxTv! zJ*h9LB=!XXWKGdw70S2as>#Z$cy_gJ(mZyMl<(!>+o^!DI2=vylLItn%~jh{<5`H*?{-I)nQu`Cjn~GeP)HR~-0&xg zFU02AF5jKWBY9Dy4n{|T1l)|)-k@aNX5F+sXDY;YAY-x)aP(m&X zm~C+rh#NYroq}B~Uaq)own(Dk(^-n`%K{Pnmy=wBoMQWw?DRt>yl3K1{wM(H8N4AuAv8p z+j{(8@UVM`4Y>qY^G}a;f%@1d7nuq_$ z4c&4J43~|#_x6zftxEV-s0rrq*{itob!pUU+XI2%TYg`<_n%?5{%97-s$tWozW zzTHHr<^z7Zq?L#m%V!De!-IVyJnBks5$bkbu2276zyC>$D*#m9&By4wYl_ieJ}Bob z0!-r^L@EbEg*ph&0Xpy15{N^NgAeZeofVq7P^!miMP>Us>+++ zegJjRDAHRiJdS>L(|APi5Xvh_LN*7Y>}9J$5dACT5#Mi^65pt5=@-|0Wr3K)#PuEc zi9}J=VMpT_ps~=K4qKm2bIZ7*3o~{A9;t-k*u%Lgx zp8t=c^e>$tmrlJ(&&X0*1Y-TJLjM+^2E8zPDaZShJtJVt=9xUr;bg0^Z;Qo{okVBA z(=&kdUq*>Kcrzr2Ybs#nN5l^!HgGBNF8AHxIwR3FQr4O6QU5$q;rehxoxI#bTqKP@ zD%N!nUz0$r@A4i~leUa-F3x*;`#li^S^L{C9HlxXph$f@o64ziz)wYPJQ?b+Gh&5> zMQ`^OvSP7N`HGd}R_mHLR06pir+k;_Qh3FDt(%oFZsVJk5vpnx9|p?{l#as?xzyOD z3%zcv9e%)XI8JlsIZg;JEB>+Gym9}b8b%Oy zfV+-+)FEYkbr(&mZPTis0J5LndNaa9n>aTGW3;t-bG~89XyjL~Ou7?+uzA&fW21HW zbM-z>@*&3bc4HRsFIt&|o6A%bMl3D7CLdrTBBCHqnAA?%ep1a0t~ffjO~D+Uy;@B6 zpBbI37a4{=-7)V<zz}& z9#3q9PNww@_SF0Q`;wEC`{KFT9W zJPQSV#0@`0aCx$k(vXQ{X+uYZK>DDioQx%f8g@<(?SsLakBw*QmxA52ByALVzt`ZK z`CzG_-9(x)0Xx~ECxvCj$t5H{BM<|amY0Diy7#R5%eS6*Lf)Gubk`{qSoFhK4EC2h z`&yc&JbG_8{xmi&6SZ5&He7NnGvyEgeYz3ds@LK-Xid^jdm}gQX^iybq~tlypZpTs zHNpQ{$7a-P|7~M>(&}#Uk??@AY#gtJz&`yKP?rPyF9VO}UxRQ4LLqm{YeFC6Ha}(l zC9>tarmu8j^6v%T|C3(!^nX}{g8xwuSN{=RCMzWkoW3i0vG?~Pck%0&{*k&|l|@Br z>y;3kh3;7XZKh~xLW+lFOEYzt}C6|V`q zfQ!CMYdZz6B*}ZTxFZ|l&ZC>e&k76!{ja6l>W7oXRs09b zV(&T=#G+5-bYLW>h8p z6D^Tyd~*`HWU%iY*y!P$?eCL3>l6$vkC0In|{ekgW=%n>({uJ0sbotM( zKYuLZwiHh6pz}Kc%55KZn53`pzm@Ux;z7u666Z;&ftRUTi=L=B>PxN&;3^STRx8mUP&FJ*#HoJ>-s!SZs?I zL+$01d(QcEn`u+0=G>S>Q%^#;e{Y)lk)73k>UU6LcV5!%am14T3efFHB5U}!7gYMGzrjESn}RZW;c>QC*-#W1 z!op76^UDg;u=%t~FXi_Ig}{UB1pbZsNnY!D`2h<-Y;tVF`_x}#UBcimmyBCX zclu!TS(QFc`uySW3sNpcsWdIUejtFpS-=lvi!He^JbHE;UR`zb+lmy+N{{~XemU_i(y4S~w2K*?;SkMv zumSFf<7E#&vcXrFPiD}4u+}?p>ySYuy5}TE?MqVW5KC)=)bRsdb+@5S`|``XszmjB z9NCafZ3wicYp|j%L+}XxQ(N_&Wy6*P!0LCWpDv(@V-p^WXl#;`n^pfLYMsX^&qgTz zH6idC1pC1JI#?Q2v*4;g@>KkW3o|;JT1f!J6zubG-{(EG|7v7T0m(@}VkUm8$I1-& z6F9ledYW%3rNs(Z31`w>GrG8Dh@5i`d zw^!U0%2{{S#2-fbt=0L|!{wHyBzXyh`!_H08rF5&8Wm!Zu9cG1#|QZeO{4(Z}BQKaS|I)E}kHL z-UK{uYU8kZ@jPpc;!eo6b5n+a1uy{KS}IgUIuz~m_urZR{e`6z>pZzRwz2X)WqQ5k zV!y2h9kfEdsS!_}L6^Y4Hi4tBZ#kp+thkn7`jMa%s?3ar6RTT?%k5hZTItWNPJNu{ zqxQX261ELY1Z{Ynt)|?XA3B^2e%U3T%N>85)Ts+G;X3tZV`$g-%SFvyf%$W!GpM+p z%k$$UWxv^5PdTvUD1sKO%ne$W5|$4C`nSz*Q=izkv6NK(h_%D0)1l9bYy-~RN18(Z zo`#wp(M_IS_Aai=1-ranU5zZKAKn}}gRsXTw2DG2?Q`N-jzR{WHwuK|V?oMRjnIKm zdEm`%Uf<*k=0TRk!Jc8xHKP^S{3hIV`dPMot*A@wI0DH$D+m(1%^p@i}0H ziAq??p+4Bxp`umdzXYs>>86Ki-Kk)yk~^5u*?c3TKXPn0I818y(#sM3khiI8bMA4B z3AL{ft>EWO)l{Hcki4!Kcx;XHj$C? zW;o%5cE#5FjfPB)xkbU{F46`!V;{i=$T*u`EYp<1oYRvz@6}!6Q1f+3q}vq*2374s zfQv=Zq~bnEmIlH}EKuS#=MO<0aJ^dh=P8tsQn|^>fYfcDf9*AQp1kU41 zjBcjOUc9V*wE%1N7NA|hcKY2YSwZ*ZSwrUjh$dicLjO83 zK(M!5%-#tIJRA9UfEFZL)hl5fXshg z2quBd>&%e#DI{Lumsn&-_A47(Mu|TDXBhbminpygow^+%OmhqMjnJNMhYQJz4G+?H z^^ZDd1%ylf^w%r%-5kX8Yd-Sl?xgI~bDa){n73v4L1gVedn-il-upBtlPEXVLkZbC zu*>jt30g39eo-r5iOyI5&(a{cu8k~P%^vbz}E_|o%R`mxL@ zr6kxwd%K}uWjSL7AGN!@siecBMd>-@w;WjXHwpI9(|zh!Adz2mA|D{Q<8*=H3#k;bT?y;jI4hG=kB!?{{;v&TWtKUC)7{&p3r&4c)_T zOq!YzZB$nG-5oLYDPv)7+*f@CK+ooL%iG1<&MnI)=o@R$wE1+|?Q>QgsLB@D<-W7shilCD+lkX3+L)XWvZ#meHCGxUH)C{)HwK z06Csfjkjq{x#bXOHXxzbUq2zF8YswY-d&@!#JHfUy#)m@BfoKS zE&uxy4b|XEK=BhJd>ZHX=H)|4u=N)2n#}gGBny)*GxuSZ#yZrSm2#A}t0AjE8O}Dr z3Ye<$d+mZ-a)0LOwCZ1yw`R9JbA@z-=kBu@JalEayP8 z=Yow(QDY+SY3Rt^tFnf5e2-?Z^#Ex#K+tpZ&8j~TNTA9&|Q32Pd;RDtB4L#A~37h>_yjX{)Ula9)Inu z=$xma-`!Rsv_vTLAMHqEuG50w*yL%h$y`5`T(o*DRb0#6nsgdBpm5YKg`j+IxOvnu zpV=QGOP{IPO2tKpr8D--yqncjznX;DFDD@-0dT9{EmrzGMf6x0J*qRA$lXF$H+dMe9)47?7N?klZxGKzD-Pa@I(n;-H$|yoC3es5CxG$ig+W7=uVxkZUTlPfwQi7?%C2#s-Q3o;+0YqAi$<(_YAOTv_3H8)=Llc|JXOIO`45dDacIA%`U$MizGW2;C-J~5i zdZpu$=7JFW?PZP)ig-H)YuR$q%YEqox;g$|SOT{19f4v0s%#>4@|2V{0dn^I5S5*tIj z{mG7Rmq%Qn@u!+?u62ciDK&TXfks1axl*`~ToKhPJfF=o(_&sy`Mp$niP4>JY%OzZ z@PSb&^$d>GYUT+v$yd9YbIK-BsjvDx>K5-Mo)zyMDdy0(nntwKRYw|(&0|yS zheoiAbclQt$>C?EC>8Jp(og;2vg0X(dl3s*1llvA7lnUvG3&BjgUOXE4rkU#R?ULz z2~>{_cVv#*C9t)7zjaFfoDJ@E^Ej5x7I4yepgdL+rH~U_ zh|XURNL2ta3?Wf@?TcDusE-G$-k|>=^k~*K2+Yl`Sz5`2N!k631;YDwcGa(KS#?Fu z-eZ@8=L#N*4p!d2=B}g1CHxZdgKW(xyi=-zJ_%%hA530SKj~@%O3!dK&_;HenfCm` zWlOO?;pRBEX_`qECcFoFwY;9WIY3-F8GERInClW1d$MrCq85>Vbn&_&aWvkIGchWJ z5D3ybu5};r{t8_XIp~qJRd(vkI!WI}-$6v#vMPLk8hD%mY`}_sT9UmvTk*GH!lyrS z?~khO`p=S!0=O>iE>GBCG$Vd&f9TV=L)TN&C;VPxv*%51q-Su2wIM7JWd?E4?(tcc zM@e&%&Mi#Q!yNh^4;^x^opbyh%QnG{zWsfy$nknt4u?v-d4)g@_K{HH+QfFgx4 zXq8{%xea32Q+acMqF=<~o>v(M!GFxsW~r~LuQvE$5cZ{DhC({Ua-ICe zemw-T=Gz9!N|U9~qiq^zNk|q|b8Kj|b<_0sq+2&&g`xjn6Y)uZFNKRy;q%V0Vm18V z&rhw%)3zS%wBhEJUnUB6FjU?)_5NFEjmCJ;-SKL;O#VXA+MX!7>R9|HmIj8HH&uUL zywq`i;>K&M5SASJJ6b8n*A5@{97cqO%)#!1Wv*(3{4Fs!2w@Io0TXWS-V&kW6WH$> zYdyQoTicHqrJ&21&TkF(ObL^2oxsx0J$EhiTK@^QxOtg96z99@8_~=WK1_|isaySG zf*rK4-4htC`B22HaHQtzv8K~QbW;SdntHZw_CosDGpau7@rv#k`jHjmN)OXrnHp#B zBO?2-R~(kq+O98><^x?dX>@Tc^^vdrUQ-4btn&2mgBFQtfVAG|JXk!t$@)4ymyusR zm9X-k80!CapUlsC6M$dop_q~Fp~!z6f#p zN$u|8q(rfPGFl%fw+8aN zx$Ck?;s&sZ8-8E{$)(-u`Rxb86QD1$!q{F{*jH7PkpVZ{$UL0HoPpPHjaeNVxbwA! z)7Dmwi?Oe8>2iOSi0iJmAt_cYVR!A~((ap%Af4DWe{~K`BS%)z@HIaks=>sw+j^ee zlbKT!#lg990Boau0Vvd-ZLMyyc+qdd$RDD@XV{KbN-Su}_aPP{@)5PH7^?Mg#2z|A z)QVPX_JCnx&F|yt2UIRL;qgL#{ZvKQ;rd7C+x~okUjWDF{cY!R{AuuzrSxVjWfSdj ze9`=LTU#?&xHc{f9(=%m?OR>DvYVZ@cxqIwHstqoW;_%*+^Cp{ip}E%u@~l$+g8PM?n@< zM!dTEXr-_eEjX}5{!>gbXQqAD5m0^Q?v=o-atz_5=VNZ}mf_uH?8M$Y@!Yb=ZXYDB z)Ui)mTZ_DEXKmwT6 zuvm*o`7l6fr+L%%i9j5mLse(fG}>!j_PJYK?9-kG0R{@Lycbz zIpc{5X$GwsVAs@4ji*omqF-d92NFDzS4Lp5Iyu^#ILWJwU4#->^t!zZb$bBIV#n-f z&$oty`(7gjYrRh9N(cXzAniU17sce~l>o{IAa+Vx5a(pLZUYE^m6Fy@X{3?O0-SgM zhPOtgv{xb=Naf&7=dYSK9C7jUf!}$=;b;p?nAzb zf#fOJm+&C8A0=##QNGF#J(trV19h-=KG|4NW(AvH4ySaky@;pQV?;X43O?+5fz)~g zCE6)$xCy&1`3L&hDW(7J`r$7l%k0c4E6(dj~`nQ?yTbIq$N>~QtGi4f9B|r1;6R>iH6m> zvCM3b^Jv_`HC{0uv|aoedrOxfsUYNX>eE7Y%Fm6tN(V61aq8;{Z0Li;##_wpPmfL9 z!b5dVn%I=e|KpJVFCwZPXcF~3y|?mK^6%{BzW^t?5Z|j-K9x(5ZZYyQ+snTl^KW($ z)6Zwh8HV>e%!9arY5YFSJzQ_2E2&PSj*BAR`W05)#rXUy!|$Eza}OFl@m{PwePxfQjmuJ@K@KVNw;PO|Gn@$OSP!+) zdsoflv_HJ@aq(u{S8F?YB}&XHShNN6N5d@xBL8w%g(x*?Q(?wR2>O;)lbl|yO)V*b zS5D9y_EI;dKmKCl_z<*iK81+KIgT4SMsvopMWOy&-V=vbYoXkoK5lOqwz+)d&k^gD z!PK%*V^n!&YnsddYJ4=z*)Nqtp^T&b+UxRbXUbSAel*1}5w9?q;Khp3(>dE4E0)l*y50={&qREPuuRYW`r zlaF`v&&FZrF~GpIi-bE`x<4zaH#qtHGC`g;d8R1W{tRn-m#24u)^Qb|0O^pNZGfEj9P1OMnG0VDZ4Yk|7rFk#qRP^D$_FwWT-V5gtYdw$=A*lca~y zB`rM%QTA4_*TUlVP-eg2;fOzq(fyh_mId>vL3Jq#T)@nIN$+EyMAe1}v5eSu270-< zJb3^y_@2?7ztQEktG4!oO53N3q82k>Oz(!D((ZF_J_1Ud-h-oSS#{?kJvNKTMmA`1 z-&ker7j7&|=O<_3nTRf~$Cg3Febya%W4kl}Z*CAG9oXXy*6F;lr7ALSKH84MAaYvP zvyz-NA(VM>M274q><@ouFEPaG9WH_l@E20lA)$UuWUSlRi)c7FSL|IeZm#Hl7sFgu&Z&Cln3P{v z@AUZeh3?-mq-Kw{*-fcNTR%VM77ZIG>FW>sihU;QQ_swgiAbRpdnE;S=$sB)Yu5Fz zJXM$$r9n1nsdrhWFM>vR6zJY%y?Sx^OVr;blSOZtl!Dc{RtC2i+zR!6hbU_WD*0F2Ka@^E++gE481lxEnuz_h^A%`6j(_^9vqA@M; z|L9BFvQNL?)pe*2y>WY-gS|J89Ozqyzw%X0orhOgRR?ux0wTR1(x(uKjQMI;c#9Vx z_1<2idxV(MM=Ae03m*9QHal%LQSFUO5=d!;)th~Dk>DZQs6z#jzGd0g0detH?T&3E z>_^NFsC{UKl74QC1PO?k%x5g6C-UiPV|DO)IWKjlvys(C8!2}tLTPT8#+0vO8Iw-+ zUkFK=1xI`V?V9zv{*-9E0S4ue{=D?nhB(-x&5yz_kH z0LxhI$DICmo6EmbJ^0?$OA+yqt-YZq$ePIDe~`3D#-QCiUsCC1H)Uz=#FiwT^{mYATEJZmA7n1OX%DXjqx z`h?F9i5p$?um)j#>>_tdI+mp@PSx?6>b)7wy^+~lij&TS+(24_{CEjyo#1YbzqM;Z zCUJaw@FhAIhPu30EJ)CLf?RhmFhj=r1wFK>S zHRfcN&Qb*B`zX)cz!+`1JO#3=4v-@>^D$lgTY-?L-|>VSltQ~U{9ahsBxNx8TuXVq z*gB6H-07q05$i|Uu(S_ou5ROH??t)mw^htbvoAbTABQV)Fe0Ci40KSJpEo}$?09q} zvz-O)Hb|lqQNQj2&oSY?areB05el+_kah&q`ZqmL883~xbsiox#eH|j9iDRBbtFYn z<4&?aG5|QJh=*@wjbxAt2H?Yl#rW9IT%kg72)JzSEK*Ks=axdWHHV&=c)NA0yiMUJ zz=%*5lyQEodBQgiS-4NNj0;o1vl6=&C+}#)EJ**57rSr-&s)ms{}8c|Bn~&KOE=(qNu`K2T|02b_2eJu?H*~_H_|C8vkx!7J_x5;O zGO+yvD?AZy8i(ex<`{>iqnYzs%=Km4&)?-w-ls)vKt9$UP0ywx82^;bro~S8YKP?2 z1)QA+xx!8-+N6424CN*+>0EoZ=U7iM|JO5Pj&+4`J2Uo&inDtb?Jql+#F7|40B_V6 z+lSnrx5UMAuGSqsYImoNSnfP!B{>GwGR8ZsknHwzk1u}A5%(m_X%isstthEWaf!rj z+VW)k!0j|!bohV+E95Mr7u4KH;pbIcyp%cTHwJkTmQ9Wy7wz6I%YVBi>gva z#Aq|KMhCQM{-DR_Tj11N9|;yOHueW1s%PA|b_D4BPNlE_@jjxUCBmB-+R7sF&F}qO zR$MII#ja=G9d6pzdz{7q&f?0wKhK*n$$f&ccG3Glk&6+ZSfVg2)0anp$~|rHW=`cC z>zV6eZWQM>s#FTB4ZSR2L1^`ia&k^GeTd`MgU77x-_qcqUEwIs`unGf1tUq8@m z-*(VAu#G>;ylgQ!xAnhRPl!{T%zh`GCxRwhbvWyyMYw$jiTRhiRxcp|Dw`fcV*l}Z z`q(KqP6k#OhiDPKn)VMG^hZL1wVvU-jyZmb%R*IM%tm83Iqut}YIv>09Bwj-peo~g zm*GA5cSKL~w%Vf*AARKhZ?LrmCF zk>RNh8`)k-h7(|O*0u^$MVJ?u<~BVScZY(YY^(N3{;9CzFOA&F6>-xRTyE@eMf>~m z)pw;-e1=)r@+70+tn+hsw&N{3vzs~IuhqP_Q)wHm-4c-4k2uIvW^6%slxU755TKg_ z;hqUNc2d99Bkqs9+BZ+_f5dmJ6f>A4DrZRvLsfw99z;)WA|@tB94d7{xZ)03LMPis zbnUO?tUh!+4cM=Gp0YtJ%St`mjC7mXygh(9AYCXaI@=#%w(@m6J)CDFg{S2p4y*j% z>(@V%suS)33ZAy8fG>h@o%71^-hl5Z)as9ZOFyh#rPH!oR^LRikKX3X59NNs+8sW* za4O3>8GI`eo-5Q`d~s1jHQ^P>x=*9yaJL(f{Uy56{g`H{_qhh58W$8^#QGG?;LW_7gM4)PmQWn;V zw)!PHqqJ|5f!Azc!%S64yf=*J{q&RVg83UL_!B%e+dbtqAeJ&%G~ac>BGXcdRw5({ z*gL|WcfHb;sjGhAN&m-}?h@rHrlGcTY;-DIGvE;1j=NKuV{HwlC*o~nL&G9wO2{qlA7jWDV(%r=6c%>;jX6psY3*HQ z7buY<6MlvH&A9PfD{C5!xK8O}UVuxB{h6?N=Ds=eMSQo-H0j(iph%8jf@?ICXC;l_ z2-y6i_^~3h6Y2ofg@H*|g~p;!-J8HZGgmRn8oXM;2v4|QDyaT6O*a1dHLE;d|d`mvu~#_|WG&)6TyI2y;jxmWnK@M(K^ z@K&h7t!eM0E%>JhfBN&_#AvU4kVTDAPnVxUT3C;ywj~xU@0o5&$|8Nrn8ftt#jN~# zo6MUMHst9n-Ud!m>*$ZaxjE{o+x2R@!R_oJwTKS&CzkL^D%BxV-((n9s2%IshJBmt z>6_Fcxi@zo0VKLJ9ZoEh}GK)#8Fyn81Q)HRWt5NMhu% zmoZ@4smmxDzns~sNPJ3YrBtkH=X^%s`&c{Go^D4`nS`D8-4;+`HnC)$0^f_Yq+iU9 z(3&`OXi0XBkPtALo+Hg2BHx~i$q^CB@0FRu+q8RZLskRw1vy-T^Vmq^h@%aysucOciFMdlJ}vO6HkPTMwv}}bhFJCkQ>U!K-9J?-OntV7%@blQmRJQ z{J!t#(q3V%Af+Xx@F3Ce=`|w&1)s)_2;O@u+Io(AP#7Q9VSMzax>}Sy9897EM=Ryj9&aMfSVua}3Wu9IHFRoX?8d(}r+WDGW z?pzCWc3Z&vX}ya^5Ma|1h@GHsfP*BTqrc~=pv?*@gSd^4b{~O{AXXA>0bFo8(8}dS zNP=oinT=tXc0|S*zSB*>ZT7SAEJF!tDE6>jy_(hQc5i^AS8D*lBG-Md@U$=|{_nnP zl2n6nZv@$x2NV_tpQ8TGZn-DL+SAVKF)(l zlbZ5l=LY@$Er`@A{aVIMvpoxzC~;&3(jG?N8Z_SXp@Gvs{F+!#%Ws%TbA(L%HZD<2p z<+l{+jU>ePX%4q1V*B^c!&?P-?O#HE{)HOMDZoN5?4Tw=AQYulJ>VEF;r?eyCb6p1S*i#Swt7%Hg?;T>FklI6v7JrkFg z=LFWRqUxe#f*v)r%ypjJ2k?G8uQnB&&Jo+geg5$?lTBhCV#OliUWFh6k7}9Nw{YKD zK3*IXHDT0$XG{YLSMW4iZ)Qx!&^F6z&d1LrVOH9wtcX1_fBzsTBwGI`Y_Zejsqpc! zN#7tcG~)mR*JkaBzf;LBEU+-V4 z>?F8!aK@k(w6#X$w(o^a9xfe}7U9n+ljaNbULSRXhct9ueYm~P&kg^?^5-EO$2)xZ ziN-`X`R@)v%zO+=@KY+ym@8zKf=t7&x$yN!%Ii2>8uQw^_Sh5#7fkTU=r~Epg3A`P zV0|oTEdb+Yl&legfZf?u0o@Ix*6QhK!3A|&(E`I9=pX*Z{-e#_d)1r_%wNwbl6~E!AJ%+ckr^T$w zG<}r(fdOOZ_E~DoQ|(O~-kE*2LDd%xcFnwx?>3Y%X5I5mp zyVlGxx}_Rc9xuww&7f~@v=TB@1ESQl=5e%|b*FXB`-Ox8lo&i?V^jkVqQeg`o_DMx zbI#MX9@MtpCT%;&M7$AE1;;m<9Tf4gQA*#2sw#~f9t;t`a-rz76z~-jPbMwypyMjcNHy;3NxHL-`mFHxi4OC2kwS_#QpjjkUcMvG+%ZSH-(=%=_`ApKDZT_>r#KPij$+s zlPaupM+^rWa!uFZ#x6Ppt#P*%Rz9xlBo+i#q_og6%+?Cq0IxSr&x%t6Jg_^Y^Jsj@ z{MmasuCroXzk$u-azeuB3V z2J@CYhZ*W%;pEQd+X*}RfRJ&f7ZW0pzDb|l=Pj!Q`1a>A!ZDb_xy+<{1{VhX+ZPaBD=-*mhte6>kP67Ga2 z)>jpjsmV$Y$axXZ!|d1_+YH-Ux@vuHD-*XHQ%}QD-@uJC8u4kES9mg>+xo{-h$^gN zy7sZLqgboFFj=)}2UMo-)agbQu~)N{xmxs~E4$1jH=tC7^!kG@(^#?Hl61waiLr~% zGNbu($Q@aXoahSs*o0~gDLh1gHHhGJvGdtAHHj~;YcZ)v{VwwaWI0h|2yOsYjLKPx z6RBr&XdDwvl@ZZgUo*px z>=WQ^JSZ*}7HWQl;U-m%t(VYAyhr;exzY{Bn*DyD-cQJLS`IeCnmyQRX_1v6eDHF= zU43SFuj{>#TK6N$VJ`c&WaH=jr+r4RAi;UYR5)JSj=h^O_q?0&%_>$^qz zOlgR^wnLbGLwcVoZ+={R=#a=LH>r|hGo>%OKw`^(hSk!U^;~9`3}?1VW7Q^dEp0k~ z|NSCJP?9c!Q97YJJ|`;KjGc!&+yCG1wX~{B z8*NdWq?DGTwF#*ru}AIEmfEBCjt;6ev1>$)qV}dn+8Uuo?5Noaf(SK3B60kF=l-5^ zopbK{y3gP6xvuBu^?tpc&&Sgm$j1;w=Ip~dI5B2agh3v#>~LP&PA`xAe_U1nHv{z8 zewjW3t7M`?SH^lohh*ekJKelE{A9Go@JU;)(Et68ykK6OKEt+9KC?-m9bB}}*oMK& zx`fk`7a`70tLkkRqlLYZ-nPSxVA{z{7Wf#x%lyhR?9co2P8UzudOAf0u+4YZKE^L+ zeP@rv+jq-_e2;O4@0wn6=GZDRaVIMEEBB2{P0`zCllB?xr^srg1n^;LD0L>x@rKgw zJGHi)@u|*n=C&cPPt7a>cYzNL#UgBVz3QSH$3P*lA6{yC_N`IXR(u*fOnqMwwenpd zDOLB;<@zU%a+E2a)bW?=EAMOP9nj}m*wd>dM+Olv``o0|RJ-yeTSOF8vp`G81!i%_ z$&BeI%*$ThskKdMH-@ZBDI$N>^SI({5>s%B!{?fYqB`3eBHwhiANkEM_;TjAql?DU zb=%$HN_avk%Rt%mzNg{-DN?wJ5%6k3s6y4okiQBM+;Y8XlF8F_dd*X_wr*1MLkH6t zQ^MGMHms6p)llH4I%lqaqI#9#!Y@;}8>8dWZ(MV2an~ER({ReFK!f)*PaVOtD5o!A zOvgbUc2Rol04ImEtvJ5b!Wh+4UmSzTeWcXmS4?^W@bVEf@aMPXKDoh)YCw@#%Zhxc zf9hA866@yJ(4WE-mMRz-<3k0LWWAbs4Vwt|z^Csp$wG`CLBh`c;?Clop-s-!0FJ_U z7p%%|`j=Uob~L;(hi0c;F>|DSc}NI8D5xMi=CgQw+%`beyPg!xl&0?mJRNx%$Z^~tv zi|7REa)^FDKb6!x=bi7Q!?_%Mna$B(^ls_H75x2`bhq=ZcTT<((zMAOU470C7?B8} zl9SZ&UmGcbAh~;>jh%LJtS5^>DIy$)+FB3e@<6Dhx@HY&lI43#lbcgLWmbTAr@#rY zz|@^W=aCb(HlxjF@Ylo}h7 z74N<1LDZcOgWr*DdKX!ympfz=_(N~rRb+y$DSAnk7x;WUJ=bFbSF12UEa@JIc5C`O z6MikbyZz|$b(b2cTjLA#;;iFL^&s28n7*d3jSpE&k^Xo-09SPRhz;B6AJ={#KZGXn>*3bFFZ#9b~X%lt( z9>9*DE7Vr@EP!*AX~|M+A>%vU5a*QV<@OI_Red(UpjLIoa;u!yvTyDr#V1c})SE-B z06)_GYmvYN-5)xOVBQm*rk?TK(3+G#XbOFI55;?Cqgv;K8nKJZz1G*^-c4?9L|o^HKc{~g zylD{GS=D%oFN1rIZ=8SojJh2OmhBszJq`h6SVY8i;Zni}yxu!2TvpMC?3P4^J0P-H zpfmnr6&=xySxhrrL`iuAuZPmgtsa9mB_uYny(9K*i^w4LLv#3!%rQnrY=xWj$YT`i z-4``TXHY8v?Sc7iN^#FV!&bUjOS7bTW*jwo7BnMD(KT)dbygiKZ7-?*F49Dkd|iSG z**l-7zK+6GeX+3<-tfDXlTlI&NwMYhMev9JZND-u4j0#jn2LL^Bu>zl5;_8(oHfq( z82iL9pTsbLd@D6*hVObliA2PtuF4D0ja>yjacSN41MpX`{yzU<#?SENGMJBxW8`mM zPQ&>(CdA<&r?8z<;lbkW0|_E;rDqaMS9)frXJ)>|`B!jnRBkz?wpHMS!gr24qNh(Q z>Fk%+qBy1v4R(DLRu^v5*rlUW4A!dr;tC0D(sjkf(rTy)+ynRDc-;k5C@>sHT<}!1wa9DiHWd?<3OnB z{s4I0CN3Dn*)M5*Oup7P(GYSA4QW~S)!YMaCnei6N_c7SeMRJhQ6*u)sL{a80m?m5 z#F0JZ&?uAQrn53Z+1Vu63S$Z@>wVji8|H^=iIbcbwEb>{0&Dgw!O!(;OFm4Rmp> zk`%DJ0^98Cm0;RlH&0=c&5QmPX+)Ta)szH}0=Dow2F$Q1Zq zc{JmMitb5|wShc{-F6p0le?Z(DZOq(n!hznIMeFx-UoHtYwD?pPasS0hN&4B+F{OM zy)t=0Z!-DB)cbJR#hmKxoXo_?N{|13=99wA!uHtyKoeY$NX*}vNo>su)@xLz1|1L(MLU|L zQFmBRDni%F!fxyiZ>_u%xSr*SYLX3Zq?f#rUFhR3lb=&~T}0)g8o+hJS0>19$kS8$ zG8T&U`I|AW5l{(KVV0w$*G+8N-?X=gIca1fpK|Vcl!NXZ9Y$0cK5sFYQlDyN!hZci zjH{|^xZk6DVMIV*?qJFL`1@=`*ZQFg-(&ef^;u=Bi)c??WoFfTo%Wm6E5;kz;6=Vf z=q}6jl#%?Gi1|tTr;r*zHYJp#bHiSt_P9pmNG3D~kv12hb-5$HSr&g`OXTQq7xqFd zYGi{{-j31g_-x%XNHm_d@447yt~~=LxIsSOY9*%aNlHC2cm@*>ej(o;lB{&qoO#MZ z_VUu?sL-nik3H}+3&*vgTNIl*QAp$5R*q{K;sofCg89(JQd>X$X}|48qX2NRup_bf zY04pC6EE4_kTb3eGv&69R02HG{}n$y2)9C{wz!`%u)Pb)0m)G3N!l=K_VvJ{I;vs* zuEw~rSIq}knawOl;lw0V7L{EkNR3T>!L%ZLMH6s11*Z*l#&P7F0dAK^K7R%bWvxsu zrMdfat;p`4BS-iZVA*Zzu@4xEG7Bf(^jea5tGorIz1dgzW*W^ZYCTJS9Pn;F=@@vY zbQ8be{P*XMigOz)g%Ec9KFN5KTQ*G4?7dr(ZII5=2G&fJkL>%lFsVz15Ba%p>{9+l zwyB(;t?+fdJw+{ zEN^_ZmxF)Xakonzv9KVjr<0PR7aq~>?4F3Dv?)1+HF!3Ua`u6(&Jedo6}K$BV}AJn zzkJ8eEk|1Zy8tc#@j+pv*v~QKRcLg8aZ~g>kS8eKlCB&qXxKS>faC1?74Kvx0W3PK-SGzws0xj6`Bl+x7Ft2+Sv zh!=U|T3&YQO}Sr@u5;SiqTM6CRWPsFr+LGXt3evfUbw6JgqmS#a`NV+g7y&+Hm+mU z>k3Hnwz-4jg$m3hwU$dIetBr!$`h`tPK7`^Z;F?s`)0)i*SZ%LzK>ifj6qFZM#oS` zT7LMNLS2+e0|W1&vmdG~ogS4U`bVY50R72-#t`Qd8#orE{NpNrUSzOFpB{ju&aY^K}_ z{k#*j{1ouFIofIEx}U_)BM{|%?4r2QiKM0jfi?Q-{Isxqi%w4@aM+a=a-sdo*RN;d6ELHt~;cZFJYl(N_-UCgrQk_1g7W=ekb^ zAll;AM!OjN(dMNi8P@x(s`y{;or)HQ;cf|4(CFOj`Kdxg;48FRfP1uHjhti7OP6Id zS>-)swrS9mmF^^1`)Q~v} zp9`oNS)EMyV`&_2I@s|kxw4%Q?2B4y5kOn?Jl&b(HMecP`ZrN^fo>4*>iSl#^@J5n zww_7(VrPMHPIZ;%!FGH~v6UAfoK}ZTT&+-tYII?#8GVi|w!%&-`6fj+TK@0jm2#V4^F{s4{*(189P z3eaMhWib5tu;UkeIbbWe9-mtY#!Y*oP^%7C+rgVP&jT%EzGXYMeGWWD#8;cUCA@nI zlvP*AG<(8zyom21(Po!j*le(VR~lgP>?hQP6Dr9K%$97K_0W^!eTk40U`5nOpRWi4 zZz*7r&<0_2!MfQ6t~Pk&{5Jck zf#TdbZ+JaF|JvQaxx}U{4Z%8dtY#myhb-65je$9I9Fdi;e_3Zcj$IwIe6N6gs;lPu zv~Mz_@Fd?OUyv2Mt=;1S%vxbMeTOm^kz|a2e759Ky^!mk3EbZefcpOV9#{q+lXA#+ zNnC%HMN6bc0o?{kb}L;jAFP4PMi1lnxzUoK<7f(}rmDfWo%(wSyF>!w9* zyaOgV`*H;WedNO#o>=zJ6~E~&PcxIa0N;daEXkD1hLPwSyB!uWgLOkgh~nn zhkpMIo92m1Q0%Fwc882Zapv8rulMNIDkv|3?#t9|w1y4S_m$^;xL1&a?=LOsf1OSF zRq9zKQE<1}P387jVAAzP4TwN#EKhXoe((9ESOc%ISXI^rDUJ{REvG-B9KVh8$}6eG zxQD%Va7AwBc_vs@pS!!U3ysb%AqeOa*CpzT+2f(eHe7#w8VEq5J45FD!_fPwh{S1w zoqU&eljXMds~pZ15Cxp1z4W`jJC)Gcm@qrV%u3X1xG*TV2>AVE{QtnC{67w)e?OZx zX@q{p5MX|pG-W^UeICXJm05iBZOT1G{vl7vHfPU+tyWYl5VEeldRWAhC&5Fu1x~<} zzR~vflNu`A?A3Cf%%C6m&YGef(zmr6tun z!FME3Q=TG;rrhbAI>l01P6@1^Zhvip#7!sYVz(Qn(a??u`+%jXXkHc6Ngb-eb`(|JhDiCPi^tf=Bebs-QO6EocZocAi9l(?lw()>9Nxh}8%k)Ntu1*OxF27W z&)`TN*78XmY@4q~CfTG&Ip6xzK6Bm2I!!}5E_uD%@}uhWi%dO|fI38+WM)#DFD^Pd zP4~&9LW5yAdAwuzyLNx0(@|U4P)LF}L!ISxz=ZjJpqe7ATn7{8nf-IcP0?d%{tYje z-`4iDoc`_e`tLnC^DW!ahw0M#x!cZ#)laPZ;A~&0%QhkD97d6GY1HAL8eYbW5?FS{ zMAbzxa(DLB47Bq$OIu}D&o8AaLk|=(`7LEvM~W^M=pYuc#bf~44o~Ey%DQ<@764Bz zl5X(amrT7E~D!=n#L2c<#11$GU${5^T|g zY_la<2_>Ije|C}-CoNr^yq?qHz^O5Fuh`S;B`ZE4j2QY@+B>^qw*2RcD5)7f^}PFW z6SH^CS%={5bX*v(1o6PW^Ra#Ojg z6_x#MPUA+zHJwyCCIt6)az+x{LXMq0A0HwFR{K&dmn-UZ%^zxRQ!xVZsKMq|p&_4} zaGwD+C+Pv7Uy_~UrrR;Ue}YVOMiz^WB>3RUN$d&5b=DD;D1--|9{T?T(LLj3^)PPK zrYeC3ei9;a5=oXGI$hbCN}}HR&Z0qir(Pz73NLH%;v9;D+*Na%m)r?sfmyw{!ZkbV znc=IifkSr=9F77YJNMz)y9or3O|dxn!8QABrJG`nbMv;@y$&vQM@i^+mAV4@zd~R} z@gZkFV@eq(7gA*Iu8^xA)%Y!(_ret!lQrqJOy zUH67uWR-ni{s=n#C_2&Bh8MMU0!Aq3E6PH(b*?idL801)wZ>}UKcOIRWD7(1)OQKj zKI#{ZY0;JOQlp*@XL;Dw{LSpEpNanMxrz05mOIVHC-g_AWM7mTnRTl*nQ zadnnE4&z;ZpVpxvY1zszcj0SnebnOyB~ps2jKaIT?U)dS|N6ZCk3VQ|fN{fng&uYv z;rpgB^|Q(Ps%<`r%FmPd1D-i1b9k}Jb&S?BA^v%3c;uYZ$CWJqr->oIZ(f(HY(K%B zB!m)3CtLRRvzAi?9W`m#Jas^c)%{M6+iQ2KAFA(tgkYJk$w_@cIo`Z^3*E9^9maQg zV?AAm?GdI#8OX1zF#wa&v4fZ!^VeoYBa*y5*V3m;z2BayNul*LoP62XjW;G2TaEd`cqjxKXRE7y#9gLqk9u+m5Ra*RYfhS@IF?`%yfv6iooDVC zk*3o;Nm(lIdMRE=iL|r04muEaYVJ>ID+fN~1NVpWsnh>q=AJym+eH{=wRt6Cc9_e8 zIJ0ljBzSzyd%`)t&d&Ylm8BM$Ob#)X9A2uBQ9_ z-4m6?`EVdCXWV94xy?zmbpMX3u}N@BUS`sL!Np&`Ag$3{9a{ZI%zn~_kf##gw`iGN zlHIYw=+BVj9a0celGlJ$&=40%L9i5MOA#ezkOSpT@1B-wVLlCxEyZ{0r{OxhlYW+q zJ4r{2Fmec1COvS8UB#&9;b5ug%qPV?hr{bFiXjWg*t!D;Zql!8-+sGT^gI|9&%E6d ze}Y2*9J?2eEIs{mbjy)wWRKJNaE++3K(LX9yY`1groUY;bMD3_r<8w8dZiAL)tjhd zE-%PcDi+GuT`?pQW5Q-%$$fFm{KQodi&-9CICBRlW8FX^A0@NYu<&pHBON`b($N(g zt{}YS?X8I+_C%;5=psm*ClmPRlN)A?cL%!Hlq1O&fsF!!*leNa3 zw%AkVCDQt(FfSu+dY(T ze?P5cJE|FQMzP+9|GI-{KBES9AXN7(XPat-?Z{>IMY+@kR*|=-C_}PW_01M$dE(q!F>A3v%~z-u`Dx(a$P{Zo3!^#{&925Yv0A`SMld0bllxRm5Ul3 zoZQk;>AOf~=a6a>;-&SuF}9CU_!y|iLZ-i--4HTYW(vdvbG5AsC; zWkmu5gkk3K0nXkvDZ>^CR?vPk#hZY5rvyMwu;PM-1W(^ch_<5H5QH*4%TuZg`(e!g zkmyN*Q>OxRx|Ro!?b%%P*IWJC&l%6&I}rT(BnVgo$@eMa@!OH2zDhk8w~NhrxQ8or z=r)f~Ygp(ckBJUhO$uB&TsY2JXsVTsYJf=?zu44>j>kfD>}4;Wu64}%Mqoaln;Ye? z#Wy{#lcWQr*jhrrY4>&mZ?(1pf*QcEG#zMfeKI*!Mz^+>{IYzjNL7n&gSYxU6T5(qn`RTO&Xgw+DezBb_ zaA`~2y*Xv7tMWO9O)fsItnsmw z12^U{E+~~G;2|Tu%7ea6osz0Ex1}n({vh+fkF6+sw4TO_WXZwfx3hABK@!}})*@#n zR|-|POEFAU3CSu>4A_(u4O#bFL4kpP>I6X&!cqF&Gv}%JU0(E%7rxG&x8I@bsgo`l zgiA~0gU*HqCXpV=Mpd&Iwr`(Hx+di0KM+?e7$&r^OihWb|U$}1@d!X z#sneAEhyoT?+0SA-%_;!L3R`$L6J^vUrH82KZuB7By@qBUJwVET>LRr11*NiWr2A| z%{1MgJO~hNUTfw?s)s>@b9$P{j}jJonZEm`9q2+kEEg<7jrQ=b65>m9i2{96dtsCwokx|Fr^sX{D@Ql&bVd}r!~nDIWxuro{{~rpne=` zxxz5>&+#er=$kg{H4tV`dW}4-MbKf=YO9)9G5U-K30z*wqyxPlR?&Z=;{p|fw*Ms4 zEfsz-0<7!SMd7}k7{H$D+;}$#szTa?VUg~B#V1y}Q)6(@U#;mki0=lFkI{8pjRRx= zqf={vn{pXg&A7xHAz-&{fY6>LrN~Jc#D5EOHc%4t&d*58i6(b~Xvq!0Z8SY14g(s& zlZ$_-2v4oDfZ|F~d{|Ir%0cSTn4<$k;w^2k)JKvBbP(OknDWF)TUgc%He+wm+vg!` zHU#}UJZ72S4?Q=+)*Gdlfi@G4(w$(pfOTz%O$XMgXUSabr#zJaX? zw!Z5ke1-SGnWscyBk%-$64u&IiklkP0IHzxc)P3K{G;}aJ?e0!oN{f~U1O%2&y4e&}?`157C``3e97wG;!Rumy%#bh7`1NLwdJ7r+9Ao^s@By}A z?jG4BLAsI@AGGfn3^~8a@EZ~e^EzGW4q5W_4>Aqj75}LE!rCFWI=)dotmn`C zpd)KftzX7ZnRr;<(1+P|WEW~0$?KM^q`>zURWSc>vxo3b=!~VbnmWq*ee-8UrZ>0k zdma^T`U5_#VYvnG>!^GAqpTZeroc4SkVNE&CJ)8^W~x%`M8o=>Rp&PUncQ-(ce|dZ zPe5)Fc7SK70|Xq$jV za5O-%N-Enwi8Lphw1uE!;|F4#KX1(?AyktP5AU)@E&&;@16*efgT*K}1E-~~sfC)p zw`8hFFVw$&9djYGUj6u5Afq!Ej*lH|$M@qf^YG~U_fF3t{O%OD_x0-yyKgAD@e!@F z^xk4UA)=B$z1232-j<)<0ynCBkG*GhY-axsKpN8%!&AS-bfL0!J446a%T}sev~YUR z?kHf_T3~Ad)ylxYZ)&v)Cw~$vddi}F28s%}vthw~BKck9t(P=cvZp@sFS>k+dHMjq887Qfxa%Y& zxKz^4vY4_ez0PH0Xd|<7_kvQxRi5}WeqGc`-CN1C$j|Uptn5+bLF@KIN!{){g%#Dh za0zEgF6sNafr-PQ;!B%3Q@Hl9qP+IXyMeJD`Evt02Jwvr`P;9xfO!t>EW9|@~ zPDEKvFGk4-E9@tk&FgZJHSW1|aUp6_j8ZQ7SZl2$y#z{Rvi{0X?nNA z5fSxZIo&K^_@kR?_zH6y120QblR9Ni%;}h9_Ji>hC0v6u{I2HzV1 zu>v)Rr+fex9tvw*Xj$75{p;_%+w){~`BMX4)mf`z_th2h5>PWTEl>W|uitT}6>dkU zIUdSK5fyUVH)UAsV~YDhZgNH)0jQ4NuU(^l$QnbVJ*zEe%g|8g zR(89B7DTD!&O`L48Qb$+Jyiv2!NAZ1nm4^<^O>(KZG`W#-lHiaGx0Gi`;)n(o1qG` zvGp$y(WyRK(Knd7Lk4#`(^IP}j9hO0ct_`&g-9#KuU~4__n20CQk4$K(qrE$M=~*u zv7hp~v9J{T)^SOYLF=zZKB-&Wk)_n>%D_au!I)1$Ivw`ln(iqqZ@Iy&F6F0v7HgmF z(M9_2K|pCq9hdTxh%QIAsG*zwoi*MajR)VGD?J9Og*wkYFsNF$0}6`NV52RuX>$q; zx9lBc?;|~H5?pRi34fr#cPTw@cK0^HWvGB*L43&Ss^vEMStKI&7t%;9Jb=jb=VMSk za#IC&`d{lFn-w3FjlNc|e)bX0m=a~4`nQ~VO09Neq;DZU!M)Jw9Rh(;%Y^P)^psKs z*g5RemnCXjvPK-_c-ZK_mWKAeythc?-ZERWb%*`hB3WY=zcDlh=wx>Hyi`4!Ql2A2 zqw_PLHkn(T+Xokw!%jQ4 zHrr68maZ~Sw4qg}-Jdef+Gt4v>cC?WU&?(yJrx;skhNcIHx;F5&I7Q~3H$Mub7p52 zZ`>BpFb(|+8Qn``dBPnWqu@8J*>|BC7tDbj%xMWjOhK{94|AWUDBs2`bQ(z*2=`UU z(a5voM`uPzLgHow2Wk#lj3^o3pZ#o_h_KlV{Q0w8Qa=qMFA>&D<|Y!6U#M22f$?gI zk4$xxa+582kl4O9qs*k3!3wT$mlkT{X}H#}uZ??Q>^mUI7a6pIN&QEyDvrLnt?EmZ zunqP`L3XOsk(wX%Bn*5K7JVpw=xzoVj=YoY_ao0WG zqJ3OE(@|5tYqft5{Hb6d>^wGt&3i6Bi=g)>liW z8^X9lJ0(ABVZphxIlvSojUXj_q=~;C;U;vqFGOm~%`aM;nA)QykuMa-7=PZ0gu(MRbAcLu~MwZKMQ3QAC(c#5(%N4`=9q@Zvui$SsQd# zm`?slt^C)P<%RAL<<>tn-+S_olt&x&oB-Qw9CN0UOY|_*M96FGBOW2=;!3kmhH_;` zuT9qI`|^yhgv2@Xg#KNa3AUj;p2_X7D+yls{RQ*f-SIy6((-fM_r`W<`16qx%*3^< z`yNfrLt=8AZtpx+J#YYy_E#CH4&>6RB(}*|T(@xibFQ|`1@}R2`j6CaH0N@{Rmxu~ zs!1%2D4!m_GR5W@meG}Mg-5-ZtR#d2n&Sngf${#qdP(&WP4@o&<RsE&lV7Bbqn0Hg?$4{&-S00>ADL-%uqR0iUdA*0#%B2!g-!=^ zs-r6Ho{?2|no<}l@`EDm=E8=48UFCqku%Or$8u@{6@Aostgn}3`U}6YV8WOHT|h$K z@1&abkMto2mZDK}1xnMMv|gEpu<>`{4BGAcGChP(9=smOf6M)rkXF@JuUZ`UEmAi9 z>n=_fg;`hxyBxZI*mm{fA_WsXT!j+gPrypzMz3aP>UOI;_2iwn9>{NcSjYlOPyVpl zG?Boxx2JEA@IPkP&i1j+3CV6Jy0~c1w=PBlVO)2=j|`vAbb$#mC~~>#!q~bb^OkDQ z;DUfb0wHwY5F*9-p{eBY{ppKG#amm1cRDwHu>vV=ar78V4#XACK2ax!|d-+JvSg&IP;N=Q7uIQK4}kd~NM z*DP{R_rqCeXOedjA@?FTaAiG+F;Fol@}3|n{;U<)`e;nEkC-#?_%vPEG}(@?$?XaY zp2Mnuy7KXpu&!G_+@#>iE|3o2$FND_vL#ivk|LbBAU1FDH&4t~JGa%@1c@~Zu~SOi zdh@_$!S$brgtyYGeyFT>ZTuNXUbNwPzMNAGTFm)A4M_uVQp#$fsed-O#=%vc(n;Q4 z(R=&qcrl)MCSzu<3J=e@Rxzc7#=nh4AaYawO58m4XblT3ZUsp8O8^^svyPL>8LVWk zB#%vxx&s_!p+8+WOqP8cC22-WzlJJUioJfsUW-xC5rfK--!bszCB)3Appy4elE=R) zb(Avim_T+u%})w$bdr!Pi`g22H$Y3QrCVghsqo%(bj^&VkCI^`MfV8~hQFRzkqile z9BNGVnPsmK%vmezj`h;u=gDpKD|X*I=G!lCU&z^F0q}tYi7ltDK-To2uS2ikj;+@W zENKetQ6VV`@plU4<5<&lm){OdC7b6UVFL(c)FAGRhBSPsPz}1V-}1i`691J!r%IlO z?(Zq_5%86#m(ea~Qp{`jw6^p2*IOwWLJ7eck@}au=FGVKkXrOA=1j9_<>?xo##*3q zmYIKX4v}+IxvajuLFo9S0^H5}`go0^xFcm{QC8~kV8iFNIbJ-k-oTWLH z_k)$jnqy;tW(&O+?=Hv9m#PJN%75Vy#vVF%KiA=}pAfnvZF|yrK$9$X^Y#sFV9E|R zq4UW*eX=dgm~_w-0UuM#%Nbr;Gly~)ZkS5q2{stT^>a*esuzZGs+kd`G2gSv;f-$T z2cst~Rvfm9D;f&})0OlpgsX24?B7=-mmG$Ni1un=Zqn4l1;;f;=I2+!Yr8&&GgPSJ zN01F_mai1qGL()Ik#yI2wvVGsxX@bArHr>uM#r=p6 zKh#pZJHjr52ZW3lFPoxR);LtIyQUMXbFbAUV96Vwal@4qC&3Icju#d%ctTb`%V#e<#C5zNR#{pH2f}z7&&yQ-P&A~teSrZTVOiYpM2UwLx~7e+%Y{JdVt2! z1DLfcVBecn)2ajAVw@&*{_0nSG^T1{_V@o8 zpe9atM}2IvP)AZK@58Z#J|zU5#BQugJrJkCb5+JNuDUVc){{41FL zjrNp}^Se@&9_d2w;-S+bnwg$1y%JcDZ1Xr$_@U9u-VWz-ShpZa#M@3;Y>O6u{4oAI zySl}Z^HPmgzfS0bsImI1gMYb8V_En-p}u^^PjhU9?;eS9vF>Jfo!_?24+Eyh**Nk? zja*Co{-QeO#C2aG@X<<`1;LW(c)-WRJYFGpHZd|H4Znw;j615sDlXI>5*+5 zDhf=Q{@4|BjnFle?b`4^qbdLSJ^tT1Rwc{xdu7~4^WX8*a+BFBV=cWH=M%my&ow9}&(FO)EMS>W#KtdIuxBl71L?(mMeMthehHReNpp3FAPxTguh z1lYD<-6*x;iN$l|Q_3MVOhMXyG9|CvZdE5}MNQwG_A#c_yKW!EWPTNN!LuKu%|-pX zWaPYMsd4Up1kqco1Rc*cXx((c(oO6S7!Pjci3G+c&py4q%}$Z+D0C;aO#b|2&yn{? zO}-`o_<-QUmHQ{u3TJxOJond-hL_H+?2601stzgBfiYp=%Vxec4oAWRcsJ(CKBrAh z0b8Y%!5GgdGv9NpdtGIb=#5jj=kchgikBZNfE1xrClw}p^-qEu(CCu(m1&*XGRlLd zp%9a4PRd~GMoh3m*2$@*xk&Y8zcjTgTkku4p*`p^<^$T+Dpkk)mV`&eEL~2$fb56F zOk4U_dT4e2nv0aqgVYe}5r`xZH5Oz=9PzRZO-$tC=mU(_#CpGAehr^`ythhllMD`| z^ks+K2ReYfbfK7UMIGZEF*`TrzJb>T#O0-w!QO_xbp^@wo$ANZfZii>X)s#SSGxHL zXHX5bxyj2Hg_J{U4}Wmbte9fkF&5s9f@3!JMmG>VkwDs@1w@)tQrdciR4W5g3Rt-dHe z7(6pMsmCwB4j7jrxO?e^zTn6!ebMu7PquV7)|QVxiwFvop454H*&N>meqw65YpysD z>%pCBDPVW=napo4mQ24=aMKJ&e5Py(=KeSJobo~%`08}iGK=g@lVC02DOJGBBsJpA za>{_M;o?&T4Zrn?ZLEwU)w}vinr;vB?4+&iJ2Qi!d$Sj3NWw84hq|{OuX#v`iQzwW z4w_qD`lwbVy8CfeQOM*&t;wpcT+!Vlqmda0o7B~kK2@EKkL3b6!{a?I(Ab6Q zN*?mDz9PNnmnwmyko<(kKaV6Rqk*TrHcgMIub`9vXT8#YqF2AM+02Q<$Fe(b$fiol zt!6{DkBVZKEm~&WF2%e(&q9!ULYRpzWMrWTr=_+zj)x6oZ~NP;XWDWng#u%%{i|?Vx;ogoZz7vF&N5wnJpO9oFqNe^w7Qj>Qhk&u-s2lwXv;dG zslT|FhvXO(+0S;H&?$`Xb@I_((eZN!RtYjq&Fx;H=TF1xMd)h6h&eW+%YDvK~ z0znT%PV+4+)yuw#S6zl48%(fPAEy_tzrOgAxLF%}$|7Dan)ZrZwShSxND8u7zuU z5;bT}plAAN3oy|Q>oTa(#Rmi2lJMI9nf+%}EG6~<(OyuyX>Uh1DPUaWh7R9t%!M&$ zU1N7^Yo~=46lH%_spnl{VO{4pD9X_5A+s4Y1JZ_pR z|A;=1?+{0Bi|(#G2q?b`OmFgf)gd+B(IQtenRgWima$cdtlYnL(YL`SR8H}DrRZRg4ms#4q`Iqp59C&K(kaUB5 zf<-EtB4{_7{LD3?aJVpRe(~FBQSTi@a(Ug65Y<<*k};HJyDjG~pV2WtT=b>@utpM#TX^?WxS*zjbvt^2N73b~fOF zfg?1XpHP%g1d%!YbKN9HRjBW`&N5x(|_!R4|94M z-K%t&#={vVPJ|UTp{(QSmj(u(7SyY^=Li*53)3%+w~EqoF59*V3QH^+U#Q?bhi$Z{ zK0PUVnW7wVS09Ah4D@c-TJ&fLUKL411oVjAFpXczAK?yl6bih^S$vpvIGL&}xs5OQ z(OBo{y^q1+ii&$2Yv4>@>;&2I?qXF?O%^%!*UvXehon6QHc^e|-Yr1q(u8o+wB&CJ zDEE95T_?D;!SyZO3xPv^Tq-TfwL@(?sH~Qh%vi39+c>V*Mwnh_6DgOROr$ueKm`w? zN>Bl$Yp5Ryj|6(_%?nFV-!v`WxSa18AjuLt+!b?8(#SNWk>)m=5r7pf( zZLxbMjpb|NaN(ECa#z_ySI+0q^VK>*KAkuhxRE z(c+Bv1fzK67ca47sN}vWAx+uE9sWoRCmPIWu=Z#j@3~b8rjS&Xj=L9TSW!D}AO(&H zJ4Zm)U8jM5I<0%Y^lqEPp3)SqE&y2n;=PI;@>s=ViGkrB0Y-mCkySRSWq(E zxs4?slj!?~NxE59ZaBL5H*&80-9K0A`<~T0&A9dUeUXh?f;fH_9r_skT*rI2ZP~|_ zbj&W=Wsiupsqz_q2Z4%?_4QbZ#mWvYXBS#?n-^Bpzl$8>ZK=H2Z>V88v=tMU>~MKM z;PCgCIku|l{qN&q+gs5J#8)7-UEY!u>GdQ9Lv;A9Z?qlt1^n%7Kmhcd(PHiBS#^V2 zL{R(JBjRUOTR^mv5iIs#>NgLmsibL347hpwwQ;4##fx5biHM^1#3bMVh3(wzmEiJMyDle|HCu;9+pwxI~*yvzF=m@#;n@ zh5C70RXjK)`KN4EEPAwV9h?F^)bD{i(qTK#Fie%Qe-axLL%;$)pKm;-otvpie)h9r z_jpS`r7L5MX4zBCa^+8&X4s1GnVsvS6>ue)ll=-EST@R}l{e_@E~ccAYgz#J-OoOM zxj)5DmKAU-cp-rI!^uu_;WM_!peF02h_U_Wi@GfBH@2wHLY0Z*0Y5bw3TP>8r4rj= zi_DtP{wUx+A7c^-4W&p=I++h0;6 zZa~(|1idEyV>SE2Rgw}40PXz)36Y`)oUMKH5)opvcW23rEX@j9Tz8OUSG?7ifx-Ex zr7hP5DlG&l_NYj0D)v}mS$gs(E&iut_^*5l^DOxr9+;<3?C^i9sy2K3`ZQ3)X-EGe zR9J&aX!B0t=hH5+&4VnnYq~)XmZ;YjSx@}%XF)cW&_yqRTFN-+;0mz^vtb1C((b+E z1r{vUK-r(=o3i^}5}uoT`3gg3eeN_1Gbv}^SHbWsd!KH|6+XOHuck9Dyxdz-Oy|Y`?I{rRwC8swk~7X`Pf&& zpCGSeUbM^L)=TD;CZrE|?5Rie;Z`q-6;LPL{~zJhrMju)5Z*#_A}EHLU_$UutXQjZ z_b*tLLAwJVJU))1-U}0GX=yNoDelkYA#EJh0(qo35xwS(kgo=_E`H}7i4Rx|bR0$A!5$@38TWS@0LZ60(_5ZO z0?v^49n;ybrfP8J9xqr?dW$HXbCoTjw+>EI2IwK}Gmb7x8g=dLz&n>K;{0@(hW-Xr zP=PJYi`79W=K7!>%~WkXNUHtmD8ky%M3E0D(w7O~;6=Vu4%sl*A&4-^f$opxerSm+ zbRZ`NnNyM+UNRC3t@s`}Pz{2|7wY8+jC!(HSLUOp88_`?Ll*{kTh1J)Fn_fw=?uCm zGRwv^dKBL^4Ry=T15L6!p-3VV4xh;@I0Q>Q55JPjtk0Sfo3wiwHSyrtwZ%tS z#O3GDnRQP7&Ih==ieybR5ASk(d?}iBL9>6th4@lL7&=x{o8J?3rU`Y_N7}&YUJPsC z2Vvq=J1L5M!^`2FdtW57zUxARMH-rD$oN)h5EkW?7zB= z(P9?DKdc=;x<$&)_~IwrH{7;7*|%-135_7q>t3D4any zuIdybjT}3A*kI9@Bi#9^By-MC-n;g5lV7t`n!#;8>_Ej2Xhs@5>cm^3tTF2#eZM53 z(bIZTX~+V6evt6v~KoAKi|jqy`ETZO35 z&!i95QOiZMMAZ(OP-wiLGKhm%<~4K(=hKzl9~GHf9MlrU8buP}Kdw*ZIK?NRQ6VUt7+>rf8+^#VGmk zQIx@!P^vVmZYeZTy7;<(?w-X3i@T3tx^FW9?e)}VT6Chfc%f|IUBOo0A*x3C3m#QO z#Q$LIEaRGv+o-Ri0v4qrB0U(Pgmg|q*d`&MAUOr3Ll_{93Q9}CUTK&5BI`bog*10tniswDJ<>Q$bi$lDn)N?ggO!sQ#lXy~13Ib%UjpsYa zATxu!5IF?f=fm8-*#%g+&3_#{Ft}RY)Cw&=7J8rOpF-rmK_b)lJV~$j_3ggs==Q%; zgQq>6lkt2M@3<^@4*TK&qU33gkpHDV(?2dy0ZPc}XX;qjepTq=`r@=471Su<=&VY* zr)XWdBKd+VCtu6)NKtsAg>#3QDj=7|ZqcgvwzyA=1x`a*Bk_{5Gb4>Nb)J5?;pAuglB0heJ zt1W2Yxy9P!c6!0f1t!kF!!0M3mdx6Dy!Fw$oDX)96 zIch@c7KtaC_3S{!5d3QiGQByY_)|h)(|?LCML(cf>iYNR?HbOx^A)e7ujbDVpP1vA z5SmeQ(`A2d)!jDR*aVn;?K+mN^*gEI-hZ~^Qf;AVTXlo!$Qef2;w10B?Q#w)y68}$ zh<^bYPl?&MR#wAbw5e^+y}i7L*l)`)>$qIKZ2(3EEPJ&#b|loWQ8UbajLY7%PF3TMth>QoSi7P?^ z^n<3o&J7b>5ppGGkB}jAR-}%&uHj+_&a>Tq)uG?T6~uq%z(TS3@V5cdgJXjGz2v3A zah*Wz@6KdSv|CVhOY`>bZ#ClK?AaN1S-O4@ZbqsCOo*-I1VaC@d6f;j48CUb!Z=1? z6%S(0Wil%^f+E#sz_)v{znyFZ_Av52-72yJe;<_;$ZLB=QcO<%0KVeL%~aL7Py_um zMQU9wnqsD00>;=%^LdE=VBdeMZ*#GzBPMp{A&!TVk10P|2Y_uUc%K!A4VNg2mpasE zG`1LDsu4UF2c715sZ^6ZpAb^+?JNd&eDHgZ9aqB~x16|p#gP**W6hfW8`c2VX1>&? z_l{)EXC)!qCA7WN&Z_^JTNJvYtSFgLeeegl6#6WTw3tUYz%pB8ja3Z3dqV92F|t_o z-)5|xzT7DuZmoOjkq~pSumC1#3NmctotHXV+$5cEVRY-*HJ&jP1zeyd+ZTJ#c3zQnQ};fx}Qt1Q_t~^fCVz zpOuuJOVxu8s{TnQ&{J`A9a+&cN{hEJm}9)EN++9%-z=Clb7l+UDGd6}`0ilfT+x}d zaosD?%Cs?yt#JYpu@prPsokxEVY(^I%CqZ+IXqXAVgR_<50Mh`%5g+e8NM1{?y0B} zaq=U-5}2+A+dVc6l>o6n0mmC1BNYETZS7nsGB@aZ>)BNi;zOQy;c1iACSrs19|F3g z9gufI7Y^xI^CDt*N?Flfk#@@#8k3A;49GX|SBUw98Lg4G)5^OOp}PY`S|Hkf05nI_ zN%T#sp|h^-8Movs&dRUd=cAu=+Lz8;xCl|FvS4TIKHr^Mork-gs{*u7SC{;JTHboA z{brog$Jto&i_eO<^4}rEzbKr`GKt33fc)YIJOm!YHDtC88$y5}&0%>}%2lco8Z95( z=+z0sr*Wo|=i+#!Fbag*eXQ8mJ@;{Jq5g|4++`cZn8atgUfSw)SR=hC`?e7z>>5*ZfvtsWTI$Wr>y4WBiF15}-0)mLXT zTTeZ857g%9I0yF>YL+=()v=skw_yI(Kf3?D*SN9g#FtA-&OOBuaj}Xz2%{JVp80wm zq^xrGbf!xy@z5K216k^Mpx$Fz3`oUR`8fyWQR_LK4|Vn{0K-Y{E98;_TsbJEbmYv5 zn5Z)9wL8{`oyZ;Vk2mo+gl*6`^31Kh;#(wK{MR%n0Mnn^?e zbC~b>T#t+Av_a7J;8Ps`jpyDSW~g_S_xcmp_WdrnB9SpbCgr~mcH%ome!*eO*YHZy zEHM$l7s$CzZF0Y7!~WOowl@uD$?GH6f8*y|#pEk|8)Byj3J8hDCj3X~y^YW?VHj@t zteeNYv5G3%m#v%5_Ah*dK})>+B9hh>x%kfQ7iLd?p;E$$$e}35P}_XF{gJu;K)HdF zvLgPWmo+P=Y;_4>Fbnt)}LsDBIQJKtQD(TtS`5|694cn0g! z>`Xl9zvU8LUdg5I%3rz?8NMtd4iUAt61;7|xFqZSZ`n`S13H(h!jp6~f5JB~4jnS7 zyU*mV2Wh^2#5nb6_%WgCS>fuLm+}qyJMdz)nkH5k)2gwP2_N6Kr4cPe;W=)B9-#xn zmHUD%|G^n84$@XY`uY04PqG+U*3~zYM^jP&Zil`vp5c<|ZP3!JuPcjTk5-GsFx~o5 zLO~DEeC-E7%~J2%)(;&Is0=$?^dBJs}ypid2q*J_f~j&SkT{eJSpCjdF{B#Dza) z%XsCQAP{x}4*O-ySB|wZ5d3>|~- zIr63lvYj^$eSb9O31KApJjS*C2f#tAtIAeXLhExIRr-4bJH~} zB?skoL-SF~=mY=kFGV+ujenWWgDe|awm(~LQ@KL3uk@tlC$FiU5<{I}|{!_)mR#Eg8`fsP!Q7R}3pyFfAg) zXU>DsNSZ73oV|j^-cgU@fBY(#)%a3V(*J~{R~M_IbhsNP3(YF_1bf6Jiqz-~lB z0pvw>XB-oWqF~MPS)`*{%i#eEo#Ci_bJ~HrF(HR&t~QmApY#aQYZsm>LDwIxDUq`} zig}k8s*gV@z6+oE?Wzi2Hh;C~+SuG*o*x|wmX4P_L{U$b-6mfHPsbo#?tRx~@1tJu ziKnr2T^%O`rlx0~Bhj+Y z-+C7ZG}PbSCcALavwnYTy~nAM*;P_v^KC}qdPe~W9>l*lw}%hEqK zZpwwTt!ZYUw%IE`EF$!i!<(u|ul`pc;-BrKA3zwVV~CHo@H78EZLW2ba@7p=(2nr0 z;XmEmT_}kgN_z;_+Xu%#jP&K)zUU9+uy8xoSj1$Jr{N}iA#L$)o|I!#U**l(UDsw9 z3evFkgpX@F=5T;^ioO3KuI5K41-I88?z-(9HiceL8!Y4I4}rE511*2=?T56HKU2Ke z3v8VcPE>D8H-3l;!M~7y6^u)pL7mKo3%iEB)DYFPxlcHF9{PwHZ8d_>NA|*+&{)bP zk@}nR>8x*BA*MEdtZ%zd19{aNW130|l59q z9b}AB5ZmbPNRUd!GBdca6u2U5r0yR8Ld?QYUS=Mw1@N=%B>Z6H)MNBNPdOogH{aac ze^gfE{|&6MNEcm9I~`upzklIMwQV%7yk!PhKl7 zs^zACxe%^8+md_-yf}B`bqgq?f5juA=r!=K(2CVI?S)BBB+FhD`TKbSmsJBop8p>r z_yEPwzMyk^xl9X7=}xD&5bJdJ=z1u5h3^7*r+>taFY}6U*oV~DNiF3QA0ZI*Q*m8O z?@d)BBO*r)8%C=p>}x$f2NmXCblSS(`UvMq+8;#ioDC!94$`_*Up##JpsInIqw6Bw z4u>m<^aiQU+^ZoB8(q`d5SR4$v5sNK72SlnHq3(c&HdmK;%IB!~7qkJ&TG zYo!t5H92MUb|KNWl!r5sTns1LP!qOS4)$-NiUJr!I*hBTW|6(2$!~&!=5`GC@wLa> zL5qY-kE^GZtR0B%I)_ajOUY=_9UihKYr~fD1>f0)D@XyAytVYu3a%{)f<(EU80LdmCxY70LG;i)e?IT*9TKpnBrCv6l6Qd_3YlovL}T* zIm9?<_#MHke$nYdB~5-du-4FmE8;~i%9Mw~Q`ZId$xFnjMaJ`zO!MsDhJ(xQ$ z2&B_^9x;uAj2v2cAjuH{0JR2W!*Y-Kmi%VPV~VS-AA;UGBBaN>2nWwyZkmU*v>(H+ z|H^0j{_fe&WhiqOOGy2Hf#PgFRKvAE95o`%`E6H-Pc^#JQ z3lj5uDmYN<@!@`S#hFC~s;=BYBV2a~6+YRYq3ML2%j8CF+3fC_Rq4!>9X;zp+uulH z)8+vVk41GKY_mNq>I=RXiFxJM7$(6_|6qQk>#bn=7^bG#Rp$Y~Y@gW}I>!YWcE<;$ zH%q4(HT|e5i1(LQYL!nO@DZQ_6<;tp$A@4854y(dy!mBJoffV$8#T1z=*_J=X)Y85 z3AplecfjLzTYjt~=fd%%)2FqUdDsS#v3F@MWKWYL|yE=C514LMGcg#bS)ZLeQp*=7uZ_gR(VovfTV8U5X~f3Ae>{-l3tp<2DcX{s?lL-*C7_REYCkPDCa zdWHi?4~Sfi{c35{o_`R!i{da7I~57%P4>kCloS)wyS($V!XF|zHmJbDG-b6lY+Qo;f2_|D7_c%du{;9@1=qQceN_&_Vio zlFEwU5d;9_31~WtTz(>TuWi>Q$7P~0Zfyh|5N(ElXPjO|(f`-1|AyA83J-5@kCNta z1gZNG9;A(=C!`*lJ871R-aO)L;l1;iA(N2A~9LB=J}F zhu%k5#}l5>V$l6ke}e1kg2c>2vxmFa-NL(YvvEhHF^Retp9rY^Y!|E$wrxA@#o zQ!no!i9LASmeN(R%Y8xDgL^$*aU$y9R4Di@o+`|_Ksmb~3>CsW)<&=5V!O{jI`zS> z2X*Nqzj;dnOBSbq$l?ORi;xi))u0OBb5BE~LSL(LAq)XxF5+L^`&lr>AH-;FuoHVR zsdHl2vTj}%^2MThqVISrR2KO9=!5z?&MJ_n`EIIR#{2cGVdoWhZh|(ewX6gM#Kz6` zbcEi1j;&maX(SKN$4sg4J?ZyRmakJ2=15dLot3wQ(K>0}*QLFoAM7(ul@MV7E_%od z0xI&?tish+3&`~DnXpr4O}APT@N8k^L+O1QdliUSTo^RUiB?5BR4ey2m ztSn{=x_&fG<~9R#=svwtX`Ub5QOM+ZDpum$gZyzSY)^3H%yGuuJUzLpsb29mVFRhS zmm`DS&=Fy2uO*INvmVo1RXN8>I7()w?1i329Ct63;!kT2?EeCCO@^v-Ujv zQN@L1b2eq4(P#WF$Z9QP93pcPS1}GV@LDMfEwnQ2u}V!mHxpGb0(+jfH~h?CV%IW7 zxXeeVPN)dRa#lN8RNr7>rJn5o)Y-M^J3hX+&W#&4M; zWLB0!F>Cr)a7U94ov!+<&-ZJxULDr3%2ARU78sksD?fMyo_;zoZf_5UTjk|$)_l>k zFF6VR=dNv2TovqEcqnPD+LeCLKIy?$&@d9nk^yu6O#AjAc!~**&3XVU)SZ$BF*g{R zZhQM(bzm+TLMa1af>if>dPAid=N%oY=y47U*JxwCWw1l<6k>P**W31ZMG*ntcX?cm zN_-VOh$Z~z@zqJQEvNCX3bLB?U0%ghbLux z+cUM}+RA78=}}yCTd=l=>tDl(ULYc2LU-^b^ckOG6cb+@8v$6vF8C$(Y*VY4S%xw& zVA*MXm&u-<=NqYaCOaL_1H5(oPYhxRxDiX(pt?!(37eI_J=A=vr1ZBE;fz%f*(^=Q zZiE8tDtYI6ei|BPa$6g$OSwcN?Csj4Ks>xIBKa|BctOslQqgL$YbOU~;6!jU%Cq{2 z5yuC9;tIr<+^35cVib%J8JM5Y`cV5+#<1m3p>HzhW!cjM zzw%svRF^xr-GegM$8B%FXT}Q88PpGw1Syi7WU12;eFIUB=Ei_C%j|@c54tBy;W6nO zMC|`Cu@Yiuk!L}9#l&-;LcF-b{R6F5l%j^*t+2BmM)gBSGOKiet~lbOr+k5G?>z7Q zlv7>(ZbGx7h9q8lqWZnl;|8;8ZhSKCI37o{DZM?4-8tokkLOXs&bA>#+W_vDhDj&(A(~0^c+@P0%VgJl?y0hm^cL+8S!Yk}- zq-3p!S$eU`)WGZOqZ?yaKjL**8<;a;8V0j`?oH*tN5GB$1`J!XR!1YiiKzB*XHTzxT!Q+RG#s$COV(~ zQT2B1*k40>uX8T!EN>04TF3*;s6feWD?P(k)qDe|A!?gYR zF`BcN5Oj+fb$Ug5`{-W(5516aq&ZOnjK9pyFIl1fB}OSxdCDB-ada+f=XW$a`5!Lu zC>}(OZbb@1;QE)JtrRdbE*?pHcs^Jrwd{E)pWllXRuVi|(=x28>CqOnb|%Bschl%k zQ<7z9rthgek@F_hEPyGurJ+||lX6-FL!!ESkpEvYKhCrc&$21YCozV36xnBghp`V3 z+vL@FyZiTvZe+53I}uVIelIQ$7Zb04SDP$*J&tKG z8cCQ?W4k1ZW8p82q)+_)+0647C^?|s(&u5<KaGEr1TKJ&pE+k2(lonxNYlraIS{B*(o{)+uR_0M|LaPfnuDIpBR zMjl_U_%OYNcNL2cr$%)InOjk4M#X?~7>0M9aNtk*x(te0#ou;FF$=u6EPUK^G>L^W zC~;U$7iMg9SpPrMKzka~f{l#V&k4)J1_trVlaSLyo^zG1ff`y+LEzu?uJeaQRWaXw zJhG*714Kk>wWEZMn7(V7qOlWlm1AHP#nvbK+3H{kBZ+6ZcA{vui{Lrb;ET#(KQQSR z4lY=~n$({dxa%Nz55MQ_+|saF0y2vaHr`KuqWt$NiAO1J1)gL-W0EAiUP8#mSO47J zyGxa>`;t)k@MmUFerB^QM_}5KUGDh-!g&$C=+~XbS2lpZHJ69j-!cwDxfkxeMPZYg zGMI}kZGjf;3REFZmvuO5@#9EJWq;>STNidpsqd(uM9FGx5M`hYUj14UU6T}p@>XGG zOA(d}uKuqn-G9o7On+*F-jN(7MkHaN>Vx+y_7O+wEf(ONmmGUqc?H^2NIiPl_ksKxAEaUC0@~dLT^u&X z=8P-#^K#6&v6X__tuy!qi0aBV(=s)XOatxx?k-xV&65U857Ofgd97|HE?jbc1X7Td z`QHal4qfN(ZcwiNlm=5E^2hFHuKg6_3apUj!Du!S+>XrQv^vgTWW}t%jdg+>MgF<$ zUu_jty{MMdeClJ*s5U<&7knccfa=?>a|&(a#`nHt@^ciCwubw-kyc5u$^(P-BLpU{P!<523h z6fi|0J2?cRAoMCNe7-@AqVaIg(=x$tF?GT9_$q7TT-hp2a34xBq$;z$Pkk|pRvrc( zMg8BYqR+QUEY;aH;I7MNt4noMp~1g@B7{7=if~`GTv<~&Bnm;xfqS2|)%B;QJ)cnY zslSBye6T&(1yF~02xMpV#I0FQXDMlCq{DOOgo(*U=3H>R!#7?9bYa()1k0*c3pU|_PlE82cr9Qvh82D`il@aUkN0miSaq>kV9cUyj zL}a3d<8SiH7E_c?6sQb!){duGZWJtv=JwOg8$f<48Tg#h(W$2r+N}d*`J|+^zaLF8 zNf%W0J=U1e!}@5)o*VZKk)BCjg>L=SWnhv0Z{BWR8z!IBlDJ~i~K z-L?`0RZweL)DA9h0B+@YmF>BmTN5@SAiP;`EB+rb)laixi%on?`jGO7AEdm+zV