diff --git a/README.md b/README.md index 6bc190c..879415b 100644 --- a/README.md +++ b/README.md @@ -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 `v301` da API ([veja o registro de alterações](https://developer.bling.com.br/changelogs#2024-05-22)). +Atualizado com a versão `v303` da API ([veja o registro de alterações](https://developer.bling.com.br/changelogs#2024-06-19)). **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, @@ -74,7 +74,7 @@ Quase todas as entidades do Bling atualmente são permitidas para interação. S - [x] Notas Fiscais de Serviço Eletrônicas (`.nfses`) - [x] Notas Fiscais Eletrônicas (`.nfes`) - [x] Notificações (`.notificacoes`) -- [ ] Ordens de Produção (`.ordensDeProducao`) +- [x] Ordens de Produção (`.ordensDeProducao`) - [x] Pedidos - Compras (`.pedidosCompras`) - [x] Pedidos - Vendas (`.pedidosVendas`) - [x] Produtos (`.produtos`) diff --git a/src/bling.spec.ts b/src/bling.spec.ts index 0f37189..0467b63 100644 --- a/src/bling.spec.ts +++ b/src/bling.spec.ts @@ -41,6 +41,7 @@ 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' const chance = Chance() @@ -252,4 +253,10 @@ describe('Bling main module', () => { CanaisDeVenda ) }) + + it('should retrieve ordens de produção entity', () => { + expect(createBling(chance.word()).ordensDeProducao).toBeInstanceOf( + OrdensDeProducao + ) + }) }) diff --git a/src/bling.ts b/src/bling.ts index cf441cc..a92bd75 100644 --- a/src/bling.ts +++ b/src/bling.ts @@ -28,6 +28,7 @@ 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' @@ -432,4 +433,13 @@ 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) + } } diff --git a/src/entities/empresas/__tests__/index.spec.ts b/src/entities/empresas/__tests__/index.spec.ts index f1f9b85..2856c08 100644 --- a/src/entities/empresas/__tests__/index.spec.ts +++ b/src/entities/empresas/__tests__/index.spec.ts @@ -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) }) }) diff --git a/src/entities/empresas/__tests__/me-response.ts b/src/entities/empresas/__tests__/me-response.ts index 6eb0d96..ad2b12c 100644 --- a/src/entities/empresas/__tests__/me-response.ts +++ b/src/entities/empresas/__tests__/me-response.ts @@ -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" } } diff --git a/src/entities/empresas/interfaces/me.interface.ts b/src/entities/empresas/interfaces/me.interface.ts index 368d5f8..829dd34 100644 --- a/src/entities/empresas/interfaces/me.interface.ts +++ b/src/entities/empresas/interfaces/me.interface.ts @@ -1,7 +1,9 @@ export interface IMeResponse { data: { + id: string nome: string cnpj: string email: string + dataContrato: string } } diff --git a/src/entities/ordensDeProducao/__tests__/change-situation-response.ts b/src/entities/ordensDeProducao/__tests__/change-situation-response.ts new file mode 100644 index 0000000..cda1c9b --- /dev/null +++ b/src/entities/ordensDeProducao/__tests__/change-situation-response.ts @@ -0,0 +1,8 @@ +export default null + +export const changeSituationRequest = { + idSituacao: 12345678, + quantidade: 1, + observacoes: "Observação", + considerarPerdas: true +} diff --git a/src/entities/ordensDeProducao/__tests__/create-response.ts b/src/entities/ordensDeProducao/__tests__/create-response.ts new file mode 100644 index 0000000..bf336b8 --- /dev/null +++ b/src/entities/ordensDeProducao/__tests__/create-response.ts @@ -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" +} diff --git a/src/entities/ordensDeProducao/__tests__/delete-response.ts b/src/entities/ordensDeProducao/__tests__/delete-response.ts new file mode 100644 index 0000000..7b85954 --- /dev/null +++ b/src/entities/ordensDeProducao/__tests__/delete-response.ts @@ -0,0 +1 @@ +export default null diff --git a/src/entities/ordensDeProducao/__tests__/find-response.ts b/src/entities/ordensDeProducao/__tests__/find-response.ts new file mode 100644 index 0000000..8e532d2 --- /dev/null +++ b/src/entities/ordensDeProducao/__tests__/find-response.ts @@ -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" +} diff --git a/src/entities/ordensDeProducao/__tests__/generate-over-demand-response.ts b/src/entities/ordensDeProducao/__tests__/generate-over-demand-response.ts new file mode 100644 index 0000000..2128de5 --- /dev/null +++ b/src/entities/ordensDeProducao/__tests__/generate-over-demand-response.ts @@ -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 + } + } + ] +} diff --git a/src/entities/ordensDeProducao/__tests__/get-response.ts b/src/entities/ordensDeProducao/__tests__/get-response.ts new file mode 100644 index 0000000..4709f3b --- /dev/null +++ b/src/entities/ordensDeProducao/__tests__/get-response.ts @@ -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" + } + } + ] +} diff --git a/src/entities/ordensDeProducao/__tests__/index.spec.ts b/src/entities/ordensDeProducao/__tests__/index.spec.ts new file mode 100644 index 0000000..ed521e6 --- /dev/null +++ b/src/entities/ordensDeProducao/__tests__/index.spec.ts @@ -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) + }) +}) diff --git a/src/entities/ordensDeProducao/__tests__/update-response.ts b/src/entities/ordensDeProducao/__tests__/update-response.ts new file mode 100644 index 0000000..604d663 --- /dev/null +++ b/src/entities/ordensDeProducao/__tests__/update-response.ts @@ -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" +} diff --git a/src/entities/ordensDeProducao/index.ts b/src/entities/ordensDeProducao/index.ts new file mode 100644 index 0000000..685af1c --- /dev/null +++ b/src/entities/ordensDeProducao/index.ts @@ -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} 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 { + 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} + * @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 { + 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} + * @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 { + 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} + * @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 { + return await this.repository.store({ + endpoint: 'ordens-producao', + body + }) + } + + /** + * Gera ordens de produção sob demanda. + * + * @returns {Promise} + * @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 { + 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} + * @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 { + 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} + * @throws {BlingApiException|BlingInternalException} + * + * @see https://developer.bling.com.br/referencia#/Produtos/.idOrdemProducao__situacoes + */ + public async changeSituation( + params: IChangeSituationParams & IChangeSituationBody + ): Promise { + const { idOrdemProducao, ...body } = params + return await this.repository.update({ + endpoint: 'ordens-producao', + id: `${idOrdemProducao}/situacoes`, + body + }) + } +} diff --git a/src/entities/ordensDeProducao/interfaces/change-situation.interface.ts b/src/entities/ordensDeProducao/interfaces/change-situation.interface.ts new file mode 100644 index 0000000..04a8417 --- /dev/null +++ b/src/entities/ordensDeProducao/interfaces/change-situation.interface.ts @@ -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 +} diff --git a/src/entities/ordensDeProducao/interfaces/create.interface.ts b/src/entities/ordensDeProducao/interfaces/create.interface.ts new file mode 100644 index 0000000..0a8dd47 --- /dev/null +++ b/src/entities/ordensDeProducao/interfaces/create.interface.ts @@ -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 + } +} diff --git a/src/entities/ordensDeProducao/interfaces/delete.interface.ts b/src/entities/ordensDeProducao/interfaces/delete.interface.ts new file mode 100644 index 0000000..dcc7130 --- /dev/null +++ b/src/entities/ordensDeProducao/interfaces/delete.interface.ts @@ -0,0 +1,6 @@ +export interface IDeleteParams { + /** + * ID da ordem de produção + */ + idOrdemProducao: number +} diff --git a/src/entities/ordensDeProducao/interfaces/find.interface.ts b/src/entities/ordensDeProducao/interfaces/find.interface.ts new file mode 100644 index 0000000..3fa58de --- /dev/null +++ b/src/entities/ordensDeProducao/interfaces/find.interface.ts @@ -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 +} diff --git a/src/entities/ordensDeProducao/interfaces/generate-over-demand.interface.ts b/src/entities/ordensDeProducao/interfaces/generate-over-demand.interface.ts new file mode 100644 index 0000000..fab5de1 --- /dev/null +++ b/src/entities/ordensDeProducao/interfaces/generate-over-demand.interface.ts @@ -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 + } + }[] +} diff --git a/src/entities/ordensDeProducao/interfaces/get.interface.ts b/src/entities/ordensDeProducao/interfaces/get.interface.ts new file mode 100644 index 0000000..df8fa87 --- /dev/null +++ b/src/entities/ordensDeProducao/interfaces/get.interface.ts @@ -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 + } + }[] +} diff --git a/src/entities/ordensDeProducao/interfaces/update.interface.ts b/src/entities/ordensDeProducao/interfaces/update.interface.ts new file mode 100644 index 0000000..71f8d64 --- /dev/null +++ b/src/entities/ordensDeProducao/interfaces/update.interface.ts @@ -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 +} diff --git a/src/entities/produtos/__tests__/find-response.ts b/src/entities/produtos/__tests__/find-response.ts index e3fa9f0..76334e4 100644 --- a/src/entities/produtos/__tests__/find-response.ts +++ b/src/entities/produtos/__tests__/find-response.ts @@ -1,7 +1,6 @@ export default { data: { id: 123456789, - idProdutoPai: 123456789, nome: 'Produto 1', codigo: 'CODE_123', preco: 1, @@ -9,8 +8,7 @@ export default { 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,7 +134,6 @@ export default { variacoes: [ { id: 123456789, - idProdutoPai: 123456789, nome: 'Produto 1', codigo: 'CODE_123', preco: 1, @@ -133,8 +141,7 @@ export default { 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 } } diff --git a/src/entities/produtos/__tests__/get-response.ts b/src/entities/produtos/__tests__/get-response.ts index 42da148..52104dc 100644 --- a/src/entities/produtos/__tests__/get-response.ts +++ b/src/entities/produtos/__tests__/get-response.ts @@ -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" } ] } diff --git a/src/entities/produtos/__tests__/index.spec.ts b/src/entities/produtos/__tests__/index.spec.ts index 1a767e9..eb58e99 100644 --- a/src/entities/produtos/__tests__/index.spec.ts +++ b/src/entities/produtos/__tests__/index.spec.ts @@ -95,7 +95,8 @@ describe('Produtos entity', () => { idLoja: undefined, codigo: undefined, nome: undefined, - idsProdutos: undefined + idsProdutos: undefined, + codigos: undefined } }) expect(response).toBe(getResponse) diff --git a/src/entities/produtos/index.ts b/src/entities/produtos/index.ts index 2d159d6..c046051 100644 --- a/src/entities/produtos/index.ts +++ b/src/entities/produtos/index.ts @@ -103,7 +103,8 @@ export class Produtos extends Entity { idLoja: params?.idLoja, codigo: params?.codigo, nome: params?.nome, - idsProdutos: params?.idsProdutos + idsProdutos: params?.idsProdutos, + codigos: params?.codigos } }) } diff --git a/src/entities/produtos/interfaces/find.interface.ts b/src/entities/produtos/interfaces/find.interface.ts index 6b3920f..eeceaf7 100644 --- a/src/entities/produtos/interfaces/find.interface.ts +++ b/src/entities/produtos/interfaces/find.interface.ts @@ -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 + } } }[] } diff --git a/src/entities/produtos/interfaces/get.interface.ts b/src/entities/produtos/interfaces/get.interface.ts index 1540981..7195615 100644 --- a/src/entities/produtos/interfaces/get.interface.ts +++ b/src/entities/produtos/interfaces/get.interface.ts @@ -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 diff --git a/src/entities/produtosVariacoes/__tests__/find-response.ts b/src/entities/produtosVariacoes/__tests__/find-response.ts index 3c976b8..76334e4 100644 --- a/src/entities/produtosVariacoes/__tests__/find-response.ts +++ b/src/entities/produtosVariacoes/__tests__/find-response.ts @@ -1,7 +1,6 @@ export default { data: { id: 123456789, - idProdutoPai: 123456789, nome: 'Produto 1', codigo: 'CODE_123', preco: 1, @@ -9,6 +8,7 @@ export default { 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,6 +24,7 @@ export default { descricaoComplementar: 'Descrição complementar', linkExterno: 'https://www.google.com', observacoes: 'Observações', + descricaoEmbalagemDiscreta: 'Produto teste', categoria: { id: 123456789 }, @@ -31,9 +32,20 @@ export default { 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, @@ -41,7 +53,7 @@ export default { 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,7 +126,7 @@ export default { camposCustomizados: [ { idCampoCustomizado: 123456789, - idVinculo: 'Utilize para atualizar o valor existente. Ex: 123456789', + idVinculo: 123456789, valor: '256GB', item: 'Opção A' } @@ -109,7 +134,6 @@ export default { variacoes: [ { id: 123456789, - idProdutoPai: 123456789, nome: 'Produto 1', codigo: 'CODE_123', preco: 1, @@ -117,6 +141,7 @@ export default { 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,6 +157,7 @@ export default { descricaoComplementar: 'Descrição complementar', linkExterno: 'https://www.google.com', observacoes: 'Observações', + descricaoEmbalagemDiscreta: 'Produto teste', categoria: { id: 123456789 }, @@ -139,9 +165,20 @@ 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: '', + 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 } } diff --git a/src/entities/produtosVariacoes/interfaces/find.interface.ts b/src/entities/produtosVariacoes/interfaces/find.interface.ts index 3b48d79..3399c66 100644 --- a/src/entities/produtosVariacoes/interfaces/find.interface.ts +++ b/src/entities/produtosVariacoes/interfaces/find.interface.ts @@ -18,7 +18,6 @@ export interface IFindParams { export interface IFindResponse { data: { id?: number - idProdutoPai?: number nome: string codigo?: string preco?: number @@ -26,6 +25,7 @@ export interface IFindResponse { 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 + } } }[] }