- Hinzufügen der DependencyInjection-Konfiguration für das Billing-Modul. - Erstellen der Invoice-Entity mit API-Ressourcen und Berechtigungen. - Konfigurieren der Services in services.yaml für das Billing-Modul. - Implementieren von CLI-Commands zur Verwaltung von Modul-Lizenzen und zur Auflistung installierter Module. - Erstellen eines API-Controllers zur Verwaltung von Modulen und Lizenzen. - Hinzufügen eines EventListeners für das Booten von Modulen. - Definieren von Interfaces für Lizenzvalidierung und Modul-Plugins. - Implementieren der ModuleRegistry zur Verwaltung und Booten von Modulen. - Erstellen eines LicenseValidator-Services zur Validierung und Registrierung von Lizenzen.
180 lines
5.2 KiB
PHP
180 lines
5.2 KiB
PHP
<?php
|
|
|
|
namespace MyCRM\BillingModule;
|
|
|
|
use App\Plugin\LicenseValidatorInterface;
|
|
use App\Plugin\ModulePluginInterface;
|
|
use Psr\Log\LoggerInterface;
|
|
use Symfony\Component\DependencyInjection\Attribute\Autowire;
|
|
|
|
/**
|
|
* Haupt-Plugin-Klasse für das Billing-Modul
|
|
*
|
|
* Wird automatisch vom Core-System erkannt und registriert,
|
|
* wenn das Composer-Package installiert ist.
|
|
*/
|
|
class BillingModulePlugin implements ModulePluginInterface
|
|
{
|
|
private const MODULE_IDENTIFIER = 'billing';
|
|
private const MODULE_VERSION = '1.0.0';
|
|
|
|
private ?array $licenseCache = null;
|
|
|
|
public function __construct(
|
|
private readonly LicenseValidatorInterface $licenseValidator,
|
|
private readonly LoggerInterface $logger,
|
|
#[Autowire(param: 'kernel.project_dir')]
|
|
private readonly string $projectDir
|
|
) {
|
|
}
|
|
|
|
public function getIdentifier(): string
|
|
{
|
|
return self::MODULE_IDENTIFIER;
|
|
}
|
|
|
|
public function getDisplayName(): string
|
|
{
|
|
return 'Rechnungsmodul';
|
|
}
|
|
|
|
public function getVersion(): string
|
|
{
|
|
return self::MODULE_VERSION;
|
|
}
|
|
|
|
public function getDescription(): string
|
|
{
|
|
return 'Vollständiges Rechnungs- und Abrechnungssystem mit PDF-Generierung, Zahlungsverfolgung und wiederkehrenden Rechnungen.';
|
|
}
|
|
|
|
public function isLicensed(): bool
|
|
{
|
|
$licenseInfo = $this->getLicenseInfo();
|
|
return $licenseInfo['valid'];
|
|
}
|
|
|
|
public function getLicenseInfo(): array
|
|
{
|
|
// Cache verwenden, um nicht bei jedem Aufruf zu validieren
|
|
if ($this->licenseCache !== null) {
|
|
return $this->licenseCache;
|
|
}
|
|
|
|
$this->licenseCache = $this->licenseValidator->validate(self::MODULE_IDENTIFIER);
|
|
return $this->licenseCache;
|
|
}
|
|
|
|
public function boot(): void
|
|
{
|
|
// Lizenzprüfung
|
|
if (!$this->isLicensed()) {
|
|
$licenseInfo = $this->getLicenseInfo();
|
|
throw new \RuntimeException(sprintf(
|
|
'Billing-Modul kann nicht gestartet werden: %s',
|
|
$licenseInfo['message'] ?? 'Keine gültige Lizenz'
|
|
));
|
|
}
|
|
|
|
$this->logger->info(sprintf(
|
|
'Billing-Modul v%s wird gebootet (Lizenziert an: %s)',
|
|
$this->getVersion(),
|
|
$this->getLicenseInfo()['licensedTo'] ?? 'Unbekannt'
|
|
));
|
|
|
|
// Hier würden weitere Boot-Aktionen stattfinden:
|
|
// - Event Listener registrieren
|
|
// - Custom Services initialisieren
|
|
// - Doctrine Mappings laden
|
|
// - Routes einbinden
|
|
|
|
$this->registerDoctrineMapping();
|
|
$this->registerEventListeners();
|
|
$this->loadConfiguration();
|
|
|
|
$this->logger->info('Billing-Modul erfolgreich gebootet');
|
|
}
|
|
|
|
public function getPermissionModules(): array
|
|
{
|
|
// Diese Module werden im Permission-System registriert
|
|
return [
|
|
'billing', // Hauptmodul für Rechnungen
|
|
'payments', // Zahlungsverwaltung
|
|
'recurring', // Wiederkehrende Rechnungen
|
|
];
|
|
}
|
|
|
|
public function canInstall(): array
|
|
{
|
|
$errors = [];
|
|
|
|
// PHP-Version prüfen
|
|
if (version_compare(PHP_VERSION, '8.3.0', '<')) {
|
|
$errors[] = 'PHP 8.3 oder höher erforderlich';
|
|
}
|
|
|
|
// Erforderliche Extensions prüfen
|
|
$requiredExtensions = ['pdo_pgsql', 'gd', 'zip'];
|
|
foreach ($requiredExtensions as $extension) {
|
|
if (!extension_loaded($extension)) {
|
|
$errors[] = sprintf('PHP-Extension "%s" erforderlich', $extension);
|
|
}
|
|
}
|
|
|
|
// Doctrine ORM verfügbar?
|
|
if (!class_exists(\Doctrine\ORM\EntityManager::class)) {
|
|
$errors[] = 'Doctrine ORM nicht installiert';
|
|
}
|
|
|
|
// API Platform verfügbar?
|
|
if (!class_exists(\ApiPlatform\Metadata\ApiResource::class)) {
|
|
$errors[] = 'API Platform nicht installiert';
|
|
}
|
|
|
|
// Schreibrechte für Upload-Verzeichnis prüfen
|
|
$uploadDir = $this->projectDir . '/var/uploads/invoices';
|
|
if (file_exists($uploadDir) && !is_writable($uploadDir)) {
|
|
$errors[] = sprintf('Verzeichnis "%s" nicht beschreibbar', $uploadDir);
|
|
}
|
|
|
|
return [
|
|
'success' => count($errors) === 0,
|
|
'errors' => $errors,
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Registriert Doctrine-Mappings für Modul-Entities
|
|
*/
|
|
private function registerDoctrineMapping(): void
|
|
{
|
|
// Würde über Bundle-Extension erfolgen
|
|
// Hier nur als Illustration
|
|
|
|
$this->logger->debug('Doctrine-Mappings für Billing-Modul registriert');
|
|
}
|
|
|
|
/**
|
|
* Registriert Event Listener
|
|
*/
|
|
private function registerEventListeners(): void
|
|
{
|
|
// Event Listener würden hier registriert
|
|
// In der Praxis über services.yaml des Bundles
|
|
|
|
$this->logger->debug('Event Listener für Billing-Modul registriert');
|
|
}
|
|
|
|
/**
|
|
* Lädt Modul-Konfiguration
|
|
*/
|
|
private function loadConfiguration(): void
|
|
{
|
|
// Modul-spezifische Konfiguration laden
|
|
// z.B. Payment-Gateway-Keys, PDF-Templates etc.
|
|
|
|
$this->logger->debug('Konfiguration für Billing-Modul geladen');
|
|
}
|
|
}
|