HEX
Server: Apache/2.4.41 (Ubuntu)
System: Linux ip-172-31-42-149 5.15.0-1084-aws #91~20.04.1-Ubuntu SMP Fri May 2 07:00:04 UTC 2025 aarch64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/vhost/disk-apps/qas.sports-crowd.com/app/Http/Controllers/ErpLogController.php
<?php

namespace App\Http\Controllers;

use \Excel;
use App\ErpLog;
use App\Http\Controllers\Exports\ErpLogsExport;
use DataTables;
use Illuminate\Http\Request;
use App\Http\Controllers\UtilController;
use Exception;

class ErpLogController extends ERPBaseController
{
    private $util;

    public function __construct()
    {
        parent::__construct();
        $this->util = new UtilController();
    }

    public function index()
    {
        $origins = $this->origins;
        return view('erp.logs.list', compact('origins'));
    }

    public function tableFilter($from_date = null, $to_date = null, $origins = null)
    {
        $obj = $obj = ErpLog::select(
            'erp_logs.id',
            'erp_logs.origin',
            'erp_logs.action',
            'erp_logs.origin_class',
            'erp_logs.data',
            'erp_logs.message',
            'erp_logs.resolved',
            'erp_logs.created_at',
        )
            ->orderBy('resolved', 'asc')
            ->orderBy('erp_logs.created_at', 'desc');

        if ($from_date && $from_date != 'null') {
            $obj->whereDate('erp_logs.created_at', '>=', $from_date);
        }
        if ($to_date && $to_date != 'null') {
            $obj->whereDate('erp_logs.created_at', '<=', $to_date);
        }
        if ($origins && $origins != 'null') {
            if (!str_contains($origins, 'all')) {
                $obj->whereIn('erp_logs.origin', explode(',', $origins));
            }
        }

        \DB::enableQueryLog();
        $dataTable = Datatables::of($obj)
            ->addColumn('actions', function ($obj) {
                $operation = $obj->message;
                if ($operation) {
                    $operation = str_replace("'", '"', $operation);
                }
                $actions = "<i class='fa fa-clipboard iconMini' onClick='copyToClipboard(this)' data-operation='" . $operation . "' title='Copiar error'></i>
                            <i class='fa fa-refresh iconMini' onClick='retrySyncERP(" . $obj->id . ")' title='Sincronizar al ERP'></i>";
                return $actions;
            })
            ->addColumn('object', function ($obj) {
                $object = '';

                switch ($obj->origin) {
                    case 'academy':
                        $object = '<a style="display: block; text-align:center;" href="/academy_purchase/edit/' . $obj->data . '" target="_blank">Abrir</a>';
                        break;
                    case 'academy_tournament':
                        $object = '<a style="display: block; text-align:center;" href="/academy_tournament_payments/edit/' . $obj->data . '" target="_blank">Abrir</a>';
                        break;
                    case 'shop':
                    case 'shopify':
                        $data = json_decode($obj->data, true);
                        $object = '<a style="display: block; text-align:center;" href="' . $data['order_status_url'] . '" target="_blank">Abrir</a>';
                        break;
                    case 'Shop Sportscrowd':
                    case 'shop_sportscrowd':
                        $object = '<a style="display: block; text-align:center;" href="/orders/edit/' . $obj->data . '" target="_blank">Abrir</a>';
                        break;
                    case 'membership':
                        $object = '<a style="display: block; text-align:center;" href="/memberships/dashboard" target="_blank">Abrir</a>';
                        break;
                    case 'experience':
                        $object = '<a style="display: block; text-align:center;" href="/experience_monitor" target="_blank">Abrir</a>';
                        break;
                }
                return $object;
            })
            ->editColumn('origin', function ($obj) {
                if ($obj->origin) {
                    $object = collect($this->origins)->where('value', $obj->origin)->first();
                    if ($object)
                        return $object->name;
                }
                return '';
            })
            ->editColumn('message', function ($obj) {
                return $obj->message;
            })
            ->editColumn('data', function ($obj) {
                switch ($obj->origin) {
                    case 'shop':
                    case 'shopify':
                        $data = json_decode($obj->data, true);
                        return $data['order_number'];
                    default:
                        return $obj->data;
                }
            })
            ->editColumn('resolved', function ($obj) {
                return $obj->resolved ? 'SI' : 'NO';
            })
            ->editColumn('created_at', function ($obj) {
                return \Carbon\Carbon::parse($obj->created_at)->format('Y-m-d h:i:s A');
            })
            ->rawColumns(['actions', 'object', 'message', 'data', 'resolved', 'created_at']);

        $response = $dataTable->make(true);
        $data = $response->getData();
        $data = json_decode(json_encode($data), true);
        $queries = \DB::getQueryLog();
        $data['queries'] = $queries;
        return $data;
    }

    public function validateExport(Request $request)
    {
        if ($request['query']) {
            $results = $this->util->getGenericData($request["query"], $request["bindings"]);
            if (count($results) > 0) {
                $name = 'ReporteERPLogs' . time() . '.xlsx';
                Excel::store(new ErpLogsExport($results), $name, 'public');
                return response()->json(['success' => true, 'message' => 'Validación OK', 'data' => $name]);
            }
        }
        return response()->json(['success' => false, 'message' => 'No existen datos a exportar']);
    }

    public function export($name)
    {
        return $this->util->export($name);
    }

    public function retrySyncERP(Request $request)
    {
        return $this->retrySyncLog($request['id'], $validateResolved = false);
    }

    public function retrySyncLog($logId, $validateResolved)
    {
        $log = ErpLog::find($logId);
        if (!$log) {
            return response()->json(['success' => false, 'message' => 'No se encontró el log']);
        } else if ($log->resolved && $validateResolved) {
            return response()->json(['success' => false, 'message' => 'El log ya ha sido resuelto']);
        }

        $log->resolved = 1;
        $log->update();
        $controller = new $log->origin_class;
        $controller->retrySyncERP($log->data, $log->action);
        return response()->json(['success' => true, 'message' => 'Sincronización realizada exitosamente, favor revisar si no se generó otro log asociado al mismo pedido/pago']);
    }

    public function syncPending($origin)
    {
        $logs = ErpLog::select('id')
            ->whereIn('origin', $origin)
            ->where('resolved', false)
            ->get();

        foreach ($logs as $log) {
            try {
                $this->retrySyncLog($log->id, $validateResolved = true);
            } catch (Exception $e) {
            }
        }
    }
}