refazendo o order service
This commit is contained in:
@@ -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 {}
|
||||||
|
|||||||
22
src/common/response.interceptor.ts
Normal file
22
src/common/response.interceptor.ts
Normal 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);
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -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 = [
|
||||||
|
|||||||
@@ -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({
|
||||||
|
|||||||
@@ -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,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
///← Orquestra operações de pedido
|
|
||||||
|
|
||||||
|
|
||||||
import { Injectable } from '@nestjs/common';
|
|
||||||
|
|
||||||
|
|
||||||
@@ -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[];
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -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')
|
||||||
|
|||||||
@@ -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
@@ -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
17
src/shared/ResultModel.ts
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user