Skip to content

Commit

Permalink
feat: nova release (#29)
Browse files Browse the repository at this point in the history
AlexandreBellas authored Oct 5, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
2 parents 0f3f8d4 + 388cb76 commit 1dc80b9
Showing 109 changed files with 3,397 additions and 895 deletions.
1 change: 1 addition & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -12,6 +12,7 @@
"aliquota",
"Amazônia",
"autoload",
"boletos",
"borderô",
"Borderos",
"borderôs",
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -10,7 +10,7 @@
Pacote de integração com a [API v3 do ERP Bling](https://developer.bling.com.br)
para Javascript/TypeScript. O mais completo existente.

Atualizado com a versão `v300` da API ([veja o registro de alterações](https://developer.bling.com.br/changelogs#2024-02-28)).
Atualizado com a versão `v310` da API ([veja o registro de alterações](https://developer.bling.com.br/changelogs#2024-10-02)).

**Atenção**: a versão 5.0.0+ do `bling-erp-api` para Javascript/TypeScript
utiliza a API v3 do Bling. Caso deseja utilizar a API v2 do Bling,
@@ -61,7 +61,8 @@ Todas as entidades do Bling atualmente são permitidas para interação. São el
- [x] Depósitos (`.depositos`)
- [x] Empresas (`.empresas`)
- [x] Estoques (`.estoques`)
- [x] Formas de pagamento (`.formasDePagamento`)
- [x] Formas de Pagamento (`.formasDePagamento`)
- [x] Grupos de Produtos (`.gruposDeProdutos`)
- [x] Homologação (`.homologacao`)
- [x] Logísticas (`.logisticas`)
- [x] Logísticas - Etiquetas (`.logisticasEtiquetas`)
@@ -73,13 +74,15 @@ Todas as entidades do Bling atualmente são permitidas para interação. São el
- [x] Notas Fiscais de Serviço Eletrônicas (`.nfses`)
- [x] Notas Fiscais Eletrônicas (`.nfes`)
- [x] Notificações (`.notificacoes`)
- [x] Ordens de Produção (`.ordensDeProducao`)
- [x] Pedidos - Compras (`.pedidosCompras`)
- [x] Pedidos - Vendas (`.pedidosVendas`)
- [x] Produtos (`.produtos`)
- [x] Produtos - Estruturas (`.produtosEstruturas`)
- [x] Produtos - Fornecedores (`.produtosFornecedores`)
- [x] Produtos - Lojas (`.produtosLojas`)
- [x] Produtos - Variações (`.produtosVariacoes`)
- [x] Propostas Comerciais (`.propostasComerciais`)
- [x] Situações (`.situacoes`)
- [x] Situações - Módulos (`.situacoesModulos`)
- [x] Situações - Transições (`.situacoesTransicoes`)
1,402 changes: 759 additions & 643 deletions package-lock.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "bling-erp-api",
"version": "5.7.0",
"version": "5.8.0",
"description": "Pacote de integração com a API do Bling ERP",
"main": "lib/bling.js",
"directories": {
21 changes: 21 additions & 0 deletions src/bling.spec.ts
Original file line number Diff line number Diff line change
@@ -41,6 +41,9 @@ import { SituacoesTransicoes } from './entities/situacoesTransicoes'
import { Usuarios } from './entities/usuarios'
import { Vendedores } from './entities/vendedores'
import { CanaisDeVenda } from './entities/canaisDeVenda'
import { OrdensDeProducao } from './entities/ordensDeProducao'
import { PropostasComerciais } from './entities/propostasComerciais'
import { GruposDeProdutos } from './entities/gruposDeProdutos'

const chance = Chance()

@@ -252,4 +255,22 @@ describe('Bling main module', () => {
CanaisDeVenda
)
})

it('should retrieve ordens de produção entity', () => {
expect(createBling(chance.word()).ordensDeProducao).toBeInstanceOf(
OrdensDeProducao
)
})

it('should retrieve propostas comerciais entity', () => {
expect(createBling(chance.word()).propostasComerciais).toBeInstanceOf(
PropostasComerciais
)
})

it('should retrieve grupos de produtos entity', () => {
expect(createBling(chance.word()).gruposDeProdutos).toBeInstanceOf(
GruposDeProdutos
)
})
})
30 changes: 30 additions & 0 deletions src/bling.ts
Original file line number Diff line number Diff line change
@@ -17,6 +17,7 @@ import { Depositos } from './entities/depositos'
import { Empresas } from './entities/empresas'
import { Estoques } from './entities/estoques'
import { FormasDePagamento } from './entities/formasDePagamento'
import { GruposDeProdutos } from './entities/gruposDeProdutos'
import { Homologacao } from './entities/homologacao'
import { Logisticas } from './entities/logisticas'
import { LogisticasEtiquetas } from './entities/logisticasEtiquetas'
@@ -28,13 +29,15 @@ import { Nfces } from './entities/nfces'
import { Nfes } from './entities/nfes'
import { Nfses } from './entities/nfses'
import { Notificacoes } from './entities/notificacoes'
import { OrdensDeProducao } from './entities/ordensDeProducao'
import { PedidosCompras } from './entities/pedidosCompras'
import { PedidosVendas } from './entities/pedidosVendas'
import { Produtos } from './entities/produtos'
import { ProdutosEstruturas } from './entities/produtosEstruturas'
import { ProdutosFornecedores } from './entities/produtosFornecedores'
import { ProdutosLojas } from './entities/produtosLojas'
import { ProdutosVariacoes } from './entities/produtosVariacoes'
import { PropostasComerciais } from './entities/propostasComerciais'
import { Situacoes } from './entities/situacoes'
import { SituacoesModulos } from './entities/situacoesModulos'
import { SituacoesTransicoes } from './entities/situacoesTransicoes'
@@ -432,4 +435,31 @@ export default class Bling {
public get canaisDeVenda(): CanaisDeVenda {
return this.getModule(CanaisDeVenda)
}

/**
* Obtém a instância de interação com ordens de produção.
*
* @return {OrdensDeProducao}
*/
public get ordensDeProducao(): OrdensDeProducao {
return this.getModule(OrdensDeProducao)
}

/**
* Obtém a instância de interação com propostas comerciais.
*
* @return {PropostasComerciais}
*/
public get propostasComerciais(): PropostasComerciais {
return this.getModule(PropostasComerciais)
}

/**
* Obtém a instância de interação com grupos de produtos.
*
* @return {GruposDeProdutos}
*/
public get gruposDeProdutos(): GruposDeProdutos {
return this.getModule(GruposDeProdutos)
}
}
6 changes: 4 additions & 2 deletions src/entities/@shared/entity.ts
Original file line number Diff line number Diff line change
@@ -21,11 +21,13 @@ export abstract class Entity {
* Prepara um parâmetro de data para chamada do repositório.
*
* @param param Parâmetro do tipo `string`, `Date` ou `undefined`
* @param includeTime Define se horas e minutos são inclusos no resultado
*
* @returns {string|undefined}
*/
protected prepareStringOrDateParam(
param?: string | Date
param?: string | Date,
includeTime: boolean = false
): string | undefined {
if (param === undefined) {
return undefined
@@ -35,6 +37,6 @@ export abstract class Entity {
return param
}

return convertDateToString(param)
return convertDateToString(param, includeTime)
}
}
21 changes: 13 additions & 8 deletions src/entities/contasPagar/__tests__/find-response.ts
Original file line number Diff line number Diff line change
@@ -2,7 +2,7 @@ export default {
data: {
id: 12345678,
situacao: 1,
vencimento: '2023-01-12',
vencimento: "2023-01-12",
valor: 1500.75,
contato: {
id: 12345678
@@ -11,18 +11,23 @@ export default {
id: 12345678
},
saldo: 100.75,
dataEmissao: '2023-01-12',
vencimentoOriginal: '2023-01-12',
numeroDocumento: '',
competencia: '2023-01-12',
historico: '',
numeroBanco: '',
dataEmissao: "2023-01-12",
vencimentoOriginal: "2023-01-12",
numeroDocumento: "",
competencia: "2023-01-12",
historico: "",
numeroBanco: "",
portador: {
id: 12345678
},
categoria: {
id: 12345678
},
borderos: [0]
borderos: [
0
],
ocorrencia: {
tipo: 1
}
}
}
47 changes: 47 additions & 0 deletions src/entities/contasPagar/interfaces/find.interface.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,47 @@
import { ISituacao } from '../types/situacao.type'

interface ContasPagarOcorrenciaUnicaDTO {
/**
* `1`: Única
*/
tipo: 1
}

interface ContasPagarOcorrenciaParceladaDTO {
/**
* `2`: Parcelada
*/
tipo: 2
considerarDiasUteis: boolean
diaVencimento: number
numeroParcelas: number
}

interface ContasPagarOcorrenciaDTO {
/**
* `3`: Mensal
* `4`: Bimestral
* `5`: Trimestral
* `6`: Semestral
* `7`: Anual
* `8`: Quinzenal
*/
tipo: 3 | 4 | 5 | 6 | 7 | 8
considerarDiasUteis: boolean
diaVencimento: number
dataLimite: string
}

interface ContasPagarOcorrenciaSemanalDTO {
/**
* `9`: Semanal
*/
tipo: 9
considerarDiasUteis: boolean
diaSemanaVencimento: number
dataLimite: string
}

export interface IFindParams {
idContaPagar: number
}
@@ -22,5 +64,10 @@ export interface IFindResponse {
portador: { id: number }
categoria: { id: number }
borderos: number[]
ocorrencia:
| ContasPagarOcorrenciaUnicaDTO
| ContasPagarOcorrenciaParceladaDTO
| ContasPagarOcorrenciaDTO
| ContasPagarOcorrenciaSemanalDTO
}
}
16 changes: 11 additions & 5 deletions src/entities/contasReceber/__tests__/cancel-bank-slips-response.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
export default null

export const cancelBankSlipRequest = {
type2FA: 1,
code2FA: '111111',
idOrigem: 16853468718,
idDuplicata: 16853468712,
reason: 'motivo'
autenticacao: {
tipo: 1 as const,
codigo: "111111"
},
origem: {
id: 5436875653
},
conta: {
id: 6423836115
},
motivo: "Cancelado por força maior"
}
24 changes: 12 additions & 12 deletions src/entities/contasReceber/__tests__/get-bank-slips-response.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
export default {
numberSale: '149',
numberNF: '000001',
amountAccounts: 1,
amountValuesAccounts: 111.2,
haveAccountWithIntegration: true,
accounts: [
venda: {
numero: "123"
},
notaFiscal: {
numero: "000001"
},
valorTotal: 111.2,
contas: [
{
id: 1328793273,
idExternal: 'BWbXB',
dueDate: '2023-09-12',
value: 111.2,
situation: 'aberto' as const,
iconSituation: 'aberto',
descriptionSituation: 'Em aberto'
numeroExterno: "BWbXB",
vencimento: "2023-09-12",
valor: 111.2,
situacao: 1 as const
}
]
}
4 changes: 2 additions & 2 deletions src/entities/contasReceber/__tests__/index.spec.ts
Original file line number Diff line number Diff line change
@@ -101,7 +101,7 @@ describe('Contas a receber entity', () => {
})

expect(spy).toHaveBeenCalledWith({
endpoint: 'contas/receber/view/bankslips',
endpoint: 'contas/receber/boletos',
params: {
idOrigem,
situations: undefined
@@ -153,7 +153,7 @@ describe('Contas a receber entity', () => {
const response = await entity.cancelBankSlips(cancelBankSlipRequest)

expect(spy).toHaveBeenCalledWith({
endpoint: 'contas/receber/cancel/bankslips',
endpoint: 'contas/receber/boletos/cancelar',
body: cancelBankSlipRequest
})
expect(response).toBe(cancelBankSlipsResponse)
10 changes: 5 additions & 5 deletions src/entities/contasReceber/index.ts
Original file line number Diff line number Diff line change
@@ -88,23 +88,23 @@ export class ContasReceber extends Entity {
}

/**
* Obtém os boletos - Bling conta.
* Obtém boletos de contas a receber.
*
* @param {IGetBankSlipsParams} params Parâmetros da busca.
*
* @returns {Promise<IGetBankSlipsResponse>}
* @throws {BlingApiException|BlingInternalException}
*
* @see https://developer.bling.com.br/referencia#/Contas%20a%20Receber/get_contas_receber_view_bankslips
* @see https://developer.bling.com.br/referencia#/Contas%20a%20Receber/get_contas_receber_boletos
*/
public async getBankSlips(
params: IGetBankSlipsParams
): Promise<IGetBankSlipsResponse> {
return await this.repository.index({
endpoint: 'contas/receber/view/bankslips',
endpoint: 'contas/receber/boletos',
params: {
idOrigem: params.idOrigem,
situations: params.situations
situacoes: params.situacoes
}
})
}
@@ -158,7 +158,7 @@ export class ContasReceber extends Entity {
*/
public async cancelBankSlips(body: ICancelBankSlipsBody): Promise<null> {
return await this.repository.store({
endpoint: 'contas/receber/cancel/bankslips',
endpoint: 'contas/receber/boletos/cancelar',
body
})
}
Original file line number Diff line number Diff line change
@@ -1,37 +1,15 @@
interface ContasReceberBankSlipsCancelUnicoDTO {
type2FA: number
code2FA: string
/**
* caso for cancelar uma conta sem idOrigem enviar o valor `0`
*/
idOrigem: number
idDuplicata: number
reason: string
import { ITipoAutenticacao } from "../types/tipo-autenticacao.type"

export interface ICancelBankSlipsBody {
autenticacao?: {
tipo: ITipoAutenticacao
codigo: string
},
origem?: {
id: number
},
conta?: {
id: number
},
motivo: string
}

interface ContasReceberBankSlipsCancelTodosDTO {
type2FA: number
code2FA: string
idOrigem: number
reason: string
}

interface ContasReceberBankSlipsCancelUnicoSem2FADTO {
/**
* caso for cancelar uma conta sem idOrigem enviar o valor `0`
*/
idOrigem: number
idDuplicata: number
reason: string
}

interface ContasReceberBankSlipsCancelTodosSem2FADTO {
idOrigem: number
reason: string
}

export type ICancelBankSlipsBody =
| ContasReceberBankSlipsCancelUnicoDTO
| ContasReceberBankSlipsCancelTodosDTO
| ContasReceberBankSlipsCancelUnicoSem2FADTO
| ContasReceberBankSlipsCancelTodosSem2FADTO
8 changes: 4 additions & 4 deletions src/entities/contasReceber/interfaces/find.interface.ts
Original file line number Diff line number Diff line change
@@ -86,9 +86,9 @@ export interface IFindResponse {
vendedor?: { id: number }
borderos: number[]
ocorrencia:
| ContasReceberOcorrenciaUnicaDTO
| ContasReceberOcorrenciaParceladaDTO
| ContasReceberOcorrenciaDTO
| ContasReceberOcorrenciaSemanalDTO
| ContasReceberOcorrenciaUnicaDTO
| ContasReceberOcorrenciaParceladaDTO
| ContasReceberOcorrenciaDTO
| ContasReceberOcorrenciaSemanalDTO
}
}
28 changes: 14 additions & 14 deletions src/entities/contasReceber/interfaces/get-bank-slips.interface.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
import { ISituacaoString } from '../types/situacao.type'
import { ISituacao } from '../types/situacao.type'

export interface IGetBankSlipsParams {
idOrigem: number
situations?: ISituacaoString[]
situacoes?: ISituacao[]
}

export interface IGetBankSlipsResponse {
numberSale: string
numberNF: string
amountAccounts: number
amountValuesAccounts: number
haveAccountWithIntegration: boolean
accounts: {
venda: {
numero: string
},
notaFiscal: {
numero: string
},
valorTotal: number
contas: {
id: number
idExternal: string
dueDate: string
value: number
situation: ISituacaoString
iconSituation: string
descriptionSituation: string
numeroExterno: string
vencimento: string
valor: number
situacao: ISituacao
}[]
}
8 changes: 5 additions & 3 deletions src/entities/contasReceber/interfaces/get.interface.ts
Original file line number Diff line number Diff line change
@@ -7,14 +7,16 @@ export interface IGetParams {
limite?: number
situacoes?: ISituacao[]
/**
* `E`: filtrar por data de emissão
* `V`: filtrar por data de vencimento
* - `E`: filtrar por data de emissão
* - `V`: filtrar por data de vencimento
* - `R`: Data de recebimento
*/
tipoFiltroData?: 'E' | 'V'
tipoFiltroData?: 'E' | 'V' | 'R'
dataInicial?: Date | string
dataFinal?: Date | string
idsCategorias?: number[]
idPortador?: number
idContato?: number
idVendedor?: number
idFormaPagamento?: number
boletoGerado?: number
5 changes: 5 additions & 0 deletions src/entities/contasReceber/types/tipo-autenticacao.type.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
/**
* - `1`: Código de autenticação por dois fatores
* - `4`: Senha de 6 dígitos do app Bling Conta
*/
export type ITipoAutenticacao = 1 | 4
12 changes: 8 additions & 4 deletions src/entities/contatos/index.ts
Original file line number Diff line number Diff line change
@@ -78,16 +78,20 @@ export class Contatos extends Entity {
pesquisa: params?.pesquisa,
criterio: params?.criterio,
dataInclusaoInicial: this.prepareStringOrDateParam(
params?.dataInclusaoInicial
params?.dataInclusaoInicial,
true
),
dataInclusaoFinal: this.prepareStringOrDateParam(
params?.dataInclusaoFinal
params?.dataInclusaoFinal,
true
),
dataAlteracaoInicial: this.prepareStringOrDateParam(
params?.dataAlteracaoInicial
params?.dataAlteracaoInicial,
true
),
dataAlteracaoFinal: this.prepareStringOrDateParam(
params?.dataAlteracaoFinal
params?.dataAlteracaoFinal,
true
),
idTipoContato: params?.idTipoContato,
idVendedor: params?.idVendedor,
4 changes: 4 additions & 0 deletions src/entities/empresas/__tests__/index.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Empresas } from '..'
import { InMemoryBlingRepository } from '../../../repositories/bling-in-memory.repository'
import { IMeResponse } from '../interfaces/me.interface'
import meResponse from './me-response'

describe('Empresas entity', () => {
@@ -25,5 +26,8 @@ describe('Empresas entity', () => {
endpoint: 'empresas/me/dados-basicos'
})
expect(response).toBe(meResponse)

const typingResponseTest: IMeResponse = meResponse
expect(typingResponseTest).toBe(meResponse)
})
})
8 changes: 5 additions & 3 deletions src/entities/empresas/__tests__/me-response.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
export default {
data: {
nome: 'Empresa Teste LTDA',
cnpj: '12.345.657/8910-11',
email: 'empresa@email.com'
id: "436c56a5679921f5f13a3d6433561773",
nome: "Empresa Teste LTDA",
cnpj: "12.345.657/8910-11",
email: "empresa@email.com",
dataContrato: "2024-12-31"
}
}
2 changes: 2 additions & 0 deletions src/entities/empresas/interfaces/me.interface.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
export interface IMeResponse {
data: {
id: string
nome: string
cnpj: string
email: string
dataContrato: string
}
}
4 changes: 2 additions & 2 deletions src/entities/estoques/index.ts
Original file line number Diff line number Diff line change
@@ -32,7 +32,7 @@ export class Estoques extends Entity {
return await this.repository.show({
endpoint: 'estoques/saldos',
id: String(params.idDeposito),
params: { idsProdutos: params.idsProdutos }
params: { idsProdutos: params.idsProdutos, codigos: params.codigos }
})
}

@@ -51,7 +51,7 @@ export class Estoques extends Entity {
): Promise<IGetBalancesResponse> {
return await this.repository.index({
endpoint: 'estoques/saldos',
params: { idsProdutos: params.idsProdutos }
params: { idsProdutos: params.idsProdutos, codigos: params.codigos }
})
}

4 changes: 2 additions & 2 deletions src/entities/estoques/interfaces/find-balance.interface.ts
Original file line number Diff line number Diff line change
@@ -8,9 +8,9 @@ export interface IFindBalanceParams {
*/
idsProdutos: number[]
/**
* Código do produto
* Códigos dos produtos
*/
codigo?: string
codigos?: string[]
}

export interface IFindBalanceResponse {
4 changes: 2 additions & 2 deletions src/entities/estoques/interfaces/get-balances.interface.ts
Original file line number Diff line number Diff line change
@@ -4,9 +4,9 @@ export interface IGetBalancesParams {
*/
idsProdutos: number[]
/**
* Código do produto
* Códigos dos produtos
*/
codigo?: string
codigos?: string[]
}

export interface IGetBalancesResponse {
8 changes: 5 additions & 3 deletions src/entities/formasDePagamento/interfaces/get.interface.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import ISituacao from 'src/entities/@shared/types/situacao.type'
import { IPadrao } from '../types/padrao.type'
import { ITipoPagamento } from '../types/tipo-pagamento.type'
import { IFinalidade } from '../types/finalidade.type'

export interface IGetParams {
/**
@@ -30,8 +31,9 @@ export interface IGetResponse {
id: number
descricao: string
tipoPagamento: ITipoPagamento
situacao: ISituacao
fixa: boolean
padrao: IPadrao
situacao?: ISituacao
fixa?: boolean
padrao?: IPadrao
finalidade: IFinalidade
}[]
}
10 changes: 8 additions & 2 deletions src/entities/formasDePagamento/types/tipo-pagamento.type.ts
Original file line number Diff line number Diff line change
@@ -3,17 +3,20 @@
* - `2`: Cheque
* - `3`: Cartão de Crédito
* - `4`: Cartão de Débito
* - `5`: Crédito Loja
* - `5`: Cartão da Loja (Private Label)
* - `10`: Vale Alimentação
* - `11`: Vale Refeição
* - `12`: Vale Presente
* - `13`: Vale Combustível
* - `14`: Duplicata Mercantil
* - `15`: Boleto Bancário
* - `16`: Depósito Bancário
* - `17`: Pagamento Instantâneo (PIX)
* - `17`: Pagamento Instantâneo (PIX) - Dinâmico
* - `18`: Transferência Bancária, Carteira Digital
* - `19`: Programa de Fidelidade, Cashback, Crédito Virtual
* - `20`: Pagamento Instantâneo (PIX) – Estático
* - `21`: Crédito em loja
* - `22`: Pagamento Eletrônico não Informado - falha de hardware do sistema emissor
* - `90`: Sem pagamento
* - `99`: Outros
*/
@@ -33,5 +36,8 @@ export type ITipoPagamento =
| 17
| 18
| 19
| 20
| 21
| 22
| 90
| 99
12 changes: 12 additions & 0 deletions src/entities/gruposDeProdutos/__tests__/create-response.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
export default {
data: {
id: 12345678
}
}

export const createRequestBody = {
nome: "Grupo 1",
grupoProdutoPai: {
id: 123456
}
}
30 changes: 30 additions & 0 deletions src/entities/gruposDeProdutos/__tests__/delete-many-response.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
export default {
data: {
alertas: [
{
error: {
type: "VALIDATION_ERROR",
message: "Não foi possível salvar a venda",
description: "A venda não pode ser salva, pois ocorreram problemas em sua validação.",
fields: [
{
code: 49,
msg: "Uma ou mais parcelas da venda possuem erros de validação",
element: "parcelas",
namespace: "VENDAS",
collection: [
{
index: 1,
code: 12,
msg: "Id da forma de pagamento inválido.",
element: "formaPagamento",
namespace: "VENDAS"
}
]
}
]
}
}
]
}
}
1 change: 1 addition & 0 deletions src/entities/gruposDeProdutos/__tests__/delete-response.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default null
10 changes: 10 additions & 0 deletions src/entities/gruposDeProdutos/__tests__/find-response.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
export default {
data: {
id: 123456,
nome: "Grupo 1",
grupoProdutoPai: {
id: 123456,
nome: "Grupo 1"
}
}
}
12 changes: 12 additions & 0 deletions src/entities/gruposDeProdutos/__tests__/get-response.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
export default {
data: [
{
id: 123456,
nome: "Grupo 1",
grupoProdutoPai: {
id: 123456,
nome: "Grupo 1"
}
}
]
}
142 changes: 142 additions & 0 deletions src/entities/gruposDeProdutos/__tests__/index.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
import { Chance } from 'chance'
import { GruposDeProdutos } from '..'
import { InMemoryBlingRepository } from '../../../repositories/bling-in-memory.repository'
import { ICreateResponse } from '../interfaces/create.interface'
import { IDeleteManyResponse } from '../interfaces/delete-many.interface'
import { IFindResponse } from '../interfaces/find.interface'
import { IGetResponse } from '../interfaces/get.interface'
import createResponse, { createRequestBody } from './create-response'
import deleteManyResponse from './delete-many-response'
import deleteResponse from './delete-response'
import findResponse from './find-response'
import getResponse from './get-response'
import updateResponse, { updateRequestBody } from './update-response'

const chance = Chance()

describe('GruposDeProdutos entity', () => {
let repository: InMemoryBlingRepository
let entity: GruposDeProdutos

beforeEach(() => {
repository = new InMemoryBlingRepository()
entity = new GruposDeProdutos(repository)
})

afterEach(() => {
jest.restoreAllMocks()
})

it('should delete many successfully', async () => {
const idsGruposProdutos: number[] = []
for (let i = 0; i < chance.natural({ min: 1, max: 5 }); i++) {
idsGruposProdutos.push(chance.natural())
}
const spy = jest.spyOn(repository, 'destroy')
repository.setResponse(deleteManyResponse)

const response = await entity.deleteMany({ idsGruposProdutos })

expect(spy).toHaveBeenCalledWith({
endpoint: 'grupos-produtos',
id: '',
params: { idsGruposProdutos }
})
expect(response).toBe(deleteManyResponse)

const typingResponseTest: IDeleteManyResponse = deleteManyResponse
expect(typingResponseTest).toBe(deleteManyResponse)
})

it('should delete successfully', async () => {
const idGrupoProduto = chance.natural()
const spy = jest.spyOn(repository, 'destroy')
repository.setResponse(deleteResponse)

const response = await entity.delete({ idGrupoProduto })

expect(spy).toHaveBeenCalledWith({
endpoint: 'grupos-produtos',
id: String(idGrupoProduto)
})
expect(response).toBe(deleteResponse)

const typingResponseTest: null = deleteResponse
expect(typingResponseTest).toBe(deleteResponse)
})

it('should get successfully', async () => {
const spy = jest.spyOn(repository, 'index')
repository.setResponse(getResponse)

const response = await entity.get()

expect(spy).toHaveBeenCalledWith({
endpoint: 'grupos-produtos',
params: {
nome: undefined,
nomePai: undefined,
pagina: undefined,
limite: undefined
}
})
expect(response).toBe(getResponse)

const typingResponseTest: IGetResponse = getResponse
expect(typingResponseTest).toBe(getResponse)
})

it('should find successfully', async () => {
const spy = jest.spyOn(repository, 'show')
const idGrupoProduto = chance.natural()
repository.setResponse(findResponse)

const response = await entity.find({ idGrupoProduto })

expect(spy).toHaveBeenCalledWith({
endpoint: 'grupos-produtos',
id: String(idGrupoProduto)
})
expect(response).toBe(findResponse)

const typingResponseTest: IFindResponse = findResponse
expect(typingResponseTest).toBe(findResponse)
})

it('should create successfully', async () => {
const spy = jest.spyOn(repository, 'store')
repository.setResponse(createResponse)

const response = await entity.create(createRequestBody)

expect(spy).toHaveBeenCalledWith({
endpoint: 'grupos-produtos',
body: createRequestBody
})
expect(response).toBe(createResponse)

const typingResponseTest: ICreateResponse = createResponse
expect(typingResponseTest).toBe(createResponse)
})

it('should update successfully', async () => {
const spy = jest.spyOn(repository, 'replace')
const idGrupoProduto = chance.natural()
repository.setResponse(updateResponse)

const response = await entity.update({
idGrupoProduto,
...updateRequestBody
})

expect(spy).toHaveBeenCalledWith({
endpoint: 'grupos-produtos',
id: String(idGrupoProduto),
body: updateRequestBody
})
expect(response).toBe(updateResponse)

const typingResponseTest: null = updateResponse
expect(typingResponseTest).toBe(updateResponse)
})
})
8 changes: 8 additions & 0 deletions src/entities/gruposDeProdutos/__tests__/update-response.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
export default null

export const updateRequestBody = {
nome: "Grupo 1",
grupoProdutoPai: {
id: 123456
}
}
135 changes: 135 additions & 0 deletions src/entities/gruposDeProdutos/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
import { Entity } from '../@shared/entity'
import { ICreateBody, ICreateResponse } from './interfaces/create.interface'
import {
IDeleteManyParams,
IDeleteManyResponse
} from './interfaces/delete-many.interface'
import { IDeleteParams } from './interfaces/delete.interface'
import { IFindParams, IFindResponse } from './interfaces/find.interface'
import { IGetParams, IGetResponse } from './interfaces/get.interface'
import {
IUpdateBody,
IUpdateParams
} from './interfaces/update.interface'

/**
* Entidade para interação com Grupos de Produtos.
*
* @see https://developer.bling.com.br/referencia#/Grupos%20de%20Produtos
*/
export class GruposDeProdutos extends Entity {
/**
* Remove múltiplos grupos de produtos.
*
* @param {IDeleteManyParams} params Parâmetros da remoção.
*
* @returns {Promise<IDeleteManyResponse>} Não há retorno.
* @throws {BlingApiException|BlingInternalException}
*
* @see https://developer.bling.com.br/referencia#/Grupos%20de%20Produtos/delete_grupos_produtos
*/
public async deleteMany(
params: IDeleteManyParams
): Promise<IDeleteManyResponse> {
return await this.repository.destroy({
endpoint: 'grupos-produtos',
id: '',
params: { idsGruposProdutos: params.idsGruposProdutos }
})
}

/**
* Remove um grupo de produtos.
*
* @param {IDeleteParams} params Parâmetros da remoção.
*
* @returns {Promise<null>} Não há retorno.
* @throws {BlingApiException|BlingInternalException}
*
* @see https://developer.bling.com.br/referencia#/Grupos%20de%20Produtos/delete_grupos_produtos__idGrupoProduto_
*/
public async delete(params: IDeleteParams): Promise<null> {
return await this.repository.destroy({
endpoint: 'grupos-produtos',
id: String(params.idGrupoProduto)
})
}

/**
* Obtém grupos de produtos.
*
* @param {IGetParams} params Parâmetros da busca.
*
* @returns {Promise<IGetResponse>}
* @throws {BlingApiException|BlingInternalException}
*
* @see https://developer.bling.com.br/referencia#/GruposDeProdutos/get_produtos
*/
public async get(params?: IGetParams): Promise<IGetResponse> {
return await this.repository.index({
endpoint: 'grupos-produtos',
params: {
nome: params?.nome,
nomePai: params?.nomePai,
pagina: params?.pagina,
limite: params?.limite,
}
})
}

/**
* Obtém um grupo de produtos.
*
* @param {IFindParams} params Parâmetros da busca.
*
* @returns {Promise<IFindResponse>}
* @throws {BlingApiException|BlingInternalException}
*
* @see https://developer.bling.com.br/referencia#/Grupos%20de%20Produtos/get_grupos_produtos__idGrupoProduto_
*/
public async find(params: IFindParams): Promise<IFindResponse> {
return await this.repository.show({
endpoint: 'grupos-produtos',
id: String(params.idGrupoProduto)
})
}

/**
* Cria um grupo de produtos.
*
* @param {ICreateBody} body O conteúdo para a criação.
*
* @returns {Promise<ICreateResponse>}
* @throws {BlingApiException|BlingInternalException}
*
* @see https://developer.bling.com.br/referencia#/Grupos%20de%20Produtos/post_grupos_produtos
*/
public async create(body: ICreateBody): Promise<ICreateResponse> {
return await this.repository.store({
endpoint: 'grupos-produtos',
body
})
}

/**
* Altera um grupo de produtos.
*
* @param {IUpdateParams & IUpdateBody} params Os parâmetros da atualização.
*
* @return {Promise<null>}
* @throws {BlingApiException|BlingInternalException}
*
* @see https://developer.bling.com.br/referencia#/Grupos%20de%20Produtos/put_grupos_produtos__idGrupoProduto_
*/
public async update(
params: IUpdateParams & IUpdateBody
): Promise<null> {
const { idGrupoProduto, ...body } = params

return await this.repository.replace({
endpoint: 'grupos-produtos',
id: String(idGrupoProduto),
body
})
}
}
12 changes: 12 additions & 0 deletions src/entities/gruposDeProdutos/interfaces/create.interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
export interface ICreateBody {
nome: string
grupoProdutoPai: {
id: number
}
}

export interface ICreateResponse {
data: {
id: number
}
}
14 changes: 14 additions & 0 deletions src/entities/gruposDeProdutos/interfaces/delete-many.interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { IDefaultErrorResponse } from 'src/entities/@shared/interfaces/error.interface'

export interface IDeleteManyParams {
/**
* IDs dos grupos de produtos
*/
idsGruposProdutos: number[]
}

export interface IDeleteManyResponse {
data: {
alertas?: IDefaultErrorResponse[]
}
}
6 changes: 6 additions & 0 deletions src/entities/gruposDeProdutos/interfaces/delete.interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export interface IDeleteParams {
/**
* ID do grupo de produto
*/
idGrupoProduto: number
}
24 changes: 24 additions & 0 deletions src/entities/gruposDeProdutos/interfaces/find.interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
export interface IFindParams {
/**
* ID do grupo de produto
*/
idGrupoProduto: number
}

interface GruposProdutosDadosDTO {
id?: number
nome: string
grupoProdutoPai?: {
id: number
nome?: string
}
}

interface GruposProdutosGrupoProdutoPaiDTO {
id: number
nome?: string
}

export interface IFindResponse {
data: GruposProdutosDadosDTO | GruposProdutosGrupoProdutoPaiDTO
}
29 changes: 29 additions & 0 deletions src/entities/gruposDeProdutos/interfaces/get.interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
export interface IGetParams {
/**
* O nome do grupo
*/
nome?: string
/**
* O nome do grupo pai
*/
nomePai?: string
/**
* N° da página da listagem
*/
pagina?: number
/**
* Quantidade de registros que devem ser exibidos por página
*/
limite?: number
}

export interface IGetResponse {
data: {
id?: number
nome: string
grupoProdutoPai?: {
id: number
nome?: string
}
}[]
}
13 changes: 13 additions & 0 deletions src/entities/gruposDeProdutos/interfaces/update.interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
export interface IUpdateParams {
/**
* ID do grupo de produto
*/
idGrupoProduto: number
}

export interface IUpdateBody {
nome: string
grupoProdutoPai: {
id: number
}
}
28 changes: 14 additions & 14 deletions src/entities/naturezasDeOperacoes/__tests__/index.spec.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { Chance } from 'chance'
import { NaturezasDeOperacoes } from '..'
import { InMemoryBlingRepository } from '../../../repositories/bling-in-memory.repository'
import { ICalculateItemTaxResponse } from '../interfaces/calculate-item-tax.interface'
import { IObtainTaxResponse } from '../interfaces/obtain-tax.interface'
import { IGetResponse } from '../interfaces/get.interface'
import calculateItemTaxResponse, {
calculateItemTaxRequestBody
} from './calculate-item-tax-response'
import obtainTaxResponse, {
obtainTaxRequestBody
} from './obtain-tax-response'
import getResponse from './get-response'

const chance = Chance()
@@ -44,24 +44,24 @@ describe('Naturezas de Operação entity', () => {
expect(typingResponseTest).toBe(getResponse)
})

it('should calculate item tax successfully', async () => {
it('should obtain tax successfully', async () => {
const spy = jest.spyOn(repository, 'store')
const idNaturezaOperacao = chance.natural()
repository.setResponse(calculateItemTaxResponse)
repository.setResponse(obtainTaxResponse)

const response = await entity.calculateItemTax({
const response = await entity.obtainTax({
idNaturezaOperacao,
...calculateItemTaxRequestBody
...obtainTaxRequestBody
})

expect(spy).toHaveBeenCalledWith({
endpoint: `naturezas-operacoes/${idNaturezaOperacao}/calcular-imposto-item`,
body: calculateItemTaxRequestBody
endpoint: `naturezas-operacoes/${idNaturezaOperacao}/obter-tributacao`,
body: obtainTaxRequestBody
})
expect(response).toBe(calculateItemTaxResponse)
expect(response).toBe(obtainTaxResponse)

const typingResponseTest: ICalculateItemTaxResponse =
calculateItemTaxResponse
expect(typingResponseTest).toBe(calculateItemTaxResponse)
const typingResponseTest: IObtainTaxResponse =
obtainTaxResponse
expect(typingResponseTest).toBe(obtainTaxResponse)
})
})
Original file line number Diff line number Diff line change
@@ -213,7 +213,7 @@ export default {
}
}

export const calculateItemTaxRequestBody = {
export const obtainTaxRequestBody = {
tipoNota: 1 as const,
uf: 'RS' as const,
municipio: {
24 changes: 12 additions & 12 deletions src/entities/naturezasDeOperacoes/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { Entity } from '../@shared/entity'
import {
ICalculateItemTaxBody,
ICalculateItemTaxParams,
ICalculateItemTaxResponse
} from './interfaces/calculate-item-tax.interface'
IObtainTaxBody,
IObtainTaxParams,
IObtainTaxResponse
} from './interfaces/obtain-tax.interface'
import { IGetParams, IGetResponse } from './interfaces/get.interface'

/**
@@ -35,21 +35,21 @@ export class NaturezasDeOperacoes extends Entity {
}

/**
* Calcula os impostos de um item.
* Obtém regras de tributação da natureza de operação.
*
* @param {ICalculateItemTaxParams & ICalculateItemTaxBody} params O conteúdo para o cálculo.
* @param {IObtainTaxParams & IObtainTaxBody} params O conteúdo para o cálculo.
*
* @returns {Promise<ICalculateItemTaxResponse>}
* @returns {Promise<IObtainTaxResponse>}
* @throws {BlingApiException|BlingInternalException}
*
* @see https://developer.bling.com.br/referencia#/Naturezas%20de%20Opera%C3%A7%C3%B5es/post_naturezas_operacoes__idNaturezaOperacao__calcular_imposto_item
* @see https://developer.bling.com.br/referencia#/Naturezas%20de%20Opera%C3%A7%C3%B5es/post_naturezas_operacoes__idNaturezaOperacao__obter_tributacao
*/
public async calculateItemTax(
params: ICalculateItemTaxParams & ICalculateItemTaxBody
): Promise<ICalculateItemTaxResponse> {
public async obtainTax(
params: IObtainTaxParams & IObtainTaxBody
): Promise<IObtainTaxResponse> {
const { idNaturezaOperacao, ...body } = params
return await this.repository.store({
endpoint: `naturezas-operacoes/${idNaturezaOperacao}/calcular-imposto-item`,
endpoint: `naturezas-operacoes/${idNaturezaOperacao}/obter-tributacao`,
body
})
}
Original file line number Diff line number Diff line change
@@ -6,14 +6,14 @@ import { IMotivoDesoneracaoICMS } from '../types/motivo-desoneracao-icms.type'
import { ITipoNota } from '../types/tipo-nota.type'
import { ITributacao } from '../types/tributacao.type'

export interface ICalculateItemTaxParams {
export interface IObtainTaxParams {
/**
* ID da natureza de operação
*/
idNaturezaOperacao: number
}

export interface ICalculateItemTaxBody {
export interface IObtainTaxBody {
tipoNota: ITipoNota
uf: IUF
municipio: { id: number }
@@ -32,7 +32,7 @@ export interface ICalculateItemTaxBody {
}
}

export interface ICalculateItemTaxResponse {
export interface IObtainTaxResponse {
data: {
faturada?: boolean
observacoes?: string
2 changes: 1 addition & 1 deletion src/entities/nfces/__tests__/create-response.ts
Original file line number Diff line number Diff line change
@@ -101,7 +101,7 @@ export const createRequestBody = {
},
volume: {
quantidade: 5,
especie: 'Volumes',
especie: 1 as const,
numero: '1',
pesoBruto: 0.5,
pesoLiquido: 0.35
67 changes: 49 additions & 18 deletions src/entities/nfces/__tests__/find-response.ts
Original file line number Diff line number Diff line change
@@ -3,26 +3,26 @@ export default {
id: 12345678,
tipo: 1 as const,
situacao: 1 as const,
numero: '6541',
dataEmissao: '2023-01-12 09:52:12',
dataOperacao: '2023-01-12 09:52:12',
numero: "6541",
dataEmissao: "2023-01-12 09:52:12",
dataOperacao: "2023-01-12 09:52:12",
contato: {
id: 12345678,
nome: 'Contato do Bling',
numeroDocumento: '30188025000121',
ie: '7364873393',
rg: '451838701',
telefone: '54 3771-7278',
email: 'pedrosilva@bling.com.br',
nome: "Contato do Bling",
numeroDocumento: "30188025000121",
ie: "7364873393",
rg: "451838701",
telefone: "54 3771-7278",
email: "pedrosilva@bling.com.br",
endereco: {
endereco: 'Olavo Bilac',
numero: '914',
complemento: 'Sala 101',
bairro: 'Imigrante',
cep: '95702-000',
municipio: 'Bento Gonçalves',
uf: 'RS' as const,
pais: ''
endereco: "Olavo Bilac",
numero: "914",
complemento: "Sala 101",
bairro: "Imigrante",
cep: "95702-000",
municipio: "Bento Gonçalves",
uf: "RS" as const,
pais: ""
}
},
naturezaOperacao: {
@@ -31,6 +31,37 @@ export default {
loja: {
id: 12345678
},
serie: '1'
serie: 1,
valorNota: 10.3,
chaveAcesso: "string",
xml: "string",
linkDanfe: "string",
linkPDF: "string",
numeroPedidoLoja: "string",
transporte: {
fretePorConta: 0 as const,
transportador: {
nome: "Transportador",
numeroDocumento: "30188025000121"
},
volumes: [
{
id: 12345678
}
],
etiqueta: {
nome: "Transportador",
endereco: "Olavo Bilac",
numero: "914",
complemento: "Sala 101",
municipio: "Bento Gonçalves",
uf: "RS" as const,
cep: "95702-000",
bairro: "Imigrante"
}
},
vendedor: {
id: 12345679
}
}
}
2 changes: 1 addition & 1 deletion src/entities/nfces/__tests__/update-response.ts
Original file line number Diff line number Diff line change
@@ -101,7 +101,7 @@ export const updateRequestBody = {
},
volume: {
quantidade: 5,
especie: 'Volumes',
especie: 1 as const,
numero: '1',
pesoBruto: 0.5,
pesoLiquido: 0.35
3 changes: 2 additions & 1 deletion src/entities/nfces/interfaces/create.interface.ts
Original file line number Diff line number Diff line change
@@ -7,6 +7,7 @@ import ITipoPessoa from 'src/entities/@shared/types/tipoPessoa.type'
import IUF from 'src/entities/@shared/types/uf.type'
import { IFinalidadeNfce } from '../types/finalidade.type'
import { ITipoNfce } from '../types/tipo.type'
import { IEspecie } from '../types/especie.type'

export interface ICreateBody {
tipo: ITipoNfce
@@ -94,7 +95,7 @@ export interface ICreateBody {
}
volume?: {
quantidade?: number
especie?: string
especie?: IEspecie
numero?: string
pesoBruto?: number
pesoLiquido?: number
30 changes: 29 additions & 1 deletion src/entities/nfces/interfaces/find.interface.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import IUF from 'src/entities/@shared/types/uf.type'
import { ISituacaoNfce } from '../types/situacao.type'
import { ITipoNfce } from '../types/tipo.type'
import IFretePorConta from 'src/entities/@shared/types/frete-por-conta.type'

export interface IFindParams {
/**
@@ -38,6 +39,33 @@ export interface IFindResponse {
}
naturezaOperacao?: { id: number }
loja?: { id: number }
serie: string
serie: number
valorNota?: number
chaveAcesso?: string
xml?: string
linkDanfe?: string
linkPDF?: string
numeroPedidoLoja?: string
transporte?: {
fretePorConta?: IFretePorConta
transportador?: {
nome: string
numeroDocumento?: string
}
volumes?: { id?: number }[]
etiqueta?: {
nome?: string
endereco?: string
numero?: string
complemento?: string
municipio?: string
uf?: IUF
cep?: string
bairro?: string
}
}
vendedor?: {
id: number
}
}
}
3 changes: 2 additions & 1 deletion src/entities/nfces/interfaces/update.interface.ts
Original file line number Diff line number Diff line change
@@ -7,6 +7,7 @@ import ITipoPessoa from 'src/entities/@shared/types/tipoPessoa.type'
import IUF from 'src/entities/@shared/types/uf.type'
import { IFinalidadeNfce } from '../types/finalidade.type'
import { ITipoNfce } from '../types/tipo.type'
import { IEspecie } from '../types/especie.type'

export interface IUpdateParams {
/**
@@ -101,7 +102,7 @@ export interface IUpdateBody {
}
volume?: {
quantidade?: number
especie?: string
especie?: IEspecie
numero?: string
pesoBruto?: number
pesoLiquido?: number
19 changes: 19 additions & 0 deletions src/entities/nfces/types/especie.type.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/**
* - `1`: Outro(s)
* - `2`: Volume(s)
* - `3`: Unidade(s)
* - `4`: Caixa(s)
* - `5`: Pacote(s)
* - `6`: Envelope(s)
* - `7`: Pallet(s)
* - `8`: Saco(s)
*/
export type IEspecie =
| 1
| 2
| 3
| 4
| 5
| 6
| 7
| 8
2 changes: 1 addition & 1 deletion src/entities/nfes/__tests__/create-response.ts
Original file line number Diff line number Diff line change
@@ -101,7 +101,7 @@ export const createRequestBody = {
},
volume: {
quantidade: 5,
especie: 'Volumes',
especie: 1 as const,
numero: '1',
pesoBruto: 0.5,
pesoLiquido: 0.35
67 changes: 36 additions & 31 deletions src/entities/nfes/__tests__/find-response.ts
Original file line number Diff line number Diff line change
@@ -3,26 +3,26 @@ export default {
id: 12345678,
tipo: 1 as const,
situacao: 1 as const,
numero: '6541',
dataEmissao: '2023-01-12 09:52:12',
dataOperacao: '2023-01-12 09:52:12',
numero: "6541",
dataEmissao: "2023-01-12 09:52:12",
dataOperacao: "2023-01-12 09:52:12",
contato: {
id: 12345678,
nome: 'Contato do Bling',
numeroDocumento: '30188025000121',
ie: '7364873393',
rg: '451838701',
telefone: '54 3771-7278',
email: 'pedrosilva@bling.com.br',
nome: "Contato do Bling",
numeroDocumento: "30188025000121",
ie: "7364873393",
rg: "451838701",
telefone: "54 3771-7278",
email: "pedrosilva@bling.com.br",
endereco: {
endereco: 'Olavo Bilac',
numero: '914',
complemento: 'Sala 101',
bairro: 'Imigrante',
cep: '95702-000',
municipio: 'Bento Gonçalves',
uf: 'RS' as const,
pais: ''
endereco: "Olavo Bilac",
numero: "914",
complemento: "Sala 101",
bairro: "Imigrante",
cep: "95702-000",
municipio: "Bento Gonçalves",
uf: "RS" as const,
pais: ""
}
},
naturezaOperacao: {
@@ -32,31 +32,36 @@ export default {
id: 12345678
},
serie: 1,
chaveAcesso: 'string',
xml: 'string',
linkDanfe: 'string',
linkPDF: 'string',
valorNota: 10.3,
chaveAcesso: "string",
xml: "string",
linkDanfe: "string",
linkPDF: "string",
numeroPedidoLoja: "string",
transporte: {
fretePorConta: 0 as const,
transportador: {
nome: 'Transportador',
numeroDocumento: '30188025000121'
nome: "Transportador",
numeroDocumento: "30188025000121"
},
volumes: [
{
id: 12345678
}
],
etiqueta: {
nome: 'Transportador',
endereco: 'Olavo Bilac',
numero: '914',
complemento: 'Sala 101',
municipio: 'Bento Gonçalves',
uf: 'RS' as const,
cep: '95702-000',
bairro: 'Imigrante'
nome: "Transportador",
endereco: "Olavo Bilac",
numero: "914",
complemento: "Sala 101",
municipio: "Bento Gonçalves",
uf: "RS" as const,
cep: "95702-000",
bairro: "Imigrante"
}
},
vendedor: {
id: 12345679
}
}
}
2 changes: 1 addition & 1 deletion src/entities/nfes/__tests__/update-response.ts
Original file line number Diff line number Diff line change
@@ -101,7 +101,7 @@ export const updateRequestBody = {
},
volume: {
quantidade: 5,
especie: 'Volumes',
especie: 1 as const,
numero: '1',
pesoBruto: 0.5,
pesoLiquido: 0.35
3 changes: 2 additions & 1 deletion src/entities/nfes/interfaces/create.interface.ts
Original file line number Diff line number Diff line change
@@ -7,6 +7,7 @@ import ITipoPessoa from 'src/entities/@shared/types/tipoPessoa.type'
import IUF from 'src/entities/@shared/types/uf.type'
import { IFinalidadeNfe } from '../types/finalidade.type'
import { ITipoNfe } from '../types/tipo.type'
import { IEspecie } from '../types/especie.type'

export interface ICreateBody {
tipo: ITipoNfe
@@ -94,7 +95,7 @@ export interface ICreateBody {
}
volume?: {
quantidade?: number
especie?: string
especie?: IEspecie
numero?: string
pesoBruto?: number
pesoLiquido?: number
4 changes: 4 additions & 0 deletions src/entities/nfes/interfaces/find.interface.ts
Original file line number Diff line number Diff line change
@@ -44,6 +44,7 @@ export interface IFindResponse {
xml?: string
linkDanfe?: string
linkPDF?: string
numeroPedidoLoja?: string
transporte?: {
fretePorConta?: IFretePorConta
transportador?: {
@@ -62,5 +63,8 @@ export interface IFindResponse {
bairro?: string
}
}
vendedor?: {
id: number
}
}
}
3 changes: 2 additions & 1 deletion src/entities/nfes/interfaces/update.interface.ts
Original file line number Diff line number Diff line change
@@ -7,6 +7,7 @@ import ITipoPessoa from 'src/entities/@shared/types/tipoPessoa.type'
import IUF from 'src/entities/@shared/types/uf.type'
import { IFinalidadeNfe } from '../types/finalidade.type'
import { ITipoNfe } from '../types/tipo.type'
import { IEspecie } from '../types/especie.type'

export interface IUpdateParams {
/**
@@ -101,7 +102,7 @@ export interface IUpdateBody {
}
volume?: {
quantidade?: number
especie?: string
especie?: IEspecie
numero?: string
pesoBruto?: number
pesoLiquido?: number
19 changes: 19 additions & 0 deletions src/entities/nfes/types/especie.type.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/**
* - `1`: Outro(s)
* - `2`: Volume(s)
* - `3`: Unidade(s)
* - `4`: Caixa(s)
* - `5`: Pacote(s)
* - `6`: Envelope(s)
* - `7`: Pallet(s)
* - `8`: Saco(s)
*/
export type IEspecie =
| 1
| 2
| 3
| 4
| 5
| 6
| 7
| 8
5 changes: 5 additions & 0 deletions src/entities/nfses/__tests__/cancel-response.ts
Original file line number Diff line number Diff line change
@@ -1 +1,6 @@
export default null

export const cancelRequest = {
codigoMotivo: 1 as const,
justificativa: "Cancelamento de NFS-e"
}
2 changes: 1 addition & 1 deletion src/entities/nfses/__tests__/get-response.ts
Original file line number Diff line number Diff line change
@@ -5,7 +5,7 @@ export default {
numero: '123',
numeroRPS: '32',
serie: '1',
situacao: 0,
situacao: 0 as const,
dataEmissao: '2023-01-12',
valor: 100,
contato: {
35 changes: 32 additions & 3 deletions src/entities/nfses/__tests__/index.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Chance } from 'chance'
import { Nfses } from '..'
import { InMemoryBlingRepository } from '../../../repositories/bling-in-memory.repository'
import cancelResponse from './cancel-response'
import cancelResponse, { cancelRequest } from './cancel-response'
import createResponse, { createRequestBody } from './create-response'
import deleteResponse from './delete-response'
import findResponse from './find-response'
@@ -11,6 +11,11 @@ import sendResponse from './send-response'
import updateConfigurationsResponse, {
updateConfigurationsRequestBody
} from './update-configurations-response'
import { IGetResponse } from '../interfaces/get.interface'
import { IFindResponse } from '../interfaces/find.interface'
import { IGetConfigurationsResponse } from '../interfaces/get-configurations.interface'
import { ICreateResponse } from '../interfaces/create.interface'
import { ISendResponse } from '../interfaces/send.interface'

const chance = Chance()

@@ -39,6 +44,9 @@ describe('NFS-es entity', () => {
id: String(idNotaServico)
})
expect(response).toBe(deleteResponse)

const typingResponseTest: null = deleteResponse
expect(typingResponseTest).toBe(deleteResponse)
})

it('should get successfully', async () => {
@@ -59,6 +67,9 @@ describe('NFS-es entity', () => {
}
})
expect(response).toBe(getResponse)

const typingResponseTest: IGetResponse = getResponse
expect(typingResponseTest).toBe(getResponse)
})

it('should find successfully', async () => {
@@ -73,6 +84,9 @@ describe('NFS-es entity', () => {
id: String(idNotaServico)
})
expect(response).toBe(findResponse)

const typingResponseTest: IFindResponse = findResponse
expect(typingResponseTest).toBe(findResponse)
})

it('should get configurations successfully', async () => {
@@ -85,6 +99,9 @@ describe('NFS-es entity', () => {
endpoint: 'nfse/configuracoes'
})
expect(response).toBe(getConfigurationsResponse)

const typingResponseTest: IGetConfigurationsResponse = getConfigurationsResponse
expect(typingResponseTest).toBe(getConfigurationsResponse)
})

it('should create successfully', async () => {
@@ -98,6 +115,9 @@ describe('NFS-es entity', () => {
body: createRequestBody
})
expect(response).toBe(createResponse)

const typingResponseTest: ICreateResponse = createResponse
expect(typingResponseTest).toBe(createResponse)
})

it('should send successfully', async () => {
@@ -112,20 +132,26 @@ describe('NFS-es entity', () => {
body: {}
})
expect(response).toBe(sendResponse)

const typingResponseTest: ISendResponse = sendResponse
expect(typingResponseTest).toBe(sendResponse)
})

it('should cancel successfully', async () => {
const spy = jest.spyOn(repository, 'store')
const idNotaServico = chance.natural()
repository.setResponse(cancelResponse)

const response = await entity.cancel({ idNotaServico })
const response = await entity.cancel({ idNotaServico, ...cancelRequest })

expect(spy).toHaveBeenCalledWith({
endpoint: `nfse/${idNotaServico}/cancelar`,
body: {}
body: cancelRequest
})
expect(response).toBe(cancelResponse)

const typingResponseTest: null = cancelResponse
expect(typingResponseTest).toBe(cancelResponse)
})

it('should update configurations successfully', async () => {
@@ -142,5 +168,8 @@ describe('NFS-es entity', () => {
body: updateConfigurationsRequestBody
})
expect(response).toBe(updateConfigurationsResponse)

const typingResponseTest: null = updateConfigurationsResponse
expect(typingResponseTest).toBe(updateConfigurationsResponse)
})
})
11 changes: 6 additions & 5 deletions src/entities/nfses/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Entity } from '../@shared/entity'
import { ISendResponse } from '../nfces/interfaces/send.interface'
import { ICancelParams } from './interfaces/cancel.interface'
import { ICancelBody, ICancelParams } from './interfaces/cancel.interface'
import { ICreateBody, ICreateResponse } from './interfaces/create.interface'
import { IDeleteParams } from './interfaces/delete.interface'
import { IFindParams, IFindResponse } from './interfaces/find.interface'
@@ -127,17 +127,18 @@ export class Nfses extends Entity {
/**
* Cancela uma nota de serviço.
*
* @param {ICancelParams} params Os parâmetros de envio.
* @param {ICancelParams & ICancelBody} params Os parâmetros de envio.
*
* @returns {Promise<null>}
* @throws {BlingApiException|BlingInternalException}
*
* @see https://developer.bling.com.br/referencia#/Notas%20Fiscais%20de%20Servi%C3%A7o%20Eletr%C3%B4nicas/post_nfse__idNotaServico__cancelar
*/
public async cancel(params: ICancelParams): Promise<null> {
public async cancel(params: ICancelParams & ICancelBody): Promise<null> {
const { idNotaServico, ...body } = params
return await this.repository.store({
endpoint: `nfse/${params.idNotaServico}/cancelar`,
body: {}
endpoint: `nfse/${idNotaServico}/cancelar`,
body
})
}

7 changes: 7 additions & 0 deletions src/entities/nfses/interfaces/cancel.interface.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
import { ICancelarCodigoMotivo } from "../types/cancelar-codigo-motivo.type"

export interface ICancelParams {
/**
* ID da nota de serviço
*/
idNotaServico: number
}

export interface ICancelBody {
codigoMotivo?: ICancelarCodigoMotivo
justificativa?: string
}
9 changes: 9 additions & 0 deletions src/entities/nfses/types/cancelar-codigo-motivo.type.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/**
* - `1`: Erro na Emissão
* - `2`: Serviço não Prestado
* - `9`: Outros
*/
export type ICancelarCodigoMotivo =
| 1
| 2
| 9
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
export default null

export const changeSituationRequest = {
idSituacao: 12345678,
quantidade: 1,
observacoes: "Observação",
considerarPerdas: true
}
30 changes: 30 additions & 0 deletions src/entities/ordensDeProducao/__tests__/create-response.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
export default {
data: {
id: 12345678
}
}

export const createRequestBody = {
dataPrevisaoInicio: "2021-01-01",
dataPrevisaoFinal: "2021-01-01",
dataInicio: "2021-01-01",
dataFim: "2021-01-01",
numero: 12345678,
responsavel: "Responsável pela ordem de produção",
deposito: {
idDestino: 12345678,
idOrigem: 12345678
},
situacao: {
id: 12345678
},
itens: [
{
produto: {
id: 12345678
},
quantidade: 1
}
],
observacoes: "Observações"
}
1 change: 1 addition & 0 deletions src/entities/ordensDeProducao/__tests__/delete-response.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default null
38 changes: 38 additions & 0 deletions src/entities/ordensDeProducao/__tests__/find-response.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
export default {
id: 12345678,
dataPrevisaoInicio: "2021-01-01",
dataPrevisaoFinal: "2021-01-01",
dataInicio: "2021-01-01",
dataFim: "2021-01-01",
numero: 12345678,
responsavel: "Responsável pela ordem de produção",
deposito: {
idDestino: 12345678,
idOrigem: 12345678
},
situacao: {
id: 12345678,
valor: 1,
nome: "Em aberto"
},
vendas: [
{
numero: 12345678,
contato: {
id: 12345678,
nome: "João da Silva"
}
}
],
itens: [
{
produto: {
id: 12345678,
nome: "Nome do produto",
codigo: "Código do produto"
},
quantidade: 1
}
],
observacoes: "Observações"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
export default {
data: [
{
id: 12345678,
itens: [
{
produto: {
id: 12345678,
nome: "Nome do produto",
codigo: "Código do produto"
},
quantidade: 1
}
],
deposito: {
idDestino: 12345678,
idOrigem: 12345678
}
}
]
}
22 changes: 22 additions & 0 deletions src/entities/ordensDeProducao/__tests__/get-response.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
export default {
data: [
{
id: 12345678,
dataPrevisaoInicio: "2021-01-01",
dataPrevisaoFinal: "2021-01-01",
dataInicio: "2021-01-01",
dataFim: "2021-01-01",
numero: 12345678,
responsavel: "Responsável pela ordem de produção",
deposito: {
idDestino: 12345678,
idOrigem: 12345678
},
situacao: {
id: 12345678,
valor: 1,
nome: "Em aberto"
}
}
]
}
160 changes: 160 additions & 0 deletions src/entities/ordensDeProducao/__tests__/index.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
import { Chance } from 'chance'
import { OrdensDeProducao } from '..'
import { InMemoryBlingRepository } from '../../../repositories/bling-in-memory.repository'
import { ICreateResponse } from '../interfaces/create.interface'
import { IFindResponse } from '../interfaces/find.interface'
import { IGetResponse } from '../interfaces/get.interface'
import changeSituationResponse, {
changeSituationRequest
} from './change-situation-response'
import createResponse, { createRequestBody } from './create-response'
import deleteResponse from './delete-response'
import findResponse from './find-response'
import getResponse from './get-response'
import updateResponse, { updateRequestBody } from './update-response'
import generateOverDemandResponse from './generate-over-demand-response'
import { IGenerateOverDemandResponse } from '../interfaces/generate-over-demand.interface'

const chance = Chance()

describe('OrdensDeProducao entity', () => {
let repository: InMemoryBlingRepository
let entity: OrdensDeProducao

beforeEach(() => {
repository = new InMemoryBlingRepository()
entity = new OrdensDeProducao(repository)
})

afterEach(() => {
jest.restoreAllMocks()
})

it('should delete successfully', async () => {
const idOrdemProducao = chance.natural()
const spy = jest.spyOn(repository, 'destroy')
repository.setResponse(deleteResponse)

const response = await entity.delete({ idOrdemProducao })

expect(spy).toHaveBeenCalledWith({
endpoint: 'ordens-producao',
id: String(idOrdemProducao)
})
expect(response).toBe(deleteResponse)

const typingResponseTest: null = deleteResponse
expect(typingResponseTest).toBe(deleteResponse)
})

it('should get successfully', async () => {
const spy = jest.spyOn(repository, 'index')
repository.setResponse(getResponse)

const response = await entity.get()

expect(spy).toHaveBeenCalledWith({
endpoint: 'ordens-producao',
params: {
limite: undefined,
pagina: undefined,
idsSituacoes: undefined
}
})
expect(response).toBe(getResponse)

const typingResponseTest: IGetResponse = getResponse
expect(typingResponseTest).toBe(getResponse)
})

it('should find successfully', async () => {
const spy = jest.spyOn(repository, 'show')
const idOrdemProducao = chance.natural()
repository.setResponse(findResponse)

const response = await entity.find({ idOrdemProducao })

expect(spy).toHaveBeenCalledWith({
endpoint: 'ordens-producao',
id: String(idOrdemProducao)
})
expect(response).toBe(findResponse)

const typingResponseTest: IFindResponse = findResponse
expect(typingResponseTest).toBe(findResponse)
})

it('should create successfully', async () => {
const spy = jest.spyOn(repository, 'store')
repository.setResponse(createResponse)

const response = await entity.create(createRequestBody)

expect(spy).toHaveBeenCalledWith({
endpoint: 'ordens-producao',
body: createRequestBody
})
expect(response).toBe(createResponse)

const typingResponseTest: ICreateResponse = createResponse
expect(typingResponseTest).toBe(createResponse)
})

it('should generate over demand successfully', async () => {
const spy = jest.spyOn(repository, 'store')
repository.setResponse(generateOverDemandResponse)

const response = await entity.generateOverDemand()

expect(spy).toHaveBeenCalledWith({
endpoint: 'ordens-producao/gerar-sob-demanda',
body: {}
})
expect(response).toBe(generateOverDemandResponse)

const typingResponseTest: IGenerateOverDemandResponse = generateOverDemandResponse
expect(typingResponseTest).toBe(generateOverDemandResponse)
})

it('should update successfully', async () => {
const spy = jest.spyOn(repository, 'replace')
const idOrdemProducao = chance.natural()
repository.setResponse(updateResponse)

const response = await entity.update({
idOrdemProducao,
...updateRequestBody
})

expect(spy).toHaveBeenCalledWith({
endpoint: 'ordens-producao',
id: String(idOrdemProducao),
body: updateRequestBody
})
expect(response).toBe(updateResponse)

const typingResponseTest: null = updateResponse
expect(typingResponseTest).toBe(updateResponse)
})

it('should change situation successfully', async () => {
const spy = jest.spyOn(repository, 'update')
const idOrdemProducao = chance.natural()
repository.setResponse(changeSituationResponse)

const response = await entity.changeSituation({
idOrdemProducao,
...changeSituationRequest
})

expect(spy).toHaveBeenCalledWith({
endpoint: 'ordens-producao',
id: `${idOrdemProducao}/situacoes`,
body: changeSituationRequest
})
expect(response).toBe(changeSituationResponse)

const typingResponseTest: null = changeSituationResponse
expect(typingResponseTest).toBe(changeSituationResponse)
})
})
26 changes: 26 additions & 0 deletions src/entities/ordensDeProducao/__tests__/update-response.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
export default null

export const updateRequestBody = {
dataPrevisaoInicio: "2021-01-01",
dataPrevisaoFinal: "2021-01-01",
dataInicio: "2021-01-01",
dataFim: "2021-01-01",
numero: 12345678,
responsavel: "Responsável pela ordem de produção",
deposito: {
idDestino: 12345678,
idOrigem: 12345678
},
situacao: {
id: 12345678
},
itens: [
{
produto: {
id: 12345678
},
quantidade: 1
}
],
observacoes: "Observações"
}
144 changes: 144 additions & 0 deletions src/entities/ordensDeProducao/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
import { Entity } from '../@shared/entity'
import { IChangeSituationBody, IChangeSituationParams } from './interfaces/change-situation.interface'
import { ICreateBody, ICreateResponse } from './interfaces/create.interface'
import { IDeleteParams } from './interfaces/delete.interface'
import { IFindParams, IFindResponse } from './interfaces/find.interface'
import { IGenerateOverDemandResponse } from './interfaces/generate-over-demand.interface'
import { IGetParams, IGetResponse } from './interfaces/get.interface'
import { IUpdateBody, IUpdateParams } from './interfaces/update.interface'

/**
* Entidade para interação com Ordens de Produção.
*
* @see https://developer.bling.com.br/referencia#/Ordens%20de%20Produ%C3%A7%C3%A3o
*/
export class OrdensDeProducao extends Entity {
/**
* Remove uma ordem de produção.
*
* @param {IDeleteParams} params Parâmetros da remoção.
*
* @returns {Promise<null>} Não há retorno.
* @throws {BlingApiException|BlingInternalException}
*
* @see https://developer.bling.com.br/referencia#/Ordens%20de%20Produ%C3%A7%C3%A3o/delete_ordens_producao__idOrdemProducao_
*/
public async delete(params: IDeleteParams): Promise<null> {
return await this.repository.destroy({
endpoint: 'ordens-producao',
id: String(params.idOrdemProducao)
})
}

/**
* Obtém ordens de produção.
*
* @param {IGetParams} params Parâmetros da busca.
*
* @returns {Promise<IGetResponse>}
* @throws {BlingApiException|BlingInternalException}
*
* @see https://developer.bling.com.br/referencia#/Ordens%20de%20Produ%C3%A7%C3%A3o/get_ordens_producao
*/
public async get(params?: IGetParams): Promise<IGetResponse> {
return await this.repository.index({
endpoint: 'ordens-producao',
params: {
pagina: params?.pagina,
limite: params?.limite,
idsSituacoes: params?.idsSituacoes
}
})
}

/**
* Obtém uma ordem de produção.
*
* @param {IFindParams} params Parâmetros da busca.
*
* @returns {Promise<IFindResponse>}
* @throws {BlingApiException|BlingInternalException}
*
* @see https://developer.bling.com.br/referencia#/Ordens%20de%20Produ%C3%A7%C3%A3o/get_ordens_producao__idOrdemProducao_
*/
public async find(params: IFindParams): Promise<IFindResponse> {
return await this.repository.show({
endpoint: 'ordens-producao',
id: String(params.idOrdemProducao)
})
}

/**
* Cria uma ordem de produção.
*
* @param {ICreateBody} body O conteúdo para a criação.
*
* @returns {Promise<ICreateResponse>}
* @throws {BlingApiException|BlingInternalException}
*
* @see https://developer.bling.com.br/referencia#/Ordens%20de%20Produ%C3%A7%C3%A3o/post_ordens_producao
*/
public async create(body: ICreateBody): Promise<ICreateResponse> {
return await this.repository.store({
endpoint: 'ordens-producao',
body
})
}

/**
* Gera ordens de produção sob demanda.
*
* @returns {Promise<IGenerateOverDemandResponse>}
* @throws {BlingApiException|BlingInternalException}
*
* @see https://developer.bling.com.br/referencia#/Ordens%20de%20Produ%C3%A7%C3%A3o/post_ordens_producao_gerar_sob_demanda
*/
public async generateOverDemand(): Promise<IGenerateOverDemandResponse> {
return await this.repository.store({
endpoint: 'ordens-producao/gerar-sob-demanda',
body: {}
})
}

/**
* Altera uma ordem de produção.
*
* @param {IUpdateParams & IUpdateBody} params Os parâmetros da atualização.
*
* @return {Promise<null>}
* @throws {BlingApiException|BlingInternalException}
*
* @see https://developer.bling.com.br/referencia#/Ordens%20de%20Produ%C3%A7%C3%A3o/put_ordens_producao__idOrdemProducao_
*/
public async update(
params: IUpdateParams & IUpdateBody
): Promise<null> {
const { idOrdemProducao, ...body } = params

return await this.repository.replace({
endpoint: 'ordens-producao',
id: String(idOrdemProducao),
body
})
}
/**
* Altera a situação de uma ordem de produção.
*
* @param {IChangeSituationParams & IChangeSituationBody} params Parâmetros da alteração.
*
* @returns {Promise<null>}
* @throws {BlingApiException|BlingInternalException}
*
* @see https://developer.bling.com.br/referencia#/Produtos/.idOrdemProducao__situacoes
*/
public async changeSituation(
params: IChangeSituationParams & IChangeSituationBody
): Promise<null> {
const { idOrdemProducao, ...body } = params
return await this.repository.update({
endpoint: 'ordens-producao',
id: `${idOrdemProducao}/situacoes`,
body
})
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
export interface IChangeSituationParams {
/**
* ID da ordem de produção
*/
idOrdemProducao: number
}

export interface IChangeSituationBody {
idSituacao: number
quantidade?: number
observacoes?: string
considerarPerdas?: boolean
}
29 changes: 29 additions & 0 deletions src/entities/ordensDeProducao/interfaces/create.interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
export interface ICreateBody {
dataPrevisaoInicio?: string
dataPrevisaoFinal?: string
dataInicio?: string
dataFim?: string
numero: number
responsavel?: string
deposito: {
idDestino?: number
idOrigem?: number
}
situacao: {
id: number
}
itens?: {
produto?: {
id: number
}
quantidade?: number
}[]

observacoes?: string
}

export interface ICreateResponse {
data?: {
id: number
}
}
6 changes: 6 additions & 0 deletions src/entities/ordensDeProducao/interfaces/delete.interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export interface IDeleteParams {
/**
* ID da ordem de produção
*/
idOrdemProducao: number
}
41 changes: 41 additions & 0 deletions src/entities/ordensDeProducao/interfaces/find.interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
export interface IFindParams {
/**
* ID da ordem de produção
*/
idOrdemProducao: number
}

export interface IFindResponse {
id: number
dataPrevisaoInicio?: string
dataPrevisaoFinal?: string
dataInicio?: string
dataFim?: string
numero: number
responsavel?: string
deposito: {
idDestino?: number
idOrigem?: number
}
situacao: {
id: number
valor: number
nome: string
}
vendas?: {
numero?: number
contato?: {
id?: number
nome?: string
}
}[]
itens?: {
produto?: {
id: number
nome?: string
codigo?: string
}
quantidade?: number
}[]
observacoes?: string
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
export interface IGenerateOverDemandResponse {
data?: {
id?: number
itens?: {
produto?: {
id: number
nome?: string
codigo?: string
}
quantidade?: number
}[]

deposito?: {
idDestino?: number
idOrigem?: number
}
}[]
}
35 changes: 35 additions & 0 deletions src/entities/ordensDeProducao/interfaces/get.interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
export interface IGetParams {
/**
* N° da página da listagem
*/
pagina?: number
/**
* Quantidade de registros que devem ser exibidos por página
*/
limite?: number
/**
* IDs das situações
*/
idsSituacoes?: number[]
}

export interface IGetResponse {
data: {
id: number
dataPrevisaoInicio?: string
dataPrevisaoFinal?: string
dataInicio?: string
dataFim?: string
numero: number
responsavel?: string
deposito: {
idDestino?: number
idOrigem?: number
}
situacao: {
id: number
valor: number
nome: string
}
}[]
}
30 changes: 30 additions & 0 deletions src/entities/ordensDeProducao/interfaces/update.interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
export interface IUpdateParams {
/**
* ID da ordem de produção
*/
idOrdemProducao: number
}

export interface IUpdateBody {
dataPrevisaoInicio?: string
dataPrevisaoFinal?: string
dataInicio?: string
dataFim?: string
numero: number
responsavel?: string
deposito: {
idDestino?: number
idOrigem?: number
}
situacao: {
id: number
}
itens?: {
produto?: {
id: number
}
quantidade?: number
}[]

observacoes?: string
}
6 changes: 4 additions & 2 deletions src/entities/pedidosVendas/index.ts
Original file line number Diff line number Diff line change
@@ -91,10 +91,12 @@ export class PedidosVendas extends Entity {
dataInicial: this.prepareStringOrDateParam(params?.dataInicial),
dataFinal: this.prepareStringOrDateParam(params?.dataFinal),
dataAlteracaoInicial: this.prepareStringOrDateParam(
params?.dataAlteracaoInicial
params?.dataAlteracaoInicial,
true
),
dataAlteracaoFinal: this.prepareStringOrDateParam(
params?.dataAlteracaoFinal
params?.dataAlteracaoFinal,
true
),
dataPrevistaInicial: this.prepareStringOrDateParam(
params?.dataPrevistaInicial
35 changes: 27 additions & 8 deletions src/entities/produtos/__tests__/find-response.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
export default {
data: {
id: 123456789,
idProdutoPai: 123456789,
nome: 'Produto 1',
codigo: 'CODE_123',
preco: 1,
tipo: 'P' as const,
situacao: 'A' as const,
formato: 'S' as const,
descricaoCurta: 'Descrição curta',
imagemURL:
'https://www.bling.com.br/imagens/imagens-produtos/123456789.jpg',
imagemURL: 'https://www.bling.com.br/imagens/imagens-produtos/123456789.jpg',
dataValidade: '2020-01-01',
unidade: 'UN',
pesoLiquido: 1,
@@ -34,7 +32,18 @@ export default {
minimo: 1,
maximo: 100,
crossdocking: 1,
localizacao: '14A'
localizacao: '14A',
saldoVirtualTotal: 1
},
fornecedor: {
id: 123456789,
contato: {
id: 123456789,
nome: 'Fornecedor padrão'
},
codigo: 'SKU-FORNECEDOR',
precoCusto: 55.55,
precoCompra: 55.55
},
actionEstoque: undefined,
dimensoes: {
@@ -125,16 +134,14 @@ export default {
variacoes: [
{
id: 123456789,
idProdutoPai: 123456789,
nome: 'Produto 1',
codigo: 'CODE_123',
preco: 1,
tipo: 'P' as const,
situacao: 'A' as const,
formato: 'S' as const,
descricaoCurta: 'Descrição curta',
imagemURL:
'https://www.bling.com.br/imagens/imagens-produtos/123456789.jpg',
imagemURL: 'https://www.bling.com.br/imagens/imagens-produtos/123456789.jpg',
dataValidade: '2020-01-01',
unidade: 'UN',
pesoLiquido: 1,
@@ -158,7 +165,18 @@ export default {
minimo: 1,
maximo: 100,
crossdocking: 1,
localizacao: '14A'
localizacao: '14A',
saldoVirtualTotal: 1
},
fornecedor: {
id: 123456789,
contato: {
id: 123456789,
nome: 'Fornecedor padrão'
},
codigo: 'SKU-FORNECEDOR',
precoCusto: 55.55,
precoCompra: 55.55
},
actionEstoque: undefined,
dimensoes: {
@@ -250,6 +268,7 @@ export default {
nome: 'Tamanho:G;Cor:Verde',
ordem: 1,
produtoPai: {
id: 12345678,
cloneInfo: true
}
}
19 changes: 11 additions & 8 deletions src/entities/produtos/__tests__/get-response.ts
Original file line number Diff line number Diff line change
@@ -3,15 +3,18 @@ export default {
{
id: 123456789,
idProdutoPai: 123456789,
nome: 'Produto 1',
codigo: 'CODE_123',
nome: "Produto 1",
codigo: "CODE_123",
preco: 1,
tipo: 'P' as const,
situacao: 'A' as const,
formato: 'S' as const,
descricaoCurta: 'Descrição curta',
imagemURL:
'https://www.bling.com.br/imagens/imagens-produtos/123456789.jpg'
precoCusto: 1,
estoque: {
saldoVirtualTotal: 1
},
tipo: "P" as const,
situacao: "A" as const,
formato: "S" as const,
descricaoCurta: "Descrição curta",
imagemURL: "https://www.bling.com.br/imagens/imagens-produtos/123456789.jpg"
}
]
}
3 changes: 2 additions & 1 deletion src/entities/produtos/__tests__/index.spec.ts
Original file line number Diff line number Diff line change
@@ -95,7 +95,8 @@ describe('Produtos entity', () => {
idLoja: undefined,
codigo: undefined,
nome: undefined,
idsProdutos: undefined
idsProdutos: undefined,
codigos: undefined
}
})
expect(response).toBe(getResponse)
15 changes: 10 additions & 5 deletions src/entities/produtos/index.ts
Original file line number Diff line number Diff line change
@@ -84,22 +84,27 @@ export class Produtos extends Entity {
tipo: params?.tipo,
idComponente: params?.idComponente,
dataInclusaoInicial: this.prepareStringOrDateParam(
params?.dataInclusaoInicial
params?.dataInclusaoInicial,
true
),
dataInclusaoFinal: this.prepareStringOrDateParam(
params?.dataInclusaoFinal
params?.dataInclusaoFinal,
true
),
dataAlteracaoInicial: this.prepareStringOrDateParam(
params?.dataAlteracaoInicial
params?.dataAlteracaoInicial,
true
),
dataAlteracaoFinal: this.prepareStringOrDateParam(
params?.dataAlteracaoFinal
params?.dataAlteracaoFinal,
true
),
idCategoria: params?.idCategoria,
idLoja: params?.idLoja,
codigo: params?.codigo,
nome: params?.nome,
idsProdutos: params?.idsProdutos
idsProdutos: params?.idsProdutos,
codigos: params?.codigos
}
})
}
28 changes: 26 additions & 2 deletions src/entities/produtos/interfaces/find.interface.ts
Original file line number Diff line number Diff line change
@@ -18,7 +18,6 @@ export interface IFindParams {
export interface IFindResponse {
data: {
id?: number
idProdutoPai?: number
nome: string
codigo?: string
preco?: number
@@ -48,6 +47,17 @@ export interface IFindResponse {
maximo?: number
crossdocking?: number
localizacao?: string
saldoVirtualTotal?: number
}
fornecedor?: {
id?: number
contato?: {
id?: number
nome?: string
}
codigo?: string
precoCusto?: number
precoCompra?: number
}
actionEstoque?: IActionEstoque
dimensoes?: {
@@ -144,6 +154,17 @@ export interface IFindResponse {
maximo?: number
crossdocking?: number
localizacao?: string
saldoVirtualTotal?: number
}
fornecedor?: {
id?: number
contato?: {
id?: number
nome?: string
}
codigo?: string
precoCusto?: number
precoCompra?: number
}
actionEstoque?: IActionEstoque
dimensoes?: {
@@ -203,7 +224,10 @@ export interface IFindResponse {
variacao: {
nome: string
ordem: number
produtoPai: { cloneInfo: boolean }
produtoPai: {
id?: number
cloneInfo: boolean
}
}
}[]
}
8 changes: 8 additions & 0 deletions src/entities/produtos/interfaces/get.interface.ts
Original file line number Diff line number Diff line change
@@ -61,6 +61,10 @@ export interface IGetParams {
* IDs dos produtos
*/
idsProdutos?: number[]
/**
* Códigos (SKU) dos produtos
*/
codigos?: string[]
}

export interface IGetResponse {
@@ -70,6 +74,10 @@ export interface IGetResponse {
nome: string
codigo?: string
preco?: number
precoCusto?: number
estoque?: {
saldoVirtualTotal?: number
}
tipo: ITipo
situacao: ISituacao
formato: IFormato
Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@ export interface IUpdateBody {
precoCompra?: number
padrao?: boolean
produto: { id: number }
fornecedor: { id: number }
fornecedor?: { id?: number }
garantia?: number
}

70 changes: 60 additions & 10 deletions src/entities/produtosVariacoes/__tests__/find-response.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
export default {
data: {
id: 123456789,
idProdutoPai: 123456789,
nome: 'Produto 1',
codigo: 'CODE_123',
preco: 1,
tipo: 'P' as const,
situacao: 'A' as const,
formato: 'S' as const,
descricaoCurta: 'Descrição curta',
imagemURL: 'https://www.bling.com.br/imagens/imagens-produtos/123456789.jpg',
dataValidade: '2020-01-01',
unidade: 'UN',
pesoLiquido: 1,
@@ -24,24 +24,36 @@ export default {
descricaoComplementar: 'Descrição complementar',
linkExterno: 'https://www.google.com',
observacoes: 'Observações',
descricaoEmbalagemDiscreta: 'Produto teste',
categoria: {
id: 123456789
},
estoque: {
minimo: 1,
maximo: 100,
crossdocking: 1,
localizacao: '14A'
localizacao: '14A',
saldoVirtualTotal: 1
},
actionEstoque: '',
fornecedor: {
id: 123456789,
contato: {
id: 123456789,
nome: 'Fornecedor padrão'
},
codigo: 'SKU-FORNECEDOR',
precoCusto: 55.55,
precoCompra: 55.55
},
actionEstoque: undefined,
dimensoes: {
largura: 1,
altura: 1,
profundidade: 1,
unidadeMedida: 1
},
tributacao: {
origem: 0,
origem: 0 as const,
nFCI: '',
ncm: '',
cest: '',
@@ -80,6 +92,19 @@ export default {
{
link: 'https://shutterstock.com/lalala123'
}
],
internas: [
{
linkMiniatura: 'https://www.bling.com.br/imagens/miniatura.jpg',
validade: '2020-01-01 00:00:00',
ordem: 1,
anexo: {
id: 12345678
},
anexoVinculo: {
id: 12345678
}
}
]
}
},
@@ -101,22 +126,22 @@ export default {
camposCustomizados: [
{
idCampoCustomizado: 123456789,
idVinculo: 'Utilize para atualizar o valor existente. Ex: 123456789',
idVinculo: 123456789,
valor: '256GB',
item: 'Opção A'
}
],
variacoes: [
{
id: 123456789,
idProdutoPai: 123456789,
nome: 'Produto 1',
codigo: 'CODE_123',
preco: 1,
tipo: 'P' as const,
situacao: 'A' as const,
formato: 'S' as const,
descricaoCurta: 'Descrição curta',
imagemURL: 'https://www.bling.com.br/imagens/imagens-produtos/123456789.jpg',
dataValidade: '2020-01-01',
unidade: 'UN',
pesoLiquido: 1,
@@ -132,16 +157,28 @@ export default {
descricaoComplementar: 'Descrição complementar',
linkExterno: 'https://www.google.com',
observacoes: 'Observações',
descricaoEmbalagemDiscreta: 'Produto teste',
categoria: {
id: 123456789
},
estoque: {
minimo: 1,
maximo: 100,
crossdocking: 1,
localizacao: '14A'
localizacao: '14A',
saldoVirtualTotal: 1
},
fornecedor: {
id: 123456789,
contato: {
id: 123456789,
nome: 'Fornecedor padrão'
},
codigo: 'SKU-FORNECEDOR',
precoCusto: 55.55,
precoCompra: 55.55
},
actionEstoque: '',
actionEstoque: undefined,
dimensoes: {
largura: 1,
altura: 1,
@@ -188,6 +225,19 @@ export default {
{
link: 'https://shutterstock.com/lalala123'
}
],
internas: [
{
linkMiniatura: 'https://www.bling.com.br/imagens/miniatura.jpg',
validade: '2020-01-01 00:00:00',
ordem: 1,
anexo: {
id: 12345678
},
anexoVinculo: {
id: 12345678
}
}
]
}
},
@@ -209,8 +259,7 @@ export default {
camposCustomizados: [
{
idCampoCustomizado: 123456789,
idVinculo:
'Utilize para atualizar o valor existente. Ex: 123456789',
idVinculo: 123456789,
valor: '256GB',
item: 'Opção A'
}
@@ -219,6 +268,7 @@ export default {
nome: 'Tamanho:G;Cor:Verde',
ordem: 1,
produtoPai: {
id: 12345678,
cloneInfo: true
}
}
40 changes: 37 additions & 3 deletions src/entities/produtosVariacoes/interfaces/find.interface.ts
Original file line number Diff line number Diff line change
@@ -18,14 +18,14 @@ export interface IFindParams {
export interface IFindResponse {
data: {
id?: number
idProdutoPai?: number
nome: string
codigo?: string
preco?: number
tipo: ITipo
situacao: ISituacao
formato: IFormato
descricaoCurta?: string
imagemURL?: string
dataValidade?: string
unidade?: string
pesoLiquido?: number
@@ -47,6 +47,17 @@ export interface IFindResponse {
maximo?: number
crossdocking?: number
localizacao?: string
saldoVirtualTotal?: number
}
fornecedor?: {
id?: number
contato?: {
id?: number
nome?: string
}
codigo?: string
precoCusto?: number
precoCompra?: number
}
actionEstoque?: IActionEstoque
dimensoes?: {
@@ -86,7 +97,16 @@ export interface IFindResponse {
}
midia?: {
video: { url: string }
imagens: { externas: { link: string }[] }
imagens: {
externas?: { link: string }[]
internas?: {
linkMiniatura: string
validade: string
ordem: number
anexo: { id: number }
anexoVinculo: { id: number }
}[]
}
}
linhaProduto?: { id: number }
estrutura?: {
@@ -134,6 +154,17 @@ export interface IFindResponse {
maximo?: number
crossdocking?: number
localizacao?: string
saldoVirtualTotal?: number
}
fornecedor?: {
id?: number
contato?: {
id?: number
nome?: string
}
codigo?: string
precoCusto?: number
precoCompra?: number
}
actionEstoque?: IActionEstoque
dimensoes?: {
@@ -193,7 +224,10 @@ export interface IFindResponse {
variacao: {
nome: string
ordem: number
produtoPai: { cloneInfo: boolean }
produtoPai: {
id?: number
cloneInfo: boolean
}
}
}[]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export default null

export const changeSituationRequest = {
situacao: 'A' as const
}
69 changes: 69 additions & 0 deletions src/entities/propostasComerciais/__tests__/create-response.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
export default {
data: {
id: 12345678
}
}

export const createRequestBody = {
data: "2024-04-29",
situacao: "Concluído",
numero: 13,
contato: {
id: 12345678
},
loja: {
id: 12345678
},
desconto: 10,
outrasDespesas: 11,
garantia: 3,
dataProximoContato: "2024-05-01",
observacoes: "Observações da proposta comercial",
observacaoInterna: "Observações internas da proposta comercial",
totalOutrosItens: 1,
aosCuidadosDe: "Nome do Contato",
introducao: "Introdução da proposta comercial",
prazoEntrega: "Prazo de entrega proposta comercial",
itens: [
{
produto: {
id: 12345678,
descricao: "Bolo"
},
codigo: "BLG-5",
unidade: "UN",
quantidade: 1.1,
desconto: 1.2,
valor: 3.1,
descricaoDetalhada: "Descrição detalhada do produto"
}
],
parcelas: [
{
numeroDias: 10,
dataVencimento: "2024-04-29",
valor: 10.55,
observacoes: "Observacao da forma de pagamento",
formaPagamento: [
{
id: 12345678
}
]
}
],
vendedor: {
id: 12345678
},
transporte: {
freteModalidade: 0 as const,
frete: 2.34,
quantidadeVolumes: 2.33,
prazoEntrega: 2,
pesoBruto: 2.4,
contato: {
id: 12345678,
nome: "Nome do transportador"
},
volumes: {}
}
}
Loading

0 comments on commit 1dc80b9

Please sign in to comment.