| Server IP : 189.126.111.107 / Your IP : 216.73.217.69 Web Server : Apache System : Linux www.gadotticar.com.br 5.4.0-135-generic #152-Ubuntu SMP Wed Nov 23 20:19:22 UTC 2022 x86_64 User : gadotticar ( 1000) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /home/gadotticar/frete-api/src/frete/transportadoras/ |
Upload File : |
import { Injectable, HttpException, HttpStatus } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { HttpService } from '@nestjs/axios';
import { lastValueFrom } from 'rxjs';
@Injectable()
export class BraspressService {
private readonly apiUrl: string;
constructor(
private readonly httpService: HttpService,
private readonly configService: ConfigService,
) {
this.apiUrl = this.configService.get<string>('BRASPRESS_SANDBOX') === 'true'
? 'https://sandbox.braspress.com/v1'
: 'https://api.braspress.com/v1';
}
public async calculateShipping(data: any): Promise<any> {
console.log('BRASPRESS:', data);
// Determinar CEPs de origem e destino de forma flexível
const cepOrigem = data.Origem?.cep;
const cepDestino = data.Destino?.cep;
const produtos = data.Produtos;
// Validação básica
if (!cepOrigem) {
throw new HttpException('CEP de origem está ausente', HttpStatus.BAD_REQUEST);
}
if (!cepDestino) {
throw new HttpException('CEP de destino está ausente', HttpStatus.BAD_REQUEST);
}
if (!produtos || !Array.isArray(produtos) || produtos.length === 0) {
throw new HttpException('Campo "Produtos" está ausente ou vazio', HttpStatus.BAD_REQUEST);
}
console.log(data)
// Preparar o payload para a API da Braspress
const payload = {
cnpjRemetente: '27308366000189', // Ajustado para camelCase, comum em APIs
cnpjDestinatario: '27308366000189',
modal: 'R', // Ajustado para "Modal" com "M" maiúsculo
tipoFrete: 1, // Alterado para "CIF" em vez de "1"
cepOrigem: cepOrigem.replace(/\D/g, ''),
cepDestino: cepDestino.replace(/\D/g, ''),
vlrMercadoria: Number(produtos.reduce((acc: number, prod: any) => acc + (Number(prod.valor) || 0), 0)), // Convertido para número
peso: Number(produtos.reduce((acc: number, prod: any) => acc + (Number(prod.peso) || 0), 0)), // Convertido para número
volumes: produtos.length,
cubagem: produtos.map((produto) => ({
altura: produto.altura / 100, // Ajustado para camelCase
largura: produto.largura /100,
comprimento: produto.comprimento /100,
volumes: 1,
})),
};
console.log('Payload preparado para a API da Braspress:', payload);
// Credenciais da Braspress
const username = '27308366000189_PRD';
const password = '85BVYraFPk0Q83pg';
const authString = Buffer.from(`${username}:${password}`).toString('base64');
const authorizationHeader = `Basic ${authString}`;
try {
const response = await lastValueFrom(
this.httpService.post(`${this.apiUrl}/cotacao/calcular/json`, payload, {
headers: {
Authorization: authorizationHeader,
'Content-Type': 'application/json',
},
}),
);
console.log('Resposta da API da Braspress:', response.data);
return this.formatResponse(response.data);
} catch (error) {
if (error.response) {
console.error('Erro ao calcular frete - Status:', error.response.status);
console.error('Erro ao calcular frete - Dados da resposta:', error.response.data);
} else {
console.error('Erro ao calcular frete:', error.message);
}
throw new HttpException('Error calculating shipping', HttpStatus.INTERNAL_SERVER_ERROR);
}
}
private formatResponse(data: any): any {
console.log('Formatando resposta da Braspress:', data);
const valorFrete = data.totalFrete !== undefined && data.totalFrete !== null
? String(data.totalFrete.toFixed(2)) // Converte para string com 2 casas decimais
:null;
return {
transportadora: 'Braspress',
codigo: 1001,
descricao: data.descricao || 'Frete Braspress',
cotacao: {
codigo : data.id,
msg: 'Braspress',
valor: valorFrete,
prazo_min: data.prazo ,
prazo_max: data.prazo,
},
};
}
}