Skip to content

Commit

Permalink
Merge pull request #33 from vitorleal/feature/update-lib
Browse files Browse the repository at this point in the history
Update lib
  • Loading branch information
vitorleal authored Aug 7, 2019
2 parents 7b9d450 + a185d09 commit f87f085
Show file tree
Hide file tree
Showing 5 changed files with 2,813 additions and 219 deletions.
88 changes: 31 additions & 57 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
# Correios Node.js

[![Build Status](https://travis-ci.org/vitorleal/node-correios.svg?branch=master)](https://travis-ci.org/vitorleal/node-correios)
[![Built with Grunt](https://cdn.gruntjs.com/builtwith.png)](http://gruntjs.com/)
[![npm](https://img.shields.io/npm/v/npm.svg)](https://github.com/vitorleal/node-correios)
[![npm](https://img.shields.io/npm/l/express.svg)](https://github.com/vitorleal/node-correios)

Expand All @@ -11,44 +9,32 @@ Módulo de [Node.js](http://nodejs.org) que utilizar a API SOAP dos Correios par
[API dos Correios](http://www.correios.com.br/precos-e-prazos/calculador-remoto-de-precos-e-prazos)


## APP de Exemplo

- Calcular frete - [link](http://correios-server.herokuapp.com/frete?nCdServico=40010,40045&sCepOrigem=22041030&sCepDestino=04569001&nVlPeso=1&nCdFormato=1&nVlComprimento=20&nVlAltura=4&nVlLargura=11&nVlDiametro=20&nVlValorDeclarado=500)
- Calcular frete/prazo - [link](http://correios-server.herokuapp.com/frete/prazo?nCdServico=40010,40045&sCepOrigem=22041030&sCepDestino=04569001&nVlPeso=1&nCdFormato=1&nVlComprimento=20&nVlAltura=4&nVlLargura=11&nVlDiametro=20&nVlValorDeclarado=500)
- Buscar Cep - [link](http://correios-server.herokuapp.com/cep/22421010)


## Como instalar

Basta utilizar o [NPM](npmjs.org) com a *flag* **--save** para guardar como dependência no seu **package.json**

```
npm install node-correios --save
```


## Como utilizar o calculo de frete

```javascript
var Correios = require('node-correios'),
correios = new Correios();
let Correios = require('node-correios');
let correios = new Correios();

correios.calcPreco(args, function (err, result) {
correios.calcPreco(args)
.then(result => {
console.log(result);
})
.catch(error => {
console.log(error);
});

//Com promises

correios.calcPreco(args).then(result => console.log(result));


```

##### Exemplo de resultado
#### Respostas

Caso a consulta tenha sucesso, o `callback` receberá um objeto como segundo parâmetro, similar a:
Com sucesso:

```
```json
[{
Codigo: 40010,
Valor: '23,30',
Expand All @@ -60,10 +46,9 @@ Caso a consulta tenha sucesso, o `callback` receberá um objeto como segundo par
}]
```

Caso algum parâmetro esteja errado, ou o serviço esteja indisponível para o CEP de destino, o objeto retornado no
`callback` conterá a propriedade `Erro` como um código de erro e conterá uma mensagem de erro no parâmetro `MsgErro`.
Com erro:

```
```json
[{
Codigo: 40215,
Valor: '0',
Expand All @@ -76,24 +61,27 @@ Caso algum parâmetro esteja errado, ou o serviço esteja indisponível para o C
}]
```

Em caso de erro na consulta ao WebService dos Correios, o `callback` receberá o erro como primeiro parâmetro.

Para consultar mais de um serviço na mesma requisição, basta passar vários códigos de serviço, separados por vírgula,
para o parâmetro `nCdServico` (ver descrição dos parâmetros abaixo). Neste caso, o array da resposta conterá um objeto
por cada código informado, sendo que alguns podem apresentar erro e outros podem ter tido sucesso.


``` javascript
var args = {
let args = {
nCdServico: '40010,41106,40215',
// demais parâmetros ...
}

correios.calcPreco(args, function (err, result) {
console.log(result);
correios.calcPreco(args)
.then(result => {
console.log(result);
})
.catch(error => {
console.log(error)
});
```

// result:
```json
[{
Codigo: 40010,
Valor: '24,10',
Expand Down Expand Up @@ -213,24 +201,19 @@ Para executar o comando tem que enviar os campos **obrigatórios**. Para mais de
## Como utilizar a buscar por CEP

```javascript
var Correios = require('node-correios'),
correios = new Correios();
let Correios = require('node-correios');
let correios = new Correios();

correios.consultaCEP({ cep: '00000000' }, function(err, result) {
console.log(result)
correios.consultaCEP({ cep: '00000000' })
.then(result => {
console.log(result);
})
.catch(error => {
console.log(error;)
});

//Ou

correios.consultaCEP({ cep: '00000000' }).then(result => console.log(result));

```



##### Exemplo de resultado

Caso a consulta tenha sucesso, o `callback` receberá um objeto como segundo parâmetro, similar a:
##### Resposta

```
{
Expand All @@ -242,24 +225,15 @@ Caso a consulta tenha sucesso, o `callback` receberá um objeto como segundo par
}
```

Em caso de erro na consulta ao WebService dos Correios, o `callback` receberá o erro ocorrido como primeiro parâmetro.


## Testes unitários

Para rodas os testes unitários, depois de instalar as dependências do projeto com o ```npm install```, execute o comando:
Para rodas os testes unitários:

```
$ npm test
```

Para incluir seus testes unitários, eles se encontram na pasta ```./test```


## Contribuições

Para contribuir com o projeto basta seguir as seguintes intruções: [Link](https://github.com/vitorleal/node-correios/wiki/Contribui%C3%A7%C3%B5es)


## Autor

Expand Down
203 changes: 65 additions & 138 deletions lib/correios.js
Original file line number Diff line number Diff line change
@@ -1,157 +1,84 @@
'use strict';

var soap = require('soap'),
extend = require('extend'),
request = require('request');


/**
* Correios class
* @example
* ```
* var Correios = require('node-correios'),
* correios = new Correios();
*
* correios.calcPreco(args, function (err, result) {
* console.log(result);
* });
* ```
*/
var Correios = function () {
// If is not instance of Correios return a new instance
if (false === (this instanceof Correios)) {
return new Correios();
let soap = require('soap');
let request = require('request');

module.exports = class Correios {
constructor(width) {
this.calcPrecoUrl = 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx?wsdl';
this.cepUrl = 'http://viacep.com.br/ws/{CEP}/json';
this.calcArgs = {
nCdEmpresa : '',
sDsSenha : '',
sCdMaoPropria : 'N',
nVlValorDeclarado : 0,
sCdAvisoRecebimento: 'N'
};
}

// Default URl's
this.calcPrecoUrl = 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx?wsdl';
this.cepUrl = 'http://viacep.com.br/ws/{CEP}/json';

// Default args for price calculation
this.calcArgs = {
nCdEmpresa : '',
sDsSenha : '',
sCdMaoPropria : 'N',
nVlValorDeclarado : 0,
sCdAvisoRecebimento: 'N'
};

// Default args for CEP search
this.cepArgs = {
cepEntrada: '',
metodo : 'buscarCep'
};
};
calcPreco(args) {
let arg = Object.assign({}, this.calcArgs, args);

return new Promise((resolve, reject) => {
soap.createClient(this.calcPrecoUrl, (error, client) => {
client.CalcPreco(arg, (error, result) => {
if (!error
&& result && result.CalcPrecoResult
&& result.CalcPrecoResult.Servicos
&& result.CalcPrecoResult.Servicos.cServico) {

/**
* Calculate price with shipping
* @param {object} args
* @param {function} [callback] - Callback to execute after request
* @example
* ```
* var args = {
* nCdServico: '40010,41106,40215',
* // demais parâmetros ...
* };
*
* correios.calcPreco(args, function (err, result) {
* console.log(result);
* });
* ```
*/
Correios.prototype.calcPreco = function(args, callback) {
return new Promise((resolve,reject) => {
var arg = extend({}, this.calcArgs, args);
return resolve(result.CalcPrecoResult.Servicos.cServico);
}

// create the SOAP client
soap.createClient(this.calcPrecoUrl, function(err, client) {
client.CalcPreco(arg, function (err, result) {
if (result && result.CalcPrecoResult && result.CalcPrecoResult.Servicos && result.CalcPrecoResult.Servicos.cServico) {
return callback ? callback(err, result.CalcPrecoResult.Servicos.cServico) : (!err ? resolve(result.CalcPrecoResult.Servicos.cServico) : reject(err));
} else {
return callback ? callback(err, null) : reject(err);
}
return reject(error);
});
});
});
})
};
})
}

calcPrecoPrazo(args) {
let arg = Object.assign({}, this.calcArgs, args);

return new Promise((resolve, reject) => {
soap.createClient(this.calcPrecoUrl, (error, client) => {
client.CalcPrecoPrazo(arg, (error, result) => {
if (!error
&& result && result.CalcPrecoResult
&& result.CalcPrecoPrazoResult.Servicos
&& result.CalcPrecoPrazoResult.Servicos.cServico) {

/**
* Calculate price and estimate delivery time
* @param {object} args
* @param {function} [callback] - Callback to execute after request
* @example
* ```
* var args = {
* nCdServico: '40010,41106,40215',
* // demais parâmetros ...
* };
*
* correios.calcPrecoPrazo(args, function (err, result) {
* console.log(result);
* });
* ```
*/
Correios.prototype.calcPrecoPrazo = function(args, callback) {
var arg = extend({}, this.calcArgs, args);
return resolve(result.CalcPrecoPrazoResult.Servicos.cServico)
}

// create the SOAP client
return new Promise((resolve, reject) => {
soap.createClient(this.calcPrecoUrl, function(err, client) {
client.CalcPrecoPrazo(arg, function (err, result) {
callback ? callback(err, result.CalcPrecoPrazoResult.Servicos.cServico) : (!err ? resolve(result.CalcPrecoPrazoResult.Servicos.cServico) : reject(err));
return reject(error);
});
});
});
})
};


/**
* Search for address by CEP
* @param {object} args
* @param {function} [callback] - Callback to execute after request
* @example
* ```
* var Correios = require('node-correios'),
* correios = new Correios();
*
* correios.consultaCEP({ cep: '00000000' }, function(err, result) {
* console.log(result)
* });
* ```
*/
Correios.prototype.consultaCEP = function(args, callback) {
var arg = extend({}, args);

if ('cep' in arg === false) {
throw new Error('You need to inform a CEP ex: { cep: 00000000 }');
}

return new Promise((resolve, reject) => {
// make request to the cep api
var url = this.cepUrl.replace('{CEP}', arg.cep.replace('-', ''));
consultaCEP(args) {
let arg = Object.assign({}, args);

request(url, function(err, resp, body) {
if (err) {
return callback ? callback(err) : reject(err);
}
if ('cep' in arg === false) {
throw new Error('You need to inform a CEP ex: { cep: 00000000 }');
}

try {
return callback ? callback(null, JSON.parse(body)) : resolve(JSON.parse(body));
return new Promise((resolve, reject) => {
let url = this.cepUrl.replace('{CEP}', arg.cep.replace('-', ''));

} catch (e) {
var error = {
Erro: 404,
MsgErro: 'Cep não encontrado'
request(url, (error, resp, body) => {
if (error) {
return reject(error);
}
return callback ? callback(error) : reject(error);
}
});
})
};


module.exports = Correios;
try {
return resolve(JSON.parse(body))

} catch (e) {
return reject({
Erro: 404,
MsgErro: 'Cep não encontrado'
});
}
});
});
}
}
Loading

0 comments on commit f87f085

Please sign in to comment.