Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,7 @@ ExhaustiveVerify.java
*-result.md
*test-result*
*.log

apache-maven-3.9.6

src/main/docker
20 changes: 18 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,13 @@
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.8.0</version>
<version>5.11.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>5.11.0</version>
<scope>test</scope>
</dependency>
</dependencies>
Expand All @@ -81,7 +87,17 @@
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>${surefire-plugin.version}</version>
<configuration>
<excludedGroups>integration</excludedGroups>
<argLine>
-XX:+EnableDynamicAgentLoading
--add-opens java.base/java.lang=ALL-UNNAMED
--add-opens java.base/java.util=ALL-UNNAMED
--add-opens java.base/java.io=ALL-UNNAMED
--add-opens java.base/java.net=ALL-UNNAMED
</argLine>
Comment on lines +90 to +98
Copy link

Copilot AI Apr 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The surefire is set directly, which will override any future tool/plugin that relies on ${argLine} (e.g., JaCoCo). Prefer prefixing with ${argLine} so additional JVM args can compose cleanly.

Copilot uses AI. Check for mistakes.
</configuration>
</plugin>
</plugins>
</build>
</project>
</project>
2 changes: 1 addition & 1 deletion src/main/java/com/tapsilat/TapsilatClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public OrganizationService organization() {
/**
* Backward compatibility method for createOrder.
*/
public com.tapsilat.model.order.OrderResponse createOrder(com.tapsilat.model.order.OrderRequest request)
public com.tapsilat.model.order.OrderResponse createOrder(com.tapsilat.model.order.OrderCreateRequest request)
throws TapsilatException {
return orders.create(request);
}
Expand Down
52 changes: 16 additions & 36 deletions src/main/java/com/tapsilat/builder/OrderRequestBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,14 @@
import java.util.List;

/**
* Builder class for creating OrderRequest objects easily.
* Builder class for creating OrderCreateRequest objects easily.
*/
public class OrderRequestBuilder {

private BigDecimal amount;
private String currency;
private String locale;
private Buyer buyer;
private String description;
private String callbackUrl;
private String conversationId;
private List<Metadata> metadata = new ArrayList<>();
private ShippingAddress shippingAddress;
Expand Down Expand Up @@ -132,29 +130,8 @@ public OrderRequestBuilder buyer(String name, String surname, String email) {
* @return This builder
*/
public OrderRequestBuilder buyer(String name, String surname, String email, String phone, String identityNumber) {
this.buyer = new Buyer(name, surname, email, phone, identityNumber);
return this;
}

/**
* Set the order description.
*
* @param description The description
* @return This builder
*/
public OrderRequestBuilder description(String description) {
this.description = description;
return this;
}

/**
* Set the callback URL.
*
* @param callbackUrl The callback URL
* @return This builder
*/
public OrderRequestBuilder callbackUrl(String callbackUrl) {
this.callbackUrl = callbackUrl;
this.buyer = new Buyer(name, surname, email, identityNumber);
this.buyer.setGsmNumber(phone);
return this;
}

Expand Down Expand Up @@ -316,7 +293,7 @@ public OrderRequestBuilder paymentOptions(List<String> paymentOptions) {
private CheckoutDesign checkoutDesign;
private List<Integer> enabledInstallments = new ArrayList<>();
private String externalReferenceId;
private OrderCard orderCards;
private List<OrderCard> orderCards = new ArrayList<>();
private BigDecimal paidAmount;
private String paymentFailureUrl;
private String paymentMode;
Expand Down Expand Up @@ -348,8 +325,13 @@ public OrderRequestBuilder externalReferenceId(String externalReferenceId) {
return this;
}

public OrderRequestBuilder orderCards(OrderCard orderCards) {
this.orderCards = orderCards;
public OrderRequestBuilder orderCards(List<OrderCard> orderCards) {
this.orderCards = orderCards == null ? new ArrayList<>() : new ArrayList<>(orderCards);
return this;
}

public OrderRequestBuilder addOrderCard(OrderCard orderCard) {
this.orderCards.add(orderCard);
return this;
Comment on lines +328 to 335
Copy link

Copilot AI Apr 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

orderCards(List) copies the input with new ArrayList<>(orderCards) without a null check, which will throw NPE if a caller passes null (unlike other builder setters that accept null in some cases). Consider treating null as an empty list, or document/enforce non-null explicitly (e.g., Objects.requireNonNull).

Copilot uses AI. Check for mistakes.
}

Expand Down Expand Up @@ -404,18 +386,16 @@ public OrderRequestBuilder submerchants(List<Submerchant> submerchants) {
}

/**
* Build the OrderRequest object.
* Build the OrderCreateRequest object.
*
* @return The constructed OrderRequest
* @return The constructed OrderCreateRequest
*/
public OrderRequest build() {
OrderRequest orderRequest = new OrderRequest();
public OrderCreateRequest build() {
OrderCreateRequest orderRequest = new OrderCreateRequest();
orderRequest.setAmount(amount);
orderRequest.setCurrency(currency);
orderRequest.setLocale(locale);
orderRequest.setBuyer(buyer);
orderRequest.setDescription(description);
orderRequest.setCallbackUrl(callbackUrl);
orderRequest.setConversationId(conversationId);
orderRequest.setMetadata(metadata.isEmpty() ? null : metadata);
orderRequest.setShippingAddress(shippingAddress);
Expand Down Expand Up @@ -451,4 +431,4 @@ public OrderRequest build() {
public static OrderRequestBuilder newBuilder() {
return new OrderRequestBuilder();
}
}
}
89 changes: 87 additions & 2 deletions src/main/java/com/tapsilat/model/common/BasketItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ public class BasketItem {
@JsonProperty("sub_merchant_price")
private String subMerchantPrice;

@JsonProperty("mcc")
private String mcc;

// Default constructor for Jackson
public BasketItem() {
}
Expand Down Expand Up @@ -145,6 +148,70 @@ public void setQuantityUnit(String quantityUnit) {
this.quantityUnit = quantityUnit;
}

public Double getCommissionAmount() {
return commissionAmount;
}

public void setCommissionAmount(Double commissionAmount) {
this.commissionAmount = commissionAmount;
}

public String getCoupon() {
return coupon;
}

public void setCoupon(String coupon) {
this.coupon = coupon;
}

public Double getPaidAmount() {
return paidAmount;
}

public void setPaidAmount(Double paidAmount) {
this.paidAmount = paidAmount;
}

public BasketItemPayer getPayer() {
return payer;
}

public void setPayer(BasketItemPayer payer) {
this.payer = payer;
}

public Double getQuantityFloat() {
return quantityFloat;
}

public void setQuantityFloat(Double quantityFloat) {
this.quantityFloat = quantityFloat;
}

public String getSubMerchantKey() {
return subMerchantKey;
}

public void setSubMerchantKey(String subMerchantKey) {
this.subMerchantKey = subMerchantKey;
}

public String getSubMerchantPrice() {
return subMerchantPrice;
}

public void setSubMerchantPrice(String subMerchantPrice) {
this.subMerchantPrice = subMerchantPrice;
}

public String getMcc() {
return mcc;
}

public void setMcc(String mcc) {
this.mcc = mcc;
}

@Override
public boolean equals(Object o) {
if (this == o)
Expand All @@ -161,13 +228,23 @@ public boolean equals(Object o) {
Objects.equals(itemType, that.itemType) &&
Objects.equals(couponDiscount, that.couponDiscount) &&
Objects.equals(data, that.data) &&
Objects.equals(quantityUnit, that.quantityUnit);
Objects.equals(quantityUnit, that.quantityUnit) &&
Objects.equals(commissionAmount, that.commissionAmount) &&
Objects.equals(coupon, that.coupon) &&
Objects.equals(paidAmount, that.paidAmount) &&
Objects.equals(payer, that.payer) &&
Objects.equals(quantityFloat, that.quantityFloat) &&
Objects.equals(subMerchantKey, that.subMerchantKey) &&
Objects.equals(subMerchantPrice, that.subMerchantPrice) &&
Objects.equals(mcc, that.mcc);
}

@Override
public int hashCode() {
return Objects.hash(id, name, category1, category2, price, quantity,
itemType, couponDiscount, data, quantityUnit);
itemType, couponDiscount, data, quantityUnit, commissionAmount,
coupon, paidAmount, payer, quantityFloat, subMerchantKey,
subMerchantPrice, mcc);
}

@Override
Expand All @@ -183,6 +260,14 @@ public String toString() {
", couponDiscount=" + couponDiscount +
", data='" + data + '\'' +
", quantityUnit='" + quantityUnit + '\'' +
", commissionAmount=" + commissionAmount +
", coupon='" + coupon + '\'' +
", paidAmount=" + paidAmount +
", payer=" + payer +
", quantityFloat=" + quantityFloat +
", subMerchantKey='" + subMerchantKey + '\'' +
", subMerchantPrice='" + subMerchantPrice + '\'' +
", mcc='" + mcc + '\'' +
'}';
}
}
Loading