Skip to content

Commit b56a2b1

Browse files
committed
add support for taxation
1 parent c050b46 commit b56a2b1

File tree

11 files changed

+162
-16
lines changed

11 files changed

+162
-16
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ buildscript {
1212

1313
dependencies {
1414
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
15-
classpath 'com.android.tools.build:gradle:7.0.0'
15+
classpath 'com.android.tools.build:gradle:4.2.2'
1616
classpath 'gradle.plugin.com.github.jlouns:gradle-cross-platform-exec-plugin:0.5.0'
1717
classpath "gradle.plugin.gmazzo:sqlite-plugin:0.2"
1818
}

core/src/main/java/io/snabble/sdk/Checkout.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ public enum State {
3939
* Age needs to be verified.
4040
*/
4141
REQUEST_VERIFY_AGE,
42+
/**
43+
* Ask the user for the taxation method.
44+
*/
45+
REQUEST_TAXATION,
4246
/**
4347
* Request a payment authorization token.
4448
*
@@ -285,6 +289,13 @@ public void success(CheckoutApi.SignedCheckoutInfo checkoutInfo,
285289
int onlinePrice,
286290
CheckoutApi.PaymentMethodInfo[] availablePaymentMethods) {
287291
signedCheckoutInfo = checkoutInfo;
292+
293+
if (shoppingCart.getTaxation() == ShoppingCart.Taxation.UNDECIDED && signedCheckoutInfo.isRequiringTaxation()) {
294+
Logger.d("Taxation requested");
295+
notifyStateChanged(State.REQUEST_TAXATION);
296+
return;
297+
}
298+
288299
priceToPay = shoppingCart.getTotalPrice();
289300

290301
if (availablePaymentMethods.length == 1) {

core/src/main/java/io/snabble/sdk/CheckoutApi.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import com.google.gson.Gson;
66
import com.google.gson.JsonArray;
7+
import com.google.gson.JsonElement;
78
import com.google.gson.JsonObject;
89
import com.google.gson.annotations.SerializedName;
910
import com.google.gson.reflect.TypeToken;
@@ -56,6 +57,24 @@ public String getCheckoutProcessLink() {
5657
return null;
5758
}
5859

60+
public boolean isRequiringTaxation() {
61+
try {
62+
if (checkoutInfo != null && checkoutInfo.has("requiredInformation")) {
63+
JsonArray jsonArray = checkoutInfo.get("requiredInformation").getAsJsonArray();
64+
for (JsonElement element : jsonArray) {
65+
String id = element.getAsJsonObject().get("id").getAsString();
66+
if (id.equals("taxation")) {
67+
return true;
68+
}
69+
}
70+
}
71+
} catch (Exception e) {
72+
return false;
73+
}
74+
75+
return false;
76+
}
77+
5978
public PaymentMethodInfo[] getAvailablePaymentMethods(PaymentMethod[] clientAcceptedPaymentMethods) {
6079
if (checkoutInfo != null && checkoutInfo.has("paymentMethods")) {
6180
JsonArray jsonArray = checkoutInfo.getAsJsonArray("paymentMethods");

core/src/main/java/io/snabble/sdk/ShoppingCart.java

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,22 @@ public enum ItemType {
2929
COUPON
3030
}
3131

32+
public enum Taxation {
33+
UNDECIDED("undecided"),
34+
IN_HOUSE("inHouse"),
35+
TAKEAWAY("takeaway");
36+
37+
private String value;
38+
39+
Taxation(String value) {
40+
this.value = value;
41+
}
42+
43+
public String getValue() {
44+
return value;
45+
}
46+
}
47+
3248
public static final int MAX_QUANTITY = 99999;
3349

3450
private String id;
@@ -40,6 +56,7 @@ public enum ItemType {
4056
private int addCount = 0;
4157
private Integer onlineTotalPrice;
4258
private List<Product> invalidProducts;
59+
private Taxation taxation = Taxation.UNDECIDED;
4360

4461
private boolean hasRaisedMaxCheckoutLimit;
4562
private boolean hasRaisedMaxOnlinePaymentLimit;
@@ -272,6 +289,19 @@ public void restore() {
272289
}
273290
}
274291

292+
public Taxation getTaxation() {
293+
// migration for old shopping carts
294+
if (taxation == null) {
295+
return Taxation.UNDECIDED;
296+
}
297+
return taxation;
298+
}
299+
300+
public void setTaxation(Taxation taxation) {
301+
this.taxation = taxation;
302+
notifyTaxationChanged(this, taxation);
303+
}
304+
275305
public boolean isRestorable() {
276306
return oldItems != null && oldCartTimestamp > System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(5);
277307
}
@@ -950,6 +980,7 @@ public static class BackendCart implements Events.Payload {
950980
String appUserId;
951981
BackendCartCustomer customer;
952982
BackendCartItem[] items;
983+
List<BackendCartRequiredInformation> requiredInformation;
953984

954985
@Override
955986
public Events.EventType getEventType() {
@@ -961,6 +992,11 @@ public static class BackendCartCustomer {
961992
String loyaltyCard;
962993
}
963994

995+
public static class BackendCartRequiredInformation {
996+
String id;
997+
String value;
998+
}
999+
9641000
public static class BackendCartItem {
9651001
String id;
9661002
String sku;
@@ -993,6 +1029,17 @@ BackendCart toBackendCart() {
9931029
backendCart.customer.loyaltyCard = loyaltyCardId;
9941030
}
9951031

1032+
if (backendCart.requiredInformation == null) {
1033+
backendCart.requiredInformation = new ArrayList<>();
1034+
}
1035+
1036+
if (taxation != Taxation.UNDECIDED) {
1037+
BackendCartRequiredInformation requiredInformation = new BackendCartRequiredInformation();
1038+
requiredInformation.id = "taxation";
1039+
requiredInformation.value = taxation.getValue();
1040+
backendCart.requiredInformation.add(requiredInformation);
1041+
}
1042+
9961043
Shop shop = project.getCheckedInShop();
9971044
if (shop != null) {
9981045
String id = shop.getId();
@@ -1132,6 +1179,8 @@ public interface ShoppingCartListener {
11321179
void onCheckoutLimitReached(ShoppingCart list);
11331180

11341181
void onOnlinePaymentLimitReached(ShoppingCart list);
1182+
1183+
void onTaxationChanged(ShoppingCart list, Taxation taxation);
11351184
}
11361185

11371186
public static abstract class SimpleShoppingCartListener implements ShoppingCartListener {
@@ -1167,6 +1216,11 @@ public void onPricesUpdated(ShoppingCart list) {
11671216
onChanged(list);
11681217
}
11691218

1219+
@Override
1220+
public void onTaxationChanged(ShoppingCart list, Taxation taxation) {
1221+
onChanged(list);
1222+
}
1223+
11701224
@Override
11711225
public void onCheckoutLimitReached(ShoppingCart list) {
11721226

@@ -1230,6 +1284,14 @@ void notifyPriceUpdate(final ShoppingCart list) {
12301284
});
12311285
}
12321286

1287+
void notifyTaxationChanged(final ShoppingCart list, final Taxation taxation) {
1288+
Dispatch.mainThread(() -> {
1289+
for (ShoppingCartListener listener : listeners) {
1290+
listener.onTaxationChanged(list, taxation);
1291+
}
1292+
});
1293+
}
1294+
12331295
void notifyCheckoutLimitReached(final ShoppingCart list) {
12341296
Dispatch.mainThread(() -> {
12351297
for (ShoppingCartListener listener : listeners) {

ui/src/main/java/io/snabble/sdk/ui/cart/CheckoutBar.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ class CheckoutBar @JvmOverloads constructor(
8181
}
8282

8383
payButton.setOneShotClickListener {
84+
cart.taxation = ShoppingCart.Taxation.UNDECIDED
8485
payButtonClick()
8586
}
8687

@@ -346,6 +347,26 @@ class CheckoutBar @JvmOverloads constructor(
346347
} else if (state == Checkout.State.REQUEST_VERIFY_AGE) {
347348
SnabbleUI.executeAction(SnabbleUI.Action.SHOW_AGE_VERIFICATION)
348349
progressDialog.dismiss()
350+
} else if (state == Checkout.State.REQUEST_TAXATION) {
351+
progressDialog.dismiss()
352+
val dialog = AlertDialog.Builder(context)
353+
.setTitle(I18nUtils.getIdentifier(context.resources, R.string.Snabble_Taxation_consumeWhere))
354+
.setAdapter(
355+
ArrayAdapter(context, R.layout.item_taxation, listOf(
356+
context.getString(R.string.Snabble_Taxation_consume_inhouse),
357+
context.getString(R.string.Snabble_Taxation_consume_takeaway)
358+
))
359+
) { dialog, which ->
360+
if (which == 0) {
361+
cart.taxation = ShoppingCart.Taxation.IN_HOUSE
362+
} else {
363+
cart.taxation = ShoppingCart.Taxation.TAKEAWAY
364+
}
365+
dialog.dismiss()
366+
project.checkout.checkout()
367+
}
368+
.create()
369+
.show()
349370
} else if (state == Checkout.State.NO_PAYMENT_METHOD_AVAILABLE) {
350371
AlertDialog.Builder(context)
351372
.setCancelable(false)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:layout_width="match_parent"
4+
android:layout_height="match_parent"
5+
xmlns:tools="http://schemas.android.com/tools"
6+
android:paddingStart="24dp"
7+
android:paddingEnd="24dp"
8+
android:paddingTop="16dp"
9+
android:paddingBottom="16dp"
10+
android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"
11+
tools:text="zum Mitnehmen">
12+
13+
</TextView>

ui/src/main/res/values-de/strings.xml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
<string name="Snabble.paydirekt.authorizationFailed.title">Autorisierung fehlgeschlagen</string>
6363
<string name="Snabble.paydirekt.deleteAuthorization">Bezahlmethode löschen</string>
6464
<string name="Snabble.paydirekt.gotoWebsite">Zu paydirekt.de</string>
65-
<string name="Snabble.Paydirekt.payNow">Jetzt mit paydirekt bezahlen</string>
65+
<string name="Snabble.paydirekt.payNow">Jetzt mit paydirekt bezahlen</string>
6666
<string name="Snabble.paydirekt.savedAuthorization">Du hast die Snabble-App erfolgreich für paydirekt autorisiert. Um dies rückgängig zu machen, musst du dich bei deinem paydirekt-Konto auf der Webseite anmelden. Möchtest du paydirekt nicht mehr als Bezahlmethode angezeigt bekommen, kannst du sie hier einfach entfernen.</string>
6767
<!-- SECTION: SnabbleAndroid -->
6868
<string name="Snabble.Payment.aborted">Der Bezahlvorgang wurde abgebrochen</string>
@@ -133,7 +133,7 @@
133133
<string name="Snabble.QRCode.showTheseCodes">Bitte zeige diese %d Codes nacheinander an der Kasse</string>
134134
<string name="Snabble.QRCode.showThisCode">Bitte zeige diesen Code an der Kasse</string>
135135
<string name="Snabble.QRCode.title">An der Kasse zahlen</string>
136-
<string name="Snabble.QRCode.total">Gesamtsumme:\u0020</string>
136+
<string name="Snabble.QRCode.total">"Gesamtsumme: "</string>
137137
<string name="Snabble.Receipts.loading">(wird geladen)</string>
138138
<string name="Snabble.Receipts.noReceipts">Du hast noch nicht mit Snabble eingekauft</string>
139139
<string name="Snabble.Receipts.oClock">Uhr</string>
@@ -164,7 +164,7 @@
164164
<string name="Snabble.Scanner.networkError">Das Produkt konnte nicht angefragt werden. Bitte überprüfe deine Internetverbindung.</string>
165165
<string name="Snabble.Scanner.noMatchesFound">Artikel nicht gefunden</string>
166166
<string name="Snabble.Scanner.plusDeposit">+ %s Pfand</string>
167-
<string name="Snabble.Scanner.scannedAgeRestrictedProduct">Dieses Produkt unterliegt einer Altersbeschränkung. Dein Alter wird daher bei der Zahlung überprüft werden.</string>
167+
<string name="Snabble.Scanner.scannedAgeRestrictedProduct">Dein Alter wird einmalig bei der Zahlung überprüft werden.</string>
168168
<string name="Snabble.Scanner.scannedShelfCode">Bitte wiege das Produkt und scanne dann den Barcode auf dem Aufkleber</string>
169169
<string name="Snabble.Scanner.scanningTitle">Barcode scannen</string>
170170
<string name="Snabble.Scanner.serverError">Das Produkt konnte nicht angefragt werden.</string>
@@ -246,6 +246,10 @@
246246
<string name="Snabble.ShoppingList.Voice.title">Tipp</string>
247247
<!-- Der Titel der übersichtsseite der Einkaufslisten -->
248248
<string name="Snabble.ShoppingLists.title">Einkaufslisten</string>
249+
<string name="Snabble.Taxation.consume.inhouse">Hier Essen</string>
250+
<string name="Snabble.Taxation.consume.takeaway">Mitnehmen</string>
251+
<string name="Snabble.Taxation.consumeWhere">Zum hier Essen oder zum Mitnehmen?</string>
252+
<string name="Snabble.Taxation.pleaseChoose">Bitte wählen</string>
249253
<string name="Snabble.TWINT.payNow">Jetzt mit TWINT bezahlen</string>
250254
<string name="Snabble.undo">Rückgängig</string>
251255
<string name="Snabble.Yes">Ja</string>

ui/src/main/res/values-en/strings.xml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
<string name="Snabble.paydirekt.authorizationFailed.title">Authorization failed</string>
6363
<string name="Snabble.paydirekt.deleteAuthorization">Delete method</string>
6464
<string name="Snabble.paydirekt.gotoWebsite">Go to paydirekt.de</string>
65-
<string name="Snabble.Paydirekt.payNow">Pay now using paydirekt</string>
65+
<string name="Snabble.paydirekt.payNow">Pay now using paydirekt</string>
6666
<string name="Snabble.paydirekt.savedAuthorization">You\'ve successfully authorized Snabble for paydirekt. To remove this authorization, you need to log in to your paydirekt account. If you do not want to use this payment method anymore, you can remove it here.</string>
6767
<!-- SECTION: SnabbleAndroid -->
6868
<string name="Snabble.Payment.aborted">Payment process was cancelled</string>
@@ -133,7 +133,7 @@
133133
<string name="Snabble.QRCode.showTheseCodes">Please show these %d codes at the register, one after the other</string>
134134
<string name="Snabble.QRCode.showThisCode">Please show this code at the register</string>
135135
<string name="Snabble.QRCode.title">Pay at cash desk</string>
136-
<string name="Snabble.QRCode.total">Total:\u0020</string>
136+
<string name="Snabble.QRCode.total">"Total: "</string>
137137
<string name="Snabble.Receipts.loading">(loading)</string>
138138
<string name="Snabble.Receipts.noReceipts">No Receipts found</string>
139139
<string name="Snabble.Receipts.oClock">o\'clock</string>
@@ -164,7 +164,7 @@
164164
<string name="Snabble.Scanner.networkError">Could not retrieve product data. Please check your internet connection.</string>
165165
<string name="Snabble.Scanner.noMatchesFound">Product not found</string>
166166
<string name="Snabble.Scanner.plusDeposit">+ %s deposit</string>
167-
<string name="Snabble.Scanner.scannedAgeRestrictedProduct">This is an age-restricted product, your age will be verified during checkout.</string>
167+
<string name="Snabble.Scanner.scannedAgeRestrictedProduct">Your age will be checked once at the time of payment.</string>
168168
<string name="Snabble.Scanner.scannedShelfCode">Please weigh the product, then scan the barcode from the sticker</string>
169169
<string name="Snabble.Scanner.scanningTitle">Scan Barcode</string>
170170
<string name="Snabble.Scanner.serverError">Could not retrieve product data.</string>
@@ -246,6 +246,10 @@
246246
<string name="Snabble.ShoppingList.Voice.title">Hint</string>
247247
<!-- Der Titel der übersichtsseite der Einkaufslisten -->
248248
<string name="Snabble.ShoppingLists.title">Shopping lists</string>
249+
<string name="Snabble.Taxation.consume.inhouse">Eat here</string>
250+
<string name="Snabble.Taxation.consume.takeaway">Take with me</string>
251+
<string name="Snabble.Taxation.consumeWhere">Will you be eating here or is this to go?</string>
252+
<string name="Snabble.Taxation.pleaseChoose">Please choose</string>
249253
<string name="Snabble.TWINT.payNow">Pay now using TWINT</string>
250254
<string name="Snabble.undo">Undo</string>
251255
<string name="Snabble.Yes">Yes</string>

ui/src/main/res/values-hu/strings.xml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
<string name="Snabble.paydirekt.authorizationFailed.title">Nem sikerült az azonosítás</string>
6363
<string name="Snabble.paydirekt.deleteAuthorization">Fizetési mód törlése</string>
6464
<string name="Snabble.paydirekt.gotoWebsite">A paydirekt.de oldalra</string>
65-
<string name="Snabble.Paydirekt.payNow">Fizetés paydirekttel</string>
65+
<string name="Snabble.paydirekt.payNow">Fizetés paydirekttel</string>
6666
<string name="Snabble.paydirekt.savedAuthorization">A Snabble alkalmazást sikeresen bejelentetted a paydirektre. Visszavonásához a paydirekt fiókadataiddal be kell jelentkezned a honlapon. Ha nem szeretnéd, hogy a paydirekt a fizetési lehetőségeid között legyen, akkor itt egyszerűen eltávolíthatod.</string>
6767
<!-- SECTION: SnabbleAndroid -->
6868
<string name="Snabble.Payment.aborted">Megszakadt a fizetési folyamat</string>
@@ -133,7 +133,7 @@
133133
<string name="Snabble.QRCode.showTheseCodes">Kérlek, mutasd meg ezeket a %d kódokat egymás után a pénztárnál</string>
134134
<string name="Snabble.QRCode.showThisCode">Kérlek, mutasd meg ezt a kódot a pénztárnál</string>
135135
<string name="Snabble.QRCode.title">Fizetés a pénztárnál</string>
136-
<string name="Snabble.QRCode.total">Teljes összeg:\u0020</string>
136+
<string name="Snabble.QRCode.total">Teljes összeg:</string>
137137
<string name="Snabble.Receipts.loading">(Betöltés alatt)</string>
138138
<string name="Snabble.Receipts.noReceipts">Még nem vásároltál a Snabble segítségével</string>
139139
<string name="Snabble.Receipts.oClock">Óra</string>
@@ -164,7 +164,7 @@
164164
<string name="Snabble.Scanner.networkError">A terméket nem sikerült lekérdezni. Ellenőrizd az internetkapcsolatot.</string>
165165
<string name="Snabble.Scanner.noMatchesFound">Termék nem található</string>
166166
<string name="Snabble.Scanner.plusDeposit">+ %s betétdíj</string>
167-
<string name="Snabble.Scanner.scannedAgeRestrictedProduct">Erre a termékre életkori korlátozás vonatkozik. A fizetésnél éppen ezért ellenőrizzük a korod.</string>
167+
<string name="Snabble.Scanner.scannedAgeRestrictedProduct">A fizetésnél egyszeri alkalommal ellenőrizzük a korodat.</string>
168168
<string name="Snabble.Scanner.scannedShelfCode">Kérlek, mérd le a terméket, és utána olvasd be a matricán található vonalkódot</string>
169169
<string name="Snabble.Scanner.scanningTitle">Vonalkód szkennelése</string>
170170
<string name="Snabble.Scanner.serverError">A terméket nem sikerült lekérdezni.</string>
@@ -246,6 +246,10 @@
246246
<string name="Snabble.ShoppingList.Voice.title">Ötlet</string>
247247
<!-- Der Titel der übersichtsseite der Einkaufslisten -->
248248
<string name="Snabble.ShoppingLists.title">Bevásárlólisták</string>
249+
<string name="Snabble.Taxation.consume.inhouse"/>
250+
<string name="Snabble.Taxation.consume.takeaway"/>
251+
<string name="Snabble.Taxation.consumeWhere"/>
252+
<string name="Snabble.Taxation.pleaseChoose"/>
249253
<string name="Snabble.TWINT.payNow">Fizetés TWINT segítségével</string>
250254
<string name="Snabble.undo">Visszavonás</string>
251255
<string name="Snabble.Yes">Igen</string>

0 commit comments

Comments
 (0)