로그인

Whoops! There was an error.
ErrorException (E_NOTICE)
Undefined property: Xpressengine\User\Models\Guest::$commerce_rating_rating_id ErrorException thrown with message "Undefined property: Xpressengine\User\Models\Guest::$commerce_rating_rating_id" Stacktrace: #66 ErrorException in /var/www/prj-aiorder/privates/xecommerce/src/Order/OrderService.php:653 #65 Illuminate\Foundation\Bootstrap\HandleExceptions:handleError in /var/www/prj-aiorder/privates/xecommerce/src/Order/OrderService.php:653 #64 Xehub\XePlugin\XeCommerce\Order\OrderService:getGradeSavePoint in /var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php:108 #63 call_user_func_array in /var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php:108 #62 Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService:_proxyTargetCall in /var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php:92 #61 call_user_func_array in /var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php:92 #60 Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService:Xpressengine\Interception\Proxy\{closure} in /var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php:96 #59 call_user_func_array in /var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php:96 #58 Xpressengine\Interception\ProxyInvocationHandler:__invoke in /var/www/prj-aiorder/privates/xehub_custom_develop/src/Providers/OrderProvider.php:313 #57 XEHub\XePlugin\XehubCustomDevelop\Providers\OrderProvider:XEHub\XePlugin\XehubCustomDevelop\Providers\{closure} in /var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php:93 #56 call_user_func_array in /var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php:93 #55 Xpressengine\Interception\ProxyInvocationHandler:__invoke in /var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php:74 #54 call_user_func_array in /var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php:74 #53 Xpressengine\Interception\ProxyInvocationHandler:callProxy in /var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php:94 #52 Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService:_proxyMethodCall in /var/www/prj-aiorder/storage/app/interception/Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService.php:132 #51 Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService:getGradeSavePoint in /var/www/prj-aiorder/privates/xecommerce/src/Order/OrderService.php:740 #50 Xehub\XePlugin\XeCommerce\Order\OrderService:setCustomerPoint in /var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php:108 #49 call_user_func_array in /var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php:108 #48 Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService:_proxyTargetCall in /var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php:92 #47 call_user_func_array in /var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php:92 #46 Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService:Xpressengine\Interception\Proxy\{closure} in /var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php:96 #45 call_user_func_array in /var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php:96 #44 Xpressengine\Interception\ProxyInvocationHandler:__invoke in /var/www/prj-aiorder/privates/xehub_custom_develop/src/Providers/InterceptProvider.php:109 #43 XEHub\XePlugin\XehubCustomDevelop\Providers\InterceptProvider:XEHub\XePlugin\XehubCustomDevelop\Providers\{closure} in /var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php:93 #42 call_user_func_array in /var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php:93 #41 Xpressengine\Interception\ProxyInvocationHandler:__invoke in /var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php:74 #40 call_user_func_array in /var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php:74 #39 Xpressengine\Interception\ProxyInvocationHandler:callProxy in /var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php:94 #38 Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService:_proxyMethodCall in /var/www/prj-aiorder/storage/app/interception/Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService.php:142 #37 Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService:setCustomerPoint in /var/www/prj-aiorder/privates/xecommerce/src/Order/OrderService.php:1290 #36 Xehub\XePlugin\XeCommerce\Order\OrderService:Xehub\XePlugin\XeCommerce\Order\{closure} in /var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Support/Collection.php:339 #35 Illuminate\Support\Collection:each in /var/www/prj-aiorder/privates/xecommerce/src/Order/OrderService.php:1303 #34 Xehub\XePlugin\XeCommerce\Order\OrderService:autoDecided in /var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php:108 #33 call_user_func_array in /var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php:108 #32 Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService:_proxyTargetCall in /var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php:92 #31 call_user_func_array in /var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php:92 #30 Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService:Xpressengine\Interception\Proxy\{closure} in /var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php:96 #29 call_user_func_array in /var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php:96 #28 Xpressengine\Interception\ProxyInvocationHandler:__invoke in /var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php:74 #27 call_user_func_array in /var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php:74 #26 Xpressengine\Interception\ProxyInvocationHandler:callProxy in /var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php:94 #25 Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService:_proxyMethodCall in /var/www/prj-aiorder/storage/app/interception/Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService.php:252 #24 Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService:autoDecided in /var/www/prj-aiorder/privates/xecommerce/src/Commands/CleanUp.php:63 #23 Xehub\XePlugin\XeCommerce\Commands\CleanUp:handle in /var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:29 #22 call_user_func_array in /var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:29 #21 Illuminate\Container\BoundMethod:Illuminate\Container\{closure} in /var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:87 #20 Illuminate\Container\BoundMethod:callBoundMethod in /var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:31 #19 Illuminate\Container\BoundMethod:call in /var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Container/Container.php:549 #18 Illuminate\Container\Container:call in /var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Console/Command.php:183 #17 Illuminate\Console\Command:execute in /var/www/prj-aiorder/vendor/symfony/console/Command/Command.php:255 #16 Symfony\Component\Console\Command\Command:run in /var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Console/Command.php:170 #15 Illuminate\Console\Command:run in /var/www/prj-aiorder/vendor/symfony/console/Application.php:992 #14 Symfony\Component\Console\Application:doRunCommand in /var/www/prj-aiorder/vendor/symfony/console/Application.php:255 #13 Symfony\Component\Console\Application:doRun in /var/www/prj-aiorder/vendor/symfony/console/Application.php:148 #12 Symfony\Component\Console\Application:run in /var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Console/Application.php:88 #11 Illuminate\Console\Application:run in /var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Console/Application.php:177 #10 Illuminate\Console\Application:call in /var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:249 #9 Illuminate\Foundation\Console\Kernel:call in /var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:221 #8 Illuminate\Support\Facades\Facade:__callStatic in /var/www/prj-aiorder/privates/xecommerce/plugin.php:184 #7 Xehub\XePlugin\XeCommerce\Plugin:Xehub\XePlugin\XeCommerce\{closure} in /var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:29 #6 call_user_func_array in /var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:29 #5 Illuminate\Container\BoundMethod:Illuminate\Container\{closure} in /var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:75 #4 Illuminate\Container\BoundMethod:callBoundMethod in /var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:31 #3 Illuminate\Container\BoundMethod:call in /var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Container/Container.php:549 #2 Illuminate\Container\Container:call in /var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:964 #1 Illuminate\Foundation\Application:terminate in /var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:191 #0 Illuminate\Foundation\Http\Kernel:terminate in /var/www/prj-aiorder/index.php:92
66
ErrorException
/privates/xecommerce/src/Order/OrderService.php653
65
Illuminate\Foundation\Bootstrap\HandleExceptions handleError
/privates/xecommerce/src/Order/OrderService.php653
64
Xehub\XePlugin\XeCommerce\Order\OrderService getGradeSavePoint
/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php108
63
call_user_func_array
/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php108
62
Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService _proxyTargetCall
/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php92
61
call_user_func_array
/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php92
60
Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService Xpressengine\Interception\Proxy\{closure}
/core/src/Xpressengine/Interception/ProxyInvocationHandler.php96
59
call_user_func_array
/core/src/Xpressengine/Interception/ProxyInvocationHandler.php96
58
Xpressengine\Interception\ProxyInvocationHandler __invoke
/privates/xehub_custom_develop/src/Providers/OrderProvider.php313
57
XEHub\XePlugin\XehubCustomDevelop\Providers\OrderProvider XEHub\XePlugin\XehubCustomDevelop\Providers\{closure}
/core/src/Xpressengine/Interception/ProxyInvocationHandler.php93
56
call_user_func_array
/core/src/Xpressengine/Interception/ProxyInvocationHandler.php93
55
Xpressengine\Interception\ProxyInvocationHandler __invoke
/core/src/Xpressengine/Interception/ProxyInvocationHandler.php74
54
call_user_func_array
/core/src/Xpressengine/Interception/ProxyInvocationHandler.php74
53
Xpressengine\Interception\ProxyInvocationHandler callProxy
/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php94
52
Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService _proxyMethodCall
/storage/app/interception/Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService.php132
51
Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService getGradeSavePoint
/privates/xecommerce/src/Order/OrderService.php740
50
Xehub\XePlugin\XeCommerce\Order\OrderService setCustomerPoint
/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php108
49
call_user_func_array
/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php108
48
Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService _proxyTargetCall
/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php92
47
call_user_func_array
/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php92
46
Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService Xpressengine\Interception\Proxy\{closure}
/core/src/Xpressengine/Interception/ProxyInvocationHandler.php96
45
call_user_func_array
/core/src/Xpressengine/Interception/ProxyInvocationHandler.php96
44
Xpressengine\Interception\ProxyInvocationHandler __invoke
/privates/xehub_custom_develop/src/Providers/InterceptProvider.php109
43
XEHub\XePlugin\XehubCustomDevelop\Providers\InterceptProvider XEHub\XePlugin\XehubCustomDevelop\Providers\{closure}
/core/src/Xpressengine/Interception/ProxyInvocationHandler.php93
42
call_user_func_array
/core/src/Xpressengine/Interception/ProxyInvocationHandler.php93
41
Xpressengine\Interception\ProxyInvocationHandler __invoke
/core/src/Xpressengine/Interception/ProxyInvocationHandler.php74
40
call_user_func_array
/core/src/Xpressengine/Interception/ProxyInvocationHandler.php74
39
Xpressengine\Interception\ProxyInvocationHandler callProxy
/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php94
38
Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService _proxyMethodCall
/storage/app/interception/Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService.php142
37
Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService setCustomerPoint
/privates/xecommerce/src/Order/OrderService.php1290
36
Xehub\XePlugin\XeCommerce\Order\OrderService Xehub\XePlugin\XeCommerce\Order\{closure}
/vendor/laravel/framework/src/Illuminate/Support/Collection.php339
35
Illuminate\Support\Collection each
/privates/xecommerce/src/Order/OrderService.php1303
34
Xehub\XePlugin\XeCommerce\Order\OrderService autoDecided
/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php108
33
call_user_func_array
/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php108
32
Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService _proxyTargetCall
/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php92
31
call_user_func_array
/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php92
30
Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService Xpressengine\Interception\Proxy\{closure}
/core/src/Xpressengine/Interception/ProxyInvocationHandler.php96
29
call_user_func_array
/core/src/Xpressengine/Interception/ProxyInvocationHandler.php96
28
Xpressengine\Interception\ProxyInvocationHandler __invoke
/core/src/Xpressengine/Interception/ProxyInvocationHandler.php74
27
call_user_func_array
/core/src/Xpressengine/Interception/ProxyInvocationHandler.php74
26
Xpressengine\Interception\ProxyInvocationHandler callProxy
/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php94
25
Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService _proxyMethodCall
/storage/app/interception/Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService.php252
24
Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService autoDecided
/privates/xecommerce/src/Commands/CleanUp.php63
23
Xehub\XePlugin\XeCommerce\Commands\CleanUp handle
/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php29
22
call_user_func_array
/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php29
21
Illuminate\Container\BoundMethod Illuminate\Container\{closure}
/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php87
20
Illuminate\Container\BoundMethod callBoundMethod
/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php31
19
Illuminate\Container\BoundMethod call
/vendor/laravel/framework/src/Illuminate/Container/Container.php549
18
Illuminate\Container\Container call
/vendor/laravel/framework/src/Illuminate/Console/Command.php183
17
Illuminate\Console\Command execute
/vendor/symfony/console/Command/Command.php255
16
Symfony\Component\Console\Command\Command run
/vendor/laravel/framework/src/Illuminate/Console/Command.php170
15
Illuminate\Console\Command run
/vendor/symfony/console/Application.php992
14
Symfony\Component\Console\Application doRunCommand
/vendor/symfony/console/Application.php255
13
Symfony\Component\Console\Application doRun
/vendor/symfony/console/Application.php148
12
Symfony\Component\Console\Application run
/vendor/laravel/framework/src/Illuminate/Console/Application.php88
11
Illuminate\Console\Application run
/vendor/laravel/framework/src/Illuminate/Console/Application.php177
10
Illuminate\Console\Application call
/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php249
9
Illuminate\Foundation\Console\Kernel call
/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php221
8
Illuminate\Support\Facades\Facade __callStatic
/privates/xecommerce/plugin.php184
7
Xehub\XePlugin\XeCommerce\Plugin Xehub\XePlugin\XeCommerce\{closure}
/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php29
6
call_user_func_array
/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php29
5
Illuminate\Container\BoundMethod Illuminate\Container\{closure}
/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php75
4
Illuminate\Container\BoundMethod callBoundMethod
/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php31
3
Illuminate\Container\BoundMethod call
/vendor/laravel/framework/src/Illuminate/Container/Container.php549
2
Illuminate\Container\Container call
/vendor/laravel/framework/src/Illuminate/Foundation/Application.php964
1
Illuminate\Foundation\Application terminate
/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php191
0
Illuminate\Foundation\Http\Kernel terminate
/index.php92
/var/www/prj-aiorder/privates/xecommerce/src/Order/OrderService.php
        if ($pointSaveConfig['percent'] > 0) {
            $basePoint = ($order->selling_price / 100) * $pointSaveConfig['percent'];
        }

        return $basePoint;
    }

    public function getGradeSavePoint(Order $order, Customer $customer = null)
    {
        // 비회원 지원 안함
        if ($customer == null && $order->user_id == false) {
            return 0;
        }

        if ($customer == null) {
            $customer = $this->customerService->getCustomerByUserId($order->user_id);
        }

        $gradePoint = '0';
        $rating = app('xehub_custom_develop.rating.handler')->getRating(auth()->user()->commerce_rating_rating_id);

        if ($rating && $rating->accumulate) {
            $gradePoint = ($order->selling_price / 100) * $rating->accumulate;
        }

//        if ($customer && $customer->customerGrade && $customer->customerGrade->benefit_commerce_point > 0) {
//            $gradePoint = ($order->price / 100) * $customer->customerGrade->benefit_commerce_point;
//        }

        return $gradePoint;
    }

    public function setCustomerPointToDraft(Order $order)
    {
        \Log::info('===> save point draft <<<<<---------');
        /**
         * 회원이 아니면 포인트 처리 안됨
         */
        if ($order->user_id == false) {
            return;
Arguments
  1. "Undefined property: Xpressengine\User\Models\Guest::$commerce_rating_rating_id"
    
/var/www/prj-aiorder/privates/xecommerce/src/Order/OrderService.php
        if ($pointSaveConfig['percent'] > 0) {
            $basePoint = ($order->selling_price / 100) * $pointSaveConfig['percent'];
        }

        return $basePoint;
    }

    public function getGradeSavePoint(Order $order, Customer $customer = null)
    {
        // 비회원 지원 안함
        if ($customer == null && $order->user_id == false) {
            return 0;
        }

        if ($customer == null) {
            $customer = $this->customerService->getCustomerByUserId($order->user_id);
        }

        $gradePoint = '0';
        $rating = app('xehub_custom_develop.rating.handler')->getRating(auth()->user()->commerce_rating_rating_id);

        if ($rating && $rating->accumulate) {
            $gradePoint = ($order->selling_price / 100) * $rating->accumulate;
        }

//        if ($customer && $customer->customerGrade && $customer->customerGrade->benefit_commerce_point > 0) {
//            $gradePoint = ($order->price / 100) * $customer->customerGrade->benefit_commerce_point;
//        }

        return $gradePoint;
    }

    public function setCustomerPointToDraft(Order $order)
    {
        \Log::info('===> save point draft <<<<<---------');
        /**
         * 회원이 아니면 포인트 처리 안됨
         */
        if ($order->user_id == false) {
            return;
/var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php
 
                return call_user_func_array(
                    [$this, '_proxyTargetCall'],
                    [$method, $args]
                );
            }
        );
    }
 
    /**
     * 본래 실행하려고 했던 실제 타겟 오브젝트의 메소드를 실행한다.
     *
     * @param string $method    origin method
     * @param array  $arguments argument of method call
     *
     * @return mixed
     */
    private function _proxyTargetCall($method, $arguments)
    {
        return call_user_func_array("parent::$method", $arguments);
    }
}
 
