diff --git a/GreenCityUBS b/GreenCityUBS new file mode 160000 index 000000000..7a7d89655 --- /dev/null +++ b/GreenCityUBS @@ -0,0 +1 @@ +Subproject commit 7a7d896553a5bf79e19c0f69b4964ceab824cc34 diff --git a/core/src/main/java/greencity/controller/AdminUbsController.java b/core/src/main/java/greencity/controller/AdminUbsController.java index ff5addc5a..2756eeaf3 100644 --- a/core/src/main/java/greencity/controller/AdminUbsController.java +++ b/core/src/main/java/greencity/controller/AdminUbsController.java @@ -85,7 +85,7 @@ public ResponseEntity getTableParameters( * @param userUuid of {@link String} * @author Oleh Kulbaba */ - @ApiOperation("Get all parameters for building table of orders") + @ApiOperation("Get width of columns for order table") @ApiResponses(value = { @ApiResponse(code = 200, message = HttpStatuses.OK), @ApiResponse(code = 401, message = HttpStatuses.UNAUTHORIZED), @@ -106,7 +106,7 @@ public ResponseEntity getTableColumnWidthForCurrentUser( * @param columnWidthDto of {@link ColumnWidthDto} * @author Oleh Kulbaba */ - @ApiOperation("Get width of columns for order table") + @ApiOperation("Edit width of columns for order table") @ApiResponses(value = { @ApiResponse(code = 200, message = HttpStatuses.OK), @ApiResponse(code = 401, message = HttpStatuses.UNAUTHORIZED), @@ -127,7 +127,7 @@ public ResponseEntity saveTableColumnWidthForCurrentUser( * * @author Liubomyr Pater */ - @ApiOperation(value = "Save width of columns for order table") + @ApiOperation(value = "Save changes in orders") @ApiResponses(value = { @ApiResponse(code = 200, message = HttpStatuses.OK, response = PageableDto.class), @ApiResponse(code = 400, message = HttpStatuses.BAD_REQUEST), @@ -209,7 +209,7 @@ public ResponseEntity getAllOrdersForUser( * @param userId {@link Long} * @author Roman Sulymka and Max Bohonko. */ - @ApiOperation("Get users for the table") + @ApiOperation("Get user's violations") @ApiResponses(value = { @ApiResponse(code = 200, message = HttpStatuses.OK), @ApiResponse(code = 401, message = HttpStatuses.UNAUTHORIZED), diff --git a/core/src/main/java/greencity/controller/ManagementOrderController.java b/core/src/main/java/greencity/controller/ManagementOrderController.java index 7def29860..0a505213e 100644 --- a/core/src/main/java/greencity/controller/ManagementOrderController.java +++ b/core/src/main/java/greencity/controller/ManagementOrderController.java @@ -17,6 +17,8 @@ import greencity.dto.order.ExportDetailsDto; import greencity.dto.order.ExportDetailsDtoUpdate; import greencity.dto.order.GroupedOrderDto; +import greencity.dto.order.NotTakenOrderReasonDto; +import greencity.dto.order.OrderCancellationReasonDto; import greencity.dto.order.OrderDetailInfoDto; import greencity.dto.order.OrderDetailStatusDto; import greencity.dto.order.OrderDetailStatusRequestDto; @@ -25,8 +27,6 @@ import greencity.dto.order.ReadAddressByOrderDto; import greencity.dto.order.UpdateAllOrderPageDto; import greencity.dto.order.UpdateOrderPageAdminDto; -import greencity.dto.order.NotTakenOrderReasonDto; -import greencity.dto.order.OrderCancellationReasonDto; import greencity.dto.pageble.PageableDto; import greencity.dto.payment.ManualPaymentRequestDto; import greencity.dto.payment.ManualPaymentResponseDto; @@ -54,12 +54,6 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; -import java.security.Principal; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import javax.validation.Valid; -import javax.validation.constraints.Email; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.http.HttpStatus; @@ -84,6 +78,13 @@ import org.springframework.web.server.ResponseStatusException; import springfox.documentation.annotations.ApiIgnore; +import javax.validation.Valid; +import javax.validation.constraints.Email; +import java.security.Principal; +import java.util.List; +import java.util.Optional; +import java.util.Set; + @RestController @RequestMapping("/ubs/management") @RequiredArgsConstructor @@ -387,7 +388,7 @@ public ResponseEntity getAddressByOrderId( }) @GetMapping("/getPaymentInfo") public ResponseEntity paymentInfo(@RequestParam long orderId, - @RequestParam Long sumToPay) { + @RequestParam Double sumToPay) { return ResponseEntity.status(HttpStatus.OK) .body(ubsManagementService.getPaymentInfo(orderId, sumToPay)); } @@ -690,7 +691,7 @@ public ResponseEntity deleteViolationFromOrder(@PathVariable Long or }) @GetMapping("/return-overpayment-as-bonuses-info") public ResponseEntity returnOverpaymentAsBonusesInfo(@RequestParam Long orderId, - @RequestParam Long sumToPay) { + @RequestParam Double sumToPay) { return ResponseEntity.status(HttpStatus.OK) .body(ubsManagementService.returnOverpaymentInfo(orderId, sumToPay, 2L)); } @@ -713,7 +714,7 @@ public ResponseEntity returnOverpaymentAsBonusesInfo(@Reque }) @GetMapping("/return-overpayment-as-money-info") public ResponseEntity returnOverpaymentAsMoneyInfo(@RequestParam Long orderId, - @RequestParam Long sumToPay) { + @RequestParam Double sumToPay) { return ResponseEntity.status(HttpStatus.OK) .body(ubsManagementService.returnOverpaymentInfo(orderId, sumToPay, 1L)); } diff --git a/core/src/main/java/greencity/controller/SuperAdminController.java b/core/src/main/java/greencity/controller/SuperAdminController.java index c636cc539..93751f91f 100644 --- a/core/src/main/java/greencity/controller/SuperAdminController.java +++ b/core/src/main/java/greencity/controller/SuperAdminController.java @@ -154,7 +154,7 @@ public ResponseEntity deleteTariffService( @PreAuthorize("@preAuthorizer.hasAuthority('EDIT_DELETE_PRICE_CARD', authentication)") @PutMapping("/editTariffService/{id}") public ResponseEntity editTariffService( - @RequestBody TariffServiceDto dto, + @Valid @RequestBody TariffServiceDto dto, @Valid @PathVariable Integer id, @ApiIgnore @CurrentUserUuid String uuid) { return ResponseEntity.status(HttpStatus.OK).body(superAdminService.editTariffService(dto, id, uuid)); diff --git a/core/src/test/java/greencity/ModelUtils.java b/core/src/test/java/greencity/ModelUtils.java index ecf3f519e..ca0d1bedd 100644 --- a/core/src/test/java/greencity/ModelUtils.java +++ b/core/src/test/java/greencity/ModelUtils.java @@ -310,8 +310,8 @@ public static OrderCancellationReasonDto getCancellationDto() { public static TariffServiceDto getTariffServiceDto() { return TariffServiceDto.builder() .capacity(120) - .commission(10) - .price(100) + .commission(10.) + .price(100.) .name("Test") .nameEng("a") .description("Description") @@ -323,7 +323,7 @@ public static ServiceDto getServiceDto() { return ServiceDto.builder() .name("Name") .nameEng("NameEng") - .price(100) + .price(100.) .description("Description") .descriptionEng("DescriptionEng") .build(); @@ -334,8 +334,8 @@ public static GetTariffServiceDto getGetTariffServiceDto() { .id(1) .name("Бавовняна сумка") .capacity(120) - .price(120) - .commission(50) + .price(120.) + .commission(50.) .description("Description") .limitIncluded(true) .build(); @@ -358,7 +358,7 @@ public static GetServiceDto getGetServiceDto() { .id(1L) .name("Name") .nameEng("NameEng") - .price(100) + .price(100.) .description("Description") .descriptionEng("DescriptionEng") .build(); diff --git a/dao/src/main/java/greencity/entity/order/Bag.java b/dao/src/main/java/greencity/entity/order/Bag.java index 0103570b1..dafb97462 100644 --- a/dao/src/main/java/greencity/entity/order/Bag.java +++ b/dao/src/main/java/greencity/entity/order/Bag.java @@ -10,6 +10,8 @@ import lombok.Builder; import javax.persistence.*; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; import java.time.LocalDate; @Entity @@ -26,22 +28,29 @@ public class Bag { @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; + @Min(1) + @Max(999) @Column(nullable = false) private Integer capacity; + @Min(1) + @Max(99_999_999) @Column(nullable = false) - private Integer price; + private Long price; + @Min(0) + @Max(99_999_999) @Column(nullable = false) - private Integer commission; + private Long commission; + @Min(1) @Column(nullable = false) - private Integer fullPrice; + private Long fullPrice; - @Column(nullable = false) + @Column(nullable = false, length = 30) private String name; - @Column(nullable = false) + @Column(nullable = false, length = 30) private String nameEng; @Column(nullable = false) diff --git a/dao/src/main/java/greencity/entity/order/Service.java b/dao/src/main/java/greencity/entity/order/Service.java index 0ed06e732..3e935d336 100644 --- a/dao/src/main/java/greencity/entity/order/Service.java +++ b/dao/src/main/java/greencity/entity/order/Service.java @@ -1,9 +1,24 @@ package greencity.entity.order; import greencity.entity.user.employee.Employee; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.ToString; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToOne; +import javax.persistence.Table; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; import java.time.LocalDate; @Entity @@ -20,13 +35,15 @@ public class Service { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Min(1) + @Max(99_999_999) @Column(nullable = false) - private Integer price; + private Long price; - @Column(nullable = false) + @Column(nullable = false, length = 30) private String name; - @Column(nullable = false) + @Column(nullable = false, length = 30) private String nameEng; @Column(nullable = false) @@ -39,7 +56,7 @@ public class Service { private LocalDate createdAt; @ManyToOne - @JoinColumn(name = "created_by", nullable = false) + @JoinColumn(nullable = false, name = "created_by") private Employee createdBy; @Column diff --git a/dao/src/main/java/greencity/repository/BagRepository.java b/dao/src/main/java/greencity/repository/BagRepository.java index 85c0beccb..18d35c029 100644 --- a/dao/src/main/java/greencity/repository/BagRepository.java +++ b/dao/src/main/java/greencity/repository/BagRepository.java @@ -59,7 +59,8 @@ public interface BagRepository extends JpaRepository { * @author Nazar Struk * @author José Castellanos */ - @Query(value = "SELECT name, b.capacity, b.price, obm.amount, (b.price * obm.amount) AS summ " + @Query(value = "SELECT name, b.capacity, (b.price/100.00) AS price, " + + "obm.amount, ((b.price * obm.amount) / 100.00) AS summ " + "FROM bag b " + "JOIN order_bag_mapping obm on b.id = obm.bag_id " + "WHERE obm.ORDER_ID = :orderId", nativeQuery = true) @@ -85,13 +86,4 @@ public interface BagRepository extends JpaRepository { * @author Safarov Renat */ List findBagsByTariffsInfoId(Long tariffInfoId); - - /** - * method, that returns {@link List} of {@link Bag} by Tariff id. - * - * @param tariffId {@link Long} - tariff id. - * @return {@link List}of{@link Bag}. - * @author Julia Seti - */ - List getAllByTariffsInfoId(Long tariffId); } \ No newline at end of file diff --git a/dao/src/main/resources/db/changelog/db.changelog-master.xml b/dao/src/main/resources/db/changelog/db.changelog-master.xml index 4f6d669b3..4b5169305 100644 --- a/dao/src/main/resources/db/changelog/db.changelog-master.xml +++ b/dao/src/main/resources/db/changelog/db.changelog-master.xml @@ -203,4 +203,8 @@ + + + + \ No newline at end of file diff --git a/dao/src/main/resources/db/changelog/logs/ch-modify-columns-name-name-eng-in-bag-and-service-tables.xml b/dao/src/main/resources/db/changelog/logs/ch-modify-columns-name-name-eng-in-bag-and-service-tables.xml new file mode 100644 index 000000000..9bc959c6d --- /dev/null +++ b/dao/src/main/resources/db/changelog/logs/ch-modify-columns-name-name-eng-in-bag-and-service-tables.xml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/dao/src/main/resources/db/changelog/logs/ch-update-bag-price-commission-Seti.xml b/dao/src/main/resources/db/changelog/logs/ch-update-bag-price-commission-Seti.xml new file mode 100644 index 000000000..16622baa7 --- /dev/null +++ b/dao/src/main/resources/db/changelog/logs/ch-update-bag-price-commission-Seti.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + id=1 + + + + + + id=2 + + + + + + id=3 + + + + + + + id=4 + + + + + + id=5 + + + + + + id=6 + + + \ No newline at end of file diff --git a/dao/src/main/resources/db/changelog/logs/ch-update-service-price-Seti.xml b/dao/src/main/resources/db/changelog/logs/ch-update-service-price-Seti.xml new file mode 100644 index 000000000..71d8b4da8 --- /dev/null +++ b/dao/src/main/resources/db/changelog/logs/ch-update-service-price-Seti.xml @@ -0,0 +1,13 @@ + + + + + + + + price=50 + + + \ No newline at end of file diff --git a/dao/src/main/resources/db/changelog/logs/ch-update_big_order_table_view-Seti.xml b/dao/src/main/resources/db/changelog/logs/ch-update_big_order_table_view-Seti.xml new file mode 100644 index 000000000..3e17c4f0d --- /dev/null +++ b/dao/src/main/resources/db/changelog/logs/ch-update_big_order_table_view-Seti.xml @@ -0,0 +1,119 @@ + + + + + + + with group_capacity as + (SELECT this.order_id, + case when + ((select sum(obm.confirmed_quantity) from order_bag_mapping obm + where obm.order_id = this.order_id) is NULL + and (select sum(obm.exported_quantity) from order_bag_mapping obm + where obm.order_id = this.order_id) is NULL) + then concat(bag.capacity,'л - ',sum(amount),'шт') + when ((select sum(obm.exported_quantity) from order_bag_mapping obm + where obm.order_id = this.order_id) is NULL + and (select sum(obm.confirmed_quantity) from order_bag_mapping obm + where obm.order_id = this.order_id) is not NULL) + then concat(bag.capacity,'л - ',sum(confirmed_quantity),'шт') + when ((select sum(obm.exported_quantity) from order_bag_mapping obm + where obm.order_id = this.order_id) is not NULL) + then concat(bag.capacity,'л - ',sum(exported_quantity),'шт') + end + as amount_cap + from order_bag_mapping this + left join bag on this.bag_id = bag.id + group by bag.capacity , this.order_id ) + + SELECT + o.id as id, + o.order_status as order_status , + o.order_payment_status as order_payment_status, + cast(o.order_date as date) as order_date, + cast ((select max(cast(p.settlement_date as date)) from payment p where p.order_id = o.id and o.order_payment_status='PAID') as date ) as payment_date, + concat_ws(' ',uu.first_name,uu.last_name) as client_name, + uu.phone_number as client_phone_number, + uu.email as client_email, + concat_ws(' ',uu.sender_first_name,uu.sender_last_name ) as sender_name, + uu.sender_phone_number as sender_phone, + uu.sender_email as sender_email, + u.violations as violations_amount, + a.region as region, + a.city as city, + a.district as district, + concat_ws(', ',concat(a.street , ' ' , a.house_number), + case when (a.house_corpus) is not null and a.house_corpus != '' then concat('корп.',a.house_corpus) else 'корп.- ' end , + case when (a.entrance_number) is not null and a.entrance_number != '' then concat('п.', a.entrance_number) else 'п.- ' end) + as address, + a.address_comment as comment_to_address_for_client, + (select string_agg(amount_cap,'; ')from group_capacity + where order_id = o.id) as bag_amount, + o.sum_total_amount_without_discounts as total_order_sum, + (select string_agg(c.code,', ') from certificate c where c.order_id=o.id) as order_certificate_code, + cast(coalesce((select sum(c.points) from certificate c where c.order_id=o.id), 0) + + coalesce(o.points_to_use, 0) as bigint) as general_discount, + cast(coalesce(o.sum_total_amount_without_discounts, 0) + - (coalesce((select sum(p.amount) from payment p where p.order_id=o.id and p.payment_status='PAID'), 0) + + (coalesce((select sum(c.points) from certificate c where c.order_id=o.id), 0) * 100 + + coalesce(o.points_to_use, 0) * 100)) as bigint ) as amount_due, + o.comment as comment_for_order_by_client, + cast(coalesce((select sum(p.amount) from payment p where p.order_id=o.id and p.payment_status='PAID'), 0) + + (coalesce((select sum(c.points) from certificate c where c.order_id=o.id), 0) * 100 + coalesce(o.points_to_use, 0) * 100) as bigint) as total_payment, + o.date_of_export as date_of_export, + concat_ws('-', cast(o.deliver_from as time), cast (o.deliver_to as time)) as time_of_export, + (select string_agg(oe.additional_order, '; ') from order_additional oe where oe.orders_id = o.id) as id_order_from_shop, + r.name as receiving_station, + r.id as receiving_station_id, + + (select concat_ws(', ',e.first_name,e.last_name) from employee_order_position eop + left join employees e on eop.employee_id = e.id where order_id =o.id and eop.position_id=3 ) as responsible_logic_man, + (select e.id from employee_order_position eop + left join employees e on eop.employee_id = e.id where order_id =o.id and eop.position_id=3 ) as responsible_logic_man_id, + + (select concat_ws(', ',e.first_name,e.last_name) from employee_order_position eop + left join employees e on eop.employee_id = e.id where order_id =o.id and eop.position_id=5 ) as responsible_driver, + (select e.id from employee_order_position eop + left join employees e on eop.employee_id = e.id where order_id =o.id and eop.position_id=5 ) as responsible_driver_id, + + (select concat_ws(', ',e.first_name,e.last_name) from employee_order_position eop + left join employees e on eop.employee_id = e.id where order_id =o.id and eop.position_id=2 ) as responsible_caller, + (select e.id from employee_order_position eop + left join employees e on eop.employee_id = e.id where order_id =o.id and eop.position_id=2 ) as responsible_caller_id, + + (select concat_ws(', ',e.first_name,e.last_name) from employee_order_position eop + left join employees e on eop.employee_id = e.id where order_id =o.id and eop.position_id=4 ) as responsible_navigator, + (select e.id from employee_order_position eop + left join employees e on eop.employee_id = e.id where order_id =o.id and eop.position_id=4 ) as responsible_navigator_id, + o.blocked as is_blocked, + concat_ws(', ',e.first_name,e.last_name) as blocked_by, + a.region_en as region_en, + a.city_en as city_en, + a.district_en as district_en, + concat_ws(', ',concat(a.street_en , ' ' , a.house_number), + case when (a.house_corpus) is not null and a.house_corpus != '' then concat('b.',a.house_corpus) else 'b.- ' end , + case when (a.entrance_number) is not null and a.entrance_number != '' then concat('e.', a.entrance_number) else 'e.- ' end) + as address_en, + o.tariffs_info_id as tariffs_info_id, + o.admin_comment as comment_for_order_by_admin + + from orders o + + left join employees e on o.employee_id = e.id + left join receiving_stations r on o.receiving_station_id = r.id + left join ubs_user uu on o.ubs_user_id = uu.id + left join order_address a on uu.id = a.id + left join users u on o.users_id = u.id + + + + + + + + + \ No newline at end of file diff --git a/service-api/src/main/java/greencity/dto/bag/BagForUserDto.java b/service-api/src/main/java/greencity/dto/bag/BagForUserDto.java index b0a8ca9a7..f66c5a1b0 100644 --- a/service-api/src/main/java/greencity/dto/bag/BagForUserDto.java +++ b/service-api/src/main/java/greencity/dto/bag/BagForUserDto.java @@ -10,7 +10,7 @@ public class BagForUserDto { private String service; private String serviceEng; private Integer capacity; - private Integer fullPrice; + private Double fullPrice; private Integer count; - private Integer totalPrice; + private Double totalPrice; } \ No newline at end of file diff --git a/service-api/src/main/java/greencity/dto/bag/BagInfoDto.java b/service-api/src/main/java/greencity/dto/bag/BagInfoDto.java index 49581de97..8d8b3f0a0 100644 --- a/service-api/src/main/java/greencity/dto/bag/BagInfoDto.java +++ b/service-api/src/main/java/greencity/dto/bag/BagInfoDto.java @@ -10,7 +10,7 @@ @Builder public class BagInfoDto { Integer capacity; - Integer price; + Double price; Integer id; String name; String nameEng; diff --git a/service-api/src/main/java/greencity/dto/bag/BagOrderDto.java b/service-api/src/main/java/greencity/dto/bag/BagOrderDto.java index 17342e713..fa6be1e15 100644 --- a/service-api/src/main/java/greencity/dto/bag/BagOrderDto.java +++ b/service-api/src/main/java/greencity/dto/bag/BagOrderDto.java @@ -1,6 +1,12 @@ package greencity.dto.bag; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; @Getter @Setter @@ -12,7 +18,7 @@ public class BagOrderDto { private Integer bagId; private Integer capacity; - private Integer price; + private Double price; private String name; private String nameEng; private Integer bagAmount; diff --git a/service-api/src/main/java/greencity/dto/bag/BagTranslationDto.java b/service-api/src/main/java/greencity/dto/bag/BagTranslationDto.java index 1cc299dbd..f1b4e750b 100644 --- a/service-api/src/main/java/greencity/dto/bag/BagTranslationDto.java +++ b/service-api/src/main/java/greencity/dto/bag/BagTranslationDto.java @@ -4,14 +4,12 @@ import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.NoArgsConstructor; import lombok.NonNull; import lombok.Setter; import javax.validation.constraints.Min; import java.io.Serializable; -@NoArgsConstructor @AllArgsConstructor @Getter @Setter @@ -25,7 +23,7 @@ public class BagTranslationDto implements Serializable { @NonNull private Integer capacity; @NonNull - private Integer price; + private Double price; @NonNull private String nameEng; @NonNull diff --git a/service-api/src/main/java/greencity/dto/order/BigOrderTableDTO.java b/service-api/src/main/java/greencity/dto/order/BigOrderTableDTO.java index e4558013b..c60902519 100644 --- a/service-api/src/main/java/greencity/dto/order/BigOrderTableDTO.java +++ b/service-api/src/main/java/greencity/dto/order/BigOrderTableDTO.java @@ -28,12 +28,12 @@ public class BigOrderTableDTO { private SenderLocation address; private String commentToAddressForClient; private String bagsAmount; - private Long totalOrderSum; + private Double totalOrderSum; private String orderCertificateCode; private Long generalDiscount; - private Long amountDue; + private Double amountDue; private String commentForOrderByClient; - private Long totalPayment; + private Double totalPayment; private String dateOfExport; private String timeOfExport; private String idOrderFromShop; diff --git a/service-api/src/main/java/greencity/dto/order/OrderDetailInfoDto.java b/service-api/src/main/java/greencity/dto/order/OrderDetailInfoDto.java index b7c3d6ae6..93586e4f5 100644 --- a/service-api/src/main/java/greencity/dto/order/OrderDetailInfoDto.java +++ b/service-api/src/main/java/greencity/dto/order/OrderDetailInfoDto.java @@ -11,7 +11,7 @@ public class OrderDetailInfoDto { Long orderId; Integer capacity; - Integer price; + Double price; Integer amount; Integer exportedQuantity; Integer confirmedQuantity; diff --git a/service-api/src/main/java/greencity/dto/order/OrderStatusPageDto.java b/service-api/src/main/java/greencity/dto/order/OrderStatusPageDto.java index 38881e815..e37c58387 100644 --- a/service-api/src/main/java/greencity/dto/order/OrderStatusPageDto.java +++ b/service-api/src/main/java/greencity/dto/order/OrderStatusPageDto.java @@ -39,7 +39,7 @@ public class OrderStatusPageDto { private ExportDetailsDto exportDetailsDto; private EmployeePositionDtoRequest employeePositionDtoRequest; private String comment; - private Integer courierPricePerPackage; + private Double courierPricePerPackage; private CourierInfoDto courierInfo; - private Long writeOffStationSum; + private Double writeOffStationSum; } diff --git a/service-api/src/main/java/greencity/dto/order/UpdateOrderPageAdminDto.java b/service-api/src/main/java/greencity/dto/order/UpdateOrderPageAdminDto.java index 4fcc10806..99b7ac911 100644 --- a/service-api/src/main/java/greencity/dto/order/UpdateOrderPageAdminDto.java +++ b/service-api/src/main/java/greencity/dto/order/UpdateOrderPageAdminDto.java @@ -20,6 +20,6 @@ public class UpdateOrderPageAdminDto { private ExportDetailsDtoUpdate exportDetailsDto; private UpdateOrderDetailDto orderDetailDto; private List updateResponsibleEmployeeDto; - private Long writeOffStationSum; - private Long ubsCourierSum; + private Double writeOffStationSum; + private Double ubsCourierSum; } diff --git a/service-api/src/main/java/greencity/dto/order/UserOrdersDto.java b/service-api/src/main/java/greencity/dto/order/UserOrdersDto.java index 6c3aaa8b2..35b9763c9 100644 --- a/service-api/src/main/java/greencity/dto/order/UserOrdersDto.java +++ b/service-api/src/main/java/greencity/dto/order/UserOrdersDto.java @@ -21,5 +21,5 @@ public class UserOrdersDto { private LocalDateTime orderDate; private OrderStatus orderStatus; private OrderPaymentStatus orderPaymentStatus; - private Long amount; + private Double amount; } diff --git a/service-api/src/main/java/greencity/dto/payment/PaymentRequestDto.java b/service-api/src/main/java/greencity/dto/payment/PaymentRequestDto.java index 4085f66e1..c0bdc9d3f 100644 --- a/service-api/src/main/java/greencity/dto/payment/PaymentRequestDto.java +++ b/service-api/src/main/java/greencity/dto/payment/PaymentRequestDto.java @@ -23,7 +23,7 @@ public class PaymentRequestDto { @JsonProperty("currency") private String currency; @JsonProperty("amount") - private Integer amount; + private Long amount; @JsonProperty("signature") private String signature; @JsonProperty("response_url") diff --git a/service-api/src/main/java/greencity/dto/service/GetServiceDto.java b/service-api/src/main/java/greencity/dto/service/GetServiceDto.java index 713354f22..749d49f0f 100644 --- a/service-api/src/main/java/greencity/dto/service/GetServiceDto.java +++ b/service-api/src/main/java/greencity/dto/service/GetServiceDto.java @@ -8,6 +8,7 @@ import lombok.Setter; import lombok.ToString; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @Getter @@ -22,17 +23,17 @@ public class GetServiceDto { private Long id; @NotNull - private Integer price; + private Double price; - @NotNull + @NotBlank private String name; - @NotNull + @NotBlank private String nameEng; - @NotNull + @NotBlank private String description; - @NotNull + @NotBlank private String descriptionEng; } diff --git a/service-api/src/main/java/greencity/dto/service/GetTariffServiceDto.java b/service-api/src/main/java/greencity/dto/service/GetTariffServiceDto.java index 2e954a618..1babb14f7 100644 --- a/service-api/src/main/java/greencity/dto/service/GetTariffServiceDto.java +++ b/service-api/src/main/java/greencity/dto/service/GetTariffServiceDto.java @@ -8,6 +8,7 @@ import lombok.Setter; import lombok.ToString; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @Getter @@ -20,22 +21,31 @@ public class GetTariffServiceDto { @NotNull private Integer id; + @NotNull private Integer capacity; + @NotNull - private Integer price; - @NotNull - private Integer commission; + private Double price; + @NotNull - private Integer fullPrice; + private Double commission; + @NotNull + private Double fullPrice; + + @NotBlank private String name; - @NotNull + + @NotBlank private String nameEng; - @NotNull + + @NotBlank private String description; - @NotNull + + @NotBlank private String descriptionEng; + @NotNull private Boolean limitIncluded; } diff --git a/service-api/src/main/java/greencity/dto/service/ServiceDto.java b/service-api/src/main/java/greencity/dto/service/ServiceDto.java index 9c5db2221..98ae5c26a 100644 --- a/service-api/src/main/java/greencity/dto/service/ServiceDto.java +++ b/service-api/src/main/java/greencity/dto/service/ServiceDto.java @@ -6,7 +6,12 @@ import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; +import org.hibernate.validator.constraints.Length; +import javax.validation.constraints.DecimalMax; +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.Digits; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @Getter @@ -16,18 +21,23 @@ @Builder @ToString public class ServiceDto { - @NotNull + @NotBlank + @Length(max = 30) private String name; - @NotNull + @NotBlank + @Length(max = 30) private String nameEng; - @NotNull + @NotBlank private String description; - @NotNull + @NotBlank private String descriptionEng; @NotNull - private Integer price; + @DecimalMin(value = "0.01") + @DecimalMax(value = "999999.99") + @Digits(integer = 6, fraction = 2) + private Double price; } \ No newline at end of file diff --git a/service-api/src/main/java/greencity/dto/service/TariffServiceDto.java b/service-api/src/main/java/greencity/dto/service/TariffServiceDto.java index f694138a9..e20f5dfc0 100644 --- a/service-api/src/main/java/greencity/dto/service/TariffServiceDto.java +++ b/service-api/src/main/java/greencity/dto/service/TariffServiceDto.java @@ -7,7 +7,14 @@ import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; +import org.hibernate.validator.constraints.Length; +import javax.validation.constraints.DecimalMax; +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.Digits; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @Getter @@ -18,18 +25,36 @@ @Builder @EqualsAndHashCode public class TariffServiceDto { + @Min(1) + @Max(999) @NotNull private Integer capacity; + @NotNull - private Integer price; - @NotNull - private Integer commission; + @DecimalMin(value = "0.01") + @DecimalMax(value = "999999.99") + @Digits(integer = 6, fraction = 2) + private Double price; + @NotNull + @DecimalMin(value = "0.00") + @DecimalMax(value = "999999.99") + @Digits(integer = 6, fraction = 2) + private Double commission; + + @NotBlank + @Length(min = 1, max = 30) private String name; - @NotNull + + @NotBlank + @Length(min = 1, max = 30) private String nameEng; - @NotNull + + @NotBlank + @Length(min = 1, max = 255) private String description; - @NotNull + + @NotBlank + @Length(min = 1, max = 255) private String descriptionEng; } diff --git a/service-api/src/main/java/greencity/dto/user/UserPointsAndAllBagsDto.java b/service-api/src/main/java/greencity/dto/user/UserPointsAndAllBagsDto.java index 064d8d4bc..868f73231 100644 --- a/service-api/src/main/java/greencity/dto/user/UserPointsAndAllBagsDto.java +++ b/service-api/src/main/java/greencity/dto/user/UserPointsAndAllBagsDto.java @@ -13,5 +13,5 @@ @ToString public class UserPointsAndAllBagsDto implements Serializable { private List bags; - private int points; + private long points; } \ No newline at end of file diff --git a/service-api/src/main/java/greencity/service/ubs/UBSManagementService.java b/service-api/src/main/java/greencity/service/ubs/UBSManagementService.java index e932e8ac7..09b056099 100644 --- a/service-api/src/main/java/greencity/service/ubs/UBSManagementService.java +++ b/service-api/src/main/java/greencity/service/ubs/UBSManagementService.java @@ -27,7 +27,7 @@ public interface UBSManagementService { * @return {@link PaymentTableInfoDto}; * @author Struk Nazar */ - PaymentTableInfoDto getPaymentInfo(long orderId, Long sumToPay); + PaymentTableInfoDto getPaymentInfo(long orderId, Double sumToPay); /** * Method returns overpayment to user. @@ -35,7 +35,7 @@ public interface UBSManagementService { * @return {@link PaymentTableInfoDto}; * @author Ostap Mykhailivskyi */ - PaymentTableInfoDto returnOverpaymentInfo(Long orderId, Long sumToPay, Long marker); + PaymentTableInfoDto returnOverpaymentInfo(Long orderId, Double sumToPay, Long marker); /** * Method returns all certificates. diff --git a/service-api/src/test/java/greencity/ModelUtils.java b/service-api/src/test/java/greencity/ModelUtils.java index 62a3e47ee..4bd11ed28 100644 --- a/service-api/src/test/java/greencity/ModelUtils.java +++ b/service-api/src/test/java/greencity/ModelUtils.java @@ -101,7 +101,7 @@ public static PaymentRequestDto getPaymentRequestDto() { .merchantId(2) .orderDescription("") .currency("USD") - .amount(2) + .amount(2L) .signature("") .responseUrl("responseUrl") .build(); diff --git a/service/src/main/java/greencity/mapping/bag/BagForUserDtoMapper.java b/service/src/main/java/greencity/mapping/bag/BagForUserDtoMapper.java new file mode 100644 index 000000000..fe66bbe7b --- /dev/null +++ b/service/src/main/java/greencity/mapping/bag/BagForUserDtoMapper.java @@ -0,0 +1,24 @@ +package greencity.mapping.bag; + +import greencity.constant.AppConstant; +import greencity.dto.bag.BagForUserDto; +import greencity.entity.order.Bag; +import org.modelmapper.AbstractConverter; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; + +@Component +public class BagForUserDtoMapper extends AbstractConverter { + @Override + protected BagForUserDto convert(Bag source) { + return BagForUserDto.builder() + .service(source.getName()) + .serviceEng(source.getNameEng()) + .capacity(source.getCapacity()) + .fullPrice(BigDecimal.valueOf(source.getFullPrice()) + .movePointLeft(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY) + .doubleValue()) + .build(); + } +} diff --git a/service/src/main/java/greencity/mapping/bag/BagInfoDtoMapper.java b/service/src/main/java/greencity/mapping/bag/BagInfoDtoMapper.java index 2c266790c..17da92ec6 100644 --- a/service/src/main/java/greencity/mapping/bag/BagInfoDtoMapper.java +++ b/service/src/main/java/greencity/mapping/bag/BagInfoDtoMapper.java @@ -1,10 +1,13 @@ package greencity.mapping.bag; +import greencity.constant.AppConstant; import greencity.dto.bag.BagInfoDto; import greencity.entity.order.Bag; import org.modelmapper.AbstractConverter; import org.springframework.stereotype.Component; +import java.math.BigDecimal; + @Component public class BagInfoDtoMapper extends AbstractConverter { @Override @@ -14,7 +17,8 @@ protected BagInfoDto convert(Bag bag) { .name(bag.getName()) .nameEng(bag.getNameEng()) .capacity(bag.getCapacity()) - .price(bag.getFullPrice()) + .price(BigDecimal.valueOf(bag.getFullPrice()) + .movePointLeft(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY).doubleValue()) .build(); } } diff --git a/service/src/main/java/greencity/mapping/bag/BagTranslationDtoMapper.java b/service/src/main/java/greencity/mapping/bag/BagTranslationDtoMapper.java index 8f9dc596d..806a14594 100644 --- a/service/src/main/java/greencity/mapping/bag/BagTranslationDtoMapper.java +++ b/service/src/main/java/greencity/mapping/bag/BagTranslationDtoMapper.java @@ -1,10 +1,13 @@ package greencity.mapping.bag; +import greencity.constant.AppConstant; import greencity.dto.bag.BagTranslationDto; import greencity.entity.order.Bag; import org.modelmapper.AbstractConverter; import org.springframework.stereotype.Component; +import java.math.BigDecimal; + @Component public class BagTranslationDtoMapper extends AbstractConverter { @Override @@ -12,7 +15,8 @@ protected BagTranslationDto convert(Bag source) { return BagTranslationDto.builder() .id(source.getId()) .capacity(source.getCapacity()) - .price(source.getFullPrice()) + .price(BigDecimal.valueOf(source.getFullPrice()) + .movePointLeft(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY).doubleValue()) .name(source.getName()) .nameEng(source.getNameEng()) .limitedIncluded(source.getLimitIncluded()) diff --git a/service/src/main/java/greencity/mapping/order/BigOrderTableDtoMapper.java b/service/src/main/java/greencity/mapping/order/BigOrderTableDtoMapper.java index 7cece051b..cb030844b 100644 --- a/service/src/main/java/greencity/mapping/order/BigOrderTableDtoMapper.java +++ b/service/src/main/java/greencity/mapping/order/BigOrderTableDtoMapper.java @@ -1,11 +1,15 @@ package greencity.mapping.order; +import greencity.constant.AppConstant; import greencity.dto.order.BigOrderTableDTO; import greencity.dto.order.SenderLocation; import greencity.entity.order.BigOrderTableViews; import org.modelmapper.AbstractConverter; import org.springframework.stereotype.Component; +import java.math.BigDecimal; +import java.math.RoundingMode; + import static java.util.Objects.nonNull; @Component @@ -33,11 +37,11 @@ protected BigOrderTableDTO convert(BigOrderTableViews bigViews) { .setCommentForOrderByClient(bigViews.getCommentForOrderByClient()) .setCommentsForOrder(bigViews.getCommentForOrderByAdmin()) .setBagsAmount(bigViews.getBagAmount()) - .setTotalOrderSum(bigViews.getTotalOrderSum()) + .setTotalOrderSum(convertCoinsIntoBills(bigViews.getTotalOrderSum())) .setOrderCertificateCode(bigViews.getOrderCertificateCode()) .setGeneralDiscount(bigViews.getGeneralDiscount()) - .setAmountDue(bigViews.getAmountDue()) - .setTotalPayment(bigViews.getTotalPayment()) + .setAmountDue(convertCoinsIntoBills(bigViews.getAmountDue())) + .setTotalPayment(convertCoinsIntoBills(bigViews.getTotalPayment())) .setDateOfExport(nonNull(bigViews.getDateOfExport()) ? bigViews.getDateOfExport().toString() : "") .setTimeOfExport(bigViews.getTimeOfExport()) .setIdOrderFromShop(bigViews.getIdOrderFromShop()) @@ -59,4 +63,12 @@ protected BigOrderTableDTO convert(BigOrderTableViews bigViews) { .setIsBlocked(bigViews.getIsBlocked()) .setBlockedBy(bigViews.getBlockedBy()); } + + private Double convertCoinsIntoBills(Long coins) { + return coins == null ? null + : BigDecimal.valueOf(coins) + .movePointLeft(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY) + .setScale(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY, RoundingMode.HALF_UP) + .doubleValue(); + } } diff --git a/service/src/main/java/greencity/mapping/payment/PaymentInfoMapper.java b/service/src/main/java/greencity/mapping/payment/PaymentInfoMapper.java index f1e0c4ec5..a5f698e04 100644 --- a/service/src/main/java/greencity/mapping/payment/PaymentInfoMapper.java +++ b/service/src/main/java/greencity/mapping/payment/PaymentInfoMapper.java @@ -1,10 +1,13 @@ package greencity.mapping.payment; +import greencity.constant.AppConstant; import greencity.dto.payment.PaymentInfoDto; import greencity.entity.order.Payment; import org.modelmapper.AbstractConverter; import org.springframework.stereotype.Component; +import java.math.BigDecimal; + @Component public class PaymentInfoMapper extends AbstractConverter { /** @@ -17,7 +20,9 @@ protected PaymentInfoDto convert(Payment source) { return PaymentInfoDto.builder() .id(source.getId()) .paymentId(source.getPaymentId()) - .amount(source.getAmount().doubleValue()) + .amount(BigDecimal.valueOf(source.getAmount()) + .movePointLeft(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY) + .doubleValue()) .settlementdate(source.getSettlementDate()) .comment(source.getComment()) .receiptLink(source.getReceiptLink()) diff --git a/service/src/main/java/greencity/mapping/service/GetServiceDtoMapper.java b/service/src/main/java/greencity/mapping/service/GetServiceDtoMapper.java index e5130e139..52d358f50 100644 --- a/service/src/main/java/greencity/mapping/service/GetServiceDtoMapper.java +++ b/service/src/main/java/greencity/mapping/service/GetServiceDtoMapper.java @@ -1,17 +1,21 @@ package greencity.mapping.service; +import greencity.constant.AppConstant; import greencity.dto.service.GetServiceDto; import greencity.entity.order.Service; import org.modelmapper.AbstractConverter; import org.springframework.stereotype.Component; +import java.math.BigDecimal; + @Component public class GetServiceDtoMapper extends AbstractConverter { @Override protected GetServiceDto convert(Service source) { return GetServiceDto.builder() .id(source.getId()) - .price(source.getPrice()) + .price(BigDecimal.valueOf(source.getPrice()) + .movePointLeft(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY).doubleValue()) .name(source.getName()) .nameEng(source.getNameEng()) .description(source.getDescription()) diff --git a/service/src/main/java/greencity/mapping/service/GetServiceDtoToServiceMapper.java b/service/src/main/java/greencity/mapping/service/GetServiceDtoToServiceMapper.java new file mode 100644 index 000000000..7115e21ca --- /dev/null +++ b/service/src/main/java/greencity/mapping/service/GetServiceDtoToServiceMapper.java @@ -0,0 +1,28 @@ +package greencity.mapping.service; + +import greencity.constant.AppConstant; +import greencity.dto.service.GetServiceDto; +import greencity.entity.order.Service; +import org.modelmapper.AbstractConverter; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +@Component +public class GetServiceDtoToServiceMapper extends AbstractConverter { + @Override + protected Service convert(GetServiceDto source) { + return Service.builder() + .id(source.getId()) + .price(BigDecimal.valueOf(source.getPrice()) + .movePointRight(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY) + .setScale(AppConstant.NO_DECIMALS_AFTER_POINT_IN_CURRENCY, RoundingMode.HALF_UP) + .longValue()) + .name(source.getName()) + .nameEng(source.getNameEng()) + .description(source.getDescription()) + .descriptionEng(source.getDescriptionEng()) + .build(); + } +} diff --git a/service/src/main/java/greencity/mapping/service/GetTariffServiceDtoMapper.java b/service/src/main/java/greencity/mapping/service/GetTariffServiceDtoMapper.java index 4c64a8623..52d679727 100644 --- a/service/src/main/java/greencity/mapping/service/GetTariffServiceDtoMapper.java +++ b/service/src/main/java/greencity/mapping/service/GetTariffServiceDtoMapper.java @@ -1,10 +1,13 @@ package greencity.mapping.service; +import greencity.constant.AppConstant; import greencity.dto.service.GetTariffServiceDto; import greencity.entity.order.Bag; import org.modelmapper.AbstractConverter; import org.springframework.stereotype.Component; +import java.math.BigDecimal; + @Component public class GetTariffServiceDtoMapper extends AbstractConverter { @Override @@ -12,9 +15,9 @@ protected GetTariffServiceDto convert(Bag source) { return GetTariffServiceDto.builder() .id(source.getId()) .capacity(source.getCapacity()) - .price(source.getPrice()) - .fullPrice(source.getFullPrice()) - .commission(source.getCommission()) + .price(convertIntoBills(source.getPrice())) + .commission(convertIntoBills(source.getCommission())) + .fullPrice(convertIntoBills(source.getFullPrice())) .name(source.getName()) .nameEng(source.getNameEng()) .description(source.getDescription()) @@ -22,4 +25,10 @@ protected GetTariffServiceDto convert(Bag source) { .limitIncluded(source.getLimitIncluded()) .build(); } + + private Double convertIntoBills(Long coins) { + return BigDecimal.valueOf(coins) + .movePointLeft(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY) + .doubleValue(); + } } diff --git a/service/src/main/java/greencity/mapping/service/TariffServiceDtoMapper.java b/service/src/main/java/greencity/mapping/service/TariffServiceDtoMapper.java index f11d13a43..5de90b0fe 100644 --- a/service/src/main/java/greencity/mapping/service/TariffServiceDtoMapper.java +++ b/service/src/main/java/greencity/mapping/service/TariffServiceDtoMapper.java @@ -1,22 +1,31 @@ package greencity.mapping.service; +import greencity.constant.AppConstant; import greencity.dto.service.TariffServiceDto; import greencity.entity.order.Bag; import org.modelmapper.AbstractConverter; import org.springframework.stereotype.Component; +import java.math.BigDecimal; + @Component public class TariffServiceDtoMapper extends AbstractConverter { @Override protected TariffServiceDto convert(Bag source) { return TariffServiceDto.builder() .capacity(source.getCapacity()) - .price(source.getPrice()) - .commission(source.getCommission()) + .price(convertIntoBills(source.getPrice())) + .commission(convertIntoBills(source.getCommission())) .name(source.getName()) .nameEng(source.getNameEng()) .description(source.getDescription()) .descriptionEng(source.getDescriptionEng()) .build(); } + + private Double convertIntoBills(Long coins) { + return BigDecimal.valueOf(coins) + .movePointLeft(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY) + .doubleValue(); + } } diff --git a/service/src/main/java/greencity/mapping/service/TariffServiceDtoToBagMapper.java b/service/src/main/java/greencity/mapping/service/TariffServiceDtoToBagMapper.java new file mode 100644 index 000000000..48a311476 --- /dev/null +++ b/service/src/main/java/greencity/mapping/service/TariffServiceDtoToBagMapper.java @@ -0,0 +1,37 @@ +package greencity.mapping.service; + +import greencity.constant.AppConstant; +import greencity.dto.service.TariffServiceDto; +import greencity.entity.order.Bag; +import org.modelmapper.AbstractConverter; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; + +@Component +public class TariffServiceDtoToBagMapper extends AbstractConverter { + @Override + protected Bag convert(TariffServiceDto source) { + return Bag.builder() + .capacity(source.getCapacity()) + .price(convertIntoCoins(source.getPrice())) + .commission(convertIntoCoins(source.getCommission())) + .fullPrice(convertIntoCoins(source.getPrice() + source.getCommission())) + .limitIncluded(false) + .name(source.getName()) + .nameEng(source.getNameEng()) + .description(source.getDescription()) + .descriptionEng(source.getDescriptionEng()) + .createdAt(LocalDate.now()) + .build(); + } + + private Long convertIntoCoins(Double bills) { + return BigDecimal.valueOf(bills) + .movePointRight(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY) + .setScale(AppConstant.NO_DECIMALS_AFTER_POINT_IN_CURRENCY, RoundingMode.HALF_UP) + .longValue(); + } +} diff --git a/service/src/main/java/greencity/service/notification/NotificationServiceImpl.java b/service/src/main/java/greencity/service/notification/NotificationServiceImpl.java index 4cf6d8dc4..4cd1b2453 100644 --- a/service/src/main/java/greencity/service/notification/NotificationServiceImpl.java +++ b/service/src/main/java/greencity/service/notification/NotificationServiceImpl.java @@ -88,7 +88,7 @@ public void notifyUnpaidOrders() { if (checkIfUnpaidOrderNeedsNewNotification(order, lastNotification)) { UserNotification userNotification = new UserNotification(); userNotification.setUser(order.getUser()); - BigDecimal amountToPay = getAmountToPay(order); + Double amountToPay = getAmountToPay(order); Set notificationParameters = initialiseNotificationParametersForUnpaidOrder(order, amountToPay); fillAndSendNotification(notificationParameters, order, NotificationType.UNPAID_ORDER); @@ -107,7 +107,7 @@ private boolean checkIfUnpaidOrderNeedsNewNotification(Order order, Optional initialiseNotificationParametersForUnpaidOrder(Order order, - BigDecimal amountToPay) { + Double amountToPay) { Set parameters = new HashSet<>(); parameters.add(NotificationParameter.builder() @@ -178,7 +178,7 @@ public void notifyCourierItineraryFormed(Order order) { */ @Override public void notifyHalfPaidPackage(Order order) { - BigDecimal amountToPay = getAmountToPay(order); + Double amountToPay = getAmountToPay(order); Set parameters = initialiseNotificationParametersForUnpaidOrder(order, amountToPay); if (order.getOrderStatus() == OrderStatus.BROUGHT_IT_HIMSELF) { @@ -197,7 +197,7 @@ public void notifyHalfPaidPackage(Order order) { @Override public void notifyUnpaidOrder(Order order) { - BigDecimal amountToPay = getAmountToPay(order); + Double amountToPay = getAmountToPay(order); Set parameters = initialiseNotificationParametersForUnpaidOrder(order, amountToPay); if (order.getOrderStatus() == OrderStatus.BROUGHT_IT_HIMSELF @@ -215,27 +215,21 @@ public void notifyUnpaidOrder(Order order) { } } - private BigDecimal getAmountToPay(Order order) { - long bonuses = order.getPointsToUse() == null ? 0L : order.getPointsToUse().longValue(); - long certificates = order.getCertificates() == null ? 0L - : order.getCertificates().stream() + private Double getAmountToPay(Order order) { + long bonusesInCoins = order.getPointsToUse() == null ? 0L : order.getPointsToUse() * 100L; + long certificatesInCoins = order.getCertificates() == null ? 0L + : 100L * order.getCertificates().stream() .map(Certificate::getPoints) - .reduce(0, Integer::sum) - .longValue(); + .reduce(0, Integer::sum); - long paidAmountCoins = order.getPayment() == null ? 0L + long paidAmountInCoins = order.getPayment() == null ? 0L : order.getPayment().stream() .filter(payment -> payment.getPaymentStatus() == PaymentStatus.PAID) .map(Payment::getAmount) .reduce(0L, Long::sum); - int amountOfDecimalsAfterPoint = 2; - BigDecimal paidAmountUah = - new BigDecimal(paidAmountCoins).divide(AppConstant.AMOUNT_OF_COINS_IN_ONE_UAH, - amountOfDecimalsAfterPoint, RoundingMode.HALF_UP); - - long ubsCourierSum = order.getUbsCourierSum() == null ? 0L : order.getUbsCourierSum(); - long writeStationSum = order.getWriteOffStationSum() == null ? 0L : order.getWriteOffStationSum(); + long ubsCourierSumInCoins = order.getUbsCourierSum() == null ? 0L : order.getUbsCourierSum(); + long writeStationSumInCoins = order.getWriteOffStationSum() == null ? 0L : order.getWriteOffStationSum(); List bagsType = bagRepository.findBagsByOrderId(order.getId()); Map bagsAmount; @@ -247,16 +241,18 @@ private BigDecimal getAmountToPay(Order order) { bagsAmount = order.getAmountOfBagsOrdered(); } - long totalPrice = bagsAmount.entrySet().stream() + long totalPriceInCoins = bagsAmount.entrySet().stream() .map(entry -> entry.getValue() * getBagPrice(entry.getKey(), bagsType)) - .reduce(0, Integer::sum) - .longValue(); + .reduce(0L, Long::sum); - long unPaidAmount = totalPrice - bonuses - certificates + ubsCourierSum + writeStationSum; - return new BigDecimal(unPaidAmount).subtract(paidAmountUah); + long unPaidAmountInCoins = totalPriceInCoins - bonusesInCoins - certificatesInCoins + ubsCourierSumInCoins + + writeStationSumInCoins; + return BigDecimal.valueOf(unPaidAmountInCoins - paidAmountInCoins) + .movePointLeft(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY) + .setScale(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY, RoundingMode.HALF_UP).doubleValue(); } - private int getBagPrice(Integer bagId, List bagsType) { + private long getBagPrice(Integer bagId, List bagsType) { return bagsType.stream() .filter(b -> b.getId().equals(bagId)) .findFirst() diff --git a/service/src/main/java/greencity/service/ubs/OrdersForUserServiceImpl.java b/service/src/main/java/greencity/service/ubs/OrdersForUserServiceImpl.java index b9757f1e2..f0b62f586 100644 --- a/service/src/main/java/greencity/service/ubs/OrdersForUserServiceImpl.java +++ b/service/src/main/java/greencity/service/ubs/OrdersForUserServiceImpl.java @@ -1,5 +1,6 @@ package greencity.service.ubs; +import greencity.constant.AppConstant; import greencity.dto.order.UserOrdersDto; import greencity.dto.order.UserWithOrdersDto; import greencity.enums.SortingOrder; @@ -12,6 +13,7 @@ import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.util.List; import java.util.stream.Collectors; @@ -36,7 +38,10 @@ public UserWithOrdersDto getAllOrders(Pageable page, Long userId, SortingOrder s private UserOrdersDto getAllOrders(Order order) { return UserOrdersDto.builder() .id(order.getId()) - .amount(order.getSumTotalAmountWithoutDiscounts()) + .amount(order.getSumTotalAmountWithoutDiscounts() == null + ? null + : BigDecimal.valueOf(order.getSumTotalAmountWithoutDiscounts()) + .movePointLeft(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY).doubleValue()) .orderDate(order.getOrderDate()) .orderStatus(order.getOrderStatus()) .orderPaymentStatus(order.getOrderPaymentStatus()) diff --git a/service/src/main/java/greencity/service/ubs/SuperAdminServiceImpl.java b/service/src/main/java/greencity/service/ubs/SuperAdminServiceImpl.java index 0e397e49f..8e1efef4d 100644 --- a/service/src/main/java/greencity/service/ubs/SuperAdminServiceImpl.java +++ b/service/src/main/java/greencity/service/ubs/SuperAdminServiceImpl.java @@ -1,5 +1,6 @@ package greencity.service.ubs; +import greencity.constant.AppConstant; import greencity.constant.ErrorMessage; import greencity.dto.AddNewTariffDto; import greencity.dto.DetailsOfDeactivateTariffsDto; @@ -63,6 +64,8 @@ import org.modelmapper.ModelMapper; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.LocalDate; import java.util.ArrayList; import java.util.Comparator; @@ -119,28 +122,18 @@ public GetTariffServiceDto addTariffService(long tariffId, TariffServiceDto dto, } private Bag createBag(long tariffId, TariffServiceDto dto, String employeeUuid) { - TariffsInfo tariffsInfo = getTariffById(tariffId); - Employee employee = getEmployeeByUuid(employeeUuid); - return Bag.builder() - .price(dto.getPrice()) - .capacity(dto.getCapacity()) - .commission(dto.getCommission()) - .fullPrice(getFullPrice(dto.getPrice(), dto.getCommission())) - .limitIncluded(false) - .name(dto.getName()) - .nameEng(dto.getNameEng()) - .description(dto.getDescription()) - .descriptionEng(dto.getDescriptionEng()) - .tariffsInfo(tariffsInfo) - .createdAt(LocalDate.now()) - .createdBy(employee) - .build(); + TariffsInfo tariffsInfo = tryToFindTariffById(tariffId); + Employee employee = tryToFindEmployeeByUuid(employeeUuid); + Bag bag = modelMapper.map(dto, Bag.class); + bag.setTariffsInfo(tariffsInfo); + bag.setCreatedBy(employee); + return bag; } @Override public List getTariffService(long tariffId) { if (tariffsInfoRepository.existsById(tariffId)) { - return bagRepository.getAllByTariffsInfoId(tariffId) + return bagRepository.findBagsByTariffsInfoId(tariffId) .stream() .map(it -> modelMapper.map(it, GetTariffServiceDto.class)) .collect(Collectors.toList()); @@ -169,10 +162,10 @@ public void deleteTariffService(Integer bagId) { @Override public GetTariffServiceDto editTariffService(TariffServiceDto dto, Integer id, String employeeUuid) { Bag bag = tryToFindBagById(id); - Employee employee = getEmployeeByUuid(employeeUuid); + Employee employee = tryToFindEmployeeByUuid(employeeUuid); bag.setCapacity(dto.getCapacity()); - bag.setPrice(dto.getPrice()); - bag.setCommission(dto.getCommission()); + bag.setPrice(convertBillsIntoCoins(dto.getPrice())); + bag.setCommission(convertBillsIntoCoins(dto.getCommission())); bag.setFullPrice(getFullPrice(dto.getPrice(), dto.getCommission())); bag.setName(dto.getName()); bag.setNameEng(dto.getNameEng()); @@ -183,11 +176,24 @@ public GetTariffServiceDto editTariffService(TariffServiceDto dto, Integer id, S return modelMapper.map(bagRepository.save(bag), GetTariffServiceDto.class); } + private Long convertBillsIntoCoins(Double bills) { + return bills == null + ? 0 + : BigDecimal.valueOf(bills) + .movePointRight(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY) + .setScale(AppConstant.NO_DECIMALS_AFTER_POINT_IN_CURRENCY, RoundingMode.HALF_UP) + .longValue(); + } + private Bag tryToFindBagById(Integer id) { return bagRepository.findById(id) .orElseThrow(() -> new NotFoundException(ErrorMessage.BAG_NOT_FOUND + id)); } + private Long getFullPrice(Double price, Double commission) { + return convertBillsIntoCoins(price) + convertBillsIntoCoins(commission); + } + @Override public GetServiceDto addService(Long tariffId, ServiceDto dto, String employeeUuid) { Service service = serviceRepository.save(createService(tariffId, dto, employeeUuid)); @@ -195,19 +201,14 @@ public GetServiceDto addService(Long tariffId, ServiceDto dto, String employeeUu } private Service createService(Long tariffId, ServiceDto dto, String employeeUuid) { - if (getServiceByTariffsInfoId(tariffId).isEmpty()) { - Employee employee = getEmployeeByUuid(employeeUuid); - TariffsInfo tariffsInfo = getTariffById(tariffId); - return Service.builder() - .price(dto.getPrice()) - .createdAt(LocalDate.now()) - .createdBy(employee) - .name(dto.getName()) - .nameEng(dto.getNameEng()) - .description(dto.getDescription()) - .descriptionEng(dto.getDescriptionEng()) - .tariffsInfo(tariffsInfo) - .build(); + if (tryToFindServiceByTariffsInfoId(tariffId).isEmpty()) { + Employee employee = tryToFindEmployeeByUuid(employeeUuid); + TariffsInfo tariffsInfo = tryToFindTariffById(tariffId); + Service service = modelMapper.map(dto, Service.class); + service.setCreatedBy(employee); + service.setCreatedAt(LocalDate.now()); + service.setTariffsInfo(tariffsInfo); + return service; } else { throw new ServiceAlreadyExistsException(ErrorMessage.SERVICE_ALREADY_EXISTS + tariffId); } @@ -215,37 +216,36 @@ private Service createService(Long tariffId, ServiceDto dto, String employeeUuid @Override public GetServiceDto getService(long tariffId) { - return getServiceByTariffsInfoId(tariffId) + return tryToFindServiceByTariffsInfoId(tariffId) .map(it -> modelMapper.map(it, GetServiceDto.class)) .orElse(null); } @Override public void deleteService(long id) { - serviceRepository.delete(getServiceById(id)); + serviceRepository.delete(tryToFindServiceById(id)); } @Override public GetServiceDto editService(Long id, ServiceDto dto, String employeeUuid) { - Service service = getServiceById(id); - Employee employee = getEmployeeByUuid(employeeUuid); - service.setPrice(dto.getPrice()); + Service service = tryToFindServiceById(id); + Employee employee = tryToFindEmployeeByUuid(employeeUuid); + service.setPrice(convertBillsIntoCoins(dto.getPrice())); service.setName(dto.getName()); service.setNameEng(dto.getNameEng()); service.setDescription(dto.getDescription()); service.setDescriptionEng(dto.getDescriptionEng()); service.setEditedAt(LocalDate.now()); service.setEditedBy(employee); - serviceRepository.save(service); - return modelMapper.map(service, GetServiceDto.class); + return modelMapper.map(serviceRepository.save(service), GetServiceDto.class); } - private Employee getEmployeeByUuid(String employeeUuid) { + private Employee tryToFindEmployeeByUuid(String employeeUuid) { return employeeRepository.findByUuid(employeeUuid) .orElseThrow(() -> new NotFoundException(ErrorMessage.EMPLOYEE_WITH_UUID_NOT_FOUND + employeeUuid)); } - private Optional getServiceByTariffsInfoId(long tariffId) { + private Optional tryToFindServiceByTariffsInfoId(long tariffId) { if (tariffsInfoRepository.existsById(tariffId)) { return serviceRepository.findServiceByTariffsInfoId(tariffId); } else { @@ -253,12 +253,12 @@ private Optional getServiceByTariffsInfoId(long tariffId) { } } - private Service getServiceById(long id) { + private Service tryToFindServiceById(long id) { return serviceRepository.findById(id) .orElseThrow(() -> new NotFoundException(ErrorMessage.SERVICE_IS_NOT_FOUND_BY_ID + id)); } - private TariffsInfo getTariffById(long id) { + private TariffsInfo tryToFindTariffById(long id) { return tariffsInfoRepository.findById(id) .orElseThrow(() -> new NotFoundException(ErrorMessage.TARIFF_NOT_FOUND + id)); } @@ -413,10 +413,6 @@ public CourierDto deactivateCourier(Long id) { return modelMapper.map(courier, CourierDto.class); } - private Integer getFullPrice(Integer price, Integer commission) { - return price + commission; - } - @Override public List getAllTariffsInfo(TariffsInfoFilterCriteria filterCriteria) { List tariffs = tariffsInfoRepository.findAll(new TariffsInfoSpecification(filterCriteria)); @@ -428,19 +424,22 @@ public List getAllTariffsInfo(TariffsInfoFilterCriteria filte } private Region createRegionWithTranslation(LocationCreateDto dto) { - String enName = dto.getRegionTranslationDtos().stream().filter(x -> x.getLanguageCode().equals("en")).findAny() - .orElseThrow(() -> new NotFoundException(ErrorMessage.LANGUAGE_ERROR)) - .getRegionName(); - String uaName = dto.getRegionTranslationDtos().stream().filter(x -> x.getLanguageCode().equals("ua")).findAny() - .orElseThrow(() -> new NotFoundException(ErrorMessage.LANGUAGE_ERROR)) - .getRegionName(); - + String enName = getRegionTranslation(dto, "en"); + String uaName = getRegionTranslation(dto, "ua"); return Region.builder() .enName(enName) .ukrName(uaName) .build(); } + private String getRegionTranslation(LocationCreateDto dto, String languageCode) { + return dto.getRegionTranslationDtos().stream() + .filter(x -> x.getLanguageCode().equals(languageCode)) + .findAny() + .orElseThrow(() -> new NotFoundException(ErrorMessage.LANGUAGE_ERROR)) + .getRegionName(); + } + private Location tryToFindLocationById(Long id) { return locationRepository.findById(id).orElseThrow( () -> new NotFoundException(ErrorMessage.LOCATION_DOESNT_FOUND_BY_ID + id)); @@ -520,11 +519,6 @@ private Set findReceivingStationsForTariff(List receivin return receivingStations; } - private TariffsInfo tryToFindTariffById(Long tariffId) { - return tariffsInfoRepository.findById(tariffId) - .orElseThrow(() -> new NotFoundException(ErrorMessage.TARIFF_NOT_FOUND + tariffId)); - } - @Override @Transactional public AddNewTariffResponseDto addNewTariff(AddNewTariffDto addNewTariffDto, String userUUID) { diff --git a/service/src/main/java/greencity/service/ubs/UBSClientServiceImpl.java b/service/src/main/java/greencity/service/ubs/UBSClientServiceImpl.java index 5c3d3d705..6bd1099c5 100644 --- a/service/src/main/java/greencity/service/ubs/UBSClientServiceImpl.java +++ b/service/src/main/java/greencity/service/ubs/UBSClientServiceImpl.java @@ -1,96 +1,11 @@ package greencity.service.ubs; -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.function.Consumer; -import java.util.stream.Collectors; -import java.util.stream.IntStream; -import java.util.stream.LongStream; - -import javax.persistence.EntityNotFoundException; -import javax.transaction.Transactional; - -import greencity.constant.AppConstant; -import greencity.constant.ErrorMessage; -import greencity.dto.courier.CourierDto; -import greencity.dto.employee.UserEmployeeAuthorityDto; -import greencity.dto.position.PositionAuthoritiesDto; -import greencity.entity.order.Bag; -import greencity.entity.order.Certificate; -import greencity.entity.order.ChangeOfPoints; -import greencity.entity.order.Event; -import greencity.entity.order.Order; -import greencity.entity.order.OrderPaymentStatusTranslation; -import greencity.entity.order.OrderStatusTranslation; -import greencity.entity.order.Payment; -import greencity.entity.order.TariffsInfo; -import greencity.entity.telegram.TelegramBot; -import greencity.entity.user.employee.Employee; -import greencity.entity.user.ubs.OrderAddress; -import greencity.entity.viber.ViberBot; -import greencity.enums.AddressStatus; -import greencity.enums.BotType; -import greencity.enums.CertificateStatus; -import greencity.enums.CourierLimit; -import greencity.enums.LocationStatus; -import greencity.enums.OrderPaymentStatus; -import greencity.enums.OrderStatus; -import greencity.enums.PaymentStatus; -import greencity.enums.TariffStatus; - -import greencity.repository.AddressRepository; -import greencity.repository.BagRepository; -import greencity.repository.CertificateRepository; -import greencity.repository.CourierRepository; -import greencity.repository.EmployeeRepository; -import greencity.repository.EventRepository; -import greencity.repository.LocationRepository; -import greencity.repository.OrderAddressRepository; -import greencity.repository.OrderPaymentStatusTranslationRepository; -import greencity.repository.OrderRepository; -import greencity.repository.OrderStatusTranslationRepository; -import greencity.repository.OrdersForUserRepository; -import greencity.repository.PaymentRepository; -import greencity.repository.RegionRepository; -import greencity.repository.TariffLocationRepository; -import greencity.repository.TariffsInfoRepository; -import greencity.repository.TelegramBotRepository; -import greencity.repository.UBSuserRepository; -import greencity.repository.UserRepository; -import greencity.repository.ViberBotRepository; -import lombok.Data; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.MapUtils; -import org.json.JSONObject; -import org.modelmapper.ModelMapper; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Lazy; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; - import com.google.maps.model.AddressComponentType; import com.google.maps.model.GeocodingResult; - import greencity.client.FondyClient; import greencity.client.UserRemoteClient; +import greencity.constant.AppConstant; +import greencity.constant.ErrorMessage; import greencity.constant.OrderHistory; import greencity.dto.AllActiveLocationsDto; import greencity.dto.CreateAddressRequestDto; @@ -105,8 +20,10 @@ import greencity.dto.bag.BagOrderDto; import greencity.dto.bag.BagTranslationDto; import greencity.dto.certificate.CertificateDto; +import greencity.dto.courier.CourierDto; import greencity.dto.customer.UbsCustomersDto; import greencity.dto.customer.UbsCustomersDtoUpdate; +import greencity.dto.employee.UserEmployeeAuthorityDto; import greencity.dto.notification.SenderInfoDto; import greencity.dto.order.EventDto; import greencity.dto.order.FondyOrderResponse; @@ -124,31 +41,110 @@ import greencity.dto.payment.FondyPaymentResponse; import greencity.dto.payment.PaymentRequestDto; import greencity.dto.payment.PaymentResponseDto; +import greencity.dto.position.PositionAuthoritiesDto; import greencity.dto.user.AllPointsUserDto; import greencity.dto.user.PersonalDataDto; import greencity.dto.user.PointsForUbsUserDto; import greencity.dto.user.UserInfoDto; import greencity.dto.user.UserPointDto; import greencity.dto.user.UserPointsAndAllBagsDto; +import greencity.dto.user.UserProfileCreateDto; import greencity.dto.user.UserProfileDto; import greencity.dto.user.UserProfileUpdateDto; -import greencity.dto.user.UserProfileCreateDto; import greencity.entity.coords.Coordinates; +import greencity.entity.order.Bag; +import greencity.entity.order.Certificate; +import greencity.entity.order.ChangeOfPoints; +import greencity.entity.order.Event; +import greencity.entity.order.Order; +import greencity.entity.order.OrderPaymentStatusTranslation; +import greencity.entity.order.OrderStatusTranslation; +import greencity.entity.order.Payment; +import greencity.entity.order.TariffsInfo; +import greencity.entity.telegram.TelegramBot; import greencity.entity.user.Location; import greencity.entity.user.User; +import greencity.entity.user.employee.Employee; import greencity.entity.user.ubs.Address; +import greencity.entity.user.ubs.OrderAddress; import greencity.entity.user.ubs.UBSuser; +import greencity.entity.viber.ViberBot; +import greencity.enums.AddressStatus; +import greencity.enums.BotType; +import greencity.enums.CertificateStatus; +import greencity.enums.CourierLimit; +import greencity.enums.LocationStatus; +import greencity.enums.OrderPaymentStatus; +import greencity.enums.OrderStatus; +import greencity.enums.PaymentStatus; +import greencity.enums.TariffStatus; import greencity.exceptions.BadRequestException; import greencity.exceptions.NotFoundException; import greencity.exceptions.certificate.CertificateIsNotActivated; import greencity.exceptions.http.AccessDeniedException; import greencity.exceptions.user.UBSuserNotFoundException; import greencity.exceptions.user.UserNotFoundException; +import greencity.repository.AddressRepository; +import greencity.repository.BagRepository; +import greencity.repository.CertificateRepository; +import greencity.repository.CourierRepository; +import greencity.repository.EmployeeRepository; +import greencity.repository.EventRepository; +import greencity.repository.LocationRepository; +import greencity.repository.OrderAddressRepository; +import greencity.repository.OrderPaymentStatusTranslationRepository; +import greencity.repository.OrderRepository; +import greencity.repository.OrderStatusTranslationRepository; +import greencity.repository.OrdersForUserRepository; +import greencity.repository.PaymentRepository; +import greencity.repository.RegionRepository; +import greencity.repository.TariffLocationRepository; +import greencity.repository.TariffsInfoRepository; +import greencity.repository.TelegramBotRepository; +import greencity.repository.UBSuserRepository; +import greencity.repository.UserRepository; +import greencity.repository.ViberBotRepository; import greencity.service.google.GoogleApiService; import greencity.service.phone.UAPhoneNumberUtil; import greencity.util.Bot; import greencity.util.EncryptionUtil; import greencity.util.OrderUtils; +import lombok.Data; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.json.JSONObject; +import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import javax.persistence.EntityNotFoundException; +import javax.transaction.Transactional; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.LongStream; import static greencity.constant.ErrorMessage.ACTUAL_ADDRESS_NOT_FOUND; import static greencity.constant.ErrorMessage.ADDRESS_ALREADY_EXISTS; @@ -193,6 +189,7 @@ import static greencity.constant.ErrorMessage.USER_DONT_HAVE_ENOUGH_POINTS; import static greencity.constant.ErrorMessage.USER_WITH_CURRENT_ID_DOES_NOT_EXIST; import static greencity.constant.ErrorMessage.USER_WITH_CURRENT_UUID_DOES_NOT_EXIST; + import static java.util.Objects.nonNull; import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.toList; @@ -398,14 +395,14 @@ public CertificateDto checkCertificate(String code) { return modelMapper.map(certificate, CertificateDto.class); } - private void checkSumIfCourierLimitBySumOfOrder(TariffsInfo courierLocation, Integer sumWithoutDiscount) { - if (CourierLimit.LIMIT_BY_SUM_OF_ORDER.equals(courierLocation.getCourierLimit()) - && sumWithoutDiscount < courierLocation.getMin()) { - throw new BadRequestException(PRICE_OF_ORDER_LOWER_THAN_LIMIT + courierLocation.getMin()); - } else if (CourierLimit.LIMIT_BY_SUM_OF_ORDER.equals(courierLocation.getCourierLimit()) - && sumWithoutDiscount > courierLocation.getMax()) { + private void checkSumIfCourierLimitBySumOfOrder(TariffsInfo tariffsInfo, Long sumWithoutDiscountInCoins) { + if (CourierLimit.LIMIT_BY_SUM_OF_ORDER.equals(tariffsInfo.getCourierLimit()) + && sumWithoutDiscountInCoins < tariffsInfo.getMin() * 100) { + throw new BadRequestException(PRICE_OF_ORDER_LOWER_THAN_LIMIT + tariffsInfo.getMin()); + } else if (CourierLimit.LIMIT_BY_SUM_OF_ORDER.equals(tariffsInfo.getCourierLimit()) + && sumWithoutDiscountInCoins > tariffsInfo.getMax() * 100) { throw new BadRequestException( - PRICE_OF_ORDER_GREATER_THAN_LIMIT + courierLocation.getMax()); + PRICE_OF_ORDER_GREATER_THAN_LIMIT + tariffsInfo.getMax()); } } @@ -426,27 +423,27 @@ public FondyOrderResponse saveFullOrderToDB(OrderResponseDto dto, String uuid, L dto.setPointsToUse(0); } - int sumToPayWithoutDiscount = formBagsToBeSavedAndCalculateOrderSum(amountOfBagsOrderedMap, dto.getBags(), - tariffsInfo); - checkSumIfCourierLimitBySumOfOrder(tariffsInfo, sumToPayWithoutDiscount); + long sumToPayWithoutDiscountInCoins = formBagsToBeSavedAndCalculateOrderSum(amountOfBagsOrderedMap, + dto.getBags(), tariffsInfo); + checkSumIfCourierLimitBySumOfOrder(tariffsInfo, sumToPayWithoutDiscountInCoins); checkIfUserHaveEnoughPoints(currentUser.getCurrentPoints(), dto.getPointsToUse()); - int sumToPay = reduceOrderSumDueToUsedPoints(sumToPayWithoutDiscount, dto.getPointsToUse()); + long sumToPayInCoins = reduceOrderSumDueToUsedPoints(sumToPayWithoutDiscountInCoins, dto.getPointsToUse()); Order order = isExistOrder(dto, orderId); order.setTariffsInfo(tariffsInfo); Set orderCertificates = new HashSet<>(); - sumToPay = formCertificatesToBeSavedAndCalculateOrderSum(dto, orderCertificates, order, sumToPay); + sumToPayInCoins = formCertificatesToBeSavedAndCalculateOrderSum(dto, orderCertificates, order, sumToPayInCoins); UBSuser userData = formUserDataToBeSaved(dto.getPersonalData(), dto.getAddressId(), dto.getLocationId(), currentUser); - getOrder(dto, currentUser, amountOfBagsOrderedMap, sumToPay, order, orderCertificates, userData); + getOrder(dto, currentUser, amountOfBagsOrderedMap, sumToPayInCoins, order, orderCertificates, userData); eventService.save(OrderHistory.ORDER_FORMED, OrderHistory.CLIENT, order); - if (sumToPay <= 0 || !dto.isShouldBePaid()) { + if (sumToPayInCoins <= 0 || !dto.isShouldBePaid()) { return getPaymentRequestDto(order, null); } else { - PaymentRequestDto paymentRequestDto = formPaymentRequest(order.getId(), sumToPay); + PaymentRequestDto paymentRequestDto = formPaymentRequest(order.getId(), sumToPayInCoins); String link = getLinkFromFondyCheckoutResponse(fondyClient.getCheckoutResponse(paymentRequestDto)); return getPaymentRequestDto(order, link); } @@ -802,24 +799,22 @@ private OrdersDataForUserDto getOrdersData(Order order) { .getOrderStatusTranslationById((long) order.getOrderStatus().getNumValue()) .orElse(orderStatusTranslationRepository.getOne(1L)); OrderPaymentStatusTranslation paymentStatusTranslation = orderPaymentStatusTranslationRepository - .getById( - (long) order.getOrderPaymentStatus().getStatusValue()); + .getById((long) order.getOrderPaymentStatus().getStatusValue()); - Integer fullPrice = bagForUserDtos.stream() - .map(BagForUserDto::getTotalPrice) - .reduce(0, Integer::sum); + Long fullPriceInCoins = bagForUserDtos.stream() + .map(b -> convertBillsIntoCoins(b.getTotalPrice())) + .reduce(0L, Long::sum); List certificateDtos = order.getCertificates().stream() .map(certificate -> modelMapper.map(certificate, CertificateDto.class)) .collect(toList()); - int amountWithDiscount = fullPrice - order.getPointsToUse() - countCertificatesBonuses(certificateDtos); + Long amountWithDiscountInCoins = fullPriceInCoins + - 100L * (order.getPointsToUse() + countCertificatesBonuses(certificateDtos)); - BigDecimal paidAmount = countPaidAmount(payments); + Long paidAmountInCoins = countPaidAmount(payments); - Double amountBeforePayment = new BigDecimal(amountWithDiscount) - .subtract(paidAmount) - .doubleValue(); + Double amountBeforePayment = convertCoinsIntoBills(amountWithDiscountInCoins - paidAmountInCoins); return OrdersDataForUserDto.builder() .id(order.getId()) @@ -831,8 +826,8 @@ private OrdersDataForUserDto getOrdersData(Order order) { .bags(bagForUserDtos) .additionalOrders(order.getAdditionalOrders()) .amountBeforePayment(amountBeforePayment) - .paidAmount(paidAmount.doubleValue()) - .orderFullPrice(fullPrice.doubleValue()) + .paidAmount(convertCoinsIntoBills(paidAmountInCoins)) + .orderFullPrice(convertCoinsIntoBills(fullPriceInCoins)) .certificate(certificateDtos) .bonuses(order.getPointsToUse().doubleValue()) .sender(senderInfoDtoBuilder(order)) @@ -911,20 +906,16 @@ private Map getActualBagAmountsForOrder(Order order) { private BagForUserDto buildBagForUserDto(Bag bag, int count) { BagForUserDto bagDto = modelMapper.map(bag, BagForUserDto.class); - bagDto.setService(bag.getName()); - bagDto.setServiceEng(bag.getNameEng()); bagDto.setCount(count); - bagDto.setTotalPrice(count * bag.getFullPrice()); + bagDto.setTotalPrice(convertCoinsIntoBills(count * bag.getFullPrice())); return bagDto; } - private BigDecimal countPaidAmount(List payments) { - Long paidAmountInCoins = payments.stream() + private Long countPaidAmount(List payments) { + return payments.stream() .filter(payment -> PaymentStatus.PAID.equals(payment.getPaymentStatus())) .map(Payment::getAmount) .reduce(0L, Long::sum); - return new BigDecimal(paidAmountInCoins).divide(AppConstant.AMOUNT_OF_COINS_IN_ONE_UAH, - AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY, RoundingMode.HALF_UP); } private MakeOrderAgainDto buildOrderBagDto(Order order, List bags) { @@ -935,7 +926,7 @@ private MakeOrderAgainDto buildOrderBagDto(Order order, List bags) { .name(bag.getName()) .nameEng(bag.getNameEng()) .capacity(bag.getCapacity()) - .price(bag.getPrice()) + .price(convertCoinsIntoBills(bag.getPrice())) .bagAmount(order.getAmountOfBagsOrdered().get(bag.getId())) .build()); } @@ -1046,18 +1037,18 @@ private UBSuser updateRecipientDataInOrder(UBSuser ubSuser, UbsCustomersDtoUpdat private Order formAndSaveOrder(Order order, Set orderCertificates, Map amountOfBagsOrderedMap, UBSuser userData, - User currentUser, int sumToPay) { + User currentUser, long sumToPayInCoins) { order.setOrderStatus(OrderStatus.FORMED); order.setCertificates(orderCertificates); order.setAmountOfBagsOrdered(amountOfBagsOrderedMap); order.setUbsUser(userData); order.setUser(currentUser); order.setSumTotalAmountWithoutDiscounts( - (long) formBagsToBeSavedAndCalculateOrderSumClient(amountOfBagsOrderedMap)); - setOrderPaymentStatus(order, sumToPay); + formBagsToBeSavedAndCalculateOrderSumClient(amountOfBagsOrderedMap)); + setOrderPaymentStatus(order, sumToPayInCoins); Payment payment = Payment.builder() - .amount(sumToPay * 100L) + .amount(sumToPayInCoins) .orderStatus("created") .currency("UAH") .paymentStatus(PaymentStatus.UNPAID) @@ -1073,7 +1064,7 @@ private Order formAndSaveOrder(Order order, Set orderCertificates, return order; } - private void setOrderPaymentStatus(Order order, int sumToPay) { + private void setOrderPaymentStatus(Order order, long sumToPay) { if (sumToPay <= 0) { order.setOrderPaymentStatus(OrderPaymentStatus.PAID); } else { @@ -1084,7 +1075,7 @@ private void setOrderPaymentStatus(Order order, int sumToPay) { } } - private PaymentRequestDto formPaymentRequest(Long orderId, int sumToPay) { + private PaymentRequestDto formPaymentRequest(Long orderId, long sumToPayInCoins) { Order order = orderRepository.findById(orderId) .orElseThrow(() -> new NotFoundException(ORDER_WITH_CURRENT_ID_DOES_NOT_EXIST)); PaymentRequestDto paymentRequestDto = PaymentRequestDto.builder() @@ -1093,7 +1084,7 @@ private PaymentRequestDto formPaymentRequest(Long orderId, int sumToPay) { + order.getPayment().get(order.getPayment().size() - 1).getId().toString()) .orderDescription("ubs courier") .currency("UAH") - .amount(sumToPay * 100) + .amount(sumToPayInCoins) .responseUrl(resultUrlFondy) .build(); @@ -1146,26 +1137,26 @@ public OrderPaymentDetailDto getOrderPaymentDetail(Long orderId) { } private OrderPaymentDetailDto buildOrderPaymentDetailDto(Order order) { - int certificatePoints = order.getCertificates().stream() + int certificatePointsInCoins = order.getCertificates().stream() .flatMapToInt(c -> IntStream.of(c.getPoints())) .reduce(Integer::sum).orElse(0) * 100; - int pointsToUse = order.getPointsToUse() * 100; - long amount = order.getPayment().stream() + int pointsToUseInCoins = order.getPointsToUse() * 100; + long amountInCoins = order.getPayment().stream() .flatMapToLong(p -> LongStream.of(p.getAmount())) .reduce(Long::sum).orElse(0); String currency = order.getPayment().isEmpty() ? "UAH" : order.getPayment().get(0).getCurrency(); return OrderPaymentDetailDto.builder() - .amount(amount != 0 ? amount + certificatePoints + pointsToUse : 0) - .certificates(-certificatePoints) - .pointsToUse(-pointsToUse) - .amountToPay(amount) + .amount(amountInCoins != 0L ? amountInCoins + certificatePointsInCoins + pointsToUseInCoins : 0L) + .certificates(-certificatePointsInCoins) + .pointsToUse(-pointsToUseInCoins) + .amountToPay(amountInCoins) .currency(currency) .build(); } - private int formCertificatesToBeSavedAndCalculateOrderSum(OrderResponseDto dto, Set orderCertificates, - Order order, int sumToPay) { - if (sumToPay != 0 && dto.getCertificates() != null) { + private long formCertificatesToBeSavedAndCalculateOrderSum(OrderResponseDto dto, Set orderCertificates, + Order order, long sumToPayInCoins) { + if (sumToPayInCoins != 0 && dto.getCertificates() != null) { for (String temp : dto.getCertificates()) { if (dto.getCertificates().size() > 5) { throw new BadRequestException(TOO_MANY_CERTIFICATES); @@ -1175,21 +1166,24 @@ private int formCertificatesToBeSavedAndCalculateOrderSum(OrderResponseDto dto, validateCertificate(certificate); certificate.setOrder(order); orderCertificates.add(certificate); - sumToPay -= certificate.getPoints(); + sumToPayInCoins -= certificate.getPoints() * 100L; certificate.setCertificateStatus(CertificateStatus.USED); certificate.setDateOfUse(LocalDate.now()); - if (dontSendLinkToFondyIf(sumToPay, certificate)) { - sumToPay = 0; + if (dontSendLinkToFondyIf(sumToPayInCoins, certificate)) { + sumToPayInCoins = 0L; } } } - return sumToPay; + return sumToPayInCoins; } - private boolean dontSendLinkToFondyIf(int sumToPay, Certificate certificate) { - if (sumToPay <= 0) { + private boolean dontSendLinkToFondyIf(long sumToPayInCoins, Certificate certificate) { + if (sumToPayInCoins <= 0) { certificate.setCertificateStatus(CertificateStatus.USED); - certificate.setPoints(certificate.getPoints() + sumToPay); + certificate.setPoints(certificate.getPoints() + + BigDecimal.valueOf(sumToPayInCoins) + .movePointLeft(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY) + .setScale(0, RoundingMode.UP).intValue()); return true; } return false; @@ -1206,22 +1200,22 @@ private void checkAmountOfBagsIfCourierLimitByAmountOfBag(TariffsInfo courierLoc } } - private int formBagsToBeSavedAndCalculateOrderSumClient( + private long formBagsToBeSavedAndCalculateOrderSumClient( Map getOrderBagsAndQuantity) { - int sumToPay = 0; + long sumToPayInCoins = 0L; for (Map.Entry temp : getOrderBagsAndQuantity.entrySet()) { Integer amount = getOrderBagsAndQuantity.get(temp.getKey()); Bag bag = bagRepository.findById(temp.getKey()) .orElseThrow(() -> new NotFoundException(BAG_NOT_FOUND + temp.getKey())); - sumToPay += bag.getFullPrice() * amount; + sumToPayInCoins += bag.getFullPrice() * amount; } - return sumToPay; + return sumToPayInCoins; } - private int formBagsToBeSavedAndCalculateOrderSum( - Map map, List bags, TariffsInfo courierLocation) { - int sumToPay = 0; + private long formBagsToBeSavedAndCalculateOrderSum( + Map map, List bags, TariffsInfo tariffsInfo) { + long sumToPayInCoins = 0L; int bigBagCounter = 0; for (BagDto temp : bags) { @@ -1229,12 +1223,12 @@ private int formBagsToBeSavedAndCalculateOrderSum( if (bag.getCapacity() >= BAG_CAPACITY) { bigBagCounter += temp.getAmount(); } - sumToPay += bag.getFullPrice() * temp.getAmount(); + sumToPayInCoins += bag.getFullPrice() * temp.getAmount(); map.put(temp.getId(), temp.getAmount()); } - checkAmountOfBagsIfCourierLimitByAmountOfBag(courierLocation, bigBagCounter); - return sumToPay; + checkAmountOfBagsIfCourierLimitByAmountOfBag(tariffsInfo, bigBagCounter); + return sumToPayInCoins; } private void validateCertificate(Certificate certificate) { @@ -1383,16 +1377,16 @@ public OrderCancellationReasonDto updateOrderCancellationReason( return dto; } - private int reduceOrderSumDueToUsedPoints(int sumToPay, int pointsToUse) { - if (sumToPay >= pointsToUse) { - sumToPay -= pointsToUse; + private long reduceOrderSumDueToUsedPoints(long sumToPayInCoins, int pointsToUse) { + if (sumToPayInCoins >= pointsToUse * 100L) { + sumToPayInCoins -= pointsToUse * 100L; } - return sumToPay; + return sumToPayInCoins; } private void getOrder(OrderResponseDto dto, User currentUser, Map amountOfBagsOrderedMap, - int sumToPay, Order order, Set orderCertificates, UBSuser userData) { - formAndSaveOrder(order, orderCertificates, amountOfBagsOrderedMap, userData, currentUser, sumToPay); + long sumToPayInCoins, Order order, Set orderCertificates, UBSuser userData) { + formAndSaveOrder(order, orderCertificates, amountOfBagsOrderedMap, userData, currentUser, sumToPayInCoins); formAndSaveUser(currentUser, dto.getPointsToUse(), order); } @@ -1426,7 +1420,8 @@ public OrderStatusPageDto getOrderInfoForSurcharge(Long orderId, String uuid) { orderStatusPageDto.setAmountOfBagsExported(amountBagsOrderExported); Double exportedPrice = orderStatusPageDto.getOrderExportedDiscountedPrice(); Double initialPrice = orderStatusPageDto.getOrderDiscountedPrice(); - orderStatusPageDto.setOrderExportedDiscountedPrice(exportedPrice - initialPrice); + orderStatusPageDto.setOrderExportedDiscountedPrice(BigDecimal.valueOf(exportedPrice - initialPrice) + .setScale(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY, RoundingMode.HALF_UP).doubleValue()); return orderStatusPageDto; } @@ -1446,37 +1441,50 @@ public FondyOrderResponse processOrderFondyClient(OrderFondyClientDto dto, Strin User currentUser = findByIdUserForClient(uuid); checkForNullCounter(order); - BigDecimal sumToPay = calculateSumToPay(dto, order, currentUser); + long sumToPayInCoins = calculateSumToPay(dto, order, currentUser); transferUserPointsToOrder(order, dto.getPointsToUse()); - paymentVerification(sumToPay, order); + paymentVerification(sumToPayInCoins, order); - if (sumToPay.compareTo(BigDecimal.ZERO) <= 0) { + if (sumToPayInCoins <= 0) { return getPaymentRequestDto(order, null); } else { - String link = formedLink(order, sumToPay); + String link = formedLink(order, sumToPayInCoins); return getPaymentRequestDto(order, link); } } - private BigDecimal calculateSumToPay(OrderFondyClientDto dto, Order order, User currentUser) { + private long calculateSumToPay(OrderFondyClientDto dto, Order order, User currentUser) { List bagForUserDtos = bagForUserDtosBuilder(order); - int sumToPay = bagForUserDtos.stream() - .map(BagForUserDto::getTotalPrice) - .reduce(0, Integer::sum); + long sumToPayInCoins = bagForUserDtos.stream() + .map(b -> convertBillsIntoCoins(b.getTotalPrice())) + .reduce(0L, Long::sum); List certificateDtos = order.getCertificates().stream() .map(certificate -> modelMapper.map(certificate, CertificateDto.class)) .collect(toList()); - sumToPay = - sumToPay - order.getPointsToUse() - countCertificatesBonuses(certificateDtos); + sumToPayInCoins = sumToPayInCoins - 100L * (order.getPointsToUse() + countCertificatesBonuses(certificateDtos)); checkIfUserHaveEnoughPoints(currentUser.getCurrentPoints(), dto.getPointsToUse()); - sumToPay = reduceOrderSumDueToUsedPoints(sumToPay, dto.getPointsToUse()); - sumToPay = formCertificatesToBeSavedAndCalculateOrderSumClient(dto, order, sumToPay); + sumToPayInCoins = reduceOrderSumDueToUsedPoints(sumToPayInCoins, dto.getPointsToUse()); + sumToPayInCoins = formCertificatesToBeSavedAndCalculateOrderSumClient(dto, order, sumToPayInCoins); - return new BigDecimal(sumToPay).subtract(countPaidAmount(order.getPayment())); + return sumToPayInCoins - countPaidAmount(order.getPayment()); + } + + private Long convertBillsIntoCoins(Double bills) { + return BigDecimal.valueOf(bills) + .movePointRight(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY) + .setScale(AppConstant.NO_DECIMALS_AFTER_POINT_IN_CURRENCY, RoundingMode.HALF_UP) + .longValue(); + } + + private Double convertCoinsIntoBills(Long coins) { + return BigDecimal.valueOf(coins) + .movePointLeft(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY) + .setScale(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY, RoundingMode.HALF_UP) + .doubleValue(); } private void checkIsOrderPaid(OrderPaymentStatus orderPaymentStatus) { @@ -1517,11 +1525,14 @@ private int countAmountToPayForOrder(Order order) { .map(Certificate::getPoints) .reduce(0, Integer::sum) : 0; - return order.getSumTotalAmountWithoutDiscounts().intValue() - order.getPointsToUse() - certificatesAmount; + return -order.getPointsToUse() - certificatesAmount + + BigDecimal.valueOf(order.getSumTotalAmountWithoutDiscounts()) + .movePointLeft(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY) + .setScale(0, RoundingMode.UP).intValue(); } - private void paymentVerification(BigDecimal sumToPay, Order order) { - if (sumToPay.compareTo(BigDecimal.ZERO) <= 0) { + private void paymentVerification(long sumToPay, Order order) { + if (sumToPay <= 0) { order.setOrderPaymentStatus(OrderPaymentStatus.PAID); order.setOrderStatus(OrderStatus.CONFIRMED); orderRepository.save(order); @@ -1545,9 +1556,9 @@ private User findByIdUserForClient(String uuid) { .orElseThrow(() -> new UserNotFoundException(USER_WITH_CURRENT_ID_DOES_NOT_EXIST)); } - private String formedLink(Order order, BigDecimal sumToPay) { + private String formedLink(Order order, long sumToPayInCoins) { Order increment = incrementCounter(order); - PaymentRequestDto paymentRequestDto = formPayment(increment.getId(), sumToPay); + PaymentRequestDto paymentRequestDto = formPayment(increment.getId(), sumToPayInCoins); return getLinkFromFondyCheckoutResponse(fondyClient.getCheckoutResponse(paymentRequestDto)); } @@ -1569,17 +1580,16 @@ private Order incrementCounter(Order order) { return order; } - private PaymentRequestDto formPayment(Long orderId, BigDecimal sumToPay) { + private PaymentRequestDto formPayment(Long orderId, long sumToPayInCoins) { Order order = orderRepository.findById(orderId) .orElseThrow(() -> new NotFoundException(ORDER_WITH_CURRENT_ID_DOES_NOT_EXIST)); - BigDecimal coinsAmount = sumToPay.multiply(AppConstant.AMOUNT_OF_COINS_IN_ONE_UAH); PaymentRequestDto paymentRequestDto = PaymentRequestDto.builder() .merchantId(Integer.parseInt(merchantId)) .orderId(OrderUtils.generateOrderIdForPayment(orderId, order)) .orderDescription("courier") .currency("UAH") - .amount(coinsAmount.intValue()) + .amount(sumToPayInCoins) .responseUrl(resultUrlForPersonalCabinetOfUser) .build(); paymentRequestDto.setSignature(encryptionUtil @@ -1587,9 +1597,9 @@ private PaymentRequestDto formPayment(Long orderId, BigDecimal sumToPay) { return paymentRequestDto; } - private int formCertificatesToBeSavedAndCalculateOrderSumClient(OrderFondyClientDto dto, - Order order, int sumToPay) { - if (sumToPay != 0 && dto.getCertificates() != null) { + private long formCertificatesToBeSavedAndCalculateOrderSumClient(OrderFondyClientDto dto, + Order order, long sumToPayInCoins) { + if (sumToPayInCoins != 0 && dto.getCertificates() != null) { Set certificates = certificateRepository.findAllByCodeAndCertificateStatus(new ArrayList<>(dto.getCertificates()), CertificateStatus.ACTIVE); @@ -1599,16 +1609,19 @@ private int formCertificatesToBeSavedAndCalculateOrderSumClient(OrderFondyClient checkValidationCertificates(certificates, dto); for (Certificate temp : certificates) { Certificate certificate = getCertificateForClient(temp, order); - sumToPay -= certificate.getPoints(); + sumToPayInCoins -= certificate.getPoints() * 100L; - if (dontSendLinkToFondyIfClient(sumToPay)) { + if (dontSendLinkToFondyIfClient(sumToPayInCoins)) { certificate.setCertificateStatus(CertificateStatus.USED); - certificate.setPoints(certificate.getPoints() + sumToPay); - sumToPay = 0; + certificate.setPoints(certificate.getPoints() + + BigDecimal.valueOf(sumToPayInCoins) + .movePointLeft(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY) + .setScale(0, RoundingMode.UP).intValue()); + sumToPayInCoins = 0L; } } } - return sumToPay; + return sumToPayInCoins; } private void checkValidationCertificates(Set certificates, OrderFondyClientDto dto) { @@ -1626,7 +1639,7 @@ private Certificate getCertificateForClient(Certificate certificate, return certificate; } - private boolean dontSendLinkToFondyIfClient(int sumToPay) { + private boolean dontSendLinkToFondyIfClient(long sumToPay) { return sumToPay <= 0; } diff --git a/service/src/main/java/greencity/service/ubs/UBSManagementServiceImpl.java b/service/src/main/java/greencity/service/ubs/UBSManagementServiceImpl.java index 9ad2423a3..0ca5c52fa 100644 --- a/service/src/main/java/greencity/service/ubs/UBSManagementServiceImpl.java +++ b/service/src/main/java/greencity/service/ubs/UBSManagementServiceImpl.java @@ -184,36 +184,38 @@ public class UBSManagementServiceImpl implements UBSManagementService { * @author Nazar Struk, Ostap Mykhailivskyi */ @Override - public PaymentTableInfoDto getPaymentInfo(long orderId, Long sumToPay) { + public PaymentTableInfoDto getPaymentInfo(long orderId, Double sumToPay) { Order order = orderRepository.findById(orderId) .orElseThrow(() -> new NotFoundException(ORDER_WITH_CURRENT_ID_DOES_NOT_EXIST + orderId)); - BigDecimal paidAmount = calculatePaidAmount(order); - BigDecimal overpayment = calculateOverpayment(order, sumToPay); - BigDecimal unPaidAmount = calculateUnpaidAmount(order, sumToPay, paidAmount); + Long sumToPayInCoins = convertBillsIntoCoins(sumToPay); + Long paidAmountInCoins = calculatePaidAmount(order); + Long overpaymentInCoins = calculateOverpayment(order, sumToPayInCoins); + Long unPaidAmountInCoins = calculateUnpaidAmount(order, sumToPayInCoins, paidAmountInCoins); PaymentTableInfoDto paymentTableInfoDto = new PaymentTableInfoDto(); - paymentTableInfoDto.setOverpayment(overpayment.doubleValue()); - paymentTableInfoDto.setUnPaidAmount(unPaidAmount.doubleValue()); - paymentTableInfoDto.setPaidAmount(paidAmount.doubleValue()); + paymentTableInfoDto.setOverpayment(convertCoinsIntoBills(overpaymentInCoins)); + paymentTableInfoDto.setUnPaidAmount(convertCoinsIntoBills(unPaidAmountInCoins)); + paymentTableInfoDto.setPaidAmount(convertCoinsIntoBills(paidAmountInCoins)); List paymentInfoDtos = order.getPayment().stream() .filter(payment -> payment.getPaymentStatus().equals(PaymentStatus.PAID)) .map(x -> modelMapper.map(x, PaymentInfoDto.class)).collect(Collectors.toList()); - paymentTableInfoDto.setPaymentInfoDtos(getAmountInUAH(paymentInfoDtos)); + paymentTableInfoDto.setPaymentInfoDtos(paymentInfoDtos); return paymentTableInfoDto; } - private List getAmountInUAH(List paymentInfoDtos) { - if (!paymentInfoDtos.isEmpty()) { - for (PaymentInfoDto paymentInfoDto : paymentInfoDtos) { - if (paymentInfoDto != null) { - BigDecimal amountInUAH = BigDecimal.valueOf(paymentInfoDto.getAmount()) - .divide(AppConstant.AMOUNT_OF_COINS_IN_ONE_UAH, - AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY, - RoundingMode.HALF_UP); - paymentInfoDto.setAmount(amountInUAH.doubleValue()); - } - } - } - return paymentInfoDtos; + private Long convertBillsIntoCoins(Double bills) { + return bills == null ? 0 + : BigDecimal.valueOf(bills) + .movePointRight(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY) + .setScale(AppConstant.NO_DECIMALS_AFTER_POINT_IN_CURRENCY, RoundingMode.HALF_UP) + .longValue(); + } + + private Double convertCoinsIntoBills(Long coins) { + return coins == null ? 0 + : BigDecimal.valueOf(coins) + .movePointLeft(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY) + .setScale(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY, RoundingMode.HALF_UP) + .doubleValue(); } /** @@ -221,34 +223,36 @@ private List getAmountInUAH(List paymentInfoDtos * and done orders. * * @param orderId of {@link Long} order id; - * @param sumToPay of {@link Long} sum to pay; + * @param sumToPay of {@link Double} sum to pay; * @param marker of {@link Long} marker; * @return {@link PaymentTableInfoDto } * @author Ostap Mykhailivskyi */ @Override - public PaymentTableInfoDto returnOverpaymentInfo(Long orderId, Long sumToPay, Long marker) { + public PaymentTableInfoDto returnOverpaymentInfo(Long orderId, Double sumToPay, Long marker) { Order order = orderRepository.findUserById(orderId).orElseThrow( () -> new NotFoundException(ORDER_WITH_CURRENT_ID_DOES_NOT_EXIST + orderId)); - BigDecimal overpayment = calculateOverpayment(order, sumToPay); + Long overpaymentInCoins = calculateOverpayment(order, convertBillsIntoCoins(sumToPay)); PaymentTableInfoDto dto = getPaymentInfo(orderId, sumToPay); - PaymentInfoDto payDto = PaymentInfoDto.builder().amount(overpayment.doubleValue()) - .settlementdate(LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE)).build(); + PaymentInfoDto payDto = PaymentInfoDto.builder() + .amount(convertCoinsIntoBills(overpaymentInCoins)) + .settlementdate(LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE)) + .build(); if (marker == 1L) { payDto.setComment(AppConstant.PAYMENT_REFUND); } else { payDto.setComment(AppConstant.ENROLLMENT_TO_THE_BONUS_ACCOUNT); - int uahPoints = - overpayment.setScale(AppConstant.NO_DECIMALS_AFTER_POINT_IN_CURRENCY, RoundingMode.FLOOR).intValue(); + int uahPoints = convertCoinsIntoBills(overpaymentInCoins).intValue(); User user = order.getUser(); user.setCurrentPoints(user.getCurrentPoints() + uahPoints); orderRepository.save(order); } dto.getPaymentInfoDtos().add(payDto); - BigDecimal previousOverpaymentAmount = new BigDecimal(dto.getOverpayment().toString()); - dto.setOverpayment(previousOverpaymentAmount.subtract(overpayment).doubleValue()); + long previousOverpaymentAmount = convertBillsIntoCoins(dto.getOverpayment()); + dto.setOverpayment( + convertCoinsIntoBills(previousOverpaymentAmount) - convertCoinsIntoBills(overpaymentInCoins)); return dto; } @@ -360,9 +364,9 @@ public OrderStatusPageDto getOrderStatusData(Long orderId, String email) { .map(bag -> modelMapper.map(bag, BagInfoDto.class)) .collect(Collectors.toList()); - Integer servicePrice = serviceRepository.findServiceByTariffsInfoId(order.getTariffsInfo().getId()) + Long servicePriceInCoins = serviceRepository.findServiceByTariffsInfoId(order.getTariffsInfo().getId()) .map(it -> it.getPrice()) - .orElse(0); + .orElse(0L); var orderAddress = order.getUbsUser().getOrderAddress(); @@ -378,21 +382,23 @@ public OrderStatusPageDto getOrderStatusData(Long orderId, String email) { .addressComment(orderAddress.getAddressComment()) .bags(bagInfoDtoList) .orderFullPrice(setTotalPrice(prices)) - .orderDiscountedPrice(getPaymentInfo(orderId, prices.getSumAmount().longValue()).getUnPaidAmount()) - .orderBonusDiscount(prices.getBonus()).orderCertificateTotalDiscount(prices.getCertificateBonus()) - .orderExportedPrice(prices.getSumExported()).orderExportedDiscountedPrice(prices.getTotalSumExported()) + .orderDiscountedPrice(getPaymentInfo(orderId, prices.getSumAmount()).getUnPaidAmount()) + .orderBonusDiscount(prices.getBonus()) + .orderCertificateTotalDiscount(prices.getCertificateBonus()) + .orderExportedPrice(prices.getSumExported()) + .orderExportedDiscountedPrice(prices.getTotalSumExported()) .amountOfBagsOrdered(order.getAmountOfBagsOrdered()) .amountOfBagsExported(order.getExportedQuantity()) .amountOfBagsConfirmed(order.getConfirmedQuantity()) .numbersFromShop(order.getAdditionalOrders()) .certificates(prices.getCertificate()) - .paymentTableInfoDto(getPaymentInfo(orderId, setTotalPrice(prices).longValue())) + .paymentTableInfoDto(getPaymentInfo(orderId, setTotalPrice(prices))) .exportDetailsDto(getOrderExportDetails(orderId)) .employeePositionDtoRequest(getAllEmployeesByPosition(orderId, email)) .comment(order.getComment()) - .courierPricePerPackage(servicePrice) + .courierPricePerPackage(convertCoinsIntoBills(servicePriceInCoins)) .courierInfo(modelMapper.map(order.getTariffsInfo(), CourierInfoDto.class)) - .writeOffStationSum(order.getWriteOffStationSum()) + .writeOffStationSum(convertCoinsIntoBills(order.getWriteOffStationSum())) .build(); } @@ -580,9 +586,9 @@ public List getOrderDetails(Long orderId, String language) { @Override public void setOrderDetail(Long orderId, Map confirmed, Map exported, String email) { - final long wasPaid = + final long wasPaidInCoins = paymentRepository.selectSumPaid(orderId) == null ? 0L - : paymentRepository.selectSumPaid(orderId) / 100; + : paymentRepository.selectSumPaid(orderId); collectEventsAboutSetOrderDetails(confirmed, exported, orderId, email); final Order order = orderRepository.findById(orderId).orElseThrow( () -> new NotFoundException(ORDER_WITH_CURRENT_ID_DOES_NOT_EXIST)); @@ -617,52 +623,55 @@ public void setOrderDetail(Long orderId, } } - long discount = orderRepository.findSumOfCertificatesByOrderId(orderId); - long totalPrice = setTotalPrice(getPriceDetails(orderId)).longValue(); - long needToPay = totalPrice - wasPaid - discount; + long discountInCoins = orderRepository.findSumOfCertificatesByOrderId(orderId) * 100L; + long totalPriceInCoins = convertBillsIntoCoins(setTotalPrice(getPriceDetails(orderId))); + long needToPayInCoins = totalPriceInCoins - wasPaidInCoins - discountInCoins; - if (needToPay == 0) { + if (needToPayInCoins == 0) { orderRepository.updateOrderPaymentStatus(orderId, OrderPaymentStatus.PAID.name()); return; } - if (totalPrice - wasPaid >= 0 && needToPay < 0) { + if (totalPriceInCoins - wasPaidInCoins >= 0 && needToPayInCoins < 0) { orderRepository.updateOrderPaymentStatus(orderId, OrderPaymentStatus.PAID.name()); - recalculateCertificates(totalPrice - wasPaid, order); + recalculateCertificates(totalPriceInCoins - wasPaidInCoins, order); return; } - if (totalPrice < wasPaid) { + if (totalPriceInCoins < wasPaidInCoins) { orderRepository.updateOrderPaymentStatus(orderId, OrderPaymentStatus.PAID.name()); recalculateCertificates(0L, order); return; } - if (needToPay > 0 && wasPaid + discount != 0) { + if (needToPayInCoins > 0 && wasPaidInCoins + discountInCoins != 0) { orderRepository.updateOrderPaymentStatus(orderId, OrderPaymentStatus.HALF_PAID.name()); notificationService.notifyHalfPaidPackage(order); return; } - if (wasPaid + discount == 0) { + if (wasPaidInCoins + discountInCoins == 0) { orderRepository.updateOrderPaymentStatus(orderId, OrderPaymentStatus.UNPAID.name()); } } - private void recalculateCertificates(long amount, Order order) { + private void recalculateCertificates(long amountInCoins, Order order) { Set certificates = order.getCertificates(); for (Certificate certificate : certificates) { - amount = amount - certificate.getPoints(); - if (amount < 0) { - certificate.setPoints(certificate.getPoints() + (int) amount); + amountInCoins = amountInCoins - certificate.getPoints() * 100L; + if (amountInCoins < 0) { + certificate.setPoints(certificate.getPoints() + BigDecimal.valueOf(amountInCoins) + .movePointLeft(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY) + .setScale(0, RoundingMode.UP).intValue()); certificateRepository.save(certificate); - amount = 0L; + amountInCoins = 0L; } } - recalculatePoints(amount, order); + recalculatePoints(BigDecimal.valueOf(convertCoinsIntoBills(amountInCoins)) + .setScale(0, RoundingMode.HALF_UP).intValue(), order); } - private void recalculatePoints(long amount, Order order) { + private void recalculatePoints(int amount, Order order) { if (order.getPointsToUse() > amount) { - userRepository.updateUserCurrentPoints(order.getUser().getId(), order.getPointsToUse() - (int) amount); - order.setPointsToUse((int) amount); - orderRepository.updateOrderPointsToUse(order.getId(), (int) amount); + userRepository.updateUserCurrentPoints(order.getUser().getId(), order.getPointsToUse() - amount); + order.setPointsToUse(amount); + orderRepository.updateOrderPointsToUse(order.getId(), amount); } } @@ -764,11 +773,11 @@ public CounterOrderDetailsDto getOrderSumDetails(Long orderId) { Order order = orderRepository.getOrderDetails(orderId) .orElseThrow(() -> new NotFoundException(ORDER_WITH_CURRENT_ID_DOES_NOT_EXIST + orderId)); - double totalSumAmount = dto.getTotalSumAmount(); - double totalSumConfirmed = dto.getTotalSumConfirmed(); - double totalSumExported = dto.getTotalSumExported(); + long totalSumAmountInCoins = convertBillsIntoCoins(dto.getTotalSumAmount()); + long totalSumConfirmedInCoins = convertBillsIntoCoins(dto.getTotalSumConfirmed()); + long totalSumExportedInCoins = convertBillsIntoCoins(dto.getTotalSumExported()); - updateOrderPaymentStatus(order, totalSumAmount, totalSumConfirmed, totalSumExported); + updateOrderPaymentStatus(order, totalSumAmountInCoins, totalSumConfirmedInCoins, totalSumExportedInCoins); return dto; } @@ -779,15 +788,15 @@ private CounterOrderDetailsDto getPriceDetails(Long id) { List bag = bagRepository.findBagsByOrderId(id); final List currentCertificate = certificateRepository.findCertificate(id); - double sumAmount = 0; - double sumConfirmed = 0; - double sumExported = 0; - double totalSumAmount; - double totalSumConfirmed; - double totalSumExported; + long sumAmountInCoins = 0; + long sumConfirmedInCoins = 0; + long sumExportedInCoins = 0; + long totalSumAmountInCoins; + long totalSumConfirmedInCoins; + long totalSumExportedInCoins; if (!bag.isEmpty()) { for (Map.Entry entry : order.getAmountOfBagsOrdered().entrySet()) { - sumAmount += entry.getValue() * bag + sumAmountInCoins += entry.getValue() * bag .stream() .filter(b -> b.getId().equals(entry.getKey())) .findFirst() @@ -795,7 +804,7 @@ private CounterOrderDetailsDto getPriceDetails(Long id) { .getFullPrice(); } for (Map.Entry entry : order.getConfirmedQuantity().entrySet()) { - sumConfirmed += entry.getValue() * bag + sumConfirmedInCoins += entry.getValue() * bag .stream() .filter(b -> b.getId().equals(entry.getKey())) .findFirst() @@ -803,7 +812,7 @@ private CounterOrderDetailsDto getPriceDetails(Long id) { .getFullPrice(); } for (Map.Entry entry : order.getExportedQuantity().entrySet()) { - sumExported += entry.getValue() * bag + sumExportedInCoins += entry.getValue() * bag .stream() .filter(b -> b.getId().equals(entry.getKey())) .findFirst() @@ -812,41 +821,36 @@ private CounterOrderDetailsDto getPriceDetails(Long id) { } if (order.getExportedQuantity().size() != 0) { - sumExported += getUbsCourierOrWriteOffStationSum(order); + sumExportedInCoins += getUbsCourierOrWriteOffStationSum(order); } else if (order.getConfirmedQuantity().size() != 0) { - sumConfirmed += getUbsCourierOrWriteOffStationSum(order); + sumConfirmedInCoins += getUbsCourierOrWriteOffStationSum(order); } else { - sumAmount += getUbsCourierOrWriteOffStationSum(order); + sumAmountInCoins += getUbsCourierOrWriteOffStationSum(order); } } if (!currentCertificate.isEmpty()) { - double totalSumAmountToCheck = - (sumAmount - ((currentCertificate.stream().map(Certificate::getPoints).reduce(Integer::sum).orElse(0)) - + order.getPointsToUse())); - totalSumAmount = totalSumAmountToCheck <= 0 ? 0 : totalSumAmountToCheck; - totalSumConfirmed = - (sumConfirmed - - ((currentCertificate.stream().map(Certificate::getPoints).reduce(Integer::sum).orElse(0)) - + order.getPointsToUse())); - totalSumExported = - (sumExported - ((currentCertificate.stream().map(Certificate::getPoints).reduce(Integer::sum).orElse(0)) - + order.getPointsToUse())); - dto.setCertificateBonus( - currentCertificate.stream().map(Certificate::getPoints).reduce(Integer::sum).orElse(0).doubleValue()); - dto.setCertificate( - currentCertificate.stream().map(Certificate::getCode).collect(Collectors.toList())); + Integer certificateBonus = currentCertificate.stream() + .map(Certificate::getPoints).reduce(Integer::sum).orElse(0); + long certificatesAndBonusesInCoins = 100L * (certificateBonus + order.getPointsToUse()); + long totalSumAmountInCoinsToCheck = sumAmountInCoins - certificatesAndBonusesInCoins; + totalSumAmountInCoins = totalSumAmountInCoinsToCheck <= 0 ? 0 : totalSumAmountInCoinsToCheck; + totalSumConfirmedInCoins = sumConfirmedInCoins - certificatesAndBonusesInCoins; + totalSumExportedInCoins = sumExportedInCoins - certificatesAndBonusesInCoins; + dto.setCertificateBonus(certificateBonus.doubleValue()); + dto.setCertificate(currentCertificate.stream().map(Certificate::getCode).collect(Collectors.toList())); } else { dto.setCertificateBonus((double) 0); - totalSumAmount = sumAmount - order.getPointsToUse(); - totalSumConfirmed = sumConfirmed - order.getPointsToUse(); - totalSumExported = sumExported - order.getPointsToUse(); + long bonusesInCoins = 100L * order.getPointsToUse(); + totalSumAmountInCoins = sumAmountInCoins - bonusesInCoins; + totalSumConfirmedInCoins = sumConfirmedInCoins - bonusesInCoins; + totalSumExportedInCoins = sumExportedInCoins - bonusesInCoins; } if (order.getConfirmedQuantity().isEmpty()) { - totalSumConfirmed = 0; + totalSumConfirmedInCoins = 0; } if (order.getExportedQuantity().isEmpty()) { - totalSumExported = 0; + totalSumExportedInCoins = 0; } dto.setTotalAmount( order.getAmountOfBagsOrdered().values() @@ -859,7 +863,8 @@ private CounterOrderDetailsDto getPriceDetails(Long id) { .stream().reduce(Integer::sum).orElse(0).doubleValue()); setDtoInfoFromOrder(dto, order); - setDtoInfo(dto, sumAmount, sumExported, sumConfirmed, totalSumAmount, totalSumConfirmed, totalSumExported); + setDtoInfo(dto, sumAmountInCoins, sumExportedInCoins, sumConfirmedInCoins, + totalSumAmountInCoins, totalSumConfirmedInCoins, totalSumExportedInCoins); return dto; } @@ -881,33 +886,36 @@ private void setDtoInfoFromOrder(CounterOrderDetailsDto dto, Order order) { dto.setBonus(order.getPointsToUse().doubleValue()); } - private void setDtoInfo(CounterOrderDetailsDto dto, double sumAmount, double sumExported, double sumConfirmed, - double totalSumAmount, double totalSumConfirmed, double totalSumExported) { - dto.setSumAmount(sumAmount); - dto.setSumConfirmed(sumConfirmed); - dto.setSumExported(sumExported); - dto.setTotalSumAmount(totalSumAmount); - dto.setTotalSumConfirmed(totalSumConfirmed); - dto.setTotalSumExported(totalSumExported); + private void setDtoInfo(CounterOrderDetailsDto dto, long sumAmountInCoins, long sumExportedInCoins, + long sumConfirmedInCoins, long totalSumAmountInCoins, long totalSumConfirmedInCoins, + long totalSumExportedInCoins) { + dto.setSumAmount(convertCoinsIntoBills(sumAmountInCoins)); + dto.setSumConfirmed(convertCoinsIntoBills(sumConfirmedInCoins)); + dto.setSumExported(convertCoinsIntoBills(sumExportedInCoins)); + dto.setTotalSumAmount(convertCoinsIntoBills(totalSumAmountInCoins)); + dto.setTotalSumConfirmed(convertCoinsIntoBills(totalSumConfirmedInCoins)); + dto.setTotalSumExported(convertCoinsIntoBills(totalSumExportedInCoins)); } - private void updateOrderPaymentStatus(Order currentOrder, double totalSumAmount, double totalConfirmed, - double totalExported) { - long paymentsForCurrentOrder = currentOrder.getPayment().stream().filter(payment -> payment.getPaymentStatus() - .equals(PaymentStatus.PAID)).map(Payment::getAmount).map(amount -> amount / 100).reduce(Long::sum) + private void updateOrderPaymentStatus(Order currentOrder, long totalSumAmountInCoins, long totalConfirmedInCoins, + long totalExportedInCoins) { + long paymentsForCurrentOrderInCoins = currentOrder.getPayment().stream() + .filter(payment -> payment.getPaymentStatus().equals(PaymentStatus.PAID)) + .map(Payment::getAmount) + .reduce(Long::sum) .orElse(0L); if (orderStatusesBeforeShipment.contains(currentOrder.getOrderStatus())) { - setOrderPaymentStatusForConfirmedBags(currentOrder, paymentsForCurrentOrder, totalSumAmount, - totalConfirmed); + setOrderPaymentStatusForConfirmedBags(currentOrder, paymentsForCurrentOrderInCoins, totalSumAmountInCoins, + totalConfirmedInCoins); } else if (orderStatusesAfterConfirmation.contains(currentOrder.getOrderStatus())) { - setOrderPaymentStatusForExportedBags(currentOrder, paymentsForCurrentOrder, totalExported); + setOrderPaymentStatusForExportedBags(currentOrder, paymentsForCurrentOrderInCoins, totalExportedInCoins); } orderRepository.save(currentOrder); } private void setOrderPaymentStatusForConfirmedBags(Order currentOrder, long paymentsForCurrentOrder, - double totalSumAmount, double totalConfirmed) { + long totalSumAmount, long totalConfirmed) { boolean paidCondition = paymentsForCurrentOrder > 0 && paymentsForCurrentOrder >= totalSumAmount && paymentsForCurrentOrder >= totalConfirmed; boolean halfPaidCondition = paymentsForCurrentOrder > 0 && totalSumAmount > paymentsForCurrentOrder @@ -927,7 +935,7 @@ private void setOrderPaymentStatusForConfirmedBags(Order currentOrder, long paym } private void setOrderPaymentStatusForExportedBags(Order currentOrder, long paymentsForCurrentOrder, - double totalExported) { + long totalExported) { boolean halfPaidCondition = paymentsForCurrentOrder > 0 && totalExported > paymentsForCurrentOrder; boolean paidCondition = totalExported <= paymentsForCurrentOrder && paymentsForCurrentOrder > 0; @@ -1250,62 +1258,59 @@ public List getAdditionalBagsInfo(Long orderId) { } /** - * Method that calculates overpayment on user's order. + * Method that calculates overpayment on user's order in coins. * - * @param order of {@link Order} order; - * @param sumToPay of {@link Long} sum to pay; - * @return {@link BigDecimal } + * @param order of {@link Order} order; + * @param sumToPayInCoins of {@link Long} sum to pay in coins; + * @return {@link Long } * @author Ostap Mykhailivskyi */ - private BigDecimal calculateOverpayment(Order order, Long sumToPay) { - BigDecimal paidAmount = calculatePaidAmount(order); + private Long calculateOverpayment(Order order, Long sumToPayInCoins) { + long paidAmountInCoins = calculatePaidAmount(order); long certificateSum = order.getCertificates().stream() .map(Certificate::getPoints) .reduce(0, Integer::sum); - long bonusOverpayment = certificateSum + order.getPointsToUse() - sumToPay; + long bonusOverpaymentInCoins = 100L * (certificateSum + order.getPointsToUse()) - sumToPayInCoins; - BigDecimal overpayment = paidAmount.add(new BigDecimal(bonusOverpayment)); + long overpaymentInCoins = paidAmountInCoins + bonusOverpaymentInCoins; return OrderStatus.CANCELED == order.getOrderStatus() - ? paidAmount - : overpayment.max(BigDecimal.ZERO); + ? paidAmountInCoins + : Math.max(overpaymentInCoins, 0L); } /** - * Method that calculate paid amount. + * Method that calculate paid amount in coins. * * @param order of {@link Order} order id; - * @return {@link BigDecimal } + * @return {@link Long } paid amount in coins; * @author Ostap Mykhailivskyi */ - private BigDecimal calculatePaidAmount(Order order) { - Long coins = order.getPayment().stream() + private Long calculatePaidAmount(Order order) { + return order.getPayment().stream() .filter(x -> x.getPaymentStatus().equals(PaymentStatus.PAID)) .map(Payment::getAmount) .reduce(0L, Long::sum); - return new BigDecimal(coins).divide(AppConstant.AMOUNT_OF_COINS_IN_ONE_UAH, - AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY, RoundingMode.HALF_UP); } /** - * Method that calculate unpaid amount. + * Method that calculate unpaid amount in coins. * - * @param order of {@link Order} order id; - * @param sumToPay of {@link Long} sum to pay; - * @param paidAmount of {@link BigDecimal} sum to pay; - * @return {@link BigDecimal } + * @param order of {@link Order} order id; + * @param sumToPayInCoins of {@link Long} sum to pay in coins; + * @param paidAmountInCoins of {@link Long} paid amount in coins; + * @return {@link Long } unpaid amount in coins * @author Ostap Mykhailivskyi */ - private BigDecimal calculateUnpaidAmount(Order order, Long sumToPay, BigDecimal paidAmount) { - sumToPay = sumToPay - ((order.getCertificates().stream() - .map(Certificate::getPoints) - .reduce(Integer::sum) - .orElse(0)) + order.getPointsToUse()); - - BigDecimal unpaidAmount = new BigDecimal(sumToPay).subtract(paidAmount); + private Long calculateUnpaidAmount(Order order, Long sumToPayInCoins, Long paidAmountInCoins) { + long unpaidAmountInCoins = sumToPayInCoins - paidAmountInCoins + - 100L * (order.getPointsToUse() + (order.getCertificates().stream() + .map(Certificate::getPoints) + .reduce(Integer::sum) + .orElse(0))); - return unpaidAmount.max(BigDecimal.ZERO); + return Math.max(unpaidAmountInCoins, 0); } /** @@ -1367,10 +1372,10 @@ public ManualPaymentResponseDto updateManualPayment(Long paymentId, private void updateOrderPaymentStatusForManualPayment(Order order) { CounterOrderDetailsDto dto = getPriceDetails(order.getId()); - long paymentsForCurrentOrder = order.getPayment().stream().filter(payment -> payment.getPaymentStatus() - .equals(PaymentStatus.PAID)).map(Payment::getAmount).map(payment -> payment / 100).reduce(Long::sum) - .orElse(0L); - long totalPaidAmount = (long) (paymentsForCurrentOrder + dto.getCertificateBonus() + dto.getBonus()); + double paymentsForCurrentOrder = order.getPayment().stream().filter(payment -> payment.getPaymentStatus() + .equals(PaymentStatus.PAID)).map(Payment::getAmount).map(this::convertCoinsIntoBills).reduce(Double::sum) + .orElse((double) 0); + double totalPaidAmount = paymentsForCurrentOrder + dto.getCertificateBonus() + dto.getBonus(); double totalAmount = setTotalPrice(dto); if (paymentsForCurrentOrder > 0 && totalAmount > totalPaidAmount) { @@ -1643,14 +1648,14 @@ public void updateOrderAdminPageInfo(UpdateOrderPageAdminDto updateOrderPageDto, } } - private void setUbsCourierSumAndWriteOffStationSum(Long orderId, Long writeOffStationSum, Long ubsCourierSum) { + private void setUbsCourierSumAndWriteOffStationSum(Long orderId, Double writeOffStationSum, Double ubsCourierSum) { Order order = orderRepository.findById(orderId) .orElseThrow(() -> new NotFoundException(ORDER_WITH_CURRENT_ID_DOES_NOT_EXIST + orderId)); if (writeOffStationSum != null) { - order.setWriteOffStationSum(writeOffStationSum); + order.setWriteOffStationSum(convertBillsIntoCoins(writeOffStationSum)); } if (ubsCourierSum != null) { - order.setUbsCourierSum(ubsCourierSum); + order.setUbsCourierSum(convertBillsIntoCoins(ubsCourierSum)); } orderRepository.save(order); } @@ -1731,8 +1736,8 @@ private void checkUpdateResponsibleEmployeeDto(UpdateAllOrderPageDto updateAllOr } } - private void checkOverpayment(BigDecimal overpayment) { - if (overpayment.compareTo(BigDecimal.ZERO) == 0) { + private void checkOverpayment(long overpayment) { + if (overpayment == 0) { throw new BadRequestException(USER_HAS_NO_OVERPAYMENT); } } @@ -1744,13 +1749,12 @@ public AddBonusesToUserDto addBonusesToUser(AddBonusesToUserDto addBonusesToUser Order order = orderRepository.findById(orderId) .orElseThrow(() -> new NotFoundException(ORDER_WITH_CURRENT_ID_DOES_NOT_EXIST + orderId)); CounterOrderDetailsDto prices = getPriceDetails(orderId); - BigDecimal overpaymentUah = calculateOverpayment(order, setTotalPrice(prices).longValue()); - checkOverpayment(overpaymentUah); + Long overpaymentInCoins = calculateOverpayment(order, convertBillsIntoCoins(setTotalPrice(prices))); + checkOverpayment(overpaymentInCoins); User currentUser = order.getUser(); - BigDecimal overpaymentCoins = overpaymentUah.multiply(AppConstant.AMOUNT_OF_COINS_IN_ONE_UAH.negate()); order.getPayment().add(Payment.builder() - .amount(overpaymentCoins.longValue()) + .amount(-overpaymentInCoins) .settlementDate(addBonusesToUserDto.getSettlementdate()) .paymentId(addBonusesToUserDto.getPaymentId()) .receiptLink(addBonusesToUserDto.getReceiptLink()) @@ -1760,7 +1764,7 @@ public AddBonusesToUserDto addBonusesToUser(AddBonusesToUserDto addBonusesToUser .paymentStatus(PaymentStatus.PAID) .build()); - transferPointsToUser(order, currentUser, overpaymentUah); + transferPointsToUser(order, currentUser, overpaymentInCoins); orderRepository.save(order); userRepository.save(currentUser); @@ -1774,12 +1778,8 @@ public AddBonusesToUserDto addBonusesToUser(AddBonusesToUserDto addBonusesToUser .build(); } - private void transferPointsToUser(Order order, User user, BigDecimal points) { - if (points.compareTo(BigDecimal.ZERO) <= 0) { - return; - } - - int uahPoints = points.setScale(AppConstant.NO_DECIMALS_AFTER_POINT_IN_CURRENCY, RoundingMode.FLOOR).intValue(); + private void transferPointsToUser(Order order, User user, long pointsInCoins) { + int uahPoints = convertCoinsIntoBills(pointsInCoins).intValue(); user.setCurrentPoints(user.getCurrentPoints() + uahPoints); diff --git a/service/src/test/java/greencity/ModelUtils.java b/service/src/test/java/greencity/ModelUtils.java index 5d65304cd..9b2566b0a 100644 --- a/service/src/test/java/greencity/ModelUtils.java +++ b/service/src/test/java/greencity/ModelUtils.java @@ -34,12 +34,12 @@ import greencity.dto.customer.UbsCustomersDto; import greencity.dto.customer.UbsCustomersDtoUpdate; import greencity.dto.employee.AddEmployeeDto; -import greencity.dto.employee.EmployeeWithTariffsIdDto; +import greencity.dto.employee.EmployeeDto; import greencity.dto.employee.EmployeeNameDto; import greencity.dto.employee.EmployeeNameIdDto; import greencity.dto.employee.EmployeePositionDtoRequest; import greencity.dto.employee.EmployeeWithTariffsDto; -import greencity.dto.employee.EmployeeDto; +import greencity.dto.employee.EmployeeWithTariffsIdDto; import greencity.dto.employee.GetEmployeeDto; import greencity.dto.employee.UpdateResponsibleEmployeeDto; import greencity.dto.employee.UserEmployeeAuthorityDto; @@ -58,35 +58,7 @@ import greencity.dto.notification.NotificationTemplateWithPlatformsDto; import greencity.dto.notification.NotificationTemplateWithPlatformsUpdateDto; import greencity.dto.notification.SenderInfoDto; -import greencity.dto.order.AdminCommentDto; -import greencity.dto.order.BigOrderTableDTO; -import greencity.dto.order.CounterOrderDetailsDto; -import greencity.dto.order.DetailsOrderInfoDto; -import greencity.dto.order.EcoNumberDto; -import greencity.dto.order.ExportDetailsDto; -import greencity.dto.order.ExportDetailsDtoUpdate; -import greencity.dto.order.GroupedOrderDto; -import greencity.dto.order.OrderAddressDtoRequest; -import greencity.dto.order.OrderAddressDtoResponse; -import greencity.dto.order.OrderAddressExportDetailsDtoUpdate; -import greencity.dto.order.OrderCancellationReasonDto; -import greencity.dto.order.OrderClientDto; -import greencity.dto.order.OrderDetailInfoDto; -import greencity.dto.order.OrderDetailStatusDto; -import greencity.dto.order.OrderDetailStatusRequestDto; -import greencity.dto.order.OrderDto; -import greencity.dto.order.OrderFondyClientDto; -import greencity.dto.order.OrderPaymentDetailDto; -import greencity.dto.order.OrderResponseDto; -import greencity.dto.order.OrderWithAddressesResponseDto; -import greencity.dto.order.OrdersDataForUserDto; -import greencity.dto.order.ReadAddressByOrderDto; -import greencity.dto.order.RequestToChangeOrdersDataDto; -import greencity.dto.order.SenderLocation; -import greencity.dto.order.UpdateAllOrderPageDto; -import greencity.dto.order.UpdateOrderDetailDto; -import greencity.dto.order.UpdateOrderPageAdminDto; -import greencity.dto.order.NotTakenOrderReasonDto; +import greencity.dto.order.*; import greencity.dto.pageble.PageableDto; import greencity.dto.payment.ManualPaymentRequestDto; import greencity.dto.payment.PaymentInfoDto; @@ -94,10 +66,10 @@ import greencity.dto.payment.PaymentTableInfoDto; import greencity.dto.position.PositionAuthoritiesDto; import greencity.dto.position.PositionDto; -import greencity.dto.service.ServiceDto; import greencity.dto.service.GetServiceDto; -import greencity.dto.service.TariffServiceDto; import greencity.dto.service.GetTariffServiceDto; +import greencity.dto.service.ServiceDto; +import greencity.dto.service.TariffServiceDto; import greencity.dto.table.ColumnWidthDto; import greencity.dto.tariff.EditTariffDto; import greencity.dto.tariff.GetTariffInfoForEmployeeDto; @@ -108,9 +80,9 @@ import greencity.dto.user.PersonalDataDto; import greencity.dto.user.UserInfoDto; import greencity.dto.user.UserPointsAndAllBagsDto; +import greencity.dto.user.UserProfileCreateDto; import greencity.dto.user.UserProfileDto; import greencity.dto.user.UserProfileUpdateDto; -import greencity.dto.user.UserProfileCreateDto; import greencity.dto.violation.AddingViolationsToUserDto; import greencity.dto.violation.UpdateViolationToUserDto; import greencity.dto.violation.ViolationDetailInfoDto; @@ -151,12 +123,12 @@ import greencity.enums.CourierStatus; import greencity.enums.EmployeeStatus; import greencity.enums.LocationStatus; -import greencity.enums.NotificationType; import greencity.enums.NotificationReceiverType; -import greencity.enums.TariffStatus; +import greencity.enums.NotificationType; import greencity.enums.OrderPaymentStatus; import greencity.enums.OrderStatus; import greencity.enums.PaymentStatus; +import greencity.enums.TariffStatus; import greencity.util.Bot; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -2145,7 +2117,10 @@ private static OrderDetailStatusDto createOrderDetailStatusDto() { private static BagInfoDto createBagInfoDto() { return BagInfoDto.builder() .id(1) - .capacity(4) + .capacity(20) + .name("Name") + .nameEng("NameEng") + .price(100.00) .build(); } @@ -2162,9 +2137,9 @@ private static Bag createBag() { .name("Name") .nameEng("NameEng") .capacity(20) - .price(100) - .commission(0) - .fullPrice(100) + .price(100_00L) + .commission(0L) + .fullPrice(100_00L) .description("some_description") .descriptionEng("some_eng_description") .limitIncluded(true) @@ -2177,12 +2152,12 @@ private static Bag createBag() { private static BagForUserDto createBagForUserDto() { return BagForUserDto.builder() - .service("some_description") - .serviceEng("some_eng_description") + .service("Name") + .serviceEng("NameEng") .capacity(20) - .fullPrice(100) + .fullPrice(100.0) .count(22) - .totalPrice(2200) + .totalPrice(2200.0) .build(); } @@ -2525,8 +2500,8 @@ public static NotificationDto createViolationNotificationDto() { public static TariffServiceDto TariffServiceDto() { return TariffServiceDto.builder() .capacity(20) - .price(100) - .commission(50) + .price(100.0) + .commission(50.0) .description("Description") .descriptionEng("DescriptionEng") .name("name") @@ -2538,9 +2513,9 @@ public static GetTariffServiceDto getGetTariffServiceDto() { return GetTariffServiceDto.builder() .id(1) .capacity(20) - .price(100) - .commission(50) - .fullPrice(150) + .price(100.0) + .commission(50.0) + .fullPrice(150.0) .limitIncluded(false) .description("Description") .descriptionEng("DescriptionEng") @@ -2553,9 +2528,9 @@ public static Optional getOptionalBag() { return Optional.of(Bag.builder() .id(1) .capacity(120) - .commission(50) - .price(120) - .fullPrice(170) + .commission(50_00L) + .price(120_00L) + .fullPrice(170_00L) .createdAt(LocalDate.now()) .createdBy(getEmployee()) .editedBy(getEmployee()) @@ -2569,9 +2544,9 @@ public static Bag getBag() { return Bag.builder() .id(1) .capacity(120) - .commission(50) - .price(120) - .fullPrice(170) + .commission(50_00L) + .price(120_00L) + .fullPrice(170_00L) .createdAt(LocalDate.now()) .createdBy(getEmployee()) .editedBy(getEmployee()) @@ -2585,8 +2560,8 @@ public static TariffServiceDto getTariffServiceDto() { return TariffServiceDto.builder() .name("Бавовняна сумка") .capacity(120) - .price(120) - .commission(50) + .price(120.0) + .commission(50.0) .description("Description") .build(); @@ -2651,9 +2626,9 @@ public static Bag getTariffBag() { return Bag.builder() .id(1) .capacity(20) - .price(100) - .commission(50) - .fullPrice(150) + .price(100_00L) + .commission(50_00L) + .fullPrice(150_00L) .createdAt(LocalDate.now()) .createdBy(getEmployee()) .description("Description") @@ -2669,7 +2644,7 @@ public static BagTranslationDto getBagTranslationDto() { return BagTranslationDto.builder() .id(1) .capacity(20) - .price(150) + .price(150.0) .name("name") .nameEng("nameEng") .limitedIncluded(false) @@ -2679,9 +2654,9 @@ public static BagTranslationDto getBagTranslationDto() { public static Bag getNewBag() { return Bag.builder() .capacity(20) - .price(100) - .commission(50) - .fullPrice(150) + .price(100_00L) + .commission(50_00L) + .fullPrice(150_00L) .createdAt(LocalDate.now()) .createdBy(getEmployee()) .limitIncluded(false) @@ -2709,7 +2684,7 @@ public static ServiceDto getServiceDto() { return ServiceDto.builder() .name("Name") .nameEng("NameEng") - .price(100) + .price(100.0) .description("Description") .descriptionEng("DescriptionEng") .build(); @@ -2720,7 +2695,7 @@ public static GetServiceDto getGetServiceDto() { .id(1L) .name("Name") .nameEng("NameEng") - .price(100) + .price(100.0) .description("Description") .descriptionEng("DescriptionEng") .build(); @@ -2731,7 +2706,7 @@ public static Service getService() { Employee employee = ModelUtils.getEmployee(); return Service.builder() .id(1L) - .price(100) + .price(100_00L) .createdAt(LocalDate.now()) .createdBy(employee) .description("Description") @@ -2744,7 +2719,7 @@ public static Service getService() { public static Service getNewService() { Employee employee = ModelUtils.getEmployee(); return Service.builder() - .price(100) + .price(100_00L) .createdAt(LocalDate.now()) .createdBy(employee) .description("Description") @@ -2760,7 +2735,7 @@ public static Service getEditedService() { .id(1L) .name("Name") .nameEng("NameEng") - .price(100) + .price(100_00L) .description("Description") .descriptionEng("DescriptionEng") .editedAt(LocalDate.now()) @@ -2820,10 +2795,10 @@ public static Order getOrderUserSecond() { public static List getBag1list() { return List.of(Bag.builder() .id(1) - .price(100) + .price(100_00L) .capacity(20) - .commission(50) - .fullPrice(1500) + .commission(50_00L) + .fullPrice(170_00L) .name("name") .nameEng("nameEng") .limitIncluded(false) @@ -2833,64 +2808,64 @@ public static List getBag1list() { public static List getBaglist() { return List.of(Bag.builder() .id(1) - .price(100) + .price(100_00L) .capacity(10) - .commission(21) - .fullPrice(20) + .commission(21_00L) + .fullPrice(20_00L) .build(), Bag.builder() .id(2) - .price(100) + .price(100_00L) .capacity(10) - .commission(21) - .fullPrice(21) + .commission(21_00L) + .fullPrice(21_00L) .build()); } public static List getBag2list() { return List.of(Bag.builder() .id(1) - .price(100) + .price(100_00L) .capacity(10) - .commission(21) - .fullPrice(20) + .commission(20_00L) + .fullPrice(120_00L) .build()); } public static List getBag3list() { return List.of(Bag.builder() .id(1) - .price(100) + .price(100_00L) .capacity(10) - .commission(21) - .fullPrice(2000) + .commission(21_00L) + .fullPrice(2000_00L) .build(), Bag.builder() .id(2) - .price(100) + .price(100_00L) .capacity(10) - .commission(21) - .fullPrice(2100) + .commission(20_00L) + .fullPrice(120_00L) .build()); } public static List getBag4list() { return List.of(Bag.builder() .id(1) - .price(100) + .price(100_00L) .capacity(10) - .commission(21) - .fullPrice(20) + .commission(20_00L) + .fullPrice(120_00L) .name("name") .nameEng("nameEng") .limitIncluded(false) .build(), Bag.builder() .id(2) - .price(100) + .price(100_00L) .capacity(10) - .commission(21) - .fullPrice(21) + .commission(20_00L) + .fullPrice(120_00L) .name("name") .nameEng("nameEng") .limitIncluded(false) @@ -2959,7 +2934,7 @@ public static BagInfoDto getBagInfoDto() { .id(1) .name("name") .nameEng("name") - .price(100) + .price(100.) .capacity(10) .build(); } @@ -2986,7 +2961,7 @@ public static PaymentInfoDto getInfoPayment() { return PaymentInfoDto.builder() .comment("ddd") .id(1L) - .amount(1000d) + .amount(10d) .build(); } @@ -3342,13 +3317,13 @@ public static BigOrderTableViews getBigOrderTableViews() { .setAddressEn("Sichovyh Stril'tsiv, 37, 1, 1") .setCommentToAddressForClient("coment") .setBagAmount("3") - .setTotalOrderSum(500L) + .setTotalOrderSum(50000L) .setOrderCertificateCode("5489-2789") .setGeneralDiscount(100L) .setAmountDue(0L) .setCommentForOrderByClient("commentForOrderByClient") .setCommentForOrderByAdmin("commentForOrderByAdmin") - .setTotalPayment(200L) + .setTotalPayment(20000L) .setDateOfExport(LocalDate.of(2021, 12, 8)) .setTimeOfExport("from 15:59:52 to 15:59:52") .setIdOrderFromShop("3245678765") @@ -3382,13 +3357,13 @@ public static BigOrderTableDTO getBigOrderTableDto() { new SenderLocation().setUa("Січових Стрільців, 37, 1, 1").setEn("Sichovyh Stril'tsiv, 37, 1, 1")) .setCommentToAddressForClient("coment") .setBagsAmount("3") - .setTotalOrderSum(500L) + .setTotalOrderSum(500.) .setOrderCertificateCode("5489-2789") .setGeneralDiscount(100L) - .setAmountDue(0L) + .setAmountDue(0.) .setCommentForOrderByClient("commentForOrderByClient") .setCommentsForOrder("commentForOrderByAdmin") - .setTotalPayment(200L) + .setTotalPayment(200.) .setDateOfExport("2021-12-08") .setTimeOfExport("from 15:59:52 to 15:59:52") .setIdOrderFromShop("3245678765") @@ -3443,7 +3418,7 @@ public static Order getOrderForGetOrderStatusData2Test() { .orderStatus(OrderStatus.DONE) .payment(Lists.newArrayList(Payment.builder() .paymentId("1L") - .amount(20000L) + .amount(200_00L) .currency("UAH") .settlementDate("20.02.1990") .comment("avb") @@ -3481,7 +3456,7 @@ public static Order getOrderForGetOrderStatusData2Test() { .build()) .orderPaymentStatus(OrderPaymentStatus.PAID) .cancellationReason(CancellationReason.OUT_OF_CITY) - .writeOffStationSum(50L) + .writeOffStationSum(50_00L) .imageReasonNotTakingBags(List.of("foto")) .tariffsInfo(TariffsInfo.builder() @@ -3524,7 +3499,7 @@ public static Order getOrderWithoutExportedBags() { .certificates(Collections.emptySet()) .orderStatus(OrderStatus.CONFIRMED) .user(User.builder().id(1L).currentPoints(100).build()) - .writeOffStationSum(50L) + .writeOffStationSum(50_00L) .payment(Lists.newArrayList(Payment.builder() .paymentId("1L") .amount(20000L) @@ -3547,7 +3522,7 @@ public static Order getOrdersStatusAdjustmentDto2() { .counterOrderPaymentId(1L) .certificates(Set.of(getCertificate2())) .pointsToUse(100) - .writeOffStationSum(50L) + .writeOffStationSum(50_00L) .build(); } @@ -3899,10 +3874,10 @@ public static OrdersDataForUserDto getOrderStatusDto() { .build(); BagForUserDto bagForUserDto = new BagForUserDto(); - bagForUserDto.setTotalPrice(900); + bagForUserDto.setTotalPrice(900.); bagForUserDto.setCount(3); bagForUserDto.setCapacity(200); - bagForUserDto.setFullPrice(300); + bagForUserDto.setFullPrice(300.); bagForUserDto.setService("Безпечні Відходи"); bagForUserDto.setServiceEng("Safe Waste"); @@ -4532,7 +4507,7 @@ public static UserPointsAndAllBagsDto getUserPointsAndAllBagsDto() { .id(1) .name("name") .capacity(20) - .price(150) + .price(150.) .nameEng("nameEng") .limitedIncluded(false) .build()), diff --git a/service/src/test/java/greencity/mapping/bag/BagForUserDtoMapperTest.java b/service/src/test/java/greencity/mapping/bag/BagForUserDtoMapperTest.java new file mode 100644 index 000000000..1f9fcbcdd --- /dev/null +++ b/service/src/test/java/greencity/mapping/bag/BagForUserDtoMapperTest.java @@ -0,0 +1,30 @@ +package greencity.mapping.bag; + +import greencity.ModelUtils; +import greencity.dto.bag.BagForUserDto; +import greencity.entity.order.Bag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@ExtendWith(MockitoExtension.class) +class BagForUserDtoMapperTest { + @InjectMocks + BagForUserDtoMapper bagForUserDtoMapper; + + @Test + void convert() { + BagForUserDto expected = ModelUtils.TEST_BAG_FOR_USER_DTO; + Bag bag = ModelUtils.TEST_BAG; + BagForUserDto actual = bagForUserDtoMapper.convert(bag); + + assertEquals(expected.getService(), actual.getService()); + assertEquals(expected.getServiceEng(), actual.getServiceEng()); + assertEquals(expected.getCapacity(), actual.getCapacity()); + assertEquals(expected.getFullPrice(), actual.getFullPrice()); + } + +} diff --git a/service/src/test/java/greencity/mapping/bag/BagInfoDtoMapperTest.java b/service/src/test/java/greencity/mapping/bag/BagInfoDtoMapperTest.java index 4a07f9f28..57821bf4b 100644 --- a/service/src/test/java/greencity/mapping/bag/BagInfoDtoMapperTest.java +++ b/service/src/test/java/greencity/mapping/bag/BagInfoDtoMapperTest.java @@ -18,13 +18,14 @@ class BagInfoDtoMapperTest { @Test void convert() { + BagInfoDto expectedBagInfoDto = ModelUtils.TEST_BAG_INFO_DTO; Bag bag = ModelUtils.TEST_BAG; BagInfoDto actualBagInfoDto = bagInfoDtoMapper.convert(bag); - assertEquals(bag.getId(), actualBagInfoDto.getId()); - assertEquals(bag.getName(), actualBagInfoDto.getName()); - assertEquals(bag.getNameEng(), actualBagInfoDto.getNameEng()); - assertEquals(bag.getCapacity(), actualBagInfoDto.getCapacity()); - assertEquals(bag.getFullPrice(), actualBagInfoDto.getPrice()); + assertEquals(expectedBagInfoDto.getId(), actualBagInfoDto.getId()); + assertEquals(expectedBagInfoDto.getName(), actualBagInfoDto.getName()); + assertEquals(expectedBagInfoDto.getNameEng(), actualBagInfoDto.getNameEng()); + assertEquals(expectedBagInfoDto.getCapacity(), actualBagInfoDto.getCapacity()); + assertEquals(expectedBagInfoDto.getPrice(), actualBagInfoDto.getPrice()); } } diff --git a/service/src/test/java/greencity/mapping/certificate/CertificateDtoForAddingMapperTest.java b/service/src/test/java/greencity/mapping/certificate/CertificateDtoForAddingMapperTest.java index ee18d3be2..4e629301e 100644 --- a/service/src/test/java/greencity/mapping/certificate/CertificateDtoForAddingMapperTest.java +++ b/service/src/test/java/greencity/mapping/certificate/CertificateDtoForAddingMapperTest.java @@ -21,7 +21,7 @@ class CertificateDtoForAddingMapperTest { void convert() { CertificateDtoForAdding certificateDtoForAdding = ModelUtils.getCertificateDtoForAdding(); - assertEquals(certificateDtoForAdding.getPoints(), + assertEquals(certificateDtoForAdding.getPoints() * 100, certificateDtoForAddingMapper.convert(certificateDtoForAdding).getPoints()); assertEquals(certificateDtoForAdding.getCode(), certificateDtoForAddingMapper.convert(certificateDtoForAdding).getCode()); diff --git a/service/src/test/java/greencity/mapping/order/OrderDelailMapperTest.java b/service/src/test/java/greencity/mapping/order/OrderDelailMapperTest.java index 208dccf45..60fe6604f 100644 --- a/service/src/test/java/greencity/mapping/order/OrderDelailMapperTest.java +++ b/service/src/test/java/greencity/mapping/order/OrderDelailMapperTest.java @@ -5,7 +5,6 @@ import greencity.dto.bag.BagTransDto; import greencity.dto.order.OrderDetailDto; import greencity.dto.order.OrderDetailInfoDto; -import greencity.mapping.order.OrderDelailMapper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -26,7 +25,7 @@ void convert() { OrderDetailDto orderDetailDto = OrderDetailDto.builder() .amount(List.of(BagMappingDto.builder().amount(2).confirmed(2).exported(2).build())) .orderId(1L) - .capacityAndPrice(List.of(BagInfoDto.builder().price(500).capacity(100).name("BigOne").id(1).build())) + .capacityAndPrice(List.of(BagInfoDto.builder().price(500.0).capacity(100).name("BigOne").id(1).build())) .name(List.of(BagTransDto.builder().name("BigOne").build())) .build(); @@ -39,7 +38,7 @@ void convert() { .exportedQuantity(2) .name("BigOne") .orderId(1L) - .price(500) + .price(500.0) .build()); List actual = orderDelailMapper.convert(orderDetailDto); diff --git a/service/src/test/java/greencity/mapping/payment/PaymentInfoMapperTest.java b/service/src/test/java/greencity/mapping/payment/PaymentInfoMapperTest.java index 0cc96c7c6..6d77c65e1 100644 --- a/service/src/test/java/greencity/mapping/payment/PaymentInfoMapperTest.java +++ b/service/src/test/java/greencity/mapping/payment/PaymentInfoMapperTest.java @@ -1,6 +1,7 @@ package greencity.mapping.payment; import greencity.ModelUtils; +import greencity.constant.AppConstant; import greencity.dto.payment.PaymentInfoDto; import greencity.entity.order.Payment; import org.junit.jupiter.api.Test; @@ -8,6 +9,7 @@ import org.mockito.InjectMocks; import org.mockito.junit.jupiter.MockitoExtension; +import java.math.BigDecimal; import java.time.LocalDate; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -23,7 +25,9 @@ void convert() { PaymentInfoDto expected = PaymentInfoDto.builder() .id(payment.getId()) .paymentId(payment.getPaymentId()) - .amount(payment.getAmount().doubleValue()) + .amount(BigDecimal.valueOf(payment.getAmount()) + .movePointLeft(AppConstant.TWO_DECIMALS_AFTER_POINT_IN_CURRENCY) + .doubleValue()) .settlementdate(LocalDate.now().toString()) .build(); PaymentInfoDto actual = paymentInfoMapper.convert(payment); diff --git a/service/src/test/java/greencity/mapping/service/GetServiceDtoMapperTest.java b/service/src/test/java/greencity/mapping/service/GetServiceDtoMapperTest.java index 86950cd16..2c755f216 100644 --- a/service/src/test/java/greencity/mapping/service/GetServiceDtoMapperTest.java +++ b/service/src/test/java/greencity/mapping/service/GetServiceDtoMapperTest.java @@ -17,13 +17,14 @@ class GetServiceDtoMapperTest { @Test void convert() { Service service = ModelUtils.getService(); - GetServiceDto convertDto = mapper.convert(service); + GetServiceDto expectedDto = ModelUtils.getGetServiceDto(); + GetServiceDto actualDto = mapper.convert(service); - Assertions.assertEquals(service.getId(), convertDto.getId()); - Assertions.assertEquals(service.getName(), convertDto.getName()); - Assertions.assertEquals(service.getNameEng(), convertDto.getNameEng()); - Assertions.assertEquals(service.getDescription(), convertDto.getDescription()); - Assertions.assertEquals(service.getDescriptionEng(), convertDto.getDescriptionEng()); - Assertions.assertEquals(service.getPrice(), convertDto.getPrice()); + Assertions.assertEquals(expectedDto.getId(), actualDto.getId()); + Assertions.assertEquals(expectedDto.getName(), actualDto.getName()); + Assertions.assertEquals(expectedDto.getNameEng(), actualDto.getNameEng()); + Assertions.assertEquals(expectedDto.getDescription(), actualDto.getDescription()); + Assertions.assertEquals(expectedDto.getDescriptionEng(), actualDto.getDescriptionEng()); + Assertions.assertEquals(expectedDto.getPrice(), actualDto.getPrice()); } } diff --git a/service/src/test/java/greencity/mapping/service/GetServiceDtoToServiceMapperTest.java b/service/src/test/java/greencity/mapping/service/GetServiceDtoToServiceMapperTest.java new file mode 100644 index 000000000..afb7996f1 --- /dev/null +++ b/service/src/test/java/greencity/mapping/service/GetServiceDtoToServiceMapperTest.java @@ -0,0 +1,30 @@ +package greencity.mapping.service; + +import greencity.ModelUtils; +import greencity.dto.service.GetServiceDto; +import greencity.entity.order.Service; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class GetServiceDtoToServiceMapperTest { + @InjectMocks + private GetServiceDtoToServiceMapper mapper; + + @Test + void convert() { + Service expectedService = ModelUtils.getService(); + GetServiceDto getServiceDto = ModelUtils.getGetServiceDto(); + Service actualService = mapper.convert(getServiceDto); + + Assertions.assertEquals(expectedService.getId(), actualService.getId()); + Assertions.assertEquals(expectedService.getName(), actualService.getName()); + Assertions.assertEquals(expectedService.getNameEng(), actualService.getNameEng()); + Assertions.assertEquals(expectedService.getDescription(), actualService.getDescription()); + Assertions.assertEquals(expectedService.getDescriptionEng(), actualService.getDescriptionEng()); + Assertions.assertEquals(expectedService.getPrice(), actualService.getPrice()); + } +} diff --git a/service/src/test/java/greencity/mapping/service/TariffServiceDtoToBagMapperTest.java b/service/src/test/java/greencity/mapping/service/TariffServiceDtoToBagMapperTest.java new file mode 100644 index 000000000..4aa41adbd --- /dev/null +++ b/service/src/test/java/greencity/mapping/service/TariffServiceDtoToBagMapperTest.java @@ -0,0 +1,35 @@ +package greencity.mapping.service; + +import greencity.ModelUtils; +import greencity.dto.service.TariffServiceDto; +import greencity.entity.order.Bag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@ExtendWith(MockitoExtension.class) +class TariffServiceDtoToBagMapperTest { + @InjectMocks + private TariffServiceDtoToBagMapper mapper; + + @Test + void convert() { + Bag expectedBag = ModelUtils.getTariffBag(); + TariffServiceDto dto = ModelUtils.TariffServiceDto(); + Bag actualBag = mapper.convert(dto); + + assertEquals(expectedBag.getCapacity(), actualBag.getCapacity()); + assertEquals(expectedBag.getPrice(), actualBag.getPrice()); + assertEquals(expectedBag.getCommission(), actualBag.getCommission()); + assertEquals(expectedBag.getFullPrice(), actualBag.getFullPrice()); + assertEquals(expectedBag.getName(), actualBag.getName()); + assertEquals(expectedBag.getDescription(), actualBag.getDescription()); + assertEquals(expectedBag.getNameEng(), actualBag.getNameEng()); + assertEquals(expectedBag.getDescriptionEng(), actualBag.getDescriptionEng()); + assertEquals(expectedBag.getLimitIncluded(), actualBag.getLimitIncluded()); + assertEquals(expectedBag.getCreatedAt(), actualBag.getCreatedAt()); + } +} diff --git a/service/src/test/java/greencity/service/ubs/OrdersForUserServiceImplTest.java b/service/src/test/java/greencity/service/ubs/OrdersForUserServiceImplTest.java index 133b6e201..24d56e55d 100644 --- a/service/src/test/java/greencity/service/ubs/OrdersForUserServiceImplTest.java +++ b/service/src/test/java/greencity/service/ubs/OrdersForUserServiceImplTest.java @@ -1,8 +1,11 @@ package greencity.service.ubs; import greencity.ModelUtils; +import greencity.entity.order.Order; import greencity.enums.SortingOrder; -import greencity.repository.*; +import greencity.repository.OrdersForUserRepository; +import greencity.repository.UserRepository; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -11,12 +14,17 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; +import java.util.List; import java.util.stream.Stream; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.anyLong; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class OrdersForUserServiceImplTest { @@ -47,4 +55,41 @@ private static Stream provideSortingOrdersAndColumnsForGetAllOrders() Arguments.of(SortingOrder.ASC, "order_status"), Arguments.of(SortingOrder.DESC, "order_status")); } + + @Test + void getAllOrdersWithNotEmptyOrderAndNullSumTotalAmountWithoutDiscounts() { + Pageable pageable = PageRequest.of(0, 10, Sort.by("order_date").descending()); + Order order = ModelUtils.getOrder(); + Page page = new PageImpl<>(List.of(order), pageable, 1); + Sort sort = Sort.by(Sort.Direction.valueOf(SortingOrder.DESC.toString()), "payment_amount"); + + when(ordersForUserRepository.getAllOrdersByUserId(PageRequest.of(10, 10, sort), 1L)) + .thenReturn(page); + when(userRepository.getOne(anyLong())).thenReturn(ModelUtils.getUser()); + + ordersForUserService.getAllOrders(PageRequest.of(1, 1), + 1L, SortingOrder.DESC, "payment_amount"); + + verify(ordersForUserRepository).getAllOrdersByUserId(PageRequest.of(10, 10, sort), 1L); + verify(userRepository).getOne(anyLong()); + } + + @Test + void getAllOrdersWithNotEmptyOrderAndNotNullSumTotalAmountWithoutDiscounts() { + Pageable pageable = PageRequest.of(0, 10, Sort.by("order_date").descending()); + Order order = ModelUtils.getOrder(); + order.setSumTotalAmountWithoutDiscounts(50_00L); + Page page = new PageImpl<>(List.of(order), pageable, 1); + Sort sort = Sort.by(Sort.Direction.valueOf(SortingOrder.DESC.toString()), "payment_amount"); + + when(ordersForUserRepository.getAllOrdersByUserId(PageRequest.of(10, 10, sort), 1L)) + .thenReturn(page); + when(userRepository.getOne(anyLong())).thenReturn(ModelUtils.getUser()); + + ordersForUserService.getAllOrders(PageRequest.of(1, 1), + 1L, SortingOrder.DESC, "payment_amount"); + + verify(ordersForUserRepository).getAllOrdersByUserId(PageRequest.of(10, 10, sort), 1L); + verify(userRepository).getOne(anyLong()); + } } diff --git a/service/src/test/java/greencity/service/ubs/SuperAdminServiceImplTest.java b/service/src/test/java/greencity/service/ubs/SuperAdminServiceImplTest.java index 427637720..8b85945f8 100644 --- a/service/src/test/java/greencity/service/ubs/SuperAdminServiceImplTest.java +++ b/service/src/test/java/greencity/service/ubs/SuperAdminServiceImplTest.java @@ -161,6 +161,7 @@ void addTariffServiceTest() { when(employeeRepository.findByUuid(uuid)).thenReturn(Optional.of(employee)); when(tariffsInfoRepository.findById(1L)).thenReturn(Optional.of(tariffsInfo)); when(bagRepository.save(bag)).thenReturn(bag); + when(modelMapper.map(dto, Bag.class)).thenReturn(bag); when(modelMapper.map(bag, GetTariffServiceDto.class)).thenReturn(responseDto); superAdminService.addTariffService(1L, dto, uuid); @@ -168,6 +169,7 @@ void addTariffServiceTest() { verify(employeeRepository).findByUuid(uuid); verify(tariffsInfoRepository).findById(1L); verify(bagRepository).save(bag); + verify(modelMapper).map(dto, Bag.class); verify(modelMapper).map(bag, GetTariffServiceDto.class); } @@ -207,13 +209,13 @@ void getTariffServiceTest() { GetTariffServiceDto dto = ModelUtils.getGetTariffServiceDto(); when(tariffsInfoRepository.existsById(1L)).thenReturn(true); - when(bagRepository.getAllByTariffsInfoId(1L)).thenReturn(bags); + when(bagRepository.findBagsByTariffsInfoId(1L)).thenReturn(bags); when(modelMapper.map(bags.get(0), GetTariffServiceDto.class)).thenReturn(dto); superAdminService.getTariffService(1); verify(tariffsInfoRepository).existsById(1L); - verify(bagRepository).getAllByTariffsInfoId(1L); + verify(bagRepository).findBagsByTariffsInfoId(1L); verify(modelMapper).map(bags.get(0), GetTariffServiceDto.class); } @@ -225,7 +227,7 @@ void getTariffServiceIfTariffNotFoundException() { () -> superAdminService.getTariffService(1)); verify(tariffsInfoRepository).existsById(1L); - verify(bagRepository, never()).getAllByTariffsInfoId(1L); + verify(bagRepository, never()).findBagsByTariffsInfoId(1L); } @Test @@ -316,6 +318,28 @@ void editTariffService() { verify(modelMapper).map(bag, GetTariffServiceDto.class); } + @Test + void editTariffServiceIfCommissionIsNull() { + Bag bag = ModelUtils.getBag(); + Employee employee = ModelUtils.getEmployee(); + TariffServiceDto dto = ModelUtils.getTariffServiceDto(); + dto.setCommission(null); + GetTariffServiceDto editedDto = ModelUtils.getGetTariffServiceDto(); + String uuid = UUID.randomUUID().toString(); + + when(employeeRepository.findByUuid(uuid)).thenReturn(Optional.of(employee)); + when(bagRepository.findById(1)).thenReturn(Optional.of(bag)); + when(bagRepository.save(bag)).thenReturn(bag); + when(modelMapper.map(bag, GetTariffServiceDto.class)).thenReturn(editedDto); + + superAdminService.editTariffService(dto, 1, uuid); + + verify(employeeRepository).findByUuid(uuid); + verify(bagRepository).findById(1); + verify(bagRepository).save(bag); + verify(modelMapper).map(bag, GetTariffServiceDto.class); + } + @Test void editTariffServiceIfEmployeeNotFoundException() { TariffServiceDto dto = ModelUtils.getTariffServiceDto(); @@ -488,6 +512,7 @@ void addService() { when(tariffsInfoRepository.findById(1L)).thenReturn(Optional.of(tariffsInfo)); when(employeeRepository.findByUuid(uuid)).thenReturn(Optional.of(employee)); when(serviceRepository.save(service)).thenReturn(createdService); + when(modelMapper.map(serviceDto, Service.class)).thenReturn(service); when(modelMapper.map(createdService, GetServiceDto.class)).thenReturn(getServiceDto); assertEquals(getServiceDto, superAdminService.addService(1L, serviceDto, uuid)); @@ -498,6 +523,7 @@ void addService() { verify(serviceRepository).findServiceByTariffsInfoId(1L); verify(serviceRepository).save(service); verify(modelMapper).map(createdService, GetServiceDto.class); + verify(modelMapper).map(createdService, GetServiceDto.class); } @Test diff --git a/service/src/test/java/greencity/service/ubs/UBSClientServiceImplTest.java b/service/src/test/java/greencity/service/ubs/UBSClientServiceImplTest.java index 0bb8aafac..c28f049cd 100644 --- a/service/src/test/java/greencity/service/ubs/UBSClientServiceImplTest.java +++ b/service/src/test/java/greencity/service/ubs/UBSClientServiceImplTest.java @@ -1,27 +1,44 @@ package greencity.service.ubs; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; -import java.util.stream.Collectors; -import javax.persistence.EntityNotFoundException; - +import greencity.ModelUtils; +import greencity.client.FondyClient; +import greencity.client.UserRemoteClient; +import greencity.constant.ErrorMessage; +import greencity.dto.CreateAddressRequestDto; +import greencity.dto.OrderCourierPopUpDto; +import greencity.dto.TariffsForLocationDto; +import greencity.dto.address.AddressDto; +import greencity.dto.bag.BagForUserDto; import greencity.dto.bag.BagOrderDto; import greencity.dto.bag.BagTranslationDto; +import greencity.dto.certificate.CertificateDto; +import greencity.dto.customer.UbsCustomersDto; +import greencity.dto.customer.UbsCustomersDtoUpdate; import greencity.dto.courier.CourierDto; import greencity.dto.employee.UserEmployeeAuthorityDto; +import greencity.dto.order.EventDto; +import greencity.dto.order.FondyOrderResponse; +import greencity.dto.order.MakeOrderAgainDto; +import greencity.dto.order.OrderAddressDtoRequest; +import greencity.dto.order.OrderCancellationReasonDto; +import greencity.dto.order.OrderClientDto; +import greencity.dto.order.OrderFondyClientDto; +import greencity.dto.order.OrderPaymentDetailDto; +import greencity.dto.order.OrderResponseDto; +import greencity.dto.order.OrderWithAddressesResponseDto; +import greencity.dto.order.OrdersDataForUserDto; +import greencity.dto.pageble.PageableDto; +import greencity.dto.payment.FondyPaymentResponse; +import greencity.dto.payment.PaymentResponseDto; import greencity.dto.position.PositionAuthoritiesDto; +import greencity.dto.user.AllPointsUserDto; +import greencity.dto.user.PasswordStatusDto; +import greencity.dto.user.PersonalDataDto; +import greencity.dto.user.UserInfoDto; +import greencity.dto.user.UserProfileCreateDto; +import greencity.dto.user.UserProfileDto; +import greencity.dto.user.UserProfileUpdateDto; +import greencity.entity.coords.Coordinates; import greencity.entity.order.Bag; import greencity.entity.order.Certificate; import greencity.entity.order.Event; @@ -31,8 +48,11 @@ import greencity.entity.order.Payment; import greencity.entity.order.TariffsInfo; import greencity.entity.telegram.TelegramBot; +import greencity.entity.user.User; import greencity.entity.user.employee.Employee; +import greencity.entity.user.ubs.Address; import greencity.entity.user.ubs.OrderAddress; +import greencity.entity.user.ubs.UBSuser; import greencity.entity.viber.ViberBot; import greencity.enums.AddressStatus; import greencity.enums.CertificateStatus; @@ -41,6 +61,11 @@ import greencity.enums.OrderPaymentStatus; import greencity.enums.OrderStatus; import greencity.enums.TariffStatus; +import greencity.exceptions.BadRequestException; +import greencity.exceptions.NotFoundException; +import greencity.exceptions.http.AccessDeniedException; +import greencity.exceptions.user.UBSuserNotFoundException; +import greencity.exceptions.user.UserNotFoundException; import greencity.repository.AddressRepository; import greencity.repository.BagRepository; import greencity.repository.CertificateRepository; @@ -61,6 +86,8 @@ import greencity.repository.UserRepository; import greencity.repository.ViberBotRepository; import greencity.service.google.GoogleApiService; +import greencity.util.Bot; +import greencity.util.EncryptionUtil; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -75,50 +102,22 @@ import org.springframework.data.domain.Sort; import org.springframework.transaction.annotation.Transactional; -import greencity.ModelUtils; -import greencity.client.FondyClient; -import greencity.client.UserRemoteClient; -import greencity.constant.ErrorMessage; -import greencity.dto.CreateAddressRequestDto; -import greencity.dto.OrderCourierPopUpDto; -import greencity.dto.TariffsForLocationDto; -import greencity.dto.address.AddressDto; -import greencity.dto.bag.BagForUserDto; -import greencity.dto.certificate.CertificateDto; -import greencity.dto.customer.UbsCustomersDto; -import greencity.dto.customer.UbsCustomersDtoUpdate; -import greencity.dto.order.EventDto; -import greencity.dto.order.FondyOrderResponse; -import greencity.dto.order.MakeOrderAgainDto; -import greencity.dto.order.OrderAddressDtoRequest; -import greencity.dto.order.OrderCancellationReasonDto; -import greencity.dto.order.OrderClientDto; -import greencity.dto.order.OrderFondyClientDto; -import greencity.dto.order.OrderPaymentDetailDto; -import greencity.dto.order.OrderResponseDto; -import greencity.dto.order.OrderWithAddressesResponseDto; -import greencity.dto.order.OrdersDataForUserDto; -import greencity.dto.pageble.PageableDto; -import greencity.dto.payment.FondyPaymentResponse; -import greencity.dto.payment.PaymentResponseDto; -import greencity.dto.user.AllPointsUserDto; -import greencity.dto.user.PasswordStatusDto; -import greencity.dto.user.PersonalDataDto; -import greencity.dto.user.UserInfoDto; -import greencity.dto.user.UserProfileDto; -import greencity.dto.user.UserProfileUpdateDto; -import greencity.dto.user.UserProfileCreateDto; -import greencity.entity.coords.Coordinates; -import greencity.entity.user.User; -import greencity.entity.user.ubs.Address; -import greencity.entity.user.ubs.UBSuser; -import greencity.exceptions.BadRequestException; -import greencity.exceptions.NotFoundException; -import greencity.exceptions.http.AccessDeniedException; -import greencity.exceptions.user.UBSuserNotFoundException; -import greencity.exceptions.user.UserNotFoundException; -import greencity.util.Bot; -import greencity.util.EncryptionUtil; +import javax.persistence.EntityNotFoundException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; import static greencity.ModelUtils.TEST_BAG_LIST; import static greencity.ModelUtils.TEST_EMAIL; @@ -207,7 +206,6 @@ import static greencity.constant.ErrorMessage.TARIFF_OR_LOCATION_IS_DEACTIVATED; import static greencity.constant.ErrorMessage.USER_WITH_CURRENT_UUID_DOES_NOT_EXIST; import static org.junit.Assert.assertTrue; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -304,6 +302,8 @@ class UBSClientServiceImplTest { @Mock private ViberBotRepository viberBotRepository; + @Mock + private UBSManagementService ubsManagementService; @Test @Transactional @@ -720,7 +720,168 @@ void testSaveToDB() throws IllegalAccessException { Bag bag = new Bag(); bag.setCapacity(120); - bag.setFullPrice(400); + bag.setFullPrice(400_00L); + + UBSuser ubSuser = getUBSuser(); + + OrderAddress orderAddress = ubSuser.getOrderAddress(); + orderAddress.setAddressStatus(AddressStatus.NEW); + + Order order1 = getOrder(); + order1.setPayment(new ArrayList<>()); + Payment payment1 = getPayment(); + payment1.setId(1L); + order1.getPayment().add(payment1); + + Field[] fields = UBSClientServiceImpl.class.getDeclaredFields(); + for (Field f : fields) { + if (f.getName().equals("merchantId")) { + f.setAccessible(true); + f.set(ubsService, "1"); + } + } + + when(userRepository.findByUuid("35467585763t4sfgchjfuyetf")).thenReturn(user); + when(tariffsInfoRepository.findTariffsInfoByBagIdAndLocationId(anyList(), anyLong())) + .thenReturn(Optional.of(getTariffInfo())); + when(bagRepository.findById(3)).thenReturn(Optional.of(bag)); + when(ubsUserRepository.findById(1L)).thenReturn(Optional.of(ubSuser)); + when(modelMapper.map(dto, Order.class)).thenReturn(order); + when(modelMapper.map(dto.getPersonalData(), UBSuser.class)).thenReturn(ubSuser); + when(orderRepository.findById(any())).thenReturn(Optional.of(order1)); + when(encryptionUtil.formRequestSignature(any(), eq(null), eq("1"))).thenReturn("TestValue"); + when(fondyClient.getCheckoutResponse(any())).thenReturn(getSuccessfulFondyResponse()); + + FondyOrderResponse result = ubsService.saveFullOrderToDB(dto, "35467585763t4sfgchjfuyetf", null); + Assertions.assertNotNull(result); + + } + + @Test + void testSaveToDBWithCertificates() throws IllegalAccessException { + User user = getUserWithLastLocation(); + user.setAlternateEmail("test@mail.com"); + user.setCurrentPoints(900); + + OrderResponseDto dto = getOrderResponseDto(); + dto.getBags().get(0).setAmount(15); + dto.setCertificates(Set.of("4444-4444")); + Order order = getOrder(); + user.setOrders(new ArrayList<>()); + user.getOrders().add(order); + user.setChangeOfPointsList(new ArrayList<>()); + + Bag bag = new Bag(); + bag.setCapacity(120); + bag.setFullPrice(400_00L); + + UBSuser ubSuser = getUBSuser(); + + OrderAddress orderAddress = ubSuser.getOrderAddress(); + orderAddress.setAddressStatus(AddressStatus.NEW); + + Order order1 = getOrder(); + order1.setPayment(new ArrayList<>()); + Payment payment1 = getPayment(); + payment1.setId(1L); + order1.getPayment().add(payment1); + + Field[] fields = UBSClientServiceImpl.class.getDeclaredFields(); + for (Field f : fields) { + if (f.getName().equals("merchantId")) { + f.setAccessible(true); + f.set(ubsService, "1"); + } + } + + when(userRepository.findByUuid("35467585763t4sfgchjfuyetf")).thenReturn(user); + when(tariffsInfoRepository.findTariffsInfoByBagIdAndLocationId(anyList(), anyLong())) + .thenReturn(Optional.of(getTariffInfo())); + when(bagRepository.findById(3)).thenReturn(Optional.of(bag)); + when(certificateRepository.findById(anyString())).thenReturn(Optional.of(getCertificate())); + when(ubsUserRepository.findById(1L)).thenReturn(Optional.of(ubSuser)); + when(modelMapper.map(dto, Order.class)).thenReturn(order); + when(modelMapper.map(dto.getPersonalData(), UBSuser.class)).thenReturn(ubSuser); + when(orderRepository.findById(any())).thenReturn(Optional.of(order1)); + when(encryptionUtil.formRequestSignature(any(), eq(null), eq("1"))).thenReturn("TestValue"); + when(fondyClient.getCheckoutResponse(any())).thenReturn(getSuccessfulFondyResponse()); + + FondyOrderResponse result = ubsService.saveFullOrderToDB(dto, "35467585763t4sfgchjfuyetf", null); + Assertions.assertNotNull(result); + + } + + @Test + void testSaveToDBWithDontSendLinkToFondy() throws IllegalAccessException { + User user = getUserWithLastLocation(); + user.setAlternateEmail("test@mail.com"); + user.setCurrentPoints(900); + + OrderResponseDto dto = getOrderResponseDto(); + dto.getBags().get(0).setAmount(15); + dto.setCertificates(Set.of("4444-4444")); + Order order = getOrder(); + user.setOrders(new ArrayList<>()); + user.getOrders().add(order); + user.setChangeOfPointsList(new ArrayList<>()); + + Bag bag = new Bag(); + bag.setCapacity(120); + bag.setFullPrice(400_00L); + + Certificate certificate = getCertificate(); + certificate.setPoints(1000_00); + + UBSuser ubSuser = getUBSuser(); + + OrderAddress orderAddress = ubSuser.getOrderAddress(); + orderAddress.setAddressStatus(AddressStatus.NEW); + + Order order1 = getOrder(); + order1.setPayment(new ArrayList<>()); + Payment payment1 = getPayment(); + payment1.setId(1L); + order1.getPayment().add(payment1); + + Field[] fields = UBSClientServiceImpl.class.getDeclaredFields(); + for (Field f : fields) { + if (f.getName().equals("merchantId")) { + f.setAccessible(true); + f.set(ubsService, "1"); + } + } + + when(userRepository.findByUuid("35467585763t4sfgchjfuyetf")).thenReturn(user); + when(tariffsInfoRepository.findTariffsInfoByBagIdAndLocationId(anyList(), anyLong())) + .thenReturn(Optional.of(getTariffInfo())); + when(bagRepository.findById(3)).thenReturn(Optional.of(bag)); + when(certificateRepository.findById(anyString())).thenReturn(Optional.of(certificate)); + when(ubsUserRepository.findById(1L)).thenReturn(Optional.of(ubSuser)); + when(modelMapper.map(dto, Order.class)).thenReturn(order); + when(modelMapper.map(dto.getPersonalData(), UBSuser.class)).thenReturn(ubSuser); + + FondyOrderResponse result = ubsService.saveFullOrderToDB(dto, "35467585763t4sfgchjfuyetf", null); + Assertions.assertNotNull(result); + + } + + @Test + void testSaveToDBWhenSumToPayLessThanPoints() throws IllegalAccessException { + User user = getUserWithLastLocation(); + user.setAlternateEmail("test@mail.com"); + user.setCurrentPoints(5_000); + + OrderResponseDto dto = getOrderResponseDto(); + dto.getBags().get(0).setAmount(2); + dto.setPointsToUse(2_000); + Order order = getOrder(); + user.setOrders(new ArrayList<>()); + user.getOrders().add(order); + user.setChangeOfPointsList(new ArrayList<>()); + + Bag bag = new Bag(); + bag.setCapacity(120); + bag.setFullPrice(400_00L); UBSuser ubSuser = getUBSuser(); @@ -757,6 +918,67 @@ void testSaveToDB() throws IllegalAccessException { } + @Test + void testSaveToDbThrowBadRequestExceptionPriceLowerThanLimit() throws IllegalAccessException { + User user = getUserWithLastLocation(); + user.setAlternateEmail("test@mail.com"); + user.setCurrentPoints(900); + + OrderResponseDto dto = getOrderResponseDto(); + dto.getBags().get(0).setAmount(1); + Order order = getOrder(); + user.setOrders(new ArrayList<>()); + user.getOrders().add(order); + user.setChangeOfPointsList(new ArrayList<>()); + + Bag bag = new Bag(); + bag.setCapacity(120); + bag.setFullPrice(400_00L); + + when(userRepository.findByUuid("35467585763t4sfgchjfuyetf")).thenReturn(user); + when(tariffsInfoRepository.findTariffsInfoByBagIdAndLocationId(anyList(), anyLong())) + .thenReturn(Optional.of(getTariffInfo())); + when(bagRepository.findById(3)).thenReturn(Optional.of(bag)); + + assertThrows(BadRequestException.class, + () -> ubsService.saveFullOrderToDB(dto, "35467585763t4sfgchjfuyetf", null)); + + verify(userRepository, times(1)).findByUuid(anyString()); + verify(tariffsInfoRepository, times(1)) + .findTariffsInfoByBagIdAndLocationId(anyList(), anyLong()); + verify(bagRepository, times(1)).findById(anyInt()); + } + + @Test + void testSaveToDbThrowBadRequestExceptionPriceGreaterThanLimit() throws IllegalAccessException { + User user = getUserWithLastLocation(); + user.setAlternateEmail("test@mail.com"); + user.setCurrentPoints(900); + + OrderResponseDto dto = getOrderResponseDto(); + Order order = getOrder(); + user.setOrders(new ArrayList<>()); + user.getOrders().add(order); + user.setChangeOfPointsList(new ArrayList<>()); + + Bag bag = new Bag(); + bag.setCapacity(120); + bag.setFullPrice(400_00L); + + when(userRepository.findByUuid("35467585763t4sfgchjfuyetf")).thenReturn(user); + when(tariffsInfoRepository.findTariffsInfoByBagIdAndLocationId(anyList(), anyLong())) + .thenReturn(Optional.of(getTariffInfo())); + when(bagRepository.findById(3)).thenReturn(Optional.of(bag)); + + assertThrows(BadRequestException.class, + () -> ubsService.saveFullOrderToDB(dto, "35467585763t4sfgchjfuyetf", null)); + + verify(userRepository, times(1)).findByUuid(anyString()); + verify(tariffsInfoRepository, times(1)) + .findTariffsInfoByBagIdAndLocationId(anyList(), anyLong()); + verify(bagRepository, times(1)).findById(anyInt()); + } + @Test void testSaveToDBWShouldThrowBadRequestException() throws IllegalAccessException { User user = getUserWithLastLocation(); @@ -772,7 +994,7 @@ void testSaveToDBWShouldThrowBadRequestException() throws IllegalAccessException Bag bag = new Bag(); bag.setCapacity(120); - bag.setFullPrice(400); + bag.setFullPrice(400_00L); UBSuser ubSuser = getUBSuser(); @@ -814,7 +1036,7 @@ void testSaveToDBWShouldThrowTariffNotFoundExceptionException() { Bag bag = new Bag(); bag.setCapacity(120); - bag.setFullPrice(400); + bag.setFullPrice(400_00L); UBSuser ubSuser = getUBSuser(); @@ -854,7 +1076,7 @@ void testSaveToDBWShouldThrowBagNotFoundExceptionException() throws IllegalAcces Bag bag = new Bag(); bag.setCapacity(120); - bag.setFullPrice(400); + bag.setFullPrice(400_00L); UBSuser ubSuser = getUBSuser(); @@ -905,7 +1127,7 @@ void testSaveToDBWithoutOrderUnpaid() throws IllegalAccessException { Bag bag = new Bag(); bag.setCapacity(120); - bag.setFullPrice(400); + bag.setFullPrice(400_00L); UBSuser ubSuser = getUBSuser(); @@ -948,7 +1170,7 @@ void saveToDBFailPaidOrder() { order.setOrderPaymentStatus(OrderPaymentStatus.PAID); Bag bag = new Bag(); bag.setCapacity(120); - bag.setFullPrice(400); + bag.setFullPrice(400_00L); when(userRepository.findByUuid("35467585763t4sfgchjfuyetf")).thenReturn(user); when(tariffsInfoRepository.findTariffsInfoByBagIdAndLocationId(anyList(), anyLong())) @@ -974,7 +1196,7 @@ void testSaveToDBThrowsException() throws IllegalAccessException { Bag bag = new Bag(); bag.setCapacity(100); - bag.setFullPrice(400); + bag.setFullPrice(400_00L); UBSuser ubSuser = getUBSuser(); @@ -1107,7 +1329,7 @@ void makeOrderAgain() { BagOrderDto.builder() .bagId(1) .capacity(10) - .price(100) + .price(100.) .bagAmount(1) .name("name") .nameEng("nameEng") @@ -1115,7 +1337,7 @@ void makeOrderAgain() { BagOrderDto.builder() .bagId(2) .capacity(10) - .price(100) + .price(100.) .name("name") .nameEng("nameEng") .build())) @@ -2063,6 +2285,42 @@ void getOrderPaymentDetail() { assertEquals(getOrderPaymentDetailDto(), actual); } + @Test + void getOrderPaymentDetailIfCertificateAndPointsAbsent() { + Order order = getOrder(); + order.setPayment(List.of(getPayment())); + order.setPointsToUse(0); + OrderPaymentDetailDto expected = getOrderPaymentDetailDto(); + expected.setPointsToUse(0); + expected.setCertificates(0); + expected.setAmountToPay(95000L); + expected.setAmount(95000L); + + when(orderRepository.findById(1L)).thenReturn(Optional.of(order)); + + OrderPaymentDetailDto actual = ubsService.getOrderPaymentDetail(1L); + + assertEquals(expected, actual); + } + + @Test + void getOrderPaymentDetailIfPaymentIsEmpty() { + Order order = getOrder(); + order.setPayment(List.of()); + Certificate certificate = getCertificate(); + certificate.setOrder(order); + order.setCertificates(Set.of(certificate)); + order.setPayment(List.of(getPayment())); + OrderPaymentDetailDto expected = getOrderPaymentDetailDto(); + expected.setAmount(0L); + + when(orderRepository.findById(1L)).thenReturn(Optional.of(order)); + + OrderPaymentDetailDto actual = ubsService.getOrderPaymentDetail(1L); + + assertEquals(getOrderPaymentDetailDto(), actual); + } + @Test void getOrderPaymentDetailShouldThrowOrderNotFoundException() { when(orderRepository.findById(any())).thenReturn(Optional.empty()); @@ -2187,9 +2445,203 @@ void processOrderFondyClient() throws Exception { value.put(1, 22); order.setAmountOfBagsOrdered(value); order.setPointsToUse(100); - order.setSumTotalAmountWithoutDiscounts(1000L); + order.setSumTotalAmountWithoutDiscounts(1000_00L); + order.setCertificates(Set.of(getCertificate())); + order.setPayment(TEST_PAYMENT_LIST); + User user = getUser(); + user.setCurrentPoints(100); + user.setChangeOfPointsList(new ArrayList<>()); + order.setUser(user); + + OrderFondyClientDto dto = getOrderFondyClientDto(); + Field[] fields = UBSClientServiceImpl.class.getDeclaredFields(); + for (Field f : fields) { + if (f.getName().equals("merchantId")) { + f.setAccessible(true); + f.set(ubsService, "1"); + } + } + + Certificate certificate = getCertificate(); + CertificateDto certificateDto = createCertificateDto(); + + when(orderRepository.findById(1L)).thenReturn(Optional.of(order)); + when(userRepository.findUserByUuid("uuid")).thenReturn(Optional.of(user)); + + when(encryptionUtil.formRequestSignature(any(), eq(null), eq("1"))).thenReturn("TestValue"); + when(fondyClient.getCheckoutResponse(any())).thenReturn(getSuccessfulFondyResponse()); + when(bagRepository.findBagsByOrderId(order.getId())).thenReturn(TEST_BAG_LIST); + when(modelMapper.map(certificate, CertificateDto.class)).thenReturn(certificateDto); + when(modelMapper.map(any(Bag.class), eq(BagForUserDto.class))).thenReturn(TEST_BAG_FOR_USER_DTO); + + ubsService.processOrderFondyClient(dto, "uuid"); + + verify(encryptionUtil).formRequestSignature(any(), eq(null), eq("1")); + verify(fondyClient).getCheckoutResponse(any()); + + } + + @Test + void processOrderFondyClient2() throws Exception { + Order order = getOrderCount(); + Certificate certificate = getCertificate(); + certificate.setPoints(1500); + HashMap value = new HashMap<>(); + value.put(1, 22); + order.setAmountOfBagsOrdered(value); + order.setPointsToUse(100); + order.setSumTotalAmountWithoutDiscounts(1000_00L); + order.setCertificates(Set.of(certificate)); + order.setPayment(TEST_PAYMENT_LIST); + User user = getUser(); + user.setCurrentPoints(100); + user.setChangeOfPointsList(new ArrayList<>()); + order.setUser(user); + + OrderFondyClientDto dto = getOrderFondyClientDto(); + dto.setCertificates(Set.of("1111-1234")); + + Field[] fields = UBSClientServiceImpl.class.getDeclaredFields(); + for (Field f : fields) { + if (f.getName().equals("merchantId")) { + f.setAccessible(true); + f.set(ubsService, "1"); + } + } + + CertificateDto certificateDto = createCertificateDto(); + certificateDto.setPoints(1500); + + when(orderRepository.findById(1L)).thenReturn(Optional.of(order)); + when(userRepository.findUserByUuid("uuid")).thenReturn(Optional.of(user)); + when(certificateRepository.findAllByCodeAndCertificateStatus(new ArrayList<>(dto.getCertificates()), + CertificateStatus.ACTIVE)).thenReturn(Set.of(certificate)); + when(bagRepository.findBagsByOrderId(order.getId())).thenReturn(TEST_BAG_LIST); + when(modelMapper.map(certificate, CertificateDto.class)).thenReturn(certificateDto); + when(modelMapper.map(any(Bag.class), eq(BagForUserDto.class))).thenReturn(TEST_BAG_FOR_USER_DTO); + + ubsService.processOrderFondyClient(dto, "uuid"); + + verify(orderRepository).findById(1L); + verify(userRepository).findUserByUuid("uuid"); + verify(certificateRepository).findAllByCodeAndCertificateStatus(new ArrayList<>(dto.getCertificates()), + CertificateStatus.ACTIVE); + verify(bagRepository).findBagsByOrderId(order.getId()); + verify(modelMapper).map(certificate, CertificateDto.class); + verify(modelMapper).map(any(Bag.class), eq(BagForUserDto.class)); + } + + @Test + void processOrderFondyClientCertificeteNotFoundExeption() throws Exception { + Order order = getOrderCount(); + Certificate certificate = getCertificate(); + certificate.setPoints(1500); + HashMap value = new HashMap<>(); + value.put(1, 22); + order.setAmountOfBagsOrdered(value); + order.setPointsToUse(100); + order.setSumTotalAmountWithoutDiscounts(1000_00L); + order.setCertificates(Set.of(certificate)); + order.setPayment(TEST_PAYMENT_LIST); + User user = getUser(); + user.setCurrentPoints(100); + user.setChangeOfPointsList(new ArrayList<>()); + order.setUser(user); + + OrderFondyClientDto dto = getOrderFondyClientDto(); + dto.setCertificates(Set.of("1111-1234")); + + Field[] fields = UBSClientServiceImpl.class.getDeclaredFields(); + for (Field f : fields) { + if (f.getName().equals("merchantId")) { + f.setAccessible(true); + f.set(ubsService, "1"); + } + } + + CertificateDto certificateDto = createCertificateDto(); + certificateDto.setPoints(1500); + + when(orderRepository.findById(1L)).thenReturn(Optional.of(order)); + when(userRepository.findUserByUuid("uuid")).thenReturn(Optional.of(user)); + when(certificateRepository.findAllByCodeAndCertificateStatus(new ArrayList<>(dto.getCertificates()), + CertificateStatus.ACTIVE)).thenReturn(Collections.emptySet()); + when(bagRepository.findBagsByOrderId(order.getId())).thenReturn(TEST_BAG_LIST); + when(modelMapper.map(certificate, CertificateDto.class)).thenReturn(certificateDto); + when(modelMapper.map(any(Bag.class), eq(BagForUserDto.class))).thenReturn(TEST_BAG_FOR_USER_DTO); + + assertThrows(NotFoundException.class, () -> ubsService.processOrderFondyClient(dto, "uuid")); + + verify(orderRepository).findById(1L); + verify(userRepository).findUserByUuid("uuid"); + verify(certificateRepository).findAllByCodeAndCertificateStatus(new ArrayList<>(dto.getCertificates()), + CertificateStatus.ACTIVE); + verify(bagRepository).findBagsByOrderId(order.getId()); + verify(modelMapper).map(certificate, CertificateDto.class); + verify(modelMapper).map(any(Bag.class), eq(BagForUserDto.class)); + } + + @Test + void processOrderFondyClientCertificeteNotFoundExeption2() throws Exception { + Order order = getOrderCount(); + Certificate certificate = getCertificate(); + certificate.setPoints(1500); + HashMap value = new HashMap<>(); + value.put(1, 22); + order.setAmountOfBagsOrdered(value); + order.setPointsToUse(100); + order.setSumTotalAmountWithoutDiscounts(1000_00L); + order.setCertificates(Set.of(certificate)); + order.setPayment(TEST_PAYMENT_LIST); + User user = getUser(); + user.setCurrentPoints(100); + user.setChangeOfPointsList(new ArrayList<>()); + order.setUser(user); + + OrderFondyClientDto dto = getOrderFondyClientDto(); + dto.setCertificates(Set.of("1111-1234", "2222-1234")); + + Field[] fields = UBSClientServiceImpl.class.getDeclaredFields(); + for (Field f : fields) { + if (f.getName().equals("merchantId")) { + f.setAccessible(true); + f.set(ubsService, "1"); + } + } + + CertificateDto certificateDto = createCertificateDto(); + certificateDto.setPoints(1500); + + when(orderRepository.findById(1L)).thenReturn(Optional.of(order)); + when(userRepository.findUserByUuid("uuid")).thenReturn(Optional.of(user)); + when(certificateRepository.findAllByCodeAndCertificateStatus(new ArrayList<>(dto.getCertificates()), + CertificateStatus.ACTIVE)).thenReturn(Set.of(certificate)); + when(bagRepository.findBagsByOrderId(order.getId())).thenReturn(TEST_BAG_LIST); + when(modelMapper.map(certificate, CertificateDto.class)).thenReturn(certificateDto); + when(modelMapper.map(any(Bag.class), eq(BagForUserDto.class))).thenReturn(TEST_BAG_FOR_USER_DTO); + + assertThrows(NotFoundException.class, () -> ubsService.processOrderFondyClient(dto, "uuid")); + + verify(orderRepository).findById(1L); + verify(userRepository).findUserByUuid("uuid"); + verify(certificateRepository).findAllByCodeAndCertificateStatus(new ArrayList<>(dto.getCertificates()), + CertificateStatus.ACTIVE); + verify(bagRepository).findBagsByOrderId(order.getId()); + verify(modelMapper).map(certificate, CertificateDto.class); + verify(modelMapper).map(any(Bag.class), eq(BagForUserDto.class)); + } + + @Test + void processOrderFondyClientIfSumToPayLessThanPoints() throws Exception { + Order order = getOrderCount(); + HashMap value = new HashMap<>(); + value.put(1, 22); + order.setAmountOfBagsOrdered(value); + order.setPointsToUse(100); + order.setSumTotalAmountWithoutDiscounts(1000_00L); order.setCertificates(Set.of(getCertificate())); order.setPayment(TEST_PAYMENT_LIST); + order.getPayment().get(0).setAmount(1000_00L); User user = getUser(); user.setCurrentPoints(100); user.setChangeOfPointsList(new ArrayList<>()); @@ -2246,7 +2698,7 @@ void saveFullOrderToDBForIF() throws IllegalAccessException { Bag bag = new Bag(); bag.setCapacity(120); - bag.setFullPrice(400); + bag.setFullPrice(400_00L); UBSuser ubSuser = getUBSuser(); @@ -2301,7 +2753,7 @@ void saveFullOrderToDBWhenSumToPayeqNull() throws IllegalAccessException { Bag bag = new Bag(); bag.setCapacity(120); - bag.setFullPrice(400); + bag.setFullPrice(400_00L); UBSuser ubSuser = getUBSuser().setId(null); @@ -2353,7 +2805,7 @@ void testSaveToDBfromIForIFThrowsException() throws IllegalAccessException { Bag bag = new Bag(); bag.setCapacity(100); - bag.setFullPrice(400); + bag.setFullPrice(400_00L); UBSuser ubSuser = getUBSuser(); @@ -2397,7 +2849,7 @@ void testCheckSumIfCourierLimitBySumOfOrderForIF1() throws IllegalAccessExceptio Bag bag = new Bag(); bag.setCapacity(120); - bag.setFullPrice(400); + bag.setFullPrice(400_00L); UBSuser ubSuser = getUBSuser(); @@ -2442,7 +2894,7 @@ void testCheckSumIfCourierLimitBySumOfOrderForIF2() throws InvocationTargetExcep Bag bag = new Bag(); bag.setCapacity(120); - bag.setFullPrice(400); + bag.setFullPrice(400_00L); UBSuser ubSuser = getUBSuser(); @@ -2584,7 +3036,7 @@ void getOrderForUserTest() { BagForUserDto bagForUserDto = ordersDataForUserDto.getBags().get(0); bag.setCapacity(120); - bag.setFullPrice(1200); + bag.setFullPrice(1200_00L); order.setAmountOfBagsOrdered(Map.of(1, 10)); bags.add(bag); order.setUser(user); @@ -2640,7 +3092,7 @@ void getOrdersForUserTest() { BagForUserDto bagForUserDto = ordersDataForUserDto.getBags().get(0); bag.setCapacity(120); - bag.setFullPrice(1200); + bag.setFullPrice(1200_00L); order.setAmountOfBagsOrdered(Map.of(1, 10)); bags.add(bag); order.setUser(user); @@ -2689,7 +3141,7 @@ void testOrdersForUserWithExportedQuantity() { BagForUserDto bagForUserDto = ordersDataForUserDto.getBags().get(0); bag.setCapacity(120); - bag.setFullPrice(1200); + bag.setFullPrice(1200_00L); order.setExportedQuantity(Map.of(1, 10)); bags.add(bag); order.setUser(user); @@ -2738,7 +3190,7 @@ void testOrdersForUserWithConfirmedQuantity() { BagForUserDto bagForUserDto = ordersDataForUserDto.getBags().get(0); bag.setCapacity(120); - bag.setFullPrice(1200); + bag.setFullPrice(1200_00L); order.setConfirmedQuantity(Map.of(1, 10)); bags.add(bag); order.setUser(user); @@ -2912,7 +3364,7 @@ void checkIfAddressHasBeenDeletedTest() throws IllegalAccessException { Bag bag = new Bag(); bag.setCapacity(120); - bag.setFullPrice(400); + bag.setFullPrice(400_00L); UBSuser ubSuser = getUBSuser(); @@ -2958,7 +3410,7 @@ void checkAddressUserTest() throws IllegalAccessException { Bag bag = new Bag(); bag.setCapacity(120); - bag.setFullPrice(400); + bag.setFullPrice(400_00L); UBSuser ubSuser = getUBSuser(); @@ -3001,7 +3453,7 @@ void checkIfUserHaveEnoughPointsTest() throws IllegalAccessException { Bag bag = new Bag(); bag.setCapacity(120); - bag.setFullPrice(400); + bag.setFullPrice(400_00L); Field[] fields = UBSClientServiceImpl.class.getDeclaredFields(); for (Field f : fields) { @@ -3078,7 +3530,7 @@ void testOrdersForUserWithQuantity() { List orderList = new ArrayList<>(); bag.setCapacity(120); - bag.setFullPrice(1200); + bag.setFullPrice(1200_00L); bags.add(bag); order.setUser(user); order.setOrderPaymentStatus(OrderPaymentStatus.PAID); diff --git a/service/src/test/java/greencity/service/ubs/UBSManagementServiceImplTest.java b/service/src/test/java/greencity/service/ubs/UBSManagementServiceImplTest.java index 85c98ffa2..36e8e5734 100644 --- a/service/src/test/java/greencity/service/ubs/UBSManagementServiceImplTest.java +++ b/service/src/test/java/greencity/service/ubs/UBSManagementServiceImplTest.java @@ -33,12 +33,6 @@ import greencity.dto.user.AddBonusesToUserDto; import greencity.dto.user.AddingPointsToUserDto; import greencity.dto.violation.ViolationsInfoDto; -import greencity.dto.pageble.PageableDto; -import greencity.dto.payment.ManualPaymentRequestDto; -import greencity.dto.payment.PaymentInfoDto; -import greencity.dto.user.AddBonusesToUserDto; -import greencity.dto.user.AddingPointsToUserDto; -import greencity.dto.violation.ViolationsInfoDto; import greencity.entity.order.Certificate; import greencity.entity.order.Order; import greencity.entity.order.OrderPaymentStatusTranslation; @@ -523,7 +517,7 @@ void checkReturnOverpaymentInfo() { order.setUser(ModelUtils.getUser()); - Long sumToPay = 0L; + Double sumToPay = 0.; assertEquals("Зарахування на бонусний рахунок", ubsManagementService.returnOverpaymentInfo(1L, sumToPay, 0L) .getPaymentInfoDtos().get(1).getComment()); @@ -538,7 +532,7 @@ void checkReturnOverpaymentInfo() { @Test void checkReturnOverpaymentThroweException() { Assertions.assertThrows(NotFoundException.class, - () -> ubsManagementService.returnOverpaymentInfo(100L, 1L, 1L)); + () -> ubsManagementService.returnOverpaymentInfo(100L, 1., 1L)); } @Test @@ -546,7 +540,7 @@ void checkReturnOverpaymentThroweExceptioninGetPaymentInfo() { Order order = ModelUtils.getOrder(); when(orderRepository.findUserById(1L)).thenReturn(Optional.of(order)); - Assertions.assertThrows(NotFoundException.class, () -> ubsManagementService.returnOverpaymentInfo(1L, 1L, 1L)); + Assertions.assertThrows(NotFoundException.class, () -> ubsManagementService.returnOverpaymentInfo(1L, 1., 1L)); } @Test @@ -554,9 +548,30 @@ void checkGetPaymentInfo() { Order order = ModelUtils.getOrder(); order.setOrderStatus(OrderStatus.DONE); when(orderRepository.findById(order.getId())).thenReturn(Optional.of(order)); - assertEquals(100L, ubsManagementService.getPaymentInfo(order.getId(), 800L).getOverpayment()); - assertEquals(200L, ubsManagementService.getPaymentInfo(order.getId(), 100L).getPaidAmount()); - assertEquals(0L, ubsManagementService.getPaymentInfo(order.getId(), 100L).getUnPaidAmount()); + assertEquals(100L, ubsManagementService.getPaymentInfo(order.getId(), 800.).getOverpayment()); + assertEquals(200L, ubsManagementService.getPaymentInfo(order.getId(), 100.).getPaidAmount()); + assertEquals(0L, ubsManagementService.getPaymentInfo(order.getId(), 100.).getUnPaidAmount()); + verify(orderRepository, times(3)).findById(order.getId()); + } + + @Test + void checkGetPaymentInfoIfOrderStatusIsCanceled() { + Order order = ModelUtils.getOrder(); + order.setOrderStatus(OrderStatus.CANCELED); + when(orderRepository.findById(order.getId())).thenReturn(Optional.of(order)); + assertEquals(200L, ubsManagementService.getPaymentInfo(order.getId(), 800.).getOverpayment()); + assertEquals(200L, ubsManagementService.getPaymentInfo(order.getId(), 100.).getPaidAmount()); + assertEquals(0L, ubsManagementService.getPaymentInfo(order.getId(), 100.).getUnPaidAmount()); + verify(orderRepository, times(3)).findById(order.getId()); + } + + @Test + void checkGetPaymentInfoIfSumToPayIsNull() { + Order order = ModelUtils.getOrder(); + order.setOrderStatus(OrderStatus.DONE); + when(orderRepository.findById(order.getId())).thenReturn(Optional.of(order)); + assertEquals(900L, ubsManagementService.getPaymentInfo(order.getId(), null).getOverpayment()); + verify(orderRepository).findById(order.getId()); } @Test @@ -1445,6 +1460,46 @@ void updateOrderAdminPageInfoTest() { verify(tariffsInfoRepository, atLeastOnce()).findTariffsInfoByIdForEmployee(anyLong(), anyLong()); } + @Test + void updateOrderAdminPageInfoWithUbsCourierSumAndWriteOffStationSum() { + OrderDetailStatusRequestDto orderDetailStatusRequestDto = ModelUtils.getTestOrderDetailStatusRequestDto(); + Order order = ModelUtils.getOrder(); + TariffsInfo tariffsInfo = getTariffsInfo(); + order.setOrderDate(LocalDateTime.now()).setTariffsInfo(tariffsInfo); + Employee employee = ModelUtils.getEmployee(); + when(orderRepository.findById(1L)).thenReturn(Optional.of(order)); + when(employeeRepository.findByEmail("test@gmail.com")).thenReturn(Optional.of(employee)); + when(tariffsInfoRepository.findTariffsInfoByIdForEmployee(anyLong(), anyLong())) + .thenReturn(Optional.of(tariffsInfo)); + when(paymentRepository.findAllByOrderId(1L)) + .thenReturn(List.of(ModelUtils.getPayment())); + lenient().when(ubsManagementServiceMock.updateOrderDetailStatus(1L, orderDetailStatusRequestDto, "abc")) + .thenReturn(ModelUtils.getTestOrderDetailStatusDto()); + when(ubsClientService.updateUbsUserInfoInOrder(ModelUtils.getUbsCustomersDtoUpdate(), + "test@gmail.com")).thenReturn(ModelUtils.getUbsCustomersDto()); + UpdateOrderPageAdminDto updateOrderPageAdminDto = updateOrderPageAdminDto(); + updateOrderPageAdminDto.setUserInfoDto(ModelUtils.getUbsCustomersDtoUpdate()); + updateOrderPageAdminDto.setUbsCourierSum(50.); + updateOrderPageAdminDto.setWriteOffStationSum(100.); + when(orderAddressRepository.findById(1L)) + .thenReturn(Optional.of(ModelUtils.getOrderAddress())); + when(receivingStationRepository.findAll()) + .thenReturn(List.of(ModelUtils.getReceivingStation())); + var receivingStation = ModelUtils.getReceivingStation(); + when(receivingStationRepository.findById(1L)).thenReturn(Optional.of(receivingStation)); + when(orderRepository.getOrderDetails(anyLong())) + .thenReturn(Optional.ofNullable(ModelUtils.getOrdersStatusFormedDto())); + when(bagRepository.findById(1)).thenReturn(Optional.of(ModelUtils.getTariffBag())); + + ubsManagementService.updateOrderAdminPageInfo(updateOrderPageAdminDto, 1L, "en", "test@gmail.com"); + UpdateOrderPageAdminDto emptyDto = new UpdateOrderPageAdminDto(); + ubsManagementService.updateOrderAdminPageInfo(emptyDto, 1L, "en", "test@gmail.com"); + + verify(ubsClientService, times(1)) + .updateUbsUserInfoInOrder(ModelUtils.getUbsCustomersDtoUpdate(), "test@gmail.com"); + verify(tariffsInfoRepository, atLeastOnce()).findTariffsInfoByIdForEmployee(anyLong(), anyLong()); + } + @Test void updateOrderAdminPageInfoWithStatusFormedTest() { Order order = ModelUtils.getOrder(); @@ -1623,6 +1678,22 @@ void getOrderSumDetailsForFormedOrder() { Assertions.assertNotNull(order); } + @Test + void getOrderSumDetailsForFormedOrderWithUbsCourierSumAndWriteOffStationSum() { + CounterOrderDetailsDto dto = ModelUtils.getcounterOrderDetailsDto(); + Order order = ModelUtils.getFormedOrder(); + order.setOrderDate(LocalDateTime.now()); + order.setUbsCourierSum(50_00L); + order.setWriteOffStationSum(100_00L); + when(orderRepository.getOrderDetails(1L)).thenReturn(Optional.of(order)); + + doNothing().when(notificationService).notifyPaidOrder(order); + doNothing().when(notificationService).notifyHalfPaidPackage(order); + doNothing().when(notificationService).notifyCourierItineraryFormed(order); + when(ubsManagementService.getOrderSumDetails(1L)).thenReturn(dto); + Assertions.assertNotNull(order); + } + @Test void getOrderSumDetailsForCanceledPaidOrder() { CounterOrderDetailsDto dto = ModelUtils.getcounterOrderDetailsDto(); @@ -2007,7 +2078,7 @@ void getPaymentInfo() { when(orderRepository.findById(order.getId())).thenReturn(Optional.of(order)); when(modelMapper.map(any(), eq(PaymentInfoDto.class))).thenReturn(paymentInfo); - assertEquals(ModelUtils.getPaymentTableInfoDto(), ubsManagementService.getPaymentInfo(order.getId(), 100L)); + assertEquals(ModelUtils.getPaymentTableInfoDto(), ubsManagementService.getPaymentInfo(order.getId(), 100.)); } @Test @@ -2016,14 +2087,14 @@ void getPaymentInfoWithoutPayment() { when(orderRepository.findById(order.getId())).thenReturn(Optional.of(order)); - assertEquals(ModelUtils.getPaymentTableInfoDto2(), ubsManagementService.getPaymentInfo(order.getId(), 100L)); + assertEquals(ModelUtils.getPaymentTableInfoDto2(), ubsManagementService.getPaymentInfo(order.getId(), 100.)); } @Test void getPaymentInfoExceptionTest() { when(orderRepository.findById(1L)).thenReturn(Optional.empty()); assertThrows(NotFoundException.class, - () -> ubsManagementService.getPaymentInfo(1L, 100L)); + () -> ubsManagementService.getPaymentInfo(1L, 100.)); } @Test @@ -2158,7 +2229,7 @@ void checkGetPaymentInfoWhenPaymentsWithCertificatesAndPointsSmallerThanSumToPay Order order = ModelUtils.getOrder(); order.setOrderStatus(OrderStatus.DONE); when(orderRepository.findById(order.getId())).thenReturn(Optional.of(order)); - assertEquals(0L, ubsManagementService.getPaymentInfo(order.getId(), 1100L).getOverpayment()); + assertEquals(0L, ubsManagementService.getPaymentInfo(order.getId(), 1100.).getOverpayment()); } @Test @@ -2359,6 +2430,26 @@ void addBonusesToUserTest() { verify(eventService).saveEvent(OrderHistory.ADDED_BONUSES, employee.getEmail(), order); } + @Test + void addBonusesToUserIfOrderStatusIsCanceled() { + Order order = ModelUtils.getOrderForGetOrderStatusData2Test(); + order.setOrderStatus(OrderStatus.CANCELED); + User user = order.getUser(); + Employee employee = getEmployee(); + when(orderRepository.findById(1L)).thenReturn(Optional.of(order)); + when(orderRepository.getOrderDetails(1L)).thenReturn(Optional.of(order)); + when(bagRepository.findBagsByOrderId(1L)).thenReturn(ModelUtils.getBaglist()); + when(certificateRepository.findCertificate(order.getId())).thenReturn(getCertificateList()); + + ubsManagementService.addBonusesToUser(ModelUtils.getAddBonusesToUserDto(), 1L, employee.getEmail()); + + verify(orderRepository).findById(1L); + verify(orderRepository).save(order); + verify(userRepository).save(user); + verify(notificationService).notifyBonuses(order, 200L); + verify(eventService).saveEvent(OrderHistory.ADDED_BONUSES, employee.getEmail(), order); + } + @Test void addBonusesToUserWithoutExportedBagsTest() { Order order = ModelUtils.getOrderWithoutExportedBags();