Current File : /home/kelaby89/listingslad.com/wp-content/plugins/listivo-core/framework/app/Models/Model.php
<?php

namespace Tangibledesign\Framework\Models;

use DateTime;
use Exception;
use Tangibledesign\Framework\Core\Collection;
use Tangibledesign\Framework\Interfaces\HasReviewsInterface;
use Tangibledesign\Framework\Models\Field\Fieldable;
use Tangibledesign\Framework\Models\Field\GalleryField;
use Tangibledesign\Framework\Models\Field\LocationField;
use Tangibledesign\Framework\Models\Field\PriceField;
use Tangibledesign\Framework\Models\Field\SalaryField;
use Tangibledesign\Framework\Models\Field\TaxonomyField;
use Tangibledesign\Framework\Models\Field\TextField;
use Tangibledesign\Framework\Models\Helpers\CanBeBumped;
use Tangibledesign\Framework\Models\Helpers\HasFavoriteCounter;
use Tangibledesign\Framework\Models\Helpers\HasRevealPhoneCounter;
use Tangibledesign\Framework\Models\Helpers\HasViews;
use Tangibledesign\Framework\Models\Helpers\HasViewsInterface;
use Tangibledesign\Framework\Models\Payments\RegularUserPaymentPackageInterface;
use Tangibledesign\Framework\Models\Post\PostModel;
use Tangibledesign\Framework\Models\Post\PostStatus;
use Tangibledesign\Framework\Models\Template\Templatable;
use Tangibledesign\Framework\Models\Term\CustomTerm;
use Tangibledesign\Framework\Traits\HasReviewsTrait;
use Tangibledesign\Framework\Widgets\General\PanelWidget;

class Model extends PostModel implements Fieldable, Templatable, HasViewsInterface, HasReviewsInterface
{
    use HasViews;
    use HasFavoriteCounter;
    use HasRevealPhoneCounter;
    use CanBeBumped;
    use HasReviewsTrait;

    public const VIEWS = 'views';
    public const PHONE_REVEALS = 'phone_reveals';
    public const FAVORITE_COUNT = 'favorite_count';
    public const FEATURED = 'featured';
    public const EXPIRE = 'expire';
    public const FEATURED_EXPIRE = 'featured_expire';
    public const PENDING_PACKAGE = 'pending_package';
    public const ASSIGNED_PACKAGE = 'assigned_package';
    public const APPROVED = 'approved';
    public const EXPIRE_NOTIFICATIONS = 'expire_notifications';

    public function getName(): string
    {
        return apply_filters(tdf_prefix() . '/model/name', parent::getName(), $this);
    }

    public function isFeatured(): bool
    {
        return !empty($this->getMeta(self::FEATURED));
    }

    public function setFeatured($isFeatured): void
    {
        $this->setMeta(self::FEATURED, (int)$isFeatured);
    }

    public function getEditUrl(string $type = 'normal'): string
    {
        $url = site_url() . '/' . tdf_slug('panel') . '/' . tdf_slug(PanelWidget::ACTION_EDIT) . '/?id=' . $this->getId();
        if ($type === 'moderation') {
            $url .= '&type=moderation';
        }

        return $url;
    }

    public function getExpireDate(): string
    {
        return (string)$this->getMeta(self::EXPIRE);
    }

    private function sanitizeDate(string $date): string
    {
        if ($date === 'unlimited') {
            return $date;
        }

        $dateObj = DateTime::createFromFormat('Y-m-d H:i:s', $date);
        if (!$dateObj) {
            return '';
        }

        $formattedDate = $dateObj->format('Y-m-d H:i:s');

        if (!preg_match("/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/", $formattedDate, $matches)) {
            return '';
        }

        if (!checkdate($matches[2], $matches[3], $matches[1])) {
            return '';
        }

        return $formattedDate;
    }

    public function setExpireDate(string $date): void
    {
        $this->setMeta(self::EXPIRE, $this->sanitizeDate($date));
    }

    public function setExpireDateFromDays(int $days): void
    {
        $date = date('Y-m-d H:i:s', strtotime('+' . $days . ' days'));

        $this->setExpireDate($date);
    }

    public function hasExpireDate(): bool
    {
        return !empty($this->getExpireDate()) && $this->getExpireDate() !== 'unlimited';
    }

