refazendo o order service

This commit is contained in:
unknown
2025-03-30 20:02:24 -03:00
parent 32bd7c14b3
commit 2fd5ae2b1f
13 changed files with 735 additions and 849 deletions

View File

@@ -1,51 +1,53 @@
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config'; import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm';
import { createOracleConfig } from './core/configs/typeorm.oracle.config'; import { createOracleConfig } from './core/configs/typeorm.oracle.config';
import { createPostgresConfig } from './core/configs/typeorm.postgres.config'; import { createPostgresConfig } from './core/configs/typeorm.postgres.config';
import { LogisticModule } from './logistic/logistic.module'; import { LogisticModule } from './logistic/logistic.module';
import { OrdersPaymentModule } from './orders-payment/orders-payment.module'; import { OrdersPaymentModule } from './orders-payment/orders-payment.module';
import { ProductsModule } from './products/products.module'; import { ProductsModule } from './products/products.module';
import { AuthModule } from './auth/auth/auth.module'; import { AuthModule } from './auth/auth/auth.module';
import { DataConsultModule } from './data-consult/data-consult.module'; import { DataConsultModule } from './data-consult/data-consult.module';
import { OrdersModule } from './orders/orders.module'; import { OrdersModule } from './orders/modules/orders.module';
import { OcorrencesController } from './crm/occurrences/ocorrences.controller'; import { OcorrencesController } from './crm/occurrences/ocorrences.controller';
import { OccurrencesModule } from './crm/occurrences/occurrences.module'; import { OccurrencesModule } from './crm/occurrences/occurrences.module';
import { ReasonTableModule } from './crm/reason-table/reason-table.module'; import { ReasonTableModule } from './crm/reason-table/reason-table.module';
import { NegotiationsModule } from './crm/negotiations/negotiations.module'; import { NegotiationsModule } from './crm/negotiations/negotiations.module';
import { HttpModule } from '@nestjs/axios'; import { HttpModule } from '@nestjs/axios';
import { LogisticController } from './logistic/logistic.controller'; import { LogisticController } from './logistic/logistic.controller';
import { LogisticService } from './logistic/logistic.service'; import { LogisticService } from './logistic/logistic.service';
import { LoggerModule } from './Log/logger.module'; import { LoggerModule } from './Log/logger.module';
import { UsersModule } from './auth/users/users.module'; import { UsersModule } from './auth/users/users.module';
@Module({
imports: [ @Module({
UsersModule, imports: [
ConfigModule.forRoot({ isGlobal: true }), UsersModule,
TypeOrmModule.forRootAsync({ ConfigModule.forRoot({ isGlobal: true }),
name: 'oracle', TypeOrmModule.forRootAsync({
inject: [ConfigService], name: 'oracle',
useFactory: createOracleConfig, inject: [ConfigService],
}), useFactory: createOracleConfig,
TypeOrmModule.forRootAsync({ }),
name: 'postgres', TypeOrmModule.forRootAsync({
inject: [ConfigService], name: 'postgres',
useFactory: createPostgresConfig, inject: [ConfigService],
}), useFactory: createPostgresConfig,
LogisticModule, }),
OrdersPaymentModule, LogisticModule,
HttpModule, OrdersPaymentModule,
NegotiationsModule, HttpModule,
OccurrencesModule, OrdersModule,
ReasonTableModule, NegotiationsModule,
LoggerModule, OccurrencesModule,
DataConsultModule, ReasonTableModule,
ProductsModule, LoggerModule,
AuthModule, DataConsultModule,
OrdersModule, ProductsModule,
], AuthModule,
controllers: [OcorrencesController, LogisticController], OrdersModule,
providers: [ LogisticService], ],
}) controllers: [OcorrencesController, LogisticController ],
export class AppModule {} providers: [ LogisticService, ],
})
export class AppModule {}

View File

@@ -0,0 +1,22 @@
// common/interceptors/response.interceptor.ts
import {
CallHandler,
ExecutionContext,
Injectable,
NestInterceptor,
} from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { ResultModel } from '../shared/ResultModel';
@Injectable()
export class ResponseInterceptor<T> implements NestInterceptor<T, ResultModel<T>> {
intercept(context: ExecutionContext, next: CallHandler<T>): Observable<ResultModel<T>> {
return next.handle().pipe(
map((data) => {
return ResultModel.success(data);
}),
);
}
}

View File