/var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php
 
                return call_user_func_array(
                    [$this, '_proxyTargetCall'],
                    [$method, $args]
                );
            }
        );
    }
 
    /**
     * 본래 실행하려고 했던 실제 타겟 오브젝트의 메소드를 실행한다.
     *
     * @param string $method    origin method
     * @param array  $arguments argument of method call
     *
     * @return mixed
     */
    private function _proxyTargetCall($method, $arguments)
    {
        return call_user_func_array("parent::$method", $arguments);
    }
}
 
/var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php
        /** @var AdvisorList $advisorList */
        $advisorList = $this->_getAdvisorCollection()->getAdvisorList(parent::class.'@'.$method);
 
        $invocationHandler = new ProxyInvocationHandler($this, $method, $advisorList);
 
        // 등록된 advisor들을 호출한다. advisor들이 실행되고 마지막으로 called method를 실행한다.
        return $invocationHandler->callProxy(
            $arguments,
            // 등록된 advisor들이 모두 호출된 다음 마지막에 호출되어 target의 origin method를 실행하는 클로저
            function () use ($method, $isCallMagicMethod) {
                $args = func_get_args();
 
                if ($isCallMagicMethod) {
                    array_unshift($args, $method);
                    $method = '__call';
                }
 
                return call_user_func_array(
                    [$this, '_proxyTargetCall'],
                    [$method, $args]
                );
            }
        );
    }
 
    /**
     * 본래 실행하려고 했던 실제 타겟 오브젝트의 메소드를 실행한다.
     *
     * @param string $method    origin method
     * @param array  $arguments argument of method call
     *
     * @return mixed
     */
    private function _proxyTargetCall($method, $arguments)
    {
        return call_user_func_array("parent::$method", $arguments);
    }
}
 
/var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php
        /** @var AdvisorList $advisorList */
        $advisorList = $this->_getAdvisorCollection()->getAdvisorList(parent::class.'@'.$method);
 
        $invocationHandler = new ProxyInvocationHandler($this, $method, $advisorList);
 
        // 등록된 advisor들을 호출한다. advisor들이 실행되고 마지막으로 called method를 실행한다.
        return $invocationHandler->callProxy(
            $arguments,
            // 등록된 advisor들이 모두 호출된 다음 마지막에 호출되어 target의 origin method를 실행하는 클로저
            function () use ($method, $isCallMagicMethod) {
                $args = func_get_args();
 
                if ($isCallMagicMethod) {
                    array_unshift($args, $method);
                    $method = '__call';
                }
 
                return call_user_func_array(
                    [$this, '_proxyTargetCall'],
                    [$method, $args]
                );
            }
        );
    }
 
    /**
     * 본래 실행하려고 했던 실제 타겟 오브젝트의 메소드를 실행한다.
     *
     * @param string $method    origin method
     * @param array  $arguments argument of method call
     *
     * @return mixed
     */
    private function _proxyTargetCall($method, $arguments)
    {
        return call_user_func_array("parent::$method", $arguments);
    }
}
 