    private function getExpireText($date): string
    {
        try {
            $nowDate = new DateTime();
            $finalDate = new DateTime($date);
        } catch (Exception $e) {
            return '';
        }

        $difference = $nowDate->diff($finalDate);

        if (!$difference) {
            return '';
        }

        if ($difference->days === 1) {
            $daysString = mb_strtolower(tdf_string('day'), 'UTF-8');
        } else {
            $daysString = mb_strtolower(tdf_string('days'), 'UTF-8');
        }

        if ($difference->h === 1) {
            $hoursString = mb_strtolower(tdf_string('hour'), 'UTF-8');
        } else {
            $hoursString = mb_strtolower(tdf_string('hours'), 'UTF-8');
        }

        if ($difference->i === 1) {
            $minutesString = mb_strtolower(tdf_string('minute'), 'UTF-8');
        } else {
            $minutesString = mb_strtolower(tdf_string('minutes'), 'UTF-8');
        }

        if (empty($difference->days) && !empty($difference->h)) {
            return $difference->h . ' ' . $hoursString . ', ' . $difference->i . ' ' . $minutesString;
        }

        if (empty($difference->days)) {
            return $difference->i . ' ' . $minutesString;
        }

        return $difference->days . ' ' . $daysString . ', ' . $difference->h . ' ' . $hoursString;
    }

    public function getFeaturedExpireDateText(): string
    {
        return $this->getExpireText($this->getFeaturedExpireDate());
    }

    public function getExpireDateText(): string
    {
        $expireDate = $this->getExpireDate();
        if (empty($expireDate)) {
            return tdf_string('never');
        }

        return $this->getExpireText($expireDate);
    }

    public function setFeaturedExpireDate(string $date): void
    {
        $date = $this->sanitizeDate($date);

        $this->setMeta(self::FEATURED_EXPIRE, $date);

        if (!empty($date)) {
            $this->setFeatured(1);
        }
    }

    public function getFeaturedExpireDate(): string
    {
        return (string)$this->getMeta(self::FEATURED_EXPIRE);
    }

    public function hasFeaturedExpireDate(): bool
    {
        return !empty($this->getFeaturedExpireDate());
    }

    public function clearFeaturedExpireDate(): void
    {
        $this->setMeta(self::FEATURED_EXPIRE, '0');
    }

    public function isFeaturedExpired(): bool
    {
        $expireDate = $this->getFeaturedExpireDate();

        if (empty($expireDate)) {
            return false;
        }

        return date("Y-m-d H:i:s") > $expireDate;
    }

    public function isExpired(): bool
    {
        $expireDate = $this->getExpireDate();

        if (empty($expireDate) || $expireDate === 'unlimited') {
            return false;
        }

        return date("Y-m-d H:i:s") > $expireDate;
    }

    public function clearExpireDate(): void
    {
        $this->setMeta(self::EXPIRE, '0');
    }

    public function setPendingPackage($userPaymentPackageId): void
    {
        $this->setMeta(self::PENDING_PACKAGE, $userPaymentPackageId);
    }

    /**
     * @return RegularUserPaymentPackageInterface|false
     */
    public function getPendingPackage()
    {
        $pendingPackageId = $this->getMeta(self::PENDING_PACKAGE);
        if (empty($pendingPackageId)) {
            return false;
        }

        if ($pendingPackageId === 'free') {
            return tdf_app('free_package');
        }

        $user = $this->getUser();
        if (!$user) {
            return false;
        }

        return $user->getPaymentPackage($pendingPackageId);
    }

    public function removePendingPackage(): void
    {
        $this->setMeta(self::PENDING_PACKAGE, '0');
    }

    public function hasPendingPackage(): bool
    {
        return $this->getPendingPackage() !== false;
    }

    public function assignPackage(int $packageId): void
    {
        $this->setMeta(self::ASSIGNED_PACKAGE, $packageId);
    }

    public function getAssignedPackageId(): int
    {
        return (int)$this->getMeta(self::ASSIGNED_PACKAGE);
    }

    /**
     * @return RegularUserPaymentPackageInterface|false
     */
    public function getAssignedPackage()
    {
        $user = $this->getUser();
        if (!$user) {
            return false;
        }

        $packageId = $this->getAssignedPackageId();
        if (empty($packageId)) {
            return false;
        }

        return $user->getPaymentPackage($packageId);
    }

