Files
kupshop/bundles/KupShop/ReclamationsBundle/Email/ReclamationEmail.php
2025-08-02 16:30:27 +02:00

371 lines
13 KiB
PHP

<?php
namespace KupShop\ReclamationsBundle\Email;
use KupShop\KupShopBundle\Email\BaseEmail;
use KupShop\KupShopBundle\Email\EmailGroupTypeEnum;
use KupShop\KupShopBundle\Util\Compat\ServiceContainer;
use KupShop\KupShopBundle\Util\HtmlBuilder\HTML;
use KupShop\OrderingBundle\Util\Attachment\AttachmentLocator;
use KupShop\ReclamationsBundle\Entity\ReclamationEntity;
use KupShop\ReclamationsBundle\Util\ReclamationsUtil;
use KupShop\ReturnsBundle\Util\ReturnsUtil;
use Symfony\Component\Routing\Router;
use Symfony\Component\Routing\RouterInterface;
class ReclamationEmail extends BaseEmail
{
protected static $priority = -2;
protected static $type = 'RECLAMATION_EMAIL';
protected static $group = EmailGroupTypeEnum::RECLAMATION;
/** @var ReclamationEntity */
protected $reclamation;
protected $comment;
/** @var ReclamationsUtil */
private $reclamationsUtil;
private $logHistory = false;
public static string $type_test_email = 'reclamations';
/** @var AttachmentLocator */
private $attachmentLocator;
/**
* @required
*/
public function setReclamationsUtil(ReclamationsUtil $reclamationsUtil)
{
$this->reclamationsUtil = $reclamationsUtil;
}
/**
* @required
*/
public function setAttachmentLocator(AttachmentLocator $attachmentLocator)
{
$this->attachmentLocator = $attachmentLocator;
}
/** @var ReclamationsUtil */
private $returnsUtil;
/**
* @required
*/
public function setReturnsUtil(?ReturnsUtil $returnsUtil)
{
$this->returnsUtil = $returnsUtil;
}
public function setComment($comment)
{
$this->comment = $comment;
return $this;
}
public function setLogHistory($logHistory)
{
$this->logHistory = $logHistory;
return $this;
}
public function setReclamation(ReclamationEntity $reclamation)
{
$this->reclamation = $reclamation;
return $this;
}
public function testEmail(): array
{
if (!isset($this->reclamation)) {
$this->setTestEntity();
}
return parent::testEmail();
}
public function setTestEntity(?int $id = null): void
{
if (!$id) {
$id = sqlQueryBuilder()->select('MAX(id)')->from('reclamations')->execute()->fetchOne();
}
if ($id) {
$this->reclamation = $this->reclamationsUtil->getReclamation($id);
return;
}
$this->reclamation = new ReclamationEntity();
$this->reclamation->setCode('R1234');
$this->reclamation->setId(1234);
$this->reclamation->setPackageId('TESTTEST');
$this->reclamation->setBankAccount('TESTTESTTEST');
$this->reclamation->setDescr('Some test description');
$this->reclamation->setData([]);
$this->reclamation->setOrderNumber('123456');
$this->reclamation->setIdOrder('1');
$this->reclamation->setDateCreated('2023-01-05 12:20:15');
}
public function getEmail($replacements = []): array
{
$template = $this->getEmailTemplate();
$message = $this->renderEmail($template);
$message['body'] = $this->reclamationsUtil->replacePlaceholders($message['body'], [], [$this, 'replacePlaceholdersItem']);
$message['subject'] = $this->reclamationsUtil->replacePlaceholders($message['subject'], [], [$this, 'replacePlaceholdersItem']);
return $message;
}
public function sendEmail($message)
{
if ($bcc = (\Settings::getDefault()->archive_email ?? null)) {
$message['bcc'] = [$bcc];
}
$sent = parent::sendEmail($message);
if ($sent && $this->logHistory && $this->reclamation) {
if ($this->comment) {
$template = $this->comment;
} else {
$template = $this->getEmailTemplate()['body'];
}
$template = $this->reclamationsUtil->replacePlaceholders($template, [], [$this, 'replacePlaceholdersItem']);
$attachments = [];
if (!empty($message['attachments'])) {
foreach ($message['attachments'] as $attachment) {
$attachments[] = $attachment['type'];
}
}
$this->reclamationsUtil->logHistory($this->reclamation->getId(), $template, true, $this->reclamation->getStatus(), ['attachments' => $attachments]);
}
return $sent;
}
public function renderEmail($template, $data = [], $base_template = 'other.tpl'): array
{
if ($this->comment) {
$template['body'] = $this->comment;
}
$message = parent::renderEmail($template, $data, $base_template);
if ($this->reclamation) {
$message['to'] = $this->reclamation->getEmail();
}
$message['template'] = $template;
return $message;
}
public static function getPlaceholders()
{
$placeholders = [
'KOD_REKLAMACE' => [
'text' => 'Kód reklamace',
],
'ODKAZ_REKLAMACE' => [
'text' => 'Odkaz na reklamace',
],
'REKLAMACE_INSTRUKCE' => [
'text' => 'Instrukce',
],
'KOD_OBJEDNAVKY' => [
'text' => 'Kód objednávky vyřizující reklamaci výměnou',
],
'ODKAZ_OBJEDNAVKA' => [
'text' => 'Odkaz na objednávku vyřizující reklamaci výměnou',
],
'KOD_PUVODNI_OBJEDNAVKY' => [
'text' => 'Kód objednávky ze které byla vytvořena reklamace',
],
'ODKAZ_PUVODNI_OBJEDNAVKA' => [
'text' => 'Odkaz na objednávku ze které byla vytvořena reklamace',
],
'ODKAZ_PDF' => [
'text' => 'Odkaz na PDF',
],
'BALIK_ID' => [
'text' => 'Číslo balíku',
],
'DATUM_VYTVORENI' => [
'text' => 'Datum vytvoření reklamace',
],
'CISLO_UCTU' => [
'text' => 'Číslo účtu',
],
'PACKAGE_LABEL' => [
'text' => 'Autorizační kód Odvozu zboží',
],
'POSUDEK' => [
'text' => 'Posudek',
],
'POZNAMKA_UZIVATELE' => [
'text' => 'Poznámka uživatele',
],
'REKAPITULACE_OBCHODNIKOVI' => [
'text' => 'Rekapitulace obchodníkovi',
],
'PRILOHY_NAHRANE_ZAKAZNIKEM' => [
'text' => 'Vloží seznam příloh nahraných zákazníkem',
],
];
return [self::$type => $placeholders] + (parent::getPlaceholders() ?? []);
}
public function replacePlaceholdersItem($placeholder)
{
$result = parent::replacePlaceholdersItem($placeholder);
$dbcfg = \Settings::getDefault();
if (!$result) {
switch ($placeholder) {
case 'KOD_REKLAMACE':
return $this->reclamation->getCode();
case 'ODKAZ_REKLAMACE':
return path('kupshop_reclamations_reclamations_reclamation', [
'id' => $this->reclamation->getId(),
'cf' => $this->reclamationsUtil->getSecurityCode($this->reclamation->getId()),
]);
case 'ODKAZ_VRATKA':
$returnId = $this->reclamation->getData()['return'] ?? null;
if ($returnId) {
return path('kupshop_returns_returns_return', ['id' => $returnId, 'cf' => $this->returnsUtil->getSecurityCode($returnId)]);
}
// no break
case 'KOD_VRATKY':
return $this->returnsUtil->getCode($this->reclamation->getData()['return'] ?? null);
case 'REKLAMACE_INSTRUKCE':
return $dbcfg->reclamations['descr'] ?? '';
case 'KOD_OBJEDNAVKY':
$exchangeOrderID = $this->reclamation->getData()['exchange_order'] ?? null;
if ($exchangeOrderID) {
$order = new \Order();
$order->createFromDB($exchangeOrderID);
return $order->order_no;
}
return '';
case 'ODKAZ_OBJEDNAVKA':
$exchangeOrderID = $this->reclamation->getData()['exchange_order'] ?? null;
if ($exchangeOrderID) {
$order = new \Order();
$order->createFromDB($exchangeOrderID);
return $order->getUrl();
}
return '';
case 'ODKAZ_PUVODNI_OBJEDNAVKA':
$id_order = $this->reclamation->getIdOrder();
$order = new \Order();
$order->createFromDB($id_order);
return $order->getUrl();
case 'KOD_PUVODNI_OBJEDNAVKY':
return $this->reclamation->getOrderNumber();
case 'ODKAZ_PDF':
return path('kupshop_reclamations_reclamations_reclamationattachment', [
'id' => $this->reclamation->getId(),
'cf' => $this->reclamationsUtil->getSecurityCode($this->reclamation->getId()),
], Router::ABSOLUTE_URL);
case 'BALIK_ID':
return $this->reclamation->getPackageId();
case 'CISLO_UCTU':
return $this->reclamation->getBankAccount();
case 'PACKAGE_LABEL':
return $this->reclamationsUtil->getAuthCode($this->reclamation->getId());
case 'POSUDEK':
return $this->reclamation->getDescr();
case 'DATUM_VYTVORENI':
$date = $this->reclamation->getDateCreated();
if (!$date) {
return '';
}
return \DateTime::createFromFormat('Y-m-d H:i:s', $date)->format(\Settings::getDateFormat());
case 'POZNAMKA_UZIVATELE':
return $this->reclamation->getUserNote();
case 'REKAPITULACE_OBCHODNIKOVI':
// Objednavka, z ktere byla reklamace vytvorena
$order = new \Order();
$order->createFromDB($this->reclamation->getIdOrder());
$smarty = createSmarty(true, true);
$smarty->assign('reclamation', $this->reclamation);
$smarty->assign('order', $order);
return $smarty->fetch('email/reclamationShopkeeper.tpl');
case 'PRILOHY_NAHRANE_ZAKAZNIKEM':
$returnCustomData = $this->reclamation->getData() ?? [];
$element = HTML::create('div')
->tag('h3')->text(translate_shop('attachments_uploaded_by_customer', 'email'))->end();
$list = $element->tag('ul');
foreach ($returnCustomData['userContent'] ?? [] as $fileInfo) {
$src = ltrim($fileInfo['src'], '/');
$list->tag('li')
->tag('a')
->attr('href', path('page', ['path' => $src], RouterInterface::ABSOLUTE_URL))
->text($fileInfo['originalFilename'])->end()->end();
}
return $element->end()->end();
}
}
return $result;
}
public function getAttachments($template): array
{
if (empty($template['attachments'])) {
return [];
}
return $this->renderAttachments(function () use ($template): iterable {
$order = new \Order();
$order->createFromDB($this->reclamation->getIdOrder());
$types = json_decode($template['attachments'], true);
foreach ($types as $type) {
$attachment = $this->attachmentLocator->getServiceByType($type, $order);
$attachment->setReclamation($this->reclamation);
yield $attachment;
}
});
}
public function getTestType(): string
{
return self::$type_test_email;
}
public function __wakeup()
{
parent::__wakeup();
$this->attachmentLocator = ServiceContainer::getService(AttachmentLocator::class);
$this->reclamationsUtil = ServiceContainer::getService(ReclamationsUtil::class);
}
public function __sleep()
{
return array_diff(parent::__sleep(), ['attachmentLocator', 'reclamationsUtil']);
}
}