Pular para o conteúdo principal

Company Service

Gerencia operações relacionadas às empresas, permitindo buscar informações sobre as empresas da organização.

Visão Geral​

O CompanyService é responsável por:

  • Buscar empresas da API remota
  • Fornecer informações sobre empresas/filiais da organização
  • Listar empresas disponíveis para operações de vendas e estoque

As empresas representam as unidades de negócio, filiais ou empresas do grupo que fazem parte da organização. São utilizadas para controle de estoque, vendas, e outras operações específicas por unidade.

Localização: services/company/company.service.ts

Endpoints Utilizados​

Base URL​

Todos os endpoints são relativos à base URL configurada em services/api.service.ts

Métodos​

fetchRemote(params)​

Busca empresas remotamente com paginação.

Endpoint: GET /empresa

Parâmetros:

type FetchCompaniesParams = {
page?: number; // Número da página (padrão: 0)
size?: number; // Quantidade de itens por página (padrão: 999)
dataHora?: string;
};

Query Params enviados:

  • page: número da página
  • size: tamanho da página
  • dataHora: timestamp (opcional)

Retorno:

Promise<Company[]>;

Exemplo de uso:

import { companyService } from "@/services/company/company.service.instance";

// Buscar todas as empresas
const allCompanies = await companyService.fetchRemote();

// Buscar com paginação
const companiesPage = await companyService.fetchRemote({
page: 0,
size: 50,
});

// Buscar para sincronização
const companies = await companyService.fetchRemote({
page: 0,
size: 999,
dataHora: "2026-02-25T10:00:00Z",
});

Tratamento de erros:

  • Lança Error se o status da resposta não for 2xx
  • Mensagem: CompanyService.fetchRemote failed: {status}

Estruturas de Dados​

Interface Company​

interface Company {
id: string;
idExterno: string | null;
Organizacao: string;
tipoPessoa: "F" | "J";
cpf?: string;
cnpj?: string;
nome: string;
razaoSocial?: string;
}

Componentes Relacionados​

buildQueryParams Helper​

Função utilitária que converte objeto de parâmetros em URLSearchParams.

Localização: helpers/buildQueryParams.ts

PageResponse Interface​

Interface compartilhada para respostas paginadas.

Localização: services/client/client.service.ts

interface PageResponse<T> {
content: T[]; // Array de itens da página
page?: number; // Número da página atual
size?: number; // Tamanho da página
totalPages?: number; // Total de páginas
totalElements?: number; // Total de elementos
}

Fluxo de Integração​

Fluxo de Listagem de Empresas​

1. App precisa exibir lista de empresas/filiais
2. App chama companyService.fetchRemote()
3. GET /empresa é enviado com query params
4. API retorna empresas disponíveis
5. App pode usar para filtros de estoque, vendas, etc.

Fluxo de Seleção de Empresa​

1. Obter lista de empresas
2. Usuário seleciona empresa para operação
3. Usar ID da empresa em outras operações:
- Consultar estoque da empresa
- Registrar venda na empresa
- Gerar relatórios por empresa

Casos de Uso​

Listar Todas as Empresas​

// Buscar todas as empresas
const companies = await companyService.fetchRemote();

console.log(`Total de empresas: ${companies.length}`);

companies.forEach((company) => {
console.log(`${company.nome} - ${company.cnpj || company.cpf}`);
});

Renderizar Select de Empresas​

// Buscar empresas
const companies = await companyService.fetchRemote();

// Gerar opções para select
const options = companies.map((company) => ({
value: company.id,
label: company.nome,
document: company.cnpj || company.cpf,
}));

// Renderizar
console.log("Selecione a empresa:");
options.forEach((opt) => {
console.log(
`<option value="${opt.value}">${opt.label} - ${opt.document}</option>`,
);
});

Buscar Empresa por ID​

// Buscar todas as empresas
const companies = await companyService.fetchRemote();

// Encontrar empresa específica
function findCompanyById(id: string): Company | undefined {
return companies.find((c) => c.id === id);
}

const company = findCompanyById("empresa-123");
if (company) {
console.log("Empresa:", company.nome);
console.log("Organização:", company.Organizacao);
}

Testes​

Localização​

services/company/company.service.test.ts

Executar Testes​

# Teste específico do serviço
npx jest services/company/company.service.test.ts

# Modo watch
npx jest services/company/company.service.test.ts --watch

# Com coverage
npx jest services/company/company.service.test.ts --coverage

Casos de Teste​

  • ✅ fetchRemote: busca de empresas com paginação
  • ✅ fetchRemote: retorna content em status 2xx
  • ✅ Tratamento de erros para status não-2xx

Mocks​

Localização​

__mocks__/company.mock.ts

Dados Disponíveis​

Mock com empresas de exemplo:

  • Pessoas jurídicas com CNPJ
  • Pessoas físicas com CPF
  • Diferentes organizações

Exemplo de uso em testes:

import { companyResponseMock } from "@/__mocks__/company.mock";

// Mock da API
const apiMock = {
get: jest.fn(async () => ({
status: 200,
data: companyResponseMock,
})),
};

const service = new CompanyService({ apiWithoutAccessToken: apiMock });
const result = await service.fetchRemote();

expect(result).toEqual(companyResponseMock.content);