Merge branch with resolved conflicts - restructured features and added new modules

This commit is contained in:
2025-12-17 10:26:39 +03:30
484 changed files with 55236 additions and 4255 deletions

View File

@@ -13,6 +13,7 @@
<uses-permission <uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28"/> android:maxSdkVersion="28"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

View File

@@ -1,5 +1,5 @@
sdk.dir=C:\\Users\\Housh11\\AppData\\Local\\Android\\sdk sdk.dir=C:\\Users\\Housh11\\AppData\\Local\\Android\\sdk
flutter.sdk=C:\\src\\flutter flutter.sdk=C:\\src\\flutter
flutter.buildMode=debug flutter.buildMode=debug
flutter.versionName=1.3.33 flutter.versionName=1.3.39
flutter.versionCode=30 flutter.versionCode=35

View File

@@ -2,3 +2,5 @@ description: This file stores settings for Dart & Flutter DevTools.
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
extensions: extensions:
- hive_ce: true - hive_ce: true
- provider: true
- shared_preferences: true

View File

@@ -5,14 +5,21 @@ part 'app_info_model.g.dart';
@freezed @freezed
abstract class AppInfoModel with _$AppInfoModel { abstract class AppInfoModel with _$AppInfoModel {
const factory AppInfoModel({String? key, String? download_link, Info? info}) = _AppInfoModel; const factory AppInfoModel({String? key, String? file, Info? info}) =
_AppInfoModel;
factory AppInfoModel.fromJson(Map<String, dynamic> json) => _$AppInfoModelFromJson(json); factory AppInfoModel.fromJson(Map<String, dynamic> json) =>
_$AppInfoModelFromJson(json);
} }
@freezed @freezed
abstract class Info with _$Info { abstract class Info with _$Info {
const factory Info({String? version, String? module, bool? required}) = _Info; const factory Info({
String? version,
String? minVersion,
String? module,
bool? required,
}) = _Info;
factory Info.fromJson(Map<String, dynamic> json) => _$InfoFromJson(json); factory Info.fromJson(Map<String, dynamic> json) => _$InfoFromJson(json);
} }

View File

