This commit is contained in:
DESKTOP-E17406D\boonkerz 2023-06-19 16:42:00 +02:00
parent 70f6ccd51d
commit 65e6e9699d
11 changed files with 198 additions and 26 deletions

File diff suppressed because one or more lines are too long

View File

@ -13,7 +13,7 @@
} }
}, },
"require": { "require": {
"php": ">=7.0", "php": ">=7.1",
"doctrine/orm": "^2.5", "doctrine/orm": "^2.5",
"azuyalabs/yasumi": "^2.5" "azuyalabs/yasumi": "^2.5"
}, },

View File

@ -163,28 +163,44 @@ class Valid
*/ */
private function edgeIsValid($section, $edge) private function edgeIsValid($section, $edge)
{ {
$valid = false;
$skipTests = false;
if(!isset($this->engine->getVariables()[$section])) { if(!isset($this->engine->getVariables()[$section])) {
return false; $skipTests = true;
} }
if($edge->isRegion() && if(!$skipTests && !$valid && $edge->isRegion() &&
$edge->getFrom() <= $this->engine->getVariables()[$section] && $edge->getFrom() <= $this->engine->getVariables()[$section] &&
$edge->getTo() >= $this->engine->getVariables()[$section]) { $edge->getTo() >= $this->engine->getVariables()[$section]) {
return true; $valid = true;
} }
if($edge->isRegion() && if(!$skipTests && !$valid && $edge->isRegion() &&
$edge->getFrom() <= $this->engine->getVariables()[$section] && $edge->getFrom() <= $this->engine->getVariables()[$section] &&
$edge->getTo() == 0) { $edge->getTo() == 0) {
return true; $valid = true;
} }
if(!$edge->isRegion() && in_array($this->engine->getVariables()[$section], $edge->getValues())) { if(!$skipTests && !$valid && !$edge->isRegion() && in_array($this->engine->getVariables()[$section], $edge->getValues())) {
return true; $valid = true;
} }
return false; if(!$skipTests && $valid && $edge->getEdgesCollectionContainer()->count()) {
$valid = false;
/** @var EdgeCollection $collection */
foreach($edge->getEdgesCollectionContainer() as $collection) {
foreach($collection as $subEdge) {
if(!$valid) {
$valid = $this->edgeIsValid($collection->getName(), $subEdge);
}
}
}
}
return $valid;
} }
/** /**

View File

@ -70,29 +70,32 @@ class Edge
} }
if (isset($this->node->attributes()->value) && $this->node->children()) { if (isset($this->node->attributes()->value) && $this->node->children()) {
$edge->setValues(explode(",", trim((string) $this->node->attributes()->value))); $this->parseCondition($edge, trim((string) $this->node->attributes()->value));
if ($this->node->children()) { if ($this->node->children()) {
$edgeCollectionContainerParser = new EdgeCollectionContainer($this->node); $edgeCollectionContainerParser = new EdgeCollectionContainer($this->node);
$edge->setEdgesCollectionContainer($edgeCollectionContainerParser->parse()); $edge->setEdgesCollectionContainer($edgeCollectionContainerParser->parse());
} }
} else { } else {
$this->parseCondition($edge, trim((string) $this->node));
$value = (string) $this->node;
if (preg_match("/^([0-9a-zA-Z_]+)$/", trim($value), $regs)) {
$edge->setValues([$regs[1]]);
} elseif (preg_match("/^([0-9]+)-([0-9]+)$/", trim($value), $regs)) {
$edge->setRegion(true);
$edge->setFrom(intval($regs[1]));
$edge->setTo(intval($regs[2]));
} elseif (preg_match("/^([0-9]+)-$/", trim($value), $regs)) {
$edge->setRegion(true);
$edge->setFrom(intval($regs[1]));
} elseif (strpos(trim($value), ",") !== false) {
$values = explode(",", trim($value));
$edge->setValues($values);
}
} }
return $edge; return $edge;
} }
private function parseCondition(\PSC\Library\Calc\General\Type\Edge $edge, string $condition): void
{
if (preg_match("/^([0-9a-zA-Z_]+)$/", trim($condition), $regs)) {
$edge->setValues([$regs[1]]);
} elseif (preg_match("/^([0-9]+)-([0-9]+)$/", trim($condition), $regs)) {
$edge->setRegion(true);
$edge->setFrom(intval($regs[1]));
$edge->setTo(intval($regs[2]));
} elseif (preg_match("/^([0-9]+)-$/", trim($condition), $regs)) {
$edge->setRegion(true);
$edge->setFrom(intval($regs[1]));
} elseif (strpos(trim($condition), ",") !== false) {
$values = explode(",", trim($condition));
$edge->setValues($values);
}
}
} }

View File

@ -0,0 +1,73 @@
<?php
namespace PSC\Library\Calc\Tests\Customer\AA;
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 testAuflageBelow100(): void
{
$this->assertEquals("ohne" , $this->engine->getArticle()->getOptionById('druckfarbe')->getRawValue());
$this->assertEquals("ohne" , $this->engine->getArticle()->getOptionById('druckart')->getRawValue());
}
public function testAuflageBelow100AndMaterial160(): void
{
$this->engine->setVariable('auflage', 99);
$this->engine->setVariable('material', 160);
$this->engine->calc();
$this->assertEquals("schwarz" , $this->engine->getArticle()->getOptionById('druckfarbe')->getRawValue());
/** @var Select $option */
$option = $this->engine->getArticle()->getOptionById('druckart');
$this->assertEquals("einseitig" , $option->getRawValue());
$this->assertCount(2, $option->getValidOptions());
}
public function testAuflageBelow100AndMaterial250(): void
{
$this->engine->setVariable('auflage', 140);
$this->engine->calc();
$this->assertEquals("ohne" , $this->engine->getArticle()->getOptionById('druckfarbe')->getRawValue());
/** @var Select $option */
$option = $this->engine->getArticle()->getOptionById('druckart');
$this->assertEquals("ohne" , $option->getRawValue());
$this->assertCount(1, $option->getValidOptions());
}
}

