<?php
namespace App\Library\Subscribers;
use App\Library\Database;
use App\Library\Event\EadrEvent;
use App\Library\Event\EadrSyncEvent;
use App\Library\Event\GrapperProcessEvent;
use App\models\eadr;
use App\models\emain;
use Doctrine\DBAL\Exception;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use DateTime;
class EadrEventSubscriber implements EventSubscriberInterface
{
/**
* @return array[]
*/
public static function getSubscribedEvents():array
{
return [
EadrEvent::EVENT=>[
'inserEadr', 1000
],
EadrSyncEvent::EVENT=>[
'processEvents', 1000
],
GrapperProcessEvent::EVENT_UPDATE => [
'updateAddress', 1000
]
];
}
public function __construct(
private readonly Database $database,
private readonly EventDispatcherInterface $event
){
}
/**
* @param GrapperProcessEvent $event
* @return void
* @throws Exception
*/
public function updateAddress(GrapperProcessEvent $event):void
{
$event->addVerboseOutput('Updating Send Status');
$event->addVerboseOutput('Customer: '.$event->getAcount()->getId().' Address ID: '.$event->getAddress()->getId());
$event->addVerboseOutput('was sent?: '.(int)$event->isSent());
if($event->isSent()){
//updating all email addresses
$stmt = $this->database->getConnection()->prepare(eadr::UPDATE_SENT);
$stmt->bindValue(1, $event->getAddress()->getEmail());
$stmt->bindValue(2, $event->getCustomerId());
$result = $stmt->executeQuery();
//updating address with id
$stmt2 = $this->database->getConnection()->prepare(eadr::UPDATE_SENT2);
$stmt2->bindValue(1, $event->getAddress()->getId());
$stmt2->bindValue(2, $event->getCustomerId());
$result2 = $stmt2->executeQuery();
}
}
/**
* @param EadrSyncEvent $event
* @return void
* @throws Exception
*/
public function processEvents(EadrSyncEvent $event){
if((int) $event->getCustomer() < 2 && $event->getCustomer() !== 'all'){
$event->getOutput()->writeln('no customer given. Customer 1 can\'t be synced');
}
if($event->getCustomer() !== 'all'){
$stmt = $this->database->getConnection()->prepare(emain::FETCH_MISSING_EADR_ENTRIES);
$stmt->bindValue(1, (int)$event->getCustomer());
}else{
$stmt = $this->database->getConnection()->prepare(emain::FETCH_MISSING_EADR_ALL_ENTRIES);
}
$resultSet = $stmt->executeQuery();
while($row = $resultSet->fetchAssociative()){
if($event->getOutput()->isVerbose()){
$event->getOutput()->writeln($row['ID'] .'-'. $row['eemail'].'-'.$row['emngemail']);
$event->getOutput()->writeln('elocid: '.((int)$row['elocid'] <= 1?'not exists':'exists').' - emngid: '.((int)$row['emngid'] <= 1?'not exists':'exists'));
}
if((int)$row['elocid'] <= 1){
$stmt2 = $this->database->getConnection()->prepare(eadr::FETCH_MISSING_EADR_ENTRY);
$stmt2->bindValue(1, $row['eemail']);
$stmt2->bindValue(2, $row['euid']);
$resultSet2 = $stmt2->executeQuery();
if($resultSet2->rowCount() < 1){
$sEvent = new EadrEvent($event->getOutput(), (int)$row['ID'], false);
$this->event->dispatch($sEvent, EadrEvent::EVENT);
}
}
if((int)$row['emngid'] <= 1){
$stmt2 = $this->database->getConnection()->prepare(eadr::FETCH_MISSING_EADR_ENTRY);
$stmt2->bindValue(1, $row['emngemail']);
$stmt2->bindValue(2, $row['euid']);
$resultSet2 = $stmt2->executeQuery();
if($resultSet2->rowCount() < 1){
$sEvent = new EadrEvent($event->getOutput(), (int)$row['ID'], true);
$this->event->dispatch($sEvent, EadrEvent::EVENT);
}
}
}
}
/**
* @param OutputInterface $output
* @param int $eid
* @param bool $emn
* @return void
* @throws Exception
*/
private function inserEadr(OutputInterface $output, int $eid, bool $emn=false){
if($emn){
$stmt = $this->database->getConnection()->prepare(emain::SELECT_EMNGID);
}else{
$stmt = $this->database->getConnection()->prepare(emain::SELECT_ELOCID);
}
$stmt->bindValue(1, $eid);
$resultSet = $stmt->executeQuery();
if($output->isVerbose()){
$output->writeln($resultSet->rowCount() > 0?'entry not existing':'entry existing');
}
if($resultSet->rowCount() > 0){
$row = $resultSet->fetchAssociative();
if(empty($row['email'])){
if($output->isVerbose()){
$output->writeln('<error>skipping '.$row['name'].' reason: no email</error>');
}
return;
}else{
if($output->isVerbose()){
$output->writeln('<info>creating entry for '.$row['name'].'</info>');
}
}
$stmt3 = $this->database->getConnection()->prepare(eadr::EMAIL_EXISTS);
$stmt3->bindValue(1, $row['uid']);
$stmt3->bindValue(2, $row['email']);
$validation = $stmt3->executeQuery();
if($validation->rowCount()>0){
if($output->isVerbose()){
$output->writeln('<error>skipping '.$row['name'].' reason: email already exists</error>');
}
return;
}
$stmt2 = $this->database->getConnection()->prepare(eadr::INSERT_EADR);
$stmt2->bindValue(1, $row['name']);
$stmt2->bindValue(2, $row['street']);
$stmt2->bindValue(3, $row['zip']);
$stmt2->bindValue(4, $row['district']);
$stmt2->bindValue(5, $row['city']);
$stmt2->bindValue(6, $row['country']);
$stmt2->bindValue(7, $row['land']);
$stmt2->bindValue(8, $row['tel']);
$stmt2->bindValue(9, $row['fax']);
$stmt2->bindValue(10, $row['mobile']);
$stmt2->bindValue(11, $row['email']);
$stmt2->bindValue(12, $row['www']);
$stmt2->bindValue(13, ($emn?2:1));
$stmt2->bindValue(14, '1');
$stmt2->bindValue(15, '1');
$stmt2->bindValue(16, '1');
$stmt2->bindValue(17, 'enable,free');
$stmt2->bindValue(18, $row['uid']);
$stmt2->executeQuery();
unset($row, $stmt2, $stmt3);
}
}
}