*/ protected $fillable = [ 'nombre', ]; /** * La región a la que pertenece el barrio. */ public function region(): BelongsTo { return $this->belongsTo(Region::class); } /** * Los pedidos que pertenecen al barrio. */ public function pedidos(): HasMany { return $this->hasMany(Pedido::class); } function crearPedido(string $nombre) : Pedido { return $this->pedidos()->create(['nombre' => $name]); } function pedidosPagados() { return $this->pedidos()->where('pagado',true); } function totalARecaudar() : float { return $this->calcularTotalPagados(); } function totalNoBarriales() : float { return $this->calcularTotalPagados( fn($p) => $p->total($p->productosNoBarriales()) ); } function totalParaTransporte() : float { return $this->calcularTotalPagados( fn($p) => $p->total($p->productosConTransporte()) ); } function totalATransferir() : float { return $this->totalNoBarriales() + TransporteUtils::total($this->totalParaTransporte()); } private function calcularTotalPagados(Closure $closure = null) : float { if (!$closure) $closure = fn($p) => $p->totalChismosa(); return $this->pedidosPagados()->sum($closure); } /** * Los productos que pertenecen al barrio. */ public function productos(): HasMany { return $this->hasMany(Producto::class); } function exportarPedidoACsv() { if ($this->pedidosPagados()->exists()) { $columnaProductos = $this->armarColumnasPedido(); try { $writer = Writer::createFromPath(resource_path('csv/exports/'.$this->nombre.'.csv'), 'w'); $writer->insertAll($columnaProductos); } catch (CannotInsertRecord $e) { var_export($e->getRecords()); } } } private function armarColumnasPedido() : array { $columnaProductos = []; $filasVaciasAgregadas = false; foreach (Categoria::orderBy('id')->get() as $keyC => $categoria) { $columnaProductos[] = ['name' => $categoria->name, 'cantidad' => null]; if ($categoria->name == 'TRANSPORTE, BONOS Y FINANCIAMIENTO SORORO') $columnaProductos[] = ['name' => 'Bono de Transporte', 'cantidad' => TransporteUtils::cantidad($this->totalParaTransporte)]; else if ($categoria->name == 'PRODUCTOS DE GESTIÓN MENSTRUAL') $columnaProductos[] = ['name' => '¿Cuántas copas quieren y pueden comprar en el grupo?', 'cantidad' => null]; foreach ($categoria->productos()->orderBy('id')->get() as $keyP => $producto) { if ($producto->price == 0 && !$filasVaciasAgregadas) { $columnaProductos[] = ['name' => '¿Cuántas copas quieren adquirir a través del financiamiento sororo?', 'cantidad' => null]; $filasVaciasAgregadas = true; } $columnaProductos[] = ['name' => $producto->name, 'cantidad' => $this->cantidadPedida($producto->id)]; } } } private function cantidadPedida($productoId) { $pedidos = $this->pedidos() ->whereHas('productos', function ($query) use ($productoId) { $query->where('producto_id', $productoId);}) ->get(); return $pedidos->sum(function ($pedido) use ($productoId) { return $pedido->productos ->where('id', $productoId) ->first()->pivot->cantidad ?? 0;}); } }