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
19 changes: 19 additions & 0 deletions src/main/java/raiffeisen/sbp/sdk/client/PropertiesLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
public class PropertiesLoader {
public static final String TEST_URL;
public static final String PRODUCTION_URL;
public static final String FISCAL_TEST_URL;
public static final String FISCAL_PRODUCTION_URL;

public static final String REGISTER_PATH;
public static final String QR_INFO_PATH;
Expand All @@ -21,6 +23,13 @@ public class PropertiesLoader {
public static final String ORDER_PATH;
public static final String ORDER_REFUND_PATH;
public static final String NFC_PATH;
public static final String FISCAL_SAVE_SELL_PATH;
public static final String FISCAL_REGISTER_SELL_PATH;
public static final String FISCAL_SELL_INFO_PATH;
public static final String FISCAL_SAVE_REFUND_PATH;
public static final String FISCAL_REGISTER_REFUND_PATH;
public static final String FISCAL_REFUND_INFO_PATH;


static {
Properties properties = new Properties();
Expand All @@ -34,6 +43,8 @@ public class PropertiesLoader {

TEST_URL = properties.getProperty("domain.sandbox", "https://pay-test.raif.ru");
PRODUCTION_URL = properties.getProperty("domain.production", "https://pay.raif.ru");
FISCAL_TEST_URL = properties.getProperty("domain.fiscal.sandbox", "https://test.ecom.raiffeisen.ru");
FISCAL_PRODUCTION_URL = properties.getProperty("domain.fiscal.production", "https://e-commerce.raiffeisen.ru");

REGISTER_PATH = properties.getProperty("path.register.qr", "/api/sbp/v2/qrs");
QR_INFO_PATH = properties.getProperty("path.qr.info", "/api/sbp/v2/qrs/%s");
Expand All @@ -44,5 +55,13 @@ public class PropertiesLoader {
ORDER_PATH = properties.getProperty("path.order", "/api/payment/v1/orders/%s");
ORDER_REFUND_PATH = properties.getProperty("path.order.refund", "/api/payments/v1/orders/%s/refunds/%s");
NFC_PATH = properties.getProperty("path.nfc", "/api/sbp/v1/qr-drafts/%s");


FISCAL_SAVE_SELL_PATH = properties.getProperty("path.fiscal.save.sell", "/api/fiscal/v1/receipts/sell");
FISCAL_REGISTER_SELL_PATH = properties.getProperty("path.fiscal.register.sell", "/api/fiscal/v1/receipts/sell/%s");
FISCAL_SELL_INFO_PATH = properties.getProperty("path.fiscal.sell.info", "/api/fiscal/v1/receipts/sell/%s");
FISCAL_SAVE_REFUND_PATH = properties.getProperty("path.fiscal.save.refund", "/api/fiscal/v1/receipts/refund");
FISCAL_REGISTER_REFUND_PATH = properties.getProperty("path.fiscal.register.refund", "/api/fiscal/v1/receipts/refund/%s");
FISCAL_REFUND_INFO_PATH = properties.getProperty("path.fiscal.refund.info", "/api/fiscal/v1/receipts/refund/%s");
}
}
66 changes: 53 additions & 13 deletions src/main/java/raiffeisen/sbp/sdk/client/SbpClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,10 @@
import raiffeisen.sbp.sdk.exception.ContractViolationException;
import raiffeisen.sbp.sdk.exception.SbpException;
import raiffeisen.sbp.sdk.model.Response;
import raiffeisen.sbp.sdk.model.in.NFCInfo;
import raiffeisen.sbp.sdk.model.in.OrderInfo;
import raiffeisen.sbp.sdk.model.in.PaymentInfo;
import raiffeisen.sbp.sdk.model.in.QRUrl;
import raiffeisen.sbp.sdk.model.in.RefundStatus;
import raiffeisen.sbp.sdk.model.out.NFC;
import raiffeisen.sbp.sdk.model.out.Order;
import raiffeisen.sbp.sdk.model.out.OrderId;
import raiffeisen.sbp.sdk.model.out.OrderRefund;
import raiffeisen.sbp.sdk.model.out.QR;
import raiffeisen.sbp.sdk.model.out.QRId;
import raiffeisen.sbp.sdk.model.out.RefundId;
import raiffeisen.sbp.sdk.model.out.RefundInfo;
import raiffeisen.sbp.sdk.model.in.*;
import raiffeisen.sbp.sdk.model.fiscal.Receipt;
import raiffeisen.sbp.sdk.model.fiscal.ReceiptInfo;
import raiffeisen.sbp.sdk.model.out.*;
import raiffeisen.sbp.sdk.util.StringUtil;
import raiffeisen.sbp.sdk.web.SdkHttpClient;

Expand All @@ -32,6 +23,8 @@
public class SbpClient {
public static final String TEST_URL = PropertiesLoader.TEST_URL;
public static final String PRODUCTION_URL = PropertiesLoader.PRODUCTION_URL;
public static final String FISCAL_TEST_URL = PropertiesLoader.FISCAL_TEST_URL;
public static final String FISCAL_PRODUCTION_URL = PropertiesLoader.FISCAL_PRODUCTION_URL;

private static final String REGISTER_PATH = PropertiesLoader.REGISTER_PATH;
private static final String QR_INFO_PATH = PropertiesLoader.QR_INFO_PATH;
Expand All @@ -44,6 +37,13 @@ public class SbpClient {
private static final String ORDER_REFUND_PATH = PropertiesLoader.ORDER_REFUND_PATH;
private static final String NFC_PATH = PropertiesLoader.NFC_PATH;

private static final String FISCAL_SAVE_SELL_PATH = PropertiesLoader.FISCAL_SAVE_SELL_PATH;
private static final String FISCAL_REGISTER_SELL_PATH = PropertiesLoader.FISCAL_REGISTER_SELL_PATH;
private static final String FISCAL_SELL_INFO_PATH = PropertiesLoader.FISCAL_SELL_INFO_PATH;
private static final String FISCAL_SAVE_REFUND_PATH = PropertiesLoader.FISCAL_SAVE_REFUND_PATH;
private static final String FISCAL_REGISTER_REFUND_PATH = PropertiesLoader.FISCAL_REGISTER_REFUND_PATH;
private static final String FISCAL_REFUND_INFO_PATH = PropertiesLoader.FISCAL_REFUND_INFO_PATH;

private static final String ERROR_REQUIRED_PARAM_MISSING = "Field is required and should not be null or empty";

private static final JsonMapper mapper = JsonMapper.builder().addModule(new JavaTimeModule()).build();
Expand Down Expand Up @@ -155,6 +155,41 @@ public NFCInfo bindNfcLink(final NFC nfc) throws ContractViolationException, IOE
return post(url, body, secretKey, NFCInfo.class);
}

public ReceiptInfo saveSellReceipt(final Receipt receipt) throws ContractViolationException, IOException, SbpException, URISyntaxException, InterruptedException {
receipt.verify();
var body = mapper.valueToTree(receipt);

String url = domain + FISCAL_SAVE_SELL_PATH;
return post(url, body.toString(), secretKey, ReceiptInfo.class);
}

public ReceiptInfo registerSellReceipt(final String receiptNumber) throws SbpException, URISyntaxException, IOException, ContractViolationException, InterruptedException {
String url = String.format(domain + FISCAL_REGISTER_SELL_PATH, receiptNumber);
return put(url, secretKey, ReceiptInfo.class);
}

public ReceiptInfo getSellReceiptInfo(final String receiptNumber) throws SbpException, IOException, URISyntaxException, ContractViolationException, InterruptedException {
String url = String.format(domain + FISCAL_SELL_INFO_PATH, receiptNumber);
return get(url, secretKey, ReceiptInfo.class);
}

public ReceiptInfo saveRefundReceipt(final Receipt receipt) throws ContractViolationException, IOException, SbpException, URISyntaxException, InterruptedException {
receipt.verify();
var body = mapper.valueToTree(receipt);
String url = domain + FISCAL_SAVE_REFUND_PATH;
return post(url, body.toString(), secretKey, ReceiptInfo.class);
}

public ReceiptInfo registerRefundReceipt(final String receiptNumber) throws SbpException, URISyntaxException, IOException, ContractViolationException, InterruptedException {
String url = String.format(domain + FISCAL_REGISTER_REFUND_PATH, receiptNumber);
return put(url, secretKey, ReceiptInfo.class);
}

public ReceiptInfo getRefundReceiptInfo(final String receiptNumber) throws SbpException, IOException, URISyntaxException, ContractViolationException, InterruptedException {
String url = String.format(domain + FISCAL_REFUND_INFO_PATH, receiptNumber);
return get(url, secretKey, ReceiptInfo.class);
}

private <T> T post(String url, String body, Class<T> resultClass)
throws IOException, SbpException, ContractViolationException, URISyntaxException, InterruptedException {
Response response = webClient.postRequest(url, getHeaders(), body);
Expand All @@ -180,6 +215,11 @@ private void delete(String url, final String pathParameter, final String secretK
convert(response, null);
}

private <T> T put(String url, final String secretKey, Class<T> resultClass) throws URISyntaxException, IOException, InterruptedException, SbpException, ContractViolationException {
Response response = webClient.putRequest(url, prepareHeaders(secretKey));
return convert(response, resultClass);
}

private <T> T convert(Response response, Class<T> resultClass) throws SbpException, ContractViolationException {
var responseBody = response.getBody();
var httpCode = response.getCode();
Expand Down
17 changes: 17 additions & 0 deletions src/main/java/raiffeisen/sbp/sdk/model/fiscal/MeasurementUnit.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package raiffeisen.sbp.sdk.model.fiscal;

import lombok.Getter;

@Getter
public enum MeasurementUnit {
PIECE("штука"),
KILOGRAM("кг"),
DAY("день");

private final String type;

MeasurementUnit(String type) {
this.type = type;
}

}
18 changes: 18 additions & 0 deletions src/main/java/raiffeisen/sbp/sdk/model/fiscal/PaymentMode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package raiffeisen.sbp.sdk.model.fiscal;

import lombok.Getter;

@Getter
public enum PaymentMode {
FULL_PREPAYMENT("FULL_PREPAYMENT"),
FULL_PAYMENT("FULL_PAYMENT"),
ADVANCE("ADVANCE"),
PREPAYMENT("PREPAYMENT");

private final String type;

PaymentMode(String type) {
this.type = type;
}

}
24 changes: 24 additions & 0 deletions src/main/java/raiffeisen/sbp/sdk/model/fiscal/PaymentObject.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package raiffeisen.sbp.sdk.model.fiscal;

import lombok.Getter;

@Getter
public enum PaymentObject {
COMMODITY("COMMODITY"),
COMMODITY_MARKING_NO_CODE("COMMODITY_MARKING_NO_CODE"),
COMMODITY_MARKING_WITH_CODE("COMMODITY_MARKING_WITH_CODE"),
EXCISE("EXCISE"),
EXCISE_MARKING_NO_CODE("EXCISE_MARKING_NO_CODE"),
EXCISE_MARKING_WITH_CODE("EXCISE_MARKING_WITH_CODE"),
JOB("JOB"),
SERVICE("SERVICE"),
PAYMENT("PAYMENT"),
ANOTHER("ANOTHER");

private String type;

PaymentObject(String type) {
this.type = type;
}

}
15 changes: 15 additions & 0 deletions src/main/java/raiffeisen/sbp/sdk/model/fiscal/PaymentType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package raiffeisen.sbp.sdk.model.fiscal;

import lombok.Getter;

@Getter
public enum PaymentType {
E_PAYMENT("E_PAYMENT"),
PREPAID("PREPAID");
private final String type;

PaymentType(String type) {
this.type = type;
}

}
34 changes: 34 additions & 0 deletions src/main/java/raiffeisen/sbp/sdk/model/fiscal/Receipt.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package raiffeisen.sbp.sdk.model.fiscal;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import raiffeisen.sbp.sdk.exception.ContractViolationException;

import java.math.BigDecimal;

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Receipt {
protected String receiptNumber;
protected ReceiptClient client;
protected ReceiptItem[] items;
protected ReceiptPayment[] payments;
protected BigDecimal total;

public void verify() throws ContractViolationException {
try {
if (receiptNumber == null) {
throw new NullPointerException("receipt number is null");
}
client.verify();
for (ReceiptItem receiptItem : items) {
receiptItem.verify();
}
if (total == null) {
throw new NullPointerException("total is null");
}
} catch (RuntimeException e) {
throw new ContractViolationException(400, e.getMessage());
}
}
}
14 changes: 14 additions & 0 deletions src/main/java/raiffeisen/sbp/sdk/model/fiscal/ReceiptClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package raiffeisen.sbp.sdk.model.fiscal;

import lombok.Data;

@Data
public class ReceiptClient {
private String email;

public void verify() {
if (email == null || email.isBlank()) {
throw new RuntimeException("email error");
}
}
}
17 changes: 17 additions & 0 deletions src/main/java/raiffeisen/sbp/sdk/model/fiscal/ReceiptInfo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package raiffeisen.sbp.sdk.model.fiscal;

import lombok.Data;

import java.math.BigDecimal;

@Data
public class ReceiptInfo {
private String receiptNumber;
private ReceiptType receiptType;
private String status;
private ReceiptClient client;
private ReceiptItem[] items;
private ReceiptPayment[] payments;
private BigDecimal total;
private String ofdUrl;
}
37 changes: 37 additions & 0 deletions src/main/java/raiffeisen/sbp/sdk/model/fiscal/ReceiptItem.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package raiffeisen.sbp.sdk.model.fiscal;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;

import java.math.BigDecimal;
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ReceiptItem {
private String name;
private BigDecimal price;
private BigDecimal quantity;
private BigDecimal amount;
private PaymentObject paymentObject;
private PaymentMode paymentMode;
private MeasurementUnit measurementUnit;
private String nomenclatureCode;
private VatType vatType;

public void verify() {
if (name == null || name.isBlank()) {
throw new RuntimeException("receipt item error_1");
}
if (price == null) {
throw new RuntimeException("receipt item error_2");
}
if (quantity == null) {
throw new RuntimeException("receipt item error_3");
}
if (amount == null) {
throw new RuntimeException("receipt item error_4");
}
if (vatType == null) {
throw new RuntimeException("receipt item error_5");
}
}
}
23 changes: 23 additions & 0 deletions src/main/java/raiffeisen/sbp/sdk/model/fiscal/ReceiptPayment.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package raiffeisen.sbp.sdk.model.fiscal;

import lombok.AllArgsConstructor;
import lombok.Data;
import raiffeisen.sbp.sdk.exception.ContractViolationException;

import java.math.BigDecimal;

@Data
@AllArgsConstructor
public class ReceiptPayment {
private PaymentType paymentType;
private BigDecimal amount;

public void veify() throws ContractViolationException {
if (paymentType == null) {
throw new RuntimeException("receipt payment error_1");
}
if (amount == null) {
throw new RuntimeException("receipt payment error_2");
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package raiffeisen.sbp.sdk.model.fiscal;

public enum ReceiptType {
SELL,
REFUND,
}
19 changes: 19 additions & 0 deletions src/main/java/raiffeisen/sbp/sdk/model/fiscal/VatType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package raiffeisen.sbp.sdk.model.fiscal;

import lombok.Getter;

@Getter
public enum VatType {
NONE("NONE"),
VAT0("VAT0"),
VAT10("VAT10"),
VAT110("VAT110"),
VAT20("VAT20"),
VAT120("VAT120");
private final String type;

VatType(String type) {
this.type = type;
}

}
Loading