Skip to content
Merged
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
50 changes: 50 additions & 0 deletions src/main/java/com/soupulsar/domain/model/Payment.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.soupulsar.domain.model;

import com.soupulsar.domain.model.enums.PaymentMethod;
import com.soupulsar.domain.model.enums.PaymentStatus;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.UUID;

@Getter
@Builder
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class Payment {

private UUID id;
private UUID sessionId;
private UUID specialistId;
private UUID clientId;
private BigDecimal amount;
private PaymentStatus paymentStatus;
private PaymentMethod paymentMethod;
private String asaasPaymentId;
private String asaasInvoiceUrl;
private String asaasTransactionId;
private LocalDateTime dueDate;
private LocalDateTime paidAt;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;

public void markAsPaid(){
this.paymentStatus = PaymentStatus.PAID;
this.paidAt = LocalDateTime.now();
this.updatedAt = LocalDateTime.now();
}

public void markAsFailed(){
this.paymentStatus = PaymentStatus.FAILED;
this.updatedAt = LocalDateTime.now();
}

public boolean canBeRefunded(LocalDateTime sessionDateTime){
return paymentStatus == PaymentStatus.PAID &&
paidAt != null &&
sessionDateTime.isBefore(LocalDateTime.now().minusHours(24));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.soupulsar.domain.model.enums;

public enum PaymentMethod {

CREDIT_CARD,
BOLETO,
PIX,
DEBIT_CARD
}
22 changes: 22 additions & 0 deletions src/main/java/com/soupulsar/domain/model/enums/PaymentStatus.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.soupulsar.domain.model.enums;

public enum PaymentStatus {

PENDING,
PAID,
OVERDUE,
FAILED,
REFUNDED,
CANCELLED;

public static PaymentStatus fromAsaas(String asaasStatus) {
return switch (asaasStatus){
case "PENDING", "AWAITING_RISK_ANALYSIS" -> PaymentStatus.PENDING;
case "RECEIVED", "CONFIRMED", "RECEIVED_IN_CASH" -> PaymentStatus.PAID;
case "OVERDUE", "DUNNING_REQUEST" -> PaymentStatus.OVERDUE;
case "REFUNDED", "REFUND_REQUESTED", "REFUND_IN_PROGRESS" -> PaymentStatus.REFUNDED;
case "CHARGEBACK_REQUESTED", "CHARGEBACK_DISPUTE" -> PaymentStatus.FAILED;
default -> PaymentStatus.FAILED;
};
}
}
11 changes: 10 additions & 1 deletion src/main/java/com/soupulsar/domain/model/user/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@
import com.soupulsar.domain.model.enums.UserRole;
import com.soupulsar.domain.model.enums.UserStatus;
import com.soupulsar.domain.model.vo.Address;
import lombok.*;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

import java.util.UUID;

Expand All @@ -22,6 +26,7 @@ public class User {
private Address address;
private final UserRole role;
private UserStatus status;
private final String asaasCustomerId;


public static User create(String name, String cpf, String telephone, String email, String passwordHash, UserRole role, Address address) {
Expand Down Expand Up @@ -70,4 +75,8 @@ public void deactivate() {
}
this.status = UserStatus.INACTIVE;
}

public boolean hasAsaasCustomerId() {
return this.asaasCustomerId != null && !this.asaasCustomerId.isBlank();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.soupulsar.domain.repository;

import com.soupulsar.domain.model.Payment;

import java.util.Optional;
import java.util.UUID;

public interface PaymentRepository {

Optional<Payment> findById(UUID id);
Payment save(Payment payment);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.soupulsar.infrastructure.persistence.entity.payment;

import com.soupulsar.domain.model.enums.PaymentMethod;
import com.soupulsar.domain.model.enums.PaymentStatus;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.UUID;

@Entity
@Table(name = "payments")
@Getter
@Setter
public class PaymentEntity {

@Id
private UUID id;

@Column(nullable = false)
private UUID sessionId;

@Column(nullable = false)

private UUID specialistId;

@Column(nullable = false)
private UUID clientId;

@Column(nullable = false, precision = 10, scale = 2)
private BigDecimal amount;

@Enumerated(EnumType.STRING)
@Column(nullable = false)
private PaymentStatus status;

@Enumerated(EnumType.STRING)
@Column(nullable = false)
private PaymentMethod paymentMethod;

@Column(unique = true)
private String asaasPaymentId;

private String asaasInvoiceUrl;
private String asaasTransactionId;

private LocalDateTime dueDate;
private LocalDateTime paidAt;

@CreationTimestamp
private LocalDateTime createdAt;

@UpdateTimestamp
private LocalDateTime updatedAt;

}
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ public class UserEntity {
@Column(nullable = false)
private String telephone;

@Column(unique = true)
private String asaasCustomerId;

@Column(nullable = false)
@Enumerated(EnumType.STRING)
private UserRole role;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.soupulsar.infrastructure.persistence.mapper;

import com.soupulsar.domain.model.Payment;
import com.soupulsar.infrastructure.persistence.entity.payment.PaymentEntity;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class PaymentMapper {

public static PaymentEntity toEntity(Payment payment) {
PaymentEntity entity = new PaymentEntity();
entity.setSessionId(payment.getSessionId());
entity.setSpecialistId(payment.getSpecialistId());
entity.setClientId(payment.getClientId());
entity.setAmount(payment.getAmount());
entity.setStatus(payment.getPaymentStatus());
entity.setPaymentMethod(payment.getPaymentMethod());
entity.setAsaasPaymentId(payment.getAsaasPaymentId());
entity.setAsaasInvoiceUrl(payment.getAsaasInvoiceUrl());
entity.setAsaasTransactionId(payment.getAsaasTransactionId());
entity.setDueDate(payment.getDueDate());
entity.setPaidAt(payment.getPaidAt());
return entity;
}

public static Payment toModel(PaymentEntity entity) {
return Payment.builder()
.id(entity.getId())
.sessionId(entity.getSessionId())
.specialistId(entity.getSpecialistId())
.clientId(entity.getClientId())
.amount(entity.getAmount())
.paymentStatus(entity.getStatus())
.paymentMethod(entity.getPaymentMethod())
.asaasPaymentId(entity.getAsaasPaymentId())
.asaasInvoiceUrl(entity.getAsaasInvoiceUrl())
.asaasTransactionId(entity.getAsaasTransactionId())
.dueDate(entity.getDueDate())
.paidAt(entity.getPaidAt())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ public static UserEntity toEntity(User user){
entity.setUserId(user.getUserId());
entity.setEmail(user.getEmail());
entity.setPassword(user.getPasswordHash());
entity.setAsaasCustomerId(user.getAsaasCustomerId());
entity.setStatus(user.getStatus());
entity.setRole(user.getRole());
entity.setAddress(AddressMapper.toEmbeddable(user.getAddress()));
Expand All @@ -30,6 +31,7 @@ public static User toModel(UserEntity entity){
.telephone(entity.getTelephone())
.email(entity.getEmail())
.passwordHash(entity.getPassword())
.asaasCustomerId(entity.getAsaasCustomerId())
.role(entity.getRole())
.status(entity.getStatus())
.address(AddressMapper.toValueObject(entity.getAddress()))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.soupulsar.infrastructure.persistence.repository;

import com.soupulsar.infrastructure.persistence.entity.payment.PaymentEntity;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.UUID;

public interface PaymentJpaRepository extends JpaRepository<PaymentEntity, UUID> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.soupulsar.infrastructure.persistence.repository.impl;

import com.soupulsar.domain.model.Payment;
import com.soupulsar.domain.repository.PaymentRepository;
import com.soupulsar.infrastructure.persistence.entity.payment.PaymentEntity;
import com.soupulsar.infrastructure.persistence.mapper.PaymentMapper;
import com.soupulsar.infrastructure.persistence.repository.PaymentJpaRepository;
import lombok.RequiredArgsConstructor;

import java.util.Optional;
import java.util.UUID;

@RequiredArgsConstructor
public class PaymentRepositoryImpl implements PaymentRepository {

private final PaymentJpaRepository paymentJpaRepository;

@Override
public Optional<Payment> findById(UUID id) {
return paymentJpaRepository.findById(id).map(PaymentMapper::toModel);
}

@Override
public Payment save(Payment payment) {
PaymentEntity entity = PaymentMapper.toEntity(payment);
PaymentEntity saved = paymentJpaRepository.save(entity);
return PaymentMapper.toModel(saved);
}
}