This commit is contained in:
greggy
2025-10-07 09:14:37 +02:00
parent fd1d053d65
commit db1df97734
3 changed files with 87 additions and 33 deletions

View File

@@ -27,6 +27,7 @@ final class Version20251006214042 extends AbstractMigration
interfacepasswort VARCHAR(255) NOT NULL, interfacepasswort VARCHAR(255) NOT NULL,
interface_anfragen_pro_tag SMALLINT UNSIGNED NOT NULL, interface_anfragen_pro_tag SMALLINT UNSIGNED NOT NULL,
user_id VARCHAR(50) NOT NULL, user_id VARCHAR(50) NOT NULL,
referal_url VARCHAR(255) DEFAULT NULL,
date_updated DATETIME DEFAULT NULL, date_updated DATETIME DEFAULT NULL,
PRIMARY KEY (id) PRIMARY KEY (id)
) DEFAULT CHARACTER SET utf8mb4'); ) DEFAULT CHARACTER SET utf8mb4');
@@ -89,7 +90,7 @@ final class Version20251006214042 extends AbstractMigration
$this->addSql('ALTER TABLE users ADD CONSTRAINT FK_1483A5E948B23AFC FOREIGN KEY (werbenetzwerk_id) REFERENCES werbenetzwerk (id) ON DELETE SET NULL'); $this->addSql('ALTER TABLE users ADD CONSTRAINT FK_1483A5E948B23AFC FOREIGN KEY (werbenetzwerk_id) REFERENCES werbenetzwerk (id) ON DELETE SET NULL');
// Default data - Werbenetzwerk // Default data - Werbenetzwerk
$this->addSql('INSERT INTO werbenetzwerk (id, umrechnungskurs, eigenanteil_prozent, interfacepasswort, interface_anfragen_pro_tag, user_id, date_updated) VALUES (1, 0.0000000022, 25, "pAKc34EajovTvsnD6Y6WfhS", 500, "1244", NOW())'); $this->addSql('INSERT INTO werbenetzwerk (id, umrechnungskurs, eigenanteil_prozent, interfacepasswort, interface_anfragen_pro_tag, user_id, referal_url, date_updated) VALUES (1, 0.0000000022, 25, "pAKc34EajovTvsnD6Y6WfhS", 500, "1244", "https://www.adcity.eu?ref=1244", NOW())');
// Default data - Users // Default data - Users
$this->addSql('INSERT INTO users (username, email, password, rolle, createdAt) VALUES ("admin", "admin@example.com", "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi", "admin", NOW())'); $this->addSql('INSERT INTO users (username, email, password, rolle, createdAt) VALUES ("admin", "admin@example.com", "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi", "admin", NOW())');

View File

