pedi2/app/Producto.php
2025-05-12 19:13:44 -03:00

154 lines
5.3 KiB
PHP

<?php
namespace App;
use App\Filtros\FiltroDeProducto;
use App\Helpers\CsvHelper;
use App\Helpers\TransporteHelper;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
class Producto extends Model
{
public $timestamps = false;
protected $fillable = ["nombre", "precio", "presentacion", "stock", "categoria"];
static int $paginarPorDefecto = 10;
public function subpedidos(): BelongsToMany
{
return $this->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);
}
}