diff options
author | Iván Ávalos <avalos@disroot.org> | 2022-01-14 18:25:26 -0600 |
---|---|---|
committer | Iván Ávalos <avalos@disroot.org> | 2022-01-14 18:25:26 -0600 |
commit | 7c3e13114fd189c49e86b8d6c200ffb3c27bb498 (patch) | |
tree | 9024ba5e810b40c22eeb2065e3d22650aa51d54e /shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/ReportController.kt | |
parent | e10c55888fede23b225dee03044f6953e997c28b (diff) | |
download | etbsa-trackermap-mobile-7c3e13114fd189c49e86b8d6c200ffb3c27bb498.tar.gz etbsa-trackermap-mobile-7c3e13114fd189c49e86b8d6c200ffb3c27bb498.tar.bz2 etbsa-trackermap-mobile-7c3e13114fd189c49e86b8d6c200ffb3c27bb498.zip |
Refactored reports code into ReportController.kt and added extra report periods
Diffstat (limited to 'shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/ReportController.kt')
-rw-r--r-- | shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/ReportController.kt | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/ReportController.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/ReportController.kt new file mode 100644 index 0000000..2151331 --- /dev/null +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/ReportController.kt @@ -0,0 +1,134 @@ +package mx.trackermap.TrackerMap.controllers + +import android.util.Log +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.launch +import mx.trackermap.TrackerMap.client.apis.GeofencesApi +import mx.trackermap.TrackerMap.client.apis.ReportsApi +import mx.trackermap.TrackerMap.client.models.EventInformation +import mx.trackermap.TrackerMap.client.models.Position +import mx.trackermap.TrackerMap.client.models.Stop +import mx.trackermap.TrackerMap.utils.ReportDates + +@DelicateCoroutinesApi +class ReportController( + private val reportsApi: ReportsApi, + private val geofencesApi: GeofencesApi +) { + + sealed class Report { + class PositionsReport(val positions: Array<Position>) : Report() + class EventsReport(val events: Array<EventInformation>) : Report() + class StopsReport(val stops: Array<Stop>) : Report() + class XlsxReport(val data: ByteArray) : Report() + object LoadingReport: Report() + } + + enum class ReportType { + POSITIONS, EVENTS, STOPS + } + + val reportFlow: MutableStateFlow<Report> = MutableStateFlow(Report.LoadingReport) + + fun fetchReport( + deviceId: Int, + reportType: ReportType?, + reportPeriod: ReportDates.ReportPeriod?, + xlsx: Boolean = false + ) { + if (reportType == null || reportPeriod == null) { + return + } + + val (currentDate, previousDate) = ReportDates.getDates(reportPeriod) + Log.d("UnitReportsVM", "Current report type: $reportType") + Log.d("UnitReportsVM", "Current report period: $reportType") + Log.d("UnitReportsVM", "Current date:${currentDate}") + Log.d("UnitReportsVM", "Previous date:${previousDate}") + + if (!xlsx) { + reportFlow.value = Report.LoadingReport + } + GlobalScope.launch { + when (reportType) { + ReportType.POSITIONS -> fetchPositions(deviceId, previousDate, currentDate, xlsx) + ReportType.EVENTS -> fetchEvents(deviceId, previousDate, currentDate, xlsx) + ReportType.STOPS -> fetchStops(deviceId, previousDate, currentDate, xlsx) + } + } + } + + private suspend fun fetchPositions( + deviceId: Int, + from: String, + to: String, + xlsx: Boolean + ) { + Log.d("UnitReportsVM", "Fetching positions") + + if (!xlsx) { + val result = reportsApi.reportsRouteGet(from, to, deviceId) + Log.d("UnitReportsVM", "Positions report: $result") + reportFlow.value = Report.PositionsReport(result) + } else { + val result = reportsApi.reportsRouteGetXlsx(from, to, deviceId) + Log.d("UnitReportsVM", "Positions report: $result") + reportFlow.value = Report.XlsxReport(result) + } + + } + + private suspend fun fetchEvents( + deviceId: Int, + from: String, + to: String, + xlsx: Boolean + ) { + Log.d("UnitReportsVM", "Fetching events") + + if (!xlsx) { + val positionsResult = reportsApi.reportsRouteGet(from, to, deviceId) + val eventsResult = reportsApi.reportsEventsGet(from, to, deviceId) + val geofencesResult = geofencesApi.geofencesGet(all = true) + + val result = mutableListOf<EventInformation>() + eventsResult.forEach { event -> + result.add(EventInformation( + event = event, + position = positionsResult.find { it.id == event.positionId }, + geofence = geofencesResult.find { it.id == event.geofenceId } + )) + } + + Log.d("UnitReportsVM", "Events report: $result") + reportFlow.value = Report.EventsReport(result.toTypedArray()) + } else { + val result = reportsApi.reportsEventsGetXlsx(from, to, deviceId) + + Log.d("UnitReportsVM", "Events report: $result") + reportFlow.value = Report.XlsxReport(result) + } + } + + private suspend fun fetchStops( + deviceId: Int, + from: String, + to: String, + xlsx: Boolean + ) { + Log.d("UnitReportsVM", "Fetching stops") + + if (!xlsx) { + val result = reportsApi.reportsStopsGet(from, to, deviceId) + Log.d("UnitReportsVM", "Stops report: $result") + reportFlow.value = Report.StopsReport(result) + } else { + val result = reportsApi.reportsStopsGetXlsx(from, to, deviceId) + Log.d("UnitReportsVM", "Stops report: $result") + reportFlow.value = Report.XlsxReport(result) + } + + } +}
\ No newline at end of file |