From 94c34ad5b5fa3bcaba3c3ad0f4a2e1d6801a3dfd Mon Sep 17 00:00:00 2001 From: yashita-egov Date: Wed, 9 Oct 2024 16:42:06 +0530 Subject: [PATCH 1/2] added search project type from mdms --- .../lib/blocs/project/project.dart | 67 +++++++++++++- .../lib/blocs/project/project.freezed.dart | 89 +++++++++++++++++-- .../secure_store/secure_store.dart | 21 +++++ .../lib/data/repositories/remote/mdms.dart | 32 +++++++ .../models/entities/mdms_module_enums.dart | 4 + .../entities/mdms_module_enums.mapper.dart | 8 ++ .../lib/utils/extensions/context_utility.dart | 19 ++-- 7 files changed, 225 insertions(+), 15 deletions(-) diff --git a/apps/health_campaign_field_worker_app/lib/blocs/project/project.dart b/apps/health_campaign_field_worker_app/lib/blocs/project/project.dart index fbeffcd3cb..4d6c53f062 100644 --- a/apps/health_campaign_field_worker_app/lib/blocs/project/project.dart +++ b/apps/health_campaign_field_worker_app/lib/blocs/project/project.dart @@ -24,6 +24,7 @@ import '../../data/repositories/remote/bandwidth_check.dart'; import '../../data/repositories/remote/mdms.dart'; import '../../models/app_config/app_config_model.dart'; import '../../models/auth/auth_model.dart'; +import '../../models/entities/mdms_module_enums.dart'; import '../../models/entities/roles_type.dart'; import '../../utils/background_service.dart'; import '../../utils/environment_config.dart'; @@ -153,6 +154,7 @@ class ProjectBloc extends Bloc { loading: true, projects: [], selectedProject: null, + projectTypes: [], )); final connectivityResult = await (Connectivity().checkConnectivity()); @@ -292,10 +294,40 @@ class ProjectBloc extends Bloc { } } + List? projectTypes; + + try { + projectTypes = await mdmsRepository.searchProjectType( + envConfig.variables.mdmsApiPath, + MdmsRequestModel( + mdmsCriteria: MdmsCriteriaModel( + tenantId: envConfig.variables.tenantId, + moduleDetails: [ + MdmsModuleDetailModel( + moduleName: ModuleEnums.hcmProjectTypes.toValue(), + masterDetails: [ + MdmsMasterDetailModel(ModuleEnums.projectTypes.toValue()), + ], + ), + ], + ), + ).toJson(), + ); + emit(state.copyWith(projectTypes: projectTypes)); + } catch (_) { + emit( + state.copyWith( + loading: false, + syncError: ProjectSyncErrorType.projectType, + ), + ); + } + emit(ProjectState( projects: projects, loading: false, syncError: null, + projectTypes: projectTypes, )); if (projects.length == 1) { @@ -313,11 +345,22 @@ class ProjectBloc extends Bloc { projects.removeDuplicates((element) => element.id); final selectedProject = await localSecureStore.selectedProject; + final getSelectedProjectType = await localSecureStore.selectedProjectType; + final currentRunningCycle = getSelectedProjectType?.cycles + ?.where( + (e) => + (e.startDate!) < DateTime.now().millisecondsSinceEpoch && + (e.endDate!) > DateTime.now().millisecondsSinceEpoch, + ) + .firstOrNull; + emit( ProjectState( loading: false, projects: projects, selectedProject: selectedProject, + selectedProjectType: getSelectedProjectType, + selectedCycle: currentRunningCycle, ), ); @@ -542,6 +585,11 @@ class ProjectBloc extends Bloc { ).toJson(), ); + final selectedProjectType = state.projectTypes + ?.where((element) => element.id == event.model.projectTypeId) + .toList() + .firstOrNull; + final rowversionList = await isar.rowVersionLists .filter() .moduleEqualTo('egov-location') @@ -566,6 +614,7 @@ class ProjectBloc extends Bloc { ); await boundaryLocalRepository.bulkCreate(boundaries); await localSecureStore.setSelectedProject(event.model); + await localSecureStore.setSelectedProjectType(selectedProjectType); await localSecureStore.setBoundaryRefetch(false); final List rowVersionList = []; @@ -601,6 +650,7 @@ class ProjectBloc extends Bloc { LeastLevelBoundarySingleton() .setBoundary(boundaries: findLeastLevelBoundaries(boundaries)); await localSecureStore.setSelectedProject(event.model); + await localSecureStore.setSelectedProjectType(selectedProjectType); } await localSecureStore.setProjectSetUpComplete(event.model.id, true); } catch (_) { @@ -610,10 +660,21 @@ class ProjectBloc extends Bloc { )); } + final getSelectedProjectType = await localSecureStore.selectedProjectType; + final currentRunningCycle = getSelectedProjectType?.cycles + ?.where( + (e) => + (e.startDate!) < DateTime.now().millisecondsSinceEpoch && + (e.endDate!) > DateTime.now().millisecondsSinceEpoch, + ) + .firstOrNull; + emit(state.copyWith( selectedProject: event.model, loading: false, syncError: null, + selectedProjectType: getSelectedProjectType, + selectedCycle: currentRunningCycle, )); } @@ -650,6 +711,9 @@ class ProjectState with _$ProjectState { const ProjectState._(); const factory ProjectState({ + List? projectTypes, + ProjectTypeModel? selectedProjectType, + ProjectCycle? selectedCycle, @Default([]) List projects, ProjectModel? selectedProject, @Default(false) bool loading, @@ -669,5 +733,6 @@ enum ProjectSyncErrorType { projectFacilities, productVariants, serviceDefinitions, - boundary + boundary, + projectType, } diff --git a/apps/health_campaign_field_worker_app/lib/blocs/project/project.freezed.dart b/apps/health_campaign_field_worker_app/lib/blocs/project/project.freezed.dart index 4d3114fe11..f8ae167757 100644 --- a/apps/health_campaign_field_worker_app/lib/blocs/project/project.freezed.dart +++ b/apps/health_campaign_field_worker_app/lib/blocs/project/project.freezed.dart @@ -318,6 +318,11 @@ abstract class ProjectSelectProjectEvent implements ProjectEvent { /// @nodoc mixin _$ProjectState { + List? get projectTypes => + throw _privateConstructorUsedError; + ProjectTypeModel? get selectedProjectType => + throw _privateConstructorUsedError; + ProjectCycle? get selectedCycle => throw _privateConstructorUsedError; List get projects => throw _privateConstructorUsedError; ProjectModel? get selectedProject => throw _privateConstructorUsedError; bool get loading => throw _privateConstructorUsedError; @@ -335,7 +340,10 @@ abstract class $ProjectStateCopyWith<$Res> { _$ProjectStateCopyWithImpl<$Res, ProjectState>; @useResult $Res call( - {List projects, + {List? projectTypes, + ProjectTypeModel? selectedProjectType, + ProjectCycle? selectedCycle, + List projects, ProjectModel? selectedProject, bool loading, ProjectSyncErrorType? syncError}); @@ -354,12 +362,27 @@ class _$ProjectStateCopyWithImpl<$Res, $Val extends ProjectState> @pragma('vm:prefer-inline') @override $Res call({ + Object? projectTypes = freezed, + Object? selectedProjectType = freezed, + Object? selectedCycle = freezed, Object? projects = null, Object? selectedProject = freezed, Object? loading = null, Object? syncError = freezed, }) { return _then(_value.copyWith( + projectTypes: freezed == projectTypes + ? _value.projectTypes + : projectTypes // ignore: cast_nullable_to_non_nullable + as List?, + selectedProjectType: freezed == selectedProjectType + ? _value.selectedProjectType + : selectedProjectType // ignore: cast_nullable_to_non_nullable + as ProjectTypeModel?, + selectedCycle: freezed == selectedCycle + ? _value.selectedCycle + : selectedCycle // ignore: cast_nullable_to_non_nullable + as ProjectCycle?, projects: null == projects ? _value.projects : projects // ignore: cast_nullable_to_non_nullable @@ -389,7 +412,10 @@ abstract class _$$ProjectStateImplCopyWith<$Res> @override @useResult $Res call( - {List projects, + {List? projectTypes, + ProjectTypeModel? selectedProjectType, + ProjectCycle? selectedCycle, + List projects, ProjectModel? selectedProject, bool loading, ProjectSyncErrorType? syncError}); @@ -406,12 +432,27 @@ class __$$ProjectStateImplCopyWithImpl<$Res> @pragma('vm:prefer-inline') @override $Res call({ + Object? projectTypes = freezed, + Object? selectedProjectType = freezed, + Object? selectedCycle = freezed, Object? projects = null, Object? selectedProject = freezed, Object? loading = null, Object? syncError = freezed, }) { return _then(_$ProjectStateImpl( + projectTypes: freezed == projectTypes + ? _value._projectTypes + : projectTypes // ignore: cast_nullable_to_non_nullable + as List?, + selectedProjectType: freezed == selectedProjectType + ? _value.selectedProjectType + : selectedProjectType // ignore: cast_nullable_to_non_nullable + as ProjectTypeModel?, + selectedCycle: freezed == selectedCycle + ? _value.selectedCycle + : selectedCycle // ignore: cast_nullable_to_non_nullable + as ProjectCycle?, projects: null == projects ? _value._projects : projects // ignore: cast_nullable_to_non_nullable @@ -436,13 +477,31 @@ class __$$ProjectStateImplCopyWithImpl<$Res> class _$ProjectStateImpl extends _ProjectState { const _$ProjectStateImpl( - {final List projects = const [], + {final List? projectTypes, + this.selectedProjectType, + this.selectedCycle, + final List projects = const [], this.selectedProject, this.loading = false, this.syncError}) - : _projects = projects, + : _projectTypes = projectTypes, + _projects = projects, super._(); + final List? _projectTypes; + @override + List? get projectTypes { + final value = _projectTypes; + if (value == null) return null; + if (_projectTypes is EqualUnmodifiableListView) return _projectTypes; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + @override + final ProjectTypeModel? selectedProjectType; + @override + final ProjectCycle? selectedCycle; final List _projects; @override @JsonKey() @@ -462,7 +521,7 @@ class _$ProjectStateImpl extends _ProjectState { @override String toString() { - return 'ProjectState(projects: $projects, selectedProject: $selectedProject, loading: $loading, syncError: $syncError)'; + return 'ProjectState(projectTypes: $projectTypes, selectedProjectType: $selectedProjectType, selectedCycle: $selectedCycle, projects: $projects, selectedProject: $selectedProject, loading: $loading, syncError: $syncError)'; } @override @@ -470,6 +529,12 @@ class _$ProjectStateImpl extends _ProjectState { return identical(this, other) || (other.runtimeType == runtimeType && other is _$ProjectStateImpl && + const DeepCollectionEquality() + .equals(other._projectTypes, _projectTypes) && + (identical(other.selectedProjectType, selectedProjectType) || + other.selectedProjectType == selectedProjectType) && + (identical(other.selectedCycle, selectedCycle) || + other.selectedCycle == selectedCycle) && const DeepCollectionEquality().equals(other._projects, _projects) && (identical(other.selectedProject, selectedProject) || other.selectedProject == selectedProject) && @@ -481,6 +546,9 @@ class _$ProjectStateImpl extends _ProjectState { @override int get hashCode => Object.hash( runtimeType, + const DeepCollectionEquality().hash(_projectTypes), + selectedProjectType, + selectedCycle, const DeepCollectionEquality().hash(_projects), selectedProject, loading, @@ -495,12 +563,21 @@ class _$ProjectStateImpl extends _ProjectState { abstract class _ProjectState extends ProjectState { const factory _ProjectState( - {final List projects, + {final List? projectTypes, + final ProjectTypeModel? selectedProjectType, + final ProjectCycle? selectedCycle, + final List projects, final ProjectModel? selectedProject, final bool loading, final ProjectSyncErrorType? syncError}) = _$ProjectStateImpl; const _ProjectState._() : super._(); + @override + List? get projectTypes; + @override + ProjectTypeModel? get selectedProjectType; + @override + ProjectCycle? get selectedCycle; @override List get projects; @override diff --git a/apps/health_campaign_field_worker_app/lib/data/local_store/secure_store/secure_store.dart b/apps/health_campaign_field_worker_app/lib/data/local_store/secure_store/secure_store.dart index 240fc216d7..9e70ed8184 100644 --- a/apps/health_campaign_field_worker_app/lib/data/local_store/secure_store/secure_store.dart +++ b/apps/health_campaign_field_worker_app/lib/data/local_store/secure_store/secure_store.dart @@ -225,4 +225,25 @@ class LocalSecureStore { return false; } } + + Future get selectedProjectType async { + final projectBody = await storage.read(key: selectedProjectTypeKey); + if (projectBody == null) return null; + + try { + final projectType = + ProjectTypeModelMapper.fromJson(json.encode(projectBody)); + + return projectType; + } catch (_) { + return null; + } + } + + Future setSelectedProjectType(ProjectTypeModel? projectType) async { + await storage.write( + key: selectedProjectTypeKey, + value: json.encode(projectType), + ); + } } diff --git a/apps/health_campaign_field_worker_app/lib/data/repositories/remote/mdms.dart b/apps/health_campaign_field_worker_app/lib/data/repositories/remote/mdms.dart index c06bc556cb..a8fd06b18b 100644 --- a/apps/health_campaign_field_worker_app/lib/data/repositories/remote/mdms.dart +++ b/apps/health_campaign_field_worker_app/lib/data/repositories/remote/mdms.dart @@ -8,8 +8,10 @@ import 'package:isar/isar.dart'; import '../../../models/app_config/app_config_model.dart' as app_configuration; import '../../../models/mdms/service_registry/pgr_service_defenitions.dart'; import '../../../models/mdms/service_registry/service_registry_model.dart'; +import '../../../models/privacy_notice/privacy_notice_model.dart'; import '../../../models/role_actions/role_actions_model.dart'; import '../../local_store/no_sql/schema/app_configuration.dart'; +import '../../local_store/no_sql/schema/project_types.dart'; import '../../local_store/no_sql/schema/row_versions.dart'; import '../../local_store/no_sql/schema/service_registry.dart'; @@ -112,6 +114,7 @@ class MdmsRepository { FutureOr writeToAppConfigDB( app_configuration.AppConfigPrimaryWrapperModel result, PGRServiceDefinitions pgrServiceDefinitions, + // List projectTypes, Isar isar, ) { final appConfiguration = AppConfiguration(); @@ -374,6 +377,8 @@ class MdmsRepository { return reasonTypes; }).toList(); + // appConfiguration.projectTypes = projectTypes; + isar.writeTxnSync(() { isar.appConfigurations.putSync(appConfiguration); isar.rowVersionLists.putAllSync(rowVersionList); @@ -392,4 +397,31 @@ class MdmsRepository { rethrow; } } + + //To Search Project Type from MDMS + Future> searchProjectType( + String apiEndPoint, + Map body, + ) async { + try { + final response = await _client.post(apiEndPoint, data: body); + + final jsonData = json.decode(response.toString())['MdmsRes'] + ['HCM-PROJECT-TYPES']['projectTypes'] as List; + + List projectTypes = jsonData + .map((e) => ProjectTypeModelMapper.fromJson(json.encode(e))) + .toList(); + + return projectTypes; + } on DioException catch (e) { + AppLogger.instance.error( + title: 'MDMS Repository', + message: '$e', + stackTrace: e.stackTrace, + ); + + rethrow; + } + } } diff --git a/apps/health_campaign_field_worker_app/lib/models/entities/mdms_module_enums.dart b/apps/health_campaign_field_worker_app/lib/models/entities/mdms_module_enums.dart index 7c52d89923..5cecd5bf58 100644 --- a/apps/health_campaign_field_worker_app/lib/models/entities/mdms_module_enums.dart +++ b/apps/health_campaign_field_worker_app/lib/models/entities/mdms_module_enums.dart @@ -15,4 +15,8 @@ enum ModuleEnums { moduleVersion, @MappableValue("RAINMAKER-PGR") rainmakerPgr, + @MappableValue("HCM-PROJECT-TYPES") + hcmProjectTypes, + @MappableValue("projectTypes") + projectTypes, } diff --git a/apps/health_campaign_field_worker_app/lib/models/entities/mdms_module_enums.mapper.dart b/apps/health_campaign_field_worker_app/lib/models/entities/mdms_module_enums.mapper.dart index 8910d16b3a..421dea741c 100644 --- a/apps/health_campaign_field_worker_app/lib/models/entities/mdms_module_enums.mapper.dart +++ b/apps/health_campaign_field_worker_app/lib/models/entities/mdms_module_enums.mapper.dart @@ -35,6 +35,10 @@ class ModuleEnumsMapper extends EnumMapper { return ModuleEnums.moduleVersion; case "RAINMAKER-PGR": return ModuleEnums.rainmakerPgr; + case "HCM-PROJECT-TYPES": + return ModuleEnums.hcmProjectTypes; + case "projectTypes": + return ModuleEnums.projectTypes; default: throw MapperException.unknownEnumValue(value); } @@ -53,6 +57,10 @@ class ModuleEnumsMapper extends EnumMapper { return "module-version"; case ModuleEnums.rainmakerPgr: return "RAINMAKER-PGR"; + case ModuleEnums.hcmProjectTypes: + return "HCM-PROJECT-TYPES"; + case ModuleEnums.projectTypes: + return "projectTypes"; } } } diff --git a/apps/health_campaign_field_worker_app/lib/utils/extensions/context_utility.dart b/apps/health_campaign_field_worker_app/lib/utils/extensions/context_utility.dart index cfc8cb45a2..ace31b5407 100644 --- a/apps/health_campaign_field_worker_app/lib/utils/extensions/context_utility.dart +++ b/apps/health_campaign_field_worker_app/lib/utils/extensions/context_utility.dart @@ -42,12 +42,13 @@ extension ContextUtilityExtensions on BuildContext { final projectState = projectBloc.state; final selectedCycle = projectState.selectedProject?.additionalDetails?.projectType?.cycles - ?.where( - (e) => - (e.startDate) < DateTime.now().millisecondsSinceEpoch && - (e.endDate) > DateTime.now().millisecondsSinceEpoch, - ) - .firstOrNull; + ?.where( + (e) => + (e.startDate) < DateTime.now().millisecondsSinceEpoch && + (e.endDate) > DateTime.now().millisecondsSinceEpoch, + ) + .firstOrNull ?? + projectState.selectedCycle; return selectedCycle; } @@ -57,7 +58,8 @@ extension ContextUtilityExtensions on BuildContext { final projectState = projectBloc.state; final projectType = - projectState.selectedProject?.additionalDetails?.projectType; + projectState.selectedProject?.additionalDetails?.projectType ?? + projectState.selectedProjectType; return projectType; } @@ -67,7 +69,8 @@ extension ContextUtilityExtensions on BuildContext { final projectState = projectBloc.state; var projectCycles = - projectState.selectedProject?.additionalDetails?.projectType?.cycles; + projectState.selectedProject?.additionalDetails?.projectType?.cycles ?? + projectState.selectedProjectType?.cycles; if (projectCycles != null && (projectCycles.isNotEmpty)) { List resultList = []; From c50209137352aa645ec99836dc3428ae2c4a69c9 Mon Sep 17 00:00:00 2001 From: yashita-egov Date: Wed, 9 Oct 2024 16:55:32 +0530 Subject: [PATCH 2/2] removed unused code --- .../lib/data/repositories/remote/mdms.dart | 3 --- 1 file changed, 3 deletions(-) diff --git a/apps/health_campaign_field_worker_app/lib/data/repositories/remote/mdms.dart b/apps/health_campaign_field_worker_app/lib/data/repositories/remote/mdms.dart index a8fd06b18b..9176ebcd7f 100644 --- a/apps/health_campaign_field_worker_app/lib/data/repositories/remote/mdms.dart +++ b/apps/health_campaign_field_worker_app/lib/data/repositories/remote/mdms.dart @@ -114,7 +114,6 @@ class MdmsRepository { FutureOr writeToAppConfigDB( app_configuration.AppConfigPrimaryWrapperModel result, PGRServiceDefinitions pgrServiceDefinitions, - // List projectTypes, Isar isar, ) { final appConfiguration = AppConfiguration(); @@ -377,8 +376,6 @@ class MdmsRepository { return reasonTypes; }).toList(); - // appConfiguration.projectTypes = projectTypes; - isar.writeTxnSync(() { isar.appConfigurations.putSync(appConfiguration); isar.rowVersionLists.putAllSync(rowVersionList);