<?php
namespace App\Entity\Cliente\Modelagem;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Table(name="modelagem.modelagem")
* @ORM\Entity(repositoryClass="App\Repository\Cliente\Modelagem\ModelagemRepository")
*/
class Modelagem
{
/**
* @var int
*
* @ORM\Column(name="id_modelagem", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $idModelagem;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Cliente\Modelagem\Programa", inversedBy="modelagens", fetch="EAGER")
* @ORM\JoinColumn(name="id_programa", referencedColumnName="id_programa")
*/
private $programa;
/**
* @ORM\Column(name="titulo", type="string", length=255)
*
* @Assert\NotBlank(message="Campo título não pode ser vazio")
* @Assert\Length(
* min=2,
* max=200,
* minMessage="Campo título deve ter no minimo {{ limit }} caracteres.",
* maxMessage="Campo título deve ter no maximo {{ limit }} caracteres."
* )
*/
private $titulo;
/**
* @var json
*
* @ORM\Column(name="config", type="json")
*/
private $config;
/**
* @ORM\Column(name="inicio", type="integer")
* @Assert\NotBlank(message="Campo início não pode ser vazio")
* @Assert\Regex("/([12]\d{3}(0[1-9]|1[0-2]))/", message="Campo início está incorreto")
*/
private $inicio;
/**
* @ORM\Column(name="fim", type="integer", nullable=true)
* @Assert\NotBlank(message="Campo fim não pode ser vazio")
* @Assert\Regex("/([12]\d{3}(0[1-9]|1[0-2]))/", message="Campo fim está incorreto")
*/
private $fim;
/**
* @ORM\Column(name="id_usuario", type="integer")
*/
private $id_usuario;
/**
* @ORM\Column(name="ativo", type="boolean")
*/
private $ativo;
/**
* @ORM\Column(name="observacao")
*/
private $observacao;
/**
* @ORM\Column(name="data_upd", type="datetimetz")
*/
private $data_upd;
/**
* @ORM\Column(name="id_visao")
*/
private $idVisao;
/**
* @ORM\Column(type="boolean", name="envia_mensagem", nullable=FALSE)
*/
private $envia_mensagem;
/**
* @ORM\Column(type="boolean", name="aceite_mensagem", nullable=FALSE)
*/
private $aceite_mensagem;
/**
* @ORM\Column(type="integer", name="id_usuario_mensagem", nullable=FALSE)
*/
private $id_usuario_mensagem;
private $where;
public function getIdModelagem()
{
return $this->idModelagem;
}
public function getTitulo()
{
return $this->titulo;
}
public function getConfig(): ?array
{
return $this->config;
}
public function getInicio()
{
return $this->inicio;
}
public function getFim()
{
return $this->fim;
}
public function setIdModelagem($idModelagem)
{
$this->idModelagem = $idModelagem;
return $this;
}
public function setTitulo($titulo)
{
$this->titulo = $titulo;
return $this;
}
public function setConfig($config)
{
$this->config = $config;
return $this;
}
public function setInicio($inicio)
{
$this->inicio = $inicio;
return $this;
}
public function setFim($fim)
{
$this->fim = $fim;
return $this;
}
/**
* Get the value of id_usuario.
*/
public function getIdUsuario()
{
return $this->id_usuario;
}
/**
* Set the value of id_usuario.
*
* @param mixed $id_usuario
*
* @return self
*/
public function setIdUsuario($id_usuario)
{
$this->id_usuario = $id_usuario;
return $this;
}
public function getAtivo()
{
return $this->ativo;
}
public function setAtivo($ativo)
{
$this->ativo = $ativo;
return $this;
}
/**
* Get the value of observacao.
*/
public function getObservacao()
{
return $this->observacao;
}
/**
* Set the value of observacao.
*
* @param mixed $observacao
*
* @return self
*/
public function setObservacao($observacao)
{
$this->observacao = $observacao;
return $this;
}
/**
* Get the value of data_upd.
*/
public function getDataUpd()
{
return $this->data_upd;
}
/**
* Set the value of data_upd.
*
* @param mixed $data_upd
*
* @return self
*/
public function setDataUpd($data_upd)
{
$this->data_upd = $data_upd;
return $this;
}
/**
* Get the value of id_visao.
*/
public function getIdVisao()
{
return $this->parsePostgresToArray($this->idVisao);
}
/**
* Set the value of id_visao.
*
* @param mixed $idVisao
*
* @return self
*/
public function setIdVisao($idVisao)
{
$idVisao = $this->parseArrayToPostgres($idVisao);
$this->idVisao = $idVisao;
return $this;
}
public function getPrograma(): ?Programa
{
return $this->programa;
}
public function setPrograma(?Programa $programa): self
{
$this->programa = $programa;
return $this;
}
public function getEnviaMensagem(): bool
{
return $this->envia_mensagem;
}
public function setEnviaMensagem(bool $envia_mensagem): self
{
$this->envia_mensagem = $envia_mensagem;
return $this;
}
public function getAceiteMensagem(): bool
{
return $this->aceite_mensagem;
}
public function setAceiteMensagem(bool $aceite_mensagem): self
{
$this->aceite_mensagem = $aceite_mensagem;
return $this;
}
public function getIdUsuarioMensagem(): int
{
return $this->id_usuario_mensagem;
}
public function setIdUsuarioMensagem(int $id_usuario_mensagem): self
{
$this->id_usuario_mensagem = $id_usuario_mensagem;
return $this;
}
/**
* Método utilizado para buscar quais módulos
* estão disponíveis para o usuário perante a
* configuração da Modelagem.
*
* @author Matheus Vieira <matheus.aguilar@2im.com.br>
*/
public function getModulos(): array
{
return $this->config['avaliado']['modulos'] ?? [];
}
/**
* Get the value of where.
*/
public function getWhere()
{
return " id_modelagem = {$this->getIdModelagem()} AND id_programa = {$this->getPrograma()->getIdPrograma()}";
}
/**
* Set the value of where.
*
* @param mixed $where
*
* @return self
*/
public function setWhere($where): string
{
$this->where = $where;
return $this;
}
public function parseArrayToPostgres(array $array)
{
return '{'.implode(',', $array).'}';
}
public function parsePostgresToArray(?string $string): array
{
return is_null($string) ? [] : explode(',', str_replace(['{', '}'], '', $string));
}
/**
* Popula Modelagem.
*
* @author Juliano Silva <juliano.silva@2im.com.br>
*
* @param string $titulo
* @param string $mesInicio
* @param string $mesFim
* @param int $programa
* @param string $observacao
*
* @return Modelagem $modelagem
*/
public function fillObject(?string $titulo, ?string $mesInicio, ?string $anoIncio, ?string $mesFim, ?string $anoFim, $programa, int $idUsuario, array $idVisao, ?string $observacao, ?array $config = null, bool $ativo = true, bool $deletado = false, ?string $where)
{
$dataAtual = date('d/m/Y H:i:s');
$this
->setTitulo($titulo)
->setInicio($this->trataPeriodo($mesInicio, $anoIncio))
->setFim($this->trataPeriodo($mesFim, $anoFim))
->setPrograma($programa)
->setId_usuario($idUsuario)
->setIdVisao($idVisao)
->setObservacao($observacao)
->setConfig($config)
->setAtivo($ativo)
->setWhere($where)
;
}
/**
* trata mes e ano em um inteiro
* Se necessário adiciona zero a esquerda no mês.
*
* @param string $mes 1
* @param string $ano 2015
*
* @return int exemplo: 201501
*/
public function trataPeriodo(string $mes, string $ano): int
{
return (int) sprintf('%s%s', $ano, str_pad($mes, 2, '0', STR_PAD_LEFT));
}
/**
* Converte periodo AAAAMM em um array de ano e mês.
*
* @param string $periodo
*
* @return array exemplo ['ano' => '2015', 'mes' => '01']
*/
public function separaPeriodo($periodo): array
{
list($ano, $mes) = str_split($periodo, 4);
return ['ano' => (string) $ano, 'mes' => (string) $mes];
}
/**
* Converte periodo inicio e fim e salva no mesmo objeto.
*
* @author Juliano Silva <juliano.silva@2im.com.br>
*/
public function parsePeriodos()
{
$inicio = $this->separaPeriodo($this->getInicio());
$fim = $this->separaPeriodo($this->getFim());
$this->inicioArray = $inicio;
$this->fimArray = $fim;
}
/**
* Esse retorna se a visualização dos datalhes de um indicador de custeio
* está disponível para visualização do usuário.
*/
public function permitirDetalhes(?string $perfil = NULL): bool
{
return isset($this->config[$perfil]) ? $this->config[$perfil]['custeio']['detalhes'] : (isset($this->config['custeio']) ? $this->config['custeio']['detalhes'] : true);
}
}