    public function hasAssignedPackage(): bool
    {
        return $this->getAssignedPackage() !== false;
    }

    public function removeAssignedPackage(): void
    {
        $this->setMeta(self::ASSIGNED_PACKAGE, '0');
    }

    public function setApproved(int $approved): void
    {
        $this->setMeta(self::APPROVED, $approved);
    }

    public function isApproved(): bool
    {
        return !empty((int)$this->getMeta(self::APPROVED));
    }

    public function getAddress(): string
    {
        $address = [];

        $locationFields = tdf_app('card_location_field');
        if (empty($locationFields)) {
            return '';
        }

        foreach ($locationFields as $field) {
            if ($field === 'user_location') {
                $address[] = apply_filters(tdf_prefix() . '/listing/address', $this->getUserLocation(), $this);
            } elseif ($field instanceof TextField) {
                $address[] = apply_filters(tdf_prefix() . '/listing/address', $field->getValue($this), $this);
            } elseif ($field instanceof LocationField) {
                $address[] = apply_filters(tdf_prefix() . '/listing/address', $field->getAddress($this), $this);
            } elseif ($field instanceof TaxonomyField) {
                $address[] = $field->getMultilevelValue($this)->map(static function ($term) {
                    /* @var CustomTerm $term */
                    return $term->getName();
                })->implode(' ');
            }
        }

        return trim(implode(' ', $address));
    }

    private function getUserLocation(): string
    {
        $user = $this->getUser();
        if (!$user) {
            return '';
        }

        return $user->getAddress();
    }

    public function getPrice(): string
    {
        foreach (tdf_settings()->getCardMainValueFields() as $mainValueField) {
            if (!$mainValueField instanceof PriceField && !$mainValueField instanceof SalaryField) {
                continue;
            }

            $value = $mainValueField->getValueByCurrency($this);
            if (!empty($value)) {
                return $value;
            }
        }

        return '';
    }

    public function hasMainImage(): bool
    {
        return $this->getMainImage() instanceof Image;
    }

    /**
     * @return Image|false
     */
    public function getMainImage()
    {
        $galleryField = tdf_settings()->getCardGalleryField();
        if (!$galleryField instanceof GalleryField) {
            return false;
        }

        return apply_filters(tdf_prefix() . '/model/mainImage', $galleryField->getImage($this), $this);
    }

    public function getMainImageUrl(string $size = 'full'): string
    {
        $image = $this->getMainImage();
        if (!$image) {
            return '';
        }

        return $image->getImageUrl($size);
    }

    /**
     * @param int $limit
     * @return Collection|Image[]
     */
    public function getImages(int $limit = 0): Collection
    {
        $galleryField = tdf_settings()->getCardGalleryField();
        if (!$galleryField instanceof GalleryField) {
            return tdf_collect();
        }

        return apply_filters(tdf_prefix() . '/model/images', $galleryField->getImages($this, $limit), $this);
    }

    public function setPublish(): void
    {
        $time = current_time('mysql');

        wp_update_post([
            'ID' => $this->getId(),
            'post_status' => PostStatus::PUBLISH,
            'post_date' => $time,
            'post_date_gmt' => get_gmt_from_date($time)
        ]);
    }

    private function getExpireNotificationIds(): array
    {
        $notificationIds = $this->getMeta(self::EXPIRE_NOTIFICATIONS);
        if (!is_array($notificationIds) || empty($notificationIds)) {
            return [];
        }

        return tdf_collect($notificationIds)
            ->map(static function ($notificationId) {
                return (int)$notificationId;
            })
            ->filter(static function ($notificationId) {
                return !empty($notificationId);
            })
            ->values();
    }

    public function addExpireNotification(int $notificationId): void
    {
        $notificationIds = $this->getExpireNotificationIds();
        $notificationIds[] = $notificationId;

        $this->setMeta(self::EXPIRE_NOTIFICATIONS, $notificationIds);
    }

    public function hasExpireNotification(int $notificationId): bool
    {
        return in_array($notificationId, $this->getExpireNotificationIds(), true);
    }

    public function clearExpireNotifications(): void
    {
        $this->setMeta(self::EXPIRE_NOTIFICATIONS, '0');
    }

    public function getReviewType(): string
    {
        return tdf_model_post_type();
    }
}
Page not found – Hello World !