File: /var/www/vhost/disk-apps/demo.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) {
}
}
}
}