*/ protected $fillable = [ 'name', ]; /** * 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(['name' => $name]); } function pedidosConfirmados() { return $this->pedidos()->where('confirmed',true); } function totalARecaudar() : float { return $this->calcularTotalConfirmados(); } function totalNoBarriales() : float { return $this->calcularTotalConfirmados( fn($p) => $p->total($p->productosNoBarriales()) ); } function totalParaTransporte() : float { return $this->calcularTotalConfirmados( fn($p) => $p->total($p->productosConTransporte()) ); } function totalATransferir() : float { return $this->totalNoBarriales() + TransporteUtils::total($this->totalParaTransporte()); } private function calcularTotalConfirmados(Closure $closure = null) : float { if (!$closure) $closure = fn($p) => $p->totalChismosa(); return $this->pedidosConfirmados()->sum($closure); } /** * Los productos que pertenecen al barrio. */ public function productos(): HasMany { return $this->hasMany(Producto::class); } function exportarPedidoACsv() { if ($this->pedidosConfirmados()->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 { $productosPedidos = $this->productosCantidadesPedidas(); $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)]; 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' => $productosPedidos[$producto->id]]; } } } private function productosCantidadesPedidas() : array { return $this->pedidos() ->where('confirmed',true) ->with('products') ->get() ->flatMap(fn($order) => $order->products->map( fn($product) => [ 'product_id' => $product->id, 'product_name' => $product->name, 'total_ordered' => $product->pivot->quantity, ] )) ->groupBy('product_id') ->map(fn($groupedProducts) => [ 'product_id' => $groupedProducts->first()['product_id'], 'product_name' => $groupedProducts->first()['product_name'], 'total_ordered' => $groupedProducts->sum('total_ordered'), ]); } }