/** * Check if the transaction is valid against the Defrauder Validator * * @param Transaction $transaction * @return bool Whether or not the transaction is valid */ public function transactionIsValid(Transaction $transaction) { /** @var $em \Doctrine\Common\Persistence\ObjectManager */ $em = $this->container->get('doctrine')->getManager(); $transactionRepo = $em->getRepository('AppBundle:Transaction'); $average = $transactionRepo->getAvgAmount(); $amountIsValid = $this->amountIsValid($average, $transaction->getAmount()); $zipcodes = $transactionRepo->getAllZips(); $locationIsValid = $this->locationIsValid($zipcodes, $transaction->getZip()); return $amountIsValid && $locationIsValid; }
/** * Validate the transaction datas * * @todo This should probably be pulled out into a service * @param \Defrauder\Bundle\AppBundle\Entity\Transaction $transaction * @param \Symfony\Component\Validator\Context\ExecutionContextInterface $context */ public function validateTransaction(Transaction $transaction, ExecutionContextInterface $context) { $name = $transaction->getName(); if (empty($name)) { $context->buildViolation('Name is required!')->atPath('name')->addViolation(); } $amount = $transaction->getAmount(); if (!is_int($amount) && !is_float($amount)) { // make sure number like... $context->buildViolation('Amount must be a number!')->atPath('amount')->addViolation(); } elseif ((int) $amount != $amount) { // validate decimal places $decimals = strlen($amount) - strrpos($amount, '.') - 1; if ($decimals > 2) { $context->buildViolation('Amount must have no more than 2 decimal places!')->atPath('amount')->addViolation(); } } //todo: actually validate the address... $address = $transaction->getAddress(); if (empty($address)) { $context->buildViolation('Address is required!')->atPath('address')->addViolation(); } $city = $transaction->getCity(); if (empty($city)) { $context->buildViolation('City is required!')->atPath('city')->addViolation(); } $state = $transaction->getState(); if (empty($state)) { $context->buildViolation('State is required!')->atPath('state')->addViolation(); } $zip = $transaction->getZip(); if (!is_int($zip)) { // make sure zip number like... $context->buildViolation('Zip must be a number!')->atPath('zip')->addViolation(); } elseif (strlen((string) $zip) != 5) { $context->buildViolation('Zip must be 5 digits!')->atPath('zip')->addViolation(); } }