Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature #4401 - Added Reasons of Bonus for change of user points. #1567

Merged
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
7 changes: 7 additions & 0 deletions dao/src/main/java/greencity/entity/order/ChangeOfPoints.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package greencity.entity.order;

import greencity.entity.user.User;
import greencity.enums.BonusReason;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
Expand All @@ -9,6 +10,8 @@
import jakarta.persistence.GenerationType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Enumerated;
import jakarta.persistence.EnumType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
Expand Down Expand Up @@ -41,4 +44,8 @@ public class ChangeOfPoints {
@ManyToOne
@JoinColumn(name = "order_id")
private Order order;

@Column(nullable = false, name = "reason", length = 50)
@Enumerated(EnumType.STRING)
private BonusReason reason;
}
15 changes: 15 additions & 0 deletions dao/src/main/java/greencity/enums/BonusReason.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package greencity.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum BonusReason {
RETURN_OVERPAY("Повернення переплати за замовлення", "Refund of overpayment for the order"),
REFUND_CANCELED_ORDER("Зарахування оплати скасованого замовлення", "Enrollment of payment for canceled order"),
DEBIT_PAYMENT("Списання у рахунок оплати замовлення", "Write-off of the payment of the order");

private final String descriptionUa;
private final String descriptionEn;
}
Original file line number Diff line number Diff line change
Expand Up @@ -261,4 +261,5 @@
<include file="db/changelog/logs/2024-12-16-hotfix-big_order_table-Kizerov.xml"/>
<include file="db/changelog/logs/2024-11-28-change-add-column-isTableFreeze-to-column_width_for_employee-Warded120.xml"/>
<include file="db/changelog/logs/2024-12-18-update-column_width_for_employee-Kizerov.xml"/>
<include file="db/changelog/logs/ch-add-column-reason-into-change-of-points-table-Chernenko.xml"/>
</databaseChangeLog>
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">

<changeSet id="2024-12-19-add-column-reason" author="Chernenko Vitaliy">
<addColumn tableName="change_of_points">
<column name="reason" type="VARCHAR(50)">
<constraints nullable="false"/>
</column>
</addColumn>
</changeSet>
</databaseChangeLog>
31 changes: 31 additions & 0 deletions dao/src/test/java/greencity/enums/BonusReasonTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package greencity.enums;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

