date; $tenantId = $request->tenantId(); $user = Eva::make('user'); if (!$user->canExport('bookings', $tenantId)){ return $this->response([ 'success' => false, 'error' => __eva("You cannot export data.") ]); } $restaurant = Restaurant::find($tenantId); if (!$restaurant){ return $this->response(['success' => false, 'error' => __eva('Invalid restaurant')]); } // Get the list of ids to export $list_ids = $request->list; if (empty($list_ids)) { return $this->response(['success' => false, 'error' => __eva('No data to download.')]); } $list_ids = explode(',', $list_ids); // Idioma del restaurante: sin el, los estados salian siempre en ingles $lang = $request->lang ? $request->lang : $restaurant->language; // Prepare the booking $bookings = Booking::whereIn('id', $list_ids)->get(); $list = []; foreach($bookings as $booking){ $row = $booking->toCsvArray($lang); $row['_time'] = $booking->time; $list[] = $row; } if (empty($list)) { return $this->response(['success' => false, 'error' => __eva('No data to download.')]); } $column_keys = $this->getExportColumnKeys($tenantId, 'bookings_csv_columns'); $list = $this->mapWithCustomColumns($list, $column_keys); // Cabeceras con la etiqueta traducida en vez de la clave interna // (antes salia "shift_event", "time_24h"...) $labels = BookingExportColumn::listing($lang); $headers = []; foreach ($column_keys as $key) { $headers[] = isset($labels[$key]) ? $labels[$key] : $key; } return $this->response(['success' => 'true', 'data' => $this->convertToCsv($list, $headers)]); } /** * Columnas configuradas para una exportacion, ya ordenadas y solo las * activadas. * * @param int $tenantId * @param string $meta_key bookings_csv_columns | bookings_print_columns * * @return array lista de claves de columna */ protected function getExportColumnKeys($tenantId, $meta_key) { $columns = alexr_get_tenant_setting($tenantId, $meta_key, true); // Nunca configurado: valores por defecto if (!$columns || !is_array($columns)) { $columns = BookingExportColumn::defaultColumns(); } // Solo las activadas $columns = array_filter($columns, function($column) { $column = (array) $column; return !empty($column['enabled']); }); // Ordenar por el orden elegido en el popup. // El comparador tiene que devolver un entero: devolver un booleano // (como se hacia antes) produce una ordenacion incorrecta. usort($columns, function($a, $b) { $a = (array) $a; $b = (array) $b; $order_a = isset($a['order']) ? intval($a['order']) : 0; $order_b = isset($b['order']) ? intval($b['order']) : 0; return $order_a <=> $order_b; }); $valid_keys = BookingExportColumn::keys(); $keys = []; foreach ($columns as $column) { $column = (array) $column; $key = isset($column['column']) ? $column['column'] : null; if ($key && in_array($key, $valid_keys)) { $keys[] = $key; } } return $keys; } /** * Deja cada fila solo con las columnas configuradas y en su orden * * @param array $list filas de toCsvArray() * @param array $column_keys columnas a conservar, ya ordenadas * * @return array */ protected function mapWithCustomColumns($list, $column_keys) { $new_list = []; foreach($list as $row) { $new_row = []; foreach($column_keys as $key) { $new_row[$key] = isset($row[$key]) ? $row[$key] : ''; } // Auxiliar para ordenar por hora, se elimina despues $new_row['_time'] = isset($row['_time']) ? $row['_time'] : 0; $new_list[] = $new_row; } // Ordenar por hora. Se usa el campo original de la reserva y no la // columna time_24h, que puede no estar activada. usort($new_list, function($a, $b) { $time_a = isset($a['_time']) ? intval($a['_time']) : 0; $time_b = isset($b['_time']) ? intval($b['_time']) : 0; return $time_a <=> $time_b; }); // Quitar el campo auxiliar de ordenacion foreach ($new_list as $index => $row) { unset($new_list[$index]['_time']); } return $new_list; } public function printPDF(Request $request) { $date = $request->date; $lang = $request->lang; $tenantId = $request->tenantId(); $user = Eva::make('user'); if (!$user->canExport('bookings', $tenantId)){ return $this->response([ 'success' => false, 'error' => __eva("You cannot print data.") ]); } $restaurant = Restaurant::find($tenantId); if (!$restaurant){ return $this->response(['success' => false, 'error' => __eva('Invalid restaurant')]); } // Get the list of ids to export $list_ids = $request->list; if (empty($list_ids)) { return $this->response(['success' => false, 'error' => __eva('No data to download.')]); } $list_ids = explode(',', $list_ids); if (!$lang) { $lang = $restaurant->language; } // Prepare the booking $bookings = Booking::whereIn('id', $list_ids)->get(); $list = []; foreach($bookings as $booking){ $row = $booking->toCsvArray($lang); $row['_time'] = $booking->time; $list[] = $row; } $column_keys = $this->getExportColumnKeys($tenantId, 'bookings_print_columns'); $list = $this->mapWithCustomColumns($list, $column_keys); // Cabeceras traducidas y en el mismo orden que las columnas. // Antes la plantilla las deducia con array_keys($bookings[0]), que // fallaba si la primera reserva no traia todos los campos. $labels = BookingExportColumn::listing($lang); $columns = []; foreach ($column_keys as $key) { $columns[$key] = isset($labels[$key]) ? $labels[$key] : $key; } $html = __eva("This is the FREE version, you need to upgrade to the PRO version"); if (defined("ALEXR_PRO_PLUGIN_DIR")) { $bookings = $list; ob_start(); include ALEXR_PRO_PLUGIN_DIR . 'includes-pro/dashboard/templates/pdf/bookings.php'; $html = ob_get_clean(); } return $this->response(['success' => true, 'html' => $html]); } }