@@ -20,6 +20,7 @@ import fi.espoo.evaka.shared.domain.HelsinkiDateTimeRange
20
20
import fi.espoo.evaka.shared.domain.TimeRange
21
21
import fi.espoo.evaka.shared.domain.getHolidays
22
22
import fi.espoo.evaka.shared.sftp.SftpClient
23
+ import io.github.oshai.kotlinlogging.KotlinLogging
23
24
import java.io.ByteArrayOutputStream
24
25
import java.io.PrintWriter
25
26
import java.nio.charset.StandardCharsets
@@ -32,6 +33,8 @@ import org.apache.commons.csv.CSVPrinter
32
33
import org.jdbi.v3.json.Json
33
34
import org.springframework.stereotype.Service
34
35
36
+ private val logger = KotlinLogging .logger {}
37
+
35
38
@Service
36
39
class AromiService (private val aromiEnv : AromiEnv ? ) {
37
40
private val startDateTimeFormatter = DateTimeFormatter .ofPattern(" yyyyMMddHHmm" )
@@ -42,23 +45,31 @@ class AromiService(private val aromiEnv: AromiEnv?) {
42
45
clock : EvakaClock ,
43
46
earliestStartDate : LocalDate = LocalDate .of(2025, 4, 22),
44
47
) {
48
+ val today = clock.today()
49
+ logger.info { " Scheduled sending of Aromi attendance CSV started ($today )" }
45
50
val sftpClient =
46
51
aromiEnv?.let { SftpClient (it.sftp) }
47
52
? : error(" Cannot send Aromi orders: AromiEnv is not configured" )
48
53
val formatter = DateTimeFormatter .ofPattern(aromiEnv.filePattern)
49
- val today = clock.today()
50
54
val endDate = today.plusDays(21 )
51
55
if (endDate.isBefore(earliestStartDate))
52
56
error(" End date of meal order is before earliest start date, aborting" )
53
57
val startDate = maxOf(earliestStartDate, today.plusDays(3 ))
54
-
55
58
val data = getMealOrdersCsv(db, FiniteDateRange (startDate, endDate))
56
- data.inputStream().use { sftpClient.put(it, today.format(formatter)) }
59
+ val fileName = today.format(formatter)
60
+ logger.info { " Sending Aromi attendance CSV $fileName (${data.size} )" }
61
+ data.inputStream().use { sftpClient.put(it, fileName) }
62
+ logger.info { " Scheduled sending of Aromi attendance CSV completed" }
57
63
}
58
64
59
65
fun getMealOrdersCsv (dbc : Database .Connection , range : FiniteDateRange ): ByteArray {
66
+ logger.info { " Collecting Aromi attendance rows (${range.start} - ${range.end} )" }
60
67
val data = dbc.read { tx -> getData(tx, range) }
61
68
if (data.report.isEmpty()) error(" No attendance information available, aborting" )
69
+ val earliestStartDate = data.report.minOfOrNull { it.date }
70
+ logger.info {
71
+ " Aromi attendance rows collected (${data.report.size} ), earliest attendance date $earliestStartDate "
72
+ }
62
73
return ByteArrayOutputStream ().use { stream ->
63
74
PrintWriter (stream, false , StandardCharsets .ISO_8859_1 ).use { writer ->
64
75
printCsv(writer, data)
0 commit comments