@@ -45,9 +45,40 @@ class AdCityForcedTextlinkCron extends AbstractCron
// Umrechnungskurs aktualisieren // Umrechnungskurs aktualisieren
$this->updateUmrechnungskurs(); $this->updateUmrechnungskurs();
// ForcedTextlink Kampagnen abrufen
$this->log("=== Fetching ForcedTextlink campaigns ===");
$statsForcedTextlink = $this->fetchAndProcessKampagnen('forcedtextlink', 'is_ft');
// Paidmail Kampagnen abrufen
$this->log("\n=== Fetching Paidmail campaigns ===");
$statsPaidmail = $this->fetchAndProcessKampagnen('paidmail', 'is_mail');
// Traffic Kampagnen abrufen
$this->log("\n=== Fetching Traffic campaigns ===");
$statsTraffic = $this->fetchAndProcessKampagnen('traffic', 'is_tr');
// Änderungen speichern
$this->flush();
// Zusammenfassung ausgeben
$this->log("\n=== Overall Summary ===");
$totalStats = [
'total' => $statsForcedTextlink['total'] + $statsPaidmail['total'] + $statsTraffic['total'],
'created' => $statsForcedTextlink['created'] + $statsPaidmail['created'] + $statsTraffic['created'],
'updated' => $statsForcedTextlink['updated'] + $statsPaidmail['updated'] + $statsTraffic['updated']
];
$this->printSummary($totalStats['total'], $totalStats['created'], $totalStats['updated']);
$this->log("Cron job completed successfully.");
}
/**
* Ruft Kampagnen von der API ab und verarbeitet sie
*/
private function fetchAndProcessKampagnen(string $type, string $kampagneType): array
{
// API-Anfrage durchführen // API-Anfrage durchführen
$response = $this->fetchFromApi(self::API_URL, [ $response = $this->fetchFromApi(self::API_URL, [
'typ' => self::KAMPAGNE_TYPE, 'typ' => $type,
'id' => $this->werbenetzwerk->getUserId(), 'id' => $this->werbenetzwerk->getUserId(),
'pw' => $this->werbenetzwerk->getInterfacepasswort(), 'pw' => $this->werbenetzwerk->getInterfacepasswort(),
'uebrig' => 20, 'uebrig' => 20,
@@ -60,20 +91,13 @@ class AdCityForcedTextlinkCron extends AbstractCron
$this->log($response); $this->log($response);
// Response parsen und verarbeiten // Response parsen und verarbeiten
$stats = $this->processResponse($response); return $this->processResponse($response, $kampagneType);
// Änderungen speichern
$this->flush();
// Zusammenfassung ausgeben
$this->printSummary($stats['total'], $stats['created'], $stats['updated']);
$this->log("Cron job completed successfully.");
} }
/** /**
* Verarbeitet die API-Response * Verarbeitet die API-Response
*/ */
private function processResponse(string $response): array private function processResponse(string $response, string $kampagneType): array
{ {
$parts = explode('|', trim($response)); $parts = explode('|', trim($response));
@@ -120,7 +144,7 @@ class AdCityForcedTextlinkCron extends AbstractCron
$verguetungEuro = $verdienst * $this->werbenetzwerk->getUmrechnungskurs(); $verguetungEuro = $verdienst * $this->werbenetzwerk->getUmrechnungskurs();
// Kampagne verarbeiten // Kampagne verarbeiten
if ($this->processKampagne($kid, $linktext, $ma, $reload, $uebrig, $verdienst, $verguetungEuro, $mailtext)) { if ($this->processKampagne($kid, $linktext, $ma, $reload, $uebrig, $verdienst, $verguetungEuro, $mailtext, $kampagneType)) {
$updatedCount++; $updatedCount++;
} else { } else {
$createdCount++; $createdCount++;
@@ -147,20 +171,15 @@ class AdCityForcedTextlinkCron extends AbstractCron
int $uebrig, int $uebrig,
float $verdienst, float $verdienst,
float $verguetungEuro, float $verguetungEuro,
?string $mailtext ?string $mailtext,
string $kampagneType
): bool { ): bool {
// Vergütung höher als 0.1 Euro filtern // Vergütung höher als 0.1 Euro filtern
if ($verguetungEuro > 0.1) { if ($verguetungEuro > 0.1) {
$this->log("Skipping: $linktext (KID: $kid, Vergütung zu hoch: $verguetungEuro €)"); $this->log("Skipping: $linktext (KID: $kid, Vergütung zu hoch: $verguetungEuro €)");
// Wenn Kampagne existiert, löschen // Wenn Kampagne existiert, löschen
$existingKampagne = $this->entityManager $existingKampagne = $this->findExistingKampagneByType($kid, $kampagneType);
->getRepository(Kampagne::class)
->findOneBy([
'user' => $this->werbenetzwerkUser,
'kid' => $kid,
'is_ft' => true
]);
if ($existingKampagne) { if ($existingKampagne) {
$this->entityManager->remove($existingKampagne); $this->entityManager->remove($existingKampagne);
$this->log(" → Deleted existing campaign with high vergütung"); $this->log(" → Deleted existing campaign with high vergütung");
@@ -170,18 +189,17 @@ class AdCityForcedTextlinkCron extends AbstractCron
} }
// Link-URL generieren // Link-URL generieren
$destUrl = "https://www.adcity.eu/codes/forcedtextlinkklick.php?id={USERID}&bid=$kid&aid={SEITENID}"; $destUrl = match($kampagneType) {
'is_ft' => "https://www.adcity.eu/codes/forcedtextlinkklick.php?id={USERID}&bid=$kid&aid={SEITENID}",
'is_mail' => "https://www.adcity.eu/codes/paidmailklick.php?id={USERID}&bid=$kid&aid={SEITENID}",
'is_tr' => "https://www.adcity.eu/codes/trafficklick.php?id={USERID}&bid=$kid&aid={SEITENID}",
default => "https://www.adcity.eu/codes/kampagne.php?id={USERID}&bid=$kid&aid={SEITENID}"
};
$this->log("Processing: $linktext (KID: $kid, MA: $ma, Reload: $reload, Uebrig: $uebrig)"); $this->log("Processing: $linktext (KID: $kid, MA: $ma, Reload: $reload, Uebrig: $uebrig)");
// Prüfen ob Kampagne bereits existiert (is_ft = true) // Prüfen ob Kampagne bereits existiert
$existingKampagne = $this->entityManager $existingKampagne = $this->findExistingKampagneByType($kid, $kampagneType);
->getRepository(Kampagne::class)
->findOneBy([
'user' => $this->werbenetzwerkUser,
'kid' => $kid,
'is_ft' => true
]);
if ($existingKampagne) { if ($existingKampagne) {
// Kampagne aktualisieren // Kampagne aktualisieren
@@ -209,13 +227,18 @@ class AdCityForcedTextlinkCron extends AbstractCron
$kampagne->setVerguetung($verguetungEuro); $kampagne->setVerguetung($verguetungEuro);
$kampagne->setUebrig($uebrig); $kampagne->setUebrig($uebrig);
$kampagne->setIsFb(false); $kampagne->setIsFb(false);
$kampagne->setIsTr(false); $kampagne->setIsTr($kampagneType === 'is_tr');
$kampagne->setIsFt(true); $kampagne->setIsFt($kampagneType === 'is_ft');
$kampagne->setIsMail(false); $kampagne->setIsMail($kampagneType === 'is_mail');
if ($mailtext) {
if ($mailtext && $kampagneType === 'is_mail') {
$kampagne->setMailtext($mailtext);
} elseif ($mailtext && $kampagneType === 'is_ft') {
// ForcedTextlink kann auch Mailtext haben
$kampagne->setMailtext($mailtext); $kampagne->setMailtext($mailtext);
$kampagne->setIsMail(true); $kampagne->setIsMail(true);
} }
$kampagne->setUser($this->werbenetzwerkUser); $kampagne->setUser($this->werbenetzwerkUser);
$this->entityManager->persist($kampagne); $this->entityManager->persist($kampagne);
@@ -224,6 +247,22 @@ class AdCityForcedTextlinkCron extends AbstractCron
} }
} }
/**
* Findet eine existierende Kampagne basierend auf Typ
*/
private function findExistingKampagneByType(string $kid, string $kampagneType): ?Kampagne
{
$criteria = [
'user' => $this->werbenetzwerkUser,
'kid' => $kid,
$kampagneType => true
];
return $this->entityManager
->getRepository(Kampagne::class)
->findOneBy($criteria);
}
/** /**
* Aktualisiert den Umrechnungskurs in der Datenbank * Aktualisiert den Umrechnungskurs in der Datenbank
*/ */

View File

@@ -29,6 +29,9 @@ class Werbenetzwerk
#[ORM\Column(type: 'string', length: 50)] #[ORM\Column(type: 'string', length: 50)]
private string $user_id; private string $user_id;
#[ORM\Column(type: 'string', length: 255, nullable: true)]
private ?string $referal_url = null;
#[ORM\Column(type: 'datetime', nullable: true)] #[ORM\Column(type: 'datetime', nullable: true)]
private ?\DateTimeInterface $date_updated = null; private ?\DateTimeInterface $date_updated = null;
@@ -104,4 +107,15 @@ class Werbenetzwerk
$this->user_id = $user_id; $this->user_id = $user_id;
return $this; return $this;
} }
public function getReferalUrl(): ?string
{
return $this->referal_url;
}
public function setReferalUrl(?string $referal_url): self
{
$this->referal_url = $referal_url;
return $this;
}
} }