aboutsummaryrefslogtreecommitdiff
path: root/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/ReportController.kt
diff options
context:
space:
mode:
authorIván Ávalos <avalos@disroot.org>2022-01-14 18:25:26 -0600
committerIván Ávalos <avalos@disroot.org>2022-01-14 18:25:26 -0600
commit7c3e13114fd189c49e86b8d6c200ffb3c27bb498 (patch)
tree9024ba5e810b40c22eeb2065e3d22650aa51d54e /shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/ReportController.kt
parente10c55888fede23b225dee03044f6953e997c28b (diff)
downloadetbsa-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.kt134
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