generated from ecomplus/application-starter
-
Notifications
You must be signed in to change notification settings - Fork 1
/
correios-calculate.js
115 lines (113 loc) · 3.34 KB
/
correios-calculate.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
const logger = require('firebase-functions/logger')
const { newCorreios } = require('./correios-axios')
const calculate = async ({
correiosParams,
serviceCodes = ['03220', '03298'],
correios,
storeId,
timeout = 20000
}) => {
if (!correios) {
correios = await newCorreios(storeId)
}
const { nuContrato, nuDR } = correios.$contract
if (!(Number(correiosParams.psObjeto) >= 200)) {
correiosParams.psObjeto = '200'
}
if (!(Number(correiosParams.comprimento) >= 15)) {
correiosParams.comprimento = '15'
} else if (Number(correiosParams.comprimento) > 100) {
correiosParams.comprimento = '100'
}
if (!(Number(correiosParams.altura) >= 2)) {
correiosParams.altura = '2'
} else if (Number(correiosParams.altura) > 100) {
correiosParams.altura = '100'
}
if (!(Number(correiosParams.largura) >= 11)) {
correiosParams.largura = '11'
} else if (Number(correiosParams.largura) > 100) {
correiosParams.largura = '100'
}
const { largura, altura, comprimento } = correiosParams
if (Number(largura) + Number(altura) + Number(comprimento) > 200) {
correiosParams.comprimento = '100'
correiosParams.largura = '84'
correiosParams.altura = '16'
}
if (correiosParams.vlDeclarado) {
const value = Number(correiosParams.vlDeclarado)
if (value < 25.63) {
correiosParams.vlDeclarado = '26'
} else if (value > 10000) {
correiosParams.vlDeclarado = '10000'
}
if (!correiosParams.servicosAdicionais) {
correiosParams.servicosAdicionais = ['019']
} else if (!correiosParams.servicosAdicionais.includes('019')) {
correiosParams.servicosAdicionais.push('019')
}
}
[
'psObjeto',
'comprimento',
'altura',
'largura',
'vlDeclarado'
].forEach((param) => {
if (typeof correiosParams[param] === 'number') {
correiosParams[param] = String(Math.round(correiosParams[param]))
}
})
const debugError = (err) => {
if (err.response) {
logger.warn(`[calculate] failed for #${storeId}`, {
body: err.config.data,
response: err.response.data,
status: err.response.status
})
} else {
logger.error(err)
}
throw err
}
const params = serviceCodes
.filter((coProduto) => typeof coProduto === 'string' && coProduto)
.map((coProduto, nuRequisicao) => {
const _params = {
...correiosParams,
coProduto,
nuContrato,
nuDR,
nuRequisicao,
tpObjeto: '2'
}
const listWithoutAddService = ['03298', '04227', '80659']
if (listWithoutAddService.includes(coProduto) && _params.vlDeclarado) {
delete _params.vlDeclarado
_params.servicosAdicionais = _params.servicosAdicionais.filter((s) => s !== '019')
}
return _params
})
return Promise.all([
correios.post('/preco/v1/nacional', {
idLote: '1',
parametrosProduto: params
}, { timeout })
.catch(debugError),
correios.post('/prazo/v1/nacional', {
idLote: '1',
parametrosPrazo: params
}, { timeout })
.catch(debugError)
]).then((responses) => {
responses[1].data.forEach(({ coProduto, ...value }) => {
const result = responses[0].data.find((result) => result.coProduto === coProduto)
if (result) {
Object.assign(result, value)
}
})
return responses[0]
})
}
module.exports = { calculate }