wallet creadit request list

This commit is contained in:
2026-07-04 12:49:00 +03:30
parent 5b6fb16f5c
commit 82f53a1642
6 changed files with 174 additions and 0 deletions
@@ -27,6 +27,7 @@ import { UpdateRestaurantBgDto } from '../dto/update-restaurant-bg.dto';
import { ChargeRequestDto } from '../dto/charge-request.dto';
import { FinishChargeRequestDto } from '../dto/finish-charge-request.dto';
import { FindRestaurantWalletTransactionsDto } from '../dto/find-restaurant-wallet-transactions.dto';
import { FindRestaurantCreditRequestsDto } from '../dto/find-restaurant-credit-requests.dto';
@ApiTags('restaurants')
@Controller()
@@ -122,6 +123,19 @@ export class RestaurantsController {
return this.restaurantsService.getWalletTransactions(restId, query);
}
@UseGuards(AdminAuthGuard)
@ApiBearerAuth()
@Permissions(Permission.UPDATE_RESTAURANT)
@ApiOperation({ summary: 'Get restaurant credit requests with pagination' })
@Get('admin/restaurants/charge-requests')
getCreditRequests(
@RestId() restId: string,
@Query(new ValidationPipe({ transform: true, whitelist: true }))
query: FindRestaurantCreditRequestsDto,
) {
return this.restaurantsService.getCreditRequests(restId, query);
}
@UseGuards(AdminAuthGuard)
@ApiBearerAuth()
@Permissions(Permission.UPDATE_RESTAURANT)
@@ -0,0 +1,65 @@
import { IsOptional, IsString, IsNumber, Min, IsIn, IsDateString } from 'class-validator';
import { Type } from 'class-transformer';
import { ApiPropertyOptional } from '@nestjs/swagger';
import { RestaurantCreditRequestStatus } from '../interface/restaurant-credit-request.interface';
const sortOrderOptions = ['asc', 'desc'] as const;
type SortOrder = (typeof sortOrderOptions)[number];
export class FindRestaurantCreditRequestsDto {
@ApiPropertyOptional({ description: 'Page number', type: Number, default: 1, minimum: 1 })
@IsOptional()
@IsNumber()
@Min(1)
@Type(() => Number)
page?: number = 1;
@ApiPropertyOptional({ description: 'Items per page', type: Number, default: 10, minimum: 1 })
@IsOptional()
@IsNumber()
@Min(1)
@Type(() => Number)
limit?: number = 10;
@ApiPropertyOptional({ description: 'Status filter', enum: RestaurantCreditRequestStatus })
@IsOptional()
@IsIn(Object.values(RestaurantCreditRequestStatus))
status?: RestaurantCreditRequestStatus;
@ApiPropertyOptional({ description: 'Invoice ID filter', type: String })
@IsOptional()
@IsString()
invoiceId?: string;
@ApiPropertyOptional({ description: 'Start date filter (ISO 8601 format)', type: String })
@IsOptional()
@IsDateString()
startDate?: string;
@ApiPropertyOptional({ description: 'End date filter (ISO 8601 format)', type: String })
@IsOptional()
@IsDateString()
endDate?: string;
@ApiPropertyOptional({ description: 'Minimum amount filter', type: Number })
@IsOptional()
@IsNumber()
@Type(() => Number)
minAmount?: number;
@ApiPropertyOptional({ description: 'Maximum amount filter', type: Number })
@IsOptional()
@IsNumber()
@Type(() => Number)
maxAmount?: number;
@ApiPropertyOptional({ description: 'Sort field', type: String, default: 'createdAt' })
@IsOptional()
@IsString()
orderBy?: string = 'createdAt';
@ApiPropertyOptional({ description: 'Sort direction', enum: sortOrderOptions, default: 'desc' })
@IsOptional()
@IsIn(sortOrderOptions)
order?: SortOrder = 'desc';
}
@@ -16,7 +16,9 @@ import { CreateExternalInvoice } from '../interface/external-invoice.interface';
import { ChargeRequestDto } from '../dto/charge-request.dto';
import { FinishChargeRequestDto } from '../dto/finish-charge-request.dto';
import { FindRestaurantWalletTransactionsDto } from '../dto/find-restaurant-wallet-transactions.dto';
import { FindRestaurantCreditRequestsDto } from '../dto/find-restaurant-credit-requests.dto';
import { RestaurantCreditTransactionRepository } from '../repositories/restaurant-credit-transaction.repository';
import { RestaurantCreditRequestRepository } from '../repositories/restaurant-credit-request.repository';
import { RestMessage } from 'src/common/enums/message.enum';
@Injectable()
@@ -28,6 +30,7 @@ export class RestaurantWalletService {
private readonly httpService: HttpService,
private readonly configService: ConfigService,
private readonly restaurantCreditTransactionRepository: RestaurantCreditTransactionRepository,
private readonly restaurantCreditRequestRepository: RestaurantCreditRequestRepository,
) {}
async getCurrentBalance(restaurantId: string, em: EntityManager = this.defaultEm): Promise<number> {
@@ -44,6 +47,10 @@ export class RestaurantWalletService {
return this.restaurantCreditTransactionRepository.findAllPaginated(restaurantId, dto);
}
getCreditRequests(restaurantId: string, dto: FindRestaurantCreditRequestsDto) {
return this.restaurantCreditRequestRepository.findAllPaginated(restaurantId, dto);
}
async createTransaction(params: {
restaurant: Restaurant;
amount: number;
@@ -36,6 +36,7 @@ import { RestaurantWalletService } from './restaurant-wallet.service';
import { ChargeRequestDto } from '../dto/charge-request.dto';
import { FinishChargeRequestDto } from '../dto/finish-charge-request.dto';
import { FindRestaurantWalletTransactionsDto } from '../dto/find-restaurant-wallet-transactions.dto';
import { FindRestaurantCreditRequestsDto } from '../dto/find-restaurant-credit-requests.dto';
@Injectable()
@@ -340,6 +341,10 @@ export class RestaurantsService {
return this.restaurantWalletService.getTransactions(restId, dto);
}
getCreditRequests(restId: string, dto: FindRestaurantCreditRequestsDto) {
return this.restaurantWalletService.getCreditRequests(restId, dto);
}
chargeRequest(restId: string, dto: ChargeRequestDto) {
return this.restaurantWalletService.chargeRequest(restId, dto);
}
@@ -0,0 +1,81 @@
import { Injectable } from '@nestjs/common';
import { FilterQuery } from '@mikro-orm/core';
import { EntityManager, EntityRepository } from '@mikro-orm/postgresql';
import { RestaurantCreditRequest } from '../entities/restaurant-credit-request.entity';
import { FindRestaurantCreditRequestsDto } from '../dto/find-restaurant-credit-requests.dto';
import { PaginatedResult } from 'src/common/interfaces/pagination.interface';
@Injectable()
export class RestaurantCreditRequestRepository extends EntityRepository<RestaurantCreditRequest> {
constructor(readonly em: EntityManager) {
super(em, RestaurantCreditRequest);
}
async findAllPaginated(
restaurantId: string,
dto: FindRestaurantCreditRequestsDto,
): Promise<PaginatedResult<RestaurantCreditRequest>> {
const {
page = 1,
limit = 10,
status,
invoiceId,
startDate,
endDate,
minAmount,
maxAmount,
orderBy = 'createdAt',
order = 'desc',
} = dto;
const offset = (page - 1) * limit;
const where: FilterQuery<RestaurantCreditRequest> = {
restaurant: { id: restaurantId },
};
if (status) {
where.status = status;
}
if (invoiceId) {
where.invoiceId = invoiceId;
}
if (startDate || endDate) {
where.createdAt = {};
if (startDate) {
where.createdAt.$gte = new Date(startDate);
}
if (endDate) {
where.createdAt.$lte = new Date(endDate);
}
}
if (minAmount !== undefined || maxAmount !== undefined) {
where.amount = {};
if (minAmount !== undefined) {
where.amount.$gte = minAmount;
}
if (maxAmount !== undefined) {
where.amount.$lte = maxAmount;
}
}
const [data, total] = await this.findAndCount(where, {
limit,
offset,
orderBy: { [orderBy]: order.toLowerCase() as 'asc' | 'desc' },
});
return {
data,
meta: {
total,
page,
limit,
totalPages: Math.ceil(total / limit),
},
};
}
}
@@ -16,6 +16,7 @@ import { UtilsModule } from '../utils/utils.module';
import { Background } from './entities/background.entity';
import { BackgroundRepository } from './repositories/background.repository';
import { RestaurantCreditTransactionRepository } from './repositories/restaurant-credit-transaction.repository';
import { RestaurantCreditRequestRepository } from './repositories/restaurant-credit-request.repository';
import { RestaurantCreditTransaction } from './entities/restaurant-credit-transaction.entity';
import { RestaurantCreditRequest } from './entities/restaurant-credit-request.entity';
import { RestaurantWalletService } from './providers/restaurant-wallet.service';
@@ -31,6 +32,7 @@ import { httpConfig } from 'src/config/http.config';
RestaurantCrone,
BackgroundRepository,
RestaurantCreditTransactionRepository,
RestaurantCreditRequestRepository,
RestaurantWalletService,
],
imports: [