Skip to content

Commit f979483

Browse files
committed
Add coupon violations
1 parent cc7136c commit f979483

File tree

10 files changed

+81
-9
lines changed

10 files changed

+81
-9
lines changed

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

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static io.snabble.sdk.Unit.PIECE;
44
import static io.snabble.sdk.Unit.PRICE;
55

6+
import androidx.annotation.NonNull;
67
import androidx.annotation.Nullable;
78
import androidx.annotation.RestrictTo;
89

@@ -11,24 +12,25 @@
1112
import java.math.BigDecimal;
1213
import java.util.ArrayList;
1314
import java.util.Collections;
15+
import java.util.Iterator;
1416
import java.util.List;
1517
import java.util.Objects;
1618
import java.util.UUID;
1719
import java.util.concurrent.CopyOnWriteArrayList;
1820
import java.util.concurrent.TimeUnit;
1921

2022
import io.snabble.sdk.auth.AppUser;
21-
import io.snabble.sdk.checkout.DefaultCheckoutApi;
2223
import io.snabble.sdk.checkout.LineItem;
2324
import io.snabble.sdk.checkout.LineItemType;
2425
import io.snabble.sdk.checkout.PaymentMethodInfo;
2526
import io.snabble.sdk.checkout.PriceModifier;
27+
import io.snabble.sdk.checkout.Violation;
2628
import io.snabble.sdk.codes.ScannedCode;
2729
import io.snabble.sdk.codes.templates.CodeTemplate;
2830
import io.snabble.sdk.utils.Dispatch;
2931
import io.snabble.sdk.utils.GsonHolder;
3032

