101 lines
3.4 KiB
Dart
101 lines
3.4 KiB
Dart
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import '../../data/models/teacher_models.dart';
|
|
import '../../data/repositories/teacher_repository.dart';
|
|
|
|
/**
|
|
* ==============================================================================
|
|
* SAQEL TEACHER STUDIO - MONETIZATION CUBIT
|
|
* ==============================================================================
|
|
*
|
|
* إدارة المحفظة المالية والتسييل وسحوبات كليك (CliQ Payouts):
|
|
* - حساب عوائد النموذج المزدوج (1,420 مجاني مدعوم مقابل 380 مدفوع خارجي)
|
|
* - تقسيم الحصص: 55% للمعلم / 15% لمديرية الثقافة / 30% للمنصة
|
|
* - إرسال واعتماد طلبات السحب عبر كليك.
|
|
*/
|
|
|
|
class TeacherMonetizationState {
|
|
final double studentSubscribers;
|
|
final double pricePerCourse;
|
|
final List<TeacherCourseModel> courses;
|
|
final List<TeacherPayoutRequestModel> payoutRequests;
|
|
final bool isSubmittingPayout;
|
|
|
|
const TeacherMonetizationState({
|
|
required this.studentSubscribers,
|
|
required this.pricePerCourse,
|
|
required this.courses,
|
|
required this.payoutRequests,
|
|
required this.isSubmittingPayout,
|
|
});
|
|
|
|
double get grossRevenue => studentSubscribers * pricePerCourse;
|
|
double get teacherShare => grossRevenue * 0.55;
|
|
double get directorateShare => grossRevenue * 0.15;
|
|
double get platformShare => grossRevenue * 0.30;
|
|
|
|
TeacherMonetizationState copyWith({
|
|
double? studentSubscribers,
|
|
double? pricePerCourse,
|
|
List<TeacherCourseModel>? courses,
|
|
List<TeacherPayoutRequestModel>? payoutRequests,
|
|
bool? isSubmittingPayout,
|
|
}) {
|
|
return TeacherMonetizationState(
|
|
studentSubscribers: studentSubscribers ?? this.studentSubscribers,
|
|
pricePerCourse: pricePerCourse ?? this.pricePerCourse,
|
|
courses: courses ?? this.courses,
|
|
payoutRequests: payoutRequests ?? this.payoutRequests,
|
|
isSubmittingPayout: isSubmittingPayout ?? this.isSubmittingPayout,
|
|
);
|
|
}
|
|
}
|
|
|
|
class TeacherMonetizationCubit extends Cubit<TeacherMonetizationState> {
|
|
final TeacherRepository repository;
|
|
|
|
TeacherMonetizationCubit({required this.repository})
|
|
: super(const TeacherMonetizationState(
|
|
studentSubscribers: 380,
|
|
pricePerCourse: 20.0,
|
|
courses: [],
|
|
payoutRequests: [
|
|
TeacherPayoutRequestModel(
|
|
cliqAlias: 'AHMAD@CLIQ',
|
|
amountJod: 2400.0,
|
|
requestedAt: 'الأسبوع الماضي',
|
|
status: 'completed',
|
|
),
|
|
],
|
|
isSubmittingPayout: false,
|
|
));
|
|
|
|
Future<void> loadMonetization() async {
|
|
final courses = await repository.getPublishedCourses();
|
|
emit(state.copyWith(courses: courses));
|
|
}
|
|
|
|
void updateSubscribers(double subscribers) {
|
|
emit(state.copyWith(studentSubscribers: subscribers));
|
|
}
|
|
|
|
Future<void> submitCliqPayout({
|
|
required String cliqAlias,
|
|
required double amountJod,
|
|
}) async {
|
|
emit(state.copyWith(isSubmittingPayout: true));
|
|
try {
|
|
final req = await repository.requestCliqPayout(
|
|
cliqAlias: cliqAlias,
|
|
amountJod: amountJod,
|
|
);
|
|
final updatedList = List<TeacherPayoutRequestModel>.from(state.payoutRequests)..insert(0, req);
|
|
emit(state.copyWith(
|
|
payoutRequests: updatedList,
|
|
isSubmittingPayout: false,
|
|
));
|
|
} catch (_) {
|
|
emit(state.copyWith(isSubmittingPayout: false));
|
|
}
|
|
}
|
|
}
|