Initial commit

This commit is contained in:
root
2026-01-19 17:44:46 +01:00
commit 823af8b11d
8721 changed files with 1130846 additions and 0 deletions

View File

@@ -0,0 +1,44 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Core\Formula\Parser\Ast;
/**
* An attribute AST node.
*/
class Attribute
{
public function __construct(private string $name)
{}
public function getName(): string
{
return $this->name;
}
}

View File

@@ -0,0 +1,55 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Core\Formula\Parser\Ast;
/**
* An AST node.
*/
class Node
{
/**
* @param (Node|Value|Attribute|Variable)[] $childNodes
*/
public function __construct(private string $type, private array $childNodes)
{}
public function getType(): string
{
return $this->type;
}
/**
* @return (Node|Value|Attribute|Variable)[]
*/
public function getChildNodes(): array
{
return $this->childNodes;
}
}

View File

@@ -0,0 +1,44 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Core\Formula\Parser\Ast;
/**
* A value AST node.
*/
class Value
{
public function __construct(private mixed $value)
{}
public function getValue(): mixed
{
return $this->value;
}
}

View File

@@ -0,0 +1,44 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Core\Formula\Parser\Ast;
/**
* A variable AST node.
*/
class Variable
{
public function __construct(private string $name)
{}
public function getName(): string
{
return $this->name;
}
}

View File

@@ -0,0 +1,164 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Core\Formula\Parser\Statement;
class IfRef
{
public const STATE_EMPTY = 0;
public const STATE_CONDITION_STARTED = 1;
public const STATE_CONDITION_ENDED = 2;
public const STATE_THEN_STARTED = 3;
public const STATE_THEN_ENDED = 4;
public const STATE_ELSE_MET = 5;
public const STATE_ELSE_STARTED = 6;
public const STATE_ELSE_ENDED = 7;
public const STATE_READY = 8;
private ?int $conditionStart = null;
private ?int $conditionEnd = null;
private ?int $thenStart = null;
private ?int $thenEnd = null;
private ?int $elseStart = null;
private ?int $elseEnd = null;
private ?int $elseKeywordEnd = null;
private bool $hasInlineElse = false;
private int $state = self::STATE_EMPTY;
public function __construct()
{}
public function setConditionStart(int $conditionStart): void
{
$this->conditionStart = $conditionStart;
$this->state = self::STATE_CONDITION_STARTED;
}
public function setReady(): void
{
$this->state = self::STATE_READY;
}
public function setConditionEnd(int $conditionEnd): void
{
$this->conditionEnd = $conditionEnd;
$this->state = self::STATE_CONDITION_ENDED;
}
public function setThenStart(int $thenStart): void
{
$this->thenStart = $thenStart;
$this->state = self::STATE_THEN_STARTED;
}
public function setThenEnd(int $thenEnd): void
{
$this->thenEnd = $thenEnd;
$this->state = self::STATE_THEN_ENDED;
}
public function setElseMet(int $elseKeywordEnd): void
{
$this->state = self::STATE_ELSE_MET;
$this->elseKeywordEnd = $elseKeywordEnd;
}
public function setElseStart(int $elseStart, bool $isInlineElse = false): void
{
$this->elseStart = $elseStart;
$this->state = self::STATE_ELSE_STARTED;
$this->hasInlineElse = $isInlineElse;
}
public function setElseEnd(int $elseEnd): void
{
$this->elseEnd = $elseEnd;
$this->state = self::STATE_ELSE_ENDED;
}
public function setState(int $state): void
{
$this->state = $state;
}
public function getState(): int
{
return $this->state;
}
public function isReady(): bool
{
return $this->state === self::STATE_READY;
}
public function getConditionStart(): ?int
{
return $this->conditionStart;
}
public function getConditionEnd(): ?int
{
return $this->conditionEnd;
}
public function getThenStart(): ?int
{
return $this->thenStart;
}
public function getThenEnd(): ?int
{
return $this->thenEnd;
}
public function getElseStart(): ?int
{
return $this->elseStart;
}
public function getElseEnd(): ?int
{
return $this->elseEnd;
}
public function getElseKeywordEnd(): ?int
{
return $this->elseKeywordEnd;
}
public function getEnd(): ?int
{
return $this->elseEnd ?? $this->thenEnd;
}
public function hasInlineElse(): bool
{
return $this->hasInlineElse;
}
}

View File

@@ -0,0 +1,64 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Core\Formula\Parser\Statement;
class StatementRef
{
private bool $endedWithSemicolon = false;
public function __construct(private int $start, private ?int $end = null)
{}
public function setEnd(int $end, bool $endedWithSemicolon = false): void
{
$this->end = $end;
$this->endedWithSemicolon = $endedWithSemicolon;
}
public function getStart(): int
{
return $this->start;
}
public function getEnd(): ?int
{
return $this->end;
}
public function isReady(): bool
{
return $this->end !== null;
}
public function isEndedWithSemicolon(): bool
{
return $this->endedWithSemicolon;
}
}

View File

@@ -0,0 +1,112 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Core\Formula\Parser\Statement;
class WhileRef
{
public const STATE_EMPTY = 0;
public const STATE_CONDITION_STARTED = 1;
public const STATE_CONDITION_ENDED = 2;
public const STATE_BODY_STARTED = 3;
public const STATE_READY = 4;
private ?int $conditionStart = null;
private ?int $conditionEnd = null;
private ?int $bodyStart = null;
private ?int $bodyEnd = null;
private int $state = self::STATE_EMPTY;
public function __construct(private int $start)
{}
public function setConditionStart(int $conditionStart): void
{
$this->conditionStart = $conditionStart;
$this->state = self::STATE_CONDITION_STARTED;
}
public function setConditionEnd(int $conditionEnd): void
{
$this->conditionEnd = $conditionEnd;
$this->state = self::STATE_CONDITION_ENDED;
}
public function setBodyStart(int $bodyStart): void
{
$this->bodyStart = $bodyStart;
$this->state = self::STATE_BODY_STARTED;
}
public function setBodyEnd(int $bodyEnd): void
{
$this->bodyEnd = $bodyEnd;
$this->state = self::STATE_READY;
}
public function isReady(): bool
{
return $this->state === self::STATE_READY;
}
public function getState(): int
{
return $this->state;
}
public function getConditionStart(): ?int
{
return $this->conditionStart;
}
public function getConditionEnd(): ?int
{
return $this->conditionEnd;
}
public function getBodyStart(): ?int
{
return $this->bodyStart;
}
public function getBodyEnd(): ?int
{
return $this->bodyEnd;
}
public function getEnd(): ?int
{
return $this->bodyEnd;
}
public function getStart(): int
{
return $this->start;
}
}