Skip to content

Commit c378700

Browse files
committed
add support for manualDiscountFinalCode
1 parent 213365f commit c378700

File tree

5 files changed

+160
-19
lines changed

5 files changed

+160
-19
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
# Changelog
22
All notable changes to this project will be documented in this file.
33

4+
## [0.39.6]
5+
6+
### Added
7+
- Added support for "manualDiscountFinalCode"
8+
49
## [0.39.5]
510

611
### Fixed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ allprojects {
3131
}
3232

3333
project.ext {
34-
sdkVersion='0.39.5'
34+
sdkVersion='0.39.6'
3535
versionCode=1
3636

3737
compileSdkVersion=30

core/src/main/java/io/snabble/sdk/encodedcodes/EncodedCodesGenerator.java

Lines changed: 76 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,16 @@ public class ProductInfo {
1919
Product product;
2020
int quantity;
2121
ScannedCode scannedCode;
22+
boolean hasManualDiscount;
2223

23-
public ProductInfo(Product product, int quantity, ScannedCode scannedCode) {
24+
public ProductInfo(Product product,
25+
int quantity,
26+
ScannedCode scannedCode,
27+
boolean hasManualDiscount) {
2428
this.product = product;
2529
this.quantity = quantity;
2630
this.scannedCode = scannedCode;
31+
this.hasManualDiscount = hasManualDiscount;
2732
}
2833
}
2934

@@ -32,6 +37,7 @@ public ProductInfo(Product product, int quantity, ScannedCode scannedCode) {
3237
private ArrayList<String> encodedCodes;
3338
private int codeCount;
3439
private boolean hasAgeRestrictedCode;
40+
private boolean hasAppliedManualDiscount;
3541

3642
public EncodedCodesGenerator(EncodedCodesOptions encodedCodesOptions) {
3743
encodedCodes = new ArrayList<>();
@@ -45,9 +51,9 @@ public void add(String code) {
4551
}
4652

4753
if (options.repeatCodes) {
48-
addScannableCode(code, false);
54+
addScannableCode(code, false, false);
4955
} else {
50-
addScannableCode("1" + options.countSeparator + code, false);
56+
addScannableCode("1" + options.countSeparator + code, false, false);
5157
}
5258
}
5359

@@ -71,7 +77,6 @@ public void add(ShoppingCart shoppingCart) {
7177
}
7278
}
7379
}
74-
7580
} else {
7681
Product product = item.getProduct();
7782
if (product == null) {
@@ -80,7 +85,8 @@ public void add(ShoppingCart shoppingCart) {
8085

8186
productInfos.add(new ProductInfo(product,
8287
item.getQuantity(),
83-
item.getScannedCode()));
88+
item.getScannedCode(),
89+
item.isManualCouponApplied()));
8490
}
8591
}
8692

@@ -98,8 +104,20 @@ public void clear() {
98104
}
99105

