This commit is contained in:
Thomas Peterson 2020-10-19 10:41:04 +02:00
parent d901c7155a
commit 7a55bf4cc2
16 changed files with 491 additions and 9 deletions

View File

@ -14,6 +14,7 @@ use PSC\Library\Calc\General\Type\Edge;
use PSC\Library\Calc\General\Type\EdgeCollection;
use PSC\Library\Calc\General\Type\EdgeCollectionContainer;
use PSC\Library\Calc\Option\Type\Base;
use PSC\Library\Calc\Option\Type\Checkbox;
use PSC\Library\Calc\Option\Type\PaperDbSelect;
use PSC\Library\Calc\Option\Type\Select;
use PSC\Library\Calc\Tests\Mock\Paper;
@ -51,7 +52,7 @@ class Calc
/** @var Base $option */
foreach($this->article->getOptions() as $option) {
if($option instanceof Select) {
if($option instanceof Select || $option instanceof Checkbox) {
/** @var Select\Opt $opt */
foreach($option->getOptions() as $opt) {
if($opt->isValid() && $opt->isSelected()) {
@ -132,6 +133,20 @@ class Calc
$this->engine->setVariable('price', $gesamt);
}
if ($formel != "" && $option->getId() != 'weight' && $option->isAjaxExport() && !$option->isDisplayOnly() && $option->isAmount()) {
$p = 0;
$formel = str_replace("tonumber", '$this->toNumber', $formel);
eval('@$p = ' . $formel . ';');
$this->engine->addAjaxVariable($option->getId(), $p);
}
if ($formel != "" && $option->getId() != 'weight' && !$option->isAjaxExport() && $option->isDisplayOnly() && $option->isAmount()) {
$p = 0;
$formel = str_replace("tonumber", '$this->toNumber', $formel);
eval('@$p = ' . $formel . ';');
$this->engine->addDisplayVariable($option->getId(), $p);
}
if(!$option->isAmount()) {
$p = 0;
$formel = str_replace("tonumber", '$this->toNumber', $formel);

View File

@ -15,6 +15,7 @@ use PSC\Library\Calc\General\Type\Edge;
use PSC\Library\Calc\General\Type\EdgeCollection;
use PSC\Library\Calc\General\Type\EdgeCollectionContainer;
use PSC\Library\Calc\Option\Type\Base;
use PSC\Library\Calc\Option\Type\Checkbox;
use PSC\Library\Calc\Option\Type\PaperDbSelect;
use PSC\Library\Calc\Option\Type\Select;
use PSC\Library\Calc\Tests\Mock\Paper;
@ -53,7 +54,7 @@ class CalcValues
/** @var Base $option */
foreach ($this->article->getOptions() as $option) {
if ($option instanceof Select) {
if ($option instanceof Select || $option instanceof Checkbox) {
/** @var Select\Opt $opt */
foreach ($option->getOptions() as $opt) {
if ($opt->isValid() && $opt->isSelected()) {

View File

@ -7,6 +7,7 @@ use PSC\Library\Calc\General\Type\Edge;
use PSC\Library\Calc\General\Type\EdgeCollection;
use PSC\Library\Calc\General\Type\EdgeCollectionContainer;
use PSC\Library\Calc\Option\Type\Base;
use PSC\Library\Calc\Option\Type\Checkbox;
use PSC\Library\Calc\Option\Type\Select;
class Valid
@ -37,7 +38,7 @@ class Valid
/** @var Base $option */
foreach($this->article->getOptions() as $option) {
if($option instanceof Select) {
if($option instanceof Select|| $option instanceof Checkbox) {
$valid = false;
@ -70,11 +71,20 @@ class Valid
}
}
if($option instanceof Checkbox) {
if (in_array($opt->getId(), $this->engine->getVariables()[$option->getId()])) {
$opt->setIsSelected(true);
} else {
$opt->setIsSelected(false);
}
}else {
if ($this->engine->getVariables()[$option->getId()] == $opt->getId()) {
$opt->setIsSelected(true);
} else {
$opt->setIsSelected(false);
}
}
if($opt->isValid() && !$valid) {
$valid = true;

View File

@ -6,6 +6,7 @@ use PSC\Library\Calc\Calc\Calc;
use PSC\Library\Calc\Calc\CalcValues;
use PSC\Library\Calc\Calc\Valid;
use PSC\Library\Calc\Option\Type\Base;
use PSC\Library\Calc\Option\Type\Checkbox;
use PSC\Library\Calc\Option\Type\PaperDbSelect;
use PSC\Library\Calc\Option\Type\Select\Opt;
use PSC\Library\Calc\Option\Type\Text;
@ -37,6 +38,12 @@ class Engine
/** @var array */
protected $calcVariables = array();
/** @var array */
protected $ajaxVariables = array();
/** @var array */
protected $displayVariables = array();
/** @var float */
protected $price = 0;
@ -230,8 +237,12 @@ class Engine
$option->setSavedCalcValues($this->savedCalcValues);
if(!isset($this->variables[$option->getId()]) && $option->getDefault() !== null && !$option instanceof Text) {
if($option instanceof Checkbox) {
$this->variables[$option->getId()] = explode(",", $option->getDefault());
}else{
$this->variables[$option->getId()] = $option->getDefault();
}
}
if(isset($this->variables[$option->getId()])) {
$option->setRawValue($this->variables[$option->getId()]);
@ -412,4 +423,46 @@ class Engine
{
$this->savedCalcValues = $values;
}
/**
* @return array
*/
public function getAjaxVariables()
{
return $this->ajaxVariables;
}
/**
* @param array $ajaxVariables
*/
public function setAjaxVariables($ajaxVariables)
{
$this->ajaxVariables = $ajaxVariables;
}
public function addAjaxVariable($key, $value)
{
$this->ajaxVariables[$key] = $value;
}
/**
* @return array
*/
public function getDisplayVariables()
{
return $this->displayVariables;
}
/**
* @param array $displayVariables
*/
public function setDisplayVariables($displayVariables)
{
$this->displayVariables = $displayVariables;
}
public function addDisplayVariable($key, $value)
{
$this->displayVariables[$key] = $value;
}
}

View File

@ -359,6 +359,9 @@ class Edge
(preg_match("/^([0-9]+)-$/", trim($val), $regs) && $value >= $regs[1]))) {
return true;
}
if(is_array($value) && in_array($val, $value)) {
return true;
}
}
}

View File

@ -1,6 +1,7 @@
<?php
namespace PSC\Library\Calc\Option;
use PSC\Library\Calc\Option\Parser\Checkbox;
use PSC\Library\Calc\Option\Parser\Hidden;
use PSC\Library\Calc\Option\Parser\Input;
use PSC\Library\Calc\Option\Parser\Radio;
@ -34,6 +35,9 @@ class Parser
case 'radio':
$obj = new Radio($node);
break;
case 'checkbox':
$obj = new Checkbox($node);
break;
case 'text':
$obj = new Text($node);
break;

View File

@ -0,0 +1,48 @@
<?php
namespace PSC\Library\Calc\Option\Parser;
use Doctrine\Common\Persistence\ObjectRepository;
use PSC\Library\Calc\General\Parser\EdgeCollectionContainer;
use PSC\Library\Calc\Option\Parser\Checkbox\Opt;
use PSC\Library\Calc\PaperContainer;
use PSC\Library\Calc\Tests\Mock\Paper;
class Checkbox extends Base
{
protected $element;
/** @var \SimpleXMLElement $node */
protected $node;
public function __construct(\SimpleXMLElement $node)
{
$this->element = new \PSC\Library\Calc\Option\Type\Checkbox();
parent::__construct($node);
}
public function parse()
{
parent::parse();
if(isset($this->node->grenzen) && $this->node->grenzen->children()) {
$edgeCollectionContainerParser = new EdgeCollectionContainer($this->node->grenzen);
$this->element->setEdgesCollectionContainer($edgeCollectionContainerParser->parse());
}
$this->parseModeNormal();
return $this->element;
}
private function parseModeNormal()
{
foreach ($this->node->opt as $opt) {
$optParser = new Opt($opt);
$this->element->addOption($optParser->parse());
}
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace PSC\Library\Calc\Option\Parser\Checkbox;
use PSC\Library\Calc\General\Parser\EdgeCollectionContainer;
use PSC\Library\Calc\Option\Parser\Base;
class Opt
{
protected $element;
public function __construct(\SimpleXMLElement $node)
{
$this->element = new \PSC\Library\Calc\Option\Type\Checkbox\Opt();
$this->node = $node;
}
public function parse()
{
$this->element->setId((string)$this->node['id']);
$this->element->setLabel((string)$this->node['name']);
if($this->node->children()) {
$edgeCollectionContainerParser = new EdgeCollectionContainer($this->node);
$this->element->setEdgesCollectionContainer($edgeCollectionContainerParser->parse());
}
return $this->element;
}
}

View File

@ -0,0 +1,49 @@
<?php
namespace PSC\Library\Calc\Option\Type;
use PSC\Library\Calc\Option\Type\Select\Opt;
class Checkbox extends Base
{
static public $type = 'checkbox';
/** @var \ArrayIterator $options */
protected $options;
public function __construct()
{
parent::__construct();
$this->options = new \ArrayIterator();
}
public function addOption($option)
{
$this->options->append($option);
}
/**
* Verarbeitet das Value
*/
public function processValue()
{
}
/**
* @return \ArrayIterator
*/
public function getOptions()
{
return $this->options;
}
public function getSelectedOptions()
{
/** @var Opt $opt */
foreach($this->getOptions() as $opt) {
if($opt->isSelected()) return $opt;
}
}
}

View File

@ -0,0 +1,112 @@
<?php
namespace PSC\Library\Calc\Option\Type\Checkbox;
use PSC\Library\Calc\General\Type\EdgeCollectionContainer;
use PSC\Library\Calc\Option\Type\Base;
class Opt
{
/** @var string $id */
protected $id;
/** @var string $label */
protected $label;
/** @var EdgeCollectionContainer */
protected $edgesCollectionContainer;
/** @var bool */
protected $isValid = true;
/** @var bool */
protected $isSelected = false;
/**
* Opt constructor.
*/
public function __construct()
{
$this->edgesCollectionContainer = new EdgeCollectionContainer();
}
/**
* @return string
*/
public function getId()
{
return $this->id;
}
/**
* @param string $id
*/
public function setId($id)
{
$this->id = $id;
}
/**
* @return string
*/
public function getLabel()
{
return $this->label;
}
/**
* @param string $label
*/
public function setLabel($label)
{
$this->label = $label;
}
/**
* @return EdgeCollectionContainer
*/
public function getEdgesCollectionContainer()
{
return $this->edgesCollectionContainer;
}
/**
* @param EdgeCollectionContainer $edgesCollectionContainer
*/
public function setEdgesCollectionContainer($edgesCollectionContainer)
{
$this->edgesCollectionContainer = $edgesCollectionContainer;
}
/**
* @return bool
*/
public function isValid()
{
return $this->isValid;
}
/**
* @param bool $isValid
*/
public function setIsValid($isValid)
{
$this->isValid = $isValid;
}
/**
* @return bool
*/
public function isSelected()
{
return $this->isSelected;
}
/**
* @param bool $isSelected
*/
public function setIsSelected($isSelected)
{
$this->isSelected = $isSelected;
}
}

54
tests/Complex/SixTest.php Normal file
View File

@ -0,0 +1,54 @@
<?php
namespace PSC\Library\Calc\Tests\Complex;
use PSC\Library\Calc\Article;
use PSC\Library\Calc\Engine;
use PSC\Library\Calc\PaperContainer;
use PSC\Library\Calc\Tests\Mock\PaperRepostory;
class SixTest extends \PHPUnit_Framework_TestCase
{
/** @var Engine */
protected $engine = null;
public function setUp()
{
$repository = new PaperRepostory();
$paperContainer = new PaperContainer();
$paperContainer->parse(simplexml_load_string(file_get_contents(__DIR__ . '/../TestFiles/Complex2/papierContainer.xml')));
$this->engine = new Engine();
$this->engine->setPaperContainer($paperContainer);
$this->engine->setPaperRepository($repository);
$this->engine->setFormulas(file_get_contents(__DIR__.'/../TestFiles/Complex2/formels.txt'));
$this->engine->setParameters(file_get_contents(__DIR__.'/../TestFiles/Complex2/parameters.txt'));
$this->engine->loadString(file_get_contents(__DIR__ . '/../TestFiles/Complex2/6.xml'));
}
public function tearDown()
{
$this->engine = null;
}
public function testIfArticleCountIsCorrect()
{
$this->assertEquals(1, $this->engine->getArticles()->Count());
}
public function testIfSelectedOptionsCorrect()
{
$this->engine->getPrice();
$this->assertEquals(37500 , $this->engine->getPrice());
}
public function testIfCalcCorrect()
{
$this->engine->setVariable('size', ['a3q','a4q']);
$this->engine->getPrice();
$this->assertEquals(42000 , $this->engine->getPrice());
}
}

View File

@ -39,4 +39,16 @@ class CalcTest extends \PHPUnit_Framework_TestCase
{
$this->assertEquals(10.49 , $this->engine->getPrice());
}
public function testIfDisplayValues()
{
$this->assertEquals(10.49 , $this->engine->getPrice());
$this->assertCount(1 , $this->engine->getDisplayVariables());
}
public function testIfAjaxValues()
{
$this->assertEquals(10.49 , $this->engine->getPrice());
$this->assertCount(1 , $this->engine->getDisplayVariables());
}
}

View File

@ -39,7 +39,14 @@
<!-- Lieferzeit Gesamt DISPLAY -->
<option id="lieferzeit_gesamt_display" name="lieferzeit_gesamt_display" type="Hidden" default="1" displayOnly="1">
<auflage>
<grenze formel="5">-1</grenze>
<grenze formel="5">1-</grenze>
</auflage>
</option>
<!-- Lieferzeit Gesamt DISPLAY -->
<option id="lieferzeit_gesamt_ajax" name="lieferzeit_gesamt_display" type="Hidden" default="1" exportAjax="1">
<auflage>
<grenze formel="5">1-</grenze>
</auflage>
</option>

View File

@ -0,0 +1,23 @@
<?php
namespace PSC\Library\Calc\Tests\Option\Type;
use PSC\Library\Calc\Option\Parser;
use PSC\Library\Calc\Option\Type\Checkbox;
use PSC\Library\Calc\Option\Type\Input;
use PSC\Library\Calc\PaperContainer\Container;
class CheckboxTest extends \PHPUnit_Framework_TestCase
{
public function testIfCorrectType()
{
$parser = new Parser();
/** @var Parser\Checkbox $obj */
$obj = $parser->getOptByType(simplexml_load_string(file_get_contents(__DIR__ . '/../../TestFiles/Option/checkbox.xml')));
/** @var Checkbox $element */
$element = $obj->parse();
$this->assertInstanceOf('PSC\Library\Calc\Option\Type\Checkbox', $element);
}
}

View File

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<kalkulation>
<artikel>
<name>TEST Checkbox</name>
<kommentar/>
<uploads>
<upload id="inhalt" name="Druckdaten" description="Bitte laden sie eine PDF für den Druck hoch"/>
</uploads>
<!-- Beginn der Eingabemaske -->
<option id="auflage" name="Auflage" type="Select" default="1500">
<opt id="500" name="500 Exemplare"></opt>
<opt id="750" name="750 Exemplare"></opt>
<opt id="1000" name="1.000 Exemplare"></opt>
<opt id="1500" name="1.500 Exemplare"></opt>
<opt id="2000" name="2.000 Exemplare"></opt>
<opt id="3000" name="3.000 Exemplare"></opt>
<opt id="5000" name="5.000 Exemplare"></opt>
<opt id="7500" name="7.500 Exemplare"></opt>
<opt id="10000" name="10.000 Exemplare"></opt>
<opt id="12500" name="12.500 Exemplare"></opt>
<opt id="15000" name="15.000 Exemplare"></opt>
<opt id="20000" name="20.000 Exemplare"></opt>
<opt id="30000" name="30.000 Exemplare"></opt>
<opt id="40000" name="40.000 Exemplare"></opt>
<opt id="50000" name="50.000 Exemplare"></opt>
<opt id="100000" name="100.000 Exemplare"></opt>
</option>
<option id="size" name="Wählen Sie eine Größe" type="Checkbox" width="3" default="a4h,a4q" require="true">
<opt id="a5h" name="DIN A5 Hochformat (210x148mm)"></opt>
<opt id="a5q" name="DIN A5 Querformat (148x210mm)"></opt>
<opt id="a4h" name="DIN A4 Hochformat (297 x 210 mm)"></opt>
<opt id="a4q" name="DIN A4 Querformat (210x297mm)"></opt>
<opt id="a3h" name="DIN A3 Hochformat (420x297mm)"></opt>
<opt id="a3q" name="DIN A3 Querformat (297x420mm)"></opt>
</option>
<option id="calc" name="Calc" type="Hidden">
<size>
<grenze formel="$Vauflage$V*10">a5h</grenze>
<grenze formel="$Vauflage$V*12">a5q,a4h</grenze>
<grenze formel="$Vauflage$V*13">a4q,a3h</grenze>
<grenze formel="$Vauflage$V*15">a3q</grenze>
</size>
</option>
</artikel>
</kalkulation>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<option id="size" name="Wählen Sie eine Größe" type="Checkbox" width="3" default="a4h,a4q" require="true" help="Wählen Sie eine Größe">
<opt id="a5h" name="DIN A5 Hochformat (210x148mm)"></opt>
<opt id="a5q" name="DIN A5 Querformat (148x210mm)"></opt>
<opt id="a4h" name="DIN A4 Hochformat (297 x 210 mm)"></opt>
<opt id="a4q" name="DIN A4 Querformat (210x297mm)"></opt>
<opt id="a3h" name="DIN A3 Hochformat (420x297mm)"></opt>
<opt id="a3q" name="DIN A3 Querformat (297x420mm)"></opt>
</option>