diff --git a/libpretixsync/src/main/java/eu/pretix/libpretixsync/api/PretixApi.kt b/libpretixsync/src/main/java/eu/pretix/libpretixsync/api/PretixApi.kt index 89aa5904..cdc24371 100644 --- a/libpretixsync/src/main/java/eu/pretix/libpretixsync/api/PretixApi.kt +++ b/libpretixsync/src/main/java/eu/pretix/libpretixsync/api/PretixApi.kt @@ -160,7 +160,7 @@ open class PretixApi(url: String, key: String, orgaSlug: String, version: Int, h if (exchange_medium_type != null) body.put("exchange_medium_type", exchange_medium_type) if (exchange_medium_identifier != null) body.put("exchange_medium_identifier", exchange_medium_identifier) if (simulate) body.put("simulate", true) - var pd = "?expand=answers.question" + var pd = "?expand=answers.question&expand=addons" if (pdf_data) { pd += "&pdf_data=true" } diff --git a/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/AsyncCheckProvider.kt b/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/AsyncCheckProvider.kt index d23af64a..d2e28b28 100644 --- a/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/AsyncCheckProvider.kt +++ b/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/AsyncCheckProvider.kt @@ -960,6 +960,34 @@ class AsyncCheckProvider(private val config: ConfigStore, private val db: SyncDa return Pair(results, errors) } + private fun collectAddons( + order: OrderModel, + position: OrderPositionModel, + ): List { + return db.orderPositionQueries.selectForOrder(order.id) + .executeAsList() + .map { it.toModel() } + .filter { it.addonToServerId == position.serverId } + .map { addon -> + val addonItem = db.itemQueries.selectById(addon.itemId).executeAsOne().toModel() + val varid = addon.variationServerId + val variation = if (varid != null && varid > 0) { + try { + addonItem.getVariation(varid) + } catch (e: JSONException) { + sentry.captureException(e) + null + } + } else null + + TicketCheckProvider.AddonInfo( + itemName = addonItem.internalName, + variationName = variation?.stringValue, + attendeeName = addon.attendeeName, + ) + } + } + private fun checkOfflineWithData( eventsAndCheckinLists: Map, secret: String, @@ -1129,7 +1157,7 @@ class AsyncCheckProvider(private val config: ConfigStore, private val db: SyncDa res.isRequireAttention = require_attention || variation?.isCheckin_attention == true res.checkinTexts = listOfNotNull(order.checkInText?.trim(), variation?.checkin_text?.trim(), item.checkInText?.trim()).filterNot { it.isBlank() || it == "null" } - + res.addons = collectAddons(order, position) val storedCheckIns = db.checkInQueries.selectByPositionId(position.id).executeAsList().map { it.toModel() } val checkIns = storedCheckIns.filter { it.listServerId == listId && it.localAnnulled == null diff --git a/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/OnlineCheckProvider.kt b/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/OnlineCheckProvider.kt index 404aa7a8..5684362e 100644 --- a/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/OnlineCheckProvider.kt +++ b/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/OnlineCheckProvider.kt @@ -226,6 +226,26 @@ class OnlineCheckProvider( res.locale = posjson.getString("order__locale") } res.position = posjson + val addonsJson = posjson.optJSONArray("addons") + if (addonsJson != null) { + val addons = mutableListOf() + for (i in 0 until addonsJson.length()) { + val a = addonsJson.getJSONObject(i) + val addonItem = db.itemQueries.selectByServerId(a.getLong("item")).executeAsOneOrNull()?.toModel() + val variation = if (addonItem != null && a.optLong("variation", 0) > 0) { + addonItem.getVariation(a.getLong("variation")) + } else null + addons.add( + TicketCheckProvider.AddonInfo( + itemName = addonItem?.internalName, + variationName = variation?.stringValue, + attendeeName = if (a.isNull("attendee_name")) null else a.optString("attendee_name"), + ) + ) + } + res.addons = addons + } + val checkins = posjson.getJSONArray("checkins") for (i in 0 until checkins.length()) { val ci = checkins.getJSONObject(i) diff --git a/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/TicketCheckProvider.kt b/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/TicketCheckProvider.kt index b0838d08..10d8d35b 100644 --- a/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/TicketCheckProvider.kt +++ b/libpretixsync/src/main/java/eu/pretix/libpretixsync/check/TicketCheckProvider.kt @@ -55,6 +55,13 @@ interface TicketCheckProvider { // required for de-serialization constructor() {} } + data class AddonInfo( + val itemName: String? = null, + val variationName: String? = null, + val attendeeName: String? = null, + val isBundled: Boolean = false, + val checkedIn: Boolean? = null, + ) class CheckResult { enum class Type { @@ -75,6 +82,7 @@ interface TicketCheckProvider { var positionId: Long? = null var firstScanned: Date? = null var addonText: String? = null + var addons: List? = null var reasonExplanation: String? = null var checkinTexts: List? = null var isRequireAttention = false