100106
public ArrayList<String> generate() {
101-
if (options.finalCode != null && options.finalCode.length() != 0) {
102-
append(options.finalCode);
107+
if (options.finalCode != null && !options.finalCode.isEmpty()) {
108+
if (getCountSeparatorLength() > 0) {
109+
append("1" + options.countSeparator + options.finalCode);
110+
} else {
111+
append(options.finalCode);
112+
}
113+
}
114+
115+
if (hasAppliedManualDiscount) {
116+
if (getCountSeparatorLength() > 0) {
117+
append("1" + options.countSeparator + options.manualDiscountFinalCode);
118+
} else {
119+
append(options.manualDiscountFinalCode);
120+
}
103121
}
104122

105123
finishCode();
@@ -161,9 +179,13 @@ private void addProducts(final List<ProductInfo> productInfos, boolean ageRestri
161179
.buildCode();
162180

163181
if (options.repeatCodes) {
164-
addScannableCode(scannedCode.getCode(), ageRestricted);
182+
addScannableCode(scannedCode.getCode(),
183+
ageRestricted,
184+
productInfo.hasManualDiscount);
165185
} else {
166-
addScannableCode("1" + options.countSeparator + scannedCode.getCode(), ageRestricted);
186+
addScannableCode("1" + options.countSeparator + scannedCode.getCode(),
187+
ageRestricted,
188+
productInfo.hasManualDiscount);
167189
}
168190
break;
169191
}
@@ -180,9 +202,13 @@ private void addProducts(final List<ProductInfo> productInfos, boolean ageRestri
180202
}
181203

182204
if (options.repeatCodes) {
183-
addScannableCode(transmissionCode, ageRestricted);
205+
addScannableCode(transmissionCode,
206+
ageRestricted,
207+
productInfo.hasManualDiscount);
184208
} else {
185-
addScannableCode("1" + options.countSeparator + productInfo.scannedCode.getCode(), ageRestricted);
209+
addScannableCode("1" + options.countSeparator + productInfo.scannedCode.getCode(),
210+
ageRestricted,
211+
productInfo.hasManualDiscount);
186212
}
187213
} else {
188214
int q = productInfo.quantity;
@@ -227,10 +253,14 @@ private void addProducts(final List<ProductInfo> productInfos, boolean ageRestri
227253

228254
if (options.repeatCodes) {
229255
for (int j = 0; j < q; j++) {
230-
addScannableCode(transmissionCode, ageRestricted);
256+
addScannableCode(transmissionCode,
257+
ageRestricted,
258+
productInfo.hasManualDiscount);
231259
}
232260
} else {
233-
addScannableCode(q + options.countSeparator + transmissionCode, ageRestricted);
261+
addScannableCode(q + options.countSeparator + transmissionCode,
262+
ageRestricted,
263+
productInfo.hasManualDiscount);
234264
}
235265
}
236266
}
@@ -243,9 +273,18 @@ private void finishCode() {
243273
encodedCodes.add(code);
244274
stringBuilder = new StringBuilder();
245275
codeCount = 0;
276+
hasAppliedManualDiscount = false;
277+
}
278+
279+
private int getCountSeparatorLength() {
280+
if (options.repeatCodes) {
281+
return 0;
282+
} else {
283+
return options.countSeparator.length();
284+
}
246285
}
247286

248-
private void addScannableCode(String scannableCode, boolean isAgeRestricted) {
287+
private void addScannableCode(String scannableCode, boolean isAgeRestricted, boolean hasManualDiscount) {
249288
String nextCode = hasAgeRestrictedCode ? options.nextCodeWithCheck : options.nextCode;
250289

251290
if (isAgeRestricted
@@ -257,8 +296,29 @@ private void addScannableCode(String scannableCode, boolean isAgeRestricted) {
257296
}
258297

259298
int charsLeft = options.maxChars - stringBuilder.length();
260-
int suffixCodeLength = Math.max(nextCode.length(), options.finalCode.length());
261-
int codesNeeded = (suffixCodeLength > 0 ? 2 : 1);
299+
int manualDiscountLength = hasManualDiscount ? options.manualDiscountFinalCode.length() : 0;
300+
int suffixCodeLength = Math.max(nextCode.length(), options.finalCode.length() + manualDiscountLength);
301+
302+
if (options.finalCode.length() > 0 && getCountSeparatorLength() > 0) {
303+
suffixCodeLength += getCountSeparatorLength() + 1;
304+
}
305+
306+
if (options.manualDiscountFinalCode.length() > 0 && getCountSeparatorLength() > 0) {
307+
suffixCodeLength += getCountSeparatorLength() + 1;
308+
}
309+
310+
int suffixCodes = 0;
311+
312+
if (options.finalCode.length() > 0) {
313+
suffixCodes++;
314+
}
315+
316+
if (manualDiscountLength > 0){
317+
suffixCodes++;
318+
hasAppliedManualDiscount = true;
319+
}
320+
321+
int codesNeeded = 1 + suffixCodes;
262322
int requiredLength = scannableCode.length()
263323
+ suffixCodeLength
264324
+ options.separator.length() * codesNeeded

core/src/main/java/io/snabble/sdk/encodedcodes/EncodedCodesOptions.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,13 @@ int compare(EncodedCodesGenerator.ProductInfo productInfo1,
2828
public final boolean repeatCodes;
2929
public final String countSeparator;
3030
public final int maxSizeMm;
31+
public final String manualDiscountFinalCode;
3132
public final Project project;
3233

3334
private EncodedCodesOptions(String prefix, SparseArray<String> prefixMap, String separator, String suffix, int maxChars,
3435
int maxCodes, String finalCode, String nextCode,
3536
String nextCodeWithCheck, boolean repeatCodes, String countSeparator,
36-
int maxSizeMm,
37+
int maxSizeMm, String manualDiscountFinalCode,
3738
Project project) {
3839
this.prefix = prefix;
3940
this.prefixMap = prefixMap;
@@ -47,6 +48,7 @@ private EncodedCodesOptions(String prefix, SparseArray<String> prefixMap, String
4748
this.repeatCodes = repeatCodes;
4849
this.countSeparator = countSeparator;
4950
this.maxSizeMm = maxSizeMm;
51+
this.manualDiscountFinalCode = manualDiscountFinalCode;
5052
this.project = project;
5153
}
5254

@@ -64,6 +66,7 @@ public static class Builder {
6466
private boolean repeatCodes = true;
6567
private String countSeparator = ";";
6668
private int maxSizeMm;
69+
private String manualDiscountFinalCode = "";
6770

6871
public Builder(Project project) {
6972
this.project = project;
@@ -129,10 +132,15 @@ public Builder maxSizeMm(int maxSizeMm) {
129132
return this;
130133
}
131134

135+
public Builder manualDiscountFinalCode(String manualDiscountFinalCode) {
136+
this.manualDiscountFinalCode = manualDiscountFinalCode;
137+
return this;
138+
}
139+
132140
public EncodedCodesOptions build() {
133141
return new EncodedCodesOptions(prefix, prefixMap, separator, suffix, maxChars, maxCodes,
134142
finalCode, nextCode, nextCodeWithCheck, repeatCodes, countSeparator,
135-
maxSizeMm, project);
143+
maxSizeMm, manualDiscountFinalCode, project);
136144
}
137145
}
138146

@@ -142,6 +150,7 @@ public static EncodedCodesOptions fromJsonObject(Project project, JsonObject jso
142150
int maxCodes = JsonUtils.getIntOpt(jsonObject, "maxCodes", EncodedCodesOptions.DEFAULT_MAX_CODES);
143151
int maxChars = JsonUtils.getIntOpt(jsonObject, "maxChars", EncodedCodesOptions.DEFAULT_MAX_CHARS);
144152
String finalCode = JsonUtils.getStringOpt(jsonObject, "finalCode", "");
153+
String manualDiscountFinalCode = JsonUtils.getStringOpt(jsonObject, "manualDiscountFinalCode", "");
145154

146155
switch (format) {
147156
case "csv":
@@ -153,6 +162,7 @@ public static EncodedCodesOptions fromJsonObject(Project project, JsonObject jso
153162
.countSeparator(";")
154163
.maxCodes(maxCodes)
155164
.maxChars(maxChars)
165+
.manualDiscountFinalCode(manualDiscountFinalCode)
156166
.build();
157167
case "csv_globus":
158168
return new EncodedCodesOptions.Builder(project)
@@ -163,6 +173,7 @@ public static EncodedCodesOptions fromJsonObject(Project project, JsonObject jso
163173
.countSeparator(";")
164174
.maxCodes(maxCodes)
165175
.maxChars(maxChars)
176+
.manualDiscountFinalCode(manualDiscountFinalCode)
166177
.build();
167178
case "ikea":
168179
String prefix = "9100003\u001d100{qrCodeCount}\u001d240";
@@ -180,6 +191,7 @@ public static EncodedCodesOptions fromJsonObject(Project project, JsonObject jso
180191
.finalCode(finalCode)
181192
.maxCodes(maxCodes)
182193
.maxChars(maxChars)
194+
.manualDiscountFinalCode(manualDiscountFinalCode)
183195
.build();
184196
case "simple":
185197
default:
@@ -192,6 +204,7 @@ public static EncodedCodesOptions fromJsonObject(Project project, JsonObject jso
192204
.finalCode(finalCode)
193205
.nextCode(JsonUtils.getStringOpt(jsonObject, "nextCode", ""))
194206
.nextCodeWithCheck(JsonUtils.getStringOpt(jsonObject, "nextCodeWithCheck", ""))
207+
.manualDiscountFinalCode(manualDiscountFinalCode)
195208
.maxSizeMm(JsonUtils.getIntOpt(jsonObject, "maxSizeMM", -1));
196209

197210
return builder.build();

core/src/test/java/io/snabble/sdk/EncodedCodesGeneratorTest.java

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,69 @@ public void testCSVv2Format() {
402402
Assert.assertEquals("snabble;2;2\n7;4008400301020", codes.get(1));
403403
}
404404

405+
@Test
406+
public void testFinalCodeWithManualDiscounts() {
407+
EncodedCodesOptions options = new EncodedCodesOptions.Builder(project)
408+
.prefix("snabble;{qrCodeIndex};{qrCodeCount}\n")
409+
.separator("\n")
410+
.suffix("")
411+
.repeatCodes(false)
412+
.countSeparator(";")
413+
.maxCodes(2)
414+
.manualDiscountFinalCode("MANUAL_DISCOUNT")
415+
.build();
416+
417+
EncodedCodesGenerator generator = new EncodedCodesGenerator(options);
418+
419+
Product duplo = project.getProductDatabase().findBySku("49");
420+
addToCart(duplo, 7, ScannedCode.parseDefault(project, "4008400301020"));
421+
generator.add(project.getShoppingCart());
422+
423+
ArrayList<String> codes = generator.generate();
424+
Assert.assertEquals(1, codes.size());
425+
Assert.assertEquals("snabble;1;1\n7;4008400301020", codes.get(0));
426+
427+
ShoppingCart cart = project.getShoppingCart();
428+
cart.get(0).setManualCouponApplied(true);
429+
generator.add(project.getShoppingCart());
430+
431+
codes = generator.generate();
432+
Assert.assertEquals(1, codes.size());
433+
Assert.assertEquals("snabble;1;1\n7;4008400301020\n1;MANUAL_DISCOUNT", codes.get(0));
434+
}
435+
436+
@Test
437+
public void testFinalCodeWithManualDiscountsAndFinalCode() {
438+
EncodedCodesOptions options = new EncodedCodesOptions.Builder(project)
439+
.prefix("snabble;{qrCodeIndex};{qrCodeCount}\n")
440+
.separator("\n")
441+
.suffix("")
442+
.repeatCodes(false)
443+
.countSeparator(";")
444+
.maxCodes(100)
445+
.finalCode("FINAL_CODE")
446+
.manualDiscountFinalCode("MANUAL_DISCOUNT")
447+
.build();
448+
449+
EncodedCodesGenerator generator = new EncodedCodesGenerator(options);
450+
451+
Product duplo = project.getProductDatabase().findBySku("49");
452+
addToCart(duplo, 7, ScannedCode.parseDefault(project, "4008400301020"));
453+
generator.add(project.getShoppingCart());
454+
455+
ArrayList<String> codes = generator.generate();
456+
Assert.assertEquals(1, codes.size());
457+
Assert.assertEquals("snabble;1;1\n7;4008400301020\n1;FINAL_CODE", codes.get(0));
458+
459+
ShoppingCart cart = project.getShoppingCart();
460+
cart.get(0).setManualCouponApplied(true);
461+
generator.add(project.getShoppingCart());
462+
463+
codes = generator.generate();
464+
Assert.assertEquals(1, codes.size());
465+
Assert.assertEquals("snabble;1;1\n7;4008400301020\n1;FINAL_CODE\n1;MANUAL_DISCOUNT", codes.get(0));
466+
}
467+
405468
@Test
406469
public void testTransmissionTemplates() throws IOException, Snabble.SnabbleException {
407470
String[] sql = loadSql("transmission_template").split("\n");

0 commit comments

Comments
 (0)