Initial xentral_oss_20.3.c9ffacf
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user