Dodaj kartę przypomnienia o tachografie
This commit is contained in:
@@ -47,6 +47,7 @@ data class BootstrapResponse(
|
|||||||
val routes: RoutesBucketDto,
|
val routes: RoutesBucketDto,
|
||||||
val driverAppSettings: DriverAppSettingsDto?,
|
val driverAppSettings: DriverAppSettingsDto?,
|
||||||
val dispatchSheetReminder: DispatchSheetReminderDto? = null,
|
val dispatchSheetReminder: DispatchSheetReminderDto? = null,
|
||||||
|
val tachographReminder: TachographReminderDto? = null,
|
||||||
val notificationPreferences: NotificationPreferencesDto? = null,
|
val notificationPreferences: NotificationPreferencesDto? = null,
|
||||||
val realtime: RealtimeConfigDto? = null,
|
val realtime: RealtimeConfigDto? = null,
|
||||||
val syncState: SyncStateResponse? = null,
|
val syncState: SyncStateResponse? = null,
|
||||||
@@ -80,6 +81,7 @@ data class DriverAppSettingsDto(
|
|||||||
val dispatchSheetRemindersEnabled: Boolean? = null,
|
val dispatchSheetRemindersEnabled: Boolean? = null,
|
||||||
val dispatchSheetOnFridays: Boolean? = null,
|
val dispatchSheetOnFridays: Boolean? = null,
|
||||||
val dispatchSheetOnLastWorkingDay: Boolean? = null,
|
val dispatchSheetOnLastWorkingDay: Boolean? = null,
|
||||||
|
val tachographRemindersEnabled: Boolean? = null,
|
||||||
val leaveRequests: LeaveRequestsConfigDto? = null,
|
val leaveRequests: LeaveRequestsConfigDto? = null,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -99,6 +101,13 @@ data class DispatchSheetReminderDto(
|
|||||||
val canUpload: Boolean = false,
|
val canUpload: Boolean = false,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
data class TachographReminderDto(
|
||||||
|
val enabled: Boolean = false,
|
||||||
|
val visible: Boolean = false,
|
||||||
|
val title: String? = null,
|
||||||
|
val message: String? = null,
|
||||||
|
)
|
||||||
|
|
||||||
data class DispatchSheetPhotoDto(
|
data class DispatchSheetPhotoDto(
|
||||||
val id: String,
|
val id: String,
|
||||||
val driverId: String,
|
val driverId: String,
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ import androidx.compose.material.icons.outlined.Person
|
|||||||
import androidx.compose.material.icons.outlined.Phone
|
import androidx.compose.material.icons.outlined.Phone
|
||||||
import androidx.compose.material.icons.outlined.Refresh
|
import androidx.compose.material.icons.outlined.Refresh
|
||||||
import androidx.compose.material.icons.outlined.SystemUpdate
|
import androidx.compose.material.icons.outlined.SystemUpdate
|
||||||
|
import androidx.compose.material.icons.outlined.Speed
|
||||||
import androidx.compose.material.ExperimentalMaterialApi
|
import androidx.compose.material.ExperimentalMaterialApi
|
||||||
import androidx.compose.material.pullrefresh.PullRefreshIndicator
|
import androidx.compose.material.pullrefresh.PullRefreshIndicator
|
||||||
import androidx.compose.material.pullrefresh.pullRefresh
|
import androidx.compose.material.pullrefresh.pullRefresh
|
||||||
@@ -164,6 +165,7 @@ import pl.firmatpp.kierowca.data.model.DriverLeaveRequestDto
|
|||||||
import pl.firmatpp.kierowca.data.model.DriverRouteDto
|
import pl.firmatpp.kierowca.data.model.DriverRouteDto
|
||||||
import pl.firmatpp.kierowca.data.model.NavigationPointDto
|
import pl.firmatpp.kierowca.data.model.NavigationPointDto
|
||||||
import pl.firmatpp.kierowca.data.model.RoutePhotoDto
|
import pl.firmatpp.kierowca.data.model.RoutePhotoDto
|
||||||
|
import pl.firmatpp.kierowca.data.model.TachographReminderDto
|
||||||
import pl.firmatpp.kierowca.data.model.driverLifecycleStatus
|
import pl.firmatpp.kierowca.data.model.driverLifecycleStatus
|
||||||
import pl.firmatpp.kierowca.data.upload.DispatchSheetUploadEntity
|
import pl.firmatpp.kierowca.data.upload.DispatchSheetUploadEntity
|
||||||
import pl.firmatpp.kierowca.data.upload.PhotoUploadEntity
|
import pl.firmatpp.kierowca.data.upload.PhotoUploadEntity
|
||||||
@@ -1277,6 +1279,11 @@ private fun RoutesScreen(
|
|||||||
onDate = onDate,
|
onDate = onDate,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
if (shouldShowTachographReminderCard(state.tachographReminder)) {
|
||||||
|
item {
|
||||||
|
TachographReminderCard(state.tachographReminder)
|
||||||
|
}
|
||||||
|
}
|
||||||
if (shouldShowDispatchSheetReminderCard(state.dispatchSheetReminder)) {
|
if (shouldShowDispatchSheetReminderCard(state.dispatchSheetReminder)) {
|
||||||
item {
|
item {
|
||||||
DispatchSheetReminderCard(
|
DispatchSheetReminderCard(
|
||||||
@@ -2251,6 +2258,51 @@ private fun DispatchSheetReminderCard(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun TachographReminderCard(reminder: TachographReminderDto?) {
|
||||||
|
if (!shouldShowTachographReminderCard(reminder)) return
|
||||||
|
|
||||||
|
Card(
|
||||||
|
colors = CardDefaults.cardColors(containerColor = TppTheme.colors.warningContainer),
|
||||||
|
border = BorderStroke(1.dp, TppTheme.colors.warningOutline),
|
||||||
|
shape = MaterialTheme.shapes.medium,
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
Modifier.fillMaxWidth().padding(18.dp),
|
||||||
|
horizontalArrangement = Arrangement.spacedBy(14.dp),
|
||||||
|
verticalAlignment = Alignment.Top,
|
||||||
|
) {
|
||||||
|
Box(
|
||||||
|
modifier = Modifier
|
||||||
|
.size(44.dp)
|
||||||
|
.background(Color.White.copy(alpha = 0.72f), RoundedCornerShape(12.dp)),
|
||||||
|
contentAlignment = Alignment.Center,
|
||||||
|
) {
|
||||||
|
Icon(
|
||||||
|
Icons.Outlined.Speed,
|
||||||
|
contentDescription = null,
|
||||||
|
tint = Color(0xFF7A5200),
|
||||||
|
modifier = Modifier.size(27.dp),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Column(Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(5.dp)) {
|
||||||
|
Text(
|
||||||
|
reminder?.title.orEmpty(),
|
||||||
|
color = TppTheme.colors.ink,
|
||||||
|
style = MaterialTheme.typography.titleMedium,
|
||||||
|
fontWeight = FontWeight.Bold,
|
||||||
|
)
|
||||||
|
Text(
|
||||||
|
reminder?.message.orEmpty(),
|
||||||
|
color = Color(0xFF5F4200),
|
||||||
|
style = MaterialTheme.typography.bodyMedium,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun OperationalQueueBanner(state: DriverUiState, onPhotoQueue: () -> Unit) {
|
private fun OperationalQueueBanner(state: DriverUiState, onPhotoQueue: () -> Unit) {
|
||||||
val count = state.pendingOperationalItems
|
val count = state.pendingOperationalItems
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import kotlin.math.abs
|
|||||||
import pl.firmatpp.kierowca.data.model.DriverRouteDto
|
import pl.firmatpp.kierowca.data.model.DriverRouteDto
|
||||||
import pl.firmatpp.kierowca.data.model.DispatchSheetReminderDto
|
import pl.firmatpp.kierowca.data.model.DispatchSheetReminderDto
|
||||||
import pl.firmatpp.kierowca.data.model.RoutePhotoDto
|
import pl.firmatpp.kierowca.data.model.RoutePhotoDto
|
||||||
|
import pl.firmatpp.kierowca.data.model.TachographReminderDto
|
||||||
import pl.firmatpp.kierowca.data.model.driverLifecycleStatus
|
import pl.firmatpp.kierowca.data.model.driverLifecycleStatus
|
||||||
import pl.firmatpp.kierowca.data.upload.PhotoUploadEntity
|
import pl.firmatpp.kierowca.data.upload.PhotoUploadEntity
|
||||||
import pl.firmatpp.kierowca.data.upload.PhotoUploadStatus
|
import pl.firmatpp.kierowca.data.upload.PhotoUploadStatus
|
||||||
@@ -671,6 +672,12 @@ fun canLaunchCameraWithLocationPolicy(requirePreciseLocation: Boolean, hasFineLo
|
|||||||
fun shouldShowDispatchSheetReminderCard(reminder: DispatchSheetReminderDto?): Boolean =
|
fun shouldShowDispatchSheetReminderCard(reminder: DispatchSheetReminderDto?): Boolean =
|
||||||
reminder?.dueToday == true && reminder.status in setOf("missing", "uploaded")
|
reminder?.dueToday == true && reminder.status in setOf("missing", "uploaded")
|
||||||
|
|
||||||
|
fun shouldShowTachographReminderCard(reminder: TachographReminderDto?): Boolean =
|
||||||
|
reminder?.enabled == true &&
|
||||||
|
reminder.visible &&
|
||||||
|
!reminder.title.isNullOrBlank() &&
|
||||||
|
!reminder.message.isNullOrBlank()
|
||||||
|
|
||||||
fun dispatchSheetPrimaryActionLabel(reminder: DispatchSheetReminderDto?, hasQueuedUpload: Boolean): String =
|
fun dispatchSheetPrimaryActionLabel(reminder: DispatchSheetReminderDto?, hasQueuedUpload: Boolean): String =
|
||||||
when {
|
when {
|
||||||
hasQueuedUpload -> "Wysyłam zdjęcie..."
|
hasQueuedUpload -> "Wysyłam zdjęcie..."
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import pl.firmatpp.kierowca.data.model.DriverLeaveCalendarEntryDto
|
|||||||
import pl.firmatpp.kierowca.data.model.DriverLeaveRequestDto
|
import pl.firmatpp.kierowca.data.model.DriverLeaveRequestDto
|
||||||
import pl.firmatpp.kierowca.data.model.DriverRouteDto
|
import pl.firmatpp.kierowca.data.model.DriverRouteDto
|
||||||
import pl.firmatpp.kierowca.data.model.RoutePhotoDto
|
import pl.firmatpp.kierowca.data.model.RoutePhotoDto
|
||||||
|
import pl.firmatpp.kierowca.data.model.TachographReminderDto
|
||||||
import pl.firmatpp.kierowca.data.model.driverLifecycleStatus
|
import pl.firmatpp.kierowca.data.model.driverLifecycleStatus
|
||||||
import pl.firmatpp.kierowca.data.upload.DispatchSheetUploadEntity
|
import pl.firmatpp.kierowca.data.upload.DispatchSheetUploadEntity
|
||||||
import pl.firmatpp.kierowca.data.upload.DispatchSheetUploadOutbox
|
import pl.firmatpp.kierowca.data.upload.DispatchSheetUploadOutbox
|
||||||
@@ -102,6 +103,7 @@ data class DriverUiState(
|
|||||||
val photoUploads: List<PhotoUploadEntity> = emptyList(),
|
val photoUploads: List<PhotoUploadEntity> = emptyList(),
|
||||||
val queuedPhotoUploads: List<PhotoUploadEntity> = emptyList(),
|
val queuedPhotoUploads: List<PhotoUploadEntity> = emptyList(),
|
||||||
val dispatchSheetReminder: DispatchSheetReminderDto? = null,
|
val dispatchSheetReminder: DispatchSheetReminderDto? = null,
|
||||||
|
val tachographReminder: TachographReminderDto? = null,
|
||||||
val appUpdate: AppUpdateDto? = null,
|
val appUpdate: AppUpdateDto? = null,
|
||||||
val dispatchSheetUploads: List<DispatchSheetUploadEntity> = emptyList(),
|
val dispatchSheetUploads: List<DispatchSheetUploadEntity> = emptyList(),
|
||||||
val leaveRequestsConfig: LeaveRequestsConfig? = null,
|
val leaveRequestsConfig: LeaveRequestsConfig? = null,
|
||||||
@@ -509,6 +511,7 @@ class DriverViewModel(application: Application) : AndroidViewModel(application)
|
|||||||
driver = response.session.driver,
|
driver = response.session.driver,
|
||||||
routes = response.routes.today,
|
routes = response.routes.today,
|
||||||
dispatchSheetReminder = response.dispatchSheetReminder,
|
dispatchSheetReminder = response.dispatchSheetReminder,
|
||||||
|
tachographReminder = response.tachographReminder,
|
||||||
appUpdate = response.appUpdate ?: it.appUpdate,
|
appUpdate = response.appUpdate ?: it.appUpdate,
|
||||||
selectedDate = settings?.selectedDate ?: date ?: it.selectedDate,
|
selectedDate = settings?.selectedDate ?: date ?: it.selectedDate,
|
||||||
minRouteDate = settings?.minDate ?: it.minRouteDate,
|
minRouteDate = settings?.minDate ?: it.minRouteDate,
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import org.junit.Test
|
|||||||
import pl.firmatpp.kierowca.data.model.DriverRouteDto
|
import pl.firmatpp.kierowca.data.model.DriverRouteDto
|
||||||
import pl.firmatpp.kierowca.data.model.DispatchSheetReminderDto
|
import pl.firmatpp.kierowca.data.model.DispatchSheetReminderDto
|
||||||
import pl.firmatpp.kierowca.data.model.RoutePhotoDto
|
import pl.firmatpp.kierowca.data.model.RoutePhotoDto
|
||||||
|
import pl.firmatpp.kierowca.data.model.TachographReminderDto
|
||||||
import pl.firmatpp.kierowca.data.upload.PhotoUploadEntity
|
import pl.firmatpp.kierowca.data.upload.PhotoUploadEntity
|
||||||
import pl.firmatpp.kierowca.data.upload.RouteActionEntity
|
import pl.firmatpp.kierowca.data.upload.RouteActionEntity
|
||||||
import pl.firmatpp.kierowca.data.upload.RouteActionStatus
|
import pl.firmatpp.kierowca.data.upload.RouteActionStatus
|
||||||
@@ -410,6 +411,41 @@ class DriverUiRulesTest {
|
|||||||
assertFalse(shouldShowDispatchSheetReminderCard(null))
|
assertFalse(shouldShowDispatchSheetReminderCard(null))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun showsTachographCardOnlyForCompleteReminderEnabledByBackend() {
|
||||||
|
assertTrue(
|
||||||
|
shouldShowTachographReminderCard(
|
||||||
|
TachographReminderDto(
|
||||||
|
enabled = true,
|
||||||
|
visible = true,
|
||||||
|
title = "Odczyt tachografu",
|
||||||
|
message = "Pamiętaj o odczycie.",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
assertFalse(
|
||||||
|
shouldShowTachographReminderCard(
|
||||||
|
TachographReminderDto(
|
||||||
|
enabled = false,
|
||||||
|
visible = true,
|
||||||
|
title = "Odczyt tachografu",
|
||||||
|
message = "Pamiętaj o odczycie.",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
assertFalse(
|
||||||
|
shouldShowTachographReminderCard(
|
||||||
|
TachographReminderDto(
|
||||||
|
enabled = true,
|
||||||
|
visible = false,
|
||||||
|
title = "Odczyt tachografu",
|
||||||
|
message = "Pamiętaj o odczycie.",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
assertFalse(shouldShowTachographReminderCard(null))
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun explainsOfflineStateWithoutCachedSync() {
|
fun explainsOfflineStateWithoutCachedSync() {
|
||||||
assertEquals(
|
assertEquals(
|
||||||
|
|||||||
Reference in New Issue
Block a user