class BonusReasonTest {
@Test
void returnOverpayConstantValidTest() {
BonusReason reason = BonusReason.RETURN_OVERPAY;

assertEquals("Повернення переплати за замовлення", reason.getDescriptionUa());
assertEquals("Refund of overpayment for the order", reason.getDescriptionEn());
}

@Test
void refundCanceledOrderConstantValidTest() {
BonusReason reason = BonusReason.REFUND_CANCELED_ORDER;

assertEquals("Зарахування оплати скасованого замовлення", reason.getDescriptionUa());
assertEquals("Enrollment of payment for canceled order", reason.getDescriptionEn());
}

@Test
void debitPaymentConstantValidTest() {
BonusReason reason = BonusReason.DEBIT_PAYMENT;

assertEquals("Списання у рахунок оплати замовлення", reason.getDescriptionUa());
assertEquals("Write-off of the payment of the order", reason.getDescriptionEn());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,10 @@
@ToString
@Builder
@EqualsAndHashCode

public class PointsForUbsUserDto {
private LocalDateTime dateOfEnrollment;
private Long numberOfOrder;
private Integer amount;
private String reasonUa;
private String reasonEn;
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,12 @@ public class PointsForUbsUserDtoMapper extends AbstractConverter<ChangeOfPoints,

@Override
protected PointsForUbsUserDto convert(ChangeOfPoints changeOfPoints) {
Long numberOfOrder = null;
if (changeOfPoints.getOrder() != null) {
numberOfOrder = changeOfPoints.getOrder().getId();
}
return PointsForUbsUserDto.builder()
.dateOfEnrollment(changeOfPoints.getDate())
.amount(changeOfPoints.getAmount())
.numberOfOrder(numberOfOrder)
.numberOfOrder(changeOfPoints.getOrder().getId())
.reasonUa(changeOfPoints.getReason().getDescriptionUa())
.reasonEn(changeOfPoints.getReason().getDescriptionEn())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import greencity.enums.OrderStatus;
import greencity.enums.PaymentStatus;
import greencity.enums.PaymentType;
import greencity.enums.BonusReason;
import greencity.exceptions.BadRequestException;
import greencity.exceptions.NotFoundException;
import greencity.repository.CertificateRepository;
Expand Down Expand Up @@ -186,7 +187,7 @@ private void processRefundForBroughtItHimselfOrder(Order order, RefundDto refund
Long possibleBonusesRefundAmount =
Long.valueOf(order.getPointsToUse()) + PaymentUtil.calculatePaidAmount(order);
validateRefundAmount(refundDto.getAmount(), possibleBonusesRefundAmount);
refundPaymentsInBonus(order, employeeEmail, refundDto.getAmount());
refundPaymentsInBonus(order, employeeEmail, refundDto.getAmount(), BonusReason.RETURN_OVERPAY);
} else if (refundDto.isReturnMoney()) {
validateRefundAmount(refundDto.getAmount(), PaymentUtil.calculatePaidAmount(order));
refundPaymentsInMoney(order, employeeEmail, refundDto.getAmount());
Expand All @@ -199,7 +200,7 @@ private void processRefundForDoneAndCanceledOrder(Order order, RefundDto refundD
throw new BadRequestException(String.format(ORDER_CAN_NOT_BE_UPDATED, order.getOrderStatus()));
}
if (refundDto.isReturnBonuses()) {
refundPaymentsInBonus(order, employeeEmail);
refundPaymentsInBonus(order, employeeEmail, BonusReason.REFUND_CANCELED_ORDER);
} else if (refundDto.isReturnMoney()) {
Long paidAmount = PaymentUtil.calculatePaidAmount(order);
refundPaymentsInMoney(order, employeeEmail, paidAmount);
Expand Down Expand Up @@ -248,21 +249,21 @@ private void refundPaymentsInMoney(Order order, String employeeEmail, Long amoun
eventService.saveEvent(OrderHistory.CANCELED_ORDER_MONEY_REFUND, employeeEmail, order);
}

private void refundPaymentsInBonus(Order order, String email) {
private void refundPaymentsInBonus(Order order, String email, BonusReason reason) {
CounterOrderDetailsDto prices =
PaymentUtil.getPriceDetails(order.getId(), orderRepository, orderBagService, certificateRepository);
Long overpaymentInCoins =
PaymentUtil.calculateOverpayment(order,
PaymentUtil.convertBillsIntoCoins(PaymentUtil.setTotalPrice(prices)));
refundPaymentsInBonus(order, email, overpaymentInCoins);
refundPaymentsInBonus(order, email, overpaymentInCoins, reason);
}

private void refundPaymentsInBonus(Order order, String email, Long amount) {
private void refundPaymentsInBonus(Order order, String email, Long amount, BonusReason reason) {
checkOverpayment(amount);
User currentUser = order.getUser();
order.getPayment().add(
buildPaymentForRefund(-amount, ENROLLMENT_TO_THE_BONUS_ACCOUNT_ENG, order));
transferPointsToUser(order, currentUser, amount);
transferPointsToUser(order, currentUser, amount, reason);
order.setOrderPaymentStatus(OrderPaymentStatus.PAYMENT_REFUNDED);
orderRepository.save(order);
userRepository.save(currentUser);
Expand Down Expand Up @@ -299,7 +300,7 @@ private Payment buildPaymentForRefund(Long amount, String receiptLink, Order ord
.build();
}

private void transferPointsToUser(Order order, User user, long pointsInCoins) {
private void transferPointsToUser(Order order, User user, long pointsInCoins, BonusReason reason) {
int uahPoints = PaymentUtil.convertCoinsIntoBills(pointsInCoins).intValue();
user.setCurrentPoints(user.getCurrentPoints() + uahPoints);

Expand All @@ -310,6 +311,7 @@ private void transferPointsToUser(Order order, User user, long pointsInCoins) {
.amount(uahPoints)
.date(LocalDateTime.now())
.order(order)
.reason(reason)
.build());
notificationService.notifyBonuses(order, (long) uahPoints);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@
import greencity.enums.PaymentStatus;
import greencity.enums.PaymentType;
import greencity.enums.TariffStatus;
import greencity.enums.BonusReason;
import greencity.exceptions.BadRequestException;
import greencity.exceptions.NotFoundException;
import greencity.exceptions.address.AddressNotWithinLocationAreaException;
Expand Down Expand Up @@ -924,6 +925,7 @@ private void formAndSaveUser(User currentUser, int pointsToUse, Order order) {
.date(order.getOrderDate())
.user(currentUser)
.order(order)
.reason(BonusReason.DEBIT_PAYMENT)
.build());
}
userRepository.save(currentUser);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import greencity.ModelUtils;
import greencity.dto.user.PointsForUbsUserDto;
import greencity.entity.order.ChangeOfPoints;
import greencity.enums.BonusReason;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
Expand All @@ -17,10 +18,13 @@ class PointsForUbsUserDtoMapperTest {
@Test
void convert() {
ChangeOfPoints changeOfPoints = ModelUtils.getChangeOfPoints();
changeOfPoints.setReason(BonusReason.RETURN_OVERPAY);
PointsForUbsUserDto expected = PointsForUbsUserDto.builder()
.numberOfOrder(changeOfPoints.getOrder().getId())
.amount(changeOfPoints.getAmount())
.dateOfEnrollment(changeOfPoints.getDate())
.reasonUa(changeOfPoints.getReason().getDescriptionUa())
.reasonEn(changeOfPoints.getReason().getDescriptionEn())
.build();
PointsForUbsUserDto actual = pointsForUbsUserDtoMapper.convert(changeOfPoints);

Expand Down
Loading