Fix Calc
This commit is contained in:
parent
65e6e9699d
commit
fbac716321
File diff suppressed because one or more lines are too long
@ -13,7 +13,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=7.1",
|
"php": ">=8.1",
|
||||||
"doctrine/orm": "^2.5",
|
"doctrine/orm": "^2.5",
|
||||||
"azuyalabs/yasumi": "^2.5"
|
"azuyalabs/yasumi": "^2.5"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -112,17 +112,21 @@ class Article
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return \ArrayIterator
|
|
||||||
*/
|
|
||||||
public function getOptions()
|
public function getOptions()
|
||||||
{
|
{
|
||||||
return $this->options;
|
return $this->options;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public function clearOptions(): void
|
||||||
* @return array
|
{
|
||||||
*/
|
$this->options = new \ArrayIterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setOptions(array $options): void
|
||||||
|
{
|
||||||
|
$this->options = new \ArrayIterator($options);
|
||||||
|
}
|
||||||
|
|
||||||
public function getValidOptions()
|
public function getValidOptions()
|
||||||
{
|
{
|
||||||
$temp = array();
|
$temp = array();
|
||||||
|
|||||||
@ -100,7 +100,7 @@ class Valid
|
|||||||
}
|
}
|
||||||
|
|
||||||
}else {
|
}else {
|
||||||
if ($this->engine->getVariables()[$option->getId()] == $opt->getId()) {
|
if (isset($this->engine->getVariables()[$option->getId()]) && $this->engine->getVariables()[$option->getId()] == $opt->getId()) {
|
||||||
if(!$opt->isValid()) {
|
if(!$opt->isValid()) {
|
||||||
$nextShouldBeValid = true;
|
$nextShouldBeValid = true;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -283,29 +283,27 @@ class Engine
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if Option is valid
|
$this->processCalc();
|
||||||
$calcValid = new Valid($this, $this->article);
|
|
||||||
$calcValid->perform();
|
|
||||||
|
|
||||||
// CALC Values
|
$switchedOptions = $this->checkDoubleOptions();
|
||||||
$calcValues = new CalcValues($this, $this->article);
|
if(count($switchedOptions) > 0) {
|
||||||
$calcValues->calc();
|
foreach($switchedOptions as $option) {
|
||||||
|
if($option->getDefault() !== null && !$option instanceof Text) {
|
||||||
|
if($option instanceof Checkbox) {
|
||||||
|
$this->variables[$option->getId()] = explode(",", $option->getDefault());
|
||||||
|
}else{
|
||||||
|
$this->variables[$option->getId()] = $option->getDefault();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Check if Option is valid
|
if(isset($this->variables[$option->getId()])) {
|
||||||
$calcValid = new Valid($this, $this->article);
|
$option->setRawValue($this->variables[$option->getId()]);
|
||||||
$calcValid->perform();
|
$option->processValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// CALC Values
|
$this->processCalc();
|
||||||
$calcValues = new CalcValues($this, $this->article);
|
}
|
||||||
$calcValues->calc();
|
|
||||||
|
|
||||||
// Check if Option is valid
|
|
||||||
$calcValid = new Valid($this, $this->article);
|
|
||||||
$calcValid->perform(true);
|
|
||||||
|
|
||||||
// CALC Formel
|
|
||||||
$calcFormel = new Calc($this, $this->article);
|
|
||||||
$this->price = $calcFormel->calc();
|
|
||||||
|
|
||||||
$this->dirty = false;
|
$this->dirty = false;
|
||||||
return true;
|
return true;
|
||||||
@ -578,4 +576,59 @@ class Engine
|
|||||||
}
|
}
|
||||||
return $this->weightSingle;
|
return $this->weightSingle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function checkDoubleOptions(): array
|
||||||
|
{
|
||||||
|
|
||||||
|
$options = [];
|
||||||
|
$switchedOptions = [];
|
||||||
|
/** @var Base $option */
|
||||||
|
foreach($this->article->getOptions() as $option) {
|
||||||
|
if($option->isValid()) {
|
||||||
|
$options[] = $option;
|
||||||
|
}else{
|
||||||
|
$foundValid = array_filter($this->article->getOptions()->getArrayCopy(), function(Base $elm) use ($option) {
|
||||||
|
if($elm->getId() == $option->getId() && $elm->isValid()) {
|
||||||
|
return $elm;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if(count($foundValid) == 0) {
|
||||||
|
$options[] = $option;
|
||||||
|
}else{
|
||||||
|
$switchedOptions[] = array_shift($foundValid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->article->setOptions($options);
|
||||||
|
return $switchedOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function processCalc(): void
|
||||||
|
{
|
||||||
|
// Check if Option is valid
|
||||||
|
$calcValid = new Valid($this, $this->article);
|
||||||
|
$calcValid->perform();
|
||||||
|
|
||||||
|
// CALC Values
|
||||||
|
$calcValues = new CalcValues($this, $this->article);
|
||||||
|
$calcValues->calc();
|
||||||
|
|
||||||
|
// Check if Option is valid
|
||||||
|
$calcValid = new Valid($this, $this->article);
|
||||||
|
$calcValid->perform();
|
||||||
|
|
||||||
|
// CALC Values
|
||||||
|
$calcValues = new CalcValues($this, $this->article);
|
||||||
|
$calcValues->calc();
|
||||||
|
|
||||||
|
// Check if Option is valid
|
||||||
|
$calcValid = new Valid($this, $this->article);
|
||||||
|
$calcValid->perform(true);
|
||||||
|
|
||||||
|
// CALC Formel
|
||||||
|
$calcFormel = new Calc($this, $this->article);
|
||||||
|
$this->price = $calcFormel->calc();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,6 +25,9 @@ class Base
|
|||||||
if(isset($this->node['require'])) {
|
if(isset($this->node['require'])) {
|
||||||
$this->element->setRequire($this->getBoolean($this->node['require']));
|
$this->element->setRequire($this->getBoolean($this->node['require']));
|
||||||
}
|
}
|
||||||
|
if(isset($this->node['required'])) {
|
||||||
|
$this->element->setRequire($this->getBoolean($this->node['required']));
|
||||||
|
}
|
||||||
if(isset($this->node['help'])) {
|
if(isset($this->node['help'])) {
|
||||||
$this->element->setHelp((string)$this->node['help']);
|
$this->element->setHelp((string)$this->node['help']);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,6 +26,13 @@ class Input extends Base
|
|||||||
$this->element->setMaxValue((int)$this->node['max']);
|
$this->element->setMaxValue((int)$this->node['max']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(isset($this->node['pattern'])) {
|
||||||
|
$this->element->setPattern((string)$this->node['pattern']);
|
||||||
|
}
|
||||||
|
if(isset($this->node['placeholder'])) {
|
||||||
|
$this->element->setPlaceHolder((string)$this->node['placeholder']);
|
||||||
|
}
|
||||||
|
|
||||||
if($this->node->children()) {
|
if($this->node->children()) {
|
||||||
$edgeCollectionContainerParser = new EdgeCollectionContainer($this->node);
|
$edgeCollectionContainerParser = new EdgeCollectionContainer($this->node);
|
||||||
$this->element->setEdgesCollectionContainer($edgeCollectionContainerParser->parse());
|
$this->element->setEdgesCollectionContainer($edgeCollectionContainerParser->parse());
|
||||||
|
|||||||
@ -7,6 +7,10 @@ class Input extends Base
|
|||||||
|
|
||||||
private ?int $maxValue = null;
|
private ?int $maxValue = null;
|
||||||
|
|
||||||
|
private string $pattern = "";
|
||||||
|
|
||||||
|
private string $placeHolder = "";
|
||||||
|
|
||||||
public $type = 'input';
|
public $type = 'input';
|
||||||
|
|
||||||
public function setMinValue(?int $min): void
|
public function setMinValue(?int $min): void
|
||||||
@ -28,4 +32,24 @@ class Input extends Base
|
|||||||
{
|
{
|
||||||
return $this->maxValue;
|
return $this->maxValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getPattern(): string
|
||||||
|
{
|
||||||
|
return $this->pattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPattern(string $pattern): void
|
||||||
|
{
|
||||||
|
$this->pattern = $pattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPlaceHolder(): string
|
||||||
|
{
|
||||||
|
return $this->placeHolder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPlaceHolder(string $placeHolder): void
|
||||||
|
{
|
||||||
|
$this->placeHolder = $placeHolder;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
69
tests/Customer/BB/CalcTest.php
Normal file
69
tests/Customer/BB/CalcTest.php
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
<?php
|
||||||
|
namespace PSC\Library\Calc\Tests\Customer\BB;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use PSC\Library\Calc\Article;
|
||||||
|
use PSC\Library\Calc\Engine;
|
||||||
|
use PSC\Library\Calc\Option\Type\Select;
|
||||||
|
use PSC\Library\Calc\PaperContainer;
|
||||||
|
use PSC\Library\Calc\Tests\Mock\PaperRepostory;
|
||||||
|
|
||||||
|
class CalcTest extends TestCase
|
||||||
|
{
|
||||||
|
|
||||||
|
/** @var Engine */
|
||||||
|
protected $engine = null;
|
||||||
|
|
||||||
|
public function setUp(): void
|
||||||
|
{
|
||||||
|
$repository = new PaperRepostory();
|
||||||
|
|
||||||
|
$paperContainer = new PaperContainer();
|
||||||
|
$paperContainer->parse(simplexml_load_string(file_get_contents(__DIR__ . '/papierContainer.xml')));
|
||||||
|
|
||||||
|
$this->engine = new Engine();
|
||||||
|
$this->engine->setPaperContainer($paperContainer);
|
||||||
|
$this->engine->setPaperRepository($repository);
|
||||||
|
$this->engine->setFormulas(file_get_contents(__DIR__ . '/formels.txt'));
|
||||||
|
$this->engine->setParameters(file_get_contents(__DIR__ . '/parameters.txt'));
|
||||||
|
$this->engine->setTemplates(file_get_contents(__DIR__ . '/calcTemplates.xml'));
|
||||||
|
|
||||||
|
$this->engine->loadString(file_get_contents(__DIR__ . '/calc.xml'));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tearDown(): void
|
||||||
|
{
|
||||||
|
$this->engine = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testPattern(): void
|
||||||
|
{
|
||||||
|
$this->engine->calc();
|
||||||
|
$this->assertEquals("[0-9]+", $this->engine->getArticle()->getOptionById('format1')->getPattern());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testPlaceHolder(): void
|
||||||
|
{
|
||||||
|
$this->engine->calc();
|
||||||
|
$this->assertEquals("Platzhalter", $this->engine->getArticle()->getOptionById('betreff')->getPlaceHolder());
|
||||||
|
$this->assertTrue($this->engine->getArticle()->getOptionById('betreff')->isRequire());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testFormat1(): void
|
||||||
|
{
|
||||||
|
$this->engine->calc();
|
||||||
|
$this->assertEquals(5 , $this->engine->getArticle()->getOptionById('format1')->getRawValue());
|
||||||
|
$this->assertTrue($this->engine->getArticle()->getOptionById('format1')->isValid());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testFormat2(): void
|
||||||
|
{
|
||||||
|
$this->engine->setVariable('auflage', 210);
|
||||||
|
$this->engine->calc();
|
||||||
|
$this->assertTrue($this->engine->getArticle()->getOptionById('format1')->isValid());
|
||||||
|
$this->assertEquals(50, $this->engine->getArticle()->getOptionById('format1')->getRawValue());
|
||||||
|
$this->assertEquals("format2" , $this->engine->getArticle()->getOptionById('format1')->getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
32
tests/Customer/BB/calc.xml
Normal file
32
tests/Customer/BB/calc.xml
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<kalkulation>
|
||||||
|
<artikel>
|
||||||
|
<name>Drahtspiralbindung</name>
|
||||||
|
<kommentar></kommentar>
|
||||||
|
|
||||||
|
<option id="auflage" name="Auflage" type="Input" default="100"></option>
|
||||||
|
|
||||||
|
<option id="betreff" name="Betreff" type="Input" required="1" placeholder="Platzhalter"></option>
|
||||||
|
|
||||||
|
<option id="test_select_req" name="Test Select Req" type="Select" required="1" empty_text="Bitte auswählen">
|
||||||
|
<opt id="2" label="Auswahl 2"></opt>
|
||||||
|
<opt id="3" label="Value 3"></opt>
|
||||||
|
</option>
|
||||||
|
|
||||||
|
<option id="format1" name="format1" type="Input" default="5" pattern="[0-9]+">
|
||||||
|
<auflage>
|
||||||
|
<grenze>1-200</grenze>
|
||||||
|
</auflage>
|
||||||
|
</option>
|
||||||
|
<option id="format1" name="format2" type="Input" default="50">
|
||||||
|
<auflage>
|
||||||
|
<grenze>201-</grenze>
|
||||||
|
</auflage>
|
||||||
|
</option>
|
||||||
|
|
||||||
|
|
||||||
|
</artikel>
|
||||||
|
|
||||||
|
<!-- Weitere Kalkulationselemente hier einfügen -->
|
||||||
|
|
||||||
|
</kalkulation>
|
||||||
3
tests/Customer/BB/calcTemplates.xml
Normal file
3
tests/Customer/BB/calcTemplates.xml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<root>
|
||||||
|
|
||||||
|
</root>
|
||||||
0
tests/Customer/BB/formels.txt
Normal file
0
tests/Customer/BB/formels.txt
Normal file
4
tests/Customer/BB/papierContainer.xml
Normal file
4
tests/Customer/BB/papierContainer.xml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<container>
|
||||||
|
|
||||||
|
</container>
|
||||||
0
tests/Customer/BB/parameters.txt
Normal file
0
tests/Customer/BB/parameters.txt
Normal file
Loading…
Reference in New Issue
Block a user