myCRM/docs/example-module/BillingModulePlugin.php
olli 42e7bc7e10 feat(billing-module): Implementieren der Modulstruktur und Lizenzverwaltung
- 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.
2025-12-03 15:14:07 +01:00

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');
}
}