Commit 873daf18 authored by alekeyrivas's avatar alekeyrivas
Browse files

Se sigue trabajando en el creat de instituciones

parent 1744856a
Loading
Loading
Loading
Loading
+55 −60
Original line number Diff line number Diff line
@@ -3,6 +3,8 @@
namespace App\Http\Controllers;

use App\Models\Instituciones;
use App\Models\TelefonoInst;
use App\Models\RedesSocialesInst;
use App\Models\Subgrupo;
use Illuminate\Http\Request;

@@ -22,87 +24,80 @@ public function create()

    public function store(Request $request)
    {
        $validatedData = $request->validate([
            'nombre' => 'required|string|max:255',
            'RFC' => 'nullable|string|max:13',
        $data = $request->validate([
            'imagen' => 'nullable|string',
            'nombre' => 'required|string',
            'RFC' => 'nullable|string',
            'domicilio' => 'nullable|string',
            'codigo_postal' => 'nullable|integer',
            'localidad' => 'nullable|string',
            'aniversario' => 'nullable|date',
            'observaciones' => 'nullable|string',
            'subgrupo_id' => 'nullable|integer',
            'imagen' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048',
            'domicilio' => 'nullable|string|max:255',
            'codigo_postal' => 'nullable|string|max:10',
            'localidad' => 'nullable|string|max:255',
            'prefijo' => 'nullable|string|max:10',
            'lada' => 'nullable|string|max:5',
            'numero' => 'nullable|string|max:15',
            'tipo' => 'nullable|string',
            'estatus' => 'nullable|boolean',
            'ext' => 'nullable|string|max:10',
            'observaciones' => 'nullable|string',
            'ID_radio' => 'nullable|string|max:50',
            'nombre' => 'nullable|string|max:255',
            'link' => 'nullable|url',
            'tipo' => 'nullable|string',
            'telefonos' => 'array',
            'redesSociales' => 'array'
        ]);

        // Handle file upload if there is any
        if ($request->hasFile('imagen')) {
            $imagePath = $request->file('imagen')->store('imagenes', 'public');
            $validatedData['imagen'] = $imagePath;
        }
        $institucion = Institucion::create($data);

        $institucion = Institucion::create($validatedData);

        // Guardar los teléfonos
        foreach ($request->prefijo as $index => $prefijo) {
            Telefono::create([
                'institucion_id' => $institucion->id,
                'prefijo' => $prefijo,
                'lada' => $request->lada[$index],
                'numero' => $request->numero[$index],
                'tipo' => $request->tipo[$index],
                'estatus' => $request->estatus[$index],
                'ext' => $request->ext[$index],
                'observaciones' => $request->telefono_observaciones[$index],
                'ID_radio' => $request->ID_radio[$index],
            ]);
        foreach ($data['telefonos'] as $telefono) {
            $institucion->telefonos()->create($telefono);
        }

        // Guardar las redes sociales
        foreach ($request->red_nombre as $index => $red_nombre) {
            RedSocial::create([
                'institucion_id' => $institucion->id,
                'nombre' => $red_nombre,
                'link' => $request->link[$index],
                'tipo' => $request->red_tipo[$index],
            ]);
        foreach ($data['redesSociales'] as $redSocial) {
            $institucion->redesSociales()->create($redSocial);
        }

        return redirect()->route('instituciones.index')->with('success', 'Institución creada exitosamente');
        return redirect()->route('instituciones.index');
    }

    public function edit($id)
    public function show(Institucion $institucion)
    {
        $institucion = Instituciones::findOrFail($id);
        $subgrupos = Subgrupo::all();
        return view('adminGen.instituciones.edit', compact('institucion', 'subgrupos'));
        return view('instituciones.show', compact('institucion'));
    }

    public function update(Request $request, $id)
    public function edit(Institucion $institucion)
    {
        $institucion = Instituciones::findOrFail($id);
        $data = $request->all();
        if ($request->hasFile('imagen')) {
            $data['imagen'] = $request->file('imagen')->store('imagenes', 'public');
        return view('instituciones.edit', compact('institucion'));
    }

    public function update(Request $request, Institucion $institucion)
    {
        $data = $request->validate([
            'imagen' => 'nullable|string',
            'nombre' => 'required|string',
            'RFC' => 'nullable|string',
            'domicilio' => 'nullable|string',
            'codigo_postal' => 'nullable|integer',
            'localidad' => 'nullable|string',
            'aniversario' => 'nullable|date',
            'observaciones' => 'nullable|string',
            'subgrupo_id' => 'nullable|integer',
            'telefonos' => 'array',
            'redesSociales' => 'array'
        ]);

        $institucion->update($data);

        $institucion->telefonos()->delete();
        foreach ($data['telefonos'] as $telefono) {
            $institucion->telefonos()->create($telefono);
        }

        $institucion->redesSociales()->delete();
        foreach ($data['redesSociales'] as $redSocial) {
            $institucion->redesSociales()->create($redSocial);
        }

        return redirect()->route('instituciones.index');
    }

    public function destroy($id)
    public function destroy(Institucion $institucion)
    {
        $institucion = Instituciones::findOrFail($id);
        $institucion->telefonos()->delete();
        $institucion->redesSociales()->delete();
        $institucion->delete();

        return redirect()->route('instituciones.index');
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@
namespace App\Http\Controllers;

use App\Models\RedSocialInst;
use App\Models\Institucion;
use App\Models\Instituciones;
use Illuminate\Http\Request;

class RedSocialInstController extends Controller
+1 −1
Original line number Diff line number Diff line
@@ -5,7 +5,7 @@
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class RedSocialInst extends Model
class RedesSocialesInst extends Model
{
    use HasFactory;

+141 −118
Original line number Diff line number Diff line
@@ -90,8 +90,8 @@
                </div>    

                <!-- Campos para cada pestaña -->
                <div>
                    <form action="{{ route('instituciones.store') }}" method="POST" enctype="multipart/form-data" @submit.prevent="submitForm">
                <div class="container">
                    <form action="{{ route('instituciones.store') }}" method="POST" x-data="institucionForm">
                        @csrf
                        <!--Datos-->
                        <div x-show="activeTab === 1">
@@ -99,7 +99,7 @@
                                <h2 class="text-2xl font-bold mb-6">Agregar Datos</h2>
                                <div class="mb-4">
                                    <label for="nombre" class="block text-gray-700">Nombre:</label>
                                        <input type="text" id="nombre" name="nombre" class="form-input mt-1 block w-full" required>
                                    <input type="text" id="nombre" name="nombre" x-model="nombre" class="form-input mt-1 block w-full" required>
                                </div>
                                <div class="mb-4">
                                    <label for="RFC" class="block text-gray-700">RFC:</label>
@@ -154,22 +154,23 @@
                                <div class="panel mt-6">
                                    <h1 class="text-2xl font-semibold mb-5">Agregar teléfono</h1>
                                    <div id="telefonos-container" class="space-y-4">
                                        <template x-for="(telefono, index) in telefonos" :key="index">
                                            <div class="telefono-group grid grid-cols-1 md:grid-cols-8 gap-4">
                                                <div>
                                                    <label for="prefijo" class="block text-sm font-medium text-gray-700">Prefijo</label>
                                                    <input type="number" name="prefijo[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" value="{{ old('prefijo') }}">
                                                    <input type="number" :name="'prefijo['+index+']'" x-model="telefono.prefijo" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
                                                </div>
                                                <div>
                                                    <label for="lada" class="block text-sm font-medium text-gray-700">Lada</label>
                                                    <input type="number" name="lada[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" value="{{ old('lada') }}">
                                                    <input type="number" :name="'lada['+index+']'" x-model="telefono.lada" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
                                                </div>
                                                <div>
                                                    <label for="numero" class="block text-sm font-medium text-gray-700">Número</label>
                                                    <input type="number" name="numero[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" value="{{ old('numero') }}">
                                                    <input type="number" :name="'numero['+index+']'" x-model="telefono.numero" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
                                                </div>
                                                <div class="mb-5">
                                                    <label for="tipo" class="block text-sm font-medium text-gray-700">Tipo</label>
                                                    <select name="tipo[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
                                                    <select :name="'tipo['+index+']'" x-model="telefono.tipo" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
                                                        <option value="0">Selecciona un tipo</option>
                                                        <option value="Celular">Celular</option>
                                                        <option value="Fax">Fax</option>
@@ -181,29 +182,30 @@
                                                </div>
                                                <div>
                                                    <label for="estatus" class="block text-sm font-medium text-gray-700">Estatus</label>
                                                    <select name="estatus[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
                                                    <select :name="'estatus['+index+']'" x-model="telefono.estatus" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
                                                        <option value="1">Activo</option>
                                                        <option value="0">Inactivo</option>
                                                    </select>
                                                </div>
                                                <div>
                                                    <label for="ext" class="block text-sm font-medium text-gray-700">Extensión</label>
                                                    <input type="number" name="ext[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" value="{{ old('ext') }}">
                                                    <input type="number" :name="'ext['+index+']'" x-model="telefono.ext" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
                                                </div>
                                                <div>
                                                    <label for="observaciones" class="block text-sm font-medium text-gray-700">Observaciones</label>
                                                    <input type="text" name="observaciones[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" value="{{ old('observaciones') }}">
                                                    <input type="text" :name="'observaciones['+index+']'" x-model="telefono.observaciones" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
                                                </div>
                                                <div>
                                                    <label for="ID_radio" class="block text-sm font-medium text-gray-700">ID Radio</label>
                                                    <input type="text" name="ID_radio[]" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" value="{{ old('ID_radio') }}">
                                                    <input type="text" :name="'ID_radio['+index+']'" x-model="telefono.ID_radio" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
                                                </div>
                                                <div class="col-span-8 text-right">
                                                    <button type="button" class="btn btn-success mt-4" onclick="addTelefono()">Agregar Teléfono</button>
                                                    <button type="button" class="btn btn-success mt-4" @click="addTelefono">Agregar Teléfono</button>
                                                    <br>
                                                    <button type="button" class="btn btn-danger" onclick="removeTelefono(this)">Eliminar</button>
                                                    <button type="button" class="btn btn-danger" @click="removeTelefono(index)">Eliminar</button>
                                                </div>
                                            </div>
                                        </template>
                                    </div>
                                </div>
                            </div>
@@ -214,18 +216,19 @@
                                <div class="container mx-auto mt-6">
                                    <h2 class="text-2xl font-bold mb-6">Agregar redes sociales</h2>
                                    <div id="redes-container" class="space-y-4">
                                        <template x-for="(redSocial, index) in redesSociales" :key="index">
                                            <div class="red-social-group grid grid-cols-1 md:grid-cols-4 gap-4">
                                                <div class="mb-4">
                                                    <label for="nombre" class="block text-gray-700">Nombre:</label>
                                                    <input type="text" id="nombre" name="nombre" class="form-input mt-1 block w-full" required>
                                                    <input type="text" :name="'red_nombre['+index+']'" x-model="redSocial.nombre" class="form-input mt-1 block w-full" required>
                                                </div>
                                                <div class="mb-4">
                                                    <label for="link" class="block text-gray-700">Link:</label>
                                                    <input type="url" id="link" name="link" class="form-input mt-1 block w-full">
                                                    <input type="url" :name="'link['+index+']'" x-model="redSocial.link" class="form-input mt-1 block w-full">
                                                </div>
                                                <div class="form-group mb-4">
                                                    <label for="tipo" class="block text-sm font-medium text-gray-700">Tipo de Red social</label>
                                                    <select name="tipo"  id="tipo" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
                                                    <select :name="'red_tipo['+index+']'" x-model="redSocial.tipo" class="block w-full py-2 px-3 border border-gray-300 bg-white rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
                                                        <option value="0">Seleccione una red social</option>
                                                        <option value="Facebook">Facebook</option>
                                                        <option value="X (twitter)">X (twitter)</option>
@@ -235,12 +238,13 @@
                                                </div>
                                                <br>
                                                <div class="col-span-4 text-right">
                                                    <button type="button" class="btn btn-success" onclick="addRedSocial()">Agregar Red Social</button>
                                                    <button type="button" class="btn btn-success" @click="addRedSocial">Agregar Red Social</button>
                                                </div>
                                                <div class="col-span-4 text-right">
                                                    <button type="button" class="btn btn-danger" onclick="removeRedSocial(this)">Eliminar</button>
                                                    <button type="button" class="btn btn-danger" @click="removeRedSocial(index)">Eliminar</button>
                                                </div>
                                            </div>
                                        </template>
                                    </div>
                                </div>
                            </div>
@@ -264,52 +268,71 @@
                    <button type="button" class="btn btn-primary" :disabled="activeTab === 1" @click="activeTab--">Atras</button>
                    <button type="button" class="btn btn-primary" :disabled="activeTab === 5" @click="activeTab++">Siguiente</button>
                </div>
    <!--Script o funcionalidad para agregar y eliminar telefono-->
    <script>
        function addTelefono() {
            const container = document.getElementById('telefonos-container');
            const telefonoGroup = document.querySelector('.telefono-group');
            const newTelefonoGroup = telefonoGroup.cloneNode(true);
            newTelefonoGroup.querySelectorAll('input').forEach(input => input.value = '');
            newTelefonoGroup.querySelectorAll('select').forEach(select => select.value = '0');
            container.appendChild(newTelefonoGroup);
        }
                <br>
                
                
        function removeTelefono(button) {
            const container = document.getElementById('telefonos-container');
            if (container.childElementCount > 1) {
                button.parentElement.parentElement.remove();
                <script>
                    document.addEventListener('alpine:init', () => {
                        Alpine.data('institucionForm', () => ({
                            nombre: '',
                            RFC: '',
                            aniversario: '',
                            observaciones: '',
                            subgrupo_id: '',
                            domicilio: '',
                            codigo_postal: '',
                            localidad: '',
                            telefonos: [{
                                prefijo: '',
                                lada: '',
                                numero: '',
                                tipo: '',
                                estatus: '1',
                                ext: '',
                                observaciones: '',
                                ID_radio: ''
                            }],
                            redesSociales: [{
                                nombre: '',
                                link: '',
                                tipo: ''
                            }],
                            addTelefono() {
                                this.telefonos.push({
                                    prefijo: '',
                                    lada: '',
                                    numero: '',
                                    tipo: '',
                                    estatus: '1',
                                    ext: '',
                                    observaciones: '',
                                    ID_radio: ''
                                });
                            },
                            removeTelefono(index) {
                                if (this.telefonos.length > 1) {
                                    this.telefonos.splice(index, 1);
                                } else {
                                    alert('Debe haber al menos un teléfono');
                                }
        }
    </script>
    <!--Script o funcionalidad para agregar y eliminar red social-->
    <script>
        function addRedSocial() {
            const container = document.getElementById('redes-container');
            const redSocialGroup = document.querySelector('.red-social-group');
            const newRedSocialGroup = redSocialGroup.cloneNode(true);
            newRedSocialGroup.querySelectorAll('input').forEach(input => input.value = '');
            newRedSocialGroup.querySelectorAll('select').forEach(select => select.value = '0');
            container.appendChild(newRedSocialGroup);
        }
    
        function removeRedSocial(button) {
            const container = document.getElementById('redes-container');
            if (container.childElementCount > 1) {
                button.parentElement.parentElement.remove();
                            },
                            addRedSocial() {
                                this.redesSociales.push({
                                    nombre: '',
                                    link: '',
                                    tipo: ''
                                });
                            },
                            removeRedSocial(index) {
                                if (this.redesSociales.length > 1) {
                                    this.redesSociales.splice(index, 1);
                                } else {
                                    alert('Debe haber al menos una red social');
                                }
                            }
                        }));
                    });
                </script>
                


    
    



</x-layout.default>
+12 −13

File changed.

Preview size limit exceeded, changes collapsed.

Loading