View File

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<kalkulation>
<artikel>
<name>Drahtspiralbindung</name>
<kommentar></kommentar>
<uploads>
<upload id="inhalt" name="Druckdaten" description="Bitte laden Sie eine PDF für den Inhalt hoch"></upload>
</uploads>
<!-- Eingabemaske -->
<option id="lieferdatum" name="Lieferdatum" type="Input" width="5" default="" help="Tragen Sie hier bitte das gewünschte Lieferdatum ein." require="true"></option>
<option id="kostenstelle" name="Kostenstelle" type="Select" width="5" default="kst1">
<opt id="kst1" name="Kst 1"/>
</option>
<option id="arbeitstitel" name="Arbeitstitel" type="Input" width="5" default="" help="Geben Sie den Arbeitstitel ein." pattern="[A-Za-z0-9\s]+" errorMessage="Bitte verwenden Sie nur alphanumerische Zeichen."></option>
<option id="auflage" name="Auflage" type="Input" width="5" default="5" min="5" max="250" pattern="[0-9]+" errorMessage="Bitte geben Sie eine Zahl zwischen 5 und 250 ein."></option>
<option id="material" name="Material" type="Select" width="5" default="ohne" onChange="updateFields()">
<opt id="ohne" name="Ohne"/>
<opt id="160" name="160 g/m²"/>
<opt id="250" name="250 g/m²"/>
</option>
<option id="druckfarbe" name="Druckfarbe" type="Select" width="5" default="ohne">
<opt id="ohne" name="Ohne">
<material>
<grenze>ohne</grenze>
</material>
</opt>
<opt id="schwarz" name="Schwarz">
<material>
<grenze>160,250</grenze>
</material>
</opt>
</option>
<option id="druckart" name="Druckart" type="Select" width="5" default="ohne">
<opt id="ohne" name="Ohne">
<material>
<grenze>ohne</grenze>
</material>
</opt>
<opt id="einseitig" name="Einseitig">
<material>
<grenze>160,250</grenze>
</material>
</opt>
<opt id="zweiseitig" name="Zweiseitig">
<auflage>
<grenze value="1-99">
<material>
<grenze>160,250</grenze>
</material>
</grenze>
<grenze value="100-">
<material>
<grenze>160</grenze>
</material>
</grenze>
</auflage>
</opt>
</option>
</artikel>
<!-- Weitere Kalkulationselemente hier einfügen -->
</kalkulation>

View File

@ -0,0 +1,3 @@
<root>
</root>

View File

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<container>
</container>

View File

View File

@ -7,6 +7,8 @@
<upload id="neutral" name="Druckdaten" description="Bitte laden sie eine PDF für den Druck hoch"/> <upload id="neutral" name="Druckdaten" description="Bitte laden sie eine PDF für den Druck hoch"/>
</uploads> </uploads>
<option id="auflage" name="auflage" type="Input" default="1"></option>
// EINGABE ******************************************************************************* // EINGABE *******************************************************************************
<option id="kalender_typ2" name="Bitte senden Sie mir folgende Muster-Kalender:" type="Checkbox" default="1,2"> <option id="kalender_typ2" name="Bitte senden Sie mir folgende Muster-Kalender:" type="Checkbox" default="1,2">