diff --git a/src/product/entities/product-history-status.entity.ts b/src/product/entities/product-history-status.entity.ts new file mode 100644 index 0000000..8ad3458 --- /dev/null +++ b/src/product/entities/product-history-status.entity.ts @@ -0,0 +1,20 @@ +import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'; +import { Product } from './product.entity'; +import { BaseModel } from '../../config/basemodel.entity'; +import { productType } from '../../helper/enum-list'; +import { Partner } from '../../users/entities/partner.entity'; + +@Entity() +export class ProductHistoryStatus extends BaseModel { + @PrimaryGeneratedColumn('uuid') + id: string; + + @ManyToOne(() => Product, (product) => product.id) + product: Product; + + @ManyToOne(() => Partner, (partner) => partner.id) + partner: Partner; + + @Column() + status: string; +} diff --git a/src/product/entities/product.entity.ts b/src/product/entities/product.entity.ts index 2b2f92b..1f6fda9 100644 --- a/src/product/entities/product.entity.ts +++ b/src/product/entities/product.entity.ts @@ -3,6 +3,7 @@ import { ProductSubCategories } from './product-sub-category.entity'; import { BaseModel } from '../../config/basemodel.entity'; import { Supplier } from '../../users/entities/supplier.entity'; import { ProductHistoryPrice } from './product-history-price.entity'; +import {ProductHistoryStatus} from "./product-history-status.entity"; @Entity() export class Product extends BaseModel { @@ -53,6 +54,19 @@ export class Product extends BaseModel { ) supplier: Supplier; + + @OneToMany( + () => { + return ProductHistoryStatus; + }, + (php) => { + return php.product; + }, + ) + statusHistory: ProductHistoryStatus; + + currentStatus: ProductHistoryStatus; + @OneToMany( () => { return ProductHistoryPrice; diff --git a/src/product/product.module.ts b/src/product/product.module.ts index 231478e..ee5250e 100644 --- a/src/product/product.module.ts +++ b/src/product/product.module.ts @@ -10,6 +10,7 @@ import { ProductSubCategories } from './entities/product-sub-category.entity'; import { ProductSubCategoriesService } from './product-sub-categories.service'; import { UsersModule } from '../users/users.module'; import { ProductHistoryPriceService } from './history-price/history-price.service'; +import {ProductHistoryStatus} from "./entities/product-history-status.entity"; @Module({ imports: [ @@ -17,6 +18,7 @@ import { ProductHistoryPriceService } from './history-price/history-price.servic Product, ProductCategories, ProductHistoryPrice, + ProductHistoryStatus, ProductSubCategories, ]), forwardRef(() => UsersModule), diff --git a/src/product/product.service.ts b/src/product/product.service.ts index 8457093..eafd101 100644 --- a/src/product/product.service.ts +++ b/src/product/product.service.ts @@ -13,6 +13,7 @@ import { SupplierService } from '../users/supplier/supplier.service'; import { parsingFile } from '../helper/csv-parser'; import { PartnerService } from '../users/partner/partner.service'; import { mapSeries } from 'bluebird'; +import { ProductHistoryStatus } from './entities/product-history-status.entity'; export class ProductService { constructor( @@ -20,6 +21,8 @@ export class ProductService { private productRepository: Repository, @InjectRepository(ProductHistoryPrice) private productHistoryPrice: Repository, + @InjectRepository(ProductHistoryStatus) + private productHistoryStatus: Repository, private productSubCategoriesService: ProductSubCategoriesService, private usersService: UsersService, private supplierService: SupplierService, @@ -103,6 +106,13 @@ export class ProductService { }); } + await this.productHistoryStatus.insert({ + product: productData, + partner: it[6] != '-' ? partnerData : null, + status: it[5] == 'active' ? 'ACTIVE' : 'NOT ACTIVE', + + }); + await this.productHistoryPrice.insert({ product: productData, mark_up_price: it[4], @@ -129,6 +139,12 @@ export class ProductService { type: it[7] == 'postpaid' ? 'postpaid' : 'prepaid', }); + await this.productHistoryStatus.insert({ + product: savedProduct.identifiers[0], + partner: partnerData, + status: it[5] == 'active' ? 'ACTIVE' : 'NOT ACTIVE', + }); + return await this.productHistoryPrice.insert({ product: savedProduct.identifiers[0], mark_up_price: it[4], @@ -178,6 +194,12 @@ export class ProductService { 'current_price', 'current_price.end_date is NULL', ) + .innerJoinAndMapOne( + 'product.currentStatus', + 'product.statusHistory', + 'history_status', + 'history_status.deleted_at is NULL' + ) .select(['product.id']) .addSelect([ 'product.name', @@ -185,8 +207,8 @@ export class ProductService { 'sub_categories.name', 'supplier.name', 'category.name', - 'product.status', ]) + .addSelect('history_status.status', 'status') .addSelect('current_price.price', 'price') .addSelect('current_price.partner_fee', 'partner_fee') .addSelect('current_price.admin_price', 'admin_price') @@ -260,6 +282,8 @@ export class ProductService { .createQueryBuilder('product') .leftJoin('product.sub_categories', 'sub_categories') + .leftJoin('product.statusHistory', 'status_history') + .leftJoinAndMapOne( 'product.currentPrice', 'product.priceHistory', @@ -267,7 +291,7 @@ export class ProductService { 'current_price.partner_id is NULL and current_price.end_date is NULL', ) .where( - `product.supplier_id = :supplier_id and product.status = 'ACTIVE'`, + `product.supplier_id = :supplier_id and status_history.status = 'ACTIVE'`, { supplier_id: supplier, }, @@ -329,7 +353,6 @@ export class ProductService { 'supplier', 'supplier.status = true', ) - .where(`product.status = 'ACTIVE'`) .innerJoinAndMapOne( 'product.currentPrice', 'product.priceHistory', @@ -339,18 +362,29 @@ export class ProductService { id_partner: user.partner.id, }, ) - .select(['product.id']) + .innerJoinAndMapOne( + 'product.currentStatus', + 'product.statusHistory', + 'history_status', + 'history_status.deleted_at is NULL' + ) + .where(`history_status.partner_id = :id_partner and history_status.status = 'ACTIVE'`, + { + id_partner: user.partner.id, + }, + ) + .select(['product.id']) .addSelect([ 'product.name', 'product.code', 'product.type', - 'product.status', 'sub_categories.name', 'current_price.admin_price as admin_price', 'current_price.mark_up_price as markup_price', 'current_price.partner_fee as partner_fee', 'current_price.price as price', ]) + .addSelect('history_status.status', 'status') // .addSelect( // '(current_price.price + current_price.mark_up_price) as price', // ); @@ -369,7 +403,7 @@ export class ProductService { if (subCategories && filterSubCategories.length > 0) { baseQuery.where('product.sub_categories_id IN (:...subCategoryId)', { subCategoryId: filterSubCategories, - }).andWhere(`product.status = 'ACTIVE'`) + }).andWhere(`history_status.status = 'ACTIVE'`) } const newData = [] @@ -435,7 +469,6 @@ export class ProductService { relations: ['supplier'], where: { code: code, - status: 'ACTIVE', }, }); } catch (e) { @@ -497,6 +530,15 @@ export class ProductService { updateProductDto.subCategoriesId, ); + const dataStatus = await this.productHistoryStatus.findOne({ + where: { + product: id, + }, + }); + + await this.productHistoryStatus.update(dataStatus.id, { + status: updateProductDto.status, + }); const result = await this.productRepository.update(id, { name: updateProductDto.name, code: updateProductDto.code, diff --git a/src/transaction/transaction.service.ts b/src/transaction/transaction.service.ts index a8cdcc8..2fc835d 100644 --- a/src/transaction/transaction.service.ts +++ b/src/transaction/transaction.service.ts @@ -310,7 +310,7 @@ export class TransactionService { 'prepaid', ); - if (!productData.status.includes('ACTIVE')) { + if (!productData.statusHistory.status.includes('ACTIVE')) { throw new HttpException( { statusCode: HttpStatus.INTERNAL_SERVER_ERROR, @@ -467,7 +467,7 @@ export class TransactionService { 'prepaid', ); - if (!productData.status.includes('ACTIVE')) { + if (!productData.statusHistory.status.includes('ACTIVE')) { throw new HttpException( { statusCode: HttpStatus.INTERNAL_SERVER_ERROR,