@@ -72,7 +72,6 @@ export class DataConsultRepository {
const likeFilter = filter.toUpperCase().replace('@', '%') + '%'; const likeFilter = filter.toUpperCase().replace('@', '%') + '%';
const queries = [ const queries = [
// Busca por código (apenas números)
{ {
sql: ` sql: `
SELECT PCCLIENT.CODCLI as "id", SELECT PCCLIENT.CODCLI as "id",
@@ -84,7 +83,6 @@ export class DataConsultRepository {
`, `,
params: [cleanedNumeric], params: [cleanedNumeric],
}, },
// Busca por CNPJ/CPF limpo
{ {
sql: ` sql: `
SELECT PCCLIENT.CODCLI as "id", SELECT PCCLIENT.CODCLI as "id",
@@ -96,7 +94,6 @@ export class DataConsultRepository {
`, `,
params: [cleanedNumeric], params: [cleanedNumeric],
}, },
// Busca por nome do cliente
{ {
sql: ` sql: `
SELECT PCCLIENT.CODCLI as "id", SELECT PCCLIENT.CODCLI as "id",
@@ -122,7 +119,7 @@ export class DataConsultRepository {
async findProducts(filter: string): Promise<ProductDto[]> { async findProducts(filter: string): Promise<ProductDto[]> {
const cleanedFilter = filter.replace(/[^\d]/g, ''); // apenas números const cleanedFilter = filter.replace(/[^\d]/g, '');
const likeFilter = filter + '%'; const likeFilter = filter + '%';
const queries = [ const queries = [

View File

@@ -1,11 +1,14 @@
import { NestFactory } from '@nestjs/core'; import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module'; import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common'; import { ValidationPipe } from '@nestjs/common';
import { ResponseInterceptor } from './common/response.interceptor';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
async function bootstrap() { async function bootstrap() {
const app = await NestFactory.create(AppModule); const app = await NestFactory.create(AppModule);
app.useGlobalInterceptors(new ResponseInterceptor());
app.useGlobalPipes( app.useGlobalPipes(
new ValidationPipe({ new ValidationPipe({

View File

@@ -1,21 +0,0 @@
import { Injectable, NotFoundException } from '@nestjs/common';
import { InvoiceRepository } from '../repositories/invoice.repository';
import { InvoiceDto } from '../dto/invoice.dto';
@Injectable()
export class InvoiceService {
constructor(private readonly invoiceRepo: InvoiceRepository) {}
async getInvoiceByChave(chavenfe: string): Promise<InvoiceDto> {
const invoice = await this.invoiceRepo.findInvoiceByChave(chavenfe);
if (!invoice) {
throw new NotFoundException('Nota fiscal não localizada.');
}
const itens = await this.invoiceRepo.findInvoiceItems(invoice.transactionId);
return {
...invoice,
itens,
};
}
}

View File

@@ -1,6 +0,0 @@
///← Orquestra operações de pedido
import { Injectable } from '@nestjs/common';

View File

@@ -1,25 +0,0 @@
export class InvoiceItemDto {
productId: number;
productName: string;
package: string;
qt: number;
ean: string;
multiple: number;
productType: string;
image: string | null;
}
export class InvoiceDto {
storeId: number;
invoiceDate: Date;
orderId: number;
invoiceId: number;
transactionId: number;
customerId: number;
customer: string;
sellerId: number;
sellerName: string;
itensQt: number;
itens: InvoiceItemDto[];
}

View File

@@ -7,35 +7,20 @@ https://docs.nestjs.com/controllers#controllers
import { Body, Controller, Get, Param, Post, Query } from '@nestjs/common'; import { Body, Controller, Get, Param, Post, Query } from '@nestjs/common';
import { OrdersService } from './orders.service'; import { OrdersService } from './orders.service';
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
import { AuthGuard } from '@nestjs/passport';
import { UseGuards } from '@nestjs/common';
import { ApiOperation } from '@nestjs/swagger';
import { InvoiceService } from './application/invoice.service';
import { InvoiceDto } from './dto/invoice.dto';
@Controller('api/v1/orders')
@ApiTags('Invoice')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'))
@Controller('api/v1/invoice')
export class OrdersController { export class OrdersController {
constructor( constructor( private readonly ordersService: OrdersService) {}
private readonly ordersService: OrdersService,
private readonly invoiceService: InvoiceService,
) {}
@Get('find') @Get('find')
findOrders(@Query() query) { findOrders(@Query() query) {
return this.ordersService.findOrders(query); return this.ordersService.findOrders(query);
} }
@Get(':chavenfe') @Get('invoice/:chavenfe')
async getByChave(@Param('chavenfe') chavenfe: string): Promise<InvoiceDto> { findInvoice(@Param('chavenfe') chavenfe: string) {
return this.invoiceService.getInvoiceByChave(chavenfe); return this.ordersService.findInvoice(chavenfe);
} }
@Get('itens/:id') @Get('itens/:id')

View File

@@ -1,27 +1,19 @@
/* eslint-disable prettier/prettier */ /* eslint-disable prettier/prettier */
/* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable @typescript-eslint/no-unused-vars */
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { OrdersService } from './orders.service'; import { OrdersService } from './orders.service';
import { InvoiceRepository } from './repositories/invoice.repository';
import { InvoiceService } from './application/invoice.service';
import { OrdersController } from './orders.controller'; import { OrdersController } from './orders.controller';
/*
https://docs.nestjs.com/modules
*/
import { Module } from '@nestjs/common';
@Module({ @Module({
imports: [ imports: [],
ConfigModule, controllers: [
TypeOrmModule, OrdersController,],
], providers: [
controllers: [ OrdersService,],
OrdersController,
],
providers: [
OrdersService,
InvoiceService,
InvoiceRepository,
],
}) })
export class OrdersModule {} export class OrdersModule { }

File diff suppressed because it is too large Load Diff

View File

@@ -1,78 +0,0 @@
import { Injectable } from '@nestjs/common';
import { DataSource } from 'typeorm';
import { InjectDataSource } from '@nestjs/typeorm';
@Injectable()
export class InvoiceRepository {
constructor(
@InjectDataSource() private readonly dataSource: DataSource,
) {}
async findInvoiceByChave(chavenfe: string) {
const queryRunner = this.dataSource.createQueryRunner();
await queryRunner.connect();
try {
const sql = `
SELECT
pcnfsaid.codfilial AS "storeId",
pcnfsaid.dtsaida AS "invoiceDate",
pcnfsaid.numped AS "orderId",
pcnfsaid.numnota AS "invoiceId",
pcnfsaid.numtransvenda AS "transactionId",
pcnfsaid.codcli AS "customerId",
pcclient.cliente AS "customer",
pcnfsaid.codusur AS "sellerId",
pcusuari.nome AS "sellerName",
(
SELECT SUM(pcmov.qt)
FROM pcmov
WHERE pcmov.numtransvenda = pcnfsaid.numtransvenda
) AS "itensQt",
NULL AS "itens"
FROM pcnfsaid, pcclient, pcusuari
WHERE
pcnfsaid.codcli = pcclient.codcli
AND pcnfsaid.codusur = pcusuari.codusur
AND pcnfsaid.chavenfe = :chavenfe
`;
return await queryRunner.manager.query(sql, [chavenfe]);
} finally {
await queryRunner.release();
}
}
async findInvoiceItems(transactionId: number) {
const queryRunner = this.dataSource.createQueryRunner();
await queryRunner.connect();
try {
const sql = `
SELECT
pcmov.codprod AS "productId",
pcprodut.descricao AS "productName",
pcprodut.embalagem AS "package",
pcmov.qt AS "qt",
pcprodut.codauxiliar AS "ean",
pcprodut.multiplo AS "multiple",
pcprodut.tipoproduto AS "productType",
REPLACE(
CASE
WHEN INSTR(PCPRODUT.URLIMAGEM, ';') > 0 THEN
SUBSTR(PCPRODUT.URLIMAGEM, 1, INSTR(PCPRODUT.URLIMAGEM, ';') - 1)
WHEN PCPRODUT.URLIMAGEM IS NOT NULL THEN
PCPRODUT.URLIMAGEM
ELSE NULL
END,
'167.249.211.178:8001',
'10.1.1.191'
) AS "image"
FROM pcmov, pcprodut
WHERE
pcmov.codprod = pcprodut.codprod
AND pcmov.numtransvenda = :transactionId
`;
return await queryRunner.manager.query(sql, [transactionId]);
} finally {
await queryRunner.release();
}
}
}

17
src/shared/ResultModel.ts Normal file
View File

@@ -0,0 +1,17 @@
export class ResultModel<T> {
constructor(
public success: boolean,
public message?: string,
public data?: T,
public error?: any
) {}
static success<T>(data?: T, message?: string): ResultModel<T> {
return new ResultModel<T>(true, message, data);
}
static failure<T>(message: string, error?: any): ResultModel<T> {
return new ResultModel<T>(false, message, undefined, error);
}
}