Skip to content
Snippets Groups Projects
Commit 049eee43 authored by srosse's avatar srosse
Browse files

OO-5200: optimise selection of buyer's country

parent a7990524
No related branches found
No related tags found
No related merge requests found
Showing
with 237 additions and 1 deletion
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
package org.olat.resource.accesscontrol.provider.paypalcheckout; package org.olat.resource.accesscontrol.provider.paypalcheckout;
import java.util.List; import java.util.List;
import java.util.Locale;
import org.olat.core.id.Identity; import org.olat.core.id.Identity;
import org.olat.resource.accesscontrol.OfferAccess; import org.olat.resource.accesscontrol.OfferAccess;
...@@ -91,4 +92,7 @@ public interface PaypalCheckoutManager { ...@@ -91,4 +92,7 @@ public interface PaypalCheckoutManager {
public List<PaypalCheckoutTransaction> searchTransactions(String id); public List<PaypalCheckoutTransaction> searchTransactions(String id);
public String getPreferredLocale(Locale locale);
} }
...@@ -51,6 +51,7 @@ public class PaypalCheckoutModule extends AbstractSpringModule { ...@@ -51,6 +51,7 @@ public class PaypalCheckoutModule extends AbstractSpringModule {
private static final String PAYPAL_SMART_BUTTONS = "paypal.checkout.v2.smart.buttons"; private static final String PAYPAL_SMART_BUTTONS = "paypal.checkout.v2.smart.buttons";
private static final String PAYPAL_WEBHOOK_ID = "paypal.webhhok.id"; private static final String PAYPAL_WEBHOOK_ID = "paypal.webhhok.id";
private static final String PAYPAL_ACCEPT_PENDING_REVIEW = "paypal.checkout.v2.accept.pending.review"; private static final String PAYPAL_ACCEPT_PENDING_REVIEW = "paypal.checkout.v2.accept.pending.review";
private static final String PAYPAL_PREFERRED_COUNTRIES = "paypal.preferRed.countries";
private static final String[] currencies = new String[] { private static final String[] currencies = new String[] {
"AUD", "AUD",
...@@ -93,6 +94,8 @@ public class PaypalCheckoutModule extends AbstractSpringModule { ...@@ -93,6 +94,8 @@ public class PaypalCheckoutModule extends AbstractSpringModule {
private boolean acceptPendingReview; private boolean acceptPendingReview;
@Value("${paypal.webhhok.id:#{null}}") @Value("${paypal.webhhok.id:#{null}}")
private String webhookId; private String webhookId;
@Value("${paypal.preferred.countries:CH}")
private String preferredCountries;
@Autowired @Autowired
private PaypalRESTWebhookProvider webhookProvider; private PaypalRESTWebhookProvider webhookProvider;
...@@ -193,6 +196,29 @@ public class PaypalCheckoutModule extends AbstractSpringModule { ...@@ -193,6 +196,29 @@ public class PaypalCheckoutModule extends AbstractSpringModule {
setStringProperty(PAYPAL_ACCEPT_PENDING_REVIEW, Boolean.toString(accept), true); setStringProperty(PAYPAL_ACCEPT_PENDING_REVIEW, Boolean.toString(accept), true);
} }
/**
* @return An immutable list of countries to prefer
*/
public List<String> getPreferredCountriesList() {
List<String> countries;
if(StringHelper.containsNonWhitespace(preferredCountries)) {
String[] countriesArr = preferredCountries.split("[,]");
countries = List.of(countriesArr);
} else {
countries = List.of();
}
return countries;
}
public String getPreferredCountries() {
return preferredCountries;
}
public void setPreferredCountries(String preferredCountries) {
this.preferredCountries = preferredCountries;
setStringProperty(PAYPAL_PREFERRED_COUNTRIES, preferredCountries, true);
}
public String getExcludeFundings() { public String getExcludeFundings() {
return excludeFundings; return excludeFundings;
} }
......
...@@ -22,12 +22,15 @@ package org.olat.resource.accesscontrol.provider.paypalcheckout.manager; ...@@ -22,12 +22,15 @@ package org.olat.resource.accesscontrol.provider.paypalcheckout.manager;
import java.io.IOException; import java.io.IOException;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.olat.core.commons.persistence.DB; import org.olat.core.commons.persistence.DB;
import org.olat.core.helpers.Settings; import org.olat.core.helpers.Settings;
import org.olat.core.id.Identity; import org.olat.core.id.Identity;
import org.olat.core.logging.Tracing; import org.olat.core.logging.Tracing;
import org.olat.core.util.StringHelper;
import org.olat.core.util.i18n.I18nManager;
import org.olat.resource.OLATResource; import org.olat.resource.OLATResource;
import org.olat.resource.accesscontrol.ACService; import org.olat.resource.accesscontrol.ACService;
import org.olat.resource.accesscontrol.AccessTransaction; import org.olat.resource.accesscontrol.AccessTransaction;
...@@ -74,6 +77,8 @@ public class PaypalCheckoutManagerImpl implements PaypalCheckoutManager { ...@@ -74,6 +77,8 @@ public class PaypalCheckoutManagerImpl implements PaypalCheckoutManager {
@Autowired @Autowired
private ACOrderDAO orderManager; private ACOrderDAO orderManager;
@Autowired @Autowired
private I18nManager i18nManager;
@Autowired
private ACReservationDAO reservationDao; private ACReservationDAO reservationDao;
@Autowired @Autowired
private CheckoutV2Provider checkoutProvider; private CheckoutV2Provider checkoutProvider;
...@@ -84,6 +89,50 @@ public class PaypalCheckoutManagerImpl implements PaypalCheckoutManager { ...@@ -84,6 +89,50 @@ public class PaypalCheckoutManagerImpl implements PaypalCheckoutManager {
@Autowired @Autowired
private PaypalCheckoutTransactionDAO transactionDao; private PaypalCheckoutTransactionDAO transactionDao;
@Override
public String getPreferredLocale(Locale locale) {
String val;
List<String> preferredCountries = checkoutModule.getPreferredCountriesList();
if(preferredCountries.isEmpty()) {
Locale regionalizedLocale = i18nManager.getRegionalizedLocale(locale);
val = regionalizedLocale.toString();
} else {
String language = locale.getLanguage();
String country = locale.getCountry();
if(!StringHelper.containsNonWhitespace(country)) {
Locale[] allLocales = Locale.getAvailableLocales();
for(String preferredCountry:preferredCountries) {
if(exists(language, preferredCountry, allLocales)) {
country = preferredCountry;
break;
}
}
}
if(StringHelper.containsNonWhitespace(country)) {
val = language + "_" + country.toUpperCase();
} else {
Locale regionalizedLocale = i18nManager.getRegionalizedLocale(locale);
val = regionalizedLocale.toString();
}
}
if(!StringHelper.containsNonWhitespace(val)) {
val = "de_CH";
}
return val;
}
private boolean exists(String language, String country, Locale[] allLocales) {
for(Locale locale:allLocales) {
if(locale.getCountry().equals(country) && locale.getLanguage().equals(language)) {
return true;
}
}
return false;
}
@Override @Override
public CheckoutRequest request(Identity delivery, OfferAccess offerAccess, String mapperUri, String sessionId) { public CheckoutRequest request(Identity delivery, OfferAccess offerAccess, String mapperUri, String sessionId) {
StringBuilder url = new StringBuilder(); StringBuilder url = new StringBuilder();
......
...@@ -19,7 +19,10 @@ ...@@ -19,7 +19,10 @@
*/ */
package org.olat.resource.accesscontrol.provider.paypalcheckout.ui; package org.olat.resource.accesscontrol.provider.paypalcheckout.ui;
import java.text.Collator;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Locale;
import org.olat.core.gui.UserRequest; import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItem;
...@@ -34,6 +37,7 @@ import org.olat.core.gui.components.util.KeyValues; ...@@ -34,6 +37,7 @@ import org.olat.core.gui.components.util.KeyValues;
import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.WindowControl;
import org.olat.core.util.StringHelper; import org.olat.core.util.StringHelper;
import org.olat.core.util.i18n.I18nModule;
import org.olat.resource.accesscontrol.AccessControlModule; import org.olat.resource.accesscontrol.AccessControlModule;
import org.olat.resource.accesscontrol.provider.paypalcheckout.PaypalCheckoutModule; import org.olat.resource.accesscontrol.provider.paypalcheckout.PaypalCheckoutModule;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -56,9 +60,12 @@ public class PaypalCheckoutAccountConfigurationController extends FormBasicContr ...@@ -56,9 +60,12 @@ public class PaypalCheckoutAccountConfigurationController extends FormBasicContr
private SingleSelection smartButtonsEl; private SingleSelection smartButtonsEl;
private MultipleSelectionElement enableEl; private MultipleSelectionElement enableEl;
private MultipleSelectionElement pendingReviewEl; private MultipleSelectionElement pendingReviewEl;
private MultipleSelectionElement preferredCountriesEl;
private final List<String> paypalCurrencies; private final List<String> paypalCurrencies;
@Autowired
private I18nModule i18nModule;
@Autowired @Autowired
private AccessControlModule acModule; private AccessControlModule acModule;
@Autowired @Autowired
...@@ -111,6 +118,17 @@ public class PaypalCheckoutAccountConfigurationController extends FormBasicContr ...@@ -111,6 +118,17 @@ public class PaypalCheckoutAccountConfigurationController extends FormBasicContr
currencyEl.select("CHF", true); currencyEl.select("CHF", true);
} }
KeyValues countries = getCountries();
preferredCountriesEl = uifactory.addCheckboxesDropdown("countries", "paypal.preferred.countries", formLayout,
countries.keys(), countries.values());
preferredCountriesEl.setHelpTextKey("paypal.preferred.countries.hint", null);
List<String> preferredCountries = paypalModule.getPreferredCountriesList();
for(String country:preferredCountries) {
if(countries.containsKey(country)) {
preferredCountriesEl.select(country, true);
}
}
String clientId = paypalModule.getClientId(); String clientId = paypalModule.getClientId();
clientIdEl = uifactory.addTextElement("checkout.client.id", 128, clientId, formLayout); clientIdEl = uifactory.addTextElement("checkout.client.id", 128, clientId, formLayout);
String clientSecret = paypalModule.getClientSecret(); String clientSecret = paypalModule.getClientSecret();
...@@ -121,6 +139,27 @@ public class PaypalCheckoutAccountConfigurationController extends FormBasicContr ...@@ -121,6 +139,27 @@ public class PaypalCheckoutAccountConfigurationController extends FormBasicContr
uifactory.addFormSubmitButton("save", buttonGroupLayout); uifactory.addFormSubmitButton("save", buttonGroupLayout);
} }
private KeyValues getCountries() {
KeyValues keyValues = new KeyValues();
Collection<Locale> languages = i18nModule.getAllLocales().values();
Locale[] locales = Locale.getAvailableLocales();
for(Locale language:languages) {
for(Locale locale:locales) {
if(language.getLanguage().equals(locale.getLanguage())) {
String country = locale.getCountry();
String displayCountry = locale.getDisplayCountry(getLocale());
if(!keyValues.containsKey(country) && StringHelper.containsNonWhitespace(displayCountry)) {
keyValues.add(KeyValues.entry(country, displayCountry));
}
}
}
}
final Collator collator = Collator.getInstance(getLocale());
keyValues.sort((k1, k2) -> collator.compare(k1.getValue(), k2.getValue()));
return keyValues;
}
private void updateUI() { private void updateUI() {
boolean enabled = enableEl.isAtLeastSelected(1); boolean enabled = enableEl.isAtLeastSelected(1);
currencyEl.setVisible(enabled); currencyEl.setVisible(enabled);
...@@ -164,6 +203,15 @@ public class PaypalCheckoutAccountConfigurationController extends FormBasicContr ...@@ -164,6 +203,15 @@ public class PaypalCheckoutAccountConfigurationController extends FormBasicContr
} }
super.formInnerEvent(ureq, source, event); super.formInnerEvent(ureq, source, event);
} }
private String getPreferredCountries() {
StringBuilder sb = new StringBuilder();
for(String country:preferredCountriesEl.getSelectedKeys()) {
if(sb.length() > 0) sb.append(",");
sb.append(country);
}
return sb.toString();
}
@Override @Override
protected void formOK(UserRequest ureq) { protected void formOK(UserRequest ureq) {
...@@ -177,6 +225,7 @@ public class PaypalCheckoutAccountConfigurationController extends FormBasicContr ...@@ -177,6 +225,7 @@ public class PaypalCheckoutAccountConfigurationController extends FormBasicContr
} }
paypalModule.setSmartButtons(smartButtonsEl.isOneSelected() && smartButtonsEl.isSelected(0)); paypalModule.setSmartButtons(smartButtonsEl.isOneSelected() && smartButtonsEl.isSelected(0));
paypalModule.setAcceptPendingReview(pendingReviewEl.isAtLeastSelected(1)); paypalModule.setAcceptPendingReview(pendingReviewEl.isAtLeastSelected(1));
paypalModule.setPreferredCountries(getPreferredCountries());
doUpdateWebhook(); doUpdateWebhook();
} else { } else {
paypalModule.setClientId(null); paypalModule.setClientId(null);
......
...@@ -31,6 +31,7 @@ import org.olat.core.util.Formatter; ...@@ -31,6 +31,7 @@ import org.olat.core.util.Formatter;
import org.olat.core.util.StringHelper; import org.olat.core.util.StringHelper;
import org.olat.resource.accesscontrol.OfferAccess; import org.olat.resource.accesscontrol.OfferAccess;
import org.olat.resource.accesscontrol.Price; import org.olat.resource.accesscontrol.Price;
import org.olat.resource.accesscontrol.provider.paypalcheckout.PaypalCheckoutManager;
import org.olat.resource.accesscontrol.provider.paypalcheckout.PaypalCheckoutModule; import org.olat.resource.accesscontrol.provider.paypalcheckout.PaypalCheckoutModule;
import org.olat.resource.accesscontrol.ui.FormController; import org.olat.resource.accesscontrol.ui.FormController;
import org.olat.resource.accesscontrol.ui.PriceFormat; import org.olat.resource.accesscontrol.ui.PriceFormat;
...@@ -48,6 +49,8 @@ public class PaypalSmartButtonAccessController extends FormBasicController imple ...@@ -48,6 +49,8 @@ public class PaypalSmartButtonAccessController extends FormBasicController imple
@Autowired @Autowired
private PaypalCheckoutModule paypalModule; private PaypalCheckoutModule paypalModule;
@Autowired
private PaypalCheckoutManager paypalCheckoutManager;
public PaypalSmartButtonAccessController(UserRequest ureq, WindowControl wControl, OfferAccess link) { public PaypalSmartButtonAccessController(UserRequest ureq, WindowControl wControl, OfferAccess link) {
super(ureq, wControl, "paypal_smart_buttons"); super(ureq, wControl, "paypal_smart_buttons");
...@@ -73,6 +76,9 @@ public class PaypalSmartButtonAccessController extends FormBasicController imple ...@@ -73,6 +76,9 @@ public class PaypalSmartButtonAccessController extends FormBasicController imple
layoutCont.contextPut("excludeFundings", excludeFundings == null ? "" : excludeFundings); layoutCont.contextPut("excludeFundings", excludeFundings == null ? "" : excludeFundings);
layoutCont.contextPut("csrfToken", ureq.getUserSession().getCsrfToken()); layoutCont.contextPut("csrfToken", ureq.getUserSession().getCsrfToken());
String preferedLocale = paypalCheckoutManager.getPreferredLocale(getLocale());
layoutCont.contextPut("plocale", preferedLocale);
String description = link.getOffer().getDescription(); String description = link.getOffer().getDescription();
if(StringHelper.containsNonWhitespace(description)) { if(StringHelper.containsNonWhitespace(description)) {
if(!StringHelper.isHtml(description)) { if(!StringHelper.isHtml(description)) {
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
<script defer data-csp-nonce="${csrfToken}"> <script defer data-csp-nonce="${csrfToken}">
jQuery(function() { jQuery(function() {
jQuery.ajax({ jQuery.ajax({
url: 'https://www.paypal.com/sdk/js?client-id=$clientId&currency=${currency}&intent=authorize&commit=true&disable-funding=${excludeFundings}', url: 'https://www.paypal.com/sdk/js?client-id=$clientId&locale=$plocale&currency=${currency}&intent=authorize&commit=true&disable-funding=${excludeFundings}',
cache: true,//paypal don't like the anti-cache parameter cache: true,//paypal don't like the anti-cache parameter
dataType: "script", dataType: "script",
success: loadButtons, success: loadButtons,
......
...@@ -40,6 +40,8 @@ paypal.order.status.reason=Status Erkl\u00E4rung ...@@ -40,6 +40,8 @@ paypal.order.status.reason=Status Erkl\u00E4rung
paypal.pending.review=Ausstehende Transaktionen paypal.pending.review=Ausstehende Transaktionen
paypal.pending.review.accept=Defaultmessig akkzeptieren (Buchung zum Kurs wird durchgef\u00FChrt) paypal.pending.review.accept=Defaultmessig akkzeptieren (Buchung zum Kurs wird durchgef\u00FChrt)
paypal.pending.review.accept.explain=Stornieren von Transaktionen in PayPal werden nicht automatisch Mitgliedschaft im Kurs k\u00FCndigen. paypal.pending.review.accept.explain=Stornieren von Transaktionen in PayPal werden nicht automatisch Mitgliedschaft im Kurs k\u00FCndigen.
paypal.preferred.countries=Vorselektierte L\u00E4nder
paypal.preferred.countries.hint=Probiert abhngig von der Benutzer Sprache den Land vorzuseleketieren
paypal.process.transaction=Transaktion ist erfolgreich und wird verarbeitet. paypal.process.transaction=Transaktion ist erfolgreich und wird verarbeitet.
paypal.reservation.failed=Es gibt momentan keinen freien Platz. paypal.reservation.failed=Es gibt momentan keinen freien Platz.
paypal.segment.account=Konto paypal.segment.account=Konto
......
...@@ -40,6 +40,8 @@ paypal.order.status.reason=Status reason ...@@ -40,6 +40,8 @@ paypal.order.status.reason=Status reason
paypal.pending.review=Pending transactions paypal.pending.review=Pending transactions
paypal.pending.review.accept=Accept per default (booking to course will be completed) paypal.pending.review.accept=Accept per default (booking to course will be completed)
paypal.pending.review.accept.explain=Canceling transactions in PayPal will not automatically cancel the membership to the course. paypal.pending.review.accept.explain=Canceling transactions in PayPal will not automatically cancel the membership to the course.
paypal.preferred.countries=Preselected countries
paypal.preferred.countries.hint=Try to pre-select the countries defined here depending of the language of the user.
paypal.process.transaction=Your transaction is approved and is currently processed. paypal.process.transaction=Your transaction is approved and is currently processed.
paypal.reservation.failed=There isn't currently an available place. paypal.reservation.failed=There isn't currently an available place.
paypal.segment.account=Account paypal.segment.account=Account
......
/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.resource.accesscontrol.provider.paypalcheckout.manager;
import java.util.Locale;
import org.junit.Assert;
import org.junit.Test;
import org.olat.core.util.i18n.I18nManager;
import org.olat.resource.accesscontrol.provider.paypalcheckout.PaypalCheckoutManager;
import org.olat.resource.accesscontrol.provider.paypalcheckout.PaypalCheckoutModule;
import org.olat.test.OlatTestCase;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
* Initial date: 11 janv. 2021<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class PaypalCheckoutManagerTest extends OlatTestCase {
@Autowired
private I18nManager i18nManager;
@Autowired
private PaypalCheckoutModule paypalCheckoutModule;
@Autowired
private PaypalCheckoutManager paypalCheckoutManager;
@Test
public void preferredLocale() {
paypalCheckoutModule.setPreferredCountries("");
Locale deLocale = i18nManager.getLocaleOrDefault("de");
String preferredDeLocale = paypalCheckoutManager.getPreferredLocale(deLocale);
Assert.assertEquals("de_DE", preferredDeLocale);
Locale frLocale = i18nManager.getLocaleOrDefault("fr");
String preferredFrLocale = paypalCheckoutManager.getPreferredLocale(frLocale);
Assert.assertEquals("fr_FR", preferredFrLocale);
Locale jpLocale = i18nManager.getLocaleOrDefault("jp");
String preferredJpLocale = paypalCheckoutManager.getPreferredLocale(jpLocale);
Assert.assertEquals("ja_JP", preferredJpLocale);
Locale ptBrLocale = i18nManager.getLocaleOrDefault("pt_BR");
String preferredPtBrLocale = paypalCheckoutManager.getPreferredLocale(ptBrLocale);
Assert.assertEquals("pt_BR", preferredPtBrLocale);
Locale enLocale = i18nManager.getLocaleOrDefault("en");
String preferredEnLocale = paypalCheckoutManager.getPreferredLocale(enLocale);
Assert.assertTrue(preferredEnLocale.startsWith("en"));
}
@Test
public void preferredLocaleInSwitzerland() {
paypalCheckoutModule.setPreferredCountries("CH");
Locale deLocale = i18nManager.getLocaleOrDefault("de");
String preferredDeLocale = paypalCheckoutManager.getPreferredLocale(deLocale);
Assert.assertEquals("de_CH", preferredDeLocale);
Locale frLocale = i18nManager.getLocaleOrDefault("fr");
String preferredFrLocale = paypalCheckoutManager.getPreferredLocale(frLocale);
Assert.assertEquals("fr_CH", preferredFrLocale);
Locale jpLocale = i18nManager.getLocaleOrDefault("jp");
String preferredJpLocale = paypalCheckoutManager.getPreferredLocale(jpLocale);
Assert.assertEquals("ja_JP", preferredJpLocale);
Locale ptBrLocale = i18nManager.getLocaleOrDefault("pt_BR");
String preferredPtBrLocale = paypalCheckoutManager.getPreferredLocale(ptBrLocale);
Assert.assertEquals("pt_BR", preferredPtBrLocale);
Locale enLocale = i18nManager.getLocaleOrDefault("en");
String preferredEnLocale = paypalCheckoutManager.getPreferredLocale(enLocale);
Assert.assertEquals("en_CH", preferredEnLocale);
}
}
...@@ -486,6 +486,7 @@ import org.junit.runners.Suite; ...@@ -486,6 +486,7 @@ import org.junit.runners.Suite;
org.olat.resource.accesscontrol.ACReservationDAOTest.class, org.olat.resource.accesscontrol.ACReservationDAOTest.class,
org.olat.resource.accesscontrol.provider.auto.AutoAccessManagerTest.class, org.olat.resource.accesscontrol.provider.auto.AutoAccessManagerTest.class,
org.olat.resource.accesscontrol.provider.auto.manager.AdvanceOrderDAOTest.class, org.olat.resource.accesscontrol.provider.auto.manager.AdvanceOrderDAOTest.class,
org.olat.resource.accesscontrol.provider.paypalcheckout.manager.PaypalCheckoutManagerTest.class,
org.olat.resource.accesscontrol.provider.paypalcheckout.manager.PaypalCheckoutTransactionDAOTest.class, org.olat.resource.accesscontrol.provider.paypalcheckout.manager.PaypalCheckoutTransactionDAOTest.class,
/** /**
* Pure JUnit test without need of framework * Pure JUnit test without need of framework
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment