diff --git a/src/configurable/commission.service.ts b/src/configurable/commission.service.ts index 4b605a4..cf10d3b 100644 --- a/src/configurable/commission.service.ts +++ b/src/configurable/commission.service.ts @@ -1,8 +1,6 @@ import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { EntityNotFoundError, Repository } from 'typeorm'; -import { Roles } from './entities/roles.entity'; import { InjectRepository } from '@nestjs/typeorm'; -import { UpdateUserDto } from '../users/dto/update-user.dto'; import { CommissionSetting } from './entities/commission_setting.entity'; @Injectable() @@ -12,10 +10,10 @@ export class CommissionService { private commissionRepository: Repository, ) {} - findAllCommission(page) { + findAllCommission(page, pageSize?) { return this.commissionRepository.findAndCount({ - skip: page * 10, - take: 10, + skip: page * (pageSize || 10), + take: pageSize || 10, order: { version: 'DESC', }, diff --git a/src/configurable/configurable.controller.ts b/src/configurable/configurable.controller.ts index e4474da..c814ebe 100644 --- a/src/configurable/configurable.controller.ts +++ b/src/configurable/configurable.controller.ts @@ -30,8 +30,11 @@ export class ConfigurableController { ) {} @Get('/roles') - async findAll(@Query('page') page: number) { - const [data, count] = await this.roleService.findAllRoles(page); + async findAll( + @Query('page') page: number, + @Query('pageSize') pageSize: number, + ) { + const [data, count] = await this.roleService.findAllRoles(page, pageSize); return { data, @@ -42,8 +45,14 @@ export class ConfigurableController { } @Get('/commission') - async findCommission(@Query('page') page: number) { - const [data, count] = await this.commissionService.findAllCommission(page); + async findCommission( + @Query('page') page: number, + @Query('pageSize') pageSize: number, + ) { + const [data, count] = await this.commissionService.findAllCommission( + page, + pageSize, + ); return { data, @@ -54,9 +63,13 @@ export class ConfigurableController { } @Get('/roles/for-membership') - async findAllForMembership(@Query('page') page: number) { + async findAllForMembership( + @Query('page') page: number, + @Query('pageSize') pageSize: number, + ) { const [data, count] = await this.roleService.findAllRolesForCreateMember( page, + pageSize, ); return { diff --git a/src/configurable/roles.service.ts b/src/configurable/roles.service.ts index 2f2424e..75b46bd 100644 --- a/src/configurable/roles.service.ts +++ b/src/configurable/roles.service.ts @@ -10,20 +10,20 @@ export class RoleService { private rolesRepository: Repository, ) {} - findAllRoles(page) { + findAllRoles(page, pageSize?) { return this.rolesRepository.findAndCount({ - skip: page * 10, - take: 10, + skip: page * (pageSize || 10), + take: pageSize || 10, order: { version: 'DESC', }, }); } - findAllRolesForCreateMember(page) { + findAllRolesForCreateMember(page, pageSize?) { return this.rolesRepository.findAndCount({ - skip: page * 10, - take: 10, + skip: page * (pageSize || 10), + take: pageSize || 10, where: { id: Not( In([ diff --git a/src/product/history-price/history-price.service.ts b/src/product/history-price/history-price.service.ts index a259ec2..ee1325f 100644 --- a/src/product/history-price/history-price.service.ts +++ b/src/product/history-price/history-price.service.ts @@ -38,6 +38,7 @@ export class ProductHistoryPriceService { page: number, productId: string, supplierId: string, + pageSize?: number, ) { try { const query = this.productHistoryPriceService @@ -54,8 +55,8 @@ export class ProductHistoryPriceService { const data = await query .orderBy('product_history_price.createdAt', 'DESC') - .skip(page * 10) - .take(10) + .skip(page * (pageSize || 10)) + .take(pageSize || 10) .getMany(); const totalData = await query.getCount(); diff --git a/src/product/product-categories.service.ts b/src/product/product-categories.service.ts index 6aa1e30..5afab21 100644 --- a/src/product/product-categories.service.ts +++ b/src/product/product-categories.service.ts @@ -36,10 +36,10 @@ export class ProductCategoriesService { ); } - findAll(page) { + findAll(page, pageSize?) { return this.productCategoriesRepository.findAndCount({ - skip: page * 10, - take: 10, + skip: page * (pageSize || 10), + take: pageSize || 10, order: { version: 'DESC', }, diff --git a/src/product/product-sub-categories.service.ts b/src/product/product-sub-categories.service.ts index ffc0492..98a5b22 100644 --- a/src/product/product-sub-categories.service.ts +++ b/src/product/product-sub-categories.service.ts @@ -1,5 +1,5 @@ import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; -import { EntityNotFoundError, Repository } from 'typeorm'; +import { EntityNotFoundError, In, Repository } from 'typeorm'; import { ProductSubCategories } from './entities/product-sub-category.entity'; import { InjectRepository } from '@nestjs/typeorm'; import { CreateSubCategoriesProductDto } from './dto/sub-categories/create-sub-categories-product.dto'; @@ -44,20 +44,25 @@ export class ProductSubCategoriesService { ); } - async findAll(page, category) { + async findAll(page, category: string, pageSize?) { + let filterCategories; + if (category) { + filterCategories = category.split(',').map((data) => data.trim()); + } + const baseQuery = this.productSubCategoriesRepository .createQueryBuilder('product_sub_categories') .leftJoinAndSelect('product_sub_categories.category', 'category'); - if (category != 'null' && category) { + if (category && filterCategories.length > 0) { baseQuery.where({ - category: category, + category: In(filterCategories), }); } const data = await baseQuery - .skip(page * 10) - .take(10) + .skip(page * (pageSize || 10)) + .take(pageSize || 10) .getMany(); const totalData = await baseQuery.getCount(); diff --git a/src/product/product.controller.ts b/src/product/product.controller.ts index 1dcc540..6c012c4 100644 --- a/src/product/product.controller.ts +++ b/src/product/product.controller.ts @@ -72,15 +72,15 @@ export class ProductController { @Get('all') async findAll( @Query('page') page: number, + @Query('pageSize') pageSize: number, @Query('sub-category') subcategory: string, - @Query('category') category: string, @Query('supplier') supplier: string, ) { const data = await this.productService.findAll( page, - supplier, - category, - subcategory, + supplier == 'null' ? null : supplier, + subcategory == 'null' ? null : subcategory, + pageSize, ); return { @@ -107,6 +107,7 @@ export class ProductController { @Get('by-categories-all') async findByCategoriesAll( @Query('page') page: number, + @Query('pageSize') pageSize: number, @Query('sub-category') subcategory: string, @Query('supplier') supplier: string, ) { @@ -114,6 +115,7 @@ export class ProductController { page, subcategory, supplier, + pageSize, ); return { @@ -127,13 +129,13 @@ export class ProductController { async findByCategories( @Query('page') page: number, @Query('pageSize') pageSize: number, - @Query('categories') categories: string, + @Query('sub-category') subcategory: string, @Request() req, ) { const data = await this.productService.findAllForPartner( page, pageSize, - categories, + subcategory, req.user.username, ); @@ -145,8 +147,14 @@ export class ProductController { } @Get('categories') - async findAllCategories(@Query('page') page: number) { - const [data, count] = await this.productCategoriesService.findAll(page); + async findAllCategories( + @Query('page') page: number, + @Query('pageSize') pageSize: number, + ) { + const [data, count] = await this.productCategoriesService.findAll( + page, + pageSize, + ); return { data, @@ -159,9 +167,14 @@ export class ProductController { @Get('sub-categories') async findAllSubCategories( @Query('page') page: number, + @Query('pageSize') pageSize: number, @Query('category') category: string, ) { - const data = await this.productSubCategoriesService.findAll(page, category); + const data = await this.productSubCategoriesService.findAll( + page, + category == 'null' ? null : category, + pageSize, + ); return { ...data, @@ -183,12 +196,14 @@ export class ProductController { async findPriceHistoryByProductId( @Param('id', ParseUUIDPipe) id: string, @Query('page') page: number, + @Query('pageSize') pageSize: number, @Query('supplier') supplier: string, ) { const data = await this.productHistoryPriceService.findOneByProductId( page, id, supplier, + pageSize, ); return { diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 061d23b..e1fa8db 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -1,9 +1,4 @@ -import { - HttpException, - HttpStatus, - Injectable, - UnauthorizedException, -} from '@nestjs/common'; +import { HttpException, HttpStatus } from '@nestjs/common'; import { EntityNotFoundError, Repository } from 'typeorm'; import { Product } from './entities/product.entity'; import { InjectRepository } from '@nestjs/typeorm'; @@ -15,7 +10,6 @@ import { productType } from '../helper/enum-list'; import { UpdatePriceProductDto } from './dto/product/update-price-product.dto'; import { UsersService } from '../users/users.service'; import { SupplierService } from '../users/supplier/supplier.service'; -import { type } from 'os'; export class ProductService { constructor( @@ -53,41 +47,67 @@ export class ProductService { return this.productRepository.findOneOrFail(result.identifiers[0].id); } - async findAll(page, supplier, categories, subCategories) { - if (supplier == 'null' || !supplier) { - supplier = (await this.supplierService.findByActive()).id; + async findAll( + page: number, + supplier: string, + subCategories: string, + pageSize?: number, + ) { + let filterSupplier, filterSubCategories; + + if (supplier) { + filterSupplier = supplier.split(',').map((data) => { + return data.trim(); + }); + } + + if (subCategories) { + filterSubCategories = subCategories.split(',').map((data) => { + return data.trim(); + }); } const baseQuery = this.productRepository .createQueryBuilder('product') .leftJoin('product.sub_categories', 'sub_categories') .leftJoin('sub_categories.category', 'category') - .where(`product.supplier_id = :supplier_id`, { - supplier_id: supplier, - }) + .leftJoin('product.supplier', 'supplier') + .where('supplier.status = :status', { status: true }) .leftJoinAndMapOne( 'product.currentPrice', 'product.priceHistory', 'current_price', - 'current_price.partner_id is null', + 'current_price.partner_id is null and current_price.end_date is NULL', + ) + .select(['product.id']) + .addSelect([ + 'product.name', + 'product.code', + 'sub_categories.name', + 'category.name', + 'product.status', + ]) + .addSelect('current_price.price') + .addSelect( + '(current_price.price + current_price.mark_up_price) as mark_up_price', ); - if (subCategories != 'null' && subCategories) { - baseQuery.andWhere('product.sub_categories_id = :id', { - id: subCategories, + if (subCategories && filterSubCategories.length > 0) { + baseQuery.where('product.sub_categories_id IN (:...subCategoryId)', { + subCategoryId: filterSubCategories, }); } - // if (categories != 'null' && categories) { - // baseQuery.andWhere('sub_categories.category_id = :id', { - // id: categories, - // }); - // } + if (supplier && filterSupplier.length > 0) { + baseQuery.where('supplier.id IN (:...supplierId)', { + supplierId: filterSupplier, + }); + } const data = await baseQuery - .skip(page * 10) - .take(10) - .getMany(); + .offset(page * (pageSize || 10)) + .limit(pageSize || 10) + .getRawMany(); const totalData = await baseQuery.getCount(); @@ -128,7 +148,7 @@ export class ProductService { }; } - async findAllBySubCategories(page, subCategories, supplier) { + async findAllBySubCategories(page, subCategories, supplier, pageSize?) { if (supplier != 'null' && !supplier) { supplier = (await this.supplierService.findByActive()).id; } @@ -156,8 +176,8 @@ export class ProductService { } const data = await baseQuery - .skip(page * 10) - .take(10) + .skip(page * (pageSize || 10)) + .take(pageSize || 10) .getMany(); const totalData = await baseQuery.getCount(); @@ -171,19 +191,33 @@ export class ProductService { async findAllForPartner( page: number, pageSize: number, - categories: string, + subCategories: string, username: string, ) { const user = await this.usersService.findOneByUsername(username); const supplier = await this.supplierService.findByActive(); + let filterSupplier, filterSubCategories; + + if (subCategories) { + filterSubCategories = subCategories.split(',').map((data) => data.trim()); + } else { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Sub Categories not inlcude', + }, + HttpStatus.NOT_FOUND, + ); + } + const baseQuery = this.productRepository .createQueryBuilder('product') .leftJoin('product.sub_categories', 'sub_categories') .where( - `sub_categories.category_id = :id and product.supplier_id = :supplier_id and product.status = 'ACTIVE'`, + `product.sub_categories_id IN (:...subCategoryId) and product.supplier_id = :supplier_id and product.status = 'ACTIVE'`, { - id: categories, + subCategoryId: filterSubCategories, supplier_id: supplier.id, }, ) @@ -192,13 +226,20 @@ export class ProductService { 'product.priceHistory', 'current_price', 'current_price.partner_id = :id_partner and current_price.end_date is NULL', + { + id_partner: user.partner.id, + }, ) - .setParameter('id_partner', user.partner.id); + .select(['product.id']) + .addSelect(['product.name', 'product.code', 'sub_categories.name']) + .addSelect( + '(current_price.price + current_price.mark_up_price) as price', + ); const data = await baseQuery - .skip(page * pageSize) - .take(pageSize) - .getMany(); + .offset(page * 10) + .limit(10) + .getRawMany(); const totalData = await baseQuery.getCount(); diff --git a/src/transaction/transaction.controller.ts b/src/transaction/transaction.controller.ts index 25118c4..da3363e 100644 --- a/src/transaction/transaction.controller.ts +++ b/src/transaction/transaction.controller.ts @@ -1,17 +1,4 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Delete, - Request, - HttpStatus, - Query, - Put, - ParseUUIDPipe, -} from '@nestjs/common'; +import { Body, Controller, Get, HttpStatus, Param, ParseUUIDPipe, Post, Put, Query, Request } from '@nestjs/common'; import { TransactionService } from './transaction.service'; import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; import { OrderTransactionDto } from './dto/order-transaction.dto'; @@ -101,10 +88,15 @@ export class TransactionController { } @Get('history') - async findByCategories(@Query('page') page: number, @Request() req) { + async findByCategories( + @Query('page') page: number, + @Query('pageSize') pageSize: number, + @Request() req, + ) { const data = await this.transactionService.transactionHistoryByUser( page, req.user.userId, + pageSize, ); return { @@ -115,11 +107,16 @@ export class TransactionController { } @Get('deposit-return') - async findDepositReturn(@Query('page') page: number, @Request() req) { + async findDepositReturn( + @Query('page') page: number, + @Query('pageSize') pageSize: number, + @Request() req, + ) { const [data, count] = await this.transactionService.getAllDepositReturnFromUser( req.user.userId, page, + pageSize, ); return { @@ -133,12 +130,14 @@ export class TransactionController { @Get('deposit-return/confirmation') async findDepositReturnConfirmation( @Query('page') page: number, + @Query('pageSize') pageSize: number, @Request() req, ) { const [data, count] = await this.transactionService.getAllDepositReturnToUser( req.user.userId, page, + pageSize, ); return { diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index 1d6ae06..1c12a1a 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -3,24 +3,14 @@ import { DistributeTransactionDto } from './dto/distribute-transaction.dto'; import { OrderTransactionDto } from './dto/order-transaction.dto'; import { InjectRepository } from '@nestjs/typeorm'; import { Transactions } from './entities/transactions.entity'; -import { - Connection, - EntityManager, - EntityNotFoundError, - Repository, -} from 'typeorm'; +import { Connection, EntityNotFoundError, Repository } from 'typeorm'; import { COA } from './entities/coa.entity'; import { TransactionJournal } from './entities/transaction-journal.entity'; import { CoaService } from './coa.service'; import * as uuid from 'uuid'; import { uniq } from 'lodash'; import { Decimal } from 'decimal.js'; -import { - balanceType, - coaType, - statusTransaction, - typeTransaction, -} from '../helper/enum-list'; +import { balanceType, coaType, statusTransaction, typeTransaction } from '../helper/enum-list'; import { ProductService } from '../product/product.service'; import { CreateJournalDto } from './dto/create-journal.dto'; import { UsersService } from 'src/users/users.service'; @@ -560,7 +550,11 @@ export class TransactionService { return transactionData; } - async transactionHistoryByUser(page: number, user: string) { + async transactionHistoryByUser( + page: number, + user: string, + pageSize?: number, + ) { const baseQuery = this.transactionRepository .createQueryBuilder('transaction') .select('transaction.id', 'id') @@ -578,8 +572,8 @@ export class TransactionService { // .leftJoinAndSelect('product_price.product', 'product'); const data = await baseQuery - .skip(page * 10) - .take(10) + .offset(page * (pageSize || 10)) + .limit(pageSize || 10) .getRawMany(); const totalData = await baseQuery.getCount(); @@ -614,10 +608,14 @@ export class TransactionService { } } - async getAllDepositReturnFromUser(user: string, page: number) { + async getAllDepositReturnFromUser( + user: string, + page: number, + pageSize?: number, + ) { return this.transactionRepository.findAndCount({ - skip: page * 10, - take: 10, + skip: page * (pageSize || 10), + take: pageSize || 10, where: { user: user, type: typeTransaction.DEPOSIT_RETURN, @@ -628,10 +626,14 @@ export class TransactionService { }); } - async getAllDepositReturnToUser(user: string, page: number) { + async getAllDepositReturnToUser( + user: string, + page: number, + pageSize?: number, + ) { return this.transactionRepository.findAndCount({ - skip: page * 10, - take: 10, + skip: page * (pageSize || 10), + take: pageSize || 10, where: { user_destination: user, type: typeTransaction.DEPOSIT_RETURN, diff --git a/src/users/dto/create-partner.dto.ts b/src/users/dto/create-partner.dto.ts index 2fbac10..a53785f 100644 --- a/src/users/dto/create-partner.dto.ts +++ b/src/users/dto/create-partner.dto.ts @@ -15,4 +15,7 @@ export class CreatePartnerDto { @IsNotEmpty() password_account: string; + + @IsNotEmpty() + phone_number: string; } diff --git a/src/users/partner/partner.service.ts b/src/users/partner/partner.service.ts index 2373826..1cae2f5 100644 --- a/src/users/partner/partner.service.ts +++ b/src/users/partner/partner.service.ts @@ -1,10 +1,4 @@ -import { - forwardRef, - HttpException, - HttpStatus, - Inject, - Injectable, -} from '@nestjs/common'; +import { forwardRef, HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Connection, Not, Repository } from 'typeorm'; import { CoaService } from '../../transaction/coa.service'; @@ -59,12 +53,13 @@ export class PartnerService { const dataUser = new CreateUserDto(); dataUser.username = `admin_${partnerData.name}`; - dataUser.username = partnerData.name; + dataUser.name = partnerData.name; dataUser.phone_number = partnerData.phone_number; dataUser.roleId = '21dceea2-416e-4b55-b74c-12605e1f8d1b'; dataUser.superior = false; dataUser.partner = partnerData; dataUser.password = createPartnerDto.password_account; + dataUser.phone_number = createPartnerDto.phone_number; await this.userService.create(dataUser, currentUser); @@ -134,10 +129,10 @@ export class PartnerService { return partnerData; }; - findAllPartner(page) { + findAllPartner(page, pageSize?) { return this.partnerRepository.findAndCount({ - skip: page * 10, - take: 10, + skip: page * (pageSize || 10), + take: pageSize || 10, order: { version: 'DESC', }, diff --git a/src/users/supplier/supplier.service.ts b/src/users/supplier/supplier.service.ts index 00ff8c0..e322890 100644 --- a/src/users/supplier/supplier.service.ts +++ b/src/users/supplier/supplier.service.ts @@ -1,10 +1,4 @@ -import { - forwardRef, - HttpException, - HttpStatus, - Inject, - Injectable, -} from '@nestjs/common'; +import { forwardRef, HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Connection, EntityNotFoundError, Not, Repository } from 'typeorm'; import { Supplier } from '../entities/supplier.entity'; @@ -130,7 +124,7 @@ export class SupplierService { return supplierData; }; - async findAllSupplier(page) { + async findAllSupplier(page, pageSize?) { const baseQuery = this.supplierRepository .createQueryBuilder('supplier') .leftJoinAndMapOne( @@ -148,8 +142,8 @@ export class SupplierService { .select(['supplier', 'coa.amount', 'coa_undistribute.amount']); const data = await baseQuery - .skip(page * 10) - .take(10) + .skip(page * (pageSize || 10)) + .take(pageSize || 10) .getMany(); const totalData = await baseQuery.getCount(); @@ -199,4 +193,24 @@ export class SupplierService { } } } + + async findByActiveAll() { + try { + return await this.supplierRepository.find({ + status: true, + }); + } catch (e) { + if (e instanceof EntityNotFoundError) { + throw new HttpException( + { + statusCode: HttpStatus.NOT_FOUND, + error: 'Supplier Data not found', + }, + HttpStatus.NOT_FOUND, + ); + } else { + throw e; + } + } + } } diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 42c581f..a127b27 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -125,8 +125,12 @@ export class UsersController { @Public() @Get('supplier') - async findAllSupplier(@Query('page') page: number) { - const data = await this.supplierService.findAllSupplier(page); + async findAllSupplier( + @Query('page') page: number, + @Query('pageSize') pageSize: number, + @Request() req, + ) { + const data = await this.supplierService.findAllSupplier(page, pageSize); return { ...data, @@ -136,8 +140,15 @@ export class UsersController { } @Get('partner') - async findAllPartner(@Query('page') page: number) { - const [data, count] = await this.partnerService.findAllPartner(page); + async findAllPartner( + @Query('page') page: number, + @Query('pageSize') pageSize: number, + @Request() req, + ) { + const [data, count] = await this.partnerService.findAllPartner( + page, + pageSize, + ); return { data, @@ -162,8 +173,13 @@ export class UsersController { async findByRoles( @Param('id', ParseUUIDPipe) id: string, @Query('page') page: number, + @Query('pageSize') pageSize: number, ) { - const [data, count] = await this.usersService.findByRoles(id, page); + const [data, count] = await this.usersService.findByRoles( + id, + page, + pageSize, + ); return { data, diff --git a/src/users/users.service.ts b/src/users/users.service.ts index eb97d80..b823a26 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -1,19 +1,7 @@ -import { - forwardRef, - HttpException, - HttpStatus, - Inject, - Injectable, -} from '@nestjs/common'; +import { forwardRef, HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; -import { - Connection, - EntityNotFoundError, - Equal, - Not, - Repository, -} from 'typeorm'; +import { Connection, EntityNotFoundError, Not, Repository } from 'typeorm'; import { User } from './entities/user.entity'; import { InjectRepository } from '@nestjs/typeorm'; import { randomStringGenerator } from '@nestjs/common/utils/random-string-generator.util'; @@ -155,10 +143,10 @@ export class UsersService { }; } - findByRoles(relationId: string, page: number) { + findByRoles(relationId: string, page: number, pageSize?: number) { return this.usersRepository.findAndCount({ - skip: page * 10, - take: 10, + skip: page * (pageSize || 10), + take: pageSize || 10, where: { roles: relationId, },