214 lines
11 KiB
PHP
214 lines
11 KiB
PHP
@extends('layouts.landing')
|
|
|
|
@section('title', 'Acta de Calificaciones')
|
|
|
|
@section('head')
|
|
<style>
|
|
@media print {
|
|
.no-print { display: none !important; }
|
|
body { font-size: 12px; }
|
|
.card { border: none !important; box-shadow: none !important; }
|
|
.card-header { background: none !important; border-bottom: 2px solid #333 !important; }
|
|
table { font-size: 11px; }
|
|
}
|
|
.calificacion-cell { min-width: 70px; text-align: center; }
|
|
.promedio-cell { min-width: 80px; text-align: center; font-weight: bold; }
|
|
th.rotate { height: 130px; white-space: nowrap; vertical-align: bottom; }
|
|
th.rotate > div { transform: rotate(-60deg); transform-origin: bottom left; width: 30px; padding-bottom: 5px; }
|
|
</style>
|
|
@endsection
|
|
|
|
@section('content')
|
|
<div class="container-fluid">
|
|
<div class="card shadow mb-4">
|
|
<div class="card-header py-3">
|
|
<div class="d-sm-flex align-items-center justify-content-between">
|
|
<div>
|
|
<h6 class="m-0 font-weight-bold text-primary">
|
|
Acta de Calificaciones
|
|
</h6>
|
|
<small class="text-muted">
|
|
{{ $material->name }} · Grupo: {{ $grupo->clave }}
|
|
</small>
|
|
</div>
|
|
<div class="no-print">
|
|
<a href="{{ route('grupo.material.tareas', [$grupo, $material]) }}"
|
|
class="btn btn-sm btn-secondary shadow-sm mr-2">
|
|
<i class="fas fa-arrow-left fa-sm"></i> Regresar
|
|
</a>
|
|
<button onclick="window.print()" class="btn btn-sm btn-primary shadow-sm">
|
|
<i class="fas fa-print fa-sm"></i> Imprimir
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card-body">
|
|
|
|
{{-- Resumen --}}
|
|
<div class="row mb-4">
|
|
<div class="col-md-3 col-sm-6 mb-3">
|
|
<div class="card border-left-primary shadow-sm h-100 py-2">
|
|
<div class="card-body">
|
|
<div class="text-xs font-weight-bold text-primary text-uppercase mb-1">
|
|
Total de Tareas
|
|
</div>
|
|
<div class="h5 mb-0 font-weight-bold text-gray-800">{{ $tareas->count() }}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3 col-sm-6 mb-3">
|
|
<div class="card border-left-success shadow-sm h-100 py-2">
|
|
<div class="card-body">
|
|
<div class="text-xs font-weight-bold text-success text-uppercase mb-1">
|
|
Total de Alumnos
|
|
</div>
|
|
<div class="h5 mb-0 font-weight-bold text-gray-800">{{ $alumnos->count() }}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3 col-sm-6 mb-3">
|
|
<div class="card border-left-info shadow-sm h-100 py-2">
|
|
<div class="card-body">
|
|
<div class="text-xs font-weight-bold text-info text-uppercase mb-1">
|
|
Materia
|
|
</div>
|
|
<div class="h5 mb-0 font-weight-bold text-gray-800">{{ $material->name }}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3 col-sm-6 mb-3">
|
|
<div class="card border-left-warning shadow-sm h-100 py-2">
|
|
<div class="card-body">
|
|
<div class="text-xs font-weight-bold text-warning text-uppercase mb-1">
|
|
Generado
|
|
</div>
|
|
<div class="h5 mb-0 font-weight-bold text-gray-800">
|
|
{{ \Carbon\Carbon::now()->format('d/m/Y') }}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
@if ($tareas->isEmpty())
|
|
<div class="alert alert-info">No hay tareas registradas para esta materia.</div>
|
|
@elseif ($alumnos->isEmpty())
|
|
<div class="alert alert-info">No hay alumnos inscritos en este grupo.</div>
|
|
@else
|
|
<div class="table-responsive">
|
|
<table class="table table-bordered table-sm" style="width:100%">
|
|
<thead class="thead-dark">
|
|
<tr>
|
|
<th class="align-middle" style="min-width:40px">#</th>
|
|
<th class="align-middle" style="min-width:180px">Alumno</th>
|
|
@foreach ($tareas as $tarea)
|
|
<th class="rotate calificacion-cell">
|
|
<div title="{{ $tarea->titulo }}">
|
|
{{ Str::limit($tarea->titulo, 25) }}
|
|
</div>
|
|
</th>
|
|
@endforeach
|
|
<th class="align-middle promedio-cell text-center"
|
|
style="background:#1a3a5c; color:#fff;">
|
|
Promedio Final
|
|
</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@php $fila = 1; @endphp
|
|
@foreach ($alumnos as $alumno)
|
|
@php
|
|
$user = $alumno->alumnos->first();
|
|
$nombre = $user?->name ?? 'Sin nombre';
|
|
$calificaciones = [];
|
|
$sumaCal = 0;
|
|
$countCal = 0;
|
|
|
|
foreach ($tareas as $tarea) {
|
|
$entrega = $entregas[$alumno->id][$tarea->id] ?? null;
|
|
$cal = ($entrega && $entrega->status === 'calificada')
|
|
? $entrega->calificacion
|
|
: null;
|
|
$calificaciones[$tarea->id] = [
|
|
'valor' => $cal,
|
|
'status' => $entrega?->status ?? 'sin_subir',
|
|
];
|
|
if ($cal !== null) {
|
|
$sumaCal += $cal;
|
|
$countCal++;
|
|
}
|
|
}
|
|
|
|
$promedio = $countCal > 0 ? round($sumaCal / $countCal, 1) : null;
|
|
@endphp
|
|
<tr>
|
|
<td class="text-center align-middle">{{ $fila++ }}</td>
|
|
<td class="align-middle">{{ $nombre }}</td>
|
|
@foreach ($tareas as $tarea)
|
|
@php $data = $calificaciones[$tarea->id]; @endphp
|
|
<td class="calificacion-cell align-middle">
|
|
@if ($data['valor'] !== null)
|
|
<span class="{{ $data['valor'] >= 6 ? 'text-success' : 'text-danger' }} font-weight-bold">
|
|
{{ number_format($data['valor'], 1) }}
|
|
</span>
|
|
@elseif ($data['status'] === 'pendiente')
|
|
<span class="text-warning" title="Pendiente de calificar">
|
|
<i class="fas fa-clock"></i>
|
|
</span>
|
|
@elseif ($data['status'] === 'sin_subir')
|
|
<span class="text-muted" title="Sin entregar">—</span>
|
|
@endif
|
|
</td>
|
|
@endforeach
|
|
<td class="promedio-cell align-middle" style="background:#f8f9fc;">
|
|
@if ($promedio !== null)
|
|
<span class="badge badge-pill {{ $promedio >= 6 ? 'badge-success' : 'badge-danger' }}"
|
|
style="font-size:.95rem; padding:.4em .7em;">
|
|
{{ number_format($promedio, 1) }}
|
|
</span>
|
|
@else
|
|
<span class="text-muted">S/C</span>
|
|
@endif
|
|
</td>
|
|
</tr>
|
|
@endforeach
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<div class="mt-3 no-print">
|
|
<small class="text-muted">
|
|
<i class="fas fa-info-circle"></i>
|
|
El promedio final se calcula únicamente sobre las tareas ya calificadas.
|
|
<strong>—</strong> = sin entregar |
|
|
<i class="fas fa-clock text-warning"></i> = entregada, pendiente de calificación |
|
|
<strong>S/C</strong> = sin calificaciones registradas.
|
|
</small>
|
|
</div>
|
|
|
|
{{-- Firma para impresión --}}
|
|
<div class="row mt-5 d-none d-print-flex">
|
|
<div class="col-4 text-center">
|
|
<div style="border-top:1px solid #333; padding-top:8px; margin-top:50px;">
|
|
Firma del Docente
|
|
</div>
|
|
</div>
|
|
<div class="col-4 text-center">
|
|
<div style="border-top:1px solid #333; padding-top:8px; margin-top:50px;">
|
|
Firma del Director
|
|
</div>
|
|
</div>
|
|
<div class="col-4 text-center">
|
|
<div style="border-top:1px solid #333; padding-top:8px; margin-top:50px;">
|
|
Sello de la Institución
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@endif
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@endsection
|