Balance
  • Namespace
  • Class
  • Tree

Namespaces

  • Balance
    • Db
      • TableGateway
    • Form
      • Element
      • Search
    • InputFilter
      • Search
    • Model
      • Persistence
        • Db
    • Mvc
      • Controller
    • Posting
    • Stdlib
      • Hydrator
        • Strategy
    • View
      • Table

Classes

  • Balance\Db\TableGateway\AbstractTableGatewayFactory
  • Balance\Form\Accounts
  • Balance\Form\Element\Boolean
  • Balance\Form\Element\Currency
  • Balance\Form\Element\DateTime
  • Balance\Form\Element\Select
  • Balance\Form\Postings
  • Balance\Form\Search\Accounts
  • Balance\Form\Search\Balance
  • Balance\Form\Search\Postings
  • Balance\InputFilter\Accounts
  • Balance\InputFilter\Postings
  • Balance\InputFilter\Search\Accounts
  • Balance\InputFilter\Search\Balance
  • Balance\InputFilter\Search\Postings
  • Balance\Model\AbstractModelFactory
  • Balance\Model\AccountType
  • Balance\Model\Balance
  • Balance\Model\BooleanType
  • Balance\Model\EntryType
  • Balance\Model\Model
  • Balance\Model\Persistence\Db\Accounts
  • Balance\Model\Persistence\Db\Balance
  • Balance\Model\Persistence\Db\Postings
  • Balance\Mvc\Controller\AbstractControllerFactory
  • Balance\Mvc\Controller\Accounts
  • Balance\Mvc\Controller\Configs
  • Balance\Mvc\Controller\Home
  • Balance\Mvc\Controller\Postings
  • Balance\Posting\Checker
  • Balance\Stdlib\Hydrator\Strategy\Datetime
  • Balance\View\Table\Table

Interfaces

  • Balance\Model\Persistence\PersistenceInterface
  • Balance\Model\Persistence\ValueOptionsInterface
  • Balance\Mvc\Controller\ModelAwareInterface
  • Balance\Mvc\Controller\RedirectRouteNameAwareInterface

Traits

  • Balance\Mvc\Controller\EditActionTrait
  • Balance\Mvc\Controller\IndexActionTrait
  • Balance\Mvc\Controller\ModelAwareTrait
  • Balance\Mvc\Controller\RedirectRouteNameAwareTrait
  • Balance\Mvc\Controller\RemoveActionTrait

