belongsToMany('App\Subpedido', 'productos_subpedidos')->withPivot(["cantidad", "notas"]); } public function proveedor(): BelongsTo { return $this->belongsTo('App\Proveedor'); } //Este método permite que se apliquen los filtros al hacer una request (por ejemplo, de búsqueda) public function scopeFiltrar($query, FiltroDeProducto $filtros): Builder { return $filtros->aplicar($query); } public static function getPaginar(Request $request): int { return $request->has('paginar') && intval($request->input('paginar')) ? intval($request->input('paginar')) : self::$paginarPorDefecto; } public static function productosFilaID() { return Producto::pluck('id', 'fila')->all(); } public static function productosIDFila() { return Producto::pluck('fila', 'id')->all(); } public static function productosIDNombre() { return Producto::pluck('nombre', 'id')->all(); } static public function cantidadesPorBarrio(): Collection { $barrios = GrupoDeCompra::barriosMenosPrueba() ->pluck('id', 'nombre'); $columnasBarrios = $barrios->map(function ($id, $nombre) { return DB::raw("SUM(CASE WHEN subpedidos.grupo_de_compra_id = $id AND subpedidos.aprobado = 1 THEN producto_subpedido.cantidad ELSE 0 END) as `$nombre`"); })->toArray(); return DB::table('productos') ->where('productos.nombre', 'not like', '%barrial%') ->leftJoin('producto_subpedido', 'productos.id', '=', 'producto_subpedido.producto_id') ->leftJoin('subpedidos', 'subpedidos.id', '=', 'producto_subpedido.subpedido_id') ->select(array_merge( ['productos.fila as fila'], ['productos.nombre as producto'], $columnasBarrios )) ->groupBy('productos.fila', 'productos.id', 'productos.nombre') ->orderBy('productos.fila') ->get(); } static public function planillaTotales() { $headers = ['Producto']; $barrios = GrupoDeCompra::barriosMenosPrueba() ->pluck('nombre')->toArray(); $headers = array_merge($headers, $barrios); $cantidadesPorBarrio = self::cantidadesPorBarrio(); $transportePorBarrio = GrupoDeCompra::transportePorBarrio(); $planilla = []; $ultimaFila = 1; $filaTransporte = TransporteHelper::filaTransporte(); foreach ($cantidadesPorBarrio as $productoCantidades) { $fila = $productoCantidades->fila; while ($fila - $ultimaFila > 1) { $ultimaFila++; if ($ultimaFila == $filaTransporte) { $planilla[$ultimaFila] = ['Bono de transporte']; } else { $planilla[$ultimaFila] = ['---']; } } $planilla[$fila] = [$productoCantidades->producto]; foreach ($barrios as $barrio) { $planilla[$fila][] = $productoCantidades->$barrio ?? 0; } $ultimaFila = $fila; } foreach ($transportePorBarrio as $key => $cantidad) { $planilla[$filaTransporte][] = $cantidad; } CsvHelper::generarCsv('csv/exports/pedidos-por-barrio.csv', $planilla, $headers); } public static function notasPorBarrio(): Collection { return DB::table('productos') ->join('producto_subpedido', 'productos.id', '=', 'producto_subpedido.producto_id') ->join('subpedidos', 'producto_subpedido.subpedido_id', '=', 'subpedidos.id') ->join('grupos_de_compra', 'subpedidos.grupo_de_compra_id', '=', 'grupos_de_compra.id') ->where('productos.requiere_notas', 1) ->select( 'productos.nombre as producto', 'grupos_de_compra.nombre as barrio', 'producto_subpedido.notas' ) ->get() ->groupBy('producto'); } static public function planillaNotas() { $headers = ['Producto']; $barrios = GrupoDeCompra::barriosMenosPrueba() ->pluck('nombre')->toArray(); $headers = array_merge($headers, $barrios); $notasPorBarrio = self::notasPorBarrio(); $planilla = []; foreach ($notasPorBarrio as $producto => $notasGrupo) { $fila = [$producto]; foreach ($barrios as $barrio) { $notas = $notasGrupo->where('barrio', $barrio)->pluck('notas')->implode('; '); $fila[] = $notas ?: ''; } $planilla[] = $fila; } CsvHelper::generarCsv('csv/exports/notas-por-barrio.csv', $planilla, $headers); } }