diff --git a/pom.xml b/pom.xml index ed1124d..9f113b0 100644 --- a/pom.xml +++ b/pom.xml @@ -46,12 +46,6 @@ ${moneta.version} pom - - org.projectlombok - lombok - ${lombok.version} - provided - com.h2database h2 diff --git a/src/main/java/com/tecacet/money/controller/InvoiceController.java b/src/main/java/com/tecacet/money/controller/InvoiceController.java index 9486716..393ec2f 100644 --- a/src/main/java/com/tecacet/money/controller/InvoiceController.java +++ b/src/main/java/com/tecacet/money/controller/InvoiceController.java @@ -3,7 +3,6 @@ import com.tecacet.money.domain.Invoice; import com.tecacet.money.service.InvoiceService; import com.tecacet.money.util.MoneyUtil; -import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; @@ -14,11 +13,14 @@ import java.util.Optional; @Controller -@RequiredArgsConstructor public class InvoiceController { private final InvoiceService invoiceService; + public InvoiceController(InvoiceService invoiceService) { + this.invoiceService = invoiceService; + } + @PostMapping(value = "invoice/{clientId}", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity createInvoice(@PathVariable("clientId") String clientId) { Optional optional = @@ -29,12 +31,13 @@ public ResponseEntity createInvoice(@PathVariable("clientId") String } private InvoiceDto toDto(Invoice invoice) { - return InvoiceDto.builder() - .amount(MoneyUtil.extractAmount(invoice.getTotal())) - .currency(MoneyUtil.extractCurrencyCode(invoice.getTotal())) - .clientId(invoice.getClientId()) - .dueDate(invoice.getDueDate()) - .invoiceDate(invoice.getInvoiceDate()) - .build(); + InvoiceDto invoiceDto = new InvoiceDto(); + invoiceDto.setAmount(MoneyUtil.extractAmount(invoice.getTotal())); + invoiceDto.setCurrency(MoneyUtil.extractCurrencyCode(invoice.getTotal())); + invoiceDto.setClientId(invoice.getClientId()); + invoiceDto.setDueDate(invoice.getDueDate()); + invoiceDto.setInvoiceDate(invoice.getInvoiceDate()); + return invoiceDto; + } } diff --git a/src/main/java/com/tecacet/money/controller/InvoiceDto.java b/src/main/java/com/tecacet/money/controller/InvoiceDto.java index 82ec2ef..1f99b12 100644 --- a/src/main/java/com/tecacet/money/controller/InvoiceDto.java +++ b/src/main/java/com/tecacet/money/controller/InvoiceDto.java @@ -1,13 +1,8 @@ package com.tecacet.money.controller; -import lombok.Builder; -import lombok.Getter; - import java.math.BigDecimal; import java.time.LocalDate; -@Getter -@Builder public class InvoiceDto { private String clientId; @@ -16,4 +11,43 @@ public class InvoiceDto { private LocalDate invoiceDate; private LocalDate dueDate; + public String getClientId() { + return clientId; + } + + public void setClientId(String clientId) { + this.clientId = clientId; + } + + public String getCurrency() { + return currency; + } + + public void setCurrency(String currency) { + this.currency = currency; + } + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + public LocalDate getInvoiceDate() { + return invoiceDate; + } + + public void setInvoiceDate(LocalDate invoiceDate) { + this.invoiceDate = invoiceDate; + } + + public LocalDate getDueDate() { + return dueDate; + } + + public void setDueDate(LocalDate dueDate) { + this.dueDate = dueDate; + } } diff --git a/src/main/java/com/tecacet/money/domain/Contract.java b/src/main/java/com/tecacet/money/domain/Contract.java index 3c341e9..83b763c 100644 --- a/src/main/java/com/tecacet/money/domain/Contract.java +++ b/src/main/java/com/tecacet/money/domain/Contract.java @@ -1,6 +1,5 @@ package com.tecacet.money.domain; -import lombok.*; import org.hibernate.annotations.CreationTimestamp; import javax.persistence.*; @@ -12,11 +11,6 @@ @Entity @Table(name = "contract") -@Getter -@Builder -//The following are required by the JPA contract -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor(access = AccessLevel.PRIVATE) public class Contract { public static final String DEFAULT_CURRENCY = "USD"; @@ -29,15 +23,52 @@ public class Contract { private String clientId; @NotNull(message = "Invoice Currency is required") - @Builder.Default private Currency invoiceCurrency = Currency.getInstance(DEFAULT_CURRENCY); @NotNull(message = "Discount Percent is required") - @Builder.Default private BigDecimal discountPercent = BigDecimal.ZERO; @Column(name = "created", nullable = false, updatable = false) @CreationTimestamp private LocalDateTime created; + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getClientId() { + return clientId; + } + + public void setClientId(String clientId) { + this.clientId = clientId; + } + + public Currency getInvoiceCurrency() { + return invoiceCurrency; + } + + public void setInvoiceCurrency(Currency invoiceCurrency) { + this.invoiceCurrency = invoiceCurrency; + } + + public BigDecimal getDiscountPercent() { + return discountPercent; + } + + public void setDiscountPercent(BigDecimal discountPercent) { + this.discountPercent = discountPercent; + } + + public LocalDateTime getCreated() { + return created; + } + + public void setCreated(LocalDateTime created) { + this.created = created; + } } diff --git a/src/main/java/com/tecacet/money/domain/Fee.java b/src/main/java/com/tecacet/money/domain/Fee.java index be4e4fc..9b58914 100644 --- a/src/main/java/com/tecacet/money/domain/Fee.java +++ b/src/main/java/com/tecacet/money/domain/Fee.java @@ -1,28 +1,16 @@ package com.tecacet.money.domain; -import lombok.*; import org.hibernate.annotations.Columns; import org.hibernate.annotations.CreationTimestamp; -import java.time.LocalDateTime; -import java.util.UUID; - import javax.money.MonetaryAmount; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; +import javax.persistence.*; import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; +import java.util.UUID; @Entity @Table(name = "fee") -@Getter -@Builder -//The following are required by the JPA contract -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor(access = AccessLevel.PRIVATE) public class Fee { @Id @@ -42,4 +30,43 @@ public class Fee { @CreationTimestamp private LocalDateTime created; + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getClientId() { + return clientId; + } + + public void setClientId(String clientId) { + this.clientId = clientId; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public MonetaryAmount getAmount() { + return amount; + } + + public void setAmount(MonetaryAmount amount) { + this.amount = amount; + } + + public LocalDateTime getCreated() { + return created; + } + + public void setCreated(LocalDateTime created) { + this.created = created; + } } diff --git a/src/main/java/com/tecacet/money/domain/Invoice.java b/src/main/java/com/tecacet/money/domain/Invoice.java index c6ad097..101edac 100644 --- a/src/main/java/com/tecacet/money/domain/Invoice.java +++ b/src/main/java/com/tecacet/money/domain/Invoice.java @@ -1,32 +1,23 @@ package com.tecacet.money.domain; -import lombok.*; import org.hibernate.annotations.Columns; import org.hibernate.annotations.CreationTimestamp; +import javax.money.MonetaryAmount; +import javax.persistence.*; +import javax.validation.constraints.NotNull; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.UUID; -import javax.money.MonetaryAmount; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.validation.constraints.NotNull; - @Entity @Table(name = "invoice") -@Getter -@Builder -//The following are required by the JPA contract -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor(access = AccessLevel.PRIVATE) public class Invoice { + private Invoice() { + } + @Id @GeneratedValue(strategy = GenerationType.AUTO) private UUID id; @@ -39,8 +30,7 @@ public class Invoice { private MonetaryAmount total; @NotNull(message = "discountPercent is required") - @Builder.Default - private BigDecimal discountPercent = BigDecimal.ZERO; + private final BigDecimal discountPercent = BigDecimal.ZERO; @NotNull(message = "Invoice date is required") private LocalDate invoiceDate; @@ -52,4 +42,70 @@ public class Invoice { @CreationTimestamp private LocalDateTime created; + public UUID getId() { + return id; + } + + public String getClientId() { + return clientId; + } + + public MonetaryAmount getTotal() { + return total; + } + + public BigDecimal getDiscountPercent() { + return discountPercent; + } + + public LocalDate getInvoiceDate() { + return invoiceDate; + } + + public LocalDate getDueDate() { + return dueDate; + } + + public LocalDateTime getCreated() { + return created; + } + + private static class InvoiceBuilderPrv implements InvoiceBuilder { + + private final Invoice invoice = new Invoice(); + + @Override + public InvoiceBuilder clientId(String clientId) { + invoice.clientId = clientId; + return this; + } + + @Override + public InvoiceBuilder total(MonetaryAmount total) { + invoice.total = total; + return this; + } + + @Override + public InvoiceBuilder invoiceDate(LocalDate date) { + invoice.invoiceDate = date; + return this; + } + + @Override + public InvoiceBuilder dueDate(LocalDate dueDate) { + invoice.dueDate = dueDate; + return this; + } + + @Override + public Invoice build() { + return invoice; + } + } + + public static InvoiceBuilder builder() { + return new InvoiceBuilderPrv(); + } + } diff --git a/src/main/java/com/tecacet/money/domain/InvoiceBuilder.java b/src/main/java/com/tecacet/money/domain/InvoiceBuilder.java new file mode 100644 index 0000000..c3d161d --- /dev/null +++ b/src/main/java/com/tecacet/money/domain/InvoiceBuilder.java @@ -0,0 +1,17 @@ +package com.tecacet.money.domain; + +import javax.money.MonetaryAmount; +import java.time.LocalDate; + +public interface InvoiceBuilder { + + InvoiceBuilder clientId(String clientId); + + InvoiceBuilder total(MonetaryAmount total); + + InvoiceBuilder invoiceDate(LocalDate date); + + InvoiceBuilder dueDate(LocalDate dueDate); + + Invoice build(); +} diff --git a/src/main/java/com/tecacet/money/service/InvoiceService.java b/src/main/java/com/tecacet/money/service/InvoiceService.java index d65a954..cbbb631 100644 --- a/src/main/java/com/tecacet/money/service/InvoiceService.java +++ b/src/main/java/com/tecacet/money/service/InvoiceService.java @@ -6,8 +6,6 @@ import com.tecacet.money.repository.ContractRepository; import com.tecacet.money.repository.FeeRepository; import com.tecacet.money.repository.InvoiceRepository; -import com.tecacet.money.util.MoneyUtil; -import lombok.RequiredArgsConstructor; import org.javamoney.moneta.Money; import org.springframework.stereotype.Service; @@ -21,7 +19,6 @@ import java.util.Optional; @Service -@RequiredArgsConstructor public class InvoiceService { private final FeeRepository feeRepository; @@ -29,6 +26,13 @@ public class InvoiceService { private final ContractRepository contractRepository; private final ExchangeRateProvider exchangeRateProvider; + public InvoiceService(FeeRepository feeRepository, InvoiceRepository invoiceRepository, ContractRepository contractRepository, ExchangeRateProvider exchangeRateProvider) { + this.feeRepository = feeRepository; + this.invoiceRepository = invoiceRepository; + this.contractRepository = contractRepository; + this.exchangeRateProvider = exchangeRateProvider; + } + public Optional createClientInvoice(String clientId, LocalDate date) { List fees = feeRepository.findByClientId(clientId); if (fees.isEmpty()) { diff --git a/src/test/java/com/tecacet/money/controller/InvoiceControllerTest.java b/src/test/java/com/tecacet/money/controller/InvoiceControllerTest.java index bf5ccb8..8b17759 100644 --- a/src/test/java/com/tecacet/money/controller/InvoiceControllerTest.java +++ b/src/test/java/com/tecacet/money/controller/InvoiceControllerTest.java @@ -62,18 +62,17 @@ void createInvoice() { } private Fee createFee(String clientId, double amount, String currency) { - return Fee.builder() - .clientId(clientId) - .amount(Money.of(amount, currency)) - .build(); + Fee fee = new Fee(); + fee.setClientId(clientId); + fee.setAmount(Money.of(amount, currency)); + return fee; } private Contract createContract(String clientId) { - Contract contract = Contract.builder() - .clientId(clientId) - .invoiceCurrency(Currency.getInstance("USD")) - .discountPercent(BigDecimal.TEN) - .build(); + Contract contract = new Contract(); + contract.setClientId(clientId); + contract.setInvoiceCurrency(Currency.getInstance("USD")); + contract.setDiscountPercent(BigDecimal.TEN); return contractRepository.save(contract); } } \ No newline at end of file diff --git a/src/test/java/com/tecacet/money/repository/ContractRepositoryTest.java b/src/test/java/com/tecacet/money/repository/ContractRepositoryTest.java index 2a9264e..5e697b5 100644 --- a/src/test/java/com/tecacet/money/repository/ContractRepositoryTest.java +++ b/src/test/java/com/tecacet/money/repository/ContractRepositoryTest.java @@ -35,10 +35,9 @@ void missingRequiredProperty() { } private Contract createContract(String clientId, Currency currency) { - Contract contract = Contract.builder() - .clientId(clientId) - .invoiceCurrency(currency) - .build(); + Contract contract = new Contract(); + contract.setClientId(clientId); + contract.setInvoiceCurrency(currency); return contractRepository.save(contract); } } diff --git a/src/test/java/com/tecacet/money/repository/FeeRepositoryTest.java b/src/test/java/com/tecacet/money/repository/FeeRepositoryTest.java index d5f2fcc..edbb2a2 100644 --- a/src/test/java/com/tecacet/money/repository/FeeRepositoryTest.java +++ b/src/test/java/com/tecacet/money/repository/FeeRepositoryTest.java @@ -38,9 +38,9 @@ void findByClientId() { } private Fee createFee(String clientId, double amount, String currency) { - return Fee.builder() - .clientId(clientId) - .amount(Money.of(amount, currency)) - .build(); + Fee fee = new Fee(); + fee.setClientId(clientId); + fee.setAmount(Money.of(amount, currency)); + return fee; } } \ No newline at end of file