31-
public class ShoppingCart {
33+
public class ShoppingCart implements Iterable<ShoppingCart.Item> {
3234
public enum ItemType {
3335
PRODUCT,
3436
LINE_ITEM,
@@ -209,6 +211,13 @@ public Item get(int index) {
209211
return items.get(index);
210212
}
211213

214+
@NonNull
215+
@Override
216+
public Iterator<Item> iterator() {
217+
return items.iterator();
218+
}
219+
220+
212221
public Item getExistingMergeableProduct(Product product) {
213222
if (product == null) {
214223
return null;
@@ -590,6 +599,7 @@ public static class Item {
590599
private transient ShoppingCart cart;
591600
private boolean isManualCouponApplied;
592601
private Coupon coupon;
602+
private String couponId;
593603

594604
protected Item() {
595605
// for gson
@@ -600,6 +610,7 @@ private Item(ShoppingCart cart, Coupon coupon, ScannedCode scannedCode) {
600610
this.cart = cart;
601611
this.scannedCode = scannedCode;
602612
this.coupon = coupon;
613+
this.couponId = UUID.randomUUID().toString();
603614
}
604615

605616
private Item(ShoppingCart cart, Product product, ScannedCode scannedCode) {
@@ -1155,15 +1166,15 @@ public BackendCart toBackendCart() {
11551166

11561167
if (cartItem.coupon != null) {
11571168
BackendCartItem couponItem = new BackendCartItem();
1158-
couponItem.id = UUID.randomUUID().toString();
1169+
couponItem.id = cartItem.coupon.getId();
11591170
couponItem.refersTo = item.id;
11601171
couponItem.amount = 1;
11611172
couponItem.couponID = cartItem.coupon.getId();
11621173
items.add(couponItem);
11631174
}
11641175
} else if (cartItem.getType() == ItemType.COUPON) {
11651176
BackendCartItem item = new BackendCartItem();
1166-
item.id = UUID.randomUUID().toString();
1177+
item.id = cartItem.couponId;
11671178
item.amount = 1;
11681179

11691180
ScannedCode scannedCode = cartItem.getScannedCode();
@@ -1222,6 +1233,8 @@ public interface ShoppingCartListener {
12221233
void onOnlinePaymentLimitReached(ShoppingCart list);
12231234

12241235
void onTaxationChanged(ShoppingCart list, Taxation taxation);
1236+
1237+
void onViolationDetected(@NonNull List<Violation> violations);
12251238
}
12261239

12271240
public static abstract class SimpleShoppingCartListener implements ShoppingCartListener {
@@ -1263,14 +1276,13 @@ public void onTaxationChanged(ShoppingCart list, Taxation taxation) {
12631276
}
12641277

12651278
@Override
1266-
public void onCheckoutLimitReached(ShoppingCart list) {
1267-
1268-
}
1279+
public void onCheckoutLimitReached(ShoppingCart list) {}
12691280

12701281
@Override
1271-
public void onOnlinePaymentLimitReached(ShoppingCart list) {
1282+
public void onOnlinePaymentLimitReached(ShoppingCart list) {}
12721283

1273-
}
1284+
@Override
1285+
public void onViolationDetected(List<Violation> violations) {}
12741286
}
12751287

12761288
private void notifyItemAdded(final ShoppingCart list, final Item item) {
@@ -1348,6 +1360,32 @@ void notifyOnlinePaymentLimitReached(final ShoppingCart list) {
13481360
}
13491361
});
13501362
}
1363+
1364+
public void notifyViolations(@NonNull List<Violation> violations) {
1365+
Dispatch.mainThread(() -> {
1366+
for (ShoppingCartListener listener : listeners) {
1367+
listener.onViolationDetected(violations);
1368+
}
1369+
for (Violation violation : violations) {
1370+
for (int i = items.size() - 1; i >= 0; i--) {
1371+
if (items.get(i).coupon != null && items.get(i).couponId.equals(violation.getRefersTo())) {
1372+
items.remove(items.get(i));
1373+
}
1374+
}
1375+
}
1376+
});
1377+
}
1378+
1379+
@Nullable
1380+
public Coupon getCouponByCartId(String id) {
1381+
for (int i = items.size() - 1; i >= 0; i--) {
1382+
if (items.get(i).coupon != null && items.get(i).couponId.equals(id)) {
1383+
return items.get(i).coupon;
1384+
}
1385+
}
1386+
return null;
1387+
}
1388+
13511389
/**
13521390
* Notifies all {@link #listeners} that the shopping list was cleared of all entries.
13531391
*

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,10 @@ private void commitCartUpdate(int modCount, SignedCheckoutInfo signedCheckoutInf
142142

143143
CheckoutInfo checkoutInfo = GsonHolder.get().fromJson(signedCheckoutInfo.getCheckoutInfo(), CheckoutInfo.class);
144144

145+
if (checkoutInfo.getViolations().size() > 0) {
146+
cart.notifyViolations(checkoutInfo.getViolations());
147+
}
148+
145149
Set<String> referrerIds = new HashSet<>();
146150
Set<String> requiredIds = new HashSet<>();
147151

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,13 @@ data class SignedCheckoutInfo(
207207
data class CheckoutInfo(
208208
val price: Price? = null,
209209
val lineItems: List<LineItem> = emptyList(),
210+
val violations: List<Violation> = emptyList(),
211+
)
212+
213+
data class Violation(
214+
val type: String? = null,
215+
val refersTo: String? = null,
216+
val message: String? = null,
210217
)
211218

212219
data class LineItem(

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
<string name="Snabble.paydirekt.gotoWebsite">Zu paydirekt.de</string>
6565
<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>
67+
<string name="Snabble.paydirekt.title">paydirekt</string>
6768
<!-- SECTION: SnabbleAndroid -->
6869
<string name="Snabble.Payment.aborted">Der Bezahlvorgang wurde abgebrochen</string>
6970
<string name="Snabble.Payment.add">Bezahlverfahren hinzufügen</string>
@@ -312,5 +313,9 @@
312313
<string name="Snabble.Taxation.pleaseChoose">Bitte wählen</string>
313314
<string name="Snabble.TWINT.payNow">Jetzt mit TWINT bezahlen</string>
314315
<string name="Snabble.undo">Rückgängig</string>
316+
<string name="Snabble.Violations.couponAlreadyVoided">Der Coupon „%s“ wurde bereits benutzt und wird aus dem Warenkorb entfernt</string>
317+
<string name="Snabble.Violations.couponCurrentlyNotValid">Der Coupon „%s“ ist akuell ungültig und wird aus dem Warenkorb entfernt</string>
318+
<string name="Snabble.Violations.couponInvalid">Der Coupon „%s“ ist ungültig und wird aus dem Warenkorb entfernt</string>
319+
<string name="Snabble.Violations.title">Coupon ungültig</string>
315320
<string name="Snabble.Yes">Ja</string>
316321
</resources>

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
<string name="Snabble.paydirekt.gotoWebsite">Go to paydirekt.de</string>
6565
<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>
67+
<string name="Snabble.paydirekt.title">paydirekt</string>
6768
<!-- SECTION: SnabbleAndroid -->
6869
<string name="Snabble.Payment.aborted">Payment process was cancelled</string>
6970
<string name="Snabble.Payment.add">Add payment method</string>
@@ -312,5 +313,9 @@
312313
<string name="Snabble.Taxation.pleaseChoose">Please choose</string>
313314
<string name="Snabble.TWINT.payNow">Pay now using TWINT</string>
314315
<string name="Snabble.undo">Undo</string>
316+
<string name="Snabble.Violations.couponAlreadyVoided">The coupon „%s“ is already redeemed and will be removed from cart</string>
317+
<string name="Snabble.Violations.couponCurrentlyNotValid">The coupon „%s“ is currently not valid and will be removed from cart</string>
318+
<string name="Snabble.Violations.couponInvalid">The coupon „%s“ is invalid and will be removed from cart</string>
319+
<string name="Snabble.Violations.title">Coupon invalid</string>
315320
<string name="Snabble.Yes">Yes</string>
316321
</resources>

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
<string name="Snabble.paydirekt.gotoWebsite">Vers paydirekt.de</string>
6565
<string name="Snabble.paydirekt.payNow">Payer maintenant avec paydirekt</string>
6666
<string name="Snabble.paydirekt.savedAuthorization">Tu as autorisé avec succès l’application Snabble pour paydirekt. Pour l’annuler, tu devras te connecter à ton compte paydirekt sur le site Web. Si tu ne souhaites plus que paydirekt s’affiche comme mode de paiement, tu peux simplement le supprimer ici.</string>
67+
<string name="Snabble.paydirekt.title">paydirekt</string>
6768
<!-- SECTION: SnabbleAndroid -->
6869
<string name="Snabble.Payment.aborted">Le processus de paiement a été annulé</string>
6970
<string name="Snabble.Payment.add">Ajouter une procédure de paiement</string>

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
<string name="Snabble.paydirekt.gotoWebsite">A paydirekt.de oldalra</string>
6565
<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>
67+
<string name="Snabble.paydirekt.title">paydirekt</string>
6768
<!-- SECTION: SnabbleAndroid -->
6869
<string name="Snabble.Payment.aborted">Megszakadt a fizetési folyamat</string>
6970
<string name="Snabble.Payment.add">Fizetési mód hozzáadása</string>
@@ -106,6 +107,7 @@
106107
<string name="Snabble.Payment.usableAt">Itt használható: %s</string>
107108
<string name="Snabble.Payment.waiting">Várj a nyugtázásra</string>
108109
<string name="Snabble.PaymentCard.editingHint">A kártyaadataidat kódolva tároljuk, éppen ezért nem tudjuk feldolgozni.</string>
110+
<string name="Snabble.PaymentContinuation.message">A fizetés folytatódik</string>
109111
<string name="Snabble.PaymentError.title">Hiba történt</string>
110112
<string name="Snabble.PaymentError.tryAgain">Próbálkozz újra</string>
111113
<string name="Snabble.PaymentMethods.add">Fizetési mód hozzáadása</string>
@@ -176,6 +178,7 @@
176178
<string name="Snabble.Save">Mentés</string>
177179
<string name="Snabble.Scanner.Accessibility.actionHideHint">Megjegyzés tartós elrejtése</string>
178180
<string name="Snabble.Scanner.Accessibility.actionUnderstood">Megértettem</string>
181+
<string name="Snabble.Scanner.Accessibility.enterQuantity">Add meg a mennyiséget %s-ben</string>
179182
<string name="Snabble.Scanner.Accessibility.eventBackInScanner">Visszatértél a szkennerbe</string>
180183
<string name="Snabble.Scanner.Accessibility.eventBarcodeDetected">Vonalkód ismert</string>
181184
<string name="Snabble.Scanner.Accessibility.eventMaxQuantityReached">Nem tudsz több terméket tenni a kosárba</string>

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
<string name="Snabble.paydirekt.gotoWebsite">A paydirekt.de</string>
6565
<string name="Snabble.paydirekt.payNow">Paga ora con paydirekt</string>
6666
<string name="Snabble.paydirekt.savedAuthorization">L’autorizzazione dell’app Snabble per paydirekt è avvenuta con successo. Per revocare l’autorizzazione, è necessario accedere al tuo account paydirekt sul sito web. Se non desideri più che paydirekt sia visualizzato come metodo di pagamento, è sufficiente rimuoverlo.</string>
67+
<string name="Snabble.paydirekt.title">paydirekt</string>
6768
<!-- SECTION: SnabbleAndroid -->
6869
<string name="Snabble.Payment.aborted">Il pagamento è stato interrotto</string>
6970
<string name="Snabble.Payment.add">Aggiungi modalità di pagamento</string>

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
<string name="Snabble.paydirekt.gotoWebsite">Prejsť na paydirekt.de</string>
6565
<string name="Snabble.paydirekt.payNow">Teraz zaplatiť prostredníctvom paydirekt</string>
6666
<string name="Snabble.paydirekt.savedAuthorization">Autorizácia aplikácie Snabble pre paydirekt bola úspešná. Ak chceš autorizáciu zrušiť, musíš sa prihlásiť do svojho konta paydirekt na webovej stránke. Pokiaľ nechceš, aby paydirekt bol v budúcnosti zobrazovaný ako spôsob platby, tu ho môžeš jednoducho odstrániť.</string>
67+
<string name="Snabble.paydirekt.title">paydirekt</string>
6768
<!-- SECTION: SnabbleAndroid -->
6869
<string name="Snabble.Payment.aborted">Platobný proces bol prerušený</string>
6970
<string name="Snabble.Payment.add">Pridať spôsob platby</string>
@@ -106,6 +107,7 @@
106107
<string name="Snabble.Payment.usableAt">Použiteľné tu: %s</string>
107108
<string name="Snabble.Payment.waiting">Čakanie na potvrdenie</string>
108109
<string name="Snabble.PaymentCard.editingHint">Údaje o tvojej karte budeme uchovávať len v šifrovanej forme, a preto nemôžu byť spracované.</string>
110+
<string name="Snabble.PaymentContinuation.message">Pokračovanie platby</string>
109111
<string name="Snabble.PaymentError.title">Vyskytla sa chyba</string>
110112
<string name="Snabble.PaymentError.tryAgain">Skúsiť znovu</string>
111113
<string name="Snabble.PaymentMethods.add">Pridať spôsob platby</string>
@@ -176,6 +178,7 @@
176178
<string name="Snabble.Save">Uložiť</string>
177179
<string name="Snabble.Scanner.Accessibility.actionHideHint">Skryť upozornenie natrvalo</string>
178180
<string name="Snabble.Scanner.Accessibility.actionUnderstood">Rozumiem</string>
181+
<string name="Snabble.Scanner.Accessibility.enterQuantity">Zadaj množstvo v %s</string>
179182
<string name="Snabble.Scanner.Accessibility.eventBackInScanner">Si opäť v skeneri</string>
180183
<string name="Snabble.Scanner.Accessibility.eventBarcodeDetected">Čiarový kód bol rozpoznaný</string>
181184
<string name="Snabble.Scanner.Accessibility.eventMaxQuantityReached">Nemôžeš vložiť do košíka ďalšie položky</string>

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
<string name="Snabble.paydirekt.gotoWebsite">Go to paydirekt.de</string>
6565
<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>
67+
<string name="Snabble.paydirekt.title">paydirekt</string>
6768
<!-- SECTION: SnabbleAndroid -->
6869
<string name="Snabble.Payment.aborted">Payment process was cancelled</string>
6970
<string name="Snabble.Payment.add">Add payment method</string>
@@ -312,5 +313,9 @@
312313
<string name="Snabble.Taxation.pleaseChoose">Please choose</string>
313314
<string name="Snabble.TWINT.payNow">Pay now using TWINT</string>
314315
<string name="Snabble.undo">Undo</string>
316+
<string name="Snabble.Violations.couponAlreadyVoided">The coupon „%s“ is already redeemed and will be removed from cart</string>
317+
<string name="Snabble.Violations.couponCurrentlyNotValid">The coupon „%s“ is currently not valid and will be removed from cart</string>
318+
<string name="Snabble.Violations.couponInvalid">The coupon „%s“ is invalid and will be removed from cart</string>
319+
<string name="Snabble.Violations.title">Coupon invalid</string>
315320
<string name="Snabble.Yes">Yes</string>
316321
</resources>

0 commit comments

Comments
 (0)