dev comment logic for check max users
Test Workflow / test (push) Successful in 4s

This commit is contained in:
vladp
2026-02-20 20:51:14 +07:00
parent 86e0e0619f
commit 5551d84bf7
30 changed files with 1167 additions and 3 deletions
@@ -0,0 +1,44 @@
package ru.soune.nocopy.dto.payout;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AddBankTransferRequest {
@NotBlank(message = "Bank name is required")
@Size(min = 2, max = 200, message = "Bank name must be between 2 and 200 characters")
private String bankName;
@NotBlank(message = "BIC is required")
@Pattern(regexp = "^[0-9]{9}$", message = "BIC must contain 9 digits")
private String bic;
@Pattern(regexp = "^[0-9]{20}$", message = "Correspondent account must contain 20 digits")
private String correspondentAccount;
@NotBlank(message = "Account number is required")
@Pattern(regexp = "^[0-9]{20}$", message = "Account number must contain 20 digits")
private String accountNumber;
@NotBlank(message = "Account holder name is required")
@Size(min = 3, max = 200, message = "Account holder name must be between 3 and 200 characters")
private String accountHolder;
@Pattern(regexp = "^[0-9]{10}$|^[0-9]{12}$", message = "INN must contain 10 or 12 digits")
private String inn;
@Pattern(regexp = "^[0-9]{9}$", message = "KPP must contain 9 digits")
private String kpp;
@Builder.Default
private boolean saveAsDefault = false;
}
@@ -0,0 +1,19 @@
package ru.soune.nocopy.dto.payout;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AddCardRequest {
@NotBlank(message = "Card number required")
@Pattern(regexp = "^[0-9]{16}$", message = "Card number 16 cipher")
private String cardNumber;
}
@@ -0,0 +1,20 @@
package ru.soune.nocopy.dto.payout;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PayoutMethodDTO {
private Long id;
private String type;
private String displayName;
private String maskedDetails;
private boolean isDefault;
private boolean isVerified;
}
@@ -0,0 +1,23 @@
package ru.soune.nocopy.dto.payout;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PayoutMethodResponse {
private Long id;
private String type;
private String displayName;
private String maskedDetails;
private boolean isDefault;
private boolean isVerified;
private LocalDateTime createdAt;
private String bankName;
private String cardBrand;
}
@@ -0,0 +1,14 @@
package ru.soune.nocopy.dto.payout;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PayoutMethodTypeDTO {
private String code;
private String name;
}
@@ -0,0 +1,23 @@
package ru.soune.nocopy.dto.payout;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PayoutRequestDTO {
@NotNull(message = "Sum of pay is required")
@DecimalMin(value = "1000.00", message = "Min sum for pay 1000")
private BigDecimal amount;
@NotNull(message = "Способ выплаты обязателен")
private Long payoutMethodId;
}
@@ -0,0 +1,54 @@
package ru.soune.nocopy.dto.payout;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import ru.soune.nocopy.entity.payout.PayoutRequest;
import ru.soune.nocopy.entity.payout.PayoutRequestStatus;
import ru.soune.nocopy.entity.payout.PayoutType;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PayoutResponse {
private Long id;
private BigDecimal amount;
private String formattedAmount;
private PayoutRequestStatus status;
private PayoutType payoutType;
private String payoutMethodDisplay;
private LocalDateTime createdAt;
private String formattedCreatedAt;
private LocalDateTime processedAt;
private LocalDateTime completedAt;
private String transactionId;
private String rejectionReason;
private boolean canCancel;
public static PayoutResponse fromEntity(PayoutRequest request) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");
return PayoutResponse.builder()
.id(request.getId())
.amount(request.getAmount())
.formattedAmount(String.format("%.2f ₽", request.getAmount()))
.status(request.getStatus())
.payoutType(request.getPayoutType())
.payoutMethodDisplay(request.getPayoutMethod() != null ?
request.getPayoutMethod().getDisplayName() : null)
.createdAt(request.getCreatedAt())
.formattedCreatedAt(request.getCreatedAt() != null ?
request.getCreatedAt().format(formatter) : null)
.processedAt(request.getProcessAt())
.completedAt(request.getCompletedAt())
.rejectionReason(request.getRejectionReason())
.canCancel(request.getStatus() == PayoutRequestStatus.PENDING)
.build();
}
}