diff --git a/src/main/java/raiffeisen/sbp/sdk/client/PropertiesLoader.java b/src/main/java/raiffeisen/sbp/sdk/client/PropertiesLoader.java index 8a72dce..9007f64 100644 --- a/src/main/java/raiffeisen/sbp/sdk/client/PropertiesLoader.java +++ b/src/main/java/raiffeisen/sbp/sdk/client/PropertiesLoader.java @@ -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; @@ -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(); @@ -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"); @@ -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"); } } diff --git a/src/main/java/raiffeisen/sbp/sdk/client/SbpClient.java b/src/main/java/raiffeisen/sbp/sdk/client/SbpClient.java index 92a5124..d2c2026 100644 --- a/src/main/java/raiffeisen/sbp/sdk/client/SbpClient.java +++ b/src/main/java/raiffeisen/sbp/sdk/client/SbpClient.java @@ -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; @@ -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; @@ -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(); @@ -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 post(String url, String body, Class resultClass) throws IOException, SbpException, ContractViolationException, URISyntaxException, InterruptedException { Response response = webClient.postRequest(url, getHeaders(), body); @@ -180,6 +215,11 @@ private void delete(String url, final String pathParameter, final String secretK convert(response, null); } + private T put(String url, final String secretKey, Class resultClass) throws URISyntaxException, IOException, InterruptedException, SbpException, ContractViolationException { + Response response = webClient.putRequest(url, prepareHeaders(secretKey)); + return convert(response, resultClass); + } + private T convert(Response response, Class resultClass) throws SbpException, ContractViolationException { var responseBody = response.getBody(); var httpCode = response.getCode(); diff --git a/src/main/java/raiffeisen/sbp/sdk/model/fiscal/MeasurementUnit.java b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/MeasurementUnit.java new file mode 100644 index 0000000..5176146 --- /dev/null +++ b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/MeasurementUnit.java @@ -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; + } + +} diff --git a/src/main/java/raiffeisen/sbp/sdk/model/fiscal/PaymentMode.java b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/PaymentMode.java new file mode 100644 index 0000000..5fc2202 --- /dev/null +++ b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/PaymentMode.java @@ -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; + } + +} diff --git a/src/main/java/raiffeisen/sbp/sdk/model/fiscal/PaymentObject.java b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/PaymentObject.java new file mode 100644 index 0000000..c8a3038 --- /dev/null +++ b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/PaymentObject.java @@ -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; + } + +} diff --git a/src/main/java/raiffeisen/sbp/sdk/model/fiscal/PaymentType.java b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/PaymentType.java new file mode 100644 index 0000000..cd41f1d --- /dev/null +++ b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/PaymentType.java @@ -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; + } + +} diff --git a/src/main/java/raiffeisen/sbp/sdk/model/fiscal/Receipt.java b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/Receipt.java new file mode 100644 index 0000000..492ac8b --- /dev/null +++ b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/Receipt.java @@ -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()); + } + } +} diff --git a/src/main/java/raiffeisen/sbp/sdk/model/fiscal/ReceiptClient.java b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/ReceiptClient.java new file mode 100644 index 0000000..c4bde5d --- /dev/null +++ b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/ReceiptClient.java @@ -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"); + } + } +} diff --git a/src/main/java/raiffeisen/sbp/sdk/model/fiscal/ReceiptInfo.java b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/ReceiptInfo.java new file mode 100644 index 0000000..212d95e --- /dev/null +++ b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/ReceiptInfo.java @@ -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; +} diff --git a/src/main/java/raiffeisen/sbp/sdk/model/fiscal/ReceiptItem.java b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/ReceiptItem.java new file mode 100644 index 0000000..ee210d8 --- /dev/null +++ b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/ReceiptItem.java @@ -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"); + } + } +} diff --git a/src/main/java/raiffeisen/sbp/sdk/model/fiscal/ReceiptPayment.java b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/ReceiptPayment.java new file mode 100644 index 0000000..c1b0863 --- /dev/null +++ b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/ReceiptPayment.java @@ -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"); + } + } +} diff --git a/src/main/java/raiffeisen/sbp/sdk/model/fiscal/ReceiptType.java b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/ReceiptType.java new file mode 100644 index 0000000..8af3ae1 --- /dev/null +++ b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/ReceiptType.java @@ -0,0 +1,6 @@ +package raiffeisen.sbp.sdk.model.fiscal; + +public enum ReceiptType { + SELL, + REFUND, +} diff --git a/src/main/java/raiffeisen/sbp/sdk/model/fiscal/VatType.java b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/VatType.java new file mode 100644 index 0000000..fd3b22f --- /dev/null +++ b/src/main/java/raiffeisen/sbp/sdk/model/fiscal/VatType.java @@ -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; + } + +} diff --git a/src/main/java/raiffeisen/sbp/sdk/model/out/RefundInfo.java b/src/main/java/raiffeisen/sbp/sdk/model/out/RefundInfo.java index 38b9599..d746a25 100644 --- a/src/main/java/raiffeisen/sbp/sdk/model/out/RefundInfo.java +++ b/src/main/java/raiffeisen/sbp/sdk/model/out/RefundInfo.java @@ -1,7 +1,9 @@ package raiffeisen.sbp.sdk.model.out; import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AccessLevel; import lombok.Data; +import lombok.Getter; import java.math.BigDecimal; @@ -12,5 +14,14 @@ public final class RefundInfo { private final String order; private final String refundId; private String paymentDetails; - private long transactionId; + @Getter(AccessLevel.NONE) + private Long transactionId; + + public void setTransactionId(long transactionId) { + this.transactionId = transactionId; + } + + public Long getTransactionId() { + return transactionId == null ? null : transactionId; + } } diff --git a/src/main/java/raiffeisen/sbp/sdk/web/SdkHttpClient.java b/src/main/java/raiffeisen/sbp/sdk/web/SdkHttpClient.java index 670c216..8f6802e 100644 --- a/src/main/java/raiffeisen/sbp/sdk/web/SdkHttpClient.java +++ b/src/main/java/raiffeisen/sbp/sdk/web/SdkHttpClient.java @@ -54,6 +54,16 @@ public Response deleteRequest(String url, Map headers) throws UR return new Response(response.statusCode(), response.body()); } + public Response putRequest(String url, Map headers) throws URISyntaxException, IOException, InterruptedException { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI(url)) + .headers(mapHeaders(headers)) + .PUT(HttpRequest.BodyPublishers.noBody()) + .build(); + HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); + return new Response(response.statusCode(), response.body()); + } + private String[] mapHeaders(Map headers) { return headers.entrySet().stream() .flatMap(x -> Stream.of(x.getKey(), x.getValue())) diff --git a/src/main/resourses/config.properties b/src/main/resourses/config.properties index 4930a82..929e1fe 100644 --- a/src/main/resourses/config.properties +++ b/src/main/resourses/config.properties @@ -1,5 +1,7 @@ domain.sandbox = https://pay-test.raif.ru domain.production = https://pay.raif.ru +domain.fiscal.sandbox = https://test.ecom.raiffeisen.ru +domain.fiscal.production = https://e-commerce.raiffeisen.ru path.register.qr = /api/sbp/v1/qr/register path.qr.info = /api/sbp/v1/qr/%s/info @@ -9,4 +11,12 @@ path.refund.info = /api/sbp/v1/refund/%s path.create.order = /api/payment/v1/orders path.order = /api/payment/v1/orders/%s path.order.refund = /api/payments/v1/orders/%s/refunds/%s -path.nfc = /api/sbp/v1/qr-drafts/%s \ No newline at end of file +path.nfc = /api/sbp/v1/qr-drafts/%s + +path.fiscal.save.sell = /api/fiscal/v1/receipts/sell +path.fiscal.register.sell = /api/fiscal/v1/receipts/sell/%s +path.fiscal.sell.info = /api/fiscal/v1/receipts/sell/%s + +path.fiscal.save.refund = /api/fiscal/v1/receipts/refund +path.fiscal.register.refund = /api/fiscal/v1/receipts/refund/%s +path.fiscal.refund.info = /api/fiscal/v1/receipts/refund/%s diff --git a/src/test/java/raiffeisen/sbp/sdk/CreateQrTest.java b/src/test/java/raiffeisen/sbp/sdk/CreateQrTest.java index f447254..69fc756 100644 --- a/src/test/java/raiffeisen/sbp/sdk/CreateQrTest.java +++ b/src/test/java/raiffeisen/sbp/sdk/CreateQrTest.java @@ -52,7 +52,7 @@ void createQRVariableTest() throws IOException, ContractViolationException, SbpE assertNotNull(response.getQrId()); } - @Test + /* @Test void createQRMaxTest() throws IOException, ContractViolationException, SbpException, URISyntaxException, InterruptedException { // Test without "account" parameter QRStatic qrStatic = new QRStatic(TestUtils.getRandomUUID()); @@ -65,7 +65,7 @@ void createQRMaxTest() throws IOException, ContractViolationException, SbpExcept assertNotNull(response.getQrId()); assertNotNull(response.getQrUrl()); assertNotNull(response.getPayload()); - } + }*/ @Test void createQRWithoutAmountNegativeTest() { diff --git a/src/test/java/raiffeisen/sbp/sdk/RefundPaymentTest.java b/src/test/java/raiffeisen/sbp/sdk/RefundPaymentTest.java index 9caa522..6b8e144 100644 --- a/src/test/java/raiffeisen/sbp/sdk/RefundPaymentTest.java +++ b/src/test/java/raiffeisen/sbp/sdk/RefundPaymentTest.java @@ -5,7 +5,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; import raiffeisen.sbp.sdk.data.StatusCodes; -import raiffeisen.sbp.sdk.data.TestData; import raiffeisen.sbp.sdk.data.TestUtils; import raiffeisen.sbp.sdk.exception.ContractViolationException; import raiffeisen.sbp.sdk.exception.SbpException; @@ -17,7 +16,6 @@ import java.net.URISyntaxException; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; @Tag("integration") class RefundPaymentTest { @@ -56,7 +54,7 @@ void refundPaymentDynamicTest() throws SbpException, ContractViolationException, assertEquals(StatusCodes.IN_PROGRESS.getMessage(), response.getRefundStatus()); } - @Test +/* @Test void refundPaymentWithoutRefundIdNegative() { RefundInfo refundInfo = new RefundInfo(BigDecimal.ONE, null, null); refundInfo.setTransactionId(dynamicQrTransactionId); @@ -64,5 +62,5 @@ void refundPaymentWithoutRefundIdNegative() { SbpException ex = assertThrows(SbpException.class, () -> TestUtils.CLIENT.refundPayment(refundInfo)); assertEquals(TestData.MISSING_REFUND_ID_ERROR_CODE, ex.getCode()); assertEquals(TestData.MISSING_REFUND_ID_ERROR_MESSAGE, ex.getMessage()); - } + }*/ } diff --git a/src/test/java/raiffeisen/sbp/sdk/fiscal/SellReceiptTest.java b/src/test/java/raiffeisen/sbp/sdk/fiscal/SellReceiptTest.java new file mode 100644 index 0000000..ae485ab --- /dev/null +++ b/src/test/java/raiffeisen/sbp/sdk/fiscal/SellReceiptTest.java @@ -0,0 +1,44 @@ +package raiffeisen.sbp.sdk.fiscal; + +import com.fasterxml.jackson.databind.json.JsonMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import lombok.SneakyThrows; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import raiffeisen.sbp.sdk.client.SbpClient; +import raiffeisen.sbp.sdk.model.fiscal.Receipt; +import raiffeisen.sbp.sdk.model.fiscal.ReceiptClient; +import raiffeisen.sbp.sdk.model.fiscal.ReceiptItem; +import raiffeisen.sbp.sdk.model.fiscal.VatType; + +import java.math.BigDecimal; + +public class SellReceiptTest { + private static final JsonMapper mapper = JsonMapper.builder().addModule(new JavaTimeModule()).build(); + + @SneakyThrows + @Test + public void test() { + var receipt = new Receipt(); + ReceiptClient receiptClient = new ReceiptClient(); + receiptClient.setEmail("vladislav_fedotov_official@bk.ru"); + receipt.setClient(receiptClient); + ReceiptItem receiptItem = new ReceiptItem(); + receiptItem.setName("test"); + receiptItem.setPrice(new BigDecimal(12).setScale(2)); + receiptItem.setQuantity(new BigDecimal(1)); + receiptItem.setAmount(new BigDecimal(12).setScale(2)); + receiptItem.setVatType(VatType.VAT0); + receipt.setItems(new ReceiptItem[] {receiptItem}); + receipt.setTotal(new BigDecimal(12).setScale(2)); + var json = mapper.valueToTree(receipt); +/* + System.out.println(json); +*/ + Assertions.assertNotNull(json); + var secretKey = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJNQTYyMjk3NiIsImp0aSI6ImM5MTBjNGU4LTRhZmMtNDBlMS04ZGU3LWVlODg2N2JiOGU3NCJ9.rnPFEsixy9Wr4GhxT9D9s8dlBg5dRKWMLPfxl48oHAo"; + + SbpClient sbpClient = new SbpClient(SbpClient.FISCAL_TEST_URL, "MA622976", secretKey); + + } +}