Files
saqel/apps/teacher_app/lib/logic/cubits/teacher_monetization_cubit.dart
T

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));
}
}
}