From c89936469610887841df8052bd292142a4db8208 Mon Sep 17 00:00:00 2001 From: Tran Gia Bao Date: Tue, 25 Feb 2025 22:13:51 +0700 Subject: [PATCH] feature: Submit building subscription --- .../dtos/CreditConvertRatioDTO.java | 8 ++ .../enterprise/dtos/SubscribeRequestDTO.java | 15 ++ .../entities/CreditConvertRatioEntity.java | 26 ++++ .../entities/CreditConvertType.java | 6 + .../entities/SubscriptionEntity.java | 30 ++++ .../entities/TransactionEntity.java | 20 +++ .../enterprise/entities/TransactionType.java | 6 + .../enterprise/entities/WalletEntity.java | 7 + .../mappers/CreditConvertRatioMapper.java | 15 ++ .../repositories/BuildingRepository.java | 3 + .../CreditConvertRatioRepository.java | 11 ++ .../repositories/SubscriptionRepository.java | 14 +- .../rest/SubscriptionController.java | 44 ++++++ .../services/SubscriptionService.java | 13 ++ .../impl/SubscriptionServiceImpl.java | 130 ++++++++++++++++++ .../V0.0.1.9__CreditSubscription.sql | 27 ++++ .../enterprise/TestcontainersConfigs.java | 1 + .../enterprise/models/enterprise.dto.ts | 19 +++ .../src/main/resources/data/temp-data.sql | 7 + 19 files changed, 401 insertions(+), 1 deletion(-) create mode 100644 sep490-enterprise/src/main/java/enterprise/dtos/CreditConvertRatioDTO.java create mode 100644 sep490-enterprise/src/main/java/enterprise/dtos/SubscribeRequestDTO.java create mode 100644 sep490-enterprise/src/main/java/enterprise/entities/CreditConvertRatioEntity.java create mode 100644 sep490-enterprise/src/main/java/enterprise/entities/CreditConvertType.java create mode 100644 sep490-enterprise/src/main/java/enterprise/entities/TransactionType.java create mode 100644 sep490-enterprise/src/main/java/enterprise/mappers/CreditConvertRatioMapper.java create mode 100644 sep490-enterprise/src/main/java/enterprise/repositories/CreditConvertRatioRepository.java create mode 100644 sep490-enterprise/src/main/java/enterprise/rest/SubscriptionController.java create mode 100644 sep490-enterprise/src/main/java/enterprise/services/SubscriptionService.java create mode 100644 sep490-enterprise/src/main/java/enterprise/services/impl/SubscriptionServiceImpl.java create mode 100644 sep490-enterprise/src/main/resources/db/migration/V0.0.1.9__CreditSubscription.sql diff --git a/sep490-enterprise/src/main/java/enterprise/dtos/CreditConvertRatioDTO.java b/sep490-enterprise/src/main/java/enterprise/dtos/CreditConvertRatioDTO.java new file mode 100644 index 00000000..a834c6cb --- /dev/null +++ b/sep490-enterprise/src/main/java/enterprise/dtos/CreditConvertRatioDTO.java @@ -0,0 +1,8 @@ +package enterprise.dtos; + +import enterprise.entities.CreditConvertType; + +import java.util.UUID; + +public record CreditConvertRatioDTO(UUID id, int version, double ratio, CreditConvertType convertType) { +} diff --git a/sep490-enterprise/src/main/java/enterprise/dtos/SubscribeRequestDTO.java b/sep490-enterprise/src/main/java/enterprise/dtos/SubscribeRequestDTO.java new file mode 100644 index 00000000..8518d057 --- /dev/null +++ b/sep490-enterprise/src/main/java/enterprise/dtos/SubscribeRequestDTO.java @@ -0,0 +1,15 @@ +package enterprise.dtos; + +import enterprise.entities.TransactionType; +import jakarta.validation.constraints.Min; + +import java.util.UUID; + +public record SubscribeRequestDTO( + UUID buildingId, + @Min(1) int months, + @Min(100) int numberOfDevices, + double monthRatio, + double deviceRatio, + TransactionType type) { +} diff --git a/sep490-enterprise/src/main/java/enterprise/entities/CreditConvertRatioEntity.java b/sep490-enterprise/src/main/java/enterprise/entities/CreditConvertRatioEntity.java new file mode 100644 index 00000000..adab70af --- /dev/null +++ b/sep490-enterprise/src/main/java/enterprise/entities/CreditConvertRatioEntity.java @@ -0,0 +1,26 @@ +package enterprise.entities; + +import commons.springfw.impl.entities.AbstractAuditableEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Entity +@Table(name = "credit_convert_ratio") +@Getter +@Setter +@NoArgsConstructor +public class CreditConvertRatioEntity extends AbstractAuditableEntity { + + @Column(name = "ratio") + private double ratio; + + @Enumerated(EnumType.STRING) + @Column(name = "convert_type", unique = true) + private CreditConvertType convertType; +} diff --git a/sep490-enterprise/src/main/java/enterprise/entities/CreditConvertType.java b/sep490-enterprise/src/main/java/enterprise/entities/CreditConvertType.java new file mode 100644 index 00000000..f6d86a53 --- /dev/null +++ b/sep490-enterprise/src/main/java/enterprise/entities/CreditConvertType.java @@ -0,0 +1,6 @@ +package enterprise.entities; + +public enum CreditConvertType { + MONTH, + DEVICE +} diff --git a/sep490-enterprise/src/main/java/enterprise/entities/SubscriptionEntity.java b/sep490-enterprise/src/main/java/enterprise/entities/SubscriptionEntity.java index 08f0a4c9..66eab959 100644 --- a/sep490-enterprise/src/main/java/enterprise/entities/SubscriptionEntity.java +++ b/sep490-enterprise/src/main/java/enterprise/entities/SubscriptionEntity.java @@ -1,16 +1,23 @@ package enterprise.entities; import commons.springfw.impl.entities.AbstractAuditableEntity; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + @Entity @Table(name = "subscriptions") @Getter @@ -23,4 +30,27 @@ public class SubscriptionEntity extends AbstractAuditableEntity { @JoinColumn(name = "building_id", nullable = false) private BuildingEntity building; + @Column(name = "start_date") + private LocalDate startDate; + + @Column(name = "end_date") + private LocalDate endDate; + + @Column(name = "max_number_of_devices") + private int maxNumberOfDevices; + + @OneToMany(fetch = FetchType.LAZY, + cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH}, + mappedBy = "subscription") + private List transaction = new ArrayList<>(); + + public boolean isValid() { + LocalDate now = LocalDate.now(); + return !now.isBefore(startDate) + && !now.isAfter(endDate); + } + + public void addTransaction(TransactionEntity transaction) { + this.transaction.add(transaction); + } } diff --git a/sep490-enterprise/src/main/java/enterprise/entities/TransactionEntity.java b/sep490-enterprise/src/main/java/enterprise/entities/TransactionEntity.java index 94081873..3cefb0b4 100644 --- a/sep490-enterprise/src/main/java/enterprise/entities/TransactionEntity.java +++ b/sep490-enterprise/src/main/java/enterprise/entities/TransactionEntity.java @@ -1,7 +1,10 @@ package enterprise.entities; import commons.springfw.impl.entities.AbstractAuditableEntity; +import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; import jakarta.persistence.FetchType; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; @@ -28,4 +31,21 @@ public class TransactionEntity extends AbstractAuditableEntity { @JoinColumn(name = "building_id", nullable = false) private BuildingEntity building; + @Enumerated(value = EnumType.STRING) + @Column(name = "transaction_type") + private TransactionType transactionType; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "subscription_id", nullable = false) + private SubscriptionEntity subscription; + + @Column(name = "amount") + private double amount; + + @Column(name = "months") + private int months; + + @Column(name = "number_of_devices") + private int numberOfDevices; + } diff --git a/sep490-enterprise/src/main/java/enterprise/entities/TransactionType.java b/sep490-enterprise/src/main/java/enterprise/entities/TransactionType.java new file mode 100644 index 00000000..4dd83cef --- /dev/null +++ b/sep490-enterprise/src/main/java/enterprise/entities/TransactionType.java @@ -0,0 +1,6 @@ +package enterprise.entities; + +public enum TransactionType { + NEW_PURCHASE, + UPGRADE +} diff --git a/sep490-enterprise/src/main/java/enterprise/entities/WalletEntity.java b/sep490-enterprise/src/main/java/enterprise/entities/WalletEntity.java index 2a49293f..488b2b8e 100644 --- a/sep490-enterprise/src/main/java/enterprise/entities/WalletEntity.java +++ b/sep490-enterprise/src/main/java/enterprise/entities/WalletEntity.java @@ -37,4 +37,11 @@ public void deposit(long amount) { balance += amount; } + public void withdraw(long amount) { + if (amount > balance) { + throw new IllegalArgumentException("Insufficient balance"); + } + balance -= amount; + } + } diff --git a/sep490-enterprise/src/main/java/enterprise/mappers/CreditConvertRatioMapper.java b/sep490-enterprise/src/main/java/enterprise/mappers/CreditConvertRatioMapper.java new file mode 100644 index 00000000..f1146e71 --- /dev/null +++ b/sep490-enterprise/src/main/java/enterprise/mappers/CreditConvertRatioMapper.java @@ -0,0 +1,15 @@ +package enterprise.mappers; + +import enterprise.dtos.CreditConvertRatioDTO; +import enterprise.entities.CreditConvertRatioEntity; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface CreditConvertRatioMapper { + + CreditConvertRatioDTO toDTO(CreditConvertRatioEntity entity); + + CreditConvertRatioEntity toEntity(CreditConvertRatioDTO dto); + +} diff --git a/sep490-enterprise/src/main/java/enterprise/repositories/BuildingRepository.java b/sep490-enterprise/src/main/java/enterprise/repositories/BuildingRepository.java index 37de5d04..49b77f4e 100644 --- a/sep490-enterprise/src/main/java/enterprise/repositories/BuildingRepository.java +++ b/sep490-enterprise/src/main/java/enterprise/repositories/BuildingRepository.java @@ -5,10 +5,13 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import java.util.List; import java.util.UUID; public interface BuildingRepository extends AbstractBaseRepository { Page findByEnterpriseId(UUID enterpriseId, Pageable pageable); + List findAllByEnterpriseId(UUID enterpriseId); + } diff --git a/sep490-enterprise/src/main/java/enterprise/repositories/CreditConvertRatioRepository.java b/sep490-enterprise/src/main/java/enterprise/repositories/CreditConvertRatioRepository.java new file mode 100644 index 00000000..f4d725a9 --- /dev/null +++ b/sep490-enterprise/src/main/java/enterprise/repositories/CreditConvertRatioRepository.java @@ -0,0 +1,11 @@ +package enterprise.repositories; + +import enterprise.entities.CreditConvertRatioEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.UUID; + +@Repository +public interface CreditConvertRatioRepository extends JpaRepository { +} diff --git a/sep490-enterprise/src/main/java/enterprise/repositories/SubscriptionRepository.java b/sep490-enterprise/src/main/java/enterprise/repositories/SubscriptionRepository.java index 29d86dea..d366e6f6 100644 --- a/sep490-enterprise/src/main/java/enterprise/repositories/SubscriptionRepository.java +++ b/sep490-enterprise/src/main/java/enterprise/repositories/SubscriptionRepository.java @@ -1,8 +1,20 @@ package enterprise.repositories; import commons.springfw.impl.repositories.AbstractBaseRepository; -import enterprise.entities.BuildingEntity; import enterprise.entities.SubscriptionEntity; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.time.LocalDate; +import java.util.List; public interface SubscriptionRepository extends AbstractBaseRepository { + + @Query(value = """ + select s from SubscriptionEntity s + where s.startDate <= :now + and s.endDate >= :now + """) + List findAllValidSubscriptions(@Param("now") LocalDate now); + } diff --git a/sep490-enterprise/src/main/java/enterprise/rest/SubscriptionController.java b/sep490-enterprise/src/main/java/enterprise/rest/SubscriptionController.java new file mode 100644 index 00000000..bea81c4b --- /dev/null +++ b/sep490-enterprise/src/main/java/enterprise/rest/SubscriptionController.java @@ -0,0 +1,44 @@ +package enterprise.rest; + + +import enterprise.dtos.CreditConvertRatioDTO; +import enterprise.dtos.SubscribeRequestDTO; +import enterprise.mappers.CreditConvertRatioMapper; +import enterprise.services.SubscriptionService; +import green_buildings.commons.api.security.UserRole; +import jakarta.annotation.security.RolesAllowed; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/api/subscription") +@RequiredArgsConstructor +public class SubscriptionController { + + private final SubscriptionService subscriptionService; + private final CreditConvertRatioMapper creditConvertRatioMapper; + + + @GetMapping("/convert-ratio") + public ResponseEntity> getCreditConvertRatio() { + List list = subscriptionService.getCreditConvertRatios().stream().map(creditConvertRatioMapper::toDTO).toList(); + return ResponseEntity.ok(list); + } + + @PostMapping + @RolesAllowed(value = {UserRole.RoleNameConstant.ENTERPRISE_OWNER}) + public ResponseEntity subscribe(@RequestBody @Valid SubscribeRequestDTO request) { + subscriptionService.subscribe(request); + return ResponseEntity.status(HttpStatus.CREATED).build(); + } + +} diff --git a/sep490-enterprise/src/main/java/enterprise/services/SubscriptionService.java b/sep490-enterprise/src/main/java/enterprise/services/SubscriptionService.java new file mode 100644 index 00000000..0dda7a6a --- /dev/null +++ b/sep490-enterprise/src/main/java/enterprise/services/SubscriptionService.java @@ -0,0 +1,13 @@ +package enterprise.services; + +import enterprise.dtos.SubscribeRequestDTO; +import enterprise.entities.CreditConvertRatioEntity; +import jakarta.validation.Valid; + +import java.util.List; + +public interface SubscriptionService { + List getCreditConvertRatios(); + + void subscribe(@Valid SubscribeRequestDTO request); +} diff --git a/sep490-enterprise/src/main/java/enterprise/services/impl/SubscriptionServiceImpl.java b/sep490-enterprise/src/main/java/enterprise/services/impl/SubscriptionServiceImpl.java new file mode 100644 index 00000000..08abc9df --- /dev/null +++ b/sep490-enterprise/src/main/java/enterprise/services/impl/SubscriptionServiceImpl.java @@ -0,0 +1,130 @@ +package enterprise.services.impl; + +import commons.springfw.impl.utils.SecurityUtils; +import enterprise.dtos.SubscribeRequestDTO; +import enterprise.entities.BuildingEntity; +import enterprise.entities.CreditConvertRatioEntity; +import enterprise.entities.CreditConvertType; +import enterprise.entities.SubscriptionEntity; +import enterprise.entities.TransactionEntity; +import enterprise.entities.TransactionType; +import enterprise.entities.WalletEntity; +import enterprise.repositories.BuildingRepository; +import enterprise.repositories.CreditConvertRatioRepository; +import enterprise.repositories.SubscriptionRepository; +import enterprise.repositories.WalletRepository; +import enterprise.services.SubscriptionService; +import green_buildings.commons.api.exceptions.BusinessException; +import green_buildings.commons.api.exceptions.TechnicalException; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.List; +import java.util.UUID; + +@Service +@Transactional(rollbackOn = Throwable.class) +@RequiredArgsConstructor +@Slf4j +public class SubscriptionServiceImpl implements SubscriptionService { + + private final CreditConvertRatioRepository creditConvertRatioRepository; + private final BuildingRepository buildingRepository; + private final SubscriptionRepository subscriptionRepository; + private final WalletRepository walletRepository; + + @Override + public List getCreditConvertRatios() { + return creditConvertRatioRepository.findAll(); + } + + @Override + public void subscribe(SubscribeRequestDTO request) { + // Prepare building + UUID enterpriseId = SecurityUtils.getCurrentUserEnterpriseId().orElseThrow(); + List buildings = buildingRepository.findAllByEnterpriseId(enterpriseId); + BuildingEntity buildingEntity = buildings.stream().filter(b -> b.getId().equals(request.buildingId())).findFirst().orElseThrow(); + + // Prepare Transaction + double amount = calculateTransactionAmount(request); + TransactionEntity transaction = createNewTransaction(request, buildingEntity, amount); + + // Handel wallet + WalletEntity walletEntity = walletRepository.findByEnterpriseId(enterpriseId); + try { + walletEntity.withdraw((long) transaction.getAmount()); + } catch (IllegalArgumentException e) { + throw new BusinessException(null, "You have not enough credit"); + } + + // Handel Subscription + SubscriptionEntity subscription = null; + if (request.type().equals(TransactionType.NEW_PURCHASE)) { + subscription = createNewSubscription(transaction, buildingEntity, request); + } else if (request.type().equals(TransactionType.UPGRADE)) { + subscription = upgradeSubscription(transaction, request); + } else { + throw new TechnicalException("Unknown transaction type: " + request.type()); + } + + walletRepository.save(walletEntity); + subscriptionRepository.save(subscription); + } + + private static TransactionEntity createNewTransaction(SubscribeRequestDTO request, BuildingEntity buildingEntity, double amount) { + TransactionEntity transaction = new TransactionEntity(); + transaction.setBuilding(buildingEntity); + transaction.setEnterprise(buildingEntity.getEnterprise()); + transaction.setTransactionType(request.type()); + transaction.setAmount(amount); + return transaction; + } + + private SubscriptionEntity createNewSubscription(TransactionEntity transaction, BuildingEntity buildingEntity, SubscribeRequestDTO request) { + SubscriptionEntity subscription = new SubscriptionEntity(); + subscription.setBuilding(buildingEntity); + subscription.setStartDate(LocalDate.now()); + subscription.setEndDate(LocalDate.now().plusMonths(request.months())); + subscription.setMaxNumberOfDevices(request.numberOfDevices()); + subscription.addTransaction(transaction); + + return subscription; + } + + private SubscriptionEntity upgradeSubscription(TransactionEntity transaction, SubscribeRequestDTO request) { + List allValidSubscriptions = subscriptionRepository.findAllValidSubscriptions(LocalDate.now()); + if (allValidSubscriptions.isEmpty()) { + throw new BusinessException(null, "You do not have any valid subscriptions"); + } else if (allValidSubscriptions.size() > 1) { + log.warn("Building {} has more than one valid subscriptions", request.buildingId()); + } + SubscriptionEntity subscription = allValidSubscriptions.getFirst(); + subscription.setEndDate(subscription.getEndDate().plusMonths(request.months())); + subscription.addTransaction(transaction); + return subscription; + } + + private double calculateTransactionAmount(SubscribeRequestDTO request) { + List creditConvertRatios = getCreditConvertRatios(); + CreditConvertRatioEntity monthRatio = creditConvertRatios + .stream() + .filter(x -> x.getConvertType().equals(CreditConvertType.MONTH)) + .findFirst() + .orElseThrow(); + CreditConvertRatioEntity noDevicesRatio = creditConvertRatios + .stream() + .filter(x -> x.getConvertType().equals(CreditConvertType.DEVICE)) + .findFirst() + .orElseThrow(); + + if (request.monthRatio() != monthRatio.getRatio() || request.deviceRatio() != noDevicesRatio.getRatio()) { + throw new BusinessException("", "Subscription prices have been updated, please try again"); + } + return (monthRatio.getRatio() * request.months()) + + (noDevicesRatio.getRatio() * request.numberOfDevices()); + } + +} diff --git a/sep490-enterprise/src/main/resources/db/migration/V0.0.1.9__CreditSubscription.sql b/sep490-enterprise/src/main/resources/db/migration/V0.0.1.9__CreditSubscription.sql new file mode 100644 index 00000000..98ffb362 --- /dev/null +++ b/sep490-enterprise/src/main/resources/db/migration/V0.0.1.9__CreditSubscription.sql @@ -0,0 +1,27 @@ +CREATE TABLE credit_convert_ratio +( + created_date TIMESTAMP, + created_by VARCHAR(255), + last_modified_date TIMESTAMP, + last_modified_by VARCHAR(255), + id UUID NOT NULL DEFAULT gen_random_uuid(), + version INTEGER NOT NULL, + ratio DOUBLE PRECISION, + convert_type VARCHAR(255) +); +ALTER TABLE credit_convert_ratio + ADD CONSTRAINT credit_convert_type_unique UNIQUE(convert_type); + +ALTER TABLE transactions + ADD COLUMN transaction_type VARCHAR(255) NOT NULL, + ADD COLUMN subscription_id UUID NOT NULL, + ADD COLUMN amount DOUBLE PRECISION, + ADD COLUMN months INTEGER, + ADD COLUMN number_of_devices INTEGER; +ALTER TABLE transactions + ADD CONSTRAINT pk_subscriptions FOREIGN KEY (subscription_id) REFERENCES subscriptions (idabc); + +ALTER TABLE subscriptions + ADD COLUMN start_date DATE NOT NULL, + ADD COLUMN end_date DATE NOT NULL, + ADD COLUMN max_number_of_devices INTEGER NOT NULL; \ No newline at end of file diff --git a/sep490-enterprise/src/test/java/enterprise/TestcontainersConfigs.java b/sep490-enterprise/src/test/java/enterprise/TestcontainersConfigs.java index d2287e37..b6d6abce 100644 --- a/sep490-enterprise/src/test/java/enterprise/TestcontainersConfigs.java +++ b/sep490-enterprise/src/test/java/enterprise/TestcontainersConfigs.java @@ -60,6 +60,7 @@ static void configureProperties(DynamicPropertyRegistry registry) { registry.add("spring.datasource.url", postgres::getJdbcUrl); registry.add("spring.datasource.username", postgres::getUsername); registry.add("spring.datasource.password", postgres::getPassword); + registry.add("logging.level.org.flywaydb", ()-> "DEBUG"); Supplier callable = () -> StringSubstitutor.replace( "http://localhost:${mappedPort}/realms/greenbuildings", Map .of("mappedPort", getMappedPort(idP, 8180))); diff --git a/sep490-frontend/src/app/modules/enterprise/models/enterprise.dto.ts b/sep490-frontend/src/app/modules/enterprise/models/enterprise.dto.ts index 12dd45cd..b0481f94 100644 --- a/sep490-frontend/src/app/modules/enterprise/models/enterprise.dto.ts +++ b/sep490-frontend/src/app/modules/enterprise/models/enterprise.dto.ts @@ -23,6 +23,25 @@ export interface CreditPackage extends BaseDTO { price: number; } +export enum CreditConvertType { + MONTH, + DEVICE +} + +export interface CreditConvertRatio extends BaseDTO { + ratio: number; + convertType: keyof typeof CreditConvertType; +} + +export interface SubscribeRequest extends BaseDTO { + buildingId: UUID; + months: number; + numberOfDevices: number; + monthRatio: number; + deviceRatio: number; + type: keyof typeof CreditConvertType; +} + export interface Subscription extends BaseDTO { numberOfMonths: number; numberOfDevices: number; diff --git a/sep490-idp/src/main/resources/data/temp-data.sql b/sep490-idp/src/main/resources/data/temp-data.sql index c2952d2e..6539427c 100644 --- a/sep490-idp/src/main/resources/data/temp-data.sql +++ b/sep490-idp/src/main/resources/data/temp-data.sql @@ -19,3 +19,10 @@ INSERT INTO building (id, enterprise_id) VALUES ('660e8400-e29b-41d4-a716-446655 INSERT INTO building_permission (building_id, user_id, role) VALUES ('660e8400-e29b-41d4-a716-446655440003', '5ed84416-2e1f-4e01-afe3-5712d84e170c', 'MANAGER'); INSERT INTO building_permission (building_id, user_id, role) VALUES ('660e8400-e29b-41d4-a716-446655440004', '5ed84416-2e1f-4e01-afe3-5712d84e170c', 'MANAGER'); INSERT INTO building_permission (building_id, user_id, role) VALUES ('660e8400-e29b-41d4-a716-446655440005', '5ed84416-2e1f-4e01-afe3-5712d84e170c', 'MANAGER'); + +INSERT INTO credit_convert_ratio ( + created_date, last_modified_date, created_by, last_modified_by, + id, version, ratio, convert_type +) VALUES + (NOW(), NOW(), 'tran gia bao', 'tran gia bao', gen_random_uuid(), 0, 1, 'MONTH'), + (NOW(), NOW(), 'tran gia bao', 'tran gia bao', gen_random_uuid(), 0, 0.1, 'DEVICE');