@@ -15,7 +15,7 @@ T _$identity<T>(T value) => value;
/// @nodoc /// @nodoc
mixin _$AppInfoModel { mixin _$AppInfoModel {
String? get key; String? get download_link; Info? get info; String? get key; String? get file; Info? get info;
/// Create a copy of AppInfoModel /// Create a copy of AppInfoModel
/// with the given fields replaced by the non-null parameter values. /// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(includeFromJson: false, includeToJson: false)
@@ -28,16 +28,16 @@ $AppInfoModelCopyWith<AppInfoModel> get copyWith => _$AppInfoModelCopyWithImpl<A
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is AppInfoModel&&(identical(other.key, key) || other.key == key)&&(identical(other.download_link, download_link) || other.download_link == download_link)&&(identical(other.info, info) || other.info == info)); return identical(this, other) || (other.runtimeType == runtimeType&&other is AppInfoModel&&(identical(other.key, key) || other.key == key)&&(identical(other.file, file) || other.file == file)&&(identical(other.info, info) || other.info == info));
} }
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(includeFromJson: false, includeToJson: false)
@override @override
int get hashCode => Object.hash(runtimeType,key,download_link,info); int get hashCode => Object.hash(runtimeType,key,file,info);
@override @override
String toString() { String toString() {
return 'AppInfoModel(key: $key, download_link: $download_link, info: $info)'; return 'AppInfoModel(key: $key, file: $file, info: $info)';
} }
@@ -48,7 +48,7 @@ abstract mixin class $AppInfoModelCopyWith<$Res> {
factory $AppInfoModelCopyWith(AppInfoModel value, $Res Function(AppInfoModel) _then) = _$AppInfoModelCopyWithImpl; factory $AppInfoModelCopyWith(AppInfoModel value, $Res Function(AppInfoModel) _then) = _$AppInfoModelCopyWithImpl;
@useResult @useResult
$Res call({ $Res call({
String? key, String? download_link, Info? info String? key, String? file, Info? info
}); });
@@ -65,10 +65,10 @@ class _$AppInfoModelCopyWithImpl<$Res>
/// Create a copy of AppInfoModel /// Create a copy of AppInfoModel
/// with the given fields replaced by the non-null parameter values. /// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? download_link = freezed,Object? info = freezed,}) { @pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? file = freezed,Object? info = freezed,}) {
return _then(_self.copyWith( return _then(_self.copyWith(
key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable
as String?,download_link: freezed == download_link ? _self.download_link : download_link // ignore: cast_nullable_to_non_nullable as String?,file: freezed == file ? _self.file : file // ignore: cast_nullable_to_non_nullable
as String?,info: freezed == info ? _self.info : info // ignore: cast_nullable_to_non_nullable as String?,info: freezed == info ? _self.info : info // ignore: cast_nullable_to_non_nullable
as Info?, as Info?,
)); ));
@@ -167,10 +167,10 @@ return $default(_that);case _:
/// } /// }
/// ``` /// ```
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String? key, String? download_link, Info? info)? $default,{required TResult orElse(),}) {final _that = this; @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String? key, String? file, Info? info)? $default,{required TResult orElse(),}) {final _that = this;
switch (_that) { switch (_that) {
case _AppInfoModel() when $default != null: case _AppInfoModel() when $default != null:
return $default(_that.key,_that.download_link,_that.info);case _: return $default(_that.key,_that.file,_that.info);case _:
return orElse(); return orElse();
} }
@@ -188,10 +188,10 @@ return $default(_that.key,_that.download_link,_that.info);case _:
/// } /// }
/// ``` /// ```
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String? key, String? download_link, Info? info) $default,) {final _that = this; @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String? key, String? file, Info? info) $default,) {final _that = this;
switch (_that) { switch (_that) {
case _AppInfoModel(): case _AppInfoModel():
return $default(_that.key,_that.download_link,_that.info);case _: return $default(_that.key,_that.file,_that.info);case _:
throw StateError('Unexpected subclass'); throw StateError('Unexpected subclass');
} }
@@ -208,10 +208,10 @@ return $default(_that.key,_that.download_link,_that.info);case _:
/// } /// }
/// ``` /// ```
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String? key, String? download_link, Info? info)? $default,) {final _that = this; @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String? key, String? file, Info? info)? $default,) {final _that = this;
switch (_that) { switch (_that) {
case _AppInfoModel() when $default != null: case _AppInfoModel() when $default != null:
return $default(_that.key,_that.download_link,_that.info);case _: return $default(_that.key,_that.file,_that.info);case _:
return null; return null;
} }
@@ -223,11 +223,11 @@ return $default(_that.key,_that.download_link,_that.info);case _:
@JsonSerializable() @JsonSerializable()
class _AppInfoModel implements AppInfoModel { class _AppInfoModel implements AppInfoModel {
const _AppInfoModel({this.key, this.download_link, this.info}); const _AppInfoModel({this.key, this.file, this.info});
factory _AppInfoModel.fromJson(Map<String, dynamic> json) => _$AppInfoModelFromJson(json); factory _AppInfoModel.fromJson(Map<String, dynamic> json) => _$AppInfoModelFromJson(json);
@override final String? key; @override final String? key;
@override final String? download_link; @override final String? file;
@override final Info? info; @override final Info? info;
/// Create a copy of AppInfoModel /// Create a copy of AppInfoModel
@@ -243,16 +243,16 @@ Map<String, dynamic> toJson() {
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is _AppInfoModel&&(identical(other.key, key) || other.key == key)&&(identical(other.download_link, download_link) || other.download_link == download_link)&&(identical(other.info, info) || other.info == info)); return identical(this, other) || (other.runtimeType == runtimeType&&other is _AppInfoModel&&(identical(other.key, key) || other.key == key)&&(identical(other.file, file) || other.file == file)&&(identical(other.info, info) || other.info == info));
} }
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(includeFromJson: false, includeToJson: false)
@override @override
int get hashCode => Object.hash(runtimeType,key,download_link,info); int get hashCode => Object.hash(runtimeType,key,file,info);
@override @override
String toString() { String toString() {
return 'AppInfoModel(key: $key, download_link: $download_link, info: $info)'; return 'AppInfoModel(key: $key, file: $file, info: $info)';
} }
@@ -263,7 +263,7 @@ abstract mixin class _$AppInfoModelCopyWith<$Res> implements $AppInfoModelCopyWi
factory _$AppInfoModelCopyWith(_AppInfoModel value, $Res Function(_AppInfoModel) _then) = __$AppInfoModelCopyWithImpl; factory _$AppInfoModelCopyWith(_AppInfoModel value, $Res Function(_AppInfoModel) _then) = __$AppInfoModelCopyWithImpl;
@override @useResult @override @useResult
$Res call({ $Res call({
String? key, String? download_link, Info? info String? key, String? file, Info? info
}); });
@@ -280,10 +280,10 @@ class __$AppInfoModelCopyWithImpl<$Res>
/// Create a copy of AppInfoModel /// Create a copy of AppInfoModel
/// with the given fields replaced by the non-null parameter values. /// with the given fields replaced by the non-null parameter values.
@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? download_link = freezed,Object? info = freezed,}) { @override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? file = freezed,Object? info = freezed,}) {
return _then(_AppInfoModel( return _then(_AppInfoModel(
key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable
as String?,download_link: freezed == download_link ? _self.download_link : download_link // ignore: cast_nullable_to_non_nullable as String?,file: freezed == file ? _self.file : file // ignore: cast_nullable_to_non_nullable
as String?,info: freezed == info ? _self.info : info // ignore: cast_nullable_to_non_nullable as String?,info: freezed == info ? _self.info : info // ignore: cast_nullable_to_non_nullable
as Info?, as Info?,
)); ));
@@ -308,7 +308,7 @@ $InfoCopyWith<$Res>? get info {
/// @nodoc /// @nodoc
mixin _$Info { mixin _$Info {
String? get version; String? get module; bool? get required; String? get version; String? get minVersion; String? get module; bool? get required;
/// Create a copy of Info /// Create a copy of Info
/// with the given fields replaced by the non-null parameter values. /// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(includeFromJson: false, includeToJson: false)
@@ -321,16 +321,16 @@ $InfoCopyWith<Info> get copyWith => _$InfoCopyWithImpl<Info>(this as Info, _$ide
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is Info&&(identical(other.version, version) || other.version == version)&&(identical(other.module, module) || other.module == module)&&(identical(other.required, required) || other.required == required)); return identical(this, other) || (other.runtimeType == runtimeType&&other is Info&&(identical(other.version, version) || other.version == version)&&(identical(other.minVersion, minVersion) || other.minVersion == minVersion)&&(identical(other.module, module) || other.module == module)&&(identical(other.required, required) || other.required == required));
} }
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(includeFromJson: false, includeToJson: false)
@override @override
int get hashCode => Object.hash(runtimeType,version,module,required); int get hashCode => Object.hash(runtimeType,version,minVersion,module,required);
@override @override
String toString() { String toString() {
return 'Info(version: $version, module: $module, required: $required)'; return 'Info(version: $version, minVersion: $minVersion, module: $module, required: $required)';
} }
@@ -341,7 +341,7 @@ abstract mixin class $InfoCopyWith<$Res> {
factory $InfoCopyWith(Info value, $Res Function(Info) _then) = _$InfoCopyWithImpl; factory $InfoCopyWith(Info value, $Res Function(Info) _then) = _$InfoCopyWithImpl;
@useResult @useResult
$Res call({ $Res call({
String? version, String? module, bool? required String? version, String? minVersion, String? module, bool? required
}); });
@@ -358,9 +358,10 @@ class _$InfoCopyWithImpl<$Res>
/// Create a copy of Info /// Create a copy of Info
/// with the given fields replaced by the non-null parameter values. /// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @override $Res call({Object? version = freezed,Object? module = freezed,Object? required = freezed,}) { @pragma('vm:prefer-inline') @override $Res call({Object? version = freezed,Object? minVersion = freezed,Object? module = freezed,Object? required = freezed,}) {
return _then(_self.copyWith( return _then(_self.copyWith(
version: freezed == version ? _self.version : version // ignore: cast_nullable_to_non_nullable version: freezed == version ? _self.version : version // ignore: cast_nullable_to_non_nullable
as String?,minVersion: freezed == minVersion ? _self.minVersion : minVersion // ignore: cast_nullable_to_non_nullable
as String?,module: freezed == module ? _self.module : module // ignore: cast_nullable_to_non_nullable as String?,module: freezed == module ? _self.module : module // ignore: cast_nullable_to_non_nullable
as String?,required: freezed == required ? _self.required : required // ignore: cast_nullable_to_non_nullable as String?,required: freezed == required ? _self.required : required // ignore: cast_nullable_to_non_nullable
as bool?, as bool?,
@@ -448,10 +449,10 @@ return $default(_that);case _:
/// } /// }
/// ``` /// ```
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String? version, String? module, bool? required)? $default,{required TResult orElse(),}) {final _that = this; @optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String? version, String? minVersion, String? module, bool? required)? $default,{required TResult orElse(),}) {final _that = this;
switch (_that) { switch (_that) {
case _Info() when $default != null: case _Info() when $default != null:
return $default(_that.version,_that.module,_that.required);case _: return $default(_that.version,_that.minVersion,_that.module,_that.required);case _:
return orElse(); return orElse();
} }
@@ -469,10 +470,10 @@ return $default(_that.version,_that.module,_that.required);case _:
/// } /// }
/// ``` /// ```
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String? version, String? module, bool? required) $default,) {final _that = this; @optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String? version, String? minVersion, String? module, bool? required) $default,) {final _that = this;
switch (_that) { switch (_that) {
case _Info(): case _Info():
return $default(_that.version,_that.module,_that.required);case _: return $default(_that.version,_that.minVersion,_that.module,_that.required);case _:
throw StateError('Unexpected subclass'); throw StateError('Unexpected subclass');
} }
@@ -489,10 +490,10 @@ return $default(_that.version,_that.module,_that.required);case _:
/// } /// }
/// ``` /// ```
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String? version, String? module, bool? required)? $default,) {final _that = this; @optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String? version, String? minVersion, String? module, bool? required)? $default,) {final _that = this;
switch (_that) { switch (_that) {
case _Info() when $default != null: case _Info() when $default != null:
return $default(_that.version,_that.module,_that.required);case _: return $default(_that.version,_that.minVersion,_that.module,_that.required);case _:
return null; return null;
} }
@@ -504,10 +505,11 @@ return $default(_that.version,_that.module,_that.required);case _:
@JsonSerializable() @JsonSerializable()
class _Info implements Info { class _Info implements Info {
const _Info({this.version, this.module, this.required}); const _Info({this.version, this.minVersion, this.module, this.required});
factory _Info.fromJson(Map<String, dynamic> json) => _$InfoFromJson(json); factory _Info.fromJson(Map<String, dynamic> json) => _$InfoFromJson(json);
@override final String? version; @override final String? version;
@override final String? minVersion;
@override final String? module; @override final String? module;
@override final bool? required; @override final bool? required;
@@ -524,16 +526,16 @@ Map<String, dynamic> toJson() {
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is _Info&&(identical(other.version, version) || other.version == version)&&(identical(other.module, module) || other.module == module)&&(identical(other.required, required) || other.required == required)); return identical(this, other) || (other.runtimeType == runtimeType&&other is _Info&&(identical(other.version, version) || other.version == version)&&(identical(other.minVersion, minVersion) || other.minVersion == minVersion)&&(identical(other.module, module) || other.module == module)&&(identical(other.required, required) || other.required == required));
} }
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(includeFromJson: false, includeToJson: false)
@override @override
int get hashCode => Object.hash(runtimeType,version,module,required); int get hashCode => Object.hash(runtimeType,version,minVersion,module,required);
@override @override
String toString() { String toString() {
return 'Info(version: $version, module: $module, required: $required)'; return 'Info(version: $version, minVersion: $minVersion, module: $module, required: $required)';
} }
@@ -544,7 +546,7 @@ abstract mixin class _$InfoCopyWith<$Res> implements $InfoCopyWith<$Res> {
factory _$InfoCopyWith(_Info value, $Res Function(_Info) _then) = __$InfoCopyWithImpl; factory _$InfoCopyWith(_Info value, $Res Function(_Info) _then) = __$InfoCopyWithImpl;
@override @useResult @override @useResult
$Res call({ $Res call({
String? version, String? module, bool? required String? version, String? minVersion, String? module, bool? required
}); });
@@ -561,9 +563,10 @@ class __$InfoCopyWithImpl<$Res>
/// Create a copy of Info /// Create a copy of Info
/// with the given fields replaced by the non-null parameter values. /// with the given fields replaced by the non-null parameter values.
@override @pragma('vm:prefer-inline') $Res call({Object? version = freezed,Object? module = freezed,Object? required = freezed,}) { @override @pragma('vm:prefer-inline') $Res call({Object? version = freezed,Object? minVersion = freezed,Object? module = freezed,Object? required = freezed,}) {
return _then(_Info( return _then(_Info(
version: freezed == version ? _self.version : version // ignore: cast_nullable_to_non_nullable version: freezed == version ? _self.version : version // ignore: cast_nullable_to_non_nullable
as String?,minVersion: freezed == minVersion ? _self.minVersion : minVersion // ignore: cast_nullable_to_non_nullable
as String?,module: freezed == module ? _self.module : module // ignore: cast_nullable_to_non_nullable as String?,module: freezed == module ? _self.module : module // ignore: cast_nullable_to_non_nullable
as String?,required: freezed == required ? _self.required : required // ignore: cast_nullable_to_non_nullable as String?,required: freezed == required ? _self.required : required // ignore: cast_nullable_to_non_nullable
as bool?, as bool?,

View File

@@ -9,7 +9,7 @@ part of 'app_info_model.dart';
_AppInfoModel _$AppInfoModelFromJson(Map<String, dynamic> json) => _AppInfoModel _$AppInfoModelFromJson(Map<String, dynamic> json) =>
_AppInfoModel( _AppInfoModel(
key: json['key'] as String?, key: json['key'] as String?,
download_link: json['download_link'] as String?, file: json['file'] as String?,
info: json['info'] == null info: json['info'] == null
? null ? null
: Info.fromJson(json['info'] as Map<String, dynamic>), : Info.fromJson(json['info'] as Map<String, dynamic>),
@@ -18,18 +18,20 @@ _AppInfoModel _$AppInfoModelFromJson(Map<String, dynamic> json) =>
Map<String, dynamic> _$AppInfoModelToJson(_AppInfoModel instance) => Map<String, dynamic> _$AppInfoModelToJson(_AppInfoModel instance) =>
<String, dynamic>{ <String, dynamic>{
'key': instance.key, 'key': instance.key,
'download_link': instance.download_link, 'file': instance.file,
'info': instance.info, 'info': instance.info,
}; };
_Info _$InfoFromJson(Map<String, dynamic> json) => _Info( _Info _$InfoFromJson(Map<String, dynamic> json) => _Info(
version: json['version'] as String?, version: json['version'] as String?,
minVersion: json['minVersion'] as String?,
module: json['module'] as String?, module: json['module'] as String?,
required: json['required'] as bool?, required: json['required'] as bool?,
); );
Map<String, dynamic> _$InfoToJson(_Info instance) => <String, dynamic>{ Map<String, dynamic> _$InfoToJson(_Info instance) => <String, dynamic>{
'version': instance.version, 'version': instance.version,
'minVersion': instance.minVersion,
'module': instance.module, 'module': instance.module,
'required': instance.required, 'required': instance.required,
}; };

View File

@@ -1,6 +1,6 @@
import 'package:rasadyar_app/presentation/routes/app_pages.dart'; import 'package:rasadyar_app/presentation/routes/app_pages.dart';
import 'package:rasadyar_chicken/data/di/chicken_di.dart'; import 'package:rasadyar_chicken/data/di/chicken_di.dart';
import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/features/steward/presentation/routes/routes.dart';
import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/core.dart';
import 'package:rasadyar_inspection/injection/inspection_di.dart'; import 'package:rasadyar_inspection/injection/inspection_di.dart';
import 'package:rasadyar_inspection/inspection.dart'; import 'package:rasadyar_inspection/inspection.dart';
@@ -22,7 +22,7 @@ Future<void> seedTargetPage() async {
functions: ["setupLiveStockDI"], functions: ["setupLiveStockDI"],
), ),
TargetPage( TargetPage(
route: ChickenRoutes.initSteward, route: StewardRoutes.initSteward,
module: Module.chicken, module: Module.chicken,
functions: ["setupChickenDI"], functions: ["setupChickenDI"],
), ),

View File

@@ -185,7 +185,7 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin {
try { try {
final info = await PackageInfo.fromPlatform(); final info = await PackageInfo.fromPlatform();
int version = info.version.versionNumber; int version = info.version.versionNumber;
var res = await _dio.get("https://rsibackend.rasadyaar.ir/app/apk-info/"); var res = await _dio.get("https://rsibackend.rasadyar.com/app/rasadyar-app-info/");
appInfoModel = AppInfoModel.fromJson(res.data); appInfoModel = AppInfoModel.fromJson(res.data);
@@ -214,7 +214,7 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin {
while (attempts < retryCount && !success) { while (attempts < retryCount && !success) {
try { try {
await _dio.download( await _dio.download(
appInfoModel?.download_link ?? '', appInfoModel?.file ?? '',
filePath, filePath,
onReceiveProgress: (count, total) { onReceiveProgress: (count, total) {
if (total != -1 && total > 0) { if (total != -1 && total > 0) {

74
output.json Normal file
View File

@@ -0,0 +1,74 @@
{
"lat": 35.8245784,
"log": 50.9479516,
"hatching_id": 4560,
"role": "SuperAdmin",
"report_information": {
"general_condition_hall": {
"images": [
"https://s3.rasadyar.com/rasadyar/202512141551550.jpg",
"https://s3.rasadyar.com/rasadyar/202512141551560.jpg"
],
"health_status": "عالی",
"ventilation_status": "عالی",
"bed_condition": "خشک",
"temperature": 25,
"drinking_water_source": null,
"drinking_water_quality": null
},
"casualties": {
"normal_losses": null,
"abnormal_losses": null,
"source_of_hatching": null,
"cause_abnormal_losses": null,
"type_disease": null,
"sampling_done": null,
"type_sampling": null,
"images": null
},
"technical_officer": {
"technical_health_officer": "",
"technical_engineering_officer": ""
},
"input_status": {
"input_status": null,
"company_name": null,
"tracking_code": "",
"type_of_grain": null,
"inventory_in_warehouse": "",
"inventory_until_visit": "",
"grade_grain": null,
"images": null
},
"infrastructure_energy": {
"generator_type": "",
"generator_model": "",
"generator_count": "",
"generator_capacity": "",
"fuel_type": null,
"generator_performance": null,
"emergency_fuel_inventory": "",
"has_power_cut_history": null,
"power_cut_duration": "",
"power_cut_hour": "",
"additional_notes": ""
},
"hr": {
"number_employed": null,
"number_indigenous": null,
"number_non_indigenous": null,
"contract_status": null,
"trained": null
},
"facilities": {
"has_facilities": null,
"type_of_facility": null,
"amount": null,
"date": null,
"repayment_status": null,
"request_facilities": null
},
"inspection_status": "تایید شده",
"inspection_notes": "تست"
}
}

View File

@@ -2,3 +2,5 @@ description: This file stores settings for Dart & Flutter DevTools.
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
extensions: extensions:
- hive_ce: true - hive_ce: true
- provider: true
- shared_preferences: true

View File

@@ -1,3 +1,12 @@
import 'package:rasadyar_chicken/features/city_jahad/presentation/routes/routes.dart';
import 'package:rasadyar_chicken/features/poultry_science/presentation/routes/routes.dart';
import 'package:rasadyar_chicken/features/province_inspector/presentation/routes/routes.dart';
import 'package:rasadyar_chicken/features/province_operator/presentation/routes/routes.dart';
import 'package:rasadyar_chicken/features/province_supervisor/presentation/routes/routes.dart';
import 'package:rasadyar_chicken/features/steward/presentation/routes/routes.dart';
import 'package:rasadyar_chicken/features/super_admin/presentation/routes/routes.dart';
import 'package:rasadyar_chicken/features/jahad/presentation/routes/routes.dart';
import 'package:rasadyar_chicken/features/vet_farm/presentation/routes/routes.dart';
import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/presentation/routes/routes.dart';
String getFaUserRole(String? role) { String getFaUserRole(String? role) {
@@ -88,7 +97,7 @@ Map<String, String?> getFaUserRoleWithOnTap(String? role) {
case "Poultry": case "Poultry":
return {"مرغدار": null}; return {"مرغدار": null};
case "ProvinceOperator": case "ProvinceOperator":
return {"مدیر اجرایی": null}; return {"مدیر اجرایی": ProvinceOperatorRoutes.initProvinceOperator};
case "ProvinceFinancial": case "ProvinceFinancial":
return {"مالی اتحادیه": null}; return {"مالی اتحادیه": null};
case "KillHouse": case "KillHouse":
@@ -96,17 +105,17 @@ Map<String, String?> getFaUserRoleWithOnTap(String? role) {
case "KillHouseVet": case "KillHouseVet":
return {"دامپزشک کشتارگاه": null}; return {"دامپزشک کشتارگاه": null};
case "VetFarm": case "VetFarm":
return {"دامپزشک فارم": null}; return {"دامپزشک فارم": VetFarmRoutes.initVetFarm};
case "Driver": case "Driver":
return {"راننده": null}; return {"راننده": null};
case "ProvinceInspector": case "ProvinceInspector":
return {"بازرس اتحادیه": null}; return {"بازرس اتحادیه": ProvinceInspectorRoutes.initProvinceInspector};
case "VetSupervisor": case "VetSupervisor":
return {"دامپزشک کل": null}; return {"دامپزشک کل": null};
case "Jahad": case "Jahad":
return {"جهاد کشاورزی استان": null}; return {"جهاد کشاورزی استان": JahadRoutes.initJahad};
case "CityJahad": case "CityJahad":
return {"جهاد کشاورزی شهرستان": null}; return {"جهاد کشاورزی شهرستان": CityJahadRoutes.initCityJahad};
case "ProvincialGovernment": case "ProvincialGovernment":
return {"استانداری": null}; return {"استانداری": null};
case "Guilds": case "Guilds":
@@ -122,7 +131,7 @@ Map<String, String?> getFaUserRoleWithOnTap(String? role) {
case "Observatory": case "Observatory":
return {"رصدخانه": null}; return {"رصدخانه": null};
case "ProvinceSupervisor": case "ProvinceSupervisor":
return {"ناظر استان": null}; return {"ناظر استان": ProvinceSupervisorRoutes.initProvinceSupervisor};
case "GuildRoom": case "GuildRoom":
return {"اتاق اصناف": null}; return {"اتاق اصناف": null};
case "PosCompany": case "PosCompany":
@@ -130,7 +139,7 @@ Map<String, String?> getFaUserRoleWithOnTap(String? role) {
case "LiveStockSupport": case "LiveStockSupport":
return {"پشتیبانی امور دام": null}; return {"پشتیبانی امور دام": null};
case "SuperAdmin": case "SuperAdmin":
return {"ادمین کل": null}; return {"ادمین کل": SuperAdminRoutes.initSuperAdmin};
case "ChainCompany": case "ChainCompany":
return {"شرکت زنجیره": null}; return {"شرکت زنجیره": null};
case "AdminX": case "AdminX":
@@ -150,9 +159,9 @@ Map<String, String?> getFaUserRoleWithOnTap(String? role) {
case "LiveStockProvinceJahad": case "LiveStockProvinceJahad":
return {"جهاد استان": null}; return {"جهاد استان": null};
case "Steward": case "Steward":
return {"مباشر": ChickenRoutes.initSteward}; return {"مباشر": StewardRoutes.initSteward};
case "PoultryScience": case "PoultryScience":
return {"کارشناس طیور": ChickenRoutes.initPoultryScience}; return {"کارشناس طیور": PoultryScienceRoutes.initPoultryScience};
default: default:
return {"نامشخص": null}; return {"نامشخص": null};
} }

View File

@@ -1,208 +0,0 @@
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/broadcast_price/broadcast_price.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/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/steward_remain_weight/steward_remain_weight.dart';
import 'package:rasadyar_chicken/data/models/response/steward_sales_info_dashboard/steward_sales_info_dashboard.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<List<ProductModel>?> getRolesProducts({
required String token,
CancelToken? cancelToken,
Map<String, dynamic>? queryParameters,
});
Future<KillHouseDistributionInfo?> getKillHouseDistributionInfo({
required String token,
});
Future<BarInformation?> getGeneralBarInformation({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<PaginationModel<WaitingArrivalModel>?> getWaitingArrivals({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> setSateForArrivals({
required String token,
required Map<String, dynamic> request,
});
Future<PaginationModel<ImportedLoadsModel>?> getImportedLoadsModel({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<PaginationModel<AllocatedMadeModel>?> getAllocatedMade({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> confirmAllocation({
required String token,
required Map<String, dynamic> allocation,
});
Future<void> denyAllocation({
required String token,
required String allocationToken,
});
Future<void> confirmAllAllocation({
required String token,
required List<String> allocationTokens,
});
Future<List<GuildModel>?> getGuilds({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<GuildProfile?> getProfile({required String token});
Future<void> postSubmitStewardAllocation({
required String token,
required SubmitStewardAllocation request,
});
Future<void> deleteStewardAllocation({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> updateStewardAllocation({
required String token,
required ConformAllocation request,
});
Future<StewardFreeBarDashboard?> getStewardDashboard({
required String token,
required String stratDate,
required String endDate,
});
Future<DashboardKillHouseFreeBar?> getDashboardKillHouseFreeBar({
required String token,
required String stratDate,
required String endDate,
});
Future<PaginationModel<StewardFreeBar>?>
getStewardPurchasesOutSideOfTheProvince({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> createStewardPurchasesOutSideOfTheProvince({
required String token,
required CreateStewardFreeBar body,
});
Future<void> deleteStewardPurchasesOutSideOfTheProvince({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<CreateStewardFreeBar?> editStewardPurchasesOutSideOfTheProvince({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<PaginationModel<OutProvinceCarcassesBuyer>?>
getOutProvinceCarcassesBuyer({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> createOutProvinceCarcassesBuyer({
required String token,
required OutProvinceCarcassesBuyer body,
});
Future<List<IranProvinceCityModel>?> getProvince({CancelToken? cancelToken});
Future<List<IranProvinceCityModel>?> getCity({required String provinceName});
Future<PaginationModel<StewardFreeSaleBar>?> getStewardFreeSaleBar({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> createOutProvinceStewardFreeBar({
required String token,
required StewardFreeSaleBarRequest body,
});
Future<void> updateOutProvinceStewardFreeBar({
required String token,
required StewardFreeSaleBarRequest body,
});
Future<void> deleteOutProvinceStewardFreeBar({
required String token,
required String key,
});
Future<UserProfile?> getUserProfile({required String token});
Future<void> updateUserProfile({
required String token,
required UserProfile userProfile,
});
Future<void> updatePassword({
required String token,
required ChangePasswordRequestModel model,
});
Future<PaginationModel<SegmentationModel>?> getSegmentation({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> createSegmentation({
required String token,
required SegmentationModel model,
});
Future<void> editSegmentation({
required String token,
required SegmentationModel model,
});
Future<SegmentationModel?> deleteSegmentation({
required String token,
required String key,
});
Future<BroadcastPrice?> getBroadcastPrice({required String token});
Future<StewardSalesInfoDashboard?> getStewardSalesInfoDashboard({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<StewardRemainWeight?> getStewardRemainWeight({required String token});
}

View File

@@ -1,94 +0,0 @@
import 'package:rasadyar_chicken/data/models/poultry_export/poultry_export.dart';
import 'package:rasadyar_chicken/data/models/request/kill_registration/kill_registration.dart';
import 'package:rasadyar_chicken/data/models/response/all_poultry/all_poultry.dart';
import 'package:rasadyar_chicken/data/models/response/approved_price/approved_price.dart';
import 'package:rasadyar_chicken/data/models/response/hatching/hatching_models.dart';
import 'package:rasadyar_chicken/data/models/response/hatching_report/hatching_report.dart';
import 'package:rasadyar_chicken/data/models/response/kill_house_poultry/kill_house_poultry.dart';
import 'package:rasadyar_chicken/data/models/response/kill_request_poultry/kill_request_poultry.dart';
import 'package:rasadyar_chicken/data/models/response/poultry_farm/poultry_farm.dart';
import 'package:rasadyar_chicken/data/models/response/poultry_hatching/poultry_hatching.dart';
import 'package:rasadyar_chicken/data/models/response/poultry_order/poultry_order.dart';
import 'package:rasadyar_chicken/data/models/response/poultry_science/home_poultry_science/home_poultry_science_model.dart';
import 'package:rasadyar_chicken/data/models/response/sell_for_freezing/sell_for_freezing.dart';
import 'package:rasadyar_core/core.dart';
abstract class PoultryScienceRemoteDatasource {
Future<HomePoultryScienceModel?> getHomePoultryScience({
required String token,
required String type,
});
Future<PaginationModel<HatchingModel>?> getHatchingPoultry({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> submitPoultryScienceReport({
required String token,
required FormData data,
ProgressCallback? onSendProgress,
});
Future<PaginationModel<HatchingReport>?> getPoultryScienceReport({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<PaginationModel<PoultryFarm>?> getPoultryScienceFarmList({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<ApprovedPrice?> getApprovedPrice({ required String token,
Map<String, dynamic>? queryParameters,});
Future<List<AllPoultry>?> getAllPoultry({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<SellForFreezing?> getSellForFreezing({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<PoultryExport?> getPoultryExport({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<List<KillRequestPoultry>?> getUserPoultry({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<List<PoultryHatching>?> getPoultryHatching({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<List<KillHousePoultry>?> getKillHouseList({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> submitKillRegistration({
required String token,
required KillRegistrationRequest request,
});
Future<PaginationModel<PoultryOrder>?> getPoultryOderList({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> deletePoultryOder({
required String token,
required String orderId,
});
}

View File

@@ -1,23 +1,19 @@
import 'package:rasadyar_chicken/chicken.dart';
import 'package:rasadyar_chicken/data/common/dio_error_handler.dart'; import 'package:rasadyar_chicken/data/common/dio_error_handler.dart';
import 'package:rasadyar_chicken/data/data_source/local/chicken_local.dart'; import 'package:rasadyar_chicken/features/common/presentation/routes/routes.dart';
import 'package:rasadyar_chicken/data/data_source/local/chicken_local_imp.dart'; import 'package:rasadyar_chicken/features/common/data/di/common_di.dart';
import 'package:rasadyar_chicken/data/data_source/remote/auth/auth_remote.dart';
import 'package:rasadyar_chicken/data/data_source/remote/auth/auth_remote_imp.dart';
import 'package:rasadyar_chicken/data/data_source/remote/chicken/chicken_remote.dart';
import 'package:rasadyar_chicken/data/data_source/remote/chicken/chicken_remote_imp.dart';
import 'package:rasadyar_chicken/data/data_source/remote/kill_house/kill_house_remote.dart'; import 'package:rasadyar_chicken/data/data_source/remote/kill_house/kill_house_remote.dart';
import 'package:rasadyar_chicken/data/data_source/remote/kill_house/kill_house_remote_impl.dart'; import 'package:rasadyar_chicken/data/data_source/remote/kill_house/kill_house_remote_impl.dart';
import 'package:rasadyar_chicken/data/data_source/remote/poultry_science/poultry_science_remote.dart';
import 'package:rasadyar_chicken/data/data_source/remote/poultry_science/poultry_science_remote_imp.dart';
import 'package:rasadyar_chicken/data/repositories/auth/auth_repository.dart';
import 'package:rasadyar_chicken/data/repositories/auth/auth_repository_imp.dart';
import 'package:rasadyar_chicken/data/repositories/chicken/chicken_repository.dart';
import 'package:rasadyar_chicken/data/repositories/chicken/chicken_repository_imp.dart';
import 'package:rasadyar_chicken/data/repositories/kill_house/kill_house_repository.dart'; import 'package:rasadyar_chicken/data/repositories/kill_house/kill_house_repository.dart';
import 'package:rasadyar_chicken/data/repositories/kill_house/kill_house_repository_impl.dart'; import 'package:rasadyar_chicken/data/repositories/kill_house/kill_house_repository_impl.dart';
import 'package:rasadyar_chicken/data/repositories/poultry_science/poultry_science_repository.dart'; import 'package:rasadyar_chicken/features/poultry_science/data/di/poultry_science_di.dart';
import 'package:rasadyar_chicken/data/repositories/poultry_science/poultry_science_repository_imp.dart'; import 'package:rasadyar_chicken/features/steward/data/di/steward_di.dart';
import 'package:rasadyar_chicken/features/province_operator/data/di/province_operator_di.dart';
import 'package:rasadyar_chicken/features/province_inspector/data/di/province_inspector_di.dart';
import 'package:rasadyar_chicken/features/city_jahad/data/di/city_jahad_di.dart';
import 'package:rasadyar_chicken/features/vet_farm/data/di/vet_farm_di.dart';
import 'package:rasadyar_chicken/features/super_admin/data/di/super_admin_di.dart';
import 'package:rasadyar_chicken/features/province_supervisor/data/di/province_supervisor_di.dart';
import 'package:rasadyar_chicken/features/jahad/data/di/jahad_di.dart';
import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/core.dart';
GetIt diChicken = GetIt.asNewInstance(); GetIt diChicken = GetIt.asNewInstance();
@@ -40,7 +36,7 @@ Future<void> setupChickenDI() async {
}, },
clearTokenCallback: () async { clearTokenCallback: () async {
await tokenService.deleteModuleTokens(Module.chicken); await tokenService.deleteModuleTokens(Module.chicken);
Get.offAllNamed(ChickenRoutes.auth, arguments: Module.chicken); Get.offAllNamed(CommonRoutes.auth, arguments: Module.chicken);
}, },
), ),
instanceName: 'chickenInterceptor', instanceName: 'chickenInterceptor',
@@ -60,47 +56,42 @@ Future<void> setupChickenDI() async {
final dioRemote = diChicken.get<DioRemote>(); final dioRemote = diChicken.get<DioRemote>();
await dioRemote.init(); await dioRemote.init();
diChicken.registerLazySingleton<AuthRemoteDataSource>( // Setup common feature DI
() => AuthRemoteDataSourceImp(dioRemote), await setupCommonDI(diChicken, dioRemote);
);
diChicken.registerLazySingleton<AuthRepository>( // Setup poultry_science feature DI
() => AuthRepositoryImpl(diChicken.get<AuthRemoteDataSource>()), await setupPoultryScienceDI(diChicken, dioRemote);
);
diChicken.registerLazySingleton<ChickenRemoteDatasource>( // Setup steward feature DI
() => ChickenRemoteDatasourceImp(diChicken.get<DioRemote>()), await setupStewardDI(diChicken, dioRemote);
);
diChicken.registerLazySingleton<ChickenLocalDataSource>( // Setup province_operator feature DI
() => ChickenLocalDataSourceImp(), await setupProvinceOperatorDI(diChicken, dioRemote);
);
diChicken.registerLazySingleton<ChickenRepository>( // Setup province_inspector feature DI
() => ChickenRepositoryImp( await setupProvinceInspectorDI(diChicken, dioRemote);
remote: diChicken.get<ChickenRemoteDatasource>(),
local: diChicken.get<ChickenLocalDataSource>(),
),
);
diChicken.registerLazySingleton<PoultryScienceRemoteDatasource>( // Setup city_jahad feature DI
() => PoultryScienceRemoteDatasourceImp(diChicken.get<DioRemote>()), await setupCityJahadDI(diChicken, dioRemote);
);
diChicken.registerLazySingleton<PoultryScienceRepository>( // Setup vet_farm feature DI
() => PoultryScienceRepositoryImp( await setupVetFarmDI(diChicken, dioRemote);
diChicken.get<PoultryScienceRemoteDatasource>(),
), // Setup super_admin feature DI
); await setupSuperAdminDI(diChicken, dioRemote);
// Setup province_supervisor feature DI
await setupProvinceSupervisorDI(diChicken, dioRemote);
// Setup jahad feature DI
await setupJahadDI(diChicken, dioRemote);
//region kill house module DI //region kill house module DI
diChicken.registerLazySingleton<KillHouseRemoteDataSource>( diChicken.registerLazySingleton<KillHouseRemoteDataSource>(
() => KillHouseRemoteDataSourceImpl(diChicken.get<DioRemote>()), () => KillHouseRemoteDataSourceImpl(diChicken.get<DioRemote>()),
); );
diChicken.registerLazySingleton<KillHouseRepository>( diChicken.registerLazySingleton<KillHouseRepository>(
() => KillHouseRepositoryImpl( () => KillHouseRepositoryImpl(diChicken.get<KillHouseRemoteDataSource>()),
diChicken.get<KillHouseRemoteDataSource>(),
),
); );
//endregion //endregion
} }
@@ -108,35 +99,26 @@ Future<void> setupChickenDI() async {
Future<void> newSetupAuthDI(String newUrl) async { Future<void> newSetupAuthDI(String newUrl) async {
var tokenService = Get.find<TokenStorageService>(); var tokenService = Get.find<TokenStorageService>();
// همیشه baseUrl جدید رو ذخیره کن
await tokenService.saveBaseUrl(Module.chicken, newUrl); await tokenService.saveBaseUrl(Module.chicken, newUrl);
// Re-register AppInterceptor // پاک‌سازی DI مخصوص ماژول مرغ
if (diChicken.isRegistered<AppInterceptor>( await diChicken.resetScope();
instanceName: 'chickenInterceptor', diChicken.pushNewScope();
)) {
await diChicken.unregister<AppInterceptor>( // --- Re-register AppInterceptor
instanceName: 'chickenInterceptor',
);
}
diChicken.registerLazySingleton<AppInterceptor>( diChicken.registerLazySingleton<AppInterceptor>(
() => AppInterceptor( () => AppInterceptor(
refreshTokenCallback: () async => null, refreshTokenCallback: () async => null,
saveTokenCallback: (String newToken) async { saveTokenCallback: (newToken) async {},
// await tokenService.saveAccessToken(newToken);
},
clearTokenCallback: () async { clearTokenCallback: () async {
await tokenService.deleteModuleTokens(Module.chicken); await tokenService.deleteModuleTokens(Module.chicken);
Get.offAllNamed(ChickenRoutes.auth, arguments: Module.chicken); Get.offAllNamed(CommonRoutes.auth, arguments: Module.chicken);
}, },
), ),
instanceName: 'chickenInterceptor', instanceName: 'chickenInterceptor',
); );
// Re-register DioRemote // --- Re-register DioRemote
if (diChicken.isRegistered<DioRemote>()) {
await diChicken.unregister<DioRemote>();
}
diChicken.registerLazySingleton<DioRemote>( diChicken.registerLazySingleton<DioRemote>(
() => DioRemote( () => DioRemote(
baseUrl: newUrl, baseUrl: newUrl,
@@ -145,35 +127,21 @@ Future<void> newSetupAuthDI(String newUrl) async {
), ),
), ),
); );
final dioRemote = diChicken.get<DioRemote>(); final dioRemote = diChicken.get<DioRemote>();
await dioRemote.init(); await dioRemote.init();
// Re-register dependent layers // --- common, poultry_science, steward, and other features
await reRegister<AuthRemoteDataSource>( await setupCommonDI(diChicken, dioRemote);
() => AuthRemoteDataSourceImp(dioRemote), await setupPoultryScienceDI(diChicken, dioRemote);
); await setupStewardDI(diChicken, dioRemote);
await reRegister<AuthRepository>( await setupProvinceOperatorDI(diChicken, dioRemote);
() => AuthRepositoryImpl(diChicken.get<AuthRemoteDataSource>()), await setupProvinceInspectorDI(diChicken, dioRemote);
); await setupCityJahadDI(diChicken, dioRemote);
await reRegister<ChickenRemoteDatasource>( await setupVetFarmDI(diChicken, dioRemote);
() => ChickenRemoteDatasourceImp(dioRemote), await setupSuperAdminDI(diChicken, dioRemote);
); await setupProvinceSupervisorDI(diChicken, dioRemote);
await reRegister<ChickenLocalDataSource>(() => ChickenLocalDataSourceImp()); await setupJahadDI(diChicken, dioRemote);
await reRegister<ChickenRepository>(
() => ChickenRepositoryImp(
remote: diChicken.get<ChickenRemoteDatasource>(),
local: diChicken.get<ChickenLocalDataSource>(),
),
);
await reRegister<PoultryScienceRemoteDatasource>(
() => PoultryScienceRemoteDatasourceImp(dioRemote),
);
await reRegister<PoultryScienceRepository>(
() => PoultryScienceRepositoryImp(
diChicken.get<PoultryScienceRemoteDatasource>(),
),
);
} }
Future<void> reRegister<T extends Object>(T Function() factory) async { Future<void> reRegister<T extends Object>(T Function() factory) async {

View File

@@ -1,224 +0,0 @@
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';
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/broadcast_price/broadcast_price.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/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/steward_remain_weight/steward_remain_weight.dart';
import 'package:rasadyar_chicken/data/models/response/steward_sales_info_dashboard/steward_sales_info_dashboard.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';
import '../../models/request/create_steward_free_bar/create_steward_free_bar.dart';
abstract class ChickenRepository {
//region Remote
Future<List<ProductModel>?> getRolesProducts({
required String token,
CancelToken? cancelToken,
Map<String, dynamic>? queryParameters,
});
//region Steward
Future<KillHouseDistributionInfo?> getKillHouseDistributionInfo({
required String token,
});
Future<BarInformation?> getGeneralBarInformation({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<PaginationModel<WaitingArrivalModel>?> getWaitingArrivals({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> setSateForArrivals({
required String token,
required Map<String, dynamic> request,
});
Future<PaginationModel<ImportedLoadsModel>?> getImportedLoadsModel({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<PaginationModel<AllocatedMadeModel>?> getAllocatedMade({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> confirmAllocation({
required String token,
required Map<String, dynamic> allocation,
});
Future<void> denyAllocation({
required String token,
required String allocationToken,
});
Future<void> confirmAllAllocation({
required String token,
required List<String> allocationTokens,
});
Future<List<GuildModel>?> getGuilds({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<GuildProfile?> getProfile({required String token});
Future<void> postSubmitStewardAllocation({
required String token,
required SubmitStewardAllocation request,
});
Future<void> deleteStewardAllocation({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> updateStewardAllocation({
required String token,
required ConformAllocation request,
});
Future<StewardFreeBarDashboard?> getStewardDashboard({
required String token,
required String stratDate,
required String endDate,
});
Future<DashboardKillHouseFreeBar?> getDashboardKillHouseFreeBar({
required String token,
required String stratDate,
required String endDate,
});
Future<PaginationModel<StewardFreeBar>?>
getStewardPurchasesOutSideOfTheProvince({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> createStewardPurchasesOutSideOfTheProvince({
required String token,
required CreateStewardFreeBar body,
});
Future<CreateStewardFreeBar?> editStewardPurchasesOutSideOfTheProvince({
required String token,
required CreateStewardFreeBar body,
});
Future<void> deleteStewardPurchasesOutSideOfTheProvince({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<PaginationModel<OutProvinceCarcassesBuyer>?>
getOutProvinceCarcassesBuyer({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> createOutProvinceCarcassesBuyer({
required String token,
required OutProvinceCarcassesBuyer body,
});
Future<List<IranProvinceCityModel>?> getProvince({CancelToken? cancelToken});
Future<List<IranProvinceCityModel>?> getCity({required String provinceName});
Future<PaginationModel<StewardFreeSaleBar>?> getStewardFreeSaleBar({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> createOutProvinceStewardFreeBar({
required String token,
required StewardFreeSaleBarRequest body,
});
Future<void> updateOutProvinceStewardFreeBar({
required String token,
required StewardFreeSaleBarRequest body,
});
Future<void> deleteOutProvinceStewardFreeBar({
required String token,
required String key,
});
Future<UserProfile?> getUserProfile({required String token});
Future<void> updateUserProfile({
required String token,
required UserProfile userProfile,
});
Future<void> updatePassword({
required String token,
required ChangePasswordRequestModel model,
});
Future<PaginationModel<SegmentationModel>?> getSegmentation({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> createSegmentation({
required String token,
required SegmentationModel model,
});
Future<void> editSegmentation({
required String token,
required SegmentationModel model,
});
Future<SegmentationModel?> deleteSegmentation({
required String token,
required String key,
});
Future<BroadcastPrice?> getBroadcastPrice({required String token});
Future<StewardSalesInfoDashboard?> getStewardSalesInfoDashboard({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<StewardRemainWeight?> getStewardRemainWeight({required String token});
//endregion
//endregion
//region local
Future<void> initWidleyUsed();
WidelyUsedLocalModel? getAllWidely();
//endregion
}

View File

@@ -1,434 +0,0 @@
import 'package:rasadyar_chicken/data/data_source/local/chicken_local.dart';
import 'package:rasadyar_chicken/data/data_source/remote/chicken/chicken_remote.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';
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/broadcast_price/broadcast_price.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/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/steward_remain_weight/steward_remain_weight.dart';
import 'package:rasadyar_chicken/data/models/response/steward_sales_info_dashboard/steward_sales_info_dashboard.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';
import 'chicken_repository.dart';
class ChickenRepositoryImp implements ChickenRepository {
final ChickenRemoteDatasource remote;
final ChickenLocalDataSource local;
ChickenRepositoryImp({required this.remote, required this.local});
//region Remote
@override
Future<KillHouseDistributionInfo?> getKillHouseDistributionInfo({
required String token,
}) async {
var res = await remote.getKillHouseDistributionInfo(token: token);
return res;
}
@override
Future<BarInformation?> getGeneralBarInformation({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
var res = await remote.getGeneralBarInformation(
token: token,
queryParameters: queryParameters,
);
return res;
}
@override
Future<PaginationModel<WaitingArrivalModel>?> getWaitingArrivals({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
var res = await remote.getWaitingArrivals(
token: token,
queryParameters: queryParameters,
);
return res;
}
@override
Future<void> setSateForArrivals({
required String token,
required Map<String, dynamic> request,
}) async {
await remote.setSateForArrivals(token: token, request: request);
}
@override
Future<PaginationModel<ImportedLoadsModel>?> getImportedLoadsModel({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
var res = await remote.getImportedLoadsModel(
token: token,
queryParameters: queryParameters,
);
return res;
}
@override
Future<PaginationModel<AllocatedMadeModel>?> getAllocatedMade({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
var res = await remote.getAllocatedMade(
token: token,
queryParameters: queryParameters,
);
return res;
}
@override
Future<void> confirmAllocation({
required String token,
required Map<String, dynamic> allocation,
}) async {
await remote.confirmAllocation(token: token, allocation: allocation);
}
@override
Future<void> denyAllocation({
required String token,
required String allocationToken,
}) async {
await remote.denyAllocation(token: token, allocationToken: allocationToken);
}
@override
Future<void> confirmAllAllocation({
required String token,
required List<String> allocationTokens,
}) async {
await remote.confirmAllAllocation(
token: token,
allocationTokens: allocationTokens,
);
}
@override
Future<List<ProductModel>?> getRolesProducts({
required String token,
CancelToken? cancelToken,
Map<String, dynamic>? queryParameters,
}) async {
var res = await remote.getRolesProducts(
token: token,
cancelToken: cancelToken,
queryParameters: queryParameters,
);
return res;
}
@override
Future<List<GuildModel>?> getGuilds({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
var res = await remote.getGuilds(
token: token,
queryParameters: queryParameters,
);
return res;
}
@override
Future<GuildProfile?> getProfile({required String token}) async {
var res = await remote.getProfile(token: token);
return res;
}
@override
Future<void> postSubmitStewardAllocation({
required String token,
required SubmitStewardAllocation request,
}) async {
await remote.postSubmitStewardAllocation(token: token, request: request);
}
@override
Future<void> deleteStewardAllocation({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
await remote.deleteStewardAllocation(
token: token,
queryParameters: queryParameters,
);
}
@override
Future<void> updateStewardAllocation({
required String token,
required ConformAllocation request,
}) async {
await remote.updateStewardAllocation(token: token, request: request);
}
@override
Future<StewardFreeBarDashboard?> getStewardDashboard({
required String token,
required String stratDate,
required String endDate,
}) async {
var res = await remote.getStewardDashboard(
token: token,
stratDate: stratDate,
endDate: endDate,
);
return res;
}
@override
Future<DashboardKillHouseFreeBar?> getDashboardKillHouseFreeBar({
required String token,
required String stratDate,
required String endDate,
}) async {
var res = await remote.getDashboardKillHouseFreeBar(
token: token,
stratDate: stratDate,
endDate: endDate,
);
return res;
}
@override
Future<PaginationModel<StewardFreeBar>?>
getStewardPurchasesOutSideOfTheProvince({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
var res = await remote.getStewardPurchasesOutSideOfTheProvince(
token: token,
queryParameters: queryParameters,
);
return res;
}
@override
Future<List<IranProvinceCityModel>?> getCity({
required String provinceName,
}) async {
var res = await remote.getCity(provinceName: provinceName);
return res;
}
@override
Future<List<IranProvinceCityModel>?> getProvince({
CancelToken? cancelToken,
}) async {
var res = await remote.getProvince(cancelToken: cancelToken);
return res;
}
@override
Future<void> createStewardPurchasesOutSideOfTheProvince({
required String token,
required CreateStewardFreeBar body,
}) async {
await remote.createStewardPurchasesOutSideOfTheProvince(
token: token,
body: body,
);
}
@override
Future<CreateStewardFreeBar?> editStewardPurchasesOutSideOfTheProvince({
required String token,
required CreateStewardFreeBar body,
}) async {
return await remote.editStewardPurchasesOutSideOfTheProvince(
token: token,
queryParameters: body.toJson()
..removeWhere((key, value) => value == null),
);
}
@override
Future<void> deleteStewardPurchasesOutSideOfTheProvince({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
await remote.deleteStewardPurchasesOutSideOfTheProvince(
token: token,
queryParameters: queryParameters,
);
}
@override
Future<PaginationModel<OutProvinceCarcassesBuyer>?>
getOutProvinceCarcassesBuyer({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
var res = await remote.getOutProvinceCarcassesBuyer(
token: token,
queryParameters: queryParameters,
);
return res;
}
@override
Future<void> createOutProvinceCarcassesBuyer({
required String token,
required OutProvinceCarcassesBuyer body,
}) async {
await remote.createOutProvinceCarcassesBuyer(token: token, body: body);
}
@override
Future<PaginationModel<StewardFreeSaleBar>?> getStewardFreeSaleBar({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
var res = await remote.getStewardFreeSaleBar(
token: token,
queryParameters: queryParameters,
);
return res;
}
@override
Future<void> createOutProvinceStewardFreeBar({
required String token,
required StewardFreeSaleBarRequest body,
}) async {
await remote.createOutProvinceStewardFreeBar(token: token, body: body);
}
@override
Future<void> updateOutProvinceStewardFreeBar({
required String token,
required StewardFreeSaleBarRequest body,
}) async {
await remote.updateOutProvinceStewardFreeBar(token: token, body: body);
}
@override
Future<void> deleteOutProvinceStewardFreeBar({
required String token,
required String key,
}) async {
await remote.deleteOutProvinceStewardFreeBar(token: token, key: key);
}
@override
Future<UserProfile?> getUserProfile({required String token}) async {
var res = await remote.getUserProfile(token: token);
return res;
}
@override
Future<void> updateUserProfile({
required String token,
required UserProfile userProfile,
}) async {
await remote.updateUserProfile(token: token, userProfile: userProfile);
}
@override
Future<void> updatePassword({
required String token,
required ChangePasswordRequestModel model,
}) async {
await remote.updatePassword(token: token, model: model);
}
@override
Future<PaginationModel<SegmentationModel>?> getSegmentation({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
var res = await remote.getSegmentation(
token: token,
queryParameters: queryParameters,
);
return res;
}
@override
Future<void> createSegmentation({
required String token,
required SegmentationModel model,
}) async {
await remote.createSegmentation(token: token, model: model);
}
@override
Future<void> editSegmentation({
required String token,
required SegmentationModel model,
}) async {
await remote.editSegmentation(token: token, model: model);
}
@override
Future<SegmentationModel?> deleteSegmentation({
required String token,
required String key,
}) async {
var res = await remote.deleteSegmentation(token: token, key: key);
return res;
}
@override
Future<BroadcastPrice?> getBroadcastPrice({required String token}) async {
var res = await remote.getBroadcastPrice(token: token);
return res;
}
//endregion
//region local
@override
WidelyUsedLocalModel? getAllWidely() => local.getAllWidely();
@override
Future<void> initWidleyUsed() async {
await local.initWidleyUsed();
}
@override
Future<StewardSalesInfoDashboard?> getStewardSalesInfoDashboard({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
return await remote.getStewardSalesInfoDashboard(
token: token,
queryParameters: queryParameters,
);
}
@override
Future<StewardRemainWeight?> getStewardRemainWeight({
required String token,
}) async {
return await remote.getStewardRemainWeight(token: token);
}
//endregion
}

View File

@@ -1,91 +0,0 @@
import 'package:rasadyar_chicken/data/models/poultry_export/poultry_export.dart';
import 'package:rasadyar_chicken/data/models/request/kill_registration/kill_registration.dart';
import 'package:rasadyar_chicken/data/models/response/all_poultry/all_poultry.dart';
import 'package:rasadyar_chicken/data/models/response/approved_price/approved_price.dart';
import 'package:rasadyar_chicken/data/models/response/hatching/hatching_models.dart';
import 'package:rasadyar_chicken/data/models/response/hatching_report/hatching_report.dart';
import 'package:rasadyar_chicken/data/models/response/kill_house_poultry/kill_house_poultry.dart';
import 'package:rasadyar_chicken/data/models/response/kill_request_poultry/kill_request_poultry.dart';
import 'package:rasadyar_chicken/data/models/response/poultry_farm/poultry_farm.dart';
import 'package:rasadyar_chicken/data/models/response/poultry_hatching/poultry_hatching.dart';
import 'package:rasadyar_chicken/data/models/response/poultry_order/poultry_order.dart';
import 'package:rasadyar_chicken/data/models/response/poultry_science/home_poultry_science/home_poultry_science_model.dart';
import 'package:rasadyar_chicken/data/models/response/sell_for_freezing/sell_for_freezing.dart';
import 'package:rasadyar_core/core.dart';
abstract class PoultryScienceRepository {
Future<HomePoultryScienceModel?> getHomePoultry({required String token, required String type});
Future<PaginationModel<HatchingModel>?> getHatchingPoultry({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> submitPoultryScienceReport({
required String token,
required FormData data,
ProgressCallback? onSendProgress,
});
Future<PaginationModel<HatchingReport>?> getHatchingPoultryReport({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<PaginationModel<PoultryFarm>?> getPoultryScienceFarmList({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<ApprovedPrice?> getApprovedPrice({ required String token,
Map<String, dynamic>? queryParameters,});
Future<List<AllPoultry>?> getAllPoultry({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<SellForFreezing?> getSellForFreezing({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<PoultryExport?> getPoultryExport({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<List<KillRequestPoultry>?> getUserPoultry({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<List<PoultryHatching>?> getPoultryHatching({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<List<KillHousePoultry>?> getKillHouseList({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> submitKillRegistration({
required String token,
required KillRegistrationRequest request,
});
Future<PaginationModel<PoultryOrder>?> getPoultryOderList({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> deletePoultryOder({
required String token,
required String orderId,
});
}

View File

@@ -1,145 +0,0 @@
import 'package:rasadyar_chicken/data/data_source/remote/poultry_science/poultry_science_remote.dart';
import 'package:rasadyar_chicken/data/models/poultry_export/poultry_export.dart';
import 'package:rasadyar_chicken/data/models/request/kill_registration/kill_registration.dart';
import 'package:rasadyar_chicken/data/models/response/all_poultry/all_poultry.dart';
import 'package:rasadyar_chicken/data/models/response/approved_price/approved_price.dart';
import 'package:rasadyar_chicken/data/models/response/hatching/hatching_models.dart';
import 'package:rasadyar_chicken/data/models/response/hatching_report/hatching_report.dart';
import 'package:rasadyar_chicken/data/models/response/kill_house_poultry/kill_house_poultry.dart';
import 'package:rasadyar_chicken/data/models/response/kill_request_poultry/kill_request_poultry.dart';
import 'package:rasadyar_chicken/data/models/response/poultry_farm/poultry_farm.dart';
import 'package:rasadyar_chicken/data/models/response/poultry_hatching/poultry_hatching.dart';
import 'package:rasadyar_chicken/data/models/response/poultry_order/poultry_order.dart';
import 'package:rasadyar_chicken/data/models/response/poultry_science/home_poultry_science/home_poultry_science_model.dart';
import 'package:rasadyar_chicken/data/models/response/sell_for_freezing/sell_for_freezing.dart';
import 'package:rasadyar_core/core.dart';
import 'poultry_science_repository.dart';
class PoultryScienceRepositoryImp implements PoultryScienceRepository {
final PoultryScienceRemoteDatasource datasource;
PoultryScienceRepositoryImp(this.datasource);
@override
Future<HomePoultryScienceModel?> getHomePoultry({
required String token,
required String type,
}) async => await datasource.getHomePoultryScience(token: token, type: type);
@override
Future<PaginationModel<HatchingModel>?> getHatchingPoultry({
required String token,
Map<String, dynamic>? queryParameters,
}) async => await datasource.getHatchingPoultry(token: token, queryParameters: queryParameters);
@override
Future<void> submitPoultryScienceReport({
required String token,
required FormData data,
ProgressCallback? onSendProgress,
}) async => await datasource.submitPoultryScienceReport(
token: token,
data: data,
onSendProgress: onSendProgress,
);
@override
Future<PaginationModel<HatchingReport>?> getHatchingPoultryReport({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
return await datasource.getPoultryScienceReport(token: token, queryParameters: queryParameters);
}
@override
Future<PaginationModel<PoultryFarm>?> getPoultryScienceFarmList({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
return await datasource.getPoultryScienceFarmList(
token: token,
queryParameters: queryParameters,
);
}
@override
Future<ApprovedPrice?> getApprovedPrice({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
return await datasource.getApprovedPrice(token: token, queryParameters: queryParameters);
}
@override
Future<List<AllPoultry>?> getAllPoultry({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
return await datasource.getAllPoultry(token: token, queryParameters: queryParameters);
}
@override
Future<PoultryExport?> getPoultryExport({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
return await datasource.getPoultryExport(token: token, queryParameters: queryParameters);
}
@override
Future<SellForFreezing?> getSellForFreezing({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
return await datasource.getSellForFreezing(token: token, queryParameters: queryParameters);
}
@override
Future<List<KillRequestPoultry>?> getUserPoultry({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
return await datasource.getUserPoultry(token: token, queryParameters: queryParameters);
}
@override
Future<List<PoultryHatching>?> getPoultryHatching({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
return await datasource.getPoultryHatching(token: token, queryParameters: queryParameters);
}
@override
Future<List<KillHousePoultry>?> getKillHouseList({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
return await datasource.getKillHouseList(token: token, queryParameters: queryParameters);
}
@override
Future<void> submitKillRegistration({
required String token,
required KillRegistrationRequest request,
}) async {
await datasource.submitKillRegistration(token: token, request: request);
}
@override
Future<PaginationModel<PoultryOrder>?> getPoultryOderList({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
return await datasource.getPoultryOderList(token: token, queryParameters: queryParameters);
}
@override
Future<void> deletePoultryOder({
required String token,
required String orderId,
}) async {
await datasource.deletePoultryOder(token: token, orderId: orderId);
}
}

View File

@@ -0,0 +1,3 @@
export 'data/di/city_jahad_di.dart';
export 'presentation/routes/routes.dart';
export 'presentation/routes/pages.dart';

View File

@@ -0,0 +1,15 @@
import 'package:rasadyar_chicken/features/poultry_science/data/model/response/poultry_science_report/poultry_science_report.dart';
import 'package:rasadyar_chicken/features/poultry_science/data/model/request/submit_inspection/submit_inspection_response.dart';
import 'package:rasadyar_core/core.dart';
abstract class CityJahadRemoteDataSource {
Future<PaginationModel<PoultryScienceReport>?> getSubmitInspectionList({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> submitInspection({
required String token,
required SubmitInspectionResponse request,
});
}

View File

@@ -0,0 +1,39 @@
import 'package:rasadyar_chicken/features/poultry_science/data/model/response/poultry_science_report/poultry_science_report.dart';
import 'package:rasadyar_chicken/features/poultry_science/data/model/request/submit_inspection/submit_inspection_response.dart';
import 'package:rasadyar_chicken/features/city_jahad/data/datasources/remote/city_jahad_remote_data_source.dart';
import 'package:rasadyar_core/core.dart';
class CityJahadRemoteDataSourceImpl implements CityJahadRemoteDataSource {
final DioRemote _httpClient;
CityJahadRemoteDataSourceImpl(this._httpClient);
@override
Future<PaginationModel<PoultryScienceReport>?> getSubmitInspectionList({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
var res = await _httpClient.get(
'/poultry_science_report/',
headers: {'Authorization': 'Bearer $token'},
queryParameters: queryParameters,
fromJson: (json) => PaginationModel<PoultryScienceReport>.fromJson(
json,
(json) => PoultryScienceReport.fromJson(json as Map<String, dynamic>),
),
);
return res.data;
}
@override
Future<void> submitInspection({
required String token,
required SubmitInspectionResponse request,
}) async {
await _httpClient.post(
'/poultry_science_report/',
headers: {'Authorization': 'Bearer $token'},
data: request.toJson(),
);
}
}

View File

@@ -0,0 +1,36 @@
import 'package:rasadyar_chicken/features/city_jahad/data/datasources/remote/city_jahad_remote_data_source.dart';
import 'package:rasadyar_chicken/features/city_jahad/data/datasources/remote/city_jahad_remote_data_source_impl.dart';
import 'package:rasadyar_chicken/features/city_jahad/data/repositories/city_jahad_repository.dart';
import 'package:rasadyar_chicken/features/city_jahad/data/repositories/city_jahad_repository_impl.dart';
import 'package:rasadyar_core/core.dart';
/// Setup dependency injection for city_jahad feature
Future<void> setupCityJahadDI(GetIt di, DioRemote dioRemote) async {
di.registerLazySingleton<CityJahadRemoteDataSource>(
() => CityJahadRemoteDataSourceImpl(dioRemote),
);
di.registerLazySingleton<CityJahadRepository>(
() => CityJahadRepositoryImpl(di.get<CityJahadRemoteDataSource>()),
);
}
/// Re-register city_jahad dependencies (used when base URL changes)
Future<void> reRegisterCityJahadDI(GetIt di, DioRemote dioRemote) async {
await reRegister(di, () => CityJahadRemoteDataSourceImpl(dioRemote));
await reRegister(
di,
() => CityJahadRepositoryImpl(di.get<CityJahadRemoteDataSource>()),
);
}
/// Helper function to re-register a dependency
Future<void> reRegister<T extends Object>(
GetIt di,
T Function() factory,
) async {
if (di.isRegistered<T>()) {
await di.unregister<T>();
}
di.registerLazySingleton<T>(factory);
}

View File

@@ -0,0 +1,15 @@
import 'package:rasadyar_chicken/features/poultry_science/data/model/response/poultry_science_report/poultry_science_report.dart';
import 'package:rasadyar_chicken/features/poultry_science/data/model/request/submit_inspection/submit_inspection_response.dart';
import 'package:rasadyar_core/core.dart';
abstract class CityJahadRepository {
Future<PaginationModel<PoultryScienceReport>?> getSubmitInspectionList({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> submitInspection({
required String token,
required SubmitInspectionResponse request,
});
}

View File

@@ -0,0 +1,30 @@
import 'package:rasadyar_chicken/features/poultry_science/data/model/response/poultry_science_report/poultry_science_report.dart';
import 'package:rasadyar_chicken/features/poultry_science/data/model/request/submit_inspection/submit_inspection_response.dart';
import 'package:rasadyar_chicken/features/city_jahad/data/datasources/remote/city_jahad_remote_data_source.dart';
import 'package:rasadyar_chicken/features/city_jahad/data/repositories/city_jahad_repository.dart';
import 'package:rasadyar_core/core.dart';
class CityJahadRepositoryImpl implements CityJahadRepository {
final CityJahadRemoteDataSource _remote;
CityJahadRepositoryImpl(this._remote);
@override
Future<PaginationModel<PoultryScienceReport>?> getSubmitInspectionList({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
return await _remote.getSubmitInspectionList(
token: token,
queryParameters: queryParameters,
);
}
@override
Future<void> submitInspection({
required String token,
required SubmitInspectionResponse request,
}) async {
return await _remote.submitInspection(token: token, request: request);
}
}

View File

@@ -0,0 +1,95 @@
import 'package:rasadyar_chicken/data/di/chicken_di.dart';
import 'package:rasadyar_chicken/features/poultry_science/data/model/response/hatching/hatching_models.dart';
import 'package:rasadyar_chicken/features/poultry_science/data/repositories/poultry_science_repository.dart';
import 'package:rasadyar_chicken/features/city_jahad/presentation/pages/root/logic.dart';
import 'package:rasadyar_core/core.dart';
class ActiveHatchingLogic extends GetxController {
CityJahadRootLogic rootLogic = Get.find<CityJahadRootLogic>();
BaseLogic baseLogic = Get.find<BaseLogic>();
late PoultryScienceRepository poultryScienceRepository;
Rx<Resource<PaginationModel<HatchingModel>>> activeHatchingList =
Resource<PaginationModel<HatchingModel>>.loading().obs;
final RxBool isLoadingMoreList = false.obs;
RxInt currentPage = 1.obs;
RxInt expandedIndex = RxInt(-1);
List<String> routesName = ['اقدام', 'جوجه ریزی فعال'];
Rx<Jalali> fromDateFilter = Jalali.now().obs;
Rx<Jalali> toDateFilter = Jalali.now().obs;
RxnString searchedValue = RxnString();
@override
void onInit() {
super.onInit();
poultryScienceRepository = diChicken.get<PoultryScienceRepository>();
}
@override
void onReady() {
super.onReady();
getHatchingList();
}
@override
void onClose() {
super.onClose();
baseLogic.clearSearch();
}
Future<void> getHatchingList([bool isLoadingMore = false]) async {
if (isLoadingMore) {
isLoadingMoreList.value = true;
} else {
activeHatchingList.value =
Resource<PaginationModel<HatchingModel>>.loading();
}
if (searchedValue.value != null &&
searchedValue.value!.trim().isNotEmpty &&
currentPage.value > 1) {
currentPage.value = 1;
}
safeCall(
call: () async => await poultryScienceRepository.getHatchingPoultry(
token: rootLogic.tokenService.accessToken.value!,
queryParameters: buildQueryParams(
queryParams: {'type': 'hatching'},
role: 'CityJahad',
pageSize: 50,
page: currentPage.value,
),
),
onSuccess: (res) {
if ((res?.count ?? 0) == 0) {
activeHatchingList.value =
Resource<PaginationModel<HatchingModel>>.empty();
} else {
activeHatchingList.value =
Resource<PaginationModel<HatchingModel>>.success(
PaginationModel<HatchingModel>(
count: res?.count ?? 0,
next: res?.next,
previous: res?.previous,
results: [
...(activeHatchingList.value.data?.results ?? []),
...(res?.results ?? []),
],
),
);
}
},
);
}
void toggleExpanded(int index) {
expandedIndex.value = expandedIndex.value == index ? -1 : index;
}
Future<void> onRefresh() async {
currentPage.value = 1;
await getHatchingList();
}
}

View File

@@ -0,0 +1,239 @@
import 'package:flutter/material.dart';
import 'package:rasadyar_chicken/features/poultry_science/data/model/response/hatching/hatching_models.dart';
import 'package:rasadyar_chicken/features/city_jahad/presentation/pages/active_hatching/logic.dart';
import 'package:rasadyar_chicken/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/create_inspection_bottom_sheet.dart';
import 'package:rasadyar_chicken/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/create_inspection_bottom_sheet_logic.dart';
import 'package:rasadyar_chicken/presentation/utils/nested_keys_utils.dart';
import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart';
import 'package:rasadyar_core/core.dart';
class ActiveHatchingPage extends GetView<ActiveHatchingLogic> {
const ActiveHatchingPage({super.key});
@override
Widget build(BuildContext context) {
return ChickenBasePage(
hasSearch: true,
hasFilter: false,
backId: cityJahadActionKey,
routes: controller.routesName,
onSearchChanged: (data) {
controller.searchedValue.value = data;
controller.getHatchingList();
},
child: hatchingWidget(),
/*widgets: [
hatchingWidget()
],*/
);
}
Widget hatchingWidget() {
return 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 ExpandableListItem2(
selected: val.value.isEqual(index),
onTap: () => controller.toggleExpanded(index),
index: index,
child: itemListWidget(item),
secondChild: itemListExpandedWidget(item),
labelColor: AppColor.blueLight,
labelIcon: Assets.vec.activeFramSvg.path,
);
}, controller.expandedIndex);
},
itemCount: data.value.data?.results?.length ?? 0,
separatorBuilder: (context, index) => SizedBox(height: 8.h),
onLoadMore: () async => controller.getHatchingList(true),
);
}, controller.activeHatchingList);
}
Container itemListExpandedWidget(HatchingModel 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.poultry?.user?.fullname ?? 'N/A',
textAlign: TextAlign.center,
style: AppFonts.yekan16.copyWith(color: AppColor.greenDark),
),
Spacer(),
Visibility(
child: Text(
item.violation == true ? 'پیگیری' : 'عادی',
textAlign: TextAlign.center,
style: AppFonts.yekan10.copyWith(color: AppColor.redDark),
),
),
],
),
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: [
Text(
'نژاد:${item.breed?.first.breed ?? 'N/A'}',
style: AppFonts.yekan14.copyWith(color: AppColor.textColor),
),
Text(
' سن${item.age} (روز)',
style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal),
),
Text(
' دوره جوجه ریزی:${item.period}',
style: AppFonts.yekan14.copyWith(color: AppColor.textColor),
),
],
),
),
buildRow(
title: 'شماره مجوز جوجه ریزی',
value: item.licenceNumber ?? 'N/A',
),
buildUnitRow(
title: 'حجم جوجه ریزی',
value: item.quantity.separatedByCommaFa,
unit: '(قطعه)',
),
buildUnitRow(
title: 'مانده در سالن',
value: item.leftOver.separatedByCommaFa,
unit: '(قطعه)',
),
buildUnitRow(
title: 'تلفات',
value: item.losses.separatedByCommaFa,
unit: '(قطعه)',
),
buildRow(
title: 'دامپزشک فارم',
value:
'${item.vetFarm?.vetFarmFullName}(${item.vetFarm?.vetFarmMobile})',
),
buildRow(
title: 'شرح بازرسی',
value: item.reportInfo?.image == false
? 'ارسال تصویر جوجه ریزی فارم '
: 'تکمیل شده',
titleStyle: AppFonts.yekan14.copyWith(
color: (item.reportInfo?.image ?? false)
? AppColor.greenNormal
: AppColor.redDark,
),
valueStyle: AppFonts.yekan14.copyWith(
color: (item.reportInfo?.image ?? false)
? AppColor.greenNormal
: AppColor.redDark,
),
),
RElevated(
height: 40.h,
isFullWidth: true,
onPressed: () {
Get.find<CreateInspectionBottomSheetLogic>().setHatchingModel(
item,
);
Get.bottomSheet(
CreateInspectionBottomSheet(),
isScrollControlled: true,
ignoreSafeArea: false,
).then((value) {
if (Get.isRegistered<CreateInspectionBottomSheetLogic>()) {
Get.find<CreateInspectionBottomSheetLogic>().clearForm();
}
});
},
child: Text('ثبت بازرسی'),
),
],
),
);
}
Widget itemListWidget(HatchingModel 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.poultry?.user?.fullname ?? 'N/A',
textAlign: TextAlign.start,
style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal),
),
Text(
item.poultry?.user?.mobile ?? 'N/A',
textAlign: TextAlign.center,
style: AppFonts.yekan14.copyWith(color: AppColor.bgDark),
),
],
),
),
Expanded(
flex: 3,
child: Column(
spacing: 3,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
item.poultry?.unitName ?? 'N/A',
textAlign: TextAlign.start,
style: AppFonts.yekan12.copyWith(color: AppColor.bgDark),
),
Text(
item.poultry?.licenceNumber ?? 'N/A',
textAlign: TextAlign.left,
style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal),
),
],
),
),
Expanded(
flex: 1,
child: Assets.vec.scanSvg.svg(
width: 32.w,
height: 32.h,
colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn),
),
),
],
);
}
}

View File

@@ -0,0 +1,29 @@
import 'package:rasadyar_chicken/features/city_jahad/presentation/routes/routes.dart';
import 'package:rasadyar_core/core.dart';
class CityJahadActionItem {
final String title;
final String route;
final String icon;
CityJahadActionItem({
required this.title,
required this.route,
required this.icon,
});
}
class CityJahadHomeLogic extends GetxController {
RxList<CityJahadActionItem> items = [
CityJahadActionItem(
title: "جوجه ریزی فعال",
route: CityJahadRoutes.activeHatchingCityJahad,
icon: Assets.vec.activeFramSvg.path,
),
CityJahadActionItem(
title: "بازرسی مزارع طیور",
route: CityJahadRoutes.newInspectionCityJahad,
icon: Assets.vec.activeFramSvg.path,
),
].obs;
}

View File

@@ -0,0 +1,46 @@
import 'package:flutter/material.dart';
import 'package:rasadyar_chicken/presentation/utils/nested_keys_utils.dart';
import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart';
import 'package:rasadyar_core/core.dart';
import 'logic.dart';
class CityJahadHomePage extends GetView<CityJahadHomeLogic> {
CityJahadHomePage({super.key});
@override
Widget build(BuildContext context) {
return ChickenBasePage(
isBase: true,
hasNews: true,
hasNotification: true,
child: gridWidget(),
);
}
Widget gridWidget() {
return ObxValue((data) {
return GridView.builder(
physics: BouncingScrollPhysics(),
padding: EdgeInsets.symmetric(vertical: 18.h, horizontal: 32.w),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 24.h,
crossAxisSpacing: 24.w,
),
itemCount: data.length,
hitTestBehavior: HitTestBehavior.opaque,
itemBuilder: (BuildContext context, int index) {
var item = data[index];
return GlassMorphismCardIcon(
title: item.title,
vecIcon: item.icon,
onTap: () async {
Get.toNamed(item.route, id: cityJahadActionKey);
},
);
},
);
}, controller.items);
}
}

View File

@@ -0,0 +1,160 @@
import 'package:flutter/material.dart';
import 'package:rasadyar_chicken/features/city_jahad/presentation/pages/root/logic.dart';
import 'package:rasadyar_chicken/features/poultry_science/data/model/response/poultry_science_report/poultry_science_report.dart';
import 'package:rasadyar_chicken/presentation/widget/base_page/logic.dart';
import 'package:rasadyar_core/core.dart';
class NewInspectionLogic extends GetxController {
BaseLogic baseLogic = Get.find<BaseLogic>();
Rx<Resource<PaginationModel<PoultryScienceReport>>> submitInspectionList =
Resource<PaginationModel<PoultryScienceReport>>.loading().obs;
CityJahadRootLogic rootLogic = Get.find<CityJahadRootLogic>();
final RxBool isLoadingMoreAllocationsMade = false.obs;
RxInt currentPage = 1.obs;
RxInt expandedIndex = RxInt(-1);
RxList<XFile> pickedImages = <XFile>[].obs;
final List<MultipartFile> _multiPartPickedImages = <MultipartFile>[];
RxBool isOnUpload = false.obs;
RxDouble presentUpload = 0.0.obs;
RxList<String> routesName = RxList();
RxInt selectedSegmentIndex = 0.obs;
RxnString searchedValue = RxnString();
Rx<Jalali> fromDateFilter = Jalali.now().obs;
Rx<Jalali> toDateFilter = Jalali.now().obs;
@override
void onInit() {
super.onInit();
routesName.value = ['اقدام'].toList();
ever(selectedSegmentIndex, (callback) {
routesName.removeLast();
routesName.add(callback == 0 ? 'بازرسی' : 'بایگانی');
});
}
@override
void onReady() {
super.onReady();
getReport();
}
@override
void onClose() {
super.onClose();
baseLogic.clearSearch();
}
Future<void> getReport([bool isLoadingMore = false]) async {
if (isLoadingMore) {
isLoadingMoreAllocationsMade.value = true;
} else {
submitInspectionList.value =
Resource<PaginationModel<PoultryScienceReport>>.loading();
}
if (searchedValue.value != null &&
searchedValue.value!.trim().isNotEmpty &&
currentPage.value > 1) {
currentPage.value = 1;
}
safeCall(
call: () async =>
await rootLogic.cityJahadRepository.getSubmitInspectionList(
token: rootLogic.tokenService.accessToken.value!,
queryParameters: buildQueryParams(
role: 'CityJahad',
pageSize: 50,
search: 'filter',
page: currentPage.value,
),
),
onSuccess: (res) {
if ((res?.count ?? 0) == 0) {
submitInspectionList.value =
Resource<PaginationModel<PoultryScienceReport>>.empty();
} else {
submitInspectionList.value =
Resource<PaginationModel<PoultryScienceReport>>.success(
PaginationModel<PoultryScienceReport>(
count: res?.count ?? 0,
next: res?.next,
previous: res?.previous,
results: [
...(submitInspectionList.value.data?.results ?? []),
...(res?.results ?? []),
],
),
);
}
},
);
}
Future<void> pickImages() async {
determineCurrentPosition();
var tmp = await pickCameraImage();
if (tmp?.path != null && pickedImages.length < 7) {
pickedImages.add(tmp!);
}
}
void removeImage(int index) {
pickedImages.removeAt(index);
}
void closeBottomSheet() {
Get.back();
}
double calculateUploadProgress({required int sent, required int total}) {
if (total != 0) {
double progress = (sent * 100 / total) / 100;
return progress;
} else {
return 0.0;
}
}
void toggleExpanded(int index) {
expandedIndex.value = expandedIndex.value == index ? -1 : index;
}
void setSearchValue(String? data) {
dLog('Search Value: $data');
searchedValue.value = data?.trim();
getReport();
}
Future<void> onRefresh() async {
currentPage.value = 1;
await getReport();
}
String getStatus(PoultryScienceReport item) {
final status = item.reportInformation?.inspectionStatus ?? item.state;
if (status == null || status.isEmpty) {
return 'در حال بررسی';
}
return status;
}
Color getStatusColor(PoultryScienceReport item) {
final status = item.reportInformation?.inspectionStatus ?? item.state;
if (status == null || status.isEmpty) {
return AppColor.yellowNormal;
}
// می‌توانید منطق رنگ را بر اساس inspectionStatus تنظیم کنید
return AppColor.greenNormal;
}
}

View File

@@ -0,0 +1,84 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:rasadyar_chicken/data/di/chicken_di.dart';
import 'package:rasadyar_chicken/features/city_jahad/data/repositories/city_jahad_repository.dart';
import 'package:rasadyar_chicken/features/city_jahad/presentation/routes/pages.dart';
import 'package:rasadyar_chicken/features/city_jahad/presentation/routes/routes.dart';
import 'package:rasadyar_chicken/features/city_jahad/presentation/pages/home/view.dart';
import 'package:rasadyar_chicken/features/common/presentation/page/profile/view.dart';
import 'package:rasadyar_chicken/presentation/utils/nested_keys_utils.dart';
import 'package:rasadyar_chicken/presentation/utils/utils.dart';
import 'package:rasadyar_core/core.dart';
enum ErrorLocationType { serviceDisabled, permissionDenied, none }
class CityJahadRootLogic extends GetxController {
var tokenService = Get.find<TokenStorageService>();
late CityJahadRepository cityJahadRepository;
RxList<ErrorLocationType> errorLocationType = RxList();
RxMap<int, dynamic> homeExpandedList = RxMap();
DateTime? _lastBackPressed;
RxInt currentPage = 0.obs;
final pages = [
Navigator(
key: Get.nestedKey(cityJahadActionKey),
onGenerateRoute: (settings) {
final page = CityJahadPages.pages.firstWhere(
(e) => e.name == settings.name,
orElse: () => CityJahadPages.pages.firstWhere(
(e) => e.name == CityJahadRoutes.homeCityJahad,
),
);
return buildRouteFromGetPage(page);
},
),
ProfilePage(),
];
@override
void onInit() {
super.onInit();
cityJahadRepository = diChicken.get<CityJahadRepository>();
}
void toggleExpanded(int index) {
if (homeExpandedList.keys.contains(index)) {
homeExpandedList.remove(index);
} else {
homeExpandedList[index] = false;
}
}
void rootErrorHandler(DioException error) {
handleGeneric(error, () {
tokenService.deleteModuleTokens(Module.chicken);
});
}
void changePage(int index) {
currentPage.value = index;
}
void popBackTaped() async {
final now = DateTime.now();
if (_lastBackPressed == null ||
now.difference(_lastBackPressed!) > Duration(seconds: 2)) {
_lastBackPressed = now;
Get.snackbar(
'خروج از برنامه',
'برای خروج دوباره بازگشت را بزنید',
snackPosition: SnackPosition.TOP,
duration: Duration(seconds: 2),
backgroundColor: AppColor.warning,
);
} else {
await SystemNavigator.pop();
}
}
}

View File

@@ -0,0 +1,58 @@
import 'package:flutter/material.dart';
import 'package:rasadyar_chicken/presentation/utils/nested_keys_utils.dart';
import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart';
import 'package:rasadyar_core/core.dart';
import 'logic.dart';
class CityJahadRootPage extends GetView<CityJahadRootLogic> {
const CityJahadRootPage({super.key});
@override
Widget build(BuildContext context) {
return ChickenBasePage(
isFullScreen: true,
onPopScopTaped: controller.popBackTaped,
child: ObxValue((data) {
return Stack(
children: [
IndexedStack(children: controller.pages, index: data.value),
Positioned(
right: 0,
left: 0,
bottom: 0,
child: RBottomNavigation(
mainAxisAlignment: MainAxisAlignment.spaceAround,
items: [
RBottomNavigationItem(
label: 'خانه',
icon: Assets.vec.homeSvg.path,
isSelected: controller.currentPage.value == 0,
onTap: () {
Get.nestedKey(
cityJahadActionKey,
)?.currentState?.popUntil((route) => route.isFirst);
controller.changePage(0);
},
),
RBottomNavigationItem(
label: 'پروفایل',
icon: Assets.vec.profileCircleSvg.path,
isSelected: controller.currentPage.value == 1,
onTap: () {
Get.nestedKey(
cityJahadActionKey,
)?.currentState?.popUntil((route) => route.isFirst);
controller.changePage(1);
},
),
],
),
),
],
);
}, controller.currentPage),
);
}
}

View File

@@ -0,0 +1,66 @@
import 'package:rasadyar_chicken/features/city_jahad/presentation/pages/home/logic.dart';
import 'package:rasadyar_chicken/features/city_jahad/presentation/pages/home/view.dart';
import 'package:rasadyar_chicken/features/city_jahad/presentation/pages/root/logic.dart';
import 'package:rasadyar_chicken/features/city_jahad/presentation/pages/root/view.dart';
import 'package:rasadyar_chicken/features/city_jahad/presentation/pages/active_hatching/logic.dart';
import 'package:rasadyar_chicken/features/city_jahad/presentation/pages/active_hatching/view.dart';
import 'package:rasadyar_chicken/features/city_jahad/presentation/pages/new_inspection/logic.dart';
import 'package:rasadyar_chicken/features/city_jahad/presentation/pages/new_inspection/view.dart';
import 'package:rasadyar_chicken/features/city_jahad/presentation/routes/routes.dart';
import 'package:rasadyar_chicken/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/create_inspection_bottom_sheet_logic.dart';
import 'package:rasadyar_chicken/presentation/routes/global_binding.dart';
import 'package:rasadyar_chicken/presentation/widget/base_page/logic.dart';
import 'package:rasadyar_core/core.dart';
class CityJahadPages {
CityJahadPages._();
static List<GetPage> get pages => [
GetPage(
name: CityJahadRoutes.initCityJahad,
page: () => CityJahadRootPage(),
middlewares: [AuthMiddleware()],
bindings: [
GlobalBinding(),
BindingsBuilder(() {
Get.lazyPut(() => ChickenBaseLogic(), fenix: true);
Get.lazyPut(() => CityJahadRootLogic());
Get.lazyPut(() => CityJahadHomeLogic());
}),
],
),
GetPage(
name: CityJahadRoutes.homeCityJahad,
page: () => CityJahadHomePage(),
middlewares: [AuthMiddleware()],
binding: BindingsBuilder(() {
Get.put(CityJahadHomeLogic());
Get.lazyPut(() => ChickenBaseLogic());
}),
),
GetPage(
name: CityJahadRoutes.activeHatchingCityJahad,
page: () => ActiveHatchingPage(),
middlewares: [AuthMiddleware()],
bindings: [
GlobalBinding(),
BindingsBuilder(() {
Get.lazyPut(() => ActiveHatchingLogic());
Get.lazyPut(() => CreateInspectionBottomSheetLogic());
}),
],
),
GetPage(
name: CityJahadRoutes.newInspectionCityJahad,
page: () => NewInspectionPage(),
middlewares: [AuthMiddleware()],
bindings: [
GlobalBinding(),
BindingsBuilder(() {
Get.lazyPut(() => NewInspectionLogic());
}),
],
),
];
}

View File

@@ -0,0 +1,10 @@
sealed class CityJahadRoutes {
CityJahadRoutes._();
static const _base = '/chicken/cityJahad';
static const initCityJahad = '$_base/';
static const homeCityJahad = '$_base/home';
static const actionCityJahad = '$_base/action';
static const activeHatchingCityJahad = '$_base/activeHatching';
static const newInspectionCityJahad = '$_base/newInspection';
}

View File

@@ -4,10 +4,11 @@ import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:rasadyar_chicken/data/common/dio_error_handler.dart'; import 'package:rasadyar_chicken/data/common/dio_error_handler.dart';
import 'package:rasadyar_chicken/data/di/chicken_di.dart'; import 'package:rasadyar_chicken/data/di/chicken_di.dart';
import 'package:rasadyar_chicken/data/models/response/user_info/user_info_model.dart'; import 'package:rasadyar_chicken/features/common/data/model/response/user_info/user_info_model.dart';
import 'package:rasadyar_chicken/data/models/response/user_profile_model/user_profile_model.dart'; import 'package:rasadyar_chicken/features/common/data/model/response/user_profile_model/user_profile_model.dart';
import 'package:rasadyar_chicken/data/repositories/auth/auth_repository.dart'; import 'package:rasadyar_chicken/features/common/data/repositories/auth/auth_repository.dart';
import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/features/common/presentation/routes/routes.dart';
import 'package:rasadyar_chicken/features/steward/presentation/routes/routes.dart';
import 'package:rasadyar_chicken/presentation/widget/captcha/logic.dart'; import 'package:rasadyar_chicken/presentation/widget/captcha/logic.dart';
import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/core.dart';
@@ -28,7 +29,8 @@ class AuthLogic extends GetxController with GetTickerProviderStateMixin {
Rx<GlobalKey<FormState>> formKeySentOtp = GlobalKey<FormState>().obs; Rx<GlobalKey<FormState>> formKeySentOtp = GlobalKey<FormState>().obs;
Rx<TextEditingController> usernameController = TextEditingController().obs; Rx<TextEditingController> usernameController = TextEditingController().obs;
Rx<TextEditingController> passwordController = TextEditingController().obs; Rx<TextEditingController> passwordController = TextEditingController().obs;
Rx<TextEditingController> phoneOtpNumberController = TextEditingController().obs; Rx<TextEditingController> phoneOtpNumberController =
TextEditingController().obs;
Rx<TextEditingController> otpCodeController = TextEditingController().obs; Rx<TextEditingController> otpCodeController = TextEditingController().obs;
var captchaController = Get.find<CaptchaWidgetLogic>(); var captchaController = Get.find<CaptchaWidgetLogic>();
@@ -56,12 +58,18 @@ class AuthLogic extends GetxController with GetTickerProviderStateMixin {
void onInit() { void onInit() {
super.onInit(); super.onInit();
_textAnimationController = _textAnimationController =
AnimationController(vsync: this, duration: const Duration(milliseconds: 1200)) AnimationController(
vsync: this,
duration: const Duration(milliseconds: 1200),
)
..repeat(reverse: true, count: 2).whenComplete(() { ..repeat(reverse: true, count: 2).whenComplete(() {
showCard.value = true; showCard.value = true;
}); });
textAnimation = CurvedAnimation(parent: _textAnimationController, curve: Curves.easeInOut); textAnimation = CurvedAnimation(
parent: _textAnimationController,
curve: Curves.easeInOut,
);
initUserPassData(); initUserPassData();
getDeviceModel(); getDeviceModel();
@@ -98,7 +106,8 @@ class AuthLogic extends GetxController with GetTickerProviderStateMixin {
} }
bool _isFormValid() { bool _isFormValid() {
final isCaptchaValid = captchaController.formKey.currentState?.validate() ?? false; final isCaptchaValid =
captchaController.formKey.currentState?.validate() ?? false;
final isFormValid = formKey.currentState?.validate() ?? false; final isFormValid = formKey.currentState?.validate() ?? false;
return isCaptchaValid && isFormValid; return isCaptchaValid && isFormValid;
} }
@@ -117,13 +126,33 @@ class AuthLogic extends GetxController with GetTickerProviderStateMixin {
onSuccess: (result) async { onSuccess: (result) async {
await gService.saveSelectedModule(_module); await gService.saveSelectedModule(_module);
await tokenStorageService.saveModule(_module); await tokenStorageService.saveModule(_module);
await tokenStorageService.saveAccessToken(_module, result?.accessToken ?? ''); await tokenStorageService.saveAccessToken(
await tokenStorageService.saveRefreshToken(_module, result?.accessToken ?? ''); _module,
result?.accessToken ?? '',
);
await tokenStorageService.saveRefreshToken(
_module,
result?.accessToken ?? '',
);
var tmpRoles = result?.role?.where((element) { var tmpRoles = result?.role?.where((element) {
final allowedRoles = {'poultryscience', 'steward', 'killhouse'}; final allowedRoles = {
'poultryscience',
'steward',
'killhouse',
'provinceinspector',
'cityjahad',
'jahad',
'vetfarm',
'provincesupervisor',
'superadmin',
};
final lowerElement = element.toString().toLowerCase().trim(); final lowerElement = element.toString().toLowerCase().trim();
return allowedRoles.contains(lowerElement); return allowedRoles.contains(lowerElement);
}).toList(); }).toList();
if (tmpRoles?.length==1) {
await tokenStorageService.saveRoles(_module, tmpRoles ?? []);
}
await tokenStorageService.saveRoles(_module, tmpRoles ?? []); await tokenStorageService.saveRoles(_module, tmpRoles ?? []);
if (rememberMe.value) { if (rememberMe.value) {
@@ -142,11 +171,15 @@ class AuthLogic extends GetxController with GetTickerProviderStateMixin {
}, },
); );
if (tmpRoles!.length > 1) {
Get.offAndToNamed(ChickenRoutes.role); Get.offAndToNamed(CommonRoutes.role);
/* if (tmpRoles!.length > 1) {
Get.offAndToNamed(CommonRoutes.role);
} else { } else {
Get.offAllNamed(ChickenRoutes.initSteward); Get.offAllNamed(StewardRoutes.initSteward);
} } */
}, },
onError: (error, stackTrace) { onError: (error, stackTrace) {
if (error is DioException) { if (error is DioException) {
@@ -183,7 +216,9 @@ class AuthLogic extends GetxController with GetTickerProviderStateMixin {
} }
void initUserPassData() { void initUserPassData() {
UserLocalModel? userLocalModel = tokenStorageService.getUserLocal(Module.chicken); UserLocalModel? userLocalModel = tokenStorageService.getUserLocal(
Module.chicken,
);
if (userLocalModel?.username != null && userLocalModel?.password != null) { if (userLocalModel?.username != null && userLocalModel?.password != null) {
usernameController.value.text = userLocalModel?.username ?? ''; usernameController.value.text = userLocalModel?.username ?? '';
passwordController.value.text = userLocalModel?.password ?? ''; passwordController.value.text = userLocalModel?.password ?? '';
@@ -196,18 +231,14 @@ class AuthLogic extends GetxController with GetTickerProviderStateMixin {
if (Platform.isAndroid) { if (Platform.isAndroid) {
final info = await deviceInfo.androidInfo; final info = await deviceInfo.androidInfo;
print('Device: ${info.manufacturer} ${info.model}');
print('Android version: ${info.version.release}');
deviceName.value = deviceName.value =
'Device:${info.manufacturer} Model:${info.model} version ${info.version.release}'; 'Device:${info.manufacturer} Model:${info.model} version ${info.version.release}';
} else if (Platform.isIOS) { } else if (Platform.isIOS) {
final info = await deviceInfo.iosInfo; final info = await deviceInfo.iosInfo;
print('Device: ${info.utsname.machine} (${info.name})');
print('System version: ${info.systemVersion}');
deviceName.value = deviceName.value =
'Device:${info.utsname.machine} Model:${info.model} version ${info.systemVersion}'; 'Device:${info.utsname.machine} Model:${info.model} version ${info.systemVersion}';
} else { } else {}
print('Unsupported platform');
}
} }
} }

View File

@@ -43,12 +43,16 @@ class AuthPage extends GetView<AuthLogic> {
Text( Text(
'به سامانه رصدطیور خوش آمدید!', 'به سامانه رصدطیور خوش آمدید!',
textAlign: TextAlign.right, textAlign: TextAlign.right,
style: AppFonts.yekan25Bold.copyWith(color: AppColor.darkGreyDarkActive), style: AppFonts.yekan25Bold.copyWith(
color: AppColor.darkGreyDarkActive,
),
), ),
Text( Text(
'سامانه رصد و پایش زنجیره تامین، تولید و توزیع کالا های اساسی', 'سامانه رصد و پایش زنجیره تامین، تولید و توزیع کالا های اساسی',
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkActive), style: AppFonts.yekan16.copyWith(
color: AppColor.darkGreyDarkActive,
),
), ),
], ],
), ),
@@ -80,7 +84,9 @@ class AuthPage extends GetView<AuthLogic> {
vecPath: Assets.vec.rasadToyorSvg.path, vecPath: Assets.vec.rasadToyorSvg.path,
width: 85.w, width: 85.w,
height: 85.h, height: 85.h,
titleStyle: AppFonts.yekan20Bold.copyWith(color: Color(0xFF4665AF)), titleStyle: AppFonts.yekan20Bold.copyWith(
color: Color(0xFF4665AF),
),
title: 'رصدطیور', title: 'رصدطیور',
), ),
SizedBox(height: 20.h), SizedBox(height: 20.h),
@@ -91,7 +97,9 @@ class AuthPage extends GetView<AuthLogic> {
children: [ children: [
TextSpan( TextSpan(
text: 'مطالعه بیانیه ', text: 'مطالعه بیانیه ',
style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDark), style: AppFonts.yekan16.copyWith(
color: AppColor.darkGreyDark,
),
), ),
TextSpan( TextSpan(
recognizer: TapGestureRecognizer() recognizer: TapGestureRecognizer()
@@ -104,7 +112,9 @@ class AuthPage extends GetView<AuthLogic> {
); );
}, },
text: 'حریم خصوصی', text: 'حریم خصوصی',
style: AppFonts.yekan16.copyWith(color: AppColor.blueNormal), style: AppFonts.yekan16.copyWith(
color: AppColor.blueNormal,
),
), ),
], ],
), ),
@@ -128,6 +138,7 @@ class AuthPage extends GetView<AuthLogic> {
child: Column( child: Column(
children: [ children: [
RTextField( RTextField(
height: 40.h,
label: 'نام کاربری', label: 'نام کاربری',
maxLength: 11, maxLength: 11,
maxLines: 1, maxLines: 1,
@@ -150,7 +161,8 @@ class AuthPage extends GetView<AuthLogic> {
padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), padding: const EdgeInsets.fromLTRB(0, 8, 6, 8),
child: Assets.vec.callSvg.svg(width: 12, height: 12), child: Assets.vec.callSvg.svg(width: 12, height: 12),
), ),
suffixIcon: controller.usernameController.value.text.trim().isNotEmpty suffixIcon:
controller.usernameController.value.text.trim().isNotEmpty
? clearButton(() { ? clearButton(() {
controller.usernameController.value.clear(); controller.usernameController.value.clear();
controller.usernameController.refresh(); controller.usernameController.refresh();
@@ -165,7 +177,9 @@ class AuthPage extends GetView<AuthLogic> {
return null; return null;
}, },
style: AppFonts.yekan13, style: AppFonts.yekan13,
errorStyle: AppFonts.yekan13.copyWith(color: AppColor.redNormal), errorStyle: AppFonts.yekan13.copyWith(
color: AppColor.redNormal,
),
labelStyle: AppFonts.yekan13, labelStyle: AppFonts.yekan13,
boxConstraints: const BoxConstraints( boxConstraints: const BoxConstraints(
maxHeight: 40, maxHeight: 40,
@@ -177,6 +191,7 @@ class AuthPage extends GetView<AuthLogic> {
const SizedBox(height: 26), const SizedBox(height: 26),
ObxValue( ObxValue(
(passwordController) => RTextField( (passwordController) => RTextField(
height: 40.h,
label: 'رمز عبور', label: 'رمز عبور',
filled: false, filled: false,
obscure: true, obscure: true,
@@ -199,7 +214,9 @@ class AuthPage extends GetView<AuthLogic> {
return null; return null;
}, },
style: AppFonts.yekan13, style: AppFonts.yekan13,
errorStyle: AppFonts.yekan13.copyWith(color: AppColor.redNormal), errorStyle: AppFonts.yekan13.copyWith(
color: AppColor.redNormal,
),
labelStyle: AppFonts.yekan13, labelStyle: AppFonts.yekan13,
prefixIcon: Padding( prefixIcon: Padding(
padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), padding: const EdgeInsets.fromLTRB(0, 8, 8, 8),
@@ -226,19 +243,26 @@ class AuthPage extends GetView<AuthLogic> {
ObxValue((data) { ObxValue((data) {
return Checkbox( return Checkbox(
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
visualDensity: VisualDensity(horizontal: -4, vertical: 4), visualDensity: VisualDensity(
horizontal: -4,
vertical: 4,
),
tristate: true, tristate: true,
value: data.value, value: data.value,
onChanged: (value) { onChanged: (value) {
data.value = value ?? false; data.value = value ?? false;
}, },
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(4)), shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(4),
),
activeColor: AppColor.blueNormal, activeColor: AppColor.blueNormal,
); );
}, controller.rememberMe), }, controller.rememberMe),
Text( Text(
'مرا به خاطر بسپار', 'مرا به خاطر بسپار',
style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark), style: AppFonts.yekan14.copyWith(
color: AppColor.darkGreyDark,
),
), ),
], ],
), ),
@@ -283,11 +307,16 @@ class AuthPage extends GetView<AuthLogic> {
children: [ children: [
Text( Text(
'بيانيه حريم خصوصی', 'بيانيه حريم خصوصی',
style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), style: AppFonts.yekan16Bold.copyWith(
color: AppColor.blueNormal,
),
), ),
Text( Text(
'اطلاعات مربوط به هر شخص، حریم خصوصی وی محسوب می‌شود. حفاظت و حراست از اطلاعات شخصی در سامانه رصد یار، نه تنها موجب حفظ امنیت کاربران می‌شود، بلکه باعث اعتماد بیشتر و مشارکت آنها در فعالیت‌های جاری می‌گردد. هدف از این بیانیه، آگاه ساختن شما درباره ی نوع و نحوه ی استفاده از اطلاعاتی است که در هنگام استفاده از سامانه رصد یار ، از جانب شما دریافت می‌گردد. شرکت هوشمند سازان خود را ملزم به رعایت حریم خصوصی همه شهروندان و کاربران سامانه دانسته و آن دسته از اطلاعات کاربران را که فقط به منظور ارائه خدمات کفایت می‌کند، دریافت کرده و از انتشار آن یا در اختیار قرار دادن آن به دیگران خودداری مینماید.', 'اطلاعات مربوط به هر شخص، حریم خصوصی وی محسوب می‌شود. حفاظت و حراست از اطلاعات شخصی در سامانه رصد یار، نه تنها موجب حفظ امنیت کاربران می‌شود، بلکه باعث اعتماد بیشتر و مشارکت آنها در فعالیت‌های جاری می‌گردد. هدف از این بیانیه، آگاه ساختن شما درباره ی نوع و نحوه ی استفاده از اطلاعاتی است که در هنگام استفاده از سامانه رصد یار ، از جانب شما دریافت می‌گردد. شرکت هوشمند سازان خود را ملزم به رعایت حریم خصوصی همه شهروندان و کاربران سامانه دانسته و آن دسته از اطلاعات کاربران را که فقط به منظور ارائه خدمات کفایت می‌کند، دریافت کرده و از انتشار آن یا در اختیار قرار دادن آن به دیگران خودداری مینماید.',
style: AppFonts.yekan14.copyWith(color: AppColor.bgDark, height: 1.8), style: AppFonts.yekan14.copyWith(
color: AppColor.bgDark,
height: 1.8,
),
), ),
], ],
), ),
@@ -307,7 +336,9 @@ class AuthPage extends GetView<AuthLogic> {
children: [ children: [
Text( Text(
'چگونگی جمع آوری و استفاده از اطلاعات کاربران', 'چگونگی جمع آوری و استفاده از اطلاعات کاربران',
style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), style: AppFonts.yekan16Bold.copyWith(
color: AppColor.blueNormal,
),
), ),
Text( Text(
'''الف: اطلاعاتی که شما خود در اختيار این سامانه قرار می‌دهيد، شامل موارد زيرهستند: '''الف: اطلاعاتی که شما خود در اختيار این سامانه قرار می‌دهيد، شامل موارد زيرهستند:
@@ -319,7 +350,10 @@ class AuthPage extends GetView<AuthLogic> {
⦁ تعداد بازدیدهای روزانه در درگاه. ⦁ تعداد بازدیدهای روزانه در درگاه.
⦁ هدف ما از دریافت این اطلاعات استفاده از آنها در تحلیل عملکرد کاربران درگاه می باشد تا بتوانیم در خدمت رسانی بهتر عمل کنیم. ⦁ هدف ما از دریافت این اطلاعات استفاده از آنها در تحلیل عملکرد کاربران درگاه می باشد تا بتوانیم در خدمت رسانی بهتر عمل کنیم.
''', ''',
style: AppFonts.yekan14.copyWith(color: AppColor.bgDark, height: 1.8), style: AppFonts.yekan14.copyWith(
color: AppColor.bgDark,
height: 1.8,
),
), ),
], ],
), ),
@@ -339,11 +373,16 @@ class AuthPage extends GetView<AuthLogic> {
children: [ children: [
Text( Text(
'امنیت اطلاعات', 'امنیت اطلاعات',
style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), style: AppFonts.yekan16Bold.copyWith(
color: AppColor.blueNormal,
),
), ),
Text( Text(
'متعهدیم که امنیت اطلاعات شما را تضمین نماییم و برای جلوگیری از هر نوع دسترسی غیرمجاز و افشای اطلاعات شما از همه شیوه‌‌های لازم استفاده می‌کنیم تا امنیت اطلاعاتی را که به صورت آنلاین گردآوری می‌کنیم، حفظ شود. لازم به ذکر است در سامانه ما، ممکن است به سایت های دیگری لینک شوید، وقتی که شما از طریق این لینک‌ها از سامانه ما خارج می‌شوید، توجه داشته باشید که ما بر دیگر سایت ها کنترل نداریم و سازمان تعهدی بر حفظ حریم شخصی آنان در سایت مقصد نخواهد داشت و مراجعه کنندگان میبایست به بیانیه حریم شخصی آن سایت ها مراجعه نمایند.', 'متعهدیم که امنیت اطلاعات شما را تضمین نماییم و برای جلوگیری از هر نوع دسترسی غیرمجاز و افشای اطلاعات شما از همه شیوه‌‌های لازم استفاده می‌کنیم تا امنیت اطلاعاتی را که به صورت آنلاین گردآوری می‌کنیم، حفظ شود. لازم به ذکر است در سامانه ما، ممکن است به سایت های دیگری لینک شوید، وقتی که شما از طریق این لینک‌ها از سامانه ما خارج می‌شوید، توجه داشته باشید که ما بر دیگر سایت ها کنترل نداریم و سازمان تعهدی بر حفظ حریم شخصی آنان در سایت مقصد نخواهد داشت و مراجعه کنندگان میبایست به بیانیه حریم شخصی آن سایت ها مراجعه نمایند.',
style: AppFonts.yekan14.copyWith(color: AppColor.bgDark, height: 1.8), style: AppFonts.yekan14.copyWith(
color: AppColor.bgDark,
height: 1.8,
),
), ),
], ],
), ),

View File

@@ -0,0 +1,2 @@
export 'presentation/routes/routes.dart';
export 'presentation/routes/pages.dart';

View File

@@ -1,4 +1,4 @@
import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart'; import 'package:rasadyar_chicken/features/common/data/model/local/widely_used_local_model.dart';
abstract class ChickenLocalDataSource { abstract class ChickenLocalDataSource {
Future<void> openBox(); Future<void> openBox();

View File

@@ -1,4 +1,5 @@
import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart'; import 'package:rasadyar_chicken/features/common/data/model/local/widely_used_local_model.dart';
import 'package:rasadyar_chicken/features/steward/presentation/routes/routes.dart';
import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/core.dart';
import 'chicken_local.dart'; import 'chicken_local.dart';
@@ -22,7 +23,7 @@ class ChickenLocalDataSourceImp implements ChickenLocalDataSource {
color: AppColor.greenLightActive.toARGB32(), color: AppColor.greenLightActive.toARGB32(),
iconColor: AppColor.greenNormal.toARGB32(), iconColor: AppColor.greenNormal.toARGB32(),
iconPath: Assets.vec.cubeSearchSvg.path, iconPath: Assets.vec.cubeSearchSvg.path,
path: ChickenRoutes.buysInProvinceSteward, path: StewardRoutes.buysInProvinceSteward,
), ),
WidelyUsedLocalItem( WidelyUsedLocalItem(
index: 1, index: 1,
@@ -31,7 +32,7 @@ class ChickenLocalDataSourceImp implements ChickenLocalDataSource {
color: AppColor.blueLightActive.toARGB32(), color: AppColor.blueLightActive.toARGB32(),
iconColor: AppColor.blueNormal.toARGB32(), iconColor: AppColor.blueNormal.toARGB32(),
iconPath: Assets.vec.cubeSvg.path, iconPath: Assets.vec.cubeSvg.path,
path: ChickenRoutes.salesInProvinceSteward, path: StewardRoutes.salesInProvinceSteward,
), ),
WidelyUsedLocalItem( WidelyUsedLocalItem(
@@ -40,7 +41,7 @@ class ChickenLocalDataSourceImp implements ChickenLocalDataSource {
color: AppColor.blueLightActive.toARGB32(), color: AppColor.blueLightActive.toARGB32(),
iconColor: AppColor.blueNormal.toARGB32(), iconColor: AppColor.blueNormal.toARGB32(),
iconPath: Assets.vec.cubeRotateSvg.path, iconPath: Assets.vec.cubeRotateSvg.path,
path: ChickenRoutes.buysInProvinceSteward, path: StewardRoutes.buysInProvinceSteward,
), ),
]; */ ]; */
} }

View File

@@ -1,6 +1,6 @@
import 'package:rasadyar_chicken/data/models/response/user_info/user_info_model.dart'; import 'package:rasadyar_chicken/features/common/data/model/response/user_info/user_info_model.dart';
import 'package:rasadyar_chicken/data/models/response/user_profile_model/user_profile_model.dart'; import 'package:rasadyar_chicken/features/common/data/model/response/user_profile_model/user_profile_model.dart';
abstract class AuthRemoteDataSource { abstract class AuthRemoteDataSource {
Future<UserProfileModel?> login({required Map<String, dynamic> authRequest}); Future<UserProfileModel?> login({required Map<String, dynamic> authRequest});
@@ -11,6 +11,6 @@ abstract class AuthRemoteDataSource {
Future<UserInfoModel?> getUserInfo(String phoneNumber); Future<UserInfoModel?> getUserInfo(String phoneNumber);
/// Calls `/steward-app-login/` endpoint with required token and `server` as query param, plus optional extra query parameters.
Future<void> stewardAppLogin({required String token, Map<String, dynamic>? queryParameters}); Future<void> stewardAppLogin({required String token, Map<String, dynamic>? queryParameters});
} }

View File

@@ -1,5 +1,5 @@
import 'package:rasadyar_chicken/data/models/response/user_info/user_info_model.dart'; import 'package:rasadyar_chicken/features/common/data/model/response/user_info/user_info_model.dart';
import 'package:rasadyar_chicken/data/models/response/user_profile_model/user_profile_model.dart'; import 'package:rasadyar_chicken/features/common/data/model/response/user_profile_model/user_profile_model.dart';
import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/core.dart';
import 'auth_remote.dart'; import 'auth_remote.dart';

View File

@@ -0,0 +1,75 @@
import 'package:rasadyar_chicken/features/common/data/model/request/change_password/change_password_request_model.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/bar_information/bar_information.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/broadcast_price/broadcast_price.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/guild/guild_model.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/guild_profile/guild_profile.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/inventory/inventory_model.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/iran_province_city/iran_province_city_model.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/kill_house_distribution_info/kill_house_distribution_info.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/roles_products/roles_products.dart';
import 'package:rasadyar_chicken/features/steward/data/model/response/segmentation_model/segmentation_model.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/user_profile/user_profile.dart';
import 'package:rasadyar_core/core.dart';
abstract class CommonRemoteDatasource {
Future<List<InventoryModel>?> getInventory({
required String token,
CancelToken? cancelToken,
});
Future<KillHouseDistributionInfo?> getKillHouseDistributionInfo({
required String token,
});
Future<BarInformation?> getGeneralBarInformation({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<List<ProductModel>?> getRolesProducts({required String token});
Future<List<GuildModel>?> getGuilds({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<GuildProfile?> getProfile({required String token});
Future<List<IranProvinceCityModel>?> getProvince({CancelToken? cancelToken});
Future<List<IranProvinceCityModel>?> getCity({required String provinceName});
Future<UserProfile?> getUserProfile({required String token});
Future<void> updateUserProfile({
required String token,
required UserProfile userProfile,
});
Future<void> updatePassword({
required String token,
required ChangePasswordRequestModel model,
});
Future<PaginationModel<SegmentationModel>?> getSegmentation({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> createSegmentation({
required String token,
required SegmentationModel model,
});
Future<void> editSegmentation({
required String token,
required SegmentationModel model,
});
Future<SegmentationModel?> deleteSegmentation({
required String token,
required String key,
});
Future<BroadcastPrice?> getBroadcastPrice({required String token});
}

View File

@@ -0,0 +1,238 @@
import 'package:rasadyar_chicken/features/common/data/model/request/change_password/change_password_request_model.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/bar_information/bar_information.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/broadcast_price/broadcast_price.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/guild/guild_model.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/guild_profile/guild_profile.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/inventory/inventory_model.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/iran_province_city/iran_province_city_model.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/kill_house_distribution_info/kill_house_distribution_info.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/roles_products/roles_products.dart';
import 'package:rasadyar_chicken/features/steward/data/model/response/segmentation_model/segmentation_model.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/user_profile/user_profile.dart';
import 'package:rasadyar_core/core.dart';
import 'common_remote.dart';
class CommonRemoteDatasourceImp implements CommonRemoteDatasource {
final DioRemote _httpClient;
CommonRemoteDatasourceImp(this._httpClient);
@override
Future<List<InventoryModel>?> getInventory({
required String token,
CancelToken? cancelToken,
}) async {
var res = await _httpClient.get(
'/roles-products/?role=Steward',
headers: {'Authorization': 'Bearer $token'},
fromJsonList: (json) => (json)
.map((item) => InventoryModel.fromJson(item as Map<String, dynamic>))
.toList(),
);
return res.data;
}
@override
Future<KillHouseDistributionInfo?> 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<BarInformation?> getGeneralBarInformation({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
var res = await _httpClient.get(
'/bars_for_kill_house_dashboard/',
queryParameters: queryParameters,
headers: {'Authorization': 'Bearer $token'},
fromJson: BarInformation.fromJson,
);
return res.data;
}
@override
Future<List<ProductModel>?> 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<String, dynamic>))
.toList(),
);
return res.data;
}
@override
Future<List<GuildModel>?> getGuilds({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
var res = await _httpClient.get(
'/guilds/',
queryParameters: queryParameters,
headers: {'Authorization': 'Bearer $token'},
fromJsonList: (json) => json
.map((item) => GuildModel.fromJson(item as Map<String, dynamic>))
.toList(),
);
return res.data;
}
@override
Future<GuildProfile?> 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<List<IranProvinceCityModel>?> 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<String, dynamic>),
)
.toList(),
);
return res.data;
}
@override
Future<List<IranProvinceCityModel>?> getProvince({
CancelToken? cancelToken,
}) async {
var res = await _httpClient.get(
'/iran_province/',
fromJsonList: (json) => json
.map(
(item) =>
IranProvinceCityModel.fromJson(item as Map<String, dynamic>),
)
.toList(),
);
return res.data;
}
@override
Future<UserProfile?> 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<void> updateUserProfile({
required String token,
required UserProfile userProfile,
}) async {
await _httpClient.put(
'/system_user_profile/0/',
headers: {'Authorization': 'Bearer $token'},
data: userProfile.toJson()..removeWhere((key, value) => value == null),
);
}
@override
Future<void> 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<PaginationModel<SegmentationModel>?> getSegmentation({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
var res = await _httpClient.get(
'/app-segmentation/',
queryParameters: queryParameters,
headers: {'Authorization': 'Bearer $token'},
fromJson: (json) => PaginationModel<SegmentationModel>.fromJson(
json,
(json) => SegmentationModel.fromJson(json as Map<String, dynamic>),
),
);
return res.data;
}
@override
Future<void> 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<void> 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<SegmentationModel?> deleteSegmentation({
required String token,
required String key,
}) async {
var res = await _httpClient.delete<SegmentationModel?>(
'/app-segmentation/0/',
queryParameters: {'key': key},
headers: {'Authorization': 'Bearer $token'},
fromJson: (json) => SegmentationModel.fromJson(json),
);
return res.data;
}
@override
Future<BroadcastPrice?> getBroadcastPrice({required String token}) async {
var res = await _httpClient.get(
'/broadcast-price/',
headers: {'Authorization': 'Bearer $token'},
fromJson: (json) => BroadcastPrice.fromJson(json),
);
return res.data;
}
}

View File

@@ -0,0 +1,66 @@
import 'package:rasadyar_chicken/features/common/data/datasources/local/chicken_local.dart';
import 'package:rasadyar_chicken/features/common/data/datasources/local/chicken_local_imp.dart';
import 'package:rasadyar_chicken/features/common/data/datasources/remote/auth/auth_remote.dart';
import 'package:rasadyar_chicken/features/common/data/datasources/remote/auth/auth_remote_imp.dart';
import 'package:rasadyar_chicken/features/common/data/datasources/remote/common/common_remote.dart';
import 'package:rasadyar_chicken/features/common/data/datasources/remote/common/common_remote_imp.dart';
import 'package:rasadyar_chicken/features/common/data/repositories/auth/auth_repository.dart';
import 'package:rasadyar_chicken/features/common/data/repositories/auth/auth_repository_imp.dart';
import 'package:rasadyar_chicken/features/common/data/repositories/common/common_repository.dart';
import 'package:rasadyar_chicken/features/common/data/repositories/common/common_repository_imp.dart';
import 'package:rasadyar_core/core.dart';
/// Setup dependency injection for common feature
Future<void> setupCommonDI(GetIt di, DioRemote dioRemote) async {
di.registerLazySingleton<AuthRemoteDataSource>(
() => AuthRemoteDataSourceImp(dioRemote),
);
di.registerLazySingleton<AuthRepository>(
() => AuthRepositoryImpl(di.get<AuthRemoteDataSource>()),
);
di.registerLazySingleton<CommonRemoteDatasource>(
() => CommonRemoteDatasourceImp(dioRemote),
);
di.registerLazySingleton<ChickenLocalDataSource>(
() => ChickenLocalDataSourceImp(),
);
di.registerLazySingleton<CommonRepository>(
() => CommonRepositoryImp(
remote: di.get<CommonRemoteDatasource>(),
local: di.get<ChickenLocalDataSource>(),
),
);
}
/// Re-register common dependencies (used when base URL changes)
Future<void> reRegisterCommonDI(GetIt di, DioRemote dioRemote) async {
await reRegister(di, () => AuthRemoteDataSourceImp(dioRemote));
await reRegister(
di,
() => AuthRepositoryImpl(di.get<AuthRemoteDataSource>()),
);
await reRegister(di, () => CommonRemoteDatasourceImp(dioRemote));
await reRegister(di, () => ChickenLocalDataSourceImp());
await reRegister(
di,
() => CommonRepositoryImp(
remote: di.get<CommonRemoteDatasource>(),
local: di.get<ChickenLocalDataSource>(),
),
);
}
/// Helper function to re-register a dependency
Future<void> reRegister<T extends Object>(
GetIt di,
T Function() factory,
) async {
if (di.isRegistered<T>()) {
await di.unregister<T>();
}
di.registerLazySingleton<T>(factory);
}

View File

@@ -0,0 +1,56 @@
import 'package:freezed_annotation/freezed_annotation.dart';
part 'inventory_model.freezed.dart';
part 'inventory_model.g.dart';
@freezed
abstract class InventoryModel with _$InventoryModel {
const factory InventoryModel({
int? id,
String? key,
String? createDate,
String? modifyDate,
bool? trash,
String? name,
int? provinceGovernmentalCarcassesQuantity,
int? provinceGovernmentalCarcassesWeight,
int? provinceFreeCarcassesQuantity,
int? provinceFreeCarcassesWeight,
int? receiveGovernmentalCarcassesQuantity,
int? receiveGovernmentalCarcassesWeight,
int? receiveFreeCarcassesQuantity,
int? receiveFreeCarcassesWeight,
int? freeBuyingCarcassesQuantity,
int? freeBuyingCarcassesWeight,
int? totalGovernmentalCarcassesQuantity,
int? totalGovernmentalCarcassesWeight,
int? totalFreeBarsCarcassesQuantity,
int? totalFreeBarsCarcassesWeight,
double? weightAverage,
int? totalCarcassesQuantity,
int? totalCarcassesWeight,
int? freezingQuantity,
int? freezingWeight,
int? lossWeight,
int? outProvinceAllocatedQuantity,
int? outProvinceAllocatedWeight,
int? provinceAllocatedQuantity,
int? provinceAllocatedWeight,
int? realAllocatedQuantity,
int? realAllocatedWeight,
int? coldHouseAllocatedWeight,
int? posAllocatedWeight,
int? segmentationWeight,
int? totalRemainQuantity,
int? totalRemainWeight,
int? freePrice,
int? approvedPrice,
bool? approvedPriceStatus,
int? parentProduct,
int? killHouse,
int? guild,
}) = _InventoryModel; // Changed to _InventoryModel
factory InventoryModel.fromJson(Map<String, dynamic> json) =>
_$InventoryModelFromJson(json);
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,127 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'inventory_model.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_InventoryModel _$InventoryModelFromJson(
Map<String, dynamic> json,
) => _InventoryModel(
id: (json['id'] as num?)?.toInt(),
key: json['key'] as String?,
createDate: json['create_date'] as String?,
modifyDate: json['modify_date'] as String?,
trash: json['trash'] as bool?,
name: json['name'] as String?,
provinceGovernmentalCarcassesQuantity:
(json['province_governmental_carcasses_quantity'] as num?)?.toInt(),
provinceGovernmentalCarcassesWeight:
(json['province_governmental_carcasses_weight'] as num?)?.toInt(),
provinceFreeCarcassesQuantity:
(json['province_free_carcasses_quantity'] as num?)?.toInt(),
provinceFreeCarcassesWeight: (json['province_free_carcasses_weight'] as num?)
?.toInt(),
receiveGovernmentalCarcassesQuantity:
(json['receive_governmental_carcasses_quantity'] as num?)?.toInt(),
receiveGovernmentalCarcassesWeight:
(json['receive_governmental_carcasses_weight'] as num?)?.toInt(),
receiveFreeCarcassesQuantity:
(json['receive_free_carcasses_quantity'] as num?)?.toInt(),
receiveFreeCarcassesWeight: (json['receive_free_carcasses_weight'] as num?)
?.toInt(),
freeBuyingCarcassesQuantity: (json['free_buying_carcasses_quantity'] as num?)
?.toInt(),
freeBuyingCarcassesWeight: (json['free_buying_carcasses_weight'] as num?)
?.toInt(),
totalGovernmentalCarcassesQuantity:
(json['total_governmental_carcasses_quantity'] as num?)?.toInt(),
totalGovernmentalCarcassesWeight:
(json['total_governmental_carcasses_weight'] as num?)?.toInt(),
totalFreeBarsCarcassesQuantity:
(json['total_free_bars_carcasses_quantity'] as num?)?.toInt(),
totalFreeBarsCarcassesWeight:
(json['total_free_bars_carcasses_weight'] as num?)?.toInt(),
weightAverage: (json['weight_average'] as num?)?.toDouble(),
totalCarcassesQuantity: (json['total_carcasses_quantity'] as num?)?.toInt(),
totalCarcassesWeight: (json['total_carcasses_weight'] as num?)?.toInt(),
freezingQuantity: (json['freezing_quantity'] as num?)?.toInt(),
freezingWeight: (json['freezing_weight'] as num?)?.toInt(),
lossWeight: (json['loss_weight'] as num?)?.toInt(),
outProvinceAllocatedQuantity:
(json['out_province_allocated_quantity'] as num?)?.toInt(),
outProvinceAllocatedWeight: (json['out_province_allocated_weight'] as num?)
?.toInt(),
provinceAllocatedQuantity: (json['province_allocated_quantity'] as num?)
?.toInt(),
provinceAllocatedWeight: (json['province_allocated_weight'] as num?)?.toInt(),
realAllocatedQuantity: (json['real_allocated_quantity'] as num?)?.toInt(),
realAllocatedWeight: (json['real_allocated_weight'] as num?)?.toInt(),
coldHouseAllocatedWeight: (json['cold_house_allocated_weight'] as num?)
?.toInt(),
posAllocatedWeight: (json['pos_allocated_weight'] as num?)?.toInt(),
segmentationWeight: (json['segmentation_weight'] as num?)?.toInt(),
totalRemainQuantity: (json['total_remain_quantity'] as num?)?.toInt(),
totalRemainWeight: (json['total_remain_weight'] as num?)?.toInt(),
freePrice: (json['free_price'] as num?)?.toInt(),
approvedPrice: (json['approved_price'] as num?)?.toInt(),
approvedPriceStatus: json['approved_price_status'] as bool?,
parentProduct: (json['parent_product'] as num?)?.toInt(),
killHouse: (json['kill_house'] as num?)?.toInt(),
guild: (json['guild'] as num?)?.toInt(),
);
Map<String, dynamic> _$InventoryModelToJson(
_InventoryModel instance,
) => <String, dynamic>{
'id': instance.id,
'key': instance.key,
'create_date': instance.createDate,
'modify_date': instance.modifyDate,
'trash': instance.trash,
'name': instance.name,
'province_governmental_carcasses_quantity':
instance.provinceGovernmentalCarcassesQuantity,
'province_governmental_carcasses_weight':
instance.provinceGovernmentalCarcassesWeight,
'province_free_carcasses_quantity': instance.provinceFreeCarcassesQuantity,
'province_free_carcasses_weight': instance.provinceFreeCarcassesWeight,
'receive_governmental_carcasses_quantity':
instance.receiveGovernmentalCarcassesQuantity,
'receive_governmental_carcasses_weight':
instance.receiveGovernmentalCarcassesWeight,
'receive_free_carcasses_quantity': instance.receiveFreeCarcassesQuantity,
'receive_free_carcasses_weight': instance.receiveFreeCarcassesWeight,
'free_buying_carcasses_quantity': instance.freeBuyingCarcassesQuantity,
'free_buying_carcasses_weight': instance.freeBuyingCarcassesWeight,
'total_governmental_carcasses_quantity':
instance.totalGovernmentalCarcassesQuantity,
'total_governmental_carcasses_weight':
instance.totalGovernmentalCarcassesWeight,
'total_free_bars_carcasses_quantity': instance.totalFreeBarsCarcassesQuantity,
'total_free_bars_carcasses_weight': instance.totalFreeBarsCarcassesWeight,
'weight_average': instance.weightAverage,
'total_carcasses_quantity': instance.totalCarcassesQuantity,
'total_carcasses_weight': instance.totalCarcassesWeight,
'freezing_quantity': instance.freezingQuantity,
'freezing_weight': instance.freezingWeight,
'loss_weight': instance.lossWeight,
'out_province_allocated_quantity': instance.outProvinceAllocatedQuantity,
'out_province_allocated_weight': instance.outProvinceAllocatedWeight,
'province_allocated_quantity': instance.provinceAllocatedQuantity,
'province_allocated_weight': instance.provinceAllocatedWeight,
'real_allocated_quantity': instance.realAllocatedQuantity,
'real_allocated_weight': instance.realAllocatedWeight,
'cold_house_allocated_weight': instance.coldHouseAllocatedWeight,
'pos_allocated_weight': instance.posAllocatedWeight,
'segmentation_weight': instance.segmentationWeight,
'total_remain_quantity': instance.totalRemainQuantity,
'total_remain_weight': instance.totalRemainWeight,
'free_price': instance.freePrice,
'approved_price': instance.approvedPrice,
'approved_price_status': instance.approvedPriceStatus,
'parent_product': instance.parentProduct,
'kill_house': instance.killHouse,
'guild': instance.guild,
};

View File

@@ -1,5 +1,5 @@
import 'package:rasadyar_chicken/data/models/response/user_info/user_info_model.dart'; import 'package:rasadyar_chicken/features/common/data/model/response/user_info/user_info_model.dart';
import 'package:rasadyar_chicken/data/models/response/user_profile_model/user_profile_model.dart'; import 'package:rasadyar_chicken/features/common/data/model/response/user_profile_model/user_profile_model.dart';
abstract class AuthRepository { abstract class AuthRepository {
Future<UserProfileModel?> login({required Map<String, dynamic> authRequest}); Future<UserProfileModel?> login({required Map<String, dynamic> authRequest});

View File

@@ -1,6 +1,6 @@
import 'package:rasadyar_chicken/data/data_source/remote/auth/auth_remote.dart'; import 'package:rasadyar_chicken/features/common/data/datasources/remote/auth/auth_remote.dart';
import 'package:rasadyar_chicken/data/models/response/user_info/user_info_model.dart'; import 'package:rasadyar_chicken/features/common/data/model/response/user_info/user_info_model.dart';
import 'package:rasadyar_chicken/data/models/response/user_profile_model/user_profile_model.dart'; import 'package:rasadyar_chicken/features/common/data/model/response/user_profile_model/user_profile_model.dart';
import 'auth_repository.dart'; import 'auth_repository.dart';

View File

@@ -0,0 +1,85 @@
import 'package:rasadyar_chicken/features/common/data/model/local/widely_used_local_model.dart';
import 'package:rasadyar_chicken/features/common/data/model/request/change_password/change_password_request_model.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/bar_information/bar_information.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/broadcast_price/broadcast_price.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/guild/guild_model.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/guild_profile/guild_profile.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/inventory/inventory_model.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/iran_province_city/iran_province_city_model.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/kill_house_distribution_info/kill_house_distribution_info.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/roles_products/roles_products.dart';
import 'package:rasadyar_chicken/features/steward/data/model/response/segmentation_model/segmentation_model.dart';
import 'package:rasadyar_chicken/features/common/data/model/response/user_profile/user_profile.dart';
import 'package:rasadyar_core/core.dart';
abstract class CommonRepository {
//region Remote
Future<List<InventoryModel>?> getInventory({
required String token,
CancelToken? cancelToken,
});
Future<KillHouseDistributionInfo?> getKillHouseDistributionInfo({
required String token,
});
Future<BarInformation?> getGeneralBarInformation({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<List<ProductModel>?> getRolesProducts({required String token});
Future<List<GuildModel>?> getGuilds({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<GuildProfile?> getProfile({required String token});
Future<List<IranProvinceCityModel>?> getProvince({CancelToken? cancelToken});
Future<List<IranProvinceCityModel>?> getCity({required String provinceName});
Future<UserProfile?> getUserProfile({required String token});
Future<void> updateUserProfile({
required String token,
required UserProfile userProfile,
});
Future<void> updatePassword({
required String token,
required ChangePasswordRequestModel model,
});
Future<PaginationModel<SegmentationModel>?> getSegmentation({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> createSegmentation({
required String token,
required SegmentationModel model,
});
Future<void> editSegmentation({
required String token,
required SegmentationModel model,
});
Future<SegmentationModel?> deleteSegmentation({
required String token,
required String key,
});
Future<BroadcastPrice?> getBroadcastPrice({required String token});
//endregion
//region local
Future<void> initWidleyUsed();
WidelyUsedLocalModel? getAllWidely();
//endregion
}

Some files were not shown because too many files have changed in this diff Show More