diff --git a/assets/icons/clock.svg b/assets/icons/clock.svg index fd5588b..11bff2c 100644 --- a/assets/icons/clock.svg +++ b/assets/icons/clock.svg @@ -1,4 +1,6 @@ - - + + diff --git a/packages/auth/lib/data/models/local/user_local/user_local_model.dart b/packages/auth/lib/data/models/local/user_local/user_local_model.dart index 0e18269..beb08f2 100644 --- a/packages/auth/lib/data/models/local/user_local/user_local_model.dart +++ b/packages/auth/lib/data/models/local/user_local/user_local_model.dart @@ -1,9 +1,9 @@ -import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/utils/local/local_utils.dart'; part 'user_local_model.g.dart'; -@HiveType(typeId: 0) +@HiveType(typeId: authUserLocalModelTypeId) class UserLocalModel extends HiveObject { @HiveField(0) String? username; @@ -45,7 +45,6 @@ class UserLocalModel extends HiveObject { Module? module, String? backend, String? apiKey, - }) { return UserLocalModel( username: username ?? this.username, @@ -60,7 +59,7 @@ class UserLocalModel extends HiveObject { } } -@HiveType(typeId: 1) +@HiveType(typeId: authModuleTypeId) enum Module { @HiveField(0) liveStocks, diff --git a/packages/chicken/lib/data/datasource/local/chicken_local.dart b/packages/chicken/lib/data/datasource/local/chicken_local.dart new file mode 100644 index 0000000..e02478a --- /dev/null +++ b/packages/chicken/lib/data/datasource/local/chicken_local.dart @@ -0,0 +1,8 @@ +import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart'; + +abstract class ChickenLocalDataSource { + Future openBox(); + Future initWidleyUsed(); + + WidelyUsedLocalModel? getAllWidely(); +} diff --git a/packages/chicken/lib/data/datasource/local/chicken_local_imp.dart b/packages/chicken/lib/data/datasource/local/chicken_local_imp.dart new file mode 100644 index 0000000..2ccd6ed --- /dev/null +++ b/packages/chicken/lib/data/datasource/local/chicken_local_imp.dart @@ -0,0 +1,59 @@ +import 'package:rasadyar_chicken/chicken.dart'; +import 'package:rasadyar_chicken/data/datasource/local/chicken_local.dart'; +import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart'; +import 'package:rasadyar_core/core.dart'; + +class ChickenLocalDataSourceImp implements ChickenLocalDataSource { + HiveLocalStorage local =diCore.get(); + final String boxName = 'Chicken_Widley_Box'; + + + @override + Future openBox() async { + await local.openBox(boxName); + } + + @override + Future initWidleyUsed() async { + List tmpList = [ + WidelyUsedLocalItem( + index: 0, + pathId: 0, + title: 'خرید داخل استان', + color: AppColor.greenLightActive.toARGB32(), + iconColor: AppColor.greenNormal.toARGB32(), + iconPath: Assets.vec.cubeSearchSvg.path, + path: ChickenRoutes.buysInProvince, + ), + WidelyUsedLocalItem( + index: 1, + pathId: 1, + title: 'فروش داخل استان', + color: AppColor.blueLightActive.toARGB32(), + iconColor: AppColor.blueNormal.toARGB32(), + iconPath: Assets.vec.cubeSvg.path, + path: ChickenRoutes.salesInProvince, + ), + + WidelyUsedLocalItem( + index: 2, + title: 'قطعه‌بندی', + color: AppColor.blueLightActive.toARGB32(), + iconColor: AppColor.blueNormal.toARGB32(), + iconPath: Assets.vec.cubeRotateSvg.path, + path: ChickenRoutes.buysInProvince, + ), + ]; + await local.add( + boxName: boxName, + value: WidelyUsedLocalModel(hasInit: true, items: tmpList), + ); + } + + @override + WidelyUsedLocalModel? getAllWidely() { + var res = local.readBox(boxName: boxName); + fLog(res.toString()); + return res; + } +} diff --git a/packages/chicken/lib/data/datasource/remote/chicken_remote.dart b/packages/chicken/lib/data/datasource/remote/chicken_remote.dart new file mode 100644 index 0000000..e6f04b8 --- /dev/null +++ b/packages/chicken/lib/data/datasource/remote/chicken_remote.dart @@ -0,0 +1,155 @@ +import 'package:rasadyar_chicken/data/models/request/change_password/change_password_request_model.dart'; +import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; +import 'package:rasadyar_chicken/data/models/request/create_steward_free_bar/create_steward_free_bar.dart'; +import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart'; +import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart'; +import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; +import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart'; +import 'package:rasadyar_chicken/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.dart'; +import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; +import 'package:rasadyar_chicken/data/models/response/guild_profile/guild_profile.dart'; +import 'package:rasadyar_chicken/data/models/response/imported_loads_model/imported_loads_model.dart'; +import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; +import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; +import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; +import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/segmentation_model/segmentation_model.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; +import 'package:rasadyar_chicken/data/models/response/user_profile/user_profile.dart'; +import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart' + hide ProductModel; +import 'package:rasadyar_core/core.dart'; + +abstract class ChickenRemoteDatasource { + Future?> getInventory({required String token, CancelToken? cancelToken}); + + Future getKillHouseDistributionInfo({required String token}); + + Future getGeneralBarInformation({ + required String token, + Map? queryParameters, + }); + + Future?> getWaitingArrivals({ + required String token, + Map? queryParameters, + }); + + Future setSateForArrivals({required String token, required Map request}); + + Future?> getImportedLoadsModel({ + required String token, + Map? queryParameters, + }); + + Future?> getAllocatedMade({ + required String token, + Map? queryParameters, + }); + + Future confirmAllocation({required String token, required Map allocation}); + + Future denyAllocation({required String token, required String allocationToken}); + + Future confirmAllAllocation({ + required String token, + required List allocationTokens, + }); + + Future?> getRolesProducts({required String token}); + + Future?> getGuilds({ + required String token, + Map? queryParameters, + }); + + Future getProfile({required String token}); + + Future postSubmitStewardAllocation({ + required String token, + required SubmitStewardAllocation request, + }); + + Future deleteStewardAllocation({ + required String token, + Map? queryParameters, + }); + + Future updateStewardAllocation({required String token, required ConformAllocation request}); + + Future getStewardDashboard({ + required String token, + required String stratDate, + required String endDate, + }); + + Future getDashboardKillHouseFreeBar({ + required String token, + required String stratDate, + required String endDate, + }); + + Future?> getStewardPurchasesOutSideOfTheProvince({ + required String token, + Map? queryParameters, + }); + + Future createStewardPurchasesOutSideOfTheProvince({ + required String token, + required CreateStewardFreeBar body, + }); + + Future deleteStewardPurchasesOutSideOfTheProvince({ + required String token, + required String stewardFreeBarKey, + }); + + Future?> getOutProvinceCarcassesBuyer({ + required String token, + Map? queryParameters, + }); + + Future createOutProvinceCarcassesBuyer({ + required String token, + required OutProvinceCarcassesBuyer body, + }); + + Future?> getProvince({CancelToken? cancelToken}); + + Future?> getCity({required String provinceName}); + + Future?> getStewardFreeSaleBar({ + required String token, + Map? queryParameters, + }); + + Future createOutProvinceStewardFreeBar({ + required String token, + required StewardFreeSaleBarRequest body, + }); + + Future updateOutProvinceStewardFreeBar({ + required String token, + required StewardFreeSaleBarRequest body, + }); + + Future getUserProfile({required String token}); + + Future updateUserProfile({required String token, required UserProfile userProfile}); + + Future updatePassword({required String token, required ChangePasswordRequestModel model}); + + Future?> getSegmentation({ + required String token, + Map? queryParameters, + }); + + Future createSegmentation({required String token, required SegmentationModel model}); + + Future editSegmentation({required String token, required SegmentationModel model}); + + Future deleteSegmentation({required String token, required String key}); +} diff --git a/packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart b/packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart new file mode 100644 index 0000000..5d72f8a --- /dev/null +++ b/packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart @@ -0,0 +1,484 @@ +import 'package:rasadyar_chicken/data/datasource/remote/chicken_remote.dart'; +import 'package:rasadyar_chicken/data/models/request/change_password/change_password_request_model.dart'; +import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; +import 'package:rasadyar_chicken/data/models/request/create_steward_free_bar/create_steward_free_bar.dart'; +import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart'; +import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart'; +import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; +import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart'; +import 'package:rasadyar_chicken/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.dart'; +import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; +import 'package:rasadyar_chicken/data/models/response/guild_profile/guild_profile.dart'; +import 'package:rasadyar_chicken/data/models/response/imported_loads_model/imported_loads_model.dart'; +import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; +import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; +import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; +import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/segmentation_model/segmentation_model.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; +import 'package:rasadyar_chicken/data/models/response/user_profile/user_profile.dart'; +import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart' + hide ProductModel; +import 'package:rasadyar_core/core.dart'; + +class ChickenRemoteDatasourceImp implements ChickenRemoteDatasource { + final DioRemote _httpClient; + + ChickenRemoteDatasourceImp(this._httpClient); + + @override + Future?> getInventory({ + required String token, + CancelToken? cancelToken, + }) async { + eLog(_httpClient.baseUrl); + var res = await _httpClient.get( + '/roles-products/?role=Steward', + headers: {'Authorization': 'Bearer $token'}, + + fromJsonList: (json) => + (json).map((item) => InventoryModel.fromJson(item as Map)).toList(), + ); + + return res.data; + } + + @override + Future getKillHouseDistributionInfo({required String token}) async { + var res = await _httpClient.get( + '/kill-house-distribution-info/?role=Steward', + headers: {'Authorization': 'Bearer $token'}, + fromJson: KillHouseDistributionInfo.fromJson, + ); + + return res.data; + } + + @override + Future getGeneralBarInformation({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/bars_for_kill_house_dashboard/?role=Steward', + queryParameters: queryParameters, + headers: {'Authorization': 'Bearer $token'}, + fromJson: BarInformation.fromJson, + ); + return res.data; + } + + @override + Future?> getWaitingArrivals({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/steward-allocation/', + headers: {'Authorization': 'Bearer $token'}, + queryParameters: queryParameters, + fromJson: (json) => PaginationModel.fromJson( + json, + (json) => WaitingArrivalModel.fromJson(json as Map), + ), + ); + return res.data; + } + + @override + Future setSateForArrivals({ + required String token, + required Map request, + }) async { + await _httpClient.put( + '/steward-allocation/0/', + headers: {'Authorization': 'Bearer $token'}, + data: request, + ); + } + + @override + Future?> getImportedLoadsModel({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/steward-allocation/', + queryParameters: queryParameters, + headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => PaginationModel.fromJson( + json, + (data) => ImportedLoadsModel.fromJson(data as Map), + ), + ); + return res.data; + } + + @override + Future?> getAllocatedMade({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/steward-allocation/', + queryParameters: queryParameters, + headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => PaginationModel.fromJson( + json, + (json) => AllocatedMadeModel.fromJson(json as Map), + ), + ); + return res.data; + } + + @override + Future confirmAllocation({ + required String token, + required Map allocation, + }) async { + var res = await _httpClient.put( + '/steward-allocation/0/', + headers: {'Authorization': 'Bearer $token'}, + data: allocation, + ); + } + + @override + Future denyAllocation({required String token, required String allocationToken}) async { + await _httpClient.delete( + '/steward-allocation/0/?steward_allocation_key=$allocationToken', + headers: {'Authorization': 'Bearer $token'}, + ); + } + + @override + Future confirmAllAllocation({ + required String token, + required List allocationTokens, + }) async { + await _httpClient.put( + '/steward-allocation/0/', + headers: {'Authorization': 'Bearer $token'}, + data: {'steward_allocation_list': allocationTokens}, + ); + } + + @override + Future?> getRolesProducts({required String token}) async { + var res = await _httpClient.get( + '/roles-products/?role=Steward', + headers: {'Authorization': 'Bearer $token'}, + fromJsonList: (json) => + json.map((item) => ProductModel.fromJson(item as Map)).toList(), + ); + return res.data; + } + + @override + Future?> getGuilds({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/guilds/', + queryParameters: queryParameters, + headers: {'Authorization': 'Bearer $token'}, + fromJsonList: (json) => + json.map((item) => GuildModel.fromJson(item as Map)).toList(), + ); + return res.data; + } + + @override + Future getProfile({required String token}) async { + var res = await _httpClient.get( + '/guilds/0/?profile', + headers: {'Authorization': 'Bearer $token'}, + fromJson: GuildProfile.fromJson, + ); + return res.data; + } + + @override + Future postSubmitStewardAllocation({ + required String token, + required SubmitStewardAllocation request, + }) async { + await _httpClient.post( + '/steward-allocation/', + headers: {'Authorization': 'Bearer $token'}, + data: request.toJson(), + ); + } + + @override + Future deleteStewardAllocation({ + required String token, + Map? queryParameters, + }) async { + await _httpClient.delete( + '/steward-allocation/0/', + headers: {'Authorization': 'Bearer $token'}, + queryParameters: queryParameters, + ); + } + + @override + Future updateStewardAllocation({ + required String token, + required ConformAllocation request, + }) async { + await _httpClient.put( + '/steward-allocation/0/', + headers: {'Authorization': 'Bearer $token'}, + queryParameters: request.toJson(), + ); + } + + @override + Future getStewardDashboard({ + required String token, + required String stratDate, + required String endDate, + }) async { + var res = await _httpClient.get( + '/steward_free_bar_dashboard/?date1=$stratDate&date2=$endDate&search=filter', + headers: {'Authorization': 'Bearer $token'}, + fromJson: StewardFreeBarDashboard.fromJson, + ); + return res.data; + } + + @override + Future getDashboardKillHouseFreeBar({ + required String token, + required String stratDate, + required String endDate, + }) async { + var res = await _httpClient.get( + '/dashboard_kill_house_free_bar/?date1=$stratDate&date2=$endDate&search=filter', + headers: {'Authorization': 'Bearer $token'}, + fromJson: DashboardKillHouseFreeBar.fromJson, + ); + return res.data; + } + + @override + Future?> getStewardPurchasesOutSideOfTheProvince({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/steward_free_bar/', + queryParameters: queryParameters, + headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => PaginationModel.fromJson( + json, + (json) => StewardFreeBar.fromJson(json as Map), + ), + ); + return res.data; + } + + @override + Future?> getCity({required String provinceName}) async { + var res = await _httpClient.get( + '/iran_city/', + queryParameters: {'name': provinceName}, + fromJsonList: (json) => + json.map((item) => IranProvinceCityModel.fromJson(item as Map)).toList(), + ); + return res.data; + } + + @override + Future?> getProvince({CancelToken? cancelToken}) async { + var res = await _httpClient.get( + '/iran_province/', + fromJsonList: (json) => + json.map((item) => IranProvinceCityModel.fromJson(item as Map)).toList(), + ); + return res.data; + } + + @override + Future createStewardPurchasesOutSideOfTheProvince({ + required String token, + required CreateStewardFreeBar body, + }) async { + var res = await _httpClient.post( + '/steward_free_bar/', + headers: {'Authorization': 'Bearer $token'}, + data: body.toJson(), + ); + } + + @override + Future deleteStewardPurchasesOutSideOfTheProvince({ + required String token, + required String stewardFreeBarKey, + }) async { + await _httpClient.delete( + '/steward_free_bar/0/', + headers: {'Authorization': 'Bearer $token'}, + queryParameters: {'key': stewardFreeBarKey}, + ); + } + + @override + Future?> getOutProvinceCarcassesBuyer({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/out-province-carcasses-buyer/', + queryParameters: queryParameters, + headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => PaginationModel.fromJson( + json, + (json) => OutProvinceCarcassesBuyer.fromJson(json as Map), + ), + ); + return res.data; + } + + @override + Future createOutProvinceCarcassesBuyer({ + required String token, + required OutProvinceCarcassesBuyer body, + }) async { + await _httpClient.post( + '/out-province-carcasses-buyer/', + data: body.toJson()..removeWhere((key, value) => value == null), + headers: {'Authorization': 'Bearer $token'}, + ); + } + + @override + Future?> getStewardFreeSaleBar({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/steward_free_sale_bar/', + queryParameters: queryParameters, + headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => PaginationModel.fromJson( + json, + (json) => StewardFreeSaleBar.fromJson(json as Map), + ), + ); + return res.data; + } + + @override + Future createOutProvinceStewardFreeBar({ + required String token, + required StewardFreeSaleBarRequest body, + }) async { + await _httpClient.post( + '/steward_free_sale_bar/', + data: body.toJson()..removeWhere((key, value) => value == null), + headers: {'Authorization': 'Bearer $token'}, + ); + } + + @override + Future updateOutProvinceStewardFreeBar({ + required String token, + required StewardFreeSaleBarRequest body, + }) async { + await _httpClient.put( + '/steward_free_sale_bar/0/', + data: body.toJson() + ..removeWhere((key, value) => value == null) + ..addAll({'carcassWeight': body.weightOfCarcasses, 'carcassCount': body.numberOfCarcasses}), + headers: {'Authorization': 'Bearer $token'}, + ); + } + + @override + Future getUserProfile({required String token}) async { + var res = await _httpClient.get( + '/system_user_profile/?self-profile', + headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => UserProfile.fromJson(json), + ); + + return res.data; + } + + @override + Future updateUserProfile({required String token, required UserProfile userProfile}) async { + await _httpClient.put( + '/system_user_profile/?self-profile/0/', + headers: {'Authorization': 'Bearer $token'}, + data: userProfile.toJson()..removeWhere((key, value) => value == null), + ); + } + + @override + Future updatePassword({ + required String token, + required ChangePasswordRequestModel model, + }) async { + await _httpClient.post( + '/api/change_password/', + headers: {'Authorization': 'Bearer $token'}, + data: model.toJson()..removeWhere((key, value) => value == null), + ); + } + + @override + Future?> getSegmentation({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/app-segmentation/', + queryParameters: queryParameters, + headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => PaginationModel.fromJson( + json, + (json) => SegmentationModel.fromJson(json as Map), + ), + ); + return res.data; + } + + @override + Future createSegmentation({required String token, required SegmentationModel model}) async { + await _httpClient.post( + '/app-segmentation/', + data: model.toJson()..removeWhere((key, value) => value == null), + headers: {'Authorization': 'Bearer $token'}, + ); + } + + @override + Future editSegmentation({required String token, required SegmentationModel model}) async { + await _httpClient.put( + '/app-segmentation/0/', + data: model.toJson()..removeWhere((key, value) => value == null), + headers: {'Authorization': 'Bearer $token'}, + ); + } + + @override + Future deleteSegmentation({ + required String token, + required String key, + }) async { + var res = await _httpClient.delete( + '/app-segmentation/0/', + queryParameters: {'key': key}, + headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => SegmentationModel.fromJson(json), + ); + + return res.data; + } +} diff --git a/packages/chicken/lib/data/di/chicken_di.dart b/packages/chicken/lib/data/di/chicken_di.dart index ed05229..1c5aece 100644 --- a/packages/chicken/lib/data/di/chicken_di.dart +++ b/packages/chicken/lib/data/di/chicken_di.dart @@ -1,11 +1,17 @@ import 'package:rasadyar_auth/data/services/token_storage_service.dart'; +import 'package:rasadyar_chicken/data/datasource/local/chicken_local_imp.dart'; +import 'package:rasadyar_chicken/data/datasource/remote/chicken_remote_imp.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository_imp.dart'; +import 'package:rasadyar_chicken/hive_registrar.g.dart'; import 'package:rasadyar_core/core.dart'; GetIt diChicken = GetIt.instance; Future setupChickenDI() async { var tokenService = Get.find(); + Hive.registerAdapters(); + diChicken.registerLazySingleton(() => ChickenLocalDataSourceImp()); + diChicken.get().openBox(); diChicken.registerLazySingleton( () => AppInterceptor( @@ -21,6 +27,7 @@ Future setupChickenDI() async { ); tokenService.getBaseUrl(); + diChicken.registerLazySingleton(() { return DioRemote( baseUrl: tokenService.baseurl.value, @@ -29,8 +36,17 @@ Future setupChickenDI() async { }, instanceName: 'chickenDioRemote'); final dioRemote = diChicken.get(instanceName: 'chickenDioRemote'); + await dioRemote.init(); - diChicken.registerLazySingleton(() => ChickenRepositoryImpl(dioRemote)); + + diChicken.registerLazySingleton(() => ChickenRemoteDatasourceImp(dioRemote)); + + diChicken.registerLazySingleton( + () => ChickenRepositoryImp( + local: diChicken.get(), + remote: diChicken.get(), + ), + ); diChicken.registerSingleton(ImagePicker()); } diff --git a/packages/chicken/lib/data/models/local/widely_used_local_model.dart b/packages/chicken/lib/data/models/local/widely_used_local_model.dart new file mode 100644 index 0000000..02d89c7 --- /dev/null +++ b/packages/chicken/lib/data/models/local/widely_used_local_model.dart @@ -0,0 +1,73 @@ +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/utils/utils.dart'; + +part 'widely_used_local_model.g.dart'; + +@HiveType(typeId: chickenWidelyUsedLocalModelTypeId) +class WidelyUsedLocalModel extends HiveObject { + @HiveField(0) + bool? hasInit; + + @HiveField(1) + List? items; + + WidelyUsedLocalModel({this.hasInit, this.items}); + + WidelyUsedLocalModel copyWith({bool? hasInit, List? items}) { + return WidelyUsedLocalModel(hasInit: hasInit ?? this.hasInit, items: items ?? this.items); + } +} + +@HiveType(typeId: chickenWidelyUsedLocalItemTypeId) +class WidelyUsedLocalItem extends HiveObject { + @HiveField(0) + String? title; + + @HiveField(1) + String? iconPath; + + @HiveField(2) + int? iconColor; + + @HiveField(3) + int? color; + + @HiveField(4) + String? path; + + @HiveField(5) + int? pathId; + + @HiveField(6) + int? index; + + WidelyUsedLocalItem({ + this.title, + this.iconPath, + this.iconColor, + this.color, + this.path, + this.pathId, + this.index, + }); + + WidelyUsedLocalItem copyWith({ + String? title, + String? iconPath, + int? iconColor, + int? color, + int? pathId, + int? index, + String? path, + }) { + return WidelyUsedLocalItem( + title: title ?? this.title, + iconPath: iconPath ?? this.iconPath, + iconColor: iconColor ?? this.iconColor, + color: color ?? this.color, + path: path ?? this.path, + pathId: pathId ?? this.pathId, + index: index ?? this.index, + ); + } +} diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken_repository.dart index fe9d23d..1d0aee9 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository.dart @@ -1,3 +1,4 @@ +import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart'; import 'package:rasadyar_chicken/data/models/request/change_password/change_password_request_model.dart'; import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart'; @@ -25,6 +26,7 @@ import 'package:rasadyar_core/core.dart'; import '../models/request/create_steward_free_bar/create_steward_free_bar.dart'; abstract class ChickenRepository { + //region Remote Future?> getInventory({required String token, CancelToken? cancelToken}); Future getKillHouseDistributionInfo({required String token}); @@ -153,4 +155,12 @@ abstract class ChickenRepository { Future editSegmentation({required String token, required SegmentationModel model}); Future deleteSegmentation({required String token, required String key}); + + //endregion + + //region local + Future initWidleyUsed(); + + WidelyUsedLocalModel? getAllWidely(); + //endregion } diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index a0c19c9..6eaf786 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -1,3 +1,6 @@ +import 'package:rasadyar_chicken/data/datasource/local/chicken_local_imp.dart'; +import 'package:rasadyar_chicken/data/datasource/remote/chicken_remote_imp.dart'; +import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart'; import 'package:rasadyar_chicken/data/models/request/change_password/change_password_request_model.dart'; import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; import 'package:rasadyar_chicken/data/models/request/create_steward_free_bar/create_steward_free_bar.dart'; @@ -25,37 +28,26 @@ import 'package:rasadyar_core/core.dart'; import 'chicken_repository.dart'; -class ChickenRepositoryImpl implements ChickenRepository { - final DioRemote _httpClient; +class ChickenRepositoryImp implements ChickenRepository { + final ChickenRemoteDatasourceImp remote; + final ChickenLocalDataSourceImp local; - ChickenRepositoryImpl(this._httpClient); + ChickenRepositoryImp({required this.remote, required this.local}); + //region Remote @override Future?> getInventory({ required String token, CancelToken? cancelToken, }) async { - eLog(_httpClient.baseUrl); - var res = await _httpClient.get( - '/roles-products/?role=Steward', - headers: {'Authorization': 'Bearer $token'}, - - fromJsonList: (json) => - (json).map((item) => InventoryModel.fromJson(item as Map)).toList(), - ); - - return res.data; + var res = await remote.getInventory(token: token, cancelToken: cancelToken); + return res; } @override Future getKillHouseDistributionInfo({required String token}) async { - var res = await _httpClient.get( - '/kill-house-distribution-info/?role=Steward', - headers: {'Authorization': 'Bearer $token'}, - fromJson: KillHouseDistributionInfo.fromJson, - ); - - return res.data; + var res = await remote.getKillHouseDistributionInfo(token: token); + return res; } @override @@ -63,13 +55,8 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, Map? queryParameters, }) async { - var res = await _httpClient.get( - '/bars_for_kill_house_dashboard/?role=Steward', - queryParameters: queryParameters, - headers: {'Authorization': 'Bearer $token'}, - fromJson: BarInformation.fromJson, - ); - return res.data; + var res = await remote.getGeneralBarInformation(token: token, queryParameters: queryParameters); + return res; } @override @@ -77,16 +64,8 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, Map? queryParameters, }) async { - var res = await _httpClient.get( - '/steward-allocation/', - headers: {'Authorization': 'Bearer $token'}, - queryParameters: queryParameters, - fromJson: (json) => PaginationModel.fromJson( - json, - (json) => WaitingArrivalModel.fromJson(json as Map), - ), - ); - return res.data; + var res = await remote.getWaitingArrivals(token: token, queryParameters: queryParameters); + return res; } @override @@ -94,11 +73,7 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required Map request, }) async { - await _httpClient.put( - '/steward-allocation/0/', - headers: {'Authorization': 'Bearer $token'}, - data: request, - ); + await remote.setSateForArrivals(token: token, request: request); } @override @@ -106,16 +81,8 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, Map? queryParameters, }) async { - var res = await _httpClient.get( - '/steward-allocation/', - queryParameters: queryParameters, - headers: {'Authorization': 'Bearer $token'}, - fromJson: (json) => PaginationModel.fromJson( - json, - (data) => ImportedLoadsModel.fromJson(data as Map), - ), - ); - return res.data; + var res = await remote.getImportedLoadsModel(token: token, queryParameters: queryParameters); + return res; } @override @@ -123,16 +90,8 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, Map? queryParameters, }) async { - var res = await _httpClient.get( - '/steward-allocation/', - queryParameters: queryParameters, - headers: {'Authorization': 'Bearer $token'}, - fromJson: (json) => PaginationModel.fromJson( - json, - (json) => AllocatedMadeModel.fromJson(json as Map), - ), - ); - return res.data; + var res = await remote.getAllocatedMade(token: token, queryParameters: queryParameters); + return res; } @override @@ -140,19 +99,12 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required Map allocation, }) async { - var res = await _httpClient.put( - '/steward-allocation/0/', - headers: {'Authorization': 'Bearer $token'}, - data: allocation, - ); + await remote.confirmAllocation(token: token, allocation: allocation); } @override Future denyAllocation({required String token, required String allocationToken}) async { - await _httpClient.delete( - '/steward-allocation/0/?steward_allocation_key=$allocationToken', - headers: {'Authorization': 'Bearer $token'}, - ); + await remote.denyAllocation(token: token, allocationToken: allocationToken); } @override @@ -160,22 +112,13 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required List allocationTokens, }) async { - await _httpClient.put( - '/steward-allocation/0/', - headers: {'Authorization': 'Bearer $token'}, - data: {'steward_allocation_list': allocationTokens}, - ); + await remote.confirmAllAllocation(token: token, allocationTokens: allocationTokens); } @override Future?> getRolesProducts({required String token}) async { - var res = await _httpClient.get( - '/roles-products/?role=Steward', - headers: {'Authorization': 'Bearer $token'}, - fromJsonList: (json) => - json.map((item) => ProductModel.fromJson(item as Map)).toList(), - ); - return res.data; + var res = await remote.getRolesProducts(token: token); + return res; } @override @@ -183,24 +126,14 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, Map? queryParameters, }) async { - var res = await _httpClient.get( - '/guilds/', - queryParameters: queryParameters, - headers: {'Authorization': 'Bearer $token'}, - fromJsonList: (json) => - json.map((item) => GuildModel.fromJson(item as Map)).toList(), - ); - return res.data; + var res = await remote.getGuilds(token: token, queryParameters: queryParameters); + return res; } @override Future getProfile({required String token}) async { - var res = await _httpClient.get( - '/guilds/0/?profile', - headers: {'Authorization': 'Bearer $token'}, - fromJson: GuildProfile.fromJson, - ); - return res.data; + var res = await remote.getProfile(token: token); + return res; } @override @@ -208,11 +141,7 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required SubmitStewardAllocation request, }) async { - await _httpClient.post( - '/steward-allocation/', - headers: {'Authorization': 'Bearer $token'}, - data: request.toJson(), - ); + await remote.postSubmitStewardAllocation(token: token, request: request); } @override @@ -220,11 +149,7 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, Map? queryParameters, }) async { - await _httpClient.delete( - '/steward-allocation/0/', - headers: {'Authorization': 'Bearer $token'}, - queryParameters: queryParameters, - ); + await remote.deleteStewardAllocation(token: token, queryParameters: queryParameters); } @override @@ -232,11 +157,7 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required ConformAllocation request, }) async { - await _httpClient.put( - '/steward-allocation/0/', - headers: {'Authorization': 'Bearer $token'}, - queryParameters: request.toJson(), - ); + await remote.updateStewardAllocation(token: token, request: request); } @override @@ -245,12 +166,12 @@ class ChickenRepositoryImpl implements ChickenRepository { required String stratDate, required String endDate, }) async { - var res = await _httpClient.get( - '/steward_free_bar_dashboard/?date1=$stratDate&date2=$endDate&search=filter', - headers: {'Authorization': 'Bearer $token'}, - fromJson: StewardFreeBarDashboard.fromJson, + var res = await remote.getStewardDashboard( + token: token, + stratDate: stratDate, + endDate: endDate, ); - return res.data; + return res; } @override @@ -259,12 +180,12 @@ class ChickenRepositoryImpl implements ChickenRepository { required String stratDate, required String endDate, }) async { - var res = await _httpClient.get( - '/dashboard_kill_house_free_bar/?date1=$stratDate&date2=$endDate&search=filter', - headers: {'Authorization': 'Bearer $token'}, - fromJson: DashboardKillHouseFreeBar.fromJson, + var res = await remote.getDashboardKillHouseFreeBar( + token: token, + stratDate: stratDate, + endDate: endDate, ); - return res.data; + return res; } @override @@ -272,37 +193,23 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, Map? queryParameters, }) async { - var res = await _httpClient.get( - '/steward_free_bar/', + var res = await remote.getStewardPurchasesOutSideOfTheProvince( + token: token, queryParameters: queryParameters, - headers: {'Authorization': 'Bearer $token'}, - fromJson: (json) => PaginationModel.fromJson( - json, - (json) => StewardFreeBar.fromJson(json as Map), - ), ); - return res.data; + return res; } @override Future?> getCity({required String provinceName}) async { - var res = await _httpClient.get( - '/iran_city/', - queryParameters: {'name': provinceName}, - fromJsonList: (json) => - json.map((item) => IranProvinceCityModel.fromJson(item as Map)).toList(), - ); - return res.data; + var res = await remote.getCity(provinceName: provinceName); + return res; } @override Future?> getProvince({CancelToken? cancelToken}) async { - var res = await _httpClient.get( - '/iran_province/', - fromJsonList: (json) => - json.map((item) => IranProvinceCityModel.fromJson(item as Map)).toList(), - ); - return res.data; + var res = await remote.getProvince(cancelToken: cancelToken); + return res; } @override @@ -310,11 +217,7 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required CreateStewardFreeBar body, }) async { - var res = await _httpClient.post( - '/steward_free_bar/', - headers: {'Authorization': 'Bearer $token'}, - data: body.toJson(), - ); + await remote.createStewardPurchasesOutSideOfTheProvince(token: token, body: body); } @override @@ -322,10 +225,9 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required String stewardFreeBarKey, }) async { - await _httpClient.delete( - '/steward_free_bar/0/', - headers: {'Authorization': 'Bearer $token'}, - queryParameters: {'key': stewardFreeBarKey}, + await remote.deleteStewardPurchasesOutSideOfTheProvince( + token: token, + stewardFreeBarKey: stewardFreeBarKey, ); } @@ -334,16 +236,11 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, Map? queryParameters, }) async { - var res = await _httpClient.get( - '/out-province-carcasses-buyer/', + var res = await remote.getOutProvinceCarcassesBuyer( + token: token, queryParameters: queryParameters, - headers: {'Authorization': 'Bearer $token'}, - fromJson: (json) => PaginationModel.fromJson( - json, - (json) => OutProvinceCarcassesBuyer.fromJson(json as Map), - ), ); - return res.data; + return res; } @override @@ -351,11 +248,7 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required OutProvinceCarcassesBuyer body, }) async { - await _httpClient.post( - '/out-province-carcasses-buyer/', - data: body.toJson()..removeWhere((key, value) => value == null), - headers: {'Authorization': 'Bearer $token'}, - ); + await remote.createOutProvinceCarcassesBuyer(token: token, body: body); } @override @@ -363,16 +256,8 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, Map? queryParameters, }) async { - var res = await _httpClient.get( - '/steward_free_sale_bar/', - queryParameters: queryParameters, - headers: {'Authorization': 'Bearer $token'}, - fromJson: (json) => PaginationModel.fromJson( - json, - (json) => StewardFreeSaleBar.fromJson(json as Map), - ), - ); - return res.data; + var res = await remote.getStewardFreeSaleBar(token: token, queryParameters: queryParameters); + return res; } @override @@ -380,11 +265,7 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required StewardFreeSaleBarRequest body, }) async { - await _httpClient.post( - '/steward_free_sale_bar/', - data: body.toJson()..removeWhere((key, value) => value == null), - headers: {'Authorization': 'Bearer $token'}, - ); + await remote.createOutProvinceStewardFreeBar(token: token, body: body); } @override @@ -392,33 +273,18 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required StewardFreeSaleBarRequest body, }) async { - await _httpClient.put( - '/steward_free_sale_bar/0/', - data: body.toJson() - ..removeWhere((key, value) => value == null) - ..addAll({'carcassWeight': body.weightOfCarcasses, 'carcassCount': body.numberOfCarcasses}), - headers: {'Authorization': 'Bearer $token'}, - ); + await remote.updateOutProvinceStewardFreeBar(token: token, body: body); } @override Future getUserProfile({required String token}) async { - var res = await _httpClient.get( - '/system_user_profile/?self-profile', - headers: {'Authorization': 'Bearer $token'}, - fromJson: (json) => UserProfile.fromJson(json), - ); - - return res.data; + var res = await remote.getUserProfile(token: token); + return res; } @override Future updateUserProfile({required String token, required UserProfile userProfile}) async { - await _httpClient.put( - '/system_user_profile/?self-profile/0/', - headers: {'Authorization': 'Bearer $token'}, - data: userProfile.toJson()..removeWhere((key, value) => value == null), - ); + await remote.updateUserProfile(token: token, userProfile: userProfile); } @override @@ -426,11 +292,7 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required ChangePasswordRequestModel model, }) async { - await _httpClient.post( - '/api/change_password/', - headers: {'Authorization': 'Bearer $token'}, - data: model.toJson()..removeWhere((key, value) => value == null), - ); + await remote.updatePassword(token: token, model: model); } @override @@ -438,45 +300,36 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, Map? queryParameters, }) async { - var res = await _httpClient.get( - '/app-segmentation/', - queryParameters: queryParameters, - headers: {'Authorization': 'Bearer $token'}, - fromJson: (json) => PaginationModel.fromJson( - json, - (json) => SegmentationModel.fromJson(json as Map), - ), - ); - return res.data; + var res = await remote.getSegmentation(token: token, queryParameters: queryParameters); + return res; } @override Future createSegmentation({required String token, required SegmentationModel model}) async { - await _httpClient.post( - '/app-segmentation/', - data: model.toJson()..removeWhere((key, value) => value == null), - headers: {'Authorization': 'Bearer $token'}, - ); + await remote.createSegmentation(token: token, model: model); } @override Future editSegmentation({required String token, required SegmentationModel model}) async { - await _httpClient.put( - '/app-segmentation/0/', - data: model.toJson()..removeWhere((key, value) => value == null), - headers: {'Authorization': 'Bearer $token'}, - ); + await remote.editSegmentation(token: token, model: model); } @override - Future deleteSegmentation({required String token, required String key}) async { - var res = await _httpClient.delete( - '/app-segmentation/0/', - queryParameters: {'key': key}, - headers: {'Authorization': 'Bearer $token'}, - fromJson: (json) => SegmentationModel.fromJson(json), - ); - - return res.data; + Future deleteSegmentation({ + required String token, + required String key, + }) async { + var res = await remote.deleteSegmentation(token: token, key: key); + return res; } + + //endregion + + //region local + @override + WidelyUsedLocalModel? getAllWidely() => local.getAllWidely(); + + @override + Future initWidleyUsed() async => local.initWidleyUsed(); + //endregion } diff --git a/packages/chicken/lib/presentation/pages/buy_in_province/logic.dart b/packages/chicken/lib/presentation/pages/buy_in_province/logic.dart index 9fdb789..93cf531 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province/logic.dart @@ -68,7 +68,7 @@ class BuyInProvinceLogic extends GetxController { if (isWaiting) { buyWaitingLogic.getWaitingArrivals(); } else { - buyAllLogic.getImportedEntries(); + buyAllLogic.getAllArrivals(); } } diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart b/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart index eb08e10..b9dfcef 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart @@ -1,25 +1,32 @@ import 'package:rasadyar_auth/data/utils/safe_call.dart'; -import 'package:rasadyar_chicken/data/models/response/imported_loads_model/imported_loads_model.dart'; +import 'package:rasadyar_chicken/data/models/request/steward_allocation/steward_allocation_request.dart'; +import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_core/core.dart'; class BuyInProvinceAllLogic extends GetxController { RxList isExpandedList = [].obs; - Rx fromDateFilter = Jalali.now().obs; - Rx toDateFilter = Jalali.now().obs; + Rxn fromDateFilter = Rxn(); + Rxn toDateFilter = Rxn(); RxnString searchedValue = RxnString(); + RxMap isLoadingConfirmMap = RxMap(); + final RxBool isLoadingMoreAllocationsMade = false.obs; + RxInt currentPage = 1.obs; RootLogic rootLogic = Get.find(); - Rx>> importedLoads = - Resource>.loading().obs; - - + Rx>> allProduct = + Resource>.loading().obs; + @override + void onInit() { + super.onInit(); + getAllArrivals(); + } @override void onReady() { - debounce(searchedValue, (callback) => getImportedEntries(), time: Duration(milliseconds: 2000)); + debounce(searchedValue, (callback) => getAllArrivals(), time: Duration(milliseconds: 2000)); super.onReady(); } @@ -29,27 +36,111 @@ class BuyInProvinceAllLogic extends GetxController { super.onClose(); } - Future getImportedEntries() async { + Future getAllArrivals([bool isLoadingMore = false]) async { + if (isLoadingMore) { + isLoadingMoreAllocationsMade.value = true; + } else { + allProduct.value = Resource>.loading(); + } + + if (searchedValue.value != null && + searchedValue.value!.trim().isNotEmpty && + currentPage.value > 1) { + currentPage.value = 1; + } + safeCall( - call: () async => await rootLogic.chickenRepository.getImportedLoadsModel( + call: () async => await rootLogic.chickenRepository.getWaitingArrivals( token: rootLogic.tokenService.accessToken.value!, queryParameters: buildQueryParams( - queryParams: {'type': 'entered'}, - role: 'Steward', + queryParams: {'type': 'all'}, + pageSize: 20, + page: currentPage.value, search: 'filter', - page: 1, - pageSize: 10, - value: searchedValue.value + role: 'Steward', + value: searchedValue.value, + fromDate: fromDateFilter.value?.toDateTime(), + toDate: toDateFilter.value?.toDateTime(), ), ), onSuccess: (res) async { await Future.delayed(Duration(milliseconds: 200)); if ((res?.count ?? 0) == 0) { - importedLoads.value = Resource>.empty(); + allProduct.value = Resource>.empty(); } else { - importedLoads.value = Resource>.success(res!.results!); + allProduct.value = Resource>.success( + PaginationModel( + count: res?.count ?? 0, + next: res?.next, + previous: res?.previous, + results: [...(allProduct.value.data?.results ?? []), ...(res?.results ?? [])], + ), + ); } }, ); } + + Future acceptEntries(WaitingArrivalModel model) async { + var request = StewardAllocationRequest( + allocationKey: model.key, + checkAllocation: true, + state: 'accepted', + receiverRealNumberOfCarcasses: model.realNumberOfCarcasses ?? 0, + receiverRealWeightOfCarcasses: model.realWeightOfCarcasses?.toInt() ?? 0, + registrationCode: model.registrationCode ?? 0, + weightLossOfCarcasses: model.weightLossOfCarcasses?.toInt() ?? 0, + ).toJson(); + request.removeWhere((key, value) => value == null); + + safeCall( + call: () async => await rootLogic.chickenRepository.setSateForArrivals( + token: rootLogic.tokenService.accessToken.value!, + request: request, + ), + onError: (error, stackTrace) { + eLog(error); + }, + onSuccess: (result) { + getAllArrivals(); + rootLogic.getInventory(); + }, + ); + } + + Future denyEntries(WaitingArrivalModel model) async { + var request = StewardAllocationRequest( + allocationKey: model.key, + checkAllocation: true, + state: 'rejected', + ).toJson(); + request.removeWhere((key, value) => value == null); + + safeCall( + call: () async => await rootLogic.chickenRepository.setSateForArrivals( + token: rootLogic.tokenService.accessToken.value!, + request: request, + ), + onError: (error, stackTrace) { + eLog(error); + }, + onSuccess: (result) { + getAllArrivals(); + rootLogic.getInventory(); + }, + ); + } + + String getVecPathItem(String? item) { + switch (item) { + case 'pending': + return Assets.vec.timerSvg.path; + case 'accepted': + return Assets.vec.checkSquareSvg.path; + case 'rejected': + return Assets.vec.closeCircleSvg.path; + default: + return Assets.vec.timerSvg.path; + } + } } diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart index fab0ebc..e6929b2 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart @@ -1,4 +1,8 @@ import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'; +import 'package:rasadyar_chicken/presentation/utils/string_utils.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -8,6 +12,249 @@ class BuyInProvinceAllPage extends GetView { @override Widget build(BuildContext context) { - return Container(color: Colors.blue); + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: ObxValue((data) { + return RPaginatedListView( + listType: ListType.separated, + resource: data.value, + hasMore: data.value.data?.next != null, + padding: EdgeInsets.fromLTRB(8, 8, 8, 80), + itemBuilder: (context, index) { + var item = data.value.data!.results![index]; + return ObxValue((val) { + return ListItem2( + selected: val.contains(index), + onTap: () => controller.isExpandedList.toggle(index), + index: index, + child: itemListWidget(item), + secondChild: itemListExpandedWidget(item), + labelColor: getLabelColor(item.receiverState), + labelIcon: controller.getVecPathItem(item.receiverState), + ); + }, controller.isExpandedList); + }, + itemCount: data.value.data?.results?.length ?? 0, + separatorBuilder: (context, index) => SizedBox(height: 8.h), + onLoadMore: () async => controller.getAllArrivals(true), + onRefresh: () async { + controller.currentPage.value = 1; + await controller.getAllArrivals(); + }, + ); + }, controller.allProduct), + ); + } + + Row itemListWidget(WaitingArrivalModel item) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox(width: 20), + Expanded( + flex: 2, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 3, + children: [ + Text( + item.toSteward?.user?.fullname ?? 'N/A', + textAlign: TextAlign.start, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), + Text( + item.date?.formattedJalaliDate ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + ), + ], + ), + ), + Expanded( + flex: 3, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 6, + children: [ + Visibility( + visible: item.product?.name?.contains('مرغ گرم') ?? false, + child: Assets.vec.hotChickenSvg.svg( + width: 24, + height: 24, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + Text( + '${item.weightOfCarcasses?.separatedByComma}kg', + textAlign: TextAlign.left, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), + ], + ), + + SizedBox(height: 2), + ], + ), + ), + Expanded( + flex: 1, + child: Assets.vec.scanSvg.svg( + width: 32.w, + height: 32.h, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + ], + ); + } + + Container itemListExpandedWidget(WaitingArrivalModel item) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + item.steward?.user?.fullname ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + ), + Spacer(), + Text( + item.receiverState?.faItem, + textAlign: TextAlign.center, + style: AppFonts.yekan10.copyWith(color: AppColor.darkGreyDark), + ), + SizedBox(width: 7), + SvgGenImage.vec( + controller.getVecPathItem(item.receiverState), + ).svg(width: 16.w, height: 16.h, + colorFilter: ColorFilter.mode(AppColor.darkGreyDark, BlendMode.srcIn) + ), + + ], + ), + Container( + height: 32, + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + spacing: 3, + children: [ + Text( + item.date?.toJalali.formatter.wN ?? 'N/A', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + + Text( + '${item.date?.toJalali.formatter.d} ${item.date?.toJalali.formatter.mN ?? 'N/A'}', + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + ], + ), + + Text( + '${item.date?.toJalali.formatter.y}', + style: AppFonts.yekan20.copyWith(color: AppColor.textColor), + ), + + Text( + '${item.date?.toJalali.formatter.tHH}:${item.date?.toJalali.formatter.tMM ?? 'N/A'}', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + ], + ), + ), + + buildRow( + title: 'نام و نام خانوادگی فروشنده', + value: item.steward?.user?.fullname ?? 'N/A', + ), + buildRow( + title: 'تلفن فروشنده', + value: item.steward?.user?.mobile ?? 'N/A', + valueStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + + buildRow(title: 'محصول', value: item.product?.name ?? 'N/A'), + buildRow( + title: 'وزن خریداری شده', + value: '${item.weightOfCarcasses?.separatedByComma} کیلوگرم', + ), + buildRow(title: 'قیمت کل', value: '${item.totalAmount?.separatedByComma} ریال'), + Visibility( + visible: item.receiverState == 'pending', + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 16.w, + children: [ + ObxValue((data) { + return RElevated( + text: 'تایید', + width: 150.w, + height: 40.h, + isLoading: data[item.key!] ?? false, + onPressed: () async { + data[item.key!] = !(data[item.key!] ?? false); + await controller.acceptEntries(item); + data.remove(item.key!); + }, + textStyle: AppFonts.yekan20.copyWith(color: Colors.white), + backgroundColor: AppColor.greenNormal, + ); + }, controller.isLoadingConfirmMap), + ROutlinedElevated( + text: 'رد', + textStyle: AppFonts.yekan20.copyWith(color: AppColor.redNormal), + width: 150.w, + height: 40.h, + onPressed: () { + buildWarningDialog( + title: 'اخطار', + middleText: 'آیا از رد شدن این مورد اطمینان دارید؟', + onConfirm: () => controller.denyEntries(item), + onRefresh: () => controller.getAllArrivals(), + ); + }, + borderColor: AppColor.redNormal, + ), + ], + ), + ), + ], + ), + ); + } + + Color getLabelColor(String? item) { + switch (item) { + case 'pending': + return AppColor.greenLightHover; + case 'accepted': + return AppColor.blueLight; + case 'rejected': + return AppColor.redLightHover; + default: + return AppColor.blueLight; + } } } diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart index 2de5ede..c2efb00 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart @@ -18,9 +18,12 @@ class BuyInProvinceWaitingLogic extends GetxController { RxInt currentPage = 1.obs; final RxBool isLoadingMoreAllocationsMade = false.obs; RootLogic rootLogic = Get.find(); + Rx>> waitingProduct = Resource>.loading().obs; + + @override void onInit() { super.onInit(); @@ -35,6 +38,7 @@ class BuyInProvinceWaitingLogic extends GetxController { void onReady() { super.onReady(); getWaitingArrivals(); + } @override @@ -92,6 +96,8 @@ class BuyInProvinceWaitingLogic extends GetxController { ); } + + Future acceptEntries(WaitingArrivalModel model) async { var request = StewardAllocationRequest( allocationKey: model.key, diff --git a/packages/chicken/lib/presentation/pages/home/logic.dart b/packages/chicken/lib/presentation/pages/home/logic.dart index 16a3954..5c0e315 100644 --- a/packages/chicken/lib/presentation/pages/home/logic.dart +++ b/packages/chicken/lib/presentation/pages/home/logic.dart @@ -29,7 +29,6 @@ class HomeLogic extends GetxController { queryParameters: buildQueryParams(fromDate: DateTime.now(), toDate: DateTime.now()), ), onSuccess: (result) { - iLog(result); if (result != null) { totalWeightTodayBars.value = result.totalBarsWeight?.toInt(); } diff --git a/packages/chicken/lib/presentation/pages/home/view.dart b/packages/chicken/lib/presentation/pages/home/view.dart index bd9f07a..4fba960 100644 --- a/packages/chicken/lib/presentation/pages/home/view.dart +++ b/packages/chicken/lib/presentation/pages/home/view.dart @@ -2,8 +2,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; -import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/presentation/widget/app_bar.dart'; +import 'package:rasadyar_chicken/presentation/widget/widely_used/view.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -153,76 +153,7 @@ class HomePage extends GetView { ), ), - Padding( - padding: EdgeInsetsGeometry.all(6), - child: Row( - children: [Text('پر کاربرد ها', textAlign: TextAlign.right, style: AppFonts.yekan16)], - ), - ), - - SizedBox( - height: 70, - child: ListView( - scrollDirection: Axis.horizontal, - padding: EdgeInsets.symmetric(horizontal: 12), - physics: BouncingScrollPhysics(), - children: [ - widelyUsed( - title: 'خرید خارج استان', - iconPath: Assets.vec.truckFastSvg.path, - onTap: () async { - controller.rootLogic.currentPage.value = 0; - controller.rootLogic.currentPage.refresh(); - await Future.delayed(Duration(milliseconds: 100)); - Get.toNamed(ChickenRoutes.buysOutOfProvince, id: 0); - }, - ), - SizedBox(width: 15), - widelyUsed( - title: 'خرید داخل استان', - iconPath: Assets.vec.cubeSvg.path, - onTap: () async { - controller.rootLogic.currentPage.value = 0; - controller.rootLogic.currentPage.refresh(); - await Future.delayed(Duration(milliseconds: 100)); - Get.toNamed(ChickenRoutes.buysInProvince, id: 0); - }, - ), - SizedBox(width: 15), - widelyUsed( - title: 'فروش خارج استان', - iconPath: Assets.vec.truckFastSvg.path, - onTap: () async { - controller.rootLogic.currentPage.value = 1; - controller.rootLogic.currentPage.refresh(); - await Future.delayed(Duration(milliseconds: 100)); - Get.toNamed(ChickenRoutes.salesOutOfProvince, id: 1); - }, - ), - SizedBox(width: 15), - widelyUsed( - title: 'فروش داخل استان', - iconPath: Assets.vec.cubeSvg.path, - onTap: () async{ - controller.rootLogic.currentPage.value = 1; - controller.rootLogic.currentPage.refresh(); - await Future.delayed(Duration(milliseconds: 100)); - Get.toNamed(ChickenRoutes.salesInProvince, id: 1); - }, - ), - SizedBox(width: 15), - widelyUsed( - title: 'ثبت قطعه بندی', - iconPath: Assets.vec.convertCubeSvg.path, - onTap: () { - // Get.toNamed(ChickenRoutes.salesWithOutProvince); - }, - ), - SizedBox(width: 15), - addWidelyUsed(onTap: () {}), - ], - ), - ), + WidelyUsedWidget(), ], ), ); @@ -566,73 +497,6 @@ class HomePage extends GetView { ); } - Widget widelyUsed({ - required String title, - required String iconPath, - required VoidCallback onTap, - }) { - return GestureDetector( - onTap: onTap, - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - spacing: 4, - children: [ - Container( - width: 48, - height: 48, - padding: EdgeInsets.all(4), - decoration: ShapeDecoration( - color: const Color(0xFFBECDFF), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: Container( - width: 40, - height: 40, - decoration: ShapeDecoration( - color: AppColor.blueNormal, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: SvgGenImage.vec(iconPath).svg( - width: 24, - height: 24, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - fit: BoxFit.cover, - ), - ), - ), - Text(title, style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), - ], - ), - ); - } - - Widget addWidelyUsed({required VoidCallback onTap}) { - return Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - spacing: 4, - children: [ - Container( - width: 48, - height: 48, - padding: EdgeInsets.all(4), - decoration: ShapeDecoration( - color: const Color(0xFFD9F7F0), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: Assets.vec.messageAddSvg.svg( - width: 40, - height: 40, - colorFilter: ColorFilter.mode(AppColor.greenNormal, BlendMode.srcIn), - fit: BoxFit.cover, - ), - ), - Text('افزودن', style: AppFonts.yekan10.copyWith(color: AppColor.greenDarkHover)), - ], - ); - } - Widget inventoryItem({ required bool isExpanded, required int index, diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index 733b962..0f3c0cd 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -3,7 +3,9 @@ import 'dart:async'; import 'package:flutter/widgets.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/data/datasource/local/chicken_local_imp.dart'; import 'package:rasadyar_chicken/data/di/chicken_di.dart'; +import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart'; import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; @@ -26,10 +28,12 @@ class RootLogic extends GetxController { final defaultRoutes = {0: ChickenRoutes.buy, 1: ChickenRoutes.sale}; RxList rolesProductsModel = RxList(); + Rxn widelyUsedList = Rxn(); late DioRemote dioRemote; var tokenService = Get.find(); late ChickenRepository chickenRepository; + late ChickenLocalDataSourceImp localDatasource; RxList errorLocationType = RxList(); RxMap inventoryExpandedList = RxMap(); @@ -43,8 +47,10 @@ class RootLogic extends GetxController { @override void onInit() { super.onInit(); + localDatasource = diChicken.get(); + chickenRepository = diChicken.get(); - chickenRepository = diChicken.get(); + widelyUsedList.value = localDatasource.getAllWidely(); //getKillHouseDistributionInfo(); } @@ -62,6 +68,12 @@ class RootLogic extends GetxController { if (rolesProductsModel.isEmpty) { getRolesProducts(); } + + if (widelyUsedList.value?.hasInit != true) { + localDatasource.initWidleyUsed().then( + (value) => localDatasource.getAllWidely(), + ); + } } @override diff --git a/packages/core/lib/infrastructure/local/hive_local_storage.dart b/packages/core/lib/infrastructure/local/hive_local_storage.dart index 53b7b55..d164dbf 100644 --- a/packages/core/lib/infrastructure/local/hive_local_storage.dart +++ b/packages/core/lib/infrastructure/local/hive_local_storage.dart @@ -1,8 +1,6 @@ import 'package:flutter/foundation.dart'; import 'package:rasadyar_core/core.dart'; -import 'i_local_storage.dart'; - class HiveLocalStorage implements ILocalStorage { HiveLocalStorage() { Hive.initFlutter(); @@ -43,6 +41,17 @@ class HiveLocalStorage implements ILocalStorage { } } + @override + T? readBox({required String boxName}) { + try { + Box? box = getBox(boxName); + return box?.values as T?; + } on Exception catch (e) { + eLog(e); + return null; + } + } + @override Future add({required String boxName, required dynamic value}) async { Box? box = getBox(boxName); @@ -50,10 +59,7 @@ class HiveLocalStorage implements ILocalStorage { } @override - Future addAll({ - required String boxName, - required Iterable values, - }) async { + Future addAll({required String boxName, required Iterable values}) async { Box? box = getBox(boxName); await box?.addAll(values); } @@ -76,20 +82,13 @@ class HiveLocalStorage implements ILocalStorage { Future close(String boxName) async => await _boxes[boxName]?.close(); @override - Future deleteValue({ - required String boxName, - required String key, - }) async { + Future deleteValue({required String boxName, required String key}) async { Box? box = getBox(boxName); await box?.delete(key); } @override - Future save({ - required String boxName, - required String key, - required value, - }) async { + Future save({required String boxName, required String key, required value}) async { Box? box = getBox(boxName); await box?.put(key, value); } @@ -101,11 +100,7 @@ class HiveLocalStorage implements ILocalStorage { } @override - Future saveAt({ - required String boxName, - required int index, - required value, - }) async { + Future saveAt({required String boxName, required int index, required value}) async { Box? box = getBox(boxName); await box?.putAt(index, value); } diff --git a/packages/core/lib/infrastructure/local/i_local_storage.dart b/packages/core/lib/infrastructure/local/i_local_storage.dart index 7cb4f49..98e6c5b 100644 --- a/packages/core/lib/infrastructure/local/i_local_storage.dart +++ b/packages/core/lib/infrastructure/local/i_local_storage.dart @@ -15,6 +15,8 @@ abstract class ILocalStorage { T? read({required String boxName, required String key}); + T? readBox({required String boxName}); + Future deleteValue({required String boxName, required String key}); Future add({required String boxName, required E value}); diff --git a/packages/core/lib/utils/local/local_utils.dart b/packages/core/lib/utils/local/local_utils.dart new file mode 100644 index 0000000..04f3e5d --- /dev/null +++ b/packages/core/lib/utils/local/local_utils.dart @@ -0,0 +1,7 @@ +//Auth +const int authUserLocalModelTypeId = 0; +const int authModuleTypeId = 1; + +//chicken +const int chickenWidelyUsedLocalModelTypeId = 2; +const int chickenWidelyUsedLocalItemTypeId = 3; \ No newline at end of file diff --git a/packages/core/lib/utils/utils.dart b/packages/core/lib/utils/utils.dart index 8701a53..064ac55 100644 --- a/packages/core/lib/utils/utils.dart +++ b/packages/core/lib/utils/utils.dart @@ -12,3 +12,6 @@ export 'map_utils.dart'; export 'route_utils.dart'; export 'separator_input_formatter.dart'; + +export 'local/local_utils.dart'; +