modificaciones

This commit is contained in:
cmoreno 2026-10-11 23:16:25 -03:00
parent 3c362b2bd1
commit 91ac61faf9
10 changed files with 671 additions and 265 deletions

View File

@ -5,6 +5,8 @@ namespace App\Http\Controllers;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use App\Models\denuncias; use App\Models\denuncias;
use App\Models\civiles;
use App\Models\TiposDenuncias;
use App\Http\Requests\UpdatedDenunciasRequest; use App\Http\Requests\UpdatedDenunciasRequest;
use App\Http\Requests\StoreDenunciasRequest; use App\Http\Requests\StoreDenunciasRequest;
@ -13,33 +15,73 @@ class denunciasController extends Controller
{ {
public function index(Request $request){ public function index(Request $request){
$denuncias = denuncias::all(); $denuncias = denuncias::with('tipo')->get();
return view('denuncias.index', ['denuncias'=>$denuncias]); return view('denuncias.index', ['denuncias'=>$denuncias]);
} }
public function show($id){ public function show($id){
$denuncias = denuncias::findOrfail($id); $denuncia = denuncias::with('tipo','estado','civiles')->findOrFail($id);
return view('denuncias.show', ["denuncias"=>$denuncias]);
return view('denuncias.show', ["denuncia"=>$denuncia]);
} }
public function create(){ public function create(){
return view('denuncias.new'); $civiles = Civiles::get();
$tipos = TiposDenuncias::get();
return view('denuncias.new',["civiles"=>$civiles, "tipos"=>$tipos] );
} }
public function store(StoreDenunciasRequest $request){ public function store(StoreDenunciasRequest $request){
$denuncias = new denuncias(); $denuncias = new denuncias();
$denuncias->fill([ $denuncias->fill([
'nombre_denunciante' => $request->input('nombre'),
'apellido_denunciante' => $request->input('apellido'),
'dni_denunciante' => $request->input('dni'),
'fecha' => $request->input('fecha'), 'fecha' => $request->input('fecha'),
'tipo' => $request->input('tipo'), 'fecha_hecho' => $request->input('fecha_hecho'),
'tipo_id' => $request->input('tipo_id'),
'descripcion' => $request->input('descripcion'), 'descripcion' => $request->input('descripcion'),
'lugar' => $request->input('lugar'), 'lugar' => $request->input('lugar'),
'estado_id' => 1,
]); ]);
$denuncias->save(); $denuncias->save();
//guardar denunciantes (A)
foreach ($request->input('denunciantes', []) as $civil_id) {
$denuncias->civiles()->attach($civil_id, [
'rol_en_denuncia' => 'A'
]);
}
//Guardar denunciados (D)
foreach ($request->input('denunciados', []) as $civil_id) {
$denuncias->civiles()->attach($civil_id, [
'rol_en_denuncia' => 'D'
]);
}
//Guardar víctimas (V)
foreach ($request->input('victimas', []) as $civil_id) {
$denuncias->civiles()->attach($civil_id, [
'rol_en_denuncia' => 'V'
]);
}
//Guardar testigos (T)
foreach ($request->input('testigos', []) as $civil_id) {
$denuncias->civiles()->attach($civil_id, [
'rol_en_denuncia' => 'T'
]);
}
$request->session()->flash('mensaje-success', 'La denuncia fue guardada exitosamente.'); $request->session()->flash('mensaje-success', 'La denuncia fue guardada exitosamente.');
return redirect('/denuncias'); return redirect('/denuncias');
} }

View File

@ -20,11 +20,9 @@ class StoreDenunciasRequest extends FormRequest
public function rules(): array public function rules(): array
{ {
return [ return [
'nombre' => 'required|regex:/^[a-zA-ZáéíóúñÁÉÍÓÚ]+( [a-zA-ZáéíóúñÁÉÍÓÚ]+)*$/',
'apellido' => 'required|regex:/^[a-zA-ZáéíóúñÁÉÍÓÚ]+( [a-zA-ZáéíóúñÁÉÍÓÚ]+)*$/',
'dni' => 'required|numeric|digits_between:7,8|unique:denuncias,dni_denunciante',
'fecha' => 'required|date', 'fecha' => 'required|date',
'tipo' => 'required|max:100', 'tipo_id' => 'required',
'descripcion' => 'required|max:1000', 'descripcion' => 'required|max:1000',
'lugar' => 'required|max:100', 'lugar' => 'required|max:100',
]; ];
@ -36,22 +34,11 @@ class StoreDenunciasRequest extends FormRequest
public function messages(): array public function messages(): array
{ {
return [ return [
'nombre.required' => 'El campo nombre es requerido',
'nombre.regex' => 'El campo nombre sólo debe contener letras',
'apellido.required' => 'El campo apellido es requerido',
'apellido.regex' => 'El campo apellido sólo debe contener letras',
'dni.required' => 'El campo DNI es requerido',
'dni.numeric' => 'El campo DNI sólo admite números',
'dni.digits_between' => 'El campo DNI debe tener entre 7 y 8 dígitos',
'dni.unique' => 'El DNI ya se encuentra registrado en otra denuncia',
'fecha.required' => 'El campo fecha es requerido', 'fecha.required' => 'El campo fecha es requerido',
'fecha.date' => 'La fecha ingresada no es válida', 'fecha.date' => 'La fecha ingresada no es válida',
'tipo.required' => 'El campo tipo es requerido', 'tipo_id.required' => 'El campo tipo es requerido',
'tipo.max' => 'El tipo no puede superar los 100 caracteres',
'descripcion.required' => 'El campo descripción es requerido', 'descripcion.required' => 'El campo descripción es requerido',
'descripcion.max' => 'La descripción no puede superar los 1000 caracteres', 'descripcion.max' => 'La descripción no puede superar los 1000 caracteres',

View File

@ -0,0 +1,20 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class EstadosDenuncias extends Model
{
use HasFactory;
protected $table = 'estados_denuncias';
public $primaryKey = 'id_estado';
public $timestamps = false;
protected $fillable = [
'nombre',
'descripcion',
];
}

View File

@ -0,0 +1,20 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class TiposDenuncias extends Model
{
use HasFactory;
protected $table = 'tipos_denuncias';
public $primaryKey = 'id_tipo';
public $timestamps = false;
protected $fillable = [
'nombre',
'descripcion',
];
}

View File

@ -14,12 +14,39 @@ class denuncias extends Model
public $timestamps = true; public $timestamps = true;
protected $fillable = [ protected $fillable = [
'nombre_denunciante',
'apellido_denunciante',
'dni_denunciante',
'fecha', 'fecha',
'tipo', 'fecha_hecho',
'tipo_id',
'estado_id',
'descripcion', 'descripcion',
'lugar', 'lugar',
]; ];
public function tipo()
{
return $this->belongsTo(
TiposDenuncias::class,
'tipo_id','id_tipo'
);
}
public function estado()
{
return $this->belongsTo(
EstadosDenuncias::class,
'estado_id','id_estado'
);
}
public function civiles()
{
return $this->belongsToMany(
civiles::class,
'civil_denuncia',
'denuncia_id',
'civil_id',
'id_denuncia',
'id_civil'
)->withPivot('rol_en_denuncia')
->withTimestamps();
}
} }

View File

@ -451,7 +451,7 @@ return [
], ],
], ],
'Select2' => [ 'Select2' => [
'active' => false, 'active' => true,
'files' => [ 'files' => [
[ [
'type' => 'js', 'type' => 'js',

View File

@ -33,11 +33,10 @@
<thead> <thead>
<tr> <tr>
<th>Id</th> <th>Id</th>
<th>Denunciante</th>
<th>DNI</th>
<th>Fecha</th> <th>Fecha</th>
<th>Tipo</th> <th>Tipo</th>
<th>Lugar</th> <th>Lugar</th>
<th>Descripcion</th>
<th>Acciones</th> <th>Acciones</th>
</tr> </tr>
</thead> </thead>
@ -50,18 +49,14 @@
<td>{{ $den->id_denuncia }}</td> <td>{{ $den->id_denuncia }}</td>
<td>
{{ $den->nombre_denunciante }}
{{ $den->apellido_denunciante }}
</td>
<td>{{ $den->dni_denunciante }}</td>
<td>{{ $den->fecha }}</td> <td>{{ $den->fecha }}</td>
<td>{{ $den->tipo }}</td> <td>{{ $den->tipo->nombre }}</td>
<td>{{ $den->lugar }}</td> <td>{{ $den->lugar }}</td>
<td>{{ $den->descripcion }}</td>
<td align="center"> <td align="center">

View File

@ -27,74 +27,14 @@
@csrf @csrf
<!-- Primera fila -->
<div class="row">
<!-- Nombre -->
<div class="form-group col-md-4">
<label for="nombre" class="form-check-label">
Nombre del denunciante (*)
</label>
<input
type="text"
name="nombre"
id="nombre"
value="{{ old('nombre') }}"
required
class="form-control"
>
</div>
<!-- Apellido -->
<div class="form-group col-md-4">
<label for="apellido" class="form-check-label">
Apellido del denunciante (*)
</label>
<input
type="text"
name="apellido"
id="apellido"
value="{{ old('apellido') }}"
required
class="form-control"
>
</div>
<!-- DNI -->
<div class="form-group col-md-4">
<label for="dni" class="form-check-label">
DNI (*)
</label>
<input
type="text"
name="dni"
id="dni"
value="{{ old('dni') }}"
required
class="form-control"
>
</div>
</div>
<!-- Segunda fila --> <!-- Segunda fila -->
<div class="row"> <div class="row">
<!-- Fecha --> <!-- Fecha -->
<div class="form-group col-md-4"> <div class="form-group col-md-3">
<label for="fecha" class="form-check-label"> <label for="fecha" class="form-check-label">
Fecha (*) Fecha de Denuncia (*)
</label> </label>
<input <input
@ -107,20 +47,17 @@
> >
</div> </div>
<div class="form-group col-md-3">
<label for="fecha" class="form-check-label">
<!-- Tipo --> Fecha de Hecho (*)
<div class="form-group col-md-4">
<label for="tipo" class="form-check-label">
Tipo de denuncia (*)
</label> </label>
<input <input
type="text" type="date"
name="tipo" name="fecha_hecho"
id="tipo" id="fecha_hecho"
value="{{ old('tipo') }}" value="{{ old('fecha_hecho') }}"
required required
class="form-control" class="form-control"
> >
@ -128,8 +65,38 @@
</div> </div>
<!-- Tipo -->
<!-- Tipo de denuncia -->
<div class="form-group col-md-3">
<label for="tipo_id" class="form-check-label">
Tipo de denuncia (*)
</label>
<select
name="tipo_id"
id="tipo_id"
class="form-control"
required
>
<option value="">Seleccione un tipo</option>
@foreach($tipos as $tipo)
<option
value="{{ $tipo->id_tipo }}"
{{ old('tipo_id') == $tipo->id_tipo ? 'selected' : '' }}
>
{{ $tipo->nombre }}
</option>
@endforeach
</select>
</div>
<!-- Lugar --> <!-- Lugar -->
<div class="form-group col-md-4"> <div class="form-group col-md-3">
<label for="lugar" class="form-check-label"> <label for="lugar" class="form-check-label">
Lugar (*) Lugar (*)
@ -175,6 +142,166 @@
<br> <br>
<!-- Personas involucradas -->
<div class="row">
<div class="form-group col-md-12">
<h4>Personas involucradas</h4>
<hr>
</div>
</div>
<!-- Denunciantes -->
<div class="row">
<div class="form-group col-md-12">
<label for="denunciantes">
Denunciantes (A) (*)
</label>
<select
name="denunciantes[]"
id="denunciantes"
class="form-control"
multiple
size="5"
required
>
@foreach($civiles as $civil)
<option
value="{{ $civil->id_civil }}"
@selected(in_array($civil->id_civil, old('denunciantes', [])))
>
{{ $civil->apellido }},
{{ $civil->nombre }}
- DNI: {{ $civil->dni }}
</option>
@endforeach
</select>
</div>
</div>
<hr>
<!-- Denunciados -->
<div class="row">
<div class="form-group col-md-12">
<label for="denunciados">
Denunciados (D)
</label>
<select
name="denunciados[]"
id="denunciados"
class="form-control"
multiple
size="5"
>
@foreach($civiles as $civil)
<option
value="{{ $civil->id_civil }}"
@selected(in_array($civil->id_civil, old('denunciados', [])))
>
{{ $civil->apellido }},
{{ $civil->nombre }}
- DNI: {{ $civil->dni }}
</option>
@endforeach
</select>
</div>
</div>
<hr>
<!-- Víctimas -->
<div class="row">
<div class="form-group col-md-12">
<label for="victimas">
Víctimas (V)
</label>
<select
name="victimas[]"
id="victimas"
class="form-control"
multiple
size="5"
>
@foreach($civiles as $civil)
<option
value="{{ $civil->id_civil }}"
@selected(in_array($civil->id_civil, old('victimas', [])))
>
{{ $civil->apellido }},
{{ $civil->nombre }}
- DNI: {{ $civil->dni }}
</option>
@endforeach
</select>
</div>
</div>
<hr>
<!-- Testigos -->
<div class="row">
<div class="form-group col-md-12">
<label for="testigos">
Testigos (T)
</label>
<select
name="testigos[]"
id="testigos"
class="form-control"
multiple
size="5"
>
@foreach($civiles as $civil)
<option
value="{{ $civil->id_civil }}"
@selected(in_array($civil->id_civil, old('testigos', [])))
>
{{ $civil->apellido }},
{{ $civil->nombre }}
- DNI: {{ $civil->dni }}
</option>
@endforeach
</select>
</div>
</div>
<hr>
<div class="row">
<div class="col-md-12">
<small class="text-muted">
Mantenga presionada la tecla Ctrl para
seleccionar varias personas.
</small>
</div>
</div>
<!-- Botones --> <!-- Botones -->
<div class="row justify-content-center align-items-center"> <div class="row justify-content-center align-items-center">
@ -211,11 +338,23 @@
@endsection @endsection
@push('js')
@push('scripts')
<script> <script>
// Aquí podremos agregar JavaScript específico para esta vista. $(document).ready(function() {
$('#denunciantes, #denunciados, #victimas, #testigos').select2({
placeholder: 'Seleccione una o varias personas',
width: '100%',
allowClear: true
});
});
$('#tipo_id').select2({
placeholder: 'Seleccione Tipo',
width: '100%',
allowClear: true
});
</script> </script>
@endpush @endpush

View File

@ -1,189 +1,365 @@
@extends('layouts.admin') @extends('layouts.admin')
@section('contenido') @section('contenido')
<!-- Título -->
<div class="row justify-content-center align-items-center"> <div class="row justify-content-center align-items-center">
<div class="col-md-11">
<div class="col-lg-11 col-md-11 col-sm-11 col-xs-11"> <h3>Detalle de Denuncia N° {{ $denuncia->id_denuncia }}</h3>
<h3>Ver Datos de la Denuncia</h3>
<div class="progress" style="height: 2px;"></div>
</div> </div>
</div> </div>
<br> <br>
<!-- Datos del denunciante -->
<div class="row">
<!-- Nombre -->
<div class="form-group col-md-4">
<label for="nombre" class="form-check-label">
Nombre del denunciante
</label>
<input
type="text"
name="nombre"
id="nombre"
class="form-control"
value="{{ $denuncias->nombre_denunciante }}"
readonly
>
</div>
<!-- Apellido -->
<div class="form-group col-md-4">
<label for="apellido" class="form-check-label">
Apellido del denunciante
</label>
<input
type="text"
name="apellido"
id="apellido"
class="form-control"
value="{{ $denuncias->apellido_denunciante }}"
readonly
>
</div>
<!-- DNI -->
<div class="form-group col-md-4">
<label for="dni" class="form-check-label">
DNI
</label>
<input
type="text"
name="dni"
id="dni"
class="form-control"
value="{{ $denuncias->dni_denunciante }}"
readonly
>
</div>
</div>
<!-- Datos de la denuncia --> <!-- Datos de la denuncia -->
<div class="row"> <div class="row justify-content-center">
<div class="col-md-11">
<!-- Fecha --> <div class="card card-primary">
<div class="form-group col-md-4">
<label for="fecha" class="form-check-label"> <div class="card-header">
Fecha <h3 class="card-title">Datos de la denuncia</h3>
</label> </div>
<input <div class="card-body">
type="text"
name="fecha" <!-- Primera fila -->
id="fecha" <div class="row">
class="form-control"
value="{{ $denuncias->fecha }}" <!-- Fecha de denuncia -->
readonly <div class="form-group col-md-3">
> <label>Fecha de denuncia</label>
<input
type="text"
class="form-control"
value="{{ $denuncia->fecha }}"
readonly
>
</div>
<!-- Fecha del hecho -->
<div class="form-group col-md-3">
<label>Fecha del hecho</label>
<input
type="text"
class="form-control"
value="{{ $denuncia->fecha_hecho }}"
readonly
>
</div>
<!-- Tipo de denuncia -->
<div class="form-group col-md-3">
<label>Tipo de denuncia</label>
<input
type="text"
class="form-control"
value="{{ $denuncia->tipo->nombre ?? 'Sin especificar' }}"
readonly
>
</div>
<!-- Estado -->
<div class="form-group col-md-3">
<label>Estado</label>
<input
type="text"
class="form-control"
value="{{ $denuncia->estado->nombre ?? 'Sin especificar' }}"
readonly
>
</div>
</div>
<!-- Segunda fila -->
<div class="row">
<!-- Lugar -->
<div class="form-group col-md-12">
<label>Lugar del hecho</label>
<input
type="text"
class="form-control"
value="{{ $denuncia->lugar }}"
readonly
>
</div>
</div>
<!-- Tercera fila -->
<div class="row">
<!-- Descripción -->
<div class="form-group col-md-12">
<label>Descripción</label>
<textarea
class="form-control"
rows="5"
readonly
>{{ $denuncia->descripcion }}</textarea>
</div>
</div>
</div>
</div>
</div> </div>
<!-- Tipo -->
<div class="form-group col-md-4">
<label for="tipo" class="form-check-label">
Tipo de denuncia
</label>
<input
type="text"
name="tipo"
id="tipo"
class="form-control"
value="{{ $denuncias->tipo }}"
readonly
>
</div>
<!-- Lugar -->
<div class="form-group col-md-4">
<label for="lugar" class="form-check-label">
Lugar
</label>
<input
type="text"
name="lugar"
id="lugar"
class="form-control"
value="{{ $denuncias->lugar }}"
readonly
>
</div>
</div> </div>
<!-- Descripción --> <!-- Personas involucradas -->
<div class="row"> <div class="row justify-content-center">
<div class="col-md-11">
<div class="form-group col-md-12"> <div class="card card-info">
<label for="descripcion" class="form-check-label"> <div class="card-header">
Descripción <h3 class="card-title">Personas involucradas</h3>
</label> </div>
<textarea <div class="card-body">
name="descripcion"
id="descripcion" <!-- DENUNCIANTES -->
rows="6" <div class="row">
class="form-control" <div class="col-md-12">
readonly
>{{ $denuncia->descripcion }}</textarea> <h5>Denunciantes (A)</h5>
<hr>
<div class="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Apellido</th>
<th>Nombre</th>
<th>DNI</th>
</tr>
</thead>
<tbody>
@forelse($denuncia->civiles->where('pivot.rol_en_denuncia', 'A') as $civil)
<tr>
<td>{{ $civil->apellido }}</td>
<td>{{ $civil->nombre }}</td>
<td>{{ $civil->dni }}</td>
</tr>
@empty
<tr>
<td colspan="3" class="text-center">
No hay denunciantes registrados.
</td>
</tr>
@endforelse
</tbody>
</table>
</div>
</div>
</div>
<br>
<!-- DENUNCIADOS -->
<div class="row">
<div class="col-md-12">
<h5>Denunciados (D)</h5>
<hr>
<div class="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Apellido</th>
<th>Nombre</th>
<th>DNI</th>
</tr>
</thead>
<tbody>
@forelse($denuncia->civiles->where('pivot.rol_en_denuncia', 'D') as $civil)
<tr>
<td>{{ $civil->apellido }}</td>
<td>{{ $civil->nombre }}</td>
<td>{{ $civil->dni }}</td>
</tr>
@empty
<tr>
<td colspan="3" class="text-center">
No hay denunciados registrados.
</td>
</tr>
@endforelse
</tbody>
</table>
</div>
</div>
</div>
<br>
<!-- VÍCTIMAS -->
<div class="row">
<div class="col-md-12">
<h5>Víctimas (V)</h5>
<hr>
<div class="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Apellido</th>
<th>Nombre</th>
<th>DNI</th>
</tr>
</thead>
<tbody>
@forelse($denuncia->civiles->where('pivot.rol_en_denuncia', 'V') as $civil)
<tr>
<td>{{ $civil->apellido }}</td>
<td>{{ $civil->nombre }}</td>
<td>{{ $civil->dni }}</td>
</tr>
@empty
<tr>
<td colspan="3" class="text-center">
No hay víctimas registradas.
</td>
</tr>
@endforelse
</tbody>
</table>
</div>
</div>
</div>
<br>
<!-- TESTIGOS -->
<div class="row">
<div class="col-md-12">
<h5>Testigos (T)</h5>
<hr>
<div class="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Apellido</th>
<th>Nombre</th>
<th>DNI</th>
</tr>
</thead>
<tbody>
@forelse($denuncia->civiles->where('pivot.rol_en_denuncia', 'T') as $civil)
<tr>
<td>{{ $civil->apellido }}</td>
<td>{{ $civil->nombre }}</td>
<td>{{ $civil->dni }}</td>
</tr>
@empty
<tr>
<td colspan="3" class="text-center">
No hay testigos registrados.
</td>
</tr>
@endforelse
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div> </div>
</div> </div>
<br> <!-- Botones -->
<legend></legend>
<!-- Botón Salir -->
<div class="row justify-content-center align-items-center"> <div class="row justify-content-center align-items-center">
<!-- Editar -->
<div class="col-md-2">
<a
href="{{ route('denuncias.edit', $denuncia->id_denuncia) }}"
class="btn btn-warning btn-block btn-lg"
>
<i class="fas fa-edit"></i> Editar
</a>
</div>
<!-- Volver -->
<div class="col-md-2"> <div class="col-md-2">
<a <a
href="{{ route('denuncias.index') }}" href="{{ route('denuncias.index') }}"
class="btn btn-primary btn-block btn-lg" class="btn btn-primary btn-block btn-lg"
title="Salir"
> >
Salir Volver
</a> </a>
</div> </div>
</div> </div>
<br>
@endsection @endsection

View File

@ -54,7 +54,7 @@
<div class="form-group col-md-3"> <div class="form-group col-md-3">
<label for="rangoo" class="form-check-label"> Rangoo (*)</label> <label for="rangoo" class="form-check-label"> Rangoo (*)</label>
<input type="text" name="rango" id="rango" class="form-control" <input type="text" name="rango" id="rango" class="form-control"
value="{{ old('rango', $per->rango) }}" > value="{{ old('rango') }}" >
</div> </div>
</div> </div>