/var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php
    /**
     * proxy object의 메소드가 실행될 경우, 메소드에 지정된 advisor를 모두 실행시킨다.
     * 이때 decorator 패턴으로 advisor들이 실행되는데,
     * 각 advisor들이 next call을 할 때 proxy는 자기 자신을 호출하도록 하여 결국 이 메소드가 실행된다.
     * 이 메소드가 호출되면 다음 advisor를 찾아서 실행시켜주고, 더이상 실행할 advisor가 없을 경우 원래 호출된 proxy object의 메소드를 실행한다.
     *
     * @return mixed
     */
    public function __invoke()
    {
        $args = func_get_args();
        $advisor = $this->advisorList->next();
 
        if ($advisor) {
            $advice = $advisor->getAdvice();
            $argsWithThis = array_merge([$this], $args);
            return call_user_func_array($advice, $argsWithThis);
        } else {
            $closure = $this->originMethodCall;
            return call_user_func_array($closure, $args);
        }
    }
 
    /**
     * target object(proxy object)를 반환한다.
     *
     * @return Object
     */
    public function getTargetObject()
    {
        return $this->proxyObject;
    }
 
    /**
     * 호출된 메소드명을 반환한다.
     *
     * @return string
     */
    public function getTargetMethodName()
    {
/var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php
    /**
     * proxy object의 메소드가 실행될 경우, 메소드에 지정된 advisor를 모두 실행시킨다.
     * 이때 decorator 패턴으로 advisor들이 실행되는데,
     * 각 advisor들이 next call을 할 때 proxy는 자기 자신을 호출하도록 하여 결국 이 메소드가 실행된다.
     * 이 메소드가 호출되면 다음 advisor를 찾아서 실행시켜주고, 더이상 실행할 advisor가 없을 경우 원래 호출된 proxy object의 메소드를 실행한다.
     *
     * @return mixed
     */
    public function __invoke()
    {
        $args = func_get_args();
        $advisor = $this->advisorList->next();
 
        if ($advisor) {
            $advice = $advisor->getAdvice();
            $argsWithThis = array_merge([$this], $args);
            return call_user_func_array($advice, $argsWithThis);
        } else {
            $closure = $this->originMethodCall;
            return call_user_func_array($closure, $args);
        }
    }
 
    /**
     * target object(proxy object)를 반환한다.
     *
     * @return Object
     */
    public function getTargetObject()
    {
        return $this->proxyObject;
    }
 
    /**
     * 호출된 메소드명을 반환한다.
     *
     * @return string
     */
    public function getTargetMethodName()
    {
/var/www/prj-aiorder/privates/xehub_custom_develop/src/Providers/OrderProvider.php
        intercept(
            OrderService::class . '@getConfigSavePoint',
            'xehub_custom_develop::getConfigSavePoint',
            static function ($method, Order $order, Customer $customer = null) {
                $configSavePoint = $method($order, $customer);
 
                if ($order->isGeneral()) {
                    $configSavePoint = 0;
                }
 
                return $configSavePoint;
            }
        );
 
        // 주문(order)에 대상에 따라 적립되는 등급(Grade) 포인트를 변경해줍니다.
        intercept(
            OrderService::class . '@getGradeSavePoint',
            'xehub_custom_develop::getGradeSavePoint',
            static function ($method, Order $order, Customer $customer = null) {
                $gradeSavePoint = $method($order, $customer);
 
                if ($order->isGeneral()) {
                    $gradeSavePoint = 0;
                }
 
                return $gradeSavePoint;
            }
        );
 
        // 주문 시 재고보다 더 많은 수를 주문할 수 없습니다.
        /** @TODO 11월 납품에는 재고 기능을 별도로 사용하지 않습니다. 임시로 주석 처리 */
//        intercept(
//            OrderService::class . '@newOrderItem',
//            'xehub_custom_develop::order::newOrderItem::outOfStock',
//            static function ($method, ProductOrderable $orderable, $quantity = 1, $shipping = 0, array $data = null) {
//                $product = $orderable->product;
//
//                if ($product && $product->is_manage_stock && $product->isGeneral() && $quantity > $product->stock_qty) {
//                    $exception = new HttpXpressengineException();
//                    $exception->setMessage('재고보다 더 많은 수를 주문할 수 없습니다.');
/var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php
        return call_user_func_array($this, $args);
    }
 
    /**
     * proxy object의 메소드가 실행될 경우, 메소드에 지정된 advisor를 모두 실행시킨다.
     * 이때 decorator 패턴으로 advisor들이 실행되는데,
     * 각 advisor들이 next call을 할 때 proxy는 자기 자신을 호출하도록 하여 결국 이 메소드가 실행된다.
     * 이 메소드가 호출되면 다음 advisor를 찾아서 실행시켜주고, 더이상 실행할 advisor가 없을 경우 원래 호출된 proxy object의 메소드를 실행한다.
     *
     * @return mixed
     */
    public function __invoke()
    {
        $args = func_get_args();
        $advisor = $this->advisorList->next();
 
        if ($advisor) {
            $advice = $advisor->getAdvice();
            $argsWithThis = array_merge([$this], $args);
            return call_user_func_array($advice, $argsWithThis);
        } else {
            $closure = $this->originMethodCall;
            return call_user_func_array($closure, $args);
        }
    }
 
    /**
     * target object(proxy object)를 반환한다.
     *
     * @return Object
     */
    public function getTargetObject()
    {
        return $this->proxyObject;
    }
 
    /**
     * 호출된 메소드명을 반환한다.
     *
     * @return string
/var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php
        return call_user_func_array($this, $args);
    }
 
    /**
     * proxy object의 메소드가 실행될 경우, 메소드에 지정된 advisor를 모두 실행시킨다.
     * 이때 decorator 패턴으로 advisor들이 실행되는데,
     * 각 advisor들이 next call을 할 때 proxy는 자기 자신을 호출하도록 하여 결국 이 메소드가 실행된다.
     * 이 메소드가 호출되면 다음 advisor를 찾아서 실행시켜주고, 더이상 실행할 advisor가 없을 경우 원래 호출된 proxy object의 메소드를 실행한다.
     *
     * @return mixed
     */
    public function __invoke()
    {
        $args = func_get_args();
        $advisor = $this->advisorList->next();
 
        if ($advisor) {
            $advice = $advisor->getAdvice();
            $argsWithThis = array_merge([$this], $args);
            return call_user_func_array($advice, $argsWithThis);
        } else {
            $closure = $this->originMethodCall;
            return call_user_func_array($closure, $args);
        }
    }
 
    /**
     * target object(proxy object)를 반환한다.
     *
     * @return Object
     */
    public function getTargetObject()
    {
        return $this->proxyObject;
    }
 
    /**
     * 호출된 메소드명을 반환한다.
     *
     * @return string
/var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php
     */
    public function __construct($proxyObject, $methodName, AdvisorList $advisorList)
    {
        $this->proxyObject = $proxyObject;
        $this->targetMethodName = $methodName;
        $this->advisorList = $advisorList;
    }
 
    /**
     * target class의 origin method가 실행되기 전에 호출되어야 할 advisor를 호출한 다음, 마지막으로 origin method를 호출한다.
     *
     * @param array   $args 호출된 메소드가 받은 파라메터 리스트
     * @param Closure $then 호출된 메소드, advisor를 모두 호출한 후 이 Closure가 실행된다.
     *
     * @return mixed
     */
    public function callProxy(array $args, Closure $then)
    {
        $this->originMethodCall = $then;
        return call_user_func_array($this, $args);
    }
 
    /**
     * proxy object의 메소드가 실행될 경우, 메소드에 지정된 advisor를 모두 실행시킨다.
     * 이때 decorator 패턴으로 advisor들이 실행되는데,
     * 각 advisor들이 next call을 할 때 proxy는 자기 자신을 호출하도록 하여 결국 이 메소드가 실행된다.
     * 이 메소드가 호출되면 다음 advisor를 찾아서 실행시켜주고, 더이상 실행할 advisor가 없을 경우 원래 호출된 proxy object의 메소드를 실행한다.
     *
     * @return mixed
     */
    public function __invoke()
    {
        $args = func_get_args();
        $advisor = $this->advisorList->next();
 
        if ($advisor) {
            $advice = $advisor->getAdvice();
            $argsWithThis = array_merge([$this], $args);
            return call_user_func_array($advice, $argsWithThis);
        } else {
/var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php
     */
    public function __construct($proxyObject, $methodName, AdvisorList $advisorList)
    {
        $this->proxyObject = $proxyObject;
        $this->targetMethodName = $methodName;
        $this->advisorList = $advisorList;
    }
 
    /**
     * target class의 origin method가 실행되기 전에 호출되어야 할 advisor를 호출한 다음, 마지막으로 origin method를 호출한다.
     *
     * @param array   $args 호출된 메소드가 받은 파라메터 리스트
     * @param Closure $then 호출된 메소드, advisor를 모두 호출한 후 이 Closure가 실행된다.
     *
     * @return mixed
     */
    public function callProxy(array $args, Closure $then)
    {
        $this->originMethodCall = $then;
        return call_user_func_array($this, $args);
    }
 
    /**
     * proxy object의 메소드가 실행될 경우, 메소드에 지정된 advisor를 모두 실행시킨다.
     * 이때 decorator 패턴으로 advisor들이 실행되는데,
     * 각 advisor들이 next call을 할 때 proxy는 자기 자신을 호출하도록 하여 결국 이 메소드가 실행된다.
     * 이 메소드가 호출되면 다음 advisor를 찾아서 실행시켜주고, 더이상 실행할 advisor가 없을 경우 원래 호출된 proxy object의 메소드를 실행한다.
     *
     * @return mixed
     */
    public function __invoke()
    {
        $args = func_get_args();
        $advisor = $this->advisorList->next();
 
        if ($advisor) {
            $advice = $advisor->getAdvice();
            $argsWithThis = array_merge([$this], $args);
            return call_user_func_array($advice, $argsWithThis);
        } else {
/var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php
 
        $invocationHandler = new ProxyInvocationHandler($this, $method, $advisorList);
 
        // 등록된 advisor들을 호출한다. advisor들이 실행되고 마지막으로 called method를 실행한다.
        return $invocationHandler->callProxy(
            $arguments,
            // 등록된 advisor들이 모두 호출된 다음 마지막에 호출되어 target의 origin method를 실행하는 클로저
            function () use ($method, $isCallMagicMethod) {
                $args = func_get_args();
 
                if ($isCallMagicMethod) {
                    array_unshift($args, $method);
                    $method = '__call';
                }
 
                return call_user_func_array(
                    [$this, '_proxyTargetCall'],
                    [$method, $args]
                );
            }
        );
    }
 
    /**
     * 본래 실행하려고 했던 실제 타겟 오브젝트의 메소드를 실행한다.
     *
     * @param string $method    origin method
     * @param array  $arguments argument of method call
     *
     * @return mixed
     */
    private function _proxyTargetCall($method, $arguments)
    {
        return call_user_func_array("parent::$method", $arguments);
    }
}
 
/var/www/prj-aiorder/storage/app/interception/Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService.php
        return $ret;
    }
    public function updateToPaid(Xehub\XePlugin\XeCommerce\Order\OrderItem $item,  $force = false)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
        return $ret;
    }
    public function getOrderSavePoint(Xehub\XePlugin\XeCommerce\Order\Order $order, Xehub\XePlugin\XeCommerce\Models\Customer $customer = NULL)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
        return $ret;
    }
    public function getConfigSavePoint(Xehub\XePlugin\XeCommerce\Order\Order $order, Xehub\XePlugin\XeCommerce\Models\Customer $customer = NULL)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
        return $ret;
    }
    public function getGradeSavePoint(Xehub\XePlugin\XeCommerce\Order\Order $order, Xehub\XePlugin\XeCommerce\Models\Customer $customer = NULL)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
        return $ret;
    }
    public function setCustomerPointToDraft(Xehub\XePlugin\XeCommerce\Order\Order $order)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
        return $ret;
    }
    public function setCustomerPoint(Xehub\XePlugin\XeCommerce\Order\Order $order)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
        return $ret;
    }
    public function updateToStandby(Xehub\XePlugin\XeCommerce\Order\OrderItem $item,  $force = false)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
        return $ret;
    }
    public function updateToShipping(Xehub\XePlugin\XeCommerce\Order\OrderItem $item,  $force = false)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
/var/www/prj-aiorder/privates/xecommerce/src/Order/OrderService.php
//                    $order->id
//                );
//            }
//        }
    }

    public function setCustomerPoint(Order $order)
    {
        \Log::info('===> save point <<<<<---------');
        /**
         * 회원이 아니면 포인트 처리 안됨
         */
        if ($order->user_id == false) {
            return;
        }

        $basePoint = $this->getConfigSavePoint($order);
        $gradePoint = 0;
        if ($order->user()->isAdmin()) {
            $gradePoint = $this->getGradeSavePoint($order);
        }

        $totalPoint = $basePoint + $gradePoint;

        if ($totalPoint > 0) {
            $this->customerService->addCustomerPoint(
                $order->user_id,
                $totalPoint,
                'no-base',
                null,
                '구매 적립',
                '',
                'I',
                $order->id
            );
        }

//        if ($basePoint > 0) {
//            $this->customerService->addCustomerPoint(
//                $order->user_id,
/var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php
 
                return call_user_func_array(
                    [$this, '_proxyTargetCall'],
                    [$method, $args]
                );
            }
        );
    }
 
    /**
     * 본래 실행하려고 했던 실제 타겟 오브젝트의 메소드를 실행한다.
     *
     * @param string $method    origin method
     * @param array  $arguments argument of method call
     *
     * @return mixed
     */
    private function _proxyTargetCall($method, $arguments)
    {
        return call_user_func_array("parent::$method", $arguments);
    }
}
 
/var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php
 
                return call_user_func_array(
                    [$this, '_proxyTargetCall'],
                    [$method, $args]
                );
            }
        );
    }
 
    /**
     * 본래 실행하려고 했던 실제 타겟 오브젝트의 메소드를 실행한다.
     *
     * @param string $method    origin method
     * @param array  $arguments argument of method call
     *
     * @return mixed
     */
    private function _proxyTargetCall($method, $arguments)
    {
        return call_user_func_array("parent::$method", $arguments);
    }
}
 
/var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php
        /** @var AdvisorList $advisorList */
        $advisorList = $this->_getAdvisorCollection()->getAdvisorList(parent::class.'@'.$method);
 
        $invocationHandler = new ProxyInvocationHandler($this, $method, $advisorList);
 
        // 등록된 advisor들을 호출한다. advisor들이 실행되고 마지막으로 called method를 실행한다.
        return $invocationHandler->callProxy(
            $arguments,
            // 등록된 advisor들이 모두 호출된 다음 마지막에 호출되어 target의 origin method를 실행하는 클로저
            function () use ($method, $isCallMagicMethod) {
                $args = func_get_args();
 
                if ($isCallMagicMethod) {
                    array_unshift($args, $method);
                    $method = '__call';
                }
 
                return call_user_func_array(
                    [$this, '_proxyTargetCall'],
                    [$method, $args]
                );
            }
        );
    }
 
    /**
     * 본래 실행하려고 했던 실제 타겟 오브젝트의 메소드를 실행한다.
     *
     * @param string $method    origin method
     * @param array  $arguments argument of method call
     *
     * @return mixed
     */
    private function _proxyTargetCall($method, $arguments)
    {
        return call_user_func_array("parent::$method", $arguments);
    }
}
 
