Initial xentral_oss_20.3.c9ffacf

This commit is contained in:
Alex
2021-05-21 08:49:41 +02:00
parent 5406e4a551
commit 34e5ac43d9
18884 changed files with 2109867 additions and 0 deletions
@@ -0,0 +1,223 @@
<?php
declare(strict_types=1);
namespace Xentral\Modules\MandatoryFields\Service;
use Xentral\Components\Database\Database;
use Xentral\Modules\MandatoryFields\Data\MandatoryFieldData;
use Xentral\Modules\MandatoryFields\Exception\MandatoryFieldNotFoundException;
final class MandatoryFieldsGateway
{
/** @var Database $db */
private $db;
/**
* @param Database $db
*/
public function __construct(Database $db)
{
$this->db = $db;
}
/**
* @param string $module
* @param string $action
* @param string $fieldId
* @param string $type
*
* @return MandatoryFieldData|null
*/
public function getMandatoryFieldByParameters(
string $module,
string $action,
string $fieldId,
string $type
): ?MandatoryFieldData {
$sql =
'SELECT
`id`,
`module`,
`action`,
`field_id`,
`error_message`,
`type`,
`min_length`,
`max_length`,
`mandatory`,
`comparator`,
`compareto`
FROM `mandatory_field` AS `m`
WHERE m.module = :module
AND m.action = :action
AND m.type = :type
AND m.field_id = :field_id
LIMIT 1';
$values = [
'module' => $module,
'action' => $action,
'field_id' => $fieldId,
'type' => $type,
];
$data = $this->db->fetchRow($sql, $values);
if (!empty($data)) {
return MandatoryFieldData::fromDbState($data);
}
return null;
}
/**
* @param int $mandatoryFieldId
*
* @throws MandatoryFieldNotFoundException
*
* @return MandatoryFieldData
*/
public function getById(int $mandatoryFieldId): MandatoryFieldData
{
$sql =
'SELECT
`id`,
`module`,
`action`,
`field_id`,
`error_message`,
`type`,
`min_length`,
`max_length`,
`mandatory`,
`comparator`,
`compareto`
FROM `mandatory_field` AS `m`
WHERE m.id = :id
LIMIT 1';
$values = [
'id' => $mandatoryFieldId,
];
$data = $this->db->fetchRow($sql, $values);
if (empty($data)) {
throw new MandatoryFieldNotFoundException('No mandatory field record with the id:' . $mandatoryFieldId);
}
return MandatoryFieldData::fromDbState($data);
}
/**
* @param string $customernumber
*
* @return bool
*/
public function isAddressWithCustomerNumberActive(string $customerNumber): bool
{
$sql =
'SELECT a.id
FROM `adresse` AS `a`
WHERE a.kundennummer = :customer_number
AND a.kundennummer != \'\'
AND a.geloescht != 1';
$data = $this->db->fetchRow($sql, ['customer_number' => $customerNumber]);
if (empty($data)) {
return false;
}
return true;
}
/**
* @param string $employeeNumber
*
* @return bool
*/
public function isAddressWithEmployeeNumberActive(string $employeeNumber): bool
{
$sql =
'SELECT a.id
FROM `adresse` AS `a`
WHERE a.mitarbeiternummer = :employee_number
AND a.mitarbeiternummer != \'\'
AND a.geloescht != 1';
$data = $this->db->fetchRow($sql, ['employee_number' => $employeeNumber]);
if (empty($data)) {
return false;
}
return true;
}
/**
* @param string $articleNumber
*
* @return bool
*/
public function isArticleWithNumberActive(string $articleNumber): bool
{
$sql =
'SELECT a.id
FROM `artikel` AS `a`
WHERE a.nummer = :article_number
AND a.nummer != \'\'
AND a.geloescht != 1 ';
$data = $this->db->fetchRow($sql, ['article_number' => $articleNumber]);
if (empty($data)) {
return false;
}
return true;
}
/**
* @param string $documentNumber
*
* @return bool
*/
public function isOrderWithDocumentNumberActive(string $documentNumber): bool
{
$sql =
'SELECT a.id
FROM `auftrag` AS `a`
WHERE a.belegnr = :document_number';
$data = $this->db->fetchRow($sql, ['document_number' => $documentNumber]);
if (empty($data)) {
return false;
}
return true;
}
/**
* @param string $documentNumber
*
* @return bool
*/
public function isInvoiceWithDocumentNumberActive(string $documentNumber): bool
{
$sql =
'SELECT r.id
FROM `rechnung` AS `r`
WHERE r.belegnr = :document_number';
$data = $this->db->fetchRow($sql, ['document_number' => $documentNumber]);
if (empty($data)) {
return false;
}
return true;
}
}
@@ -0,0 +1,141 @@
<?php
declare(strict_types=1);
namespace Xentral\Modules\MandatoryFields\Service;
use Xentral\Components\Database\Database;
use Xentral\Modules\MandatoryFields\Data\MandatoryFieldData;
use Xentral\Modules\MandatoryFields\Exception\MandatoryFieldNotFoundException;
use Xentral\Modules\MandatoryFields\Exception\RuntimeException;
final class MandatoryFieldsService
{
/** @var Database $db */
private $db;
/**
* @param Database $db
*/
public function __construct(Database $db)
{
$this->db = $db;
}
/**
* @param MandatoryFieldData $mandatoryField
*
* @return int
*/
public function create(MandatoryFieldData $mandatoryField): int
{
$sql =
'INSERT INTO `mandatory_field` (
`module`,
`action`,
`field_id`,
`error_message`,
`type`,
`min_length`,
`max_length`,
`mandatory`,
`comparator`,
`compareto`
)
VALUES (
:module,
:action,
:field_id,
:error_message,
:type,
:min_length,
:max_length,
:mandatory,
:comparator,
:compare_to
)';
$values = [
'module' => $mandatoryField->getModule(),
'action' => $mandatoryField->getAction(),
'field_id' => $mandatoryField->getFieldId(),
'error_message' => $mandatoryField->getErrorMessage(),
'type' => $mandatoryField->getType(),
'min_length' => $mandatoryField->getMinLength(),
'max_length' => $mandatoryField->getMaxLength(),
'mandatory' => $mandatoryField->isMandatory(),
'comparator' => $mandatoryField->getComparator(),
'compare_to' => $mandatoryField->getCompareto(),
];
$this->db->perform($sql, $values);
return $this->db->lastInsertId();
}
/**
* @param MandatoryFieldData $mandatoryField
*
* @throws MandatoryFieldNotFoundException
*/
public function edit(MandatoryFieldData $mandatoryField): void
{
$sql = 'SELECT m.id FROM `mandatory_field` AS `m` WHERE m.id = :id';
$data = $this->db->fetchRow($sql, ['id' => $mandatoryField->getId()]);
if (empty($data)) {
throw new MandatoryFieldNotFoundException('The record can not be edited: ' . $mandatoryField->getId());
}
$sql =
'UPDATE `mandatory_field` SET
`module` = :module,
`action` = :action,
`field_id` = :field_id,
`error_message` = :error_message,
`type` = :type,
`min_length` = :min_length,
`max_length` = :max_length,
`mandatory` = :mandatory,
`comparator` = :comparator,
`compareto` = :compare_to
WHERE `id` = :id';
$values = [
'id' => $mandatoryField->getId(),
'module' => $mandatoryField->getModule(),
'action' => $mandatoryField->getAction(),
'field_id' => $mandatoryField->getFieldId(),
'error_message' => $mandatoryField->getErrorMessage(),
'type' => $mandatoryField->getType(),
'min_length' => $mandatoryField->getMinLength(),
'max_length' => $mandatoryField->getMaxLength(),
'mandatory' => $mandatoryField->isMandatory(),
'comparator' => $mandatoryField->getComparator(),
'compare_to' => $mandatoryField->getCompareto(),
];
$this->db->perform($sql, $values);
}
/**
* @param int $mandatoryFieldId
*
* @throws MandatoryFieldNotFoundException
*/
public function removeById(int $mandatoryFieldId): void
{
$sql = 'SELECT m.id FROM `mandatory_field` AS `m` WHERE m.id = :id';
$data = $this->db->fetchRow($sql, ['id' => $mandatoryFieldId]);
if (empty($data)) {
throw new MandatoryFieldNotFoundException('The Id does not exist: ' . $mandatoryFieldId);
}
$sql = 'DELETE FROM `mandatory_field` WHERE `id` = :id';
$numAffected = (int)$this->db->fetchAffected($sql, ['id' => $mandatoryFieldId]);
if ($numAffected === 0) {
throw new RuntimeException('Mandatory field could not be deleted, id: ' . $mandatoryFieldId);
}
}
}
@@ -0,0 +1,323 @@
<?php
declare(strict_types=1);
namespace Xentral\Modules\MandatoryFields\Service;
use Xentral\Modules\MandatoryFields\Data\MandatoryFieldData;
use Xentral\Modules\MandatoryFields\Data\ValidatorResultData;
use Xentral\Modules\MandatoryFields\Exception\MandatoryFieldNotFoundException;
use Xentral\Modules\MandatoryFields\Exception\UnknownTypeException;
final class MandatoryFieldsValidator
{
/** @var MandatoryFieldsGateway $gateway */
private $gateway;
/**
* @param MandatoryFieldsGateway $gateway
*/
public function __construct(
MandatoryFieldsGateway $gateway
) {
$this->gateway = $gateway;
}
/**
* @param string $type
* @param string $value
* @param int $mandatoryFieldId
*
* @throws UnknownTypeException
* @throws MandatoryFieldNotFoundException
*
* @return ValidatorResultData
*/
public function validate(string $type, string $value, int $mandatoryFieldId): ValidatorResultData
{
$mandatoryField = $this->gateway->getById($mandatoryFieldId);
if ($mandatoryField->isMandatory() || (!$mandatoryField->isMandatory() && $value != '')) {
switch ($type) {
case 'kunde':
$result = $this->checkCustomer($value);
break;
case 'mitarbeiter':
$result = $this->checkEmployee($value);
break;
case 'artikel':
$result = $this->checkArticle($value);
break;
case 'rechnung':
$result = $this->checkInvoice($value);
break;
case 'auftrag':
$result = $this->checkOrder($value);
break;
case 'text':
$result = $this->checkText($value, $mandatoryField);
break;
case 'ganzzahl':
$result = $this->checkInteger($value, $mandatoryField);
break;
case 'dezimalzahl':
$result = $this->checkDecimal($value, $mandatoryField);
break;
case 'datum':
$result = $this->checkDate($value);
break;
case 'e-mail':
$result = $this->checkEmail($value);
break;
default:
throw new UnknownTypeException('Type not known: ' . $type);
}
$error = $result['error'];
$message = $result['default'];
if (!empty($mandatoryField->getErrorMessage())) {
$message = $mandatoryField->getErrorMessage();
}
return new ValidatorResultData($error, $message);
}
return new ValidatorResultData(false, '');
}
/**
* @param string $value
*
* @return array
*/
private function checkCustomer(string $value): array
{
$data['default'] = '';
$data['error'] = false;
if (!$this->gateway->isAddressWithCustomerNumberActive($value)) {
$data['default'] = 'Kunde nicht gültig.';
$data['error'] = true;
}
return $data;
}
/**
* @param string $value
*
* @return array
*/
private function checkEmployee(string $value): array
{
$data['default'] = '';
$data['error'] = false;
if (!$this->gateway->isAddressWithEmployeeNumberActive($value)) {
$data['default'] = 'Mitarbeiter nicht gültig.';
$data['error'] = true;
}
return $data;
}
/**
* @param string $value
*
* @return array
*/
private function checkArticle(string $value): array
{
$data['default'] = '';
$data['error'] = false;
if (!$this->gateway->isArticleWithNumberActive($value)) {
$data['default'] = 'Artikel-Nr. nicht gültig.';
$data['error'] = true;
}
return $data;
}
/**
* @param string $value
*
* @return array
*/
private function checkInvoice(string $value): array
{
$data['default'] = '';
$data['error'] = false;
if (!$this->gateway->isInvoiceWithDocumentNumberActive($value)) {
$data['default'] = 'Rechnungs-Nr. nicht gültig.';
$data['error'] = true;
}
return $data;
}
/**
* @param string $value
*
* @return array
*/
private function checkOrder(string $value): array
{
$data['default'] = '';
$data['error'] = false;
if (!$this->gateway->isOrderWithDocumentNumberActive($value)) {
$data['default'] = 'Auftrags-Nr. nicht gültig.';
$data['error'] = true;
}
return $data;
}
/**
* @param string $value
* @param MandatoryFieldData $mandatoryField
*
* @return array
*/
private function checkText(string $value, MandatoryFieldData $mandatoryField): array
{
$data['default'] = '';
$data['error'] = false;
$minLength = $mandatoryField->getMinLength();
$maxLength = $mandatoryField->getMaxLength();
if ($minLength > 0) {
if (strlen($value) < $minLength) {
$data['default'] = 'Eingabe zu kurz';
$data['error'] = true;
}
}
if ($maxLength > 0) {
if (strlen($value) > $maxLength) {
$data['default'] = 'Eingabe zu lang';
$data['error'] = true;
}
}
return $data;
}
/**
* @param string $value
* @param MandatoryFieldData $mandatoryField
*
* @return array
*/
private function checkInteger(string $value, MandatoryFieldData $mandatoryField): array
{
$data['default'] = '';
$data['error'] = false;
if (filter_var($value, FILTER_VALIDATE_INT) === false) {
$data['default'] = 'Keine Ganzzahl';
$data['error'] = true;
} else {
$data = $this->validateNumbers($mandatoryField, $data, $value);
}
return $data;
}
/**
* @param string $value
* @param MandatoryFieldData $mandatoryField
*
* @return array
*/
private function checkDecimal(string $value, MandatoryFieldData $mandatoryField): array
{
$data['default'] = '';
$data['error'] = false;
if (strpos($value, '.') === false && strpos($value, ',') === false) {
$data['default'] = 'Keine Dezimalzahl';
$data['error'] = true;
} else {
$data = $this->validateNumbers($mandatoryField, $data, $value);
}
return $data;
}
/**
* @param string $value
*
* @return array
*/
private function checkDate(string $value): array
{
$data['default'] = '';
$data['error'] = false;
$datum = str_replace('.', '-', $value);
$datum = str_replace('/', '-', $datum);
if (!(bool)strtotime($datum)) {
$data['default'] = 'Datumsformat nicht gültig.';
$data['error'] = true;
}
return $data;
}
/**
* @param string $value
*
* @return array
*/
private function checkEmail(string $value): array
{
$data['default'] = '';
$data['error'] = false;
if (filter_var($value, FILTER_VALIDATE_EMAIL) === false) {
$data['default'] = 'E-Mail Adressformat nicht gültig.';
$data['error'] = true;
}
return $data;
}
/**
* @param MandatoryFieldData $mandatoryField
* @param array $data
* @param string $value
*
* @return array
*/
private function validateNumbers(MandatoryFieldData $mandatoryField, array $data, string $value): array
{
$comparator = $mandatoryField->getComparator();
$compareTo = (float)$mandatoryField->getCompareto();
$isValid = true;
if ($comparator != '') {
if ($comparator === 'equals') {
$isValid = (float)$value == $compareTo;
} elseif ($comparator === 'lowerthan') {
$isValid = (float)$value < $compareTo;
} elseif ($comparator === 'greaterthan') {
$isValid = (float)$value > $compareTo;
}
if (!$isValid) {
$data['error'] = true;
$data['default'] = 'Die Zahl entspricht nicht den Vorgaben.';
}
}
return $data;
}
}