HEX
Server: LiteSpeed
System: Linux s1049.use1.mysecurecloudhost.com 4.18.0-477.27.2.lve.el8.x86_64 #1 SMP Wed Oct 11 12:32:56 UTC 2023 x86_64
User: xedaptot (3356)
PHP: 8.3.31
Disabled: NONE
Upload Files
File: /home/xedaptot/hi.naniguide.com/app/Services/AffiliateService.php
<?php

namespace App\Services;

use App\Models\Affiliate;
use App\Models\AffiliateReferral;
use App\Models\Customer;
use App\Models\Setting;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cookie;
use Illuminate\Support\Str;

class AffiliateService
{
    public const REF_COOKIE_NAME = 'mp_affiliate_ref';

    public function captureReferral(Request $request): void
    {
        $enabled = filter_var(Setting::get('affiliate_enabled', false), FILTER_VALIDATE_BOOLEAN);
        if (!$enabled) {
            return;
        }

        $code = $request->query('ref');
        if (!is_string($code) || trim($code) === '') {
            return;
        }

        $code = trim($code);

        $affiliate = Affiliate::query()
            ->where('code', $code)
            ->where('status', 'approved')
            ->first();

        if (!$affiliate) {
            return;
        }

        $days = (int) (Setting::get('affiliate_cookie_days', 30) ?? 30);
        if ($days <= 0) {
            $days = 30;
        }

        $request->session()->put('affiliate_visitor_id', $request->session()->get('affiliate_visitor_id') ?: Str::uuid()->toString());
        $visitorId = (string) $request->session()->get('affiliate_visitor_id');

        Cookie::queue(self::REF_COOKIE_NAME, (string) $affiliate->id, $days * 24 * 60);

        AffiliateReferral::create([
            'affiliate_id' => $affiliate->id,
            'visitor_id' => $visitorId,
            'landing_url' => $request->fullUrl(),
            'referrer_url' => $request->headers->get('referer'),
            'ip_address' => $request->ip(),
            'user_agent' => $request->userAgent(),
        ]);
    }

    public function attributeCustomerFromRequest(Customer $customer, Request $request): void
    {
        if ($customer->referred_by_affiliate_id) {
            return;
        }

        $enabled = filter_var(Setting::get('affiliate_enabled', false), FILTER_VALIDATE_BOOLEAN);
        if (!$enabled) {
            return;
        }

        $affiliateId = $request->cookie(self::REF_COOKIE_NAME);
        if (!is_string($affiliateId) || trim($affiliateId) === '') {
            return;
        }

        $affiliateId = (int) $affiliateId;
        if ($affiliateId <= 0) {
            return;
        }

        $affiliate = Affiliate::query()
            ->whereKey($affiliateId)
            ->where('status', 'approved')
            ->first();

        if (!$affiliate) {
            return;
        }

        $customer->forceFill([
            'referred_by_affiliate_id' => $affiliate->id,
            'referred_at' => now(),
        ])->save();

        $visitorId = $request->session()->get('affiliate_visitor_id');
        if (is_string($visitorId) && trim($visitorId) !== '') {
            $ref = AffiliateReferral::query()
                ->where('affiliate_id', $affiliate->id)
                ->where('visitor_id', $visitorId)
                ->whereNull('referred_customer_id')
                ->latest('id')
                ->first();

            if ($ref) {
                $ref->update([
                    'referred_customer_id' => $customer->id,
                    'referred_at' => now(),
                ]);
            }
        }
    }
}