/var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php
        /** @var AdvisorList $advisorList */
        $advisorList = $this->_getAdvisorCollection()->getAdvisorList(parent::class.'@'.$method);
 
        $invocationHandler = new ProxyInvocationHandler($this, $method, $advisorList);
 
        // 등록된 advisor들을 호출한다. advisor들이 실행되고 마지막으로 called method를 실행한다.
        return $invocationHandler->callProxy(
            $arguments,
            // 등록된 advisor들이 모두 호출된 다음 마지막에 호출되어 target의 origin method를 실행하는 클로저
            function () use ($method, $isCallMagicMethod) {
                $args = func_get_args();
 
                if ($isCallMagicMethod) {
                    array_unshift($args, $method);
                    $method = '__call';
                }
 
                return call_user_func_array(
                    [$this, '_proxyTargetCall'],
                    [$method, $args]
                );
            }
        );
    }
 
    /**
     * 본래 실행하려고 했던 실제 타겟 오브젝트의 메소드를 실행한다.
     *
     * @param string $method    origin method
     * @param array  $arguments argument of method call
     *
     * @return mixed
     */
    private function _proxyTargetCall($method, $arguments)
    {
        return call_user_func_array("parent::$method", $arguments);
    }
}
 
/var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php
    /**
     * proxy object의 메소드가 실행될 경우, 메소드에 지정된 advisor를 모두 실행시킨다.
     * 이때 decorator 패턴으로 advisor들이 실행되는데,
     * 각 advisor들이 next call을 할 때 proxy는 자기 자신을 호출하도록 하여 결국 이 메소드가 실행된다.
     * 이 메소드가 호출되면 다음 advisor를 찾아서 실행시켜주고, 더이상 실행할 advisor가 없을 경우 원래 호출된 proxy object의 메소드를 실행한다.
     *
     * @return mixed
     */
    public function __invoke()
    {
        $args = func_get_args();
        $advisor = $this->advisorList->next();
 
        if ($advisor) {
            $advice = $advisor->getAdvice();
            $argsWithThis = array_merge([$this], $args);
            return call_user_func_array($advice, $argsWithThis);
        } else {
            $closure = $this->originMethodCall;
            return call_user_func_array($closure, $args);
        }
    }
 
    /**
     * target object(proxy object)를 반환한다.
     *
     * @return Object
     */
    public function getTargetObject()
    {
        return $this->proxyObject;
    }
 
    /**
     * 호출된 메소드명을 반환한다.
     *
     * @return string
     */
    public function getTargetMethodName()
    {
/var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php
    /**
     * proxy object의 메소드가 실행될 경우, 메소드에 지정된 advisor를 모두 실행시킨다.
     * 이때 decorator 패턴으로 advisor들이 실행되는데,
     * 각 advisor들이 next call을 할 때 proxy는 자기 자신을 호출하도록 하여 결국 이 메소드가 실행된다.
     * 이 메소드가 호출되면 다음 advisor를 찾아서 실행시켜주고, 더이상 실행할 advisor가 없을 경우 원래 호출된 proxy object의 메소드를 실행한다.
     *
     * @return mixed
     */
    public function __invoke()
    {
        $args = func_get_args();
        $advisor = $this->advisorList->next();
 
        if ($advisor) {
            $advice = $advisor->getAdvice();
            $argsWithThis = array_merge([$this], $args);
            return call_user_func_array($advice, $argsWithThis);
        } else {
            $closure = $this->originMethodCall;
            return call_user_func_array($closure, $args);
        }
    }
 
    /**
     * target object(proxy object)를 반환한다.
     *
     * @return Object
     */
    public function getTargetObject()
    {
        return $this->proxyObject;
    }
 
    /**
     * 호출된 메소드명을 반환한다.
     *
     * @return string
     */
    public function getTargetMethodName()
    {
/var/www/prj-aiorder/privates/xehub_custom_develop/src/Providers/InterceptProvider.php
            intercept(
                $intercept['target'],
                $intercept['name'],
                call_user_func($intercept['callback'])
            );
        }
    }
 
    /**
     * 인터셉트 1: 주문 결제 후 유저별 일일 결제 합계 기록
     * = 구매완료로 포인트 지급되는 시점에서 이달의 결제 금액, 건수 결제
     *
     * OrderService::setCustomerPoint 호출 후 실행됩니다.
     *
     * @return \Closure
     */
    public static function interceptOrderServiceSetCustomerPoint(): \Closure
    {
        return function ($func, $order = null) {
            $func($order);
 
            if (!$order || !$order->user || $order->selling_price <= 0) {
                return;
            }
 
            $date = date('Ymd');
 
            $userPaySum = UserPaySum::where('user_id', $order->user_id)
                ->where('pay_date', $date)
                ->first();
 
            if ($userPaySum) {
                $userPaySum->pay_sum += $order->selling_price;
                $userPaySum->pay_count += 1;
            } else {
                $userPaySum = new UserPaySum();
                $userPaySum->user_id = $order->user_id;
                $userPaySum->pay_date = $date;
                $userPaySum->pay_sum = $order->selling_price;
                $userPaySum->pay_count = 1;
/var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php
        return call_user_func_array($this, $args);
    }
 
    /**
     * proxy object의 메소드가 실행될 경우, 메소드에 지정된 advisor를 모두 실행시킨다.
     * 이때 decorator 패턴으로 advisor들이 실행되는데,
     * 각 advisor들이 next call을 할 때 proxy는 자기 자신을 호출하도록 하여 결국 이 메소드가 실행된다.
     * 이 메소드가 호출되면 다음 advisor를 찾아서 실행시켜주고, 더이상 실행할 advisor가 없을 경우 원래 호출된 proxy object의 메소드를 실행한다.
     *
     * @return mixed
     */
    public function __invoke()
    {
        $args = func_get_args();
        $advisor = $this->advisorList->next();
 
        if ($advisor) {
            $advice = $advisor->getAdvice();
            $argsWithThis = array_merge([$this], $args);
            return call_user_func_array($advice, $argsWithThis);
        } else {
            $closure = $this->originMethodCall;
            return call_user_func_array($closure, $args);
        }
    }
 
    /**
     * target object(proxy object)를 반환한다.
     *
     * @return Object
     */
    public function getTargetObject()
    {
        return $this->proxyObject;
    }
 
    /**
     * 호출된 메소드명을 반환한다.
     *
     * @return string
/var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php
        return call_user_func_array($this, $args);
    }
 
    /**
     * proxy object의 메소드가 실행될 경우, 메소드에 지정된 advisor를 모두 실행시킨다.
     * 이때 decorator 패턴으로 advisor들이 실행되는데,
     * 각 advisor들이 next call을 할 때 proxy는 자기 자신을 호출하도록 하여 결국 이 메소드가 실행된다.
     * 이 메소드가 호출되면 다음 advisor를 찾아서 실행시켜주고, 더이상 실행할 advisor가 없을 경우 원래 호출된 proxy object의 메소드를 실행한다.
     *
     * @return mixed
     */
    public function __invoke()
    {
        $args = func_get_args();
        $advisor = $this->advisorList->next();
 
        if ($advisor) {
            $advice = $advisor->getAdvice();
            $argsWithThis = array_merge([$this], $args);
            return call_user_func_array($advice, $argsWithThis);
        } else {
            $closure = $this->originMethodCall;
            return call_user_func_array($closure, $args);
        }
    }
 
    /**
     * target object(proxy object)를 반환한다.
     *
     * @return Object
     */
    public function getTargetObject()
    {
        return $this->proxyObject;
    }
 
    /**
     * 호출된 메소드명을 반환한다.
     *
     * @return string
/var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php
     */
    public function __construct($proxyObject, $methodName, AdvisorList $advisorList)
    {
        $this->proxyObject = $proxyObject;
        $this->targetMethodName = $methodName;
        $this->advisorList = $advisorList;
    }
 
    /**
     * target class의 origin method가 실행되기 전에 호출되어야 할 advisor를 호출한 다음, 마지막으로 origin method를 호출한다.
     *
     * @param array   $args 호출된 메소드가 받은 파라메터 리스트
     * @param Closure $then 호출된 메소드, advisor를 모두 호출한 후 이 Closure가 실행된다.
     *
     * @return mixed
     */
    public function callProxy(array $args, Closure $then)
    {
        $this->originMethodCall = $then;
        return call_user_func_array($this, $args);
    }
 
    /**
     * proxy object의 메소드가 실행될 경우, 메소드에 지정된 advisor를 모두 실행시킨다.
     * 이때 decorator 패턴으로 advisor들이 실행되는데,
     * 각 advisor들이 next call을 할 때 proxy는 자기 자신을 호출하도록 하여 결국 이 메소드가 실행된다.
     * 이 메소드가 호출되면 다음 advisor를 찾아서 실행시켜주고, 더이상 실행할 advisor가 없을 경우 원래 호출된 proxy object의 메소드를 실행한다.
     *
     * @return mixed
     */
    public function __invoke()
    {
        $args = func_get_args();
        $advisor = $this->advisorList->next();
 
        if ($advisor) {
            $advice = $advisor->getAdvice();
            $argsWithThis = array_merge([$this], $args);
            return call_user_func_array($advice, $argsWithThis);
        } else {
/var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php
     */
    public function __construct($proxyObject, $methodName, AdvisorList $advisorList)
    {
        $this->proxyObject = $proxyObject;
        $this->targetMethodName = $methodName;
        $this->advisorList = $advisorList;
    }
 
    /**
     * target class의 origin method가 실행되기 전에 호출되어야 할 advisor를 호출한 다음, 마지막으로 origin method를 호출한다.
     *
     * @param array   $args 호출된 메소드가 받은 파라메터 리스트
     * @param Closure $then 호출된 메소드, advisor를 모두 호출한 후 이 Closure가 실행된다.
     *
     * @return mixed
     */
    public function callProxy(array $args, Closure $then)
    {
        $this->originMethodCall = $then;
        return call_user_func_array($this, $args);
    }
 
    /**
     * proxy object의 메소드가 실행될 경우, 메소드에 지정된 advisor를 모두 실행시킨다.
     * 이때 decorator 패턴으로 advisor들이 실행되는데,
     * 각 advisor들이 next call을 할 때 proxy는 자기 자신을 호출하도록 하여 결국 이 메소드가 실행된다.
     * 이 메소드가 호출되면 다음 advisor를 찾아서 실행시켜주고, 더이상 실행할 advisor가 없을 경우 원래 호출된 proxy object의 메소드를 실행한다.
     *
     * @return mixed
     */
    public function __invoke()
    {
        $args = func_get_args();
        $advisor = $this->advisorList->next();
 
        if ($advisor) {
            $advice = $advisor->getAdvice();
            $argsWithThis = array_merge([$this], $args);
            return call_user_func_array($advice, $argsWithThis);
        } else {
/var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php
 
        $invocationHandler = new ProxyInvocationHandler($this, $method, $advisorList);
 
        // 등록된 advisor들을 호출한다. advisor들이 실행되고 마지막으로 called method를 실행한다.
        return $invocationHandler->callProxy(
            $arguments,
            // 등록된 advisor들이 모두 호출된 다음 마지막에 호출되어 target의 origin method를 실행하는 클로저
            function () use ($method, $isCallMagicMethod) {
                $args = func_get_args();
 
                if ($isCallMagicMethod) {
                    array_unshift($args, $method);
                    $method = '__call';
                }
 
                return call_user_func_array(
                    [$this, '_proxyTargetCall'],
                    [$method, $args]
                );
            }
        );
    }
 
    /**
     * 본래 실행하려고 했던 실제 타겟 오브젝트의 메소드를 실행한다.
     *
     * @param string $method    origin method
     * @param array  $arguments argument of method call
     *
     * @return mixed
     */
    private function _proxyTargetCall($method, $arguments)
    {
        return call_user_func_array("parent::$method", $arguments);
    }
}
 
/var/www/prj-aiorder/storage/app/interception/Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService.php
        return $ret;
    }
    public function getConfigSavePoint(Xehub\XePlugin\XeCommerce\Order\Order $order, Xehub\XePlugin\XeCommerce\Models\Customer $customer = NULL)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
        return $ret;
    }
    public function getGradeSavePoint(Xehub\XePlugin\XeCommerce\Order\Order $order, Xehub\XePlugin\XeCommerce\Models\Customer $customer = NULL)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
        return $ret;
    }
    public function setCustomerPointToDraft(Xehub\XePlugin\XeCommerce\Order\Order $order)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
        return $ret;
    }
    public function setCustomerPoint(Xehub\XePlugin\XeCommerce\Order\Order $order)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
        return $ret;
    }
    public function updateToStandby(Xehub\XePlugin\XeCommerce\Order\OrderItem $item,  $force = false)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
        return $ret;
    }
    public function updateToShipping(Xehub\XePlugin\XeCommerce\Order\OrderItem $item,  $force = false)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
        return $ret;
    }
    public function updateToCompleted(Xehub\XePlugin\XeCommerce\Order\OrderItem $item)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
        return $ret;
    }
    public function updateToTerminated(Xehub\XePlugin\XeCommerce\Order\OrderItem $item)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