Exceptions

  • Balance\Form\FormException
  • Balance\InputFilter\InputFilterException
  • Balance\Model\ModelException
  1 <?php
  2 
  3 namespace Balance\InputFilter;
  4 
  5 use Balance\Model\EntryType;
  6 use Balance\Model\Persistence\ValueOptionsInterface;
  7 use Balance\Posting\Checker;
  8 use NumberFormatter;
  9 use Zend\Filter;
 10 use Zend\InputFilter\CollectionInputFilter;
 11 use Zend\InputFilter\Input;
 12 use Zend\InputFilter\InputFilter;
 13 use Zend\ServiceManager\ServiceLocatorAwareInterface;
 14 use Zend\ServiceManager\ServiceLocatorAwareTrait;
 15 use Zend\Validator;
 16 
 17 /**
 18  * Validação de Dados de Lançamento
 19  */
 20 class Postings extends InputFilter implements ServiceLocatorAwareInterface
 21 {
 22     use ServiceLocatorAwareTrait;
 23 
 24     /**
 25      * {@inheritdoc}
 26      */
 27     public function init()
 28     {
 29         // Inicialização
 30         $pAccounts = $this->getServiceLocator()->getServiceLocator()->get('Balance\Model\Persistence\Accounts');
 31 
 32         // Verificações
 33         if (! $pAccounts instanceof ValueOptionsInterface) {
 34             throw new InputFilterException('Invalid Model');
 35         }
 36 
 37         // Chave Primária
 38         $input = new Input();
 39         $input->getFilterChain()
 40             ->attach(new Filter\ToInt());
 41         $this->add($input, 'id');
 42 
 43         // Data e Hora
 44         $input = new Input();
 45         $input->getValidatorChain()
 46             ->attach(new Validator\Date(array('format' => 'd/m/Y H:i:s')));
 47         $this->add($input, 'datetime');
 48 
 49         // Descrição
 50         $this->add(new Input(), 'description');
 51 
 52         // Filtro: Entradas
 53         $filter = new InputFilter();
 54 
 55         // Entradas: Tipo
 56         $input = new Input();
 57         $input->getValidatorChain()
 58             ->attach(new Validator\InArray(array('haystack' => array_keys((new EntryType())->getDefinition()))));
 59         $filter->add($input, 'type');
 60 
 61         // Capturar Todas as Possíveis Entradas de Contas
 62         $options = array();
 63         foreach ($pAccounts->getValueOptions() as $identifier => $option) {
 64             if (is_array($option)) {
 65                 $options = array_merge($options, array_keys($option['options']));
 66             } else {
 67                 $options = array_merge($options, array($identifier));
 68             }
 69         }
 70 
 71         // Entradas: Conta
 72         $input = new Input();
 73         $input->getValidatorChain()
 74             ->attach(new Validator\InArray(array('haystack' => $options)))
 75             ->attach(new Validator\Callback(array(
 76                 'callback' => array($this, 'doValidateAccountId'),
 77                 'message'  => 'O valor de entrada foi configurado em outra entrada de lançamento',
 78             )));
 79         $input->getFilterChain()
 80             ->attach(new Filter\ToInt());
 81         $filter->add($input, 'account_id');
 82 
 83         // Entradas: Valor
 84         $input = new Input();
 85         $input->getValidatorChain()
 86             ->attach(new Validator\Regex(array(
 87                 'pattern' => '/^[1-9]*[0-9]+,[0-9]{2}$/',
 88                 'message' => 'O valor informado não está no formato esperado',
 89             )))
 90             ->attach(new Validator\Callback(array(
 91                 'callback' => array($this, 'doValidateValue'),
 92                 'message'  => 'O valor de entrada não está balanceado',
 93             )));
 94         $filter->add($input, 'value');
 95 
 96         // Coleção: Entradas
 97         $collection = (new CollectionInputFilter())
 98             ->setInputFilter($filter)
 99             ->setCount(2);
100         $this->add($collection, 'entries');
101     }
102 
103     /**
104      * Validação de Contas
105      *
106      * @param  string $value Valor para Verificação
107      * @return bool   Confirmação do Validador
108      */
109     public function doValidateAccountId($value)
110     {
111         // Inicialização
112         $accounts = array();
113         // Entradas
114         if (isset($this->data['entries']) && is_array($this->data['entries'])) {
115             foreach ($this->data['entries'] as $entry) {
116                 if (is_array($entry) && isset($entry['account_id'])) {
117                     $accounts[] = (int) $entry['account_id'];
118                 }
119             }
120         }
121         // Contabilizar uma só Entrada!
122         $counter = array_count_values($accounts);
123         // Resultado
124         return isset($counter[$value]) && $counter[$value] === 1;
125     }
126 
127     /**
128      * Validação de Valores
129      *
130      * @param  string $value Valor para Verificação
131      * @return bool   Confirmação do Validador
132      */
133     public function doValidateValue($value)
134     {
135         // Inicialização
136         $checker   = new Checker();
137         $formatter = new NumberFormatter(null, NumberFormatter::CURRENCY);
138         // Configuração de Símbolo
139         $formatter->setSymbol(NumberFormatter::CURRENCY_SYMBOL, '');
140         // Tipos e Valores
141         if (isset($this->data['entries']) && is_array($this->data['entries'])) {
142             foreach ($this->data['entries'] as $entry) {
143                 if (is_array($entry) && isset($entry['type']) && isset($entry['value'])) {
144                     // Capturar Valor Monetário
145                     $value = $formatter->parseCurrency($entry['value'], $currency);
146                     // Limpeza PHPMD
147                     unset($currency);
148                     // Adicionar Entrada
149                     switch ($entry['type']) {
150                         case Checker::CREDIT:
151                         case Checker::DEBIT:
152                             $checker->addValue($entry['type'], $value);
153                             break;
154                     }
155                 }
156             }
157         }
158         // Validação
159         return $checker->isValid();
160     }
161 }
162 
Balance API documentation generated by ApiGen