Return to Snippet

Revision: 35559
at November 10, 2010 08:23 by gpupo


Initial Code
<?php

class financeira
{
  private $value, $original, $info;

  public function __construct($value = 100)
  {
     $this->value =  $this->original = $value;
     $this->info = array('log'=>$value,'operacao' => '');
  }
  private function addLog($x)
  {
    $this->info['log'] .= "\n" . $x;
  }
  private function addOperacao($x)
  {
    $this->info['operacao'] .= $x;
    $this->addLog($x);
  }
  public function getInfo($k = 'operacao')
  {
    return $this->info[$k];
  }  
  public function setValue($x)
  {
    $this->original = $x;
    $this->resetValue();
    return $this;
  }
  public function getValue()
  {
  	$this->addLog('=' . $this->value);
    return (float) $this->value;
  }
  public function resetValue()
  {
    $this->value = $this->original;
    $this->info['operacao'] = '';
    $this->info['log'] = '';
    return $this;
  }
  
  private function percent($x, $v = NULL)
  {
  	if(!isset($v))
  	{
  	  $v = $this->value;
  	}
    $r = ($v * $x) /100;
    $this->addOperacao('-' . $x . '%');
    return $r; 
  }
  public function addDesconto($x)
  {
    $this->value -= $this->percent($x);
  }
/*
 * Calcula descontos progressivos como 10% + 20% + 5% a partir de um array
 */  
  public function addDescontoProgressivo(array $descontos)
  {
    foreach($descontos as $desconto)
    {
      $this->addDesconto($desconto);
    }
    return $this;
  }
  
  public function getDesconto()
  {
    return $this->original - $this->value;
  }
  
  public function getAlterador()
  {
    return ($this->getDesconto() * 100) / $this->original;
  } 

/*
* Calcula o numero multiplicador de desconto progressivo como 10% + 20% + 5% a partir de um array
*/  
  public function getMultiplicadorDaProgressao(array $descontos)
  {
  	$this->resetValue();
    foreach($descontos as $desconto)
    {
      $this->addDesconto($desconto);
    }
    return $this->getAlterador();
  }
  
  
} 


// Teste unitário, salvo no arquivo financeiraTest.php



/**
 *
 * @author     Gilmar Pupo <[email protected]>
 * 
 * Testa as funcoes da classe financeira 
 */

require_once dirname(__FILE__).'/../bootstrap/unit.php';
$t = new lime_test(25);

$v = new financeira(100);
$v->addDesconto(10);
$t->is( $v->getValue(),90 ,'adicionando 10% de Porcentagem:' . $v->getValue());
$v->addDesconto(10);
$t->is( $v->getValue(),81 ,'adicionando 10% de Porcentagem:' . $v->getValue());

$v->resetValue();
$t->is( $v->getValue(),100 ,'reiniciando valores:' . $v->getValue());

$v->addDescontoProgressivo(array(10, 10));
$t->is( $v->getValue(),81 ,'adicionando 10% + 10% de Porcentagem:' . $v->getValue());

$v->resetValue();
$v->addDescontoProgressivo(array(30, 10, 5));
$t->is( $v->getValue(),59.85 ,'adicionando 30% + 10% + 5% de desconto em 100:' . $v->getValue());

$t->diag('Testando métodos compactados');

$v->setValue(80)->addDescontoProgressivo(array(30, 10, 5));
$t->is( $v->getValue(),47.88 ,'adicionando 30% + 10% + 5% de desconto em 80:' . $v->getValue());

$t->is( $v->setValue(50)
    ->addDescontoProgressivo(array(30, 10, 5))
    ->getValue()
  ,29.925 ,'adicionando 30% + 10% + 5% de desconto em 50:' . $v->getValue());

$t->diag('Obtendo dados informativos');
$t->is( $v->setValue(100)
    ->addDescontoProgressivo(array(30, 10, 5))
    ->getDesconto()
  ,40.15 ,'acumulado de desconto foi de:' . $v->getDesconto());
$t->is( $v->getAlterador(), 40.15, 'alterador:' . $v->getAlterador());

$t->is( $v->setValue(80)
    ->addDescontoProgressivo(array(30, 10, 5))
    ->getDesconto()
  ,32.12  ,'acumulado de desconto foi de:' . $v->getDesconto());
$t->is( $v->getAlterador(), 40.15, 'alterador:' . $v->getAlterador());

$t->is( $v->setValue(50)
    ->addDescontoProgressivo(array(30, 10, 5))
    ->getDesconto()
  ,20.075 ,'acumulado de desconto foi de:' . $v->getDesconto());
$t->is( $v->getAlterador(), 40.15, 'alterador:' . $v->getAlterador());


$t->diag('Definindo multiplicador a partir de um array');

$y = new financeira();

$t->is( $i = $y->getMultiplicadorDaProgressao(array(30, 10, 10)) , 43.3, 'getMultiplicadorDaProgressao:' . $i);
$t->isa_ok( $y->getInfo(), 'string', 'operacao:' . $y->getInfo());
//echo $y->getInfo('log') . "\n";

$t->is( $i = $y->getMultiplicadorDaProgressao(array(20, 10, 10)) , 35.2, 'getMultiplicadorDaProgressao:' . $i);
$t->isa_ok( $y->getInfo(), 'string', 'operacao:' . $y->getInfo());
//echo $y->getInfo('log') . "\n";


$t->is( $i = $y->getMultiplicadorDaProgressao(array(30, 10, 5)) , 40.15, 'getMultiplicadorDaProgressao:' . $i);
$t->isa_ok( $y->getInfo(), 'string', 'operacao:' . $y->getInfo());
//echo $y->getInfo('log') . "\n";


$t->is($r = ((100 * $y->getMultiplicadorDaProgressao(array(30, 10, 5))) /100) , 40.15, $y->getInfo() . ':' . $r);
$t->is($r = ((80 * $y->getMultiplicadorDaProgressao(array(30, 10, 5))) /100) , 32.12, $y->getInfo() . ':' . $r);
$t->is($r = ((50 * $y->getMultiplicadorDaProgressao(array(30, 10, 5))) /100) , 20.075, $y->getInfo() . ':' . $r);


$t->is($r = ((100 * $y->getMultiplicadorDaProgressao(array(30, 7, 5))) /100) , 38.155, $y->getInfo() . ':' . $r);
$t->is($r = ((80 * $y->getMultiplicadorDaProgressao(array(30, 8, 5))) /100) , 31.056, $y->getInfo() . ':' . $r);
$t->is($r = ((50 * $y->getMultiplicadorDaProgressao(array(20, 9, 20))) /100) , 20.88, $y->getInfo() . ':' . $r);

Initial URL


Initial Description
Uma classe e seu teste unitário

Initial Title
Classe para cálculo de desconto progressivo e teste unitário Symfony

Initial Tags


Initial Language
PHP