/var/www/prj-aiorder/privates/xecommerce/src/Order/OrderService.php
                    $this->updateToCompleted($item);
                }
            });
        });
    }

    /**
     * 자동 구매 확정 처리
     * 구매 완료 내역을 확정 처리 (주문을 정산 가능 형태로 변경)
     *
     * @param $startDate
     * @param $endDate
     */
    public function autoDecided($startDate, $endDate)
    {
        $orders = $this->getNotDecidedOrders(OrderItem::STATUS_COMPLETED, $startDate, $endDate);

        $orders->each(function ($order) {
            // 포인트 적립
            $this->setCustomerPoint($order);

            $order->items->each(function ($item) {
                // 취소요청 중이거나 취소완료 상태면 구매확정 처리하지 않음
                if ($item->cancellation) {
                    if ($item->cancellation->statusIsRequest() || $item->cancellation->statusIsApprove()) {
                        return;
                    }
                }
                $this->updateToDecide($item);
            });

            $this->customerService->updateCustomerOrder($order);
        });
    }

    /**
     * 단일 상품 구매
     *
     * @param $productId
     * @param $quantity
/var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Support/Collection.php
     * Get the items in the collection whose keys are not present in the given items.
     *
     * @param  mixed  $items
     * @return static
     */
    public function diffKeys($items)
    {
        return new static(array_diff_key($this->items, $this->getArrayableItems($items)));
    }
 
    /**
     * Execute a callback over each item.
     *
     * @param  callable  $callback
     * @return $this
     */
    public function each(callable $callback)
    {
        foreach ($this->items as $key => $item) {
            if ($callback($item, $key) === false) {
                break;
            }
        }
 
        return $this;
    }
 
    /**
     * Execute a callback over each nested chunk of items.
     *
     * @param  callable  $callback
     * @return static
     */
    public function eachSpread(callable $callback)
    {
        return $this->each(function ($chunk, $key) use ($callback) {
            $chunk[] = $key;
 
            return $callback(...$chunk);
        });
/var/www/prj-aiorder/privates/xecommerce/src/Order/OrderService.php
    public function autoDecided($startDate, $endDate)
    {
        $orders = $this->getNotDecidedOrders(OrderItem::STATUS_COMPLETED, $startDate, $endDate);

        $orders->each(function ($order) {
            // 포인트 적립
            $this->setCustomerPoint($order);

            $order->items->each(function ($item) {
                // 취소요청 중이거나 취소완료 상태면 구매확정 처리하지 않음
                if ($item->cancellation) {
                    if ($item->cancellation->statusIsRequest() || $item->cancellation->statusIsApprove()) {
                        return;
                    }
                }
                $this->updateToDecide($item);
            });

            $this->customerService->updateCustomerOrder($order);
        });
    }

    /**
     * 단일 상품 구매
     *
     * @param $productId
     * @param $quantity
     * @param  UserInterface|null  $user
     * @return Order
     * @throws \Throwable
     */
    public function createOrderSimple($productId, $quantity, UserInterface $user = null)
    {
        \XeDB::beginTransaction();
        try {
            $product = \Xehub\XePlugin\XeCommerce\Product\Product::with([
                'ship',
                'options.attrs.vals',
                'options.units' => function ($query) {
                    $query->with('attrVals')->hidden(false);
/var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php
 
                return call_user_func_array(
                    [$this, '_proxyTargetCall'],
                    [$method, $args]
                );
            }
        );
    }
 
    /**
     * 본래 실행하려고 했던 실제 타겟 오브젝트의 메소드를 실행한다.
     *
     * @param string $method    origin method
     * @param array  $arguments argument of method call
     *
     * @return mixed
     */
    private function _proxyTargetCall($method, $arguments)
    {
        return call_user_func_array("parent::$method", $arguments);
    }
}
 
/var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php
 
                return call_user_func_array(
                    [$this, '_proxyTargetCall'],
                    [$method, $args]
                );
            }
        );
    }
 
    /**
     * 본래 실행하려고 했던 실제 타겟 오브젝트의 메소드를 실행한다.
     *
     * @param string $method    origin method
     * @param array  $arguments argument of method call
     *
     * @return mixed
     */
    private function _proxyTargetCall($method, $arguments)
    {
        return call_user_func_array("parent::$method", $arguments);
    }
}
 
/var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php
        /** @var AdvisorList $advisorList */
        $advisorList = $this->_getAdvisorCollection()->getAdvisorList(parent::class.'@'.$method);
 
        $invocationHandler = new ProxyInvocationHandler($this, $method, $advisorList);
 
        // 등록된 advisor들을 호출한다. advisor들이 실행되고 마지막으로 called method를 실행한다.
        return $invocationHandler->callProxy(
            $arguments,
            // 등록된 advisor들이 모두 호출된 다음 마지막에 호출되어 target의 origin method를 실행하는 클로저
            function () use ($method, $isCallMagicMethod) {
                $args = func_get_args();
 
                if ($isCallMagicMethod) {
                    array_unshift($args, $method);
                    $method = '__call';
                }
 
                return call_user_func_array(
                    [$this, '_proxyTargetCall'],
                    [$method, $args]
                );
            }
        );
    }
 
    /**
     * 본래 실행하려고 했던 실제 타겟 오브젝트의 메소드를 실행한다.
     *
     * @param string $method    origin method
     * @param array  $arguments argument of method call
     *
     * @return mixed
     */
    private function _proxyTargetCall($method, $arguments)
    {
        return call_user_func_array("parent::$method", $arguments);
    }
}
 
/var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php
        /** @var AdvisorList $advisorList */
        $advisorList = $this->_getAdvisorCollection()->getAdvisorList(parent::class.'@'.$method);
 
        $invocationHandler = new ProxyInvocationHandler($this, $method, $advisorList);
 
        // 등록된 advisor들을 호출한다. advisor들이 실행되고 마지막으로 called method를 실행한다.
        return $invocationHandler->callProxy(
            $arguments,
            // 등록된 advisor들이 모두 호출된 다음 마지막에 호출되어 target의 origin method를 실행하는 클로저
            function () use ($method, $isCallMagicMethod) {
                $args = func_get_args();
 
                if ($isCallMagicMethod) {
                    array_unshift($args, $method);
                    $method = '__call';
                }
 
                return call_user_func_array(
                    [$this, '_proxyTargetCall'],
                    [$method, $args]
                );
            }
        );
    }
 
    /**
     * 본래 실행하려고 했던 실제 타겟 오브젝트의 메소드를 실행한다.
     *
     * @param string $method    origin method
     * @param array  $arguments argument of method call
     *
     * @return mixed
     */
    private function _proxyTargetCall($method, $arguments)
    {
        return call_user_func_array("parent::$method", $arguments);
    }
}
 
