first commit
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
namespace WorkbloomERP\Module\v0\Contato\Constants;
|
||||
|
||||
class ContribuinteICMSConst {
|
||||
public const CONTATO_CONTRIBUINTE_ICMS = [
|
||||
1 => 'Contribuinte ICMS',
|
||||
2 => 'Contribuinte Isento de Inscrição no Cadastro de Contribuintes',
|
||||
9 => 'Não Contribuinte, que pode ou não possuir Inscrição Estadual no Cadastro de Contribuintes'
|
||||
];
|
||||
|
||||
public static function getAll(): array {
|
||||
return self::CONTATO_CONTRIBUINTE_ICMS;
|
||||
}
|
||||
|
||||
public static function isValid(string $value): bool {
|
||||
return array_key_exists(key: $value, array: self::CONTATO_CONTRIBUINTE_ICMS);
|
||||
}
|
||||
|
||||
public static function getDescription(string $key): ?string {
|
||||
return self::CONTATO_CONTRIBUINTE_ICMS[$key] ?? null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
namespace WorkbloomERP\Module\v0\Contato\Constants;
|
||||
|
||||
class NFSeConsumoIbsCbsConst {
|
||||
public const CONTATO_USO_CONSUMO_IBS_CBS = [
|
||||
'1' => 'Sim (Consumidor Final)',
|
||||
'2' => 'Não informar',
|
||||
'0' => 'Não (Operação B2B)',
|
||||
];
|
||||
|
||||
|
||||
public static function getAll(): array {
|
||||
return self::CONTATO_USO_CONSUMO_IBS_CBS;
|
||||
}
|
||||
|
||||
public static function getDescription(string|int|null $key): string {
|
||||
return self::CONTATO_USO_CONSUMO_IBS_CBS[$key] ?? 'Valor desconhecido';
|
||||
}
|
||||
|
||||
public static function isValid(string|int|null $key): bool {
|
||||
return array_key_exists(key: $key, array: self::CONTATO_USO_CONSUMO_IBS_CBS);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
namespace WorkbloomERP\Module\v0\Contato\Constants;
|
||||
|
||||
class OrgaoPublicoConst {
|
||||
public const CONTATO_ORGAO_PUBLICO = [
|
||||
'NAO' => 'Não',
|
||||
'FEDERAL' => 'Órgão Público Federal',
|
||||
'ESTADUAL' => 'Órgão Público Estadual',
|
||||
'MUNICIPAL' => 'Órgão Público Municipal'
|
||||
];
|
||||
|
||||
public static function getAll(): array {
|
||||
return self::CONTATO_ORGAO_PUBLICO;
|
||||
}
|
||||
|
||||
public static function isValid(string $value): bool {
|
||||
return array_key_exists(key: $value, array: self::CONTATO_ORGAO_PUBLICO);
|
||||
}
|
||||
|
||||
public static function getDescription(string $key): ?string {
|
||||
return self::CONTATO_ORGAO_PUBLICO[$key] ?? null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
namespace WorkbloomERP\Module\v0\Contato\Constants;
|
||||
|
||||
class PersonalidadeConst {
|
||||
public const CONTATO_PERSONALIDADE = [
|
||||
'PF' => 'Pessoa Física',
|
||||
'PJ' => 'Pessoa Jurídica',
|
||||
'EX' => 'Estrangeiro'
|
||||
];
|
||||
|
||||
public static function getAll(): array {
|
||||
return self::CONTATO_PERSONALIDADE;
|
||||
}
|
||||
|
||||
public static function isValid(string $value): bool {
|
||||
return array_key_exists(key: $value, array: self::CONTATO_PERSONALIDADE);
|
||||
}
|
||||
|
||||
public static function getDescription(string $key): ?string {
|
||||
return self::CONTATO_PERSONALIDADE[$key] ?? null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
namespace WorkbloomERP\Module\v0\Contato\Constants;
|
||||
|
||||
class TipoConst {
|
||||
public const CONTATO_TIPO = [
|
||||
'CLIENTE' => 'Cliente',
|
||||
'FORNECEDOR' => 'Fornecedor'
|
||||
];
|
||||
|
||||
public static function getAll(): array {
|
||||
return self::CONTATO_TIPO;
|
||||
}
|
||||
|
||||
public static function isValid(string $value): bool {
|
||||
return array_key_exists(key: $value, array: self::CONTATO_TIPO);
|
||||
}
|
||||
|
||||
public static function getDescription(string $key): ?string {
|
||||
return self::CONTATO_TIPO[$key] ?? null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
<?php
|
||||
namespace WorkbloomERP\Module\v0\Contato\Controllers;
|
||||
|
||||
use KrothiumAPI\Utils\HttpUtil;
|
||||
use WorkbloomERP\Utils\SanitizeUtil;
|
||||
use WorkbloomERP\Exceptions\AppException;
|
||||
use WorkbloomERP\Module\v0\Contato\DTOs\ContatoCreateDTO;
|
||||
use WorkbloomERP\Module\v0\Contato\Factories\ContatoServiceFactory;
|
||||
|
||||
class ContatoController {
|
||||
public function createOptions(): void {
|
||||
try {
|
||||
$contatoService = ContatoServiceFactory::makeContatoService();
|
||||
$options = $contatoService->createOptions();
|
||||
|
||||
HttpUtil::jsonResponse(
|
||||
response_code: 200,
|
||||
message: 'Opções para criação de contato.',
|
||||
output: ['options' => $options]
|
||||
);
|
||||
} catch (AppException $e) {
|
||||
HttpUtil::jsonResponse(
|
||||
response_code: $e->getCode() ?? 500,
|
||||
message: $e->getMessage() ?? 'Ocorreu um erro ao obter as opções de contato.',
|
||||
output: $e->getDetails() ? ['errors' => $e->getDetails()] : null
|
||||
);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Endpoint de API para a criação de um novo **Contato**.
|
||||
*
|
||||
* Este controlador atua como o ponto de entrada para o registro de novos contatos
|
||||
* (parceiros de negócio, fornecedores ou clientes) no sistema. O método é
|
||||
* responsável por extrair os dados da requisição HTTP (POST), aplicar a sanitização
|
||||
* necessária para garantir a integridade dos dados e delegar a criação à camada de
|
||||
* serviço utilizando um `ContatoCreateDTO`.
|
||||
*
|
||||
* ---
|
||||
* ## Fluxo de Execução
|
||||
* 1. **Captura e Validação:** Obtém o corpo da requisição (JSON/Form). Valida a presença de dados, retornando erro 422 caso esteja vazio.
|
||||
* 2. **Normalização (DTO):** Instancia um `ContatoCreateDTO` populando-o com os dados sanitizados através de `SanitizeUtil`.
|
||||
* 3. **Orquestração de Serviço:** Invoca `ContatoService::create()` para validar regras de negócio, persistência e possíveis integrações.
|
||||
* 4. **Resposta:** Retorna um JSON estruturado com o status da operação (201 para sucesso ou status de erro correspondente).
|
||||
*
|
||||
* ---
|
||||
* ## Observações Técnicas
|
||||
* - O controlador segue o padrão de "Thin Controller", garantindo que as regras de validação complexas e a persistência de dados ocorram na camada de serviço.
|
||||
* - Todos os campos de entrada são submetidos a métodos de `SanitizeUtil` para prevenir injeções e garantir o tipo esperado antes de atingir o DTO.
|
||||
* - Utiliza `ContatoServiceFactory` para a injeção de dependência do serviço.
|
||||
*
|
||||
* @return void O método encerra o processamento enviando uma resposta HTTP JSON ao cliente.
|
||||
* @see ContatoCreateDTO Para a estrutura de dados esperada para a criação.
|
||||
* @see ContatoService::create() Para a lógica de negócio de persistência do contato.
|
||||
*/
|
||||
public function create(): void {
|
||||
try {
|
||||
$form = HttpUtil::getRequestBody(form_type: 'POST');
|
||||
if (empty($form)) {
|
||||
throw new AppException(message: 'Requisição inválida.', code: 422);
|
||||
}
|
||||
|
||||
$contaoService = ContatoServiceFactory::makeContatoService();
|
||||
$response = $contaoService->create(
|
||||
contatoCreateDTO: new ContatoCreateDTO(
|
||||
is_active: SanitizeUtil::boolean(value: $form['is_active'] ?? null),
|
||||
tipo: SanitizeUtil::string(value: $form['tipo'] ?? null),
|
||||
nome_empresarial: SanitizeUtil::string(value: $form['nome_empresarial'] ?? null),
|
||||
nome_fantasia: SanitizeUtil::string(value: $form['nome_fantasia'] ?? null),
|
||||
personalidade: SanitizeUtil::string(value: $form['personalidade'] ?? null),
|
||||
document_cpf: SanitizeUtil::string(value: $form['document_cpf'] ?? null),
|
||||
document_cnpj: SanitizeUtil::string(value: $form['document_cnpj'] ?? null),
|
||||
regime_tributario: SanitizeUtil::int(value: $form['regime_tributario'] ?? null),
|
||||
contribuinte_icms: SanitizeUtil::int(value: $form['contribuinte_icms'] ?? null),
|
||||
orgao_publico: SanitizeUtil::string(value: $form['orgao_publico'] ?? null),
|
||||
document_ie: SanitizeUtil::string(value: $form['document_ie'] ?? null),
|
||||
document_im: SanitizeUtil::string(value: $form['document_im'] ?? null),
|
||||
document_is: SanitizeUtil::string(value: $form['document_is'] ?? null),
|
||||
end_cep: SanitizeUtil::string(value: $form['end_cep'] ?? null),
|
||||
end_ibge: SanitizeUtil::string(value: $form['end_ibge'] ?? null),
|
||||
end_logradouro: SanitizeUtil::string(value: $form['end_logradouro'] ?? null),
|
||||
end_numero: SanitizeUtil::string(value: $form['end_numero'] ?? null),
|
||||
end_complemento: SanitizeUtil::string(value: $form['end_complemento'] ?? null),
|
||||
end_bairro: SanitizeUtil::string(value: $form['end_bairro'] ?? null),
|
||||
end_cidade: SanitizeUtil::string(value: $form['end_cidade'] ?? null),
|
||||
end_uf: SanitizeUtil::string(value: $form['end_uf'] ?? null),
|
||||
info_email: SanitizeUtil::string(value: $form['info_email'] ?? null),
|
||||
info_email_nfe: SanitizeUtil::string(value: $form['info_email_nfe'] ?? null),
|
||||
info_observacao: SanitizeUtil::string(value: $form['info_observacao'] ?? null),
|
||||
info_telefone: SanitizeUtil::string(value: $form['info_telefone'] ?? null),
|
||||
info_uso_consumo_ibs_cbs: SanitizeUtil::string(value: $form['info_uso_consumo_ibs_cbs'] ?? null),
|
||||
)
|
||||
);
|
||||
|
||||
HttpUtil::jsonResponse(
|
||||
response_code: $response['response_code'] ?? 201,
|
||||
message: $response['message'] ?? 'Contato criado com sucesso.',
|
||||
output: $response['output'] ?? null
|
||||
);
|
||||
} catch (AppException $e) {
|
||||
HttpUtil::jsonResponse(
|
||||
response_code: $e->getCode() ?? 500,
|
||||
message: $e->getMessage() ?? 'Ocorreu um erro ao criar o contato.',
|
||||
output: $e->getDetails() ? ['errors' => $e->getDetails()] : null
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,246 @@
|
||||
<?php
|
||||
namespace WorkbloomERP\Module\v0\Contato\DTOs;
|
||||
|
||||
class ContatoCreateDTO {
|
||||
public function __construct(
|
||||
private ?int $is_active = null,
|
||||
private ?string $tipo = null,
|
||||
private ?string $nome_empresarial = null,
|
||||
private ?string $nome_fantasia = null,
|
||||
private ?string $personalidade = null,
|
||||
private ?string $document_cpf = null,
|
||||
private ?string $document_cnpj = null,
|
||||
private ?int $regime_tributario = null,
|
||||
private ?int $contribuinte_icms = null,
|
||||
private ?string $orgao_publico = null,
|
||||
private ?string $document_ie = null,
|
||||
private ?string $document_im = null,
|
||||
private ?string $document_is = null,
|
||||
private ?string $end_cep = null,
|
||||
private ?string $end_ibge = null,
|
||||
private ?string $end_logradouro = null,
|
||||
private ?string $end_numero = null,
|
||||
private ?string $end_complemento = null,
|
||||
private ?string $end_bairro = null,
|
||||
private ?string $end_cidade = null,
|
||||
private ?string $end_uf = null,
|
||||
private ?string $info_email = null,
|
||||
private ?string $info_email_nfe = null,
|
||||
private ?string $info_observacao = null,
|
||||
private ?string $info_telefone = null,
|
||||
private ?string $info_uso_consumo_ibs_cbs = null,
|
||||
) {}
|
||||
|
||||
public function toArray(): array {
|
||||
return [
|
||||
'is_active' => $this->getIsActive(),
|
||||
'tipo' => $this->getTipo(),
|
||||
'nome_empresarial' => $this->getNomeEmpresarial(),
|
||||
'nome_fantasia' => $this->getNomeFantasia(),
|
||||
'personalidade' => $this->getPersonalidade(),
|
||||
'document_cpf' => $this->getDocumentCpf(),
|
||||
'document_cnpj' => $this->getDocumentCnpj(),
|
||||
'regime_tributario' => $this->getRegimeTributario(),
|
||||
'contribuinte_icms' => $this->getContribuinteIcms(),
|
||||
'orgao_publico' => $this->getOrgaoPublico(),
|
||||
'document_ie' => $this->getDocumentIe(),
|
||||
'document_im' => $this->getDocumentIm(),
|
||||
'document_is' => $this->getDocumentIs(),
|
||||
'end_cep' => $this->getEndCep(),
|
||||
'end_ibge' => $this->getEndIbge(),
|
||||
'end_logradouro' => $this->getEndLogradouro(),
|
||||
'end_numero' => $this->getEndNumero(),
|
||||
'end_complemento' => $this->getEndComplemento(),
|
||||
'end_bairro' => $this->getEndBairro(),
|
||||
'end_cidade' => $this->getEndCidade(),
|
||||
'end_uf' => $this->getEndUf(),
|
||||
'info_email' => $this->getInfoEmail(),
|
||||
'info_email_nfe' => $this->getInfoEmailNfe(),
|
||||
'info_observacao' => $this->getInfoObservacao(),
|
||||
'info_telefone' => $this->getInfoTelefone(),
|
||||
'info_uso_consumo_ibs_cbs' => $this->getInfoUsoConsumoIbsCbs(),
|
||||
];
|
||||
}
|
||||
|
||||
public function setIsActive(?int $is_active): void {
|
||||
$this->is_active = $is_active;
|
||||
}
|
||||
public function getIsActive(): ?int {
|
||||
return $this->is_active;
|
||||
}
|
||||
|
||||
public function setTipo(?string $tipo): void {
|
||||
$this->tipo = $tipo;
|
||||
}
|
||||
public function getTipo(): ?string {
|
||||
return $this->tipo;
|
||||
}
|
||||
|
||||
public function setNomeEmpresarial(?string $nome_empresarial): void {
|
||||
$this->nome_empresarial = $nome_empresarial;
|
||||
}
|
||||
public function getNomeEmpresarial(): ?string {
|
||||
return $this->nome_empresarial;
|
||||
}
|
||||
|
||||
public function setNomeFantasia(?string $nome_fantasia): void {
|
||||
$this->nome_fantasia = $nome_fantasia;
|
||||
}
|
||||
public function getNomeFantasia(): ?string {
|
||||
return $this->nome_fantasia;
|
||||
}
|
||||
|
||||
public function setPersonalidade(?string $personalidade): void {
|
||||
$this->personalidade = $personalidade;
|
||||
}
|
||||
public function getPersonalidade(): ?string {
|
||||
return $this->personalidade;
|
||||
}
|
||||
|
||||
public function setDocumentCpf(?string $document_cpf): void {
|
||||
$this->document_cpf = $document_cpf;
|
||||
}
|
||||
public function getDocumentCpf(): ?string {
|
||||
return $this->document_cpf;
|
||||
}
|
||||
|
||||
public function setDocumentCnpj(?string $document_cnpj): void {
|
||||
$this->document_cnpj = $document_cnpj;
|
||||
}
|
||||
public function getDocumentCnpj(): ?string {
|
||||
return $this->document_cnpj;
|
||||
}
|
||||
|
||||
public function setRegimeTributario(?int $regime_tributario): void {
|
||||
$this->regime_tributario = $regime_tributario;
|
||||
}
|
||||
public function getRegimeTributario(): ?int {
|
||||
return $this->regime_tributario;
|
||||
}
|
||||
|
||||
public function setContribuinteIcms(?int $contribuinte_icms): void {
|
||||
$this->contribuinte_icms = $contribuinte_icms;
|
||||
}
|
||||
public function getContribuinteIcms(): ?int {
|
||||
return $this->contribuinte_icms;
|
||||
}
|
||||
|
||||
public function setOrgaoPublico(?string $orgao_publico): void {
|
||||
$this->orgao_publico = $orgao_publico;
|
||||
}
|
||||
public function getOrgaoPublico(): ?string {
|
||||
return $this->orgao_publico;
|
||||
}
|
||||
|
||||
public function setDocumentIe(?string $document_ie): void {
|
||||
$this->document_ie = $document_ie;
|
||||
}
|
||||
public function getDocumentIe(): ?string {
|
||||
return $this->document_ie;
|
||||
}
|
||||
|
||||
public function setDocumentIm(?string $document_im): void {
|
||||
$this->document_im = $document_im;
|
||||
}
|
||||
public function getDocumentIm(): ?string {
|
||||
return $this->document_im;
|
||||
}
|
||||
|
||||
public function setDocumentIs(?string $document_is): void {
|
||||
$this->document_is = $document_is;
|
||||
}
|
||||
public function getDocumentIs(): ?string {
|
||||
return $this->document_is;
|
||||
}
|
||||
|
||||
public function setEndCep(?string $end_cep): void {
|
||||
$this->end_cep = $end_cep;
|
||||
}
|
||||
public function getEndCep(): ?string {
|
||||
return $this->end_cep;
|
||||
}
|
||||
|
||||
public function setEndIbge(?string $end_ibge): void {
|
||||
$this->end_ibge = $end_ibge;
|
||||
}
|
||||
public function getEndIbge(): ?string {
|
||||
return $this->end_ibge;
|
||||
}
|
||||
|
||||
public function setEndLogradouro(?string $end_logradouro): void {
|
||||
$this->end_logradouro = $end_logradouro;
|
||||
}
|
||||
public function getEndLogradouro(): ?string {
|
||||
return $this->end_logradouro;
|
||||
}
|
||||
|
||||
public function setEndNumero(?string $end_numero): void {
|
||||
$this->end_numero = $end_numero;
|
||||
}
|
||||
public function getEndNumero(): ?string {
|
||||
return $this->end_numero;
|
||||
}
|
||||
|
||||
public function setEndComplemento(?string $end_complemento): void {
|
||||
$this->end_complemento = $end_complemento;
|
||||
}
|
||||
public function getEndComplemento(): ?string {
|
||||
return $this->end_complemento;
|
||||
}
|
||||
|
||||
public function setEndBairro(?string $end_bairro): void {
|
||||
$this->end_bairro = $end_bairro;
|
||||
}
|
||||
public function getEndBairro(): ?string {
|
||||
return $this->end_bairro;
|
||||
}
|
||||
|
||||
public function setEndCidade(?string $end_cidade): void {
|
||||
$this->end_cidade = $end_cidade;
|
||||
}
|
||||
public function getEndCidade(): ?string {
|
||||
return $this->end_cidade;
|
||||
}
|
||||
|
||||
public function setEndUf(?string $end_uf): void {
|
||||
$this->end_uf = $end_uf;
|
||||
}
|
||||
public function getEndUf(): ?string {
|
||||
return $this->end_uf;
|
||||
}
|
||||
|
||||
public function setInfoEmail(?string $info_email): void {
|
||||
$this->info_email = $info_email;
|
||||
}
|
||||
public function getInfoEmail(): ?string {
|
||||
return $this->info_email;
|
||||
}
|
||||
|
||||
public function setInfoEmailNfe(?string $info_email_nfe): void {
|
||||
$this->info_email_nfe = $info_email_nfe;
|
||||
}
|
||||
public function getInfoEmailNfe(): ?string {
|
||||
return $this->info_email_nfe;
|
||||
}
|
||||
|
||||
public function setInfoObservacao(?string $info_observacao): void {
|
||||
$this->info_observacao = $info_observacao;
|
||||
}
|
||||
public function getInfoObservacao(): ?string {
|
||||
return $this->info_observacao;
|
||||
}
|
||||
|
||||
public function setInfoTelefone(?string $info_telefone): void {
|
||||
$this->info_telefone = $info_telefone;
|
||||
}
|
||||
public function getInfoTelefone(): ?string {
|
||||
return $this->info_telefone;
|
||||
}
|
||||
|
||||
public function setInfoUsoConsumoIbsCbs(?string $info_uso_consumo_ibs_cbs): void {
|
||||
$this->info_uso_consumo_ibs_cbs = $info_uso_consumo_ibs_cbs;
|
||||
}
|
||||
public function getInfoUsoConsumoIbsCbs(): ?string {
|
||||
return $this->info_uso_consumo_ibs_cbs;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,173 @@
|
||||
<?php
|
||||
namespace WorkbloomERP\Module\v0\Contato\Factories;
|
||||
|
||||
use DateTimeImmutable;
|
||||
use Ramsey\Uuid\Uuid;
|
||||
use WorkbloomERP\Services\DBService;
|
||||
use WorkbloomERP\Utils\ValidateUtil;
|
||||
use WorkbloomERP\Exceptions\AppException;
|
||||
use WorkbloomERP\Module\v0\Empresa\Repos\EmpresaRepo;
|
||||
use WorkbloomERP\Module\v0\Contato\Repos\ContatoRepo;
|
||||
use WorkbloomERP\Module\v0\Contato\Models\ContatoModel;
|
||||
use WorkbloomERP\Module\v0\Empresa\Models\EmpresaModel;
|
||||
use WorkbloomERP\Module\v0\Contato\DTOs\ContatoCreateDTO;
|
||||
|
||||
// Constantes para opções de contato
|
||||
use WorkbloomERP\Constants\SpedCRTConst;
|
||||
use WorkbloomERP\Constants\BrasilUfsConst;
|
||||
use WorkbloomERP\Constants\SpedPaisesConst;
|
||||
use WorkbloomERP\Module\v0\Contato\Constants\OrgaoPublicoConst;
|
||||
use WorkbloomERP\Module\v0\Contato\Constants\PersonalidadeConst;
|
||||
use WorkbloomERP\Module\v0\Contato\Constants\ContribuinteICMSConst;
|
||||
use WorkbloomERP\Module\v0\Contato\Constants\NFSeConsumoIbsCbsConst;
|
||||
use WorkbloomERP\Module\v0\Contato\Constants\TipoConst;
|
||||
|
||||
class ContatoFactory {
|
||||
public function __construct(private EmpresaModel $empresaModel, private ContatoCreateDTO $contatoCreateDTO, private ContatoRepo $contatoRepo, private EmpresaRepo $empresaRepo, private DBService $db) {
|
||||
if (!$empresaModel) {
|
||||
throw new AppException(message: 'Empresa não encontrada.', code: 404);
|
||||
}
|
||||
if (!$contatoCreateDTO) {
|
||||
throw new AppException(message: 'Dados do contato inválidos.', code: 400);
|
||||
}
|
||||
}
|
||||
|
||||
public function create(ContatoCreateDTO $contatoCreateDTO, EmpresaModel $empresaModel): ?ContatoModel {
|
||||
try {
|
||||
// Valida os campos comuns a ambos os tipos de contato (PF e PJ)
|
||||
$this->validateCommonFields(contatoCreateDTO: $contatoCreateDTO);
|
||||
|
||||
// Cria o contato com base na personalidade (PF ou PJ)
|
||||
$contatoModel = match($contatoCreateDTO->getPersonalidade()) {
|
||||
'PF' => $this->createPF(contatoCreateDTO: $contatoCreateDTO, empresaModel: $empresaModel),
|
||||
'PJ' => $this->createPJ(contatoCreateDTO: $contatoCreateDTO, empresaModel: $empresaModel)
|
||||
};
|
||||
|
||||
return $contatoModel;
|
||||
} catch(AppException $e) {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
private function validateCommonFields(ContatoCreateDTO $contatoCreateDTO): void {
|
||||
$errors = [];
|
||||
|
||||
$commonFields = [
|
||||
'is_active',
|
||||
'tipo',
|
||||
'nome_empresarial',
|
||||
'personalidade',
|
||||
'regime_tributario',
|
||||
'contribuinte_icms',
|
||||
'orgao_publico',
|
||||
'end_cep',
|
||||
'end_logradouro',
|
||||
'end_numero',
|
||||
'end_bairro',
|
||||
'end_cidade',
|
||||
'end_uf',
|
||||
'info_email',
|
||||
'info_email_nfe',
|
||||
'info_telefone',
|
||||
'info_uso_consumo_ibs_cbs',
|
||||
];
|
||||
|
||||
foreach ($commonFields as $field) {
|
||||
if (!array_key_exists(key: $field, array: $contatoCreateDTO->toArray()) || $contatoCreateDTO->toArray()[$field] === '') {
|
||||
$errors[$field] = 'Campo obrigatório.';
|
||||
}
|
||||
}
|
||||
|
||||
// Verifica se o campo 'tipo' tem um valor válido
|
||||
$tipo = $contatoCreateDTO->getTipo() ? strtoupper(string: $contatoCreateDTO->getTipo()) : null;
|
||||
if ($tipo && !TipoConst::isValid(value: $tipo)) {
|
||||
$errors['tipo'] = "Valor inválido.";
|
||||
}
|
||||
|
||||
// Verifica se o campo 'personalidade' tem um valor válido
|
||||
$personalidade = $contatoCreateDTO->getPersonalidade() ? strtoupper(string: $contatoCreateDTO->getPersonalidade()) : null;
|
||||
if ($personalidade && !PersonalidadeConst::isValid(value: $personalidade)) {
|
||||
$errors['personalidade'] = "Valor inválido.";
|
||||
}
|
||||
|
||||
// Valida o regime tributário
|
||||
if (!in_array($contatoCreateDTO->getRegimeTributario(), [1, 2, 3, 4, null], true)) {
|
||||
$errors['regime_tributario'] = "Valor inválido.";
|
||||
}
|
||||
|
||||
if ($errors) {
|
||||
throw new AppException(message: 'Dados de contato inválidos.',code: 422, details: $errors);
|
||||
}
|
||||
}
|
||||
|
||||
private function createPF(ContatoCreateDTO $contatoCreateDTO, EmpresaModel $empresaModel): ContatoModel {
|
||||
try {
|
||||
// Valida os campos específicos para pessoa física
|
||||
$this->validatePFFields(contatoCreateDTO: $contatoCreateDTO, empresaModel: $empresaModel);
|
||||
|
||||
$contatoModel = new ContatoModel();
|
||||
$contatoModel->setUuid(Uuid::uuid7()->toString());
|
||||
$contatoModel->setEmpresaId($empresaModel->getId());
|
||||
$contatoModel->setIsActive($contatoCreateDTO->getIsActive());
|
||||
$contatoModel->setTipo($contatoCreateDTO->getTipo());
|
||||
$contatoModel->setNomeEmpresarial($contatoCreateDTO->getNomeEmpresarial());
|
||||
$contatoModel->setPersonalidade($contatoCreateDTO->getPersonalidade());
|
||||
$contatoModel->setRegimeTributario($contatoCreateDTO->getRegimeTributario());
|
||||
$contatoModel->setContribuinteIcms($contatoCreateDTO->getContribuinteIcms());
|
||||
$contatoModel->setOrgaoPublico($contatoCreateDTO->getOrgaoPublico());
|
||||
$contatoModel->setEndCep($contatoCreateDTO->getEndCep());
|
||||
$contatoModel->setEndIbge($contatoCreateDTO->getEndIbge());
|
||||
$contatoModel->setEndLogradouro($contatoCreateDTO->getEndLogradouro());
|
||||
$contatoModel->setEndNumero($contatoCreateDTO->getEndNumero());
|
||||
$contatoModel->setEndBairro($contatoCreateDTO->getEndBairro());
|
||||
$contatoModel->setEndCidade($contatoCreateDTO->getEndCidade());
|
||||
$contatoModel->setEndUf($contatoCreateDTO->getEndUf());
|
||||
$contatoModel->setInfoEmail($contatoCreateDTO->getInfoEmail());
|
||||
$contatoModel->setInfoEmailNfe($contatoCreateDTO->getInfoEmailNfe());
|
||||
$contatoModel->setInfoObservacao($contatoCreateDTO->getInfoObservacao());
|
||||
$contatoModel->setInfoTelefone($contatoCreateDTO->getInfoTelefone());
|
||||
$contatoModel->setInfoUsoConsumoIbsCbs($contatoCreateDTO->getInfoUsoConsumoIbsCbs());
|
||||
$contatoModel->setCreatedAt(new DateTimeImmutable());
|
||||
|
||||
return $contatoModel;
|
||||
} catch(AppException $e) {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
private function validatePFFields(ContatoCreateDTO $contatoCreateDTO, EmpresaModel $empresaModel): void {
|
||||
$errors = [];
|
||||
|
||||
if (($contatoCreateDTO->getDocumentCpf() === '') || !ValidateUtil::cpf(cpf: $contatoCreateDTO->getDocumentCpf())) {
|
||||
$errors['document_cpf'] = 'CPF informado é inválido.';
|
||||
throw new AppException(message: 'Dados de contato inválidos.', code: 422, details: $errors);
|
||||
}
|
||||
|
||||
$existingContato = $this->contatoRepo->findOneByConditions(
|
||||
empresa_id: $empresaModel->getId(),
|
||||
conditions: [
|
||||
['field' => 'document_cpf', 'operator' => '=', 'value' => $contatoCreateDTO->getDocumentCpf()]
|
||||
]
|
||||
);
|
||||
|
||||
if ($existingContato) {
|
||||
$errors['document_cpf'] = 'CPF já cadastrado para esta empresa.';
|
||||
throw new AppException(message: 'Dados de contato inválidos.', code: 422, details: $errors);
|
||||
}
|
||||
|
||||
if ($errors) {
|
||||
throw new AppException(message: 'Dados de contato inválidos.', code: 422, details: $errors);
|
||||
}
|
||||
}
|
||||
|
||||
private function createPJ(ContatoCreateDTO $contatoCreateDTO, EmpresaModel $empresaModel): ContatoModel {
|
||||
try {
|
||||
// Valida os campos específicos para pessoa física
|
||||
// $this->validatePFFields(contatoCreateDTO: $contatoCreateDTO);
|
||||
|
||||
return new ContatoModel();
|
||||
} catch(AppException $e) {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
namespace WorkbloomERP\Module\v0\Contato\Factories;
|
||||
|
||||
use WorkbloomERP\Services\DBService;
|
||||
use WorkbloomERP\Module\v0\Empresa\Repos\EmpresaRepo;
|
||||
use WorkbloomERP\Module\v0\Contato\Repos\ContatoRepo;
|
||||
use WorkbloomERP\Module\v0\Empresa\Models\EmpresaModel;
|
||||
use WorkbloomERP\Module\v0\Contato\DTOs\ContatoCreateDTO;
|
||||
use WorkbloomERP\Module\v0\Contato\Services\ContatoService;
|
||||
|
||||
class ContatoServiceFactory {
|
||||
public static function makeContatoService(): ContatoService {
|
||||
$db = new DBService();
|
||||
return new ContatoService(
|
||||
db: $db,
|
||||
contatoRepo: new ContatoRepo(db: $db),
|
||||
empresaRepo: new EmpresaRepo(db: $db),
|
||||
);
|
||||
}
|
||||
|
||||
public static function makeContratoFactory(EmpresaModel $empresaModel, ContatoCreateDTO $contatoCreateDTO): ContatoFactory {
|
||||
$db = new DBService();
|
||||
return new ContatoFactory(
|
||||
db: $db,
|
||||
empresaModel: $empresaModel,
|
||||
contatoCreateDTO: $contatoCreateDTO,
|
||||
contatoRepo: new ContatoRepo(db: $db),
|
||||
empresaRepo: new EmpresaRepo(db: $db),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,312 @@
|
||||
<?php
|
||||
namespace WorkbloomERP\Module\v0\Contato\Models;
|
||||
|
||||
use DateTimeImmutable;
|
||||
use WorkbloomERP\Exceptions\AppException;
|
||||
|
||||
class ContatoModel {
|
||||
public function __construct(
|
||||
private ?int $id = null,
|
||||
private ?string $uuid = null,
|
||||
private ?int $empresa_id = null,
|
||||
private ?bool $is_active = null,
|
||||
private ?string $tipo = null,
|
||||
private ?string $nome_empresarial = null,
|
||||
private ?string $nome_fantasia = null,
|
||||
private ?string $personalidade = null,
|
||||
private ?string $document_cpf = null,
|
||||
private ?string $document_cnpj = null,
|
||||
private ?int $regime_tributario = null,
|
||||
private ?int $contribuinte_icms = null,
|
||||
private ?string $orgao_publico = null,
|
||||
private ?string $document_ie = null,
|
||||
private ?string $document_im = null,
|
||||
private ?string $document_is = null,
|
||||
private ?string $end_pais = null,
|
||||
private ?string $end_cep = null,
|
||||
private ?string $end_ibge = null,
|
||||
private ?string $end_logradouro = null,
|
||||
private ?string $end_numero = null,
|
||||
private ?string $end_complemento = null,
|
||||
private ?string $end_bairro = null,
|
||||
private ?string $end_cidade = null,
|
||||
private ?string $end_uf = null,
|
||||
private ?string $info_email = null,
|
||||
private ?string $info_email_nfe = null,
|
||||
private ?string $info_observacao = null,
|
||||
private ?string $info_telefone = null,
|
||||
private ?int $info_uso_consumo_ibs_cbs = null,
|
||||
private ?DateTimeImmutable $created_at = null,
|
||||
private ?DateTimeImmutable $updated_at = null,
|
||||
private ?DateTimeImmutable $deleted_at = null,
|
||||
) {}
|
||||
|
||||
public function toArray(): array {
|
||||
return [
|
||||
'id' => $this->getId(),
|
||||
'uuid' => $this->getUuid(),
|
||||
'empresa_id' => $this->getEmpresaId(),
|
||||
'is_active' => $this->getIsActive(),
|
||||
'tipo' => $this->getTipo(),
|
||||
'nome_empresarial' => $this->getNomeEmpresarial(),
|
||||
'nome_fantasia' => $this->getNomeFantasia(),
|
||||
'personalidade' => $this->getPersonalidade(),
|
||||
'document_cpf' => $this->getDocumentCpf(),
|
||||
'document_cnpj' => $this->getDocumentCnpj(),
|
||||
'regime_tributario' => $this->getRegimeTributario(),
|
||||
'contribuinte_icms' => $this->getContribuinteIcms(),
|
||||
'orgao_publico' => $this->getOrgaoPublico(),
|
||||
'document_ie' => $this->getDocumentIe(),
|
||||
'document_im' => $this->getDocumentIm(),
|
||||
'document_is' => $this->getDocumentIs(),
|
||||
'end_pais' => $this->getEndPais(),
|
||||
'end_cep' => $this->getEndCep(),
|
||||
'end_ibge' => $this->getEndIbge(),
|
||||
'end_logradouro' => $this->getEndLogradouro(),
|
||||
'end_numero' => $this->getEndNumero(),
|
||||
'end_complemento' => $this->getEndComplemento(),
|
||||
'end_bairro' => $this->getEndBairro(),
|
||||
'end_cidade' => $this->getEndCidade(),
|
||||
'end_uf' => $this->getEndUf(),
|
||||
'info_email' => $this->getInfoEmail(),
|
||||
'info_email_nfe' => $this->getInfoEmailNfe(),
|
||||
'info_observacao' => $this->getInfoObservacao(),
|
||||
'info_telefone' => $this->getInfoTelefone(),
|
||||
'info_uso_consumo_ibs_cbs' => $this->getInfoUsoConsumoIbsCbs(),
|
||||
'created_at' => $this->getCreatedAt() ? $this->getCreatedAt()->format(format: 'Y-m-d H:i:s') : null,
|
||||
'updated_at' => $this->getUpdatedAt() ? $this->getUpdatedAt()->format(format: 'Y-m-d H:i:s') : null,
|
||||
'deleted_at' => $this->getDeletedAt() ? $this->getDeletedAt()->format(format: 'Y-m-d H:i:s') : null,
|
||||
];
|
||||
}
|
||||
|
||||
public function setId(?int $id): void {
|
||||
$this->id = $id;
|
||||
}
|
||||
public function getId(): ?int {
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
public function setUuid(?string $uuid): void {
|
||||
$this->uuid = $uuid;
|
||||
}
|
||||
public function getUuid(): ?string {
|
||||
return $this->uuid;
|
||||
}
|
||||
|
||||
public function setEmpresaId(?int $empresa_id): void {
|
||||
$this->empresa_id = $empresa_id;
|
||||
}
|
||||
public function getEmpresaId(): ?int {
|
||||
return $this->empresa_id;
|
||||
}
|
||||
|
||||
public function setIsActive(?bool $is_active): void {
|
||||
$this->is_active = $is_active;
|
||||
}
|
||||
public function getIsActive(): ?bool {
|
||||
return $this->is_active;
|
||||
}
|
||||
|
||||
public function setTipo(?string $tipo): void {
|
||||
$this->tipo = $tipo;
|
||||
}
|
||||
public function getTipo(): ?string {
|
||||
return $this->tipo;
|
||||
}
|
||||
|
||||
public function setNomeEmpresarial(?string $nome_empresarial): void {
|
||||
$this->nome_empresarial = $nome_empresarial;
|
||||
}
|
||||
public function getNomeEmpresarial(): ?string {
|
||||
return $this->nome_empresarial;
|
||||
}
|
||||
|
||||
public function setNomeFantasia(?string $nome_fantasia): void {
|
||||
$this->nome_fantasia = $nome_fantasia;
|
||||
}
|
||||
public function getNomeFantasia(): ?string {
|
||||
return $this->nome_fantasia;
|
||||
}
|
||||
|
||||
public function setPersonalidade(?string $personalidade): void {
|
||||
$this->personalidade = $personalidade;
|
||||
}
|
||||
public function getPersonalidade(): ?string {
|
||||
return $this->personalidade;
|
||||
}
|
||||
|
||||
public function setDocumentCpf(?string $document_cpf): void {
|
||||
$this->document_cpf = $document_cpf;
|
||||
}
|
||||
public function getDocumentCpf(): ?string {
|
||||
return $this->document_cpf;
|
||||
}
|
||||
|
||||
public function setDocumentCnpj(?string $document_cnpj): void {
|
||||
$this->document_cnpj = $document_cnpj;
|
||||
}
|
||||
public function getDocumentCnpj(): ?string {
|
||||
return $this->document_cnpj;
|
||||
}
|
||||
|
||||
public function setRegimeTributario(?int $regime_tributario): void {
|
||||
$this->regime_tributario = $regime_tributario;
|
||||
}
|
||||
public function getRegimeTributario(): ?int {
|
||||
return $this->regime_tributario;
|
||||
}
|
||||
|
||||
public function setContribuinteIcms(?int $contribuinte_icms): void {
|
||||
$this->contribuinte_icms = $contribuinte_icms;
|
||||
}
|
||||
public function getContribuinteIcms(): ?int {
|
||||
return $this->contribuinte_icms;
|
||||
}
|
||||
|
||||
public function setOrgaoPublico(?string $orgao_publico): void {
|
||||
$this->orgao_publico = $orgao_publico;
|
||||
}
|
||||
public function getOrgaoPublico(): ?string {
|
||||
return $this->orgao_publico;
|
||||
}
|
||||
|
||||
public function setDocumentIe(?string $document_ie): void {
|
||||
$this->document_ie = $document_ie;
|
||||
}
|
||||
public function getDocumentIe(): ?string {
|
||||
return $this->document_ie;
|
||||
}
|
||||
|
||||
public function setDocumentIm(?string $document_im): void {
|
||||
$this->document_im = $document_im;
|
||||
}
|
||||
public function getDocumentIm(): ?string {
|
||||
return $this->document_im;
|
||||
}
|
||||
|
||||
public function setDocumentIs(?string $document_is): void {
|
||||
$this->document_is = $document_is;
|
||||
}
|
||||
public function getDocumentIs(): ?string {
|
||||
return $this->document_is;
|
||||
}
|
||||
|
||||
public function setEndPais(?string $end_pais): void {
|
||||
$this->end_pais = $end_pais;
|
||||
}
|
||||
public function getEndPais(): ?string {
|
||||
return $this->end_pais;
|
||||
}
|
||||
|
||||
public function setEndCep(?string $end_cep): void {
|
||||
$this->end_cep = $end_cep;
|
||||
}
|
||||
public function getEndCep(): ?string {
|
||||
return $this->end_cep;
|
||||
}
|
||||
|
||||
public function setEndIbge(?string $end_ibge): void {
|
||||
$this->end_ibge = $end_ibge;
|
||||
}
|
||||
public function getEndIbge(): ?string {
|
||||
return $this->end_ibge;
|
||||
}
|
||||
|
||||
public function setEndLogradouro(?string $end_logradouro): void {
|
||||
$this->end_logradouro = $end_logradouro;
|
||||
}
|
||||
public function getEndLogradouro(): ?string {
|
||||
return $this->end_logradouro;
|
||||
}
|
||||
|
||||
public function setEndNumero(?string $end_numero): void {
|
||||
$this->end_numero = $end_numero;
|
||||
}
|
||||
public function getEndNumero(): ?string {
|
||||
return $this->end_numero;
|
||||
}
|
||||
|
||||
public function setEndComplemento(?string $end_complemento): void {
|
||||
$this->end_complemento = $end_complemento;
|
||||
}
|
||||
public function getEndComplemento(): ?string {
|
||||
return $this->end_complemento;
|
||||
}
|
||||
|
||||
public function setEndBairro(?string $end_bairro): void {
|
||||
$this->end_bairro = $end_bairro;
|
||||
}
|
||||
public function getEndBairro(): ?string {
|
||||
return $this->end_bairro;
|
||||
}
|
||||
|
||||
public function setEndCidade(?string $end_cidade): void {
|
||||
$this->end_cidade = $end_cidade;
|
||||
}
|
||||
public function getEndCidade(): ?string {
|
||||
return $this->end_cidade;
|
||||
}
|
||||
|
||||
public function setEndUf(?string $end_uf): void {
|
||||
$this->end_uf = $end_uf;
|
||||
}
|
||||
public function getEndUf(): ?string {
|
||||
return $this->end_uf;
|
||||
}
|
||||
|
||||
public function setInfoEmail(?string $info_email): void {
|
||||
$this->info_email = $info_email;
|
||||
}
|
||||
public function getInfoEmail(): ?string {
|
||||
return $this->info_email;
|
||||
}
|
||||
|
||||
public function setInfoEmailNfe(?string $info_email_nfe): void {
|
||||
$this->info_email_nfe = $info_email_nfe;
|
||||
}
|
||||
public function getInfoEmailNfe(): ?string {
|
||||
return $this->info_email_nfe;
|
||||
}
|
||||
|
||||
public function setInfoObservacao(?string $info_observacao): void {
|
||||
$this->info_observacao = $info_observacao;
|
||||
}
|
||||
public function getInfoObservacao(): ?string {
|
||||
return $this->info_observacao;
|
||||
}
|
||||
|
||||
public function setInfoTelefone(?string $info_telefone): void {
|
||||
$this->info_telefone = $info_telefone;
|
||||
}
|
||||
public function getInfoTelefone(): ?string {
|
||||
return $this->info_telefone;
|
||||
}
|
||||
|
||||
public function setInfoUsoConsumoIbsCbs(?int $info_uso_consumo_ibs_cbs): void {
|
||||
$this->info_uso_consumo_ibs_cbs = $info_uso_consumo_ibs_cbs;
|
||||
}
|
||||
public function getInfoUsoConsumoIbsCbs(): ?int {
|
||||
return $this->info_uso_consumo_ibs_cbs;
|
||||
}
|
||||
|
||||
public function setCreatedAt(?DateTimeImmutable $created_at): void {
|
||||
$this->created_at = $created_at;
|
||||
}
|
||||
public function getCreatedAt(): ?DateTimeImmutable {
|
||||
return $this->created_at;
|
||||
}
|
||||
|
||||
public function setUpdatedAt(?DateTimeImmutable $updated_at): void {
|
||||
$this->updated_at = $updated_at;
|
||||
}
|
||||
public function getUpdatedAt(): ?DateTimeImmutable {
|
||||
return $this->updated_at;
|
||||
}
|
||||
|
||||
public function setDeletedAt(?DateTimeImmutable $deleted_at): void {
|
||||
$this->deleted_at = $deleted_at;
|
||||
}
|
||||
public function getDeletedAt(): ?DateTimeImmutable {
|
||||
return $this->deleted_at;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,377 @@
|
||||
<?php
|
||||
namespace WorkbloomERP\Module\v0\Contato\Repos;
|
||||
|
||||
use DateTimeImmutable;
|
||||
use WorkbloomERP\Services\DBService;
|
||||
use WorkbloomERP\Module\v0\Contato\Models\ContatoModel;
|
||||
|
||||
class ContatoRepo {
|
||||
protected string $contatoTable = 'contato';
|
||||
public function __construct(
|
||||
private DBService $db
|
||||
) {}
|
||||
|
||||
public function insert(ContatoModel $contatoModel): ContatoModel {
|
||||
$query =
|
||||
"INSERT INTO {$this->contatoTable} (
|
||||
uuid,
|
||||
empresa_id,
|
||||
is_active,
|
||||
tipo,
|
||||
nome_empresarial,
|
||||
nome_fantasia,
|
||||
personalidade,
|
||||
document_cpf,
|
||||
document_cnpj,
|
||||
regime_tributario,
|
||||
contribuinte_icms,
|
||||
orgao_publico,
|
||||
document_ie,
|
||||
document_im,
|
||||
document_is,
|
||||
end_pais,
|
||||
end_cep,
|
||||
end_ibge,
|
||||
end_logradouro,
|
||||
end_numero,
|
||||
end_complemento,
|
||||
end_bairro,
|
||||
end_cidade,
|
||||
end_uf,
|
||||
info_email,
|
||||
info_email_nfe,
|
||||
info_observacao,
|
||||
info_telefone,
|
||||
info_uso_consumo_ibs_cbs,
|
||||
created_at
|
||||
) VALUES (
|
||||
:uuid,
|
||||
:empresa_id,
|
||||
:is_active,
|
||||
:tipo,
|
||||
:nome_empresarial,
|
||||
:nome_fantasia,
|
||||
:personalidade,
|
||||
:document_cpf,
|
||||
:document_cnpj,
|
||||
:regime_tributario,
|
||||
:contribuinte_icms,
|
||||
:orgao_publico,
|
||||
:document_ie,
|
||||
:document_im,
|
||||
:document_is,
|
||||
:end_pais,
|
||||
:end_cep,
|
||||
:end_ibge,
|
||||
:end_logradouro,
|
||||
:end_numero,
|
||||
:end_complemento,
|
||||
:end_bairro,
|
||||
:end_cidade,
|
||||
:end_uf,
|
||||
:info_email,
|
||||
:info_email_nfe,
|
||||
:info_observacao,
|
||||
:info_telefone,
|
||||
:info_uso_consumo_ibs_cbs,
|
||||
:created_at
|
||||
)";
|
||||
|
||||
$contatoModel->setCreatedAt(new DateTimeImmutable());
|
||||
|
||||
$this->db->execute(
|
||||
sql: $query,
|
||||
params: [
|
||||
':uuid' => $contatoModel->getUuid(),
|
||||
':empresa_id' => $contatoModel->getEmpresaId(),
|
||||
':is_active' => $contatoModel->getIsActive(),
|
||||
':tipo' => $contatoModel->getTipo(),
|
||||
':nome_empresarial' => $contatoModel->getNomeEmpresarial(),
|
||||
':nome_fantasia' => $contatoModel->getNomeFantasia(),
|
||||
':personalidade' => $contatoModel->getPersonalidade(),
|
||||
':document_cpf' => $contatoModel->getDocumentCpf(),
|
||||
':document_cnpj' => $contatoModel->getDocumentCnpj(),
|
||||
':regime_tributario' => $contatoModel->getRegimeTributario(),
|
||||
':contribuinte_icms' => $contatoModel->getContribuinteIcms(),
|
||||
':orgao_publico' => $contatoModel->getOrgaoPublico(),
|
||||
':document_ie' => $contatoModel->getDocumentIe(),
|
||||
':document_im' => $contatoModel->getDocumentIm(),
|
||||
':document_is' => $contatoModel->getDocumentIs(),
|
||||
':end_pais' => $contatoModel->getEndPais(),
|
||||
':end_cep' => $contatoModel->getEndCep(),
|
||||
':end_ibge' => $contatoModel->getEndIbge(),
|
||||
':end_logradouro' => $contatoModel->getEndLogradouro(),
|
||||
':end_numero' => $contatoModel->getEndNumero(),
|
||||
':end_complemento' => $contatoModel->getEndComplemento(),
|
||||
':end_bairro' => $contatoModel->getEndBairro(),
|
||||
':end_cidade' => $contatoModel->getEndCidade(),
|
||||
':end_uf' => $contatoModel->getEndUf(),
|
||||
':info_email' => $contatoModel->getInfoEmail(),
|
||||
':info_email_nfe' => $contatoModel->getInfoEmailNfe(),
|
||||
':info_observacao' => $contatoModel->getInfoObservacao(),
|
||||
':info_telefone' => $contatoModel->getInfoTelefone(),
|
||||
':info_uso_consumo_ibs_cbs' => $contatoModel->getInfoUsoConsumoIbsCbs(),
|
||||
':created_at' => $contatoModel->getCreatedAt()->format('Y-m-d H:i:s'),
|
||||
]
|
||||
);
|
||||
|
||||
$contatoModel->setId(id: $this->db->lastInsertId());
|
||||
return $contatoModel;
|
||||
}
|
||||
|
||||
public function update(ContatoModel $contatoModel): bool {
|
||||
$query =
|
||||
"UPDATE {$this->contatoTable} SET
|
||||
is_active = :is_active,
|
||||
tipo = :tipo,
|
||||
nome_empresarial = :nome_empresarial,
|
||||
nome_fantasia = :nome_fantasia,
|
||||
personalidade = :personalidade,
|
||||
document_cpf = :document_cpf,
|
||||
document_cnpj = :document_cnpj,
|
||||
regime_tributario = :regime_tributario,
|
||||
contribuinte_icms = :contribuinte_icms,
|
||||
orgao_publico = :orgao_publico,
|
||||
document_ie = :document_ie,
|
||||
document_im = :document_im,
|
||||
document_is = :document_is,
|
||||
end_pais = :end_pais,
|
||||
end_cep = :end_cep,
|
||||
end_ibge = :end_ibge,
|
||||
end_logradouro = :end_logradouro,
|
||||
end_numero = :end_numero,
|
||||
end_complemento = :end_complemento,
|
||||
end_bairro = :end_bairro,
|
||||
end_cidade = :end_cidade,
|
||||
end_uf = :end_uf,
|
||||
info_email = :info_email,
|
||||
info_email_nfe = :info_email_nfe,
|
||||
info_observacao = :info_observacao,
|
||||
info_telefone = :info_telefone,
|
||||
info_uso_consumo_ibs_cbs = :info_uso_consumo_ibs_cbs,
|
||||
updated_at = :updated_at
|
||||
WHERE id = :id OR uuid = :uuid";
|
||||
|
||||
return $this->db->execute(
|
||||
sql: $query,
|
||||
params: [
|
||||
':id' => $contatoModel->getId(),
|
||||
':uuid' => $contatoModel->getUuid(),
|
||||
':empresa_id' => $contatoModel->getEmpresaId(),
|
||||
':is_active' => $contatoModel->getIsActive(),
|
||||
':tipo' => $contatoModel->getTipo(),
|
||||
':nome_empresarial' => $contatoModel->getNomeEmpresarial(),
|
||||
':nome_fantasia' => $contatoModel->getNomeFantasia(),
|
||||
':personalidade' => $contatoModel->getPersonalidade(),
|
||||
':document_cpf' => $contatoModel->getDocumentCpf(),
|
||||
':document_cnpj' => $contatoModel->getDocumentCnpj(),
|
||||
':regime_tributario' => $contatoModel->getRegimeTributario(),
|
||||
':contribuinte_icms' => $contatoModel->getContribuinteIcms(),
|
||||
':orgao_publico' => $contatoModel->getOrgaoPublico(),
|
||||
':document_ie' => $contatoModel->getDocumentIe(),
|
||||
':document_im' => $contatoModel->getDocumentIm(),
|
||||
':document_is' => $contatoModel->getDocumentIs(),
|
||||
':end_pais' => $contatoModel->getEndPais(),
|
||||
':end_cep' => $contatoModel->getEndCep(),
|
||||
':end_ibge' => $contatoModel->getEndIbge(),
|
||||
':end_logradouro' => $contatoModel->getEndLogradouro(),
|
||||
':end_numero' => $contatoModel->getEndNumero(),
|
||||
':end_complemento' => $contatoModel->getEndComplemento(),
|
||||
':end_bairro' => $contatoModel->getEndBairro(),
|
||||
':end_cidade' => $contatoModel->getEndCidade(),
|
||||
':end_uf' => $contatoModel->getEndUf(),
|
||||
':info_email' => $contatoModel->getInfoEmail(),
|
||||
':info_email_nfe' => $contatoModel->getInfoEmailNfe(),
|
||||
':info_observacao' => $contatoModel->getInfoObservacao(),
|
||||
':info_telefone' => $contatoModel->getInfoTelefone(),
|
||||
':info_uso_consumo_ibs_cbs' => $contatoModel->getInfoUsoConsumoIbsCbs(),
|
||||
':updated_at' => $contatoModel->getUpdatedAt()->format('Y-m-d H:i:s'),
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
public function delete(ContatoModel $contatoModel): bool {
|
||||
$query =
|
||||
"UPDATE {$this->contatoTable} SET
|
||||
deleted_at = :deleted_at
|
||||
WHERE id = :id OR uuid = :uuid";
|
||||
|
||||
return $this->db->execute(
|
||||
sql: $query,
|
||||
params: [
|
||||
':id' => $contatoModel->getId(),
|
||||
':uuid' => $contatoModel->getUuid(),
|
||||
':deleted_at' => (new DateTimeImmutable())->format('Y-m-d H:i:s'),
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
public function findByIdentifier(int $empresa_id, string $identifier, mixed $value) {
|
||||
$query =
|
||||
"SELECT
|
||||
id,
|
||||
uuid,
|
||||
empresa_id,
|
||||
is_active,
|
||||
nome_empresarial,
|
||||
nome_fantasia,
|
||||
personalidade,
|
||||
document_cpf,
|
||||
document_cnpj,
|
||||
regime_tributario,
|
||||
contribuinte_icms,
|
||||
orgao_publico,
|
||||
document_ie,
|
||||
document_im,
|
||||
document_is,
|
||||
end_cep,
|
||||
end_ibge,
|
||||
end_logradouro,
|
||||
end_numero,
|
||||
end_complemento,
|
||||
end_bairro,
|
||||
end_cidade,
|
||||
end_uf,
|
||||
info_email,
|
||||
info_email_nfe,
|
||||
info_observacao,
|
||||
info_telefone,
|
||||
info_uso_consumo_ibs_cbs,
|
||||
created_at,
|
||||
updated_at,
|
||||
deleted_at
|
||||
FROM {$this->contatoTable}
|
||||
WHERE empresa_id = :empresa_id
|
||||
AND {$identifier} = :value
|
||||
AND deleted_at IS NULL
|
||||
LIMIT 1";
|
||||
|
||||
$result = $this->db->fetchOne(
|
||||
sql: $query,
|
||||
params: [
|
||||
':empresa_id' => $empresa_id,
|
||||
':value' => $value,
|
||||
]
|
||||
);
|
||||
|
||||
return $result ? $this->mapToModel($result) : null;
|
||||
}
|
||||
|
||||
public function findOneByConditions(int $empresa_id, array $conditions): ?ContatoModel {
|
||||
if (empty($conditions)) {
|
||||
throw new \InvalidArgumentException('O array de condições não pode estar vazio.');
|
||||
}
|
||||
|
||||
// Começa com as condições fixas
|
||||
$whereClauses = [
|
||||
'empresa_id = :empresa_id',
|
||||
'deleted_at IS NULL'
|
||||
];
|
||||
|
||||
$params = [
|
||||
':empresa_id' => $empresa_id
|
||||
];
|
||||
|
||||
// Adiciona as condições dinâmicas
|
||||
foreach ($conditions as $condition) {
|
||||
if (!isset($condition['field'], $condition['value'])) {
|
||||
throw new \InvalidArgumentException(
|
||||
"Cada condição deve conter 'field' e 'value'."
|
||||
);
|
||||
}
|
||||
|
||||
$field = $condition['field'];
|
||||
$operator = $condition['operator'] ?? '=';
|
||||
$value = $condition['value'];
|
||||
|
||||
$whereClauses[] = "{$field} {$operator} :{$field}";
|
||||
$params[":{$field}"] = $value;
|
||||
}
|
||||
|
||||
$whereSql = implode(' AND ', $whereClauses);
|
||||
|
||||
$query =
|
||||
"SELECT
|
||||
id,
|
||||
uuid,
|
||||
empresa_id,
|
||||
is_active,
|
||||
tipo,
|
||||
nome_empresarial,
|
||||
nome_fantasia,
|
||||
personalidade,
|
||||
document_cpf,
|
||||
document_cnpj,
|
||||
regime_tributario,
|
||||
contribuinte_icms,
|
||||
orgao_publico,
|
||||
document_ie,
|
||||
document_im,
|
||||
document_is,
|
||||
end_pais,
|
||||
end_cep,
|
||||
end_ibge,
|
||||
end_logradouro,
|
||||
end_numero,
|
||||
end_complemento,
|
||||
end_bairro,
|
||||
end_cidade,
|
||||
end_uf,
|
||||
info_email,
|
||||
info_email_nfe,
|
||||
info_observacao,
|
||||
info_telefone,
|
||||
info_uso_consumo_ibs_cbs,
|
||||
created_at,
|
||||
updated_at,
|
||||
deleted_at
|
||||
FROM {$this->contatoTable}
|
||||
WHERE {$whereSql}
|
||||
LIMIT 1";
|
||||
|
||||
$result = $this->db->fetchOne(
|
||||
sql: $query,
|
||||
params: $params
|
||||
);
|
||||
|
||||
return $result ? $this->mapToModel($result) : null;
|
||||
}
|
||||
|
||||
private function mapToModel(array $data): ContatoModel {
|
||||
return new ContatoModel(
|
||||
id: $data['id'],
|
||||
uuid: $data['uuid'],
|
||||
empresa_id: $data['empresa_id'],
|
||||
is_active: $data['is_active'],
|
||||
tipo: $data['tipo'],
|
||||
nome_empresarial: $data['nome_empresarial'],
|
||||
nome_fantasia: $data['nome_fantasia'],
|
||||
personalidade: $data['personalidade'],
|
||||
document_cpf: $data['document_cpf'],
|
||||
document_cnpj: $data['document_cnpj'],
|
||||
regime_tributario: $data['regime_tributario'],
|
||||
contribuinte_icms: $data['contribuinte_icms'],
|
||||
orgao_publico: $data['orgao_publico'],
|
||||
document_ie: $data['document_ie'],
|
||||
document_im: $data['document_im'],
|
||||
document_is: $data['document_is'],
|
||||
end_pais: $data['end_pais'],
|
||||
end_cep: $data['end_cep'],
|
||||
end_ibge: $data['end_ibge'],
|
||||
end_logradouro: $data['end_logradouro'],
|
||||
end_numero: $data['end_numero'],
|
||||
end_complemento: $data['end_complemento'],
|
||||
end_bairro: $data['end_bairro'],
|
||||
end_cidade: $data['end_cidade'],
|
||||
end_uf: $data['end_uf'],
|
||||
info_email: $data['info_email'],
|
||||
info_email_nfe: $data['info_email_nfe'],
|
||||
info_observacao: $data['info_observacao'],
|
||||
info_telefone: $data['info_telefone'],
|
||||
info_uso_consumo_ibs_cbs: $data['info_uso_consumo_ibs_cbs'],
|
||||
created_at: $data['created_at'] ? new DateTimeImmutable($data['created_at']) : null,
|
||||
updated_at: $data['updated_at'] ? new DateTimeImmutable($data['updated_at']) : null,
|
||||
deleted_at: $data['deleted_at'] ? new DateTimeImmutable($data['deleted_at']) : null,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
use KrothiumAPI\Http\Router;
|
||||
use WorkbloomERP\Module\v0\Auth\Middlewares\AuthMiddleware;
|
||||
use WorkbloomERP\Module\v0\Contato\Controllers\ContatoController;
|
||||
|
||||
Router::group(
|
||||
prefix: '/contacts',
|
||||
callback: function() {
|
||||
// Endpoint para obter as opções de criação de contato (UF, regime tributário, etc.)
|
||||
Router::get('/create-options', [ContatoController::class, 'createOptions']);
|
||||
|
||||
// Rota para cadastrar um novo contato
|
||||
Router::post('/create', [ContatoController::class, 'create']);
|
||||
},
|
||||
middlewares: [
|
||||
[AuthMiddleware::class, 'handle']
|
||||
]
|
||||
);
|
||||
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
namespace WorkbloomERP\Module\v0\Contato\Services;
|
||||
|
||||
use Ramsey\Uuid\Uuid;
|
||||
use WorkbloomERP\Utils\SanitizeUtil;
|
||||
use WorkbloomERP\Utils\ValidateUtil;
|
||||
use WorkbloomERP\Services\DBService;
|
||||
use WorkbloomERP\Exceptions\AppException;
|
||||
use WorkbloomERP\Module\v0\Auth\Utils\AuthUtil;
|
||||
use WorkbloomERP\Module\v0\Empresa\Repos\EmpresaRepo;
|
||||
use WorkbloomERP\Module\v0\Contato\Repos\ContatoRepo;
|
||||
use WorkbloomERP\Module\v0\Empresa\Models\EmpresaModel;
|
||||
use WorkbloomERP\Module\v0\Contato\Models\ContatoModel;
|
||||
use WorkbloomERP\Module\v0\Contato\DTOs\ContatoCreateDTO;
|
||||
use WorkbloomERP\Module\v0\Contato\Factories\ContatoServiceFactory;
|
||||
use WorkbloomERP\Constants\SpedCRTConst;
|
||||
use WorkbloomERP\Constants\BrasilUfsConst;
|
||||
use WorkbloomERP\Constants\SpedPaisesConst;
|
||||
use WorkbloomERP\Module\v0\Contato\Constants\OrgaoPublicoConst;
|
||||
use WorkbloomERP\Module\v0\Contato\Constants\PersonalidadeConst;
|
||||
use WorkbloomERP\Module\v0\Contato\Constants\ContribuinteICMSConst;
|
||||
use WorkbloomERP\Module\v0\Contato\Constants\NFSeConsumoIbsCbsConst;
|
||||
|
||||
class ContatoService {
|
||||
public function __construct (
|
||||
protected DBService $db,
|
||||
protected ContatoRepo $contatoRepo,
|
||||
protected EmpresaRepo $empresaRepo,
|
||||
) {}
|
||||
|
||||
public function createOptions(): array {
|
||||
return [
|
||||
'tipo' => PersonalidadeConst::getAll(),
|
||||
'personalidade' => PersonalidadeConst::getAll(),
|
||||
'uf' => BrasilUfsConst::getAll(),
|
||||
'regime_tributario' => SpedCRTConst::getAll(),
|
||||
'contribuinte_icms' => ContribuinteICMSConst::getAll(),
|
||||
'info_uso_consumo_ibs_cbs' => NFSeConsumoIbsCbsConst::getAll(),
|
||||
'orgao_publico' => OrgaoPublicoConst::getAll(),
|
||||
'paises_sped' => SpedPaisesConst::getAll()
|
||||
];
|
||||
}
|
||||
|
||||
public function create(ContatoCreateDTO $contatoCreateDTO): array {
|
||||
try {
|
||||
return $this->db->transaction(
|
||||
callback: function() use ($contatoCreateDTO) {
|
||||
// Pega as informações da sessão para associar o contato à empresa correta
|
||||
$empresaData = AuthUtil::readSession(key: 'empresa_data');
|
||||
|
||||
// Verifica se a empresa existe
|
||||
$empresaModel = $this->empresaRepo->findByIdentifier(identifier: 'uuid', value: $empresaData['uuid']);
|
||||
|
||||
// Cria a fábrica de contato e valida os dados de criação do contato
|
||||
$contatoFactory = ContatoServiceFactory::makeContratoFactory(empresaModel: $empresaModel, contatoCreateDTO: $contatoCreateDTO);
|
||||
$contatoModel = $contatoFactory->create(contatoCreateDTO: $contatoCreateDTO, empresaModel: $empresaModel);
|
||||
|
||||
return [
|
||||
'response_code' => 201,
|
||||
'message' => 'Contato criado com sucesso.',
|
||||
'output' => ['data' => $contatoModel->toArray()]
|
||||
];
|
||||
}
|
||||
);
|
||||
} catch(AppException $e) {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user