File: /var/www/vhost/disk-apps/comfama.sports-crowd.com/app/Http/Controllers/ErpLogController.php
<?php
namespace App\Http\Controllers;
use DB;
use \Excel;
use App\ErpLog;
use DataTables;
use Illuminate\Http\Request;
use App\Http\Controllers\UtilController;
use Exception;
class ErpLogController extends Controller
{
private $util;
private $origins = [];
public function __construct()
{
$this->util = new UtilController();
// TIPOS DE PAGO QUE APLICA
$this->origins[] = (object) [
'name' => 'Todos',
'value' => 'all'
];
$this->origins[] = (object) [
'name' => 'Tienda',
'value' => 'shop'
];
$this->origins[] = (object) [
'name' => 'Academia Escuela',
'value' => 'academy'
];
$this->origins[] = (object) [
'name' => 'Academia Torneos',
'value' => 'academy_tournament'
];
$this->origins[] = (object) [
'name' => 'Shopify',
'value' => 'shopify'
];
$this->origins[] = (object) [
'name' => 'Tienda SportsCrowd',
'value' => 'shop_sportscrowd'
];
$this->origins[] = (object) [
'name' => 'Tienda SportsCrowd',
'value' => 'Shop Sportscrowd'
];
$this->origins[] = (object) [
'name' => 'Membresia',
'value' => 'membership'
];
}
public function index()
{
$origins = $this->origins;
return view('erp.logs.list', compact('origins'));
}
public function tableFilter($from_date = null, $to_date = null, $origins = null)
{
DB::statement("SET sql_mode = ''");
$obj = $obj = DB::table('erp_logs')
->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',
)
->groupBy('erp_logs.id');
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::statement("SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'");
\DB::enableQueryLog();
$dataTable = Datatables::of($obj)
->addColumn('actions', function ($obj) {
$actions = "<i class='fa fa-clipboard iconMini' onClick='copyToClipboard(this)' data-operation='" . $obj->message . "' 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;
}
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)
{
$log = ErpLog::find($request['id']);
return $this->retrySyncLog($log);
}
public function retrySyncLog($log)
{
$controller = new $log->origin_class;
$controller->retrySyncERP($log->data, $log->action);
$log->resolved = 1;
$log->update();
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)
{
$erpLog = ErpLog::whereIn('origin', $origin)->where('resolved', false)->get();
foreach ($erpLog as $log) {
try {
$this->retrySyncLog($log);
} catch (Exception $e) {
}
}
}
}