/var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php
    /**
     * proxy object의 메소드가 실행될 경우, 메소드에 지정된 advisor를 모두 실행시킨다.
     * 이때 decorator 패턴으로 advisor들이 실행되는데,
     * 각 advisor들이 next call을 할 때 proxy는 자기 자신을 호출하도록 하여 결국 이 메소드가 실행된다.
     * 이 메소드가 호출되면 다음 advisor를 찾아서 실행시켜주고, 더이상 실행할 advisor가 없을 경우 원래 호출된 proxy object의 메소드를 실행한다.
     *
     * @return mixed
     */
    public function __invoke()
    {
        $args = func_get_args();
        $advisor = $this->advisorList->next();
 
        if ($advisor) {
            $advice = $advisor->getAdvice();
            $argsWithThis = array_merge([$this], $args);
            return call_user_func_array($advice, $argsWithThis);
        } else {
            $closure = $this->originMethodCall;
            return call_user_func_array($closure, $args);
        }
    }
 
    /**
     * target object(proxy object)를 반환한다.
     *
     * @return Object
     */
    public function getTargetObject()
    {
        return $this->proxyObject;
    }
 
    /**
     * 호출된 메소드명을 반환한다.
     *
     * @return string
     */
    public function getTargetMethodName()
    {
/var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php
    /**
     * proxy object의 메소드가 실행될 경우, 메소드에 지정된 advisor를 모두 실행시킨다.
     * 이때 decorator 패턴으로 advisor들이 실행되는데,
     * 각 advisor들이 next call을 할 때 proxy는 자기 자신을 호출하도록 하여 결국 이 메소드가 실행된다.
     * 이 메소드가 호출되면 다음 advisor를 찾아서 실행시켜주고, 더이상 실행할 advisor가 없을 경우 원래 호출된 proxy object의 메소드를 실행한다.
     *
     * @return mixed
     */
    public function __invoke()
    {
        $args = func_get_args();
        $advisor = $this->advisorList->next();
 
        if ($advisor) {
            $advice = $advisor->getAdvice();
            $argsWithThis = array_merge([$this], $args);
            return call_user_func_array($advice, $argsWithThis);
        } else {
            $closure = $this->originMethodCall;
            return call_user_func_array($closure, $args);
        }
    }
 
    /**
     * target object(proxy object)를 반환한다.
     *
     * @return Object
     */
    public function getTargetObject()
    {
        return $this->proxyObject;
    }
 
    /**
     * 호출된 메소드명을 반환한다.
     *
     * @return string
     */
    public function getTargetMethodName()
    {
/var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php
     */
    public function __construct($proxyObject, $methodName, AdvisorList $advisorList)
    {
        $this->proxyObject = $proxyObject;
        $this->targetMethodName = $methodName;
        $this->advisorList = $advisorList;
    }
 
    /**
     * target class의 origin method가 실행되기 전에 호출되어야 할 advisor를 호출한 다음, 마지막으로 origin method를 호출한다.
     *
     * @param array   $args 호출된 메소드가 받은 파라메터 리스트
     * @param Closure $then 호출된 메소드, advisor를 모두 호출한 후 이 Closure가 실행된다.
     *
     * @return mixed
     */
    public function callProxy(array $args, Closure $then)
    {
        $this->originMethodCall = $then;
        return call_user_func_array($this, $args);
    }
 
    /**
     * proxy object의 메소드가 실행될 경우, 메소드에 지정된 advisor를 모두 실행시킨다.
     * 이때 decorator 패턴으로 advisor들이 실행되는데,
     * 각 advisor들이 next call을 할 때 proxy는 자기 자신을 호출하도록 하여 결국 이 메소드가 실행된다.
     * 이 메소드가 호출되면 다음 advisor를 찾아서 실행시켜주고, 더이상 실행할 advisor가 없을 경우 원래 호출된 proxy object의 메소드를 실행한다.
     *
     * @return mixed
     */
    public function __invoke()
    {
        $args = func_get_args();
        $advisor = $this->advisorList->next();
 
        if ($advisor) {
            $advice = $advisor->getAdvice();
            $argsWithThis = array_merge([$this], $args);
            return call_user_func_array($advice, $argsWithThis);
        } else {
/var/www/prj-aiorder/core/src/Xpressengine/Interception/ProxyInvocationHandler.php
     */
    public function __construct($proxyObject, $methodName, AdvisorList $advisorList)
    {
        $this->proxyObject = $proxyObject;
        $this->targetMethodName = $methodName;
        $this->advisorList = $advisorList;
    }
 
    /**
     * target class의 origin method가 실행되기 전에 호출되어야 할 advisor를 호출한 다음, 마지막으로 origin method를 호출한다.
     *
     * @param array   $args 호출된 메소드가 받은 파라메터 리스트
     * @param Closure $then 호출된 메소드, advisor를 모두 호출한 후 이 Closure가 실행된다.
     *
     * @return mixed
     */
    public function callProxy(array $args, Closure $then)
    {
        $this->originMethodCall = $then;
        return call_user_func_array($this, $args);
    }
 
    /**
     * proxy object의 메소드가 실행될 경우, 메소드에 지정된 advisor를 모두 실행시킨다.
     * 이때 decorator 패턴으로 advisor들이 실행되는데,
     * 각 advisor들이 next call을 할 때 proxy는 자기 자신을 호출하도록 하여 결국 이 메소드가 실행된다.
     * 이 메소드가 호출되면 다음 advisor를 찾아서 실행시켜주고, 더이상 실행할 advisor가 없을 경우 원래 호출된 proxy object의 메소드를 실행한다.
     *
     * @return mixed
     */
    public function __invoke()
    {
        $args = func_get_args();
        $advisor = $this->advisorList->next();
 
        if ($advisor) {
            $advice = $advisor->getAdvice();
            $argsWithThis = array_merge([$this], $args);
            return call_user_func_array($advice, $argsWithThis);
        } else {
/var/www/prj-aiorder/core/src/Xpressengine/Interception/Proxy/ProxyTrait.php
 
        $invocationHandler = new ProxyInvocationHandler($this, $method, $advisorList);
 
        // 등록된 advisor들을 호출한다. advisor들이 실행되고 마지막으로 called method를 실행한다.
        return $invocationHandler->callProxy(
            $arguments,
            // 등록된 advisor들이 모두 호출된 다음 마지막에 호출되어 target의 origin method를 실행하는 클로저
            function () use ($method, $isCallMagicMethod) {
                $args = func_get_args();
 
                if ($isCallMagicMethod) {
                    array_unshift($args, $method);
                    $method = '__call';
                }
 
                return call_user_func_array(
                    [$this, '_proxyTargetCall'],
                    [$method, $args]
                );
            }
        );
    }
 
    /**
     * 본래 실행하려고 했던 실제 타겟 오브젝트의 메소드를 실행한다.
     *
     * @param string $method    origin method
     * @param array  $arguments argument of method call
     *
     * @return mixed
     */
    private function _proxyTargetCall($method, $arguments)
    {
        return call_user_func_array("parent::$method", $arguments);
    }
}
 
/var/www/prj-aiorder/storage/app/interception/Proxy_Xehub_XePlugin_XeCommerce_Order_OrderService.php
        return $ret;
    }
    public function buildItems( $items)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
        return $ret;
    }
    public function cleanUp()    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
        return $ret;
    }
    public function intangibleToAutoCompleted( $startDate,  $endDate)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
        return $ret;
    }
    public function autoDecided( $startDate,  $endDate)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
        return $ret;
    }
    public function createOrderSimple( $productId,  $quantity, Xpressengine\User\UserInterface $user = NULL)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
        return $ret;
    }
    public function getPaymentMethod( $order = NULL)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
        return $ret;
    }
    public function filterPaymentMethod(Xehub\XePlugin\XeCommerce\Product\Product $product,  $paymentMethodList)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
        return $ret;
    }
    public function getPaymentHtmlScript(Xehub\XePlugin\XeCommerce\Order\Order $order)    {
        $argv = func_get_args();
        $ret = $this->_proxyMethodCall(__FUNCTION__, $argv);
/var/www/prj-aiorder/privates/xecommerce/src/Commands/CleanUp.php
        $this->orderService->setCleanupCache();

        // 장바구니 정리 (오래된 항목 제거)
        $this->cartService->cleanUp();
        // 주문 revoke
        $this->orderService->cleanUp();

        if ($config = app('xe.config')->get(\Xehub\XePlugin\XeCommerce\Plugin::getId())) {
            // 배송타입 없는 주문 결제완료 시 N일 후 배송완료 처리
            if ($config->get('enable_intangible_completed', false)) {
                $endDate = now()->subDays($config->get('completed_period', 3));
                $startDate = $endDate->copy()->subDays($config->get('intangible_completed_cleanup_range', 3));
                $this->orderService->intangibleToAutoCompleted($startDate, $endDate);
            }

            // 배송완료 주문 N일 후 구매확정 처리
            if ($config->get('enable_decide', false)) {
                $endDate = now()->subDays($config->get('decide_period', 7));
                $startDate = $endDate->copy()->subDays($config->get('decide_cleanup_range', 3));
                $this->orderService->autoDecided($startDate, $endDate);
            }
        }
    }
}
 
/var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php
class BoundMethod
{
    /**
     * Call the given Closure / class@method and inject its dependencies.
     *
     * @param  \Illuminate\Container\Container  $container
     * @param  callable|string  $callback
     * @param  array  $parameters
     * @param  string|null  $defaultMethod
     * @return mixed
     */
    public static function call($container, $callback, array $parameters = [], $defaultMethod = null)
    {
        if (static::isCallableWithAtSign($callback) || $defaultMethod) {
            return static::callClass($container, $callback, $parameters, $defaultMethod);
        }
 
        return static::callBoundMethod($container, $callback, function () use ($container, $callback, $parameters) {
            return call_user_func_array(
                $callback, static::getMethodDependencies($container, $callback, $parameters)
            );
        });
    }
 
