Skip to content

Commit

Permalink
feat(app): #15 complete tontine creation
Browse files Browse the repository at this point in the history
  • Loading branch information
konnofuente committed Aug 12, 2024
1 parent fd38b83 commit e4a49ec
Show file tree
Hide file tree
Showing 5 changed files with 114 additions and 61 deletions.
2 changes: 1 addition & 1 deletion lib/app/core/utils/constants/app_api_key.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ class ApiKey {
static const USER_KEY = "users";
static const ASSOCIATION_KEY = "associations";
static const MEDIA_KEY = "medias";
static const TONTINE_KEY = "medias";
static const TONTINE_KEY = "tontine";
}
132 changes: 79 additions & 53 deletions lib/infrastructure/data_sources/firebase/tontine_data_source.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'dart:developer';
import 'package:uuid/uuid.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:manzon/infrastructure/models/cycle_model.dart';
Expand All @@ -12,27 +13,39 @@ class TontineDataSource {
late final Function(String, String) contributionRef;

TontineDataSource() {
tontineRef = FirebaseFirestore.instance.collection(ApiKey.TONTINE_KEY).withConverter<TontineModel>(
fromFirestore: (snapshots, _) => TontineModel.fromJson(snapshots.data()!),
toFirestore: (tontine, _) => tontine.toJson(),
);
tontineRef = FirebaseFirestore.instance
.collection(ApiKey.TONTINE_KEY)
.withConverter<TontineModel>(
fromFirestore: (snapshots, _) =>
TontineModel.fromJson(snapshots.data()!),
toFirestore: (tontine, _) => tontine.toJson(),
);

cycleRef = _createCycleRef;
contributionRef = _createContributionRef;
}

CollectionReference<CycleModel> _createCycleRef(String tontineId) {
return tontineRef.doc(tontineId).collection('cycles').withConverter<CycleModel>(
fromFirestore: (snapshots, _) => CycleModel.fromJson(snapshots.data()!),
toFirestore: (cycle, _) => cycle.toJson(),
);
}

CollectionReference<TontineContributionModel> _createContributionRef(String tontineId, String cycleId) {
return cycleRef(tontineId).doc(cycleId).collection('contributions').withConverter<TontineContributionModel>(
fromFirestore: (snapshots, _) => TontineContributionModel.fromJson(snapshots.data()!),
toFirestore: (contribution, _) => contribution.toJson(),
);
return tontineRef
.doc(tontineId)
.collection('cycles')
.withConverter<CycleModel>(
fromFirestore: (snapshots, _) =>
CycleModel.fromJson(snapshots.data()!),
toFirestore: (cycle, _) => cycle.toJson(),
);
}

CollectionReference<TontineContributionModel> _createContributionRef(
String tontineId, String cycleId) {
return cycleRef(tontineId)
.doc(cycleId)
.collection('contributions')
.withConverter<TontineContributionModel>(
fromFirestore: (snapshots, _) =>
TontineContributionModel.fromJson(snapshots.data()!),
toFirestore: (contribution, _) => contribution.toJson(),
);
}

Future<void> addTontine(TontineModel tontineModel) async {
Expand Down Expand Up @@ -76,61 +89,74 @@ class TontineDataSource {
await cycleRef(tontineId).doc(cycleId).delete();
}

Future<void> addContribution(String tontineId, String cycleId, TontineContributionModel contributionModel) async {
await contributionRef(tontineId, cycleId).doc(contributionModel.id).set(contributionModel);
Future<void> addContribution(String tontineId, String cycleId,
TontineContributionModel contributionModel) async {
await contributionRef(tontineId, cycleId)
.doc(contributionModel.id)
.set(contributionModel);
}

Future<TontineContributionModel?> getContributionById(String tontineId, String cycleId, String contributionId) async {
final doc = await contributionRef(tontineId, cycleId).doc(contributionId).get();
Future<TontineContributionModel?> getContributionById(
String tontineId, String cycleId, String contributionId) async {
final doc =
await contributionRef(tontineId, cycleId).doc(contributionId).get();
if (doc.exists) {
return doc.data();
}
return null;
}

Future<void> updateContribution(String tontineId, String cycleId, TontineContributionModel contributionModel) async {
await contributionRef(tontineId, cycleId).doc(contributionModel.id).set(contributionModel);
Future<void> updateContribution(String tontineId, String cycleId,
TontineContributionModel contributionModel) async {
await contributionRef(tontineId, cycleId)
.doc(contributionModel.id)
.set(contributionModel);
}

Future<void> deleteContribution(String tontineId, String cycleId, String contributionId) async {
Future<void> deleteContribution(
String tontineId, String cycleId, String contributionId) async {
await contributionRef(tontineId, cycleId).doc(contributionId).delete();
}

Future<void> _generateCycles(TontineModel tontineModel) async {
final List<CycleModel> cycles = [];
final int totalCycles = (tontineModel.members?.length ?? 0) * tontineModel.cycleDuration;
final DateTime now = DateTime.now();
DateTime startDate = now;

for (int i = 0; i < totalCycles; i++) {
final int currentMemberIndex = i ~/ tontineModel.cycleDuration;
final MemberEntity receiver = tontineModel.orderList![currentMemberIndex % tontineModel.orderList!.length];
final DateTime endDate = startDate.add(_getDuration(ContributionFrequency.values.firstWhere((e) => e.toString() == tontineModel.contributionFrequency)));

final cycle = CycleModel(
id: Uuid().v4(),
number: currentMemberIndex + 1,
sequenceNumber: i + 1,
tontineId: tontineModel.id,
receiver: MemberMapper.toModel(receiver),
startDate: startDate,
endDate: endDate,
isCompleted: false,
contributions: [],
);
Future<void> _generateCycles(TontineModel tontineModel) async {
log(tontineModel.contributionFrequency.toString());
final List<CycleModel> cycles = [];
final int totalCycles =
(tontineModel.members?.length ?? 0) * tontineModel.cycleDuration;
final DateTime now = DateTime.now();
DateTime startDate = now;

for (int i = 0; i < totalCycles; i++) {
final int currentMemberIndex = i ~/ tontineModel.cycleDuration;
final MemberEntity receiver = tontineModel
.orderList![currentMemberIndex % tontineModel.orderList!.length];

final DateTime endDate =
startDate.add(_getDuration(tontineModel.contributionFrequency));

final cycle = CycleModel(
id: Uuid().v4(),
number: currentMemberIndex + 1,
sequenceNumber: i + 1,
tontineId: tontineModel.id,
receiver: MemberMapper.toModel(receiver),
startDate: startDate,
endDate: endDate,
isCompleted: false,
contributions: [],
);

cycles.add(cycle);
startDate = endDate;
}

cycles.add(cycle);
startDate = endDate;
}
for (final cycle in cycles) {
await addCycle(tontineModel.id, cycle);
}

for (final cycle in cycles) {
await addCycle(tontineModel.id, cycle);
await updateTontine(tontineModel.copyWith(cycles: cycles));
}

await updateTontine(tontineModel.copyWith(cycles: cycles));
}


Duration _getDuration(ContributionFrequency frequency) {
switch (frequency) {
case ContributionFrequency.weekly:
Expand Down
39 changes: 33 additions & 6 deletions lib/presentation/controllers/create_tontine_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'package:contacts_service/contacts_service.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:manzon/app/config/routes/app_route_names.dart';
import 'package:manzon/presentation/widgets/export_widget.dart';
import 'package:manzon/infrastructure/mappers/member_mapper.dart';
import 'package:manzon/domain/entities/export_domain_entities.dart';
import 'package:manzon/infrastructure/models/export_infrastruture_models.dart';
import 'package:manzon/infrastructure/data_sources/firebase/tontine_data_source.dart';
Expand Down Expand Up @@ -100,7 +101,9 @@ class CreateTontineController extends GetxController {
id: Uuid().v4(),
name: contact.displayName ?? '',
role: 'Member',
userId: contact.identifier ?? '',
userId: contact.phones?.isNotEmpty ?? false
? contact.phones!.first.value!
: contact.identifier!,
phoneNumber: contact.phones?.isNotEmpty ?? false
? contact.phones!.first.value!
: '',
Expand Down Expand Up @@ -191,23 +194,47 @@ class CreateTontineController extends GetxController {
receiverFrequency.value = value;
}

void createTontine() async {
void createTontine() async {
final tontine = TontineModel(
id: Uuid().v4(),
name: tontineNameController.text,
contributionAmount: double.parse(individualAmountController.text),
contributionFrequency: contributionFrequency.value,
receiverFrequency: receiverFrequency.value,
members: selectedMembers.map((e) => e as MemberModel).toList(),
members: selectedMembers.map((e) => MemberMapper.toModel(e)).toList(),
membersId: selectedMembers.map((m) => m.id).toList(),
orderList: selectedMembers.map((e) => e as MemberModel).toList(),
orderList: selectedMembers.map((e) => MemberMapper.toModel(e)).toList(),
cycles: [],
associationId: 'association_id', // Replace with actual association ID
cycleDuration: 4, // Example value, replace with actual cycle duration
currentCycle: 0,
);

await tontineDataSource.addTontine(tontine);
Get.back();
// Printing all tontine values for debugging
print('Tontine Values:');
print('ID: ${tontine.id}');
print('Name: ${tontine.name}');
print('Contribution Amount: ${tontine.contributionAmount}');
print('Contribution Frequency: ${tontine.contributionFrequency}');
print('Receiver Frequency: ${tontine.receiverFrequency}');
print('Members: ${tontine.members}');
print('Members ID: ${tontine.membersId}');
print('Order List: ${tontine.orderList}');
print('Cycles: ${tontine.cycles}');
print('Association ID: ${tontine.associationId}');
print('Cycle Duration: ${tontine.cycleDuration}');
print('Current Cycle: ${tontine.currentCycle}');

try {
await tontineDataSource.addTontine(tontine);
ToastUtils.showSuccess(Get.context!, "Tontine", "Your Tontine was successfully created");
} catch (e) {
// Handle any exceptions that occur during the execution of the code inside the try block
print('Error: $e');
ToastUtils.showError(Get.context!, "Error", "An error occurred while creating the Tontine");
}

Get.toNamed(AppRouteNames.associationPage);
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export './financial_information.dart';
export './order_members.dart';
export './verification_screen.dart';
export 'verification_tontine_screen.dart';
export './tontine_information.dart';

0 comments on commit e4a49ec

Please sign in to comment.