2021-12-30 13:12:14 -03:00
< ? php
namespace App ;
2024-11-25 17:20:04 -03:00
use App\Filtros\FiltroDeProducto ;
2021-12-30 13:12:14 -03:00
use Illuminate\Database\Eloquent\Model ;
2022-01-05 18:14:21 -03:00
use Illuminate\Http\Request ;
2024-11-25 17:20:04 -03:00
use Illuminate\Support\Facades\DB ;
2024-09-05 13:34:33 -03:00
use Illuminate\Support\Str ;
2024-11-25 21:44:03 -03:00
use League\Csv\CannotInsertRecord ;
2024-12-09 20:58:56 -03:00
use League\Csv\Reader ;
2024-11-25 21:44:03 -03:00
use League\Csv\Writer ;
2021-12-30 13:12:14 -03:00
class Producto extends Model
{
2024-11-25 17:20:04 -03:00
public $timestamps = false ;
protected $fillable = [ " nombre " , " precio " , " presentacion " , " stock " , " categoria " ];
static $paginarPorDefecto = 10 ;
public function subpedidos ()
{
return $this -> belongsToMany ( 'App\Subpedido' , 'productos_subpedidos' ) -> withPivot ([ " cantidad " , " notas " ]);
}
public function proveedor ()
{
return $this -> belongsTo ( 'App\Proveedor' );
}
public function pagaTransporte ()
{
return ! ( $this -> bono || Str :: contains ( $this -> categoria , 'SUBSIDIADO' ));
}
//Este método permite que se apliquen los filtros al hacer una request (por ejemplo, de búsqueda)
public function scopeFiltrar ( $query , FiltroDeProducto $filtros )
{
return $filtros -> aplicar ( $query );
}
public static function getPaginar ( Request $request )
{
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 ()
{
$barrios = DB :: table ( 'grupos_de_compra' )
2024-11-25 21:44:03 -03:00
-> where ( 'nombre' , '<>' , 'PRUEBA' )
2024-11-25 17:20:04 -03:00
-> 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 ();
2024-09-05 13:34:33 -03:00
2024-11-25 17:20:04 -03:00
return DB :: table ( 'productos' )
2024-12-09 20:52:51 -03:00
-> where ( 'productos.nombre' , 'not like' , '%barrial%' )
-> leftJoin ( 'producto_subpedido' , 'productos.id' , '=' , 'producto_subpedido.producto_id' )
-> leftJoin ( 'subpedidos' , 'subpedidos.id' , '=' , 'producto_subpedido.subpedido_id' )
2024-11-25 17:20:04 -03:00
-> select ( array_merge (
2024-11-25 21:44:03 -03:00
[ 'productos.fila as fila' ],
[ 'productos.nombre as producto' ],
2024-11-25 17:20:04 -03:00
$columnasBarrios
))
2024-12-09 20:52:51 -03:00
-> groupBy ( 'productos.fila' , 'productos.id' , 'productos.nombre' )
2024-11-25 21:44:03 -03:00
-> orderBy ( 'productos.fila' )
2024-11-25 17:20:04 -03:00
-> get ();
}
2024-11-25 21:44:03 -03:00
static public function planillaTotales () {
$headers = [ 'Producto' ];
2024-12-09 12:33:42 -03:00
$barrios = DB :: table ( 'grupos_de_compra' )
-> where ( 'nombre' , '<>' , 'PRUEBA' )
-> pluck ( 'nombre' ) -> toArray ();
2024-11-25 21:44:03 -03:00
$headers = array_merge ( $headers , $barrios );
2024-12-09 12:33:42 -03:00
$cantidadesPorBarrio = self :: cantidadesPorBarrio ();
2024-11-25 21:44:03 -03:00
$planilla = [];
$ultimaFila = 1 ;
foreach ( $cantidadesPorBarrio as $productoCantidades ) {
$fila = $productoCantidades -> fila ;
2024-12-09 20:58:56 -03:00
while ( $fila - $ultimaFila > 1 ) {
2024-11-25 21:44:03 -03:00
$ultimaFila ++ ;
2024-12-09 20:52:51 -03:00
$planilla [ $ultimaFila ] = [ '---' ];
2024-11-25 21:44:03 -03:00
}
$planilla [ $fila ] = [ $productoCantidades -> producto ];
foreach ( $barrios as $barrio ) {
$planilla [ $fila ][] = $productoCantidades -> $barrio ? ? 0 ;
}
$ultimaFila = $fila ;
}
try {
2024-12-09 12:59:59 -03:00
$writer = Writer :: createFromPath ( resource_path ( 'csv/exports/pedidos-por-barrio.csv' ), 'w' );
2024-11-25 21:44:03 -03:00
$writer -> insertOne ( $headers );
$writer -> insertAll ( $planilla );
} catch ( CannotInsertRecord $e ) {
var_export ( $e -> getRecords ());
}
}
2024-12-09 07:18:02 -03:00
2024-12-09 12:33:42 -03:00
public static function notasPorBarrio () : \Illuminate\Support\Collection
{
return DB :: table ( 'productos' )
2024-12-09 07:18:02 -03:00
-> 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 ()
2024-12-09 12:33:42 -03:00
-> groupBy ( 'producto' );
}
2024-12-09 07:18:02 -03:00
2024-12-09 12:33:42 -03:00
static public function planillaNotas () {
$headers = [ 'Producto' ];
$barrios = DB :: table ( 'grupos_de_compra' )
-> where ( 'nombre' , '<>' , 'PRUEBA' )
-> pluck ( 'nombre' ) -> toArray ();
$headers = array_merge ( $headers , $barrios );
$notasPorBarrio = self :: notasPorBarrio ();
2024-12-09 07:18:02 -03:00
$planilla = [];
foreach ( $notasPorBarrio as $producto => $notasGrupo ) {
$fila = [ $producto ];
foreach ( $barrios as $barrio ) {
$notas = $notasGrupo -> where ( 'barrio' , $barrio ) -> pluck ( 'notas' ) -> implode ( '; ' );
$fila [] = $notas ? : '' ;
}
$planilla [] = $fila ;
}
try {
$writer = Writer :: createFromPath ( resource_path ( 'csv/exports/notas-por-barrio.csv' ), 'w' );
$writer -> insertOne ( $headers );
$writer -> insertAll ( $planilla );
} catch ( CannotInsertRecord $e ) {
var_export ( $e -> getRecords ());
}
}
2021-12-30 13:12:14 -03:00
}