    /**
     * Call a string reference to a class using Class@method syntax.
     *
     * @param  \Illuminate\Container\Container  $container
     * @param  string  $target
     * @param  array  $parameters
     * @param  string|null  $defaultMethod
     * @return mixed
     *
     * @throws \InvalidArgumentException
     */
    protected static function callClass($container, $target, array $parameters = [], $defaultMethod = null)
    {
        $segments = explode('@', $target);
 
        // We will assume an @ sign is used to delimit the class name from the method
/var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php
class BoundMethod
{
    /**
     * Call the given Closure / class@method and inject its dependencies.
     *
     * @param  \Illuminate\Container\Container  $container
     * @param  callable|string  $callback
     * @param  array  $parameters
     * @param  string|null  $defaultMethod
     * @return mixed
     */
    public static function call($container, $callback, array $parameters = [], $defaultMethod = null)
    {
        if (static::isCallableWithAtSign($callback) || $defaultMethod) {
            return static::callClass($container, $callback, $parameters, $defaultMethod);
        }
 
        return static::callBoundMethod($container, $callback, function () use ($container, $callback, $parameters) {
            return call_user_func_array(
                $callback, static::getMethodDependencies($container, $callback, $parameters)
            );
        });
    }
 
    /**
     * Call a string reference to a class using Class@method syntax.
     *
     * @param  \Illuminate\Container\Container  $container
     * @param  string  $target
     * @param  array  $parameters
     * @param  string|null  $defaultMethod
     * @return mixed
     *
     * @throws \InvalidArgumentException
     */
    protected static function callClass($container, $target, array $parameters = [], $defaultMethod = null)
    {
        $segments = explode('@', $target);
 
        // We will assume an @ sign is used to delimit the class name from the method
/var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php
     * @param  callable  $callback
     * @param  mixed  $default
     * @return mixed
     */
    protected static function callBoundMethod($container, $callback, $default)
    {
        if (! is_array($callback)) {
            return $default instanceof Closure ? $default() : $default;
        }
 
        // Here we need to turn the array callable into a Class@method string we can use to
        // examine the container and see if there are any method bindings for this given
        // method. If there are, we can call this method binding callback immediately.
        $method = static::normalizeMethod($callback);
 
        if ($container->hasMethodBinding($method)) {
            return $container->callMethodBinding($method, $callback[0]);
        }
 
        return $default instanceof Closure ? $default() : $default;
    }
 
    /**
     * Normalize the given callback into a Class@method string.
     *
     * @param  callable  $callback
     * @return string
     */
    protected static function normalizeMethod($callback)
    {
        $class = is_string($callback[0]) ? $callback[0] : get_class($callback[0]);
 
        return "{$class}@{$callback[1]}";
    }
 
    /**
     * Get all dependencies for a given method.
     *
     * @param  \Illuminate\Container\Container  $container
     * @param  callable|string  $callback
/var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php
    /**
     * Call the given Closure / class@method and inject its dependencies.
     *
     * @param  \Illuminate\Container\Container  $container
     * @param  callable|string  $callback
     * @param  array  $parameters
     * @param  string|null  $defaultMethod
     * @return mixed
     */
    public static function call($container, $callback, array $parameters = [], $defaultMethod = null)
    {
        if (static::isCallableWithAtSign($callback) || $defaultMethod) {
            return static::callClass($container, $callback, $parameters, $defaultMethod);
        }
 
        return static::callBoundMethod($container, $callback, function () use ($container, $callback, $parameters) {
            return call_user_func_array(
                $callback, static::getMethodDependencies($container, $callback, $parameters)
            );
        });
    }
 
    /**
     * Call a string reference to a class using Class@method syntax.
     *
     * @param  \Illuminate\Container\Container  $container
     * @param  string  $target
     * @param  array  $parameters
     * @param  string|null  $defaultMethod
     * @return mixed
     *
     * @throws \InvalidArgumentException
     */
    protected static function callClass($container, $target, array $parameters = [], $defaultMethod = null)
    {
        $segments = explode('@', $target);
 
        // We will assume an @ sign is used to delimit the class name from the method
        // name. We will split on this @ sign and then build a callable array that
        // we can pass right back into the "call" method for dependency binding.
/var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Container/Container.php
     * @return \Closure
     */
    public function wrap(Closure $callback, array $parameters = [])
    {
        return function () use ($callback, $parameters) {
            return $this->call($callback, $parameters);
        };
    }
 
    /**
     * Call the given Closure / class@method and inject its dependencies.
     *
     * @param  callable|string  $callback
     * @param  array  $parameters
     * @param  string|null  $defaultMethod
     * @return mixed
     */
    public function call($callback, array $parameters = [], $defaultMethod = null)
    {
        return BoundMethod::call($this, $callback, $parameters, $defaultMethod);
    }
 
    /**
     * Get a closure to resolve the given type from the container.
     *
     * @param  string  $abstract
     * @return \Closure
     */
    public function factory($abstract)
    {
        return function () use ($abstract) {
            return $this->make($abstract);
        };
    }
 
    /**
     * An alias function name for make().
     *
     * @param  string  $abstract
     * @param  array  $parameters
/var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Console/Command.php
     * @param  \Symfony\Component\Console\Output\OutputInterface  $output
     * @return int
     */
    public function run(InputInterface $input, OutputInterface $output)
    {
        return parent::run(
            $this->input = $input, $this->output = new OutputStyle($input, $output)
        );
    }
 
    /**
     * Execute the console command.
     *
     * @param  \Symfony\Component\Console\Input\InputInterface  $input
     * @param  \Symfony\Component\Console\Output\OutputInterface  $output
     * @return mixed
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        return $this->laravel->call([$this, 'handle']);
    }
 
    /**
     * Call another console command.
     *
     * @param  string  $command
     * @param  array   $arguments
     * @return int
     */
    public function call($command, array $arguments = [])
    {
        $arguments['command'] = $command;
 
        return $this->getApplication()->find($command)->run(
            $this->createInputFromArguments($arguments), $this->output
        );
    }
 
    /**
     * Call another console command silently.
/var/www/prj-aiorder/vendor/symfony/console/Command/Command.php
            }
        }
 
        if ($input->isInteractive()) {
            $this->interact($input, $output);
        }
 
        // The command name argument is often omitted when a command is executed directly with its run() method.
        // It would fail the validation if we didn't make sure the command argument is present,
        // since it's required by the application.
        if ($input->hasArgument('command') && null === $input->getArgument('command')) {
            $input->setArgument('command', $this->getName());
        }
 
        $input->validate();
 
        if ($this->code) {
            $statusCode = \call_user_func($this->code, $input, $output);
        } else {
            $statusCode = $this->execute($input, $output);
        }
 
        return is_numeric($statusCode) ? (int) $statusCode : 0;
    }
 
    /**
     * Sets the code to execute when running this command.
     *
     * If this method is used, it overrides the code defined
     * in the execute() method.
     *
     * @param callable $code A callable(InputInterface $input, OutputInterface $output)
     *
     * @return $this
     *
     * @throws InvalidArgumentException
     *
     * @see execute()
     */
    public function setCode(callable $code)
/var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Console/Command.php
        foreach ($this->getArguments() as $arguments) {
            call_user_func_array([$this, 'addArgument'], $arguments);
        }
 
        foreach ($this->getOptions() as $options) {
            call_user_func_array([$this, 'addOption'], $options);
        }
    }
 
    /**
     * Run the console command.
     *
     * @param  \Symfony\Component\Console\Input\InputInterface  $input
     * @param  \Symfony\Component\Console\Output\OutputInterface  $output
     * @return int
     */
    public function run(InputInterface $input, OutputInterface $output)
    {
        return parent::run(
            $this->input = $input, $this->output = new OutputStyle($input, $output)
        );
    }
 
    /**
     * Execute the console command.
     *
     * @param  \Symfony\Component\Console\Input\InputInterface  $input
     * @param  \Symfony\Component\Console\Output\OutputInterface  $output
     * @return mixed
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        return $this->laravel->call([$this, 'handle']);
    }
 
    /**
     * Call another console command.
     *
     * @param  string  $command
     * @param  array   $arguments
/var/www/prj-aiorder/vendor/symfony/console/Application.php
    }
 
    /**
     * Runs the current command.
     *
     * If an event dispatcher has been attached to the application,
     * events are also dispatched during the life-cycle of the command.
     *
     * @return int 0 if everything went fine, or an error code
     */
    protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output)
    {
        foreach ($command->getHelperSet() as $helper) {
            if ($helper instanceof InputAwareInterface) {
                $helper->setInput($input);
            }
        }
 
        if (null === $this->dispatcher) {
            return $command->run($input, $output);
        }
 
        // bind before the console.command event, so the listeners have access to input options/arguments
        try {
            $command->mergeApplicationDefinition();
            $input->bind($command->getDefinition());
        } catch (ExceptionInterface $e) {
            // ignore invalid options/arguments for now, to allow the event listeners to customize the InputDefinition
        }
 
        $event = new ConsoleCommandEvent($command, $input, $output);
        $e = null;
 
        try {
            $this->dispatcher->dispatch(ConsoleEvents::COMMAND, $event);
 
            if ($event->commandShouldRun()) {
                $exitCode = $command->run($input, $output);
            } else {
                $exitCode = ConsoleCommandEvent::RETURN_CODE_DISABLED;
/var/www/prj-aiorder/vendor/symfony/console/Application.php
            $command = $this->find($name);
        } catch (\Exception $e) {
        } catch (\Throwable $e) {
        }
        if (null !== $e) {
            if (null !== $this->dispatcher) {
                $event = new ConsoleErrorEvent($input, $output, $e);
                $this->dispatcher->dispatch(ConsoleEvents::ERROR, $event);
                $e = $event->getError();
 
                if (0 === $event->getExitCode()) {
                    return 0;
                }
            }
 
            throw $e;
        }
 
        $this->runningCommand = $command;
        $exitCode = $this->doRunCommand($command, $input, $output);
        $this->runningCommand = null;
 
        return $exitCode;
    }
 
    public function setHelperSet(HelperSet $helperSet)
    {
        $this->helperSet = $helperSet;
    }
 
    /**
     * Get the helper set associated with the command.
     *
     * @return HelperSet The HelperSet instance associated with this command
     */
    public function getHelperSet()
    {
        if (!$this->helperSet) {
            $this->helperSet = $this->getDefaultHelperSet();
        }
/var/www/prj-aiorder/vendor/symfony/console/Application.php
                $this->renderException($e, $output);
            }
        };
        if ($phpHandler = set_exception_handler($renderException)) {
            restore_exception_handler();
            if (!\is_array($phpHandler) || !$phpHandler[0] instanceof ErrorHandler) {
                $debugHandler = true;
            } elseif ($debugHandler = $phpHandler[0]->setExceptionHandler($renderException)) {
                $phpHandler[0]->setExceptionHandler($debugHandler);
            }
        }
 
        if (null !== $this->dispatcher && $this->dispatcher->hasListeners(ConsoleEvents::EXCEPTION)) {
            @trigger_error(sprintf('The "ConsoleEvents::EXCEPTION" event is deprecated since Symfony 3.3 and will be removed in 4.0. Listen to the "ConsoleEvents::ERROR" event instead.'), \E_USER_DEPRECATED);
        }
 
        $this->configureIO($input, $output);
 
        try {
            $exitCode = $this->doRun($input, $output);
        } catch (\Exception $e) {
            if (!$this->catchExceptions) {
                throw $e;
            }
 
            $renderException($e);
 
            $exitCode = $e->getCode();
            if (is_numeric($exitCode)) {
                $exitCode = (int) $exitCode;
                if (0 === $exitCode) {
                    $exitCode = 1;
                }
            } else {
                $exitCode = 1;
            }
        } finally {
            // if the exception handler changed, keep it
            // otherwise, unregister $renderException
            if (!$phpHandler) {
/var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Console/Application.php
 
        $this->bootstrap();
    }
 
    /**
     * {@inheritdoc}
     */
    public function run(InputInterface $input = null, OutputInterface $output = null)
    {
        $commandName = $this->getCommandName(
            $input = $input ?: new ArgvInput
        );
 
        $this->events->fire(
            new Events\CommandStarting(
                $commandName, $input, $output = $output ?: new ConsoleOutput
            )
        );
 
        $exitCode = parent::run($input, $output);
 
        $this->events->fire(
            new Events\CommandFinished($commandName, $input, $output, $exitCode)
        );
 
        return $exitCode;
    }
 
    /**
     * Determine the proper PHP executable.
     *
     * @return string
     */
    public static function phpBinary()
    {
        return ProcessUtils::escapeArgument((new PhpExecutableFinder)->find(false));
    }
 
    /**
     * Determine the proper Artisan executable.
/var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Console/Application.php
        static::$bootstrappers = [];
    }
 
    /**
     * Run an Artisan console command by name.
     *
     * @param  string  $command
     * @param  array  $parameters
     * @param  \Symfony\Component\Console\Output\OutputInterface  $outputBuffer
     * @return int
     */
    public function call($command, array $parameters = [], $outputBuffer = null)
    {
        $parameters = collect($parameters)->prepend($command);
 
        $this->lastOutput = $outputBuffer ?: new BufferedOutput;
 
        $this->setCatchExceptions(false);
 
        $result = $this->run(new ArrayInput($parameters->toArray()), $this->lastOutput);
 
        $this->setCatchExceptions(true);
 
        return $result;
    }
 
    /**
     * Get the output for the last run command.
     *
     * @return string
     */
    public function output()
    {
        return $this->lastOutput ? $this->lastOutput->fetch() : '';
    }
 
    /**
     * Add a command to the console.
     *
     * @param  \Symfony\Component\Console\Command\Command  $command
/var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php
     * @return void
     */
    public function registerCommand($command)
    {
        $this->getArtisan()->add($command);
    }
 
    /**
     * Run an Artisan console command by name.
     *
     * @param  string  $command
     * @param  array  $parameters
     * @param  \Symfony\Component\Console\Output\OutputInterface  $outputBuffer
     * @return int
     */
    public function call($command, array $parameters = [], $outputBuffer = null)
    {
        $this->bootstrap();
 
        return $this->getArtisan()->call($command, $parameters, $outputBuffer);
    }
 
    /**
     * Queue the given console command.
     *
     * @param  string  $command
     * @param  array   $parameters
     * @return \Illuminate\Foundation\Bus\PendingDispatch
     */
    public function queue($command, array $parameters = [])
    {
        return QueuedCommand::dispatch(func_get_args());
    }
 
    /**
     * Get all of the commands registered with the console.
     *
     * @return array
     */
    public function all()
/var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php
    }
 
    /**
     * Handle dynamic, static calls to the object.
     *
     * @param  string  $method
     * @param  array   $args
     * @return mixed
     *
     * @throws \RuntimeException
     */
    public static function __callStatic($method, $args)
    {
        $instance = static::getFacadeRoot();
 
        if (! $instance) {
            throw new RuntimeException('A facade root has not been set.');
        }
 
        return $instance->$method(...$args);
    }
}
 
/var/www/prj-aiorder/privates/xecommerce/plugin.php
        app(ConfigHandler::class)->text('paywill', [
            'id' => '상점아이디',
            'key' => '해시키',
        ], '페이윌');
 
        app()->terminating(function () {
            // ajax 폴링으로 인해 해당 로직이 중복 실행되는 걸 방지합니다. (2025.03.19)
            if (filled($request = request())) {
                if ($request->ajax() || $request->wantsJson()) {
                    return;
                }
            }
 
            // html response 에만 동작하도록 개선 필요
            $orderService = app(OrderService::class);
            $proc = $orderService->checkRunCleanupCache();
 
            // $checkMinute 분 경과 후 api 찌르기
            if ($proc) {
                \Illuminate\Support\Facades\Artisan::call('xecommerce:cleanup');
            }
        });
 
        LectureTypeHandler::boot();
        PackageTypeHandler::boot();
        BillingTypeHandler::boot();
        CounselTypeHandler::boot();
        LectureUser::bootMacro();
        LecturePosterHandler::boot();
 
        SellerInstructor::boot();
 
        Product::setPermalinkResolver(function ($product) {
            try {
                return route('xecommerce::product.show', $product->id);
            } catch (\Throwable $e) {
                return '#';
            }
        });
 
/var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php
class BoundMethod
{
    /**
     * Call the given Closure / class@method and inject its dependencies.
     *
     * @param  \Illuminate\Container\Container  $container
     * @param  callable|string  $callback
     * @param  array  $parameters
     * @param  string|null  $defaultMethod
     * @return mixed
     */
    public static function call($container, $callback, array $parameters = [], $defaultMethod = null)
    {
        if (static::isCallableWithAtSign($callback) || $defaultMethod) {
            return static::callClass($container, $callback, $parameters, $defaultMethod);
        }
 
        return static::callBoundMethod($container, $callback, function () use ($container, $callback, $parameters) {
            return call_user_func_array(
                $callback, static::getMethodDependencies($container, $callback, $parameters)
            );
        });
    }
 
    /**
     * Call a string reference to a class using Class@method syntax.
     *
     * @param  \Illuminate\Container\Container  $container
     * @param  string  $target
     * @param  array  $parameters
     * @param  string|null  $defaultMethod
     * @return mixed
     *
     * @throws \InvalidArgumentException
     */
    protected static function callClass($container, $target, array $parameters = [], $defaultMethod = null)
    {
        $segments = explode('@', $target);
 
        // We will assume an @ sign is used to delimit the class name from the method
/var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php
class BoundMethod
{
    /**
     * Call the given Closure / class@method and inject its dependencies.
     *
     * @param  \Illuminate\Container\Container  $container
     * @param  callable|string  $callback
     * @param  array  $parameters
     * @param  string|null  $defaultMethod
     * @return mixed
     */
    public static function call($container, $callback, array $parameters = [], $defaultMethod = null)
    {
        if (static::isCallableWithAtSign($callback) || $defaultMethod) {
            return static::callClass($container, $callback, $parameters, $defaultMethod);
        }
 
        return static::callBoundMethod($container, $callback, function () use ($container, $callback, $parameters) {
            return call_user_func_array(
                $callback, static::getMethodDependencies($container, $callback, $parameters)
            );
        });
    }
 
    /**
     * Call a string reference to a class using Class@method syntax.
     *
     * @param  \Illuminate\Container\Container  $container
     * @param  string  $target
     * @param  array  $parameters
     * @param  string|null  $defaultMethod
     * @return mixed
     *
     * @throws \InvalidArgumentException
     */
    protected static function callClass($container, $target, array $parameters = [], $defaultMethod = null)
    {
        $segments = explode('@', $target);
 
        // We will assume an @ sign is used to delimit the class name from the method
/var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php
            throw new InvalidArgumentException('Method not provided.');
        }
 
        return static::call(
            $container, [$container->make($segments[0]), $method], $parameters
        );
    }
 
    /**
     * Call a method that has been bound to the container.
     *
     * @param  \Illuminate\Container\Container  $container
     * @param  callable  $callback
     * @param  mixed  $default
     * @return mixed
     */
    protected static function callBoundMethod($container, $callback, $default)
    {
        if (! is_array($callback)) {
            return $default instanceof Closure ? $default() : $default;
        }
 
        // Here we need to turn the array callable into a Class@method string we can use to
        // examine the container and see if there are any method bindings for this given
        // method. If there are, we can call this method binding callback immediately.
        $method = static::normalizeMethod($callback);
 
        if ($container->hasMethodBinding($method)) {
            return $container->callMethodBinding($method, $callback[0]);
        }
 
        return $default instanceof Closure ? $default() : $default;
    }
 
    /**
     * Normalize the given callback into a Class@method string.
     *
     * @param  callable  $callback
     * @return string
     */
/var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php
    /**
     * Call the given Closure / class@method and inject its dependencies.
     *
     * @param  \Illuminate\Container\Container  $container
     * @param  callable|string  $callback
     * @param  array  $parameters
     * @param  string|null  $defaultMethod
     * @return mixed
     */
    public static function call($container, $callback, array $parameters = [], $defaultMethod = null)
    {
        if (static::isCallableWithAtSign($callback) || $defaultMethod) {
            return static::callClass($container, $callback, $parameters, $defaultMethod);
        }
 
        return static::callBoundMethod($container, $callback, function () use ($container, $callback, $parameters) {
            return call_user_func_array(
                $callback, static::getMethodDependencies($container, $callback, $parameters)
            );
        });
    }
 
    /**
     * Call a string reference to a class using Class@method syntax.
     *
     * @param  \Illuminate\Container\Container  $container
     * @param  string  $target
     * @param  array  $parameters
     * @param  string|null  $defaultMethod
     * @return mixed
     *
     * @throws \InvalidArgumentException
     */
    protected static function callClass($container, $target, array $parameters = [], $defaultMethod = null)
    {
        $segments = explode('@', $target);
 
        // We will assume an @ sign is used to delimit the class name from the method
        // name. We will split on this @ sign and then build a callable array that
        // we can pass right back into the "call" method for dependency binding.
/var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Container/Container.php
     * @return \Closure
     */
    public function wrap(Closure $callback, array $parameters = [])
    {
        return function () use ($callback, $parameters) {
            return $this->call($callback, $parameters);
        };
    }
 
    /**
     * Call the given Closure / class@method and inject its dependencies.
     *
     * @param  callable|string  $callback
     * @param  array  $parameters
     * @param  string|null  $defaultMethod
     * @return mixed
     */
    public function call($callback, array $parameters = [], $defaultMethod = null)
    {
        return BoundMethod::call($this, $callback, $parameters, $defaultMethod);
    }
 
    /**
     * Get a closure to resolve the given type from the container.
     *
     * @param  string  $abstract
     * @return \Closure
     */
    public function factory($abstract)
    {
        return function () use ($abstract) {
            return $this->make($abstract);
        };
    }
 
    /**
     * An alias function name for make().
     *
     * @param  string  $abstract
     * @param  array  $parameters
/var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Foundation/Application.php
     *
     * @param  \Closure  $callback
     * @return $this
     */
    public function terminating(Closure $callback)
    {
        $this->terminatingCallbacks[] = $callback;
 
        return $this;
    }
 
    /**
     * Terminate the application.
     *
     * @return void
     */
    public function terminate()
    {
        foreach ($this->terminatingCallbacks as $terminating) {
            $this->call($terminating);
        }
    }
 
    /**
     * Get the service providers that have been loaded.
     *
     * @return array
     */
    public function getLoadedProviders()
    {
        return $this->loadedProviders;
    }
 
    /**
     * Get the application's deferred services.
     *
     * @return array
     */
    public function getDeferredServices()
    {
/var/www/prj-aiorder/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php
    {
        return function ($request) {
            $this->app->instance('request', $request);
 
            return $this->router->dispatch($request);
        };
    }
 
    /**
     * Call the terminate method on any terminable middleware.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Illuminate\Http\Response  $response
     * @return void
     */
    public function terminate($request, $response)
    {
        $this->terminateMiddleware($request, $response);
 
        $this->app->terminate();
    }
 
    /**
     * Call the terminate method on any terminable middleware.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Illuminate\Http\Response  $response
     * @return void
     */
    protected function terminateMiddleware($request, $response)
    {
        $middlewares = $this->app->shouldSkipMiddleware() ? [] : array_merge(
            $this->gatherRouteMiddleware($request),
            $this->middleware
        );
 
        foreach ($middlewares as $middleware) {
            if (! is_string($middleware)) {
                continue;
            }
/var/www/prj-aiorder/index.php
*/
 
/*if (!empty(array_get($_GET, '_construction')) || !isset($_SERVER['REMOTE_ADDR']) || !in_array($_SERVER['REMOTE_ADDR'], [
    '127.0.0.1',        // localhost
    '112.219.118.6',    // xehub
    '39.115.162.14',    // osh private
])) {
include('./construction.html');
exit();
}*/
 
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
 
$response = $kernel->handle(
    $request = Xpressengine\Http\Request::capture()
);
 
$response->send();
 
$kernel->terminate($request, $response);
 

Environment & details:

empty
empty
empty
empty
empty
Key Value
REDIRECT_STATUS
"200"
HTTP_HOST
"dev.aiorder.xehub.co.kr"
HTTP_X_REAL_IP
"216.73.216.165"
HTTP_X_FORWARDED_FOR
"216.73.216.165"
HTTP_X_FORWARDED_PROTO
"https"
HTTP_CONNECTION
"close"
HTTP_ACCEPT
"*/*"
HTTP_USER_AGENT
"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)"
HTTP_ACCEPT_ENCODING
"gzip, br, zstd, deflate"
PATH
"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
SERVER_SIGNATURE
"<address>Apache/2.4.58 (Ubuntu) Server at dev.aiorder.xehub.co.kr Port 80</address>\n"
SERVER_SOFTWARE
"Apache/2.4.58 (Ubuntu)"
SERVER_NAME
"dev.aiorder.xehub.co.kr"
SERVER_ADDR
"10.20.0.23"
SERVER_PORT
"80"
REMOTE_ADDR
"10.20.0.1"
DOCUMENT_ROOT
"/var/www/prj-aiorder"
REQUEST_SCHEME
"http"
CONTEXT_PREFIX
""
CONTEXT_DOCUMENT_ROOT
"/var/www/prj-aiorder"
SERVER_ADMIN
"[no address given]"
SCRIPT_FILENAME
"/var/www/prj-aiorder/index.php"
REMOTE_PORT
"60608"
REDIRECT_URL
"/plugin/social_login/login"
GATEWAY_INTERFACE
"CGI/1.1"
SERVER_PROTOCOL
"HTTP/1.1"
REQUEST_METHOD
"GET"
QUERY_STRING
""
REQUEST_URI
"/plugin/social_login/login"
SCRIPT_NAME
"/index.php"
PHP_SELF
"/index.php"
REQUEST_TIME_FLOAT
1771467060.7005
REQUEST_TIME
1771467060
HTTPS
"on"
DEFAULT_BOARD_NEW_TIME
"24"
COUPON_MENU_INSTANCE_ID
"c567a251"
COUNTER_GROUP_ID
"ef709491-877c-48bc-990c-0f0501ae1c46"
MISSION_MENU_INSTANCE_ID
"656da603"
XEPAY_TEST
"false"
XEPAY_PROVIDER
"eloquent"
EVENT_WINNER_BOARD
"ce2c5b86"
CUSTOMER_VOICE_BOARD
"b5374eeb"
EVENT_BOARD
"83691f4b"
INIPAY_ENABLES
"Card,VCard"
INIPAY_MOBILE_ENABLES
"CARD,CardBill"
INIPAY_MOBILE_TYPE
"true"
CP_SITECODE
"BS808"
CP_SITEPASSWD
"aetve0mWJvvc"
CP_CLIENT
"CPClient_64bit"
CP_CLIENT_PATH
"/DATA/_WEB_/dev.ozarena.com/checkplus/"
CHAT_URL
"https://ozarena.com"
CHAT_PATH
"/socket.io"
AION_SYNC_ENABLED
"true"
AION_SYNC_AUTH_HEADER
"X-Sync-Api-Key"
AION_SYNC_API_KEY
"47526b1b-16f6-46f1-a3a8-86b26fa6f951"
AION_SYNC_GZIP_ENABLED
"true"
AION_SYNC_GZIP_MIN_SIZE
"1024"
AION_SYNC_DEFAULT_LIMIT
"1000"
AION_SYNC_MAX_LIMIT
"5000"
SHELL_VERBOSITY
0
Key Value
DEFAULT_BOARD_NEW_TIME
"24"
COUPON_MENU_INSTANCE_ID
"c567a251"
COUNTER_GROUP_ID
"ef709491-877c-48bc-990c-0f0501ae1c46"
MISSION_MENU_INSTANCE_ID
"656da603"
XEPAY_TEST
"false"
XEPAY_PROVIDER
"eloquent"
EVENT_WINNER_BOARD
"ce2c5b86"
CUSTOMER_VOICE_BOARD
"b5374eeb"
EVENT_BOARD
"83691f4b"
INIPAY_ENABLES
"Card,VCard"
INIPAY_MOBILE_ENABLES
"CARD,CardBill"
INIPAY_MOBILE_TYPE
"true"
CP_SITECODE
"BS808"
CP_SITEPASSWD
"aetve0mWJvvc"
CP_CLIENT
"CPClient_64bit"
CP_CLIENT_PATH
"/DATA/_WEB_/dev.ozarena.com/checkplus/"
CHAT_URL
"https://ozarena.com"
CHAT_PATH
"/socket.io"
AION_SYNC_ENABLED
"true"
AION_SYNC_AUTH_HEADER
"X-Sync-Api-Key"
AION_SYNC_API_KEY
"47526b1b-16f6-46f1-a3a8-86b26fa6f951"
AION_SYNC_GZIP_ENABLED
"true"
AION_SYNC_GZIP_MIN_SIZE
"1024"
AION_SYNC_DEFAULT_LIMIT
"1000"
AION_SYNC_MAX_LIMIT
"5000"
SHELL_VERBOSITY
0
0. Whoops\Handler\PrettyPageHandler