];
// Se guarda el registro
$query = $this->taskService->addFile($data);
$newFile['id'] = $query['body']->id; // Id del archivo
$newFile['url'] = $filePath; // Ruta del archivo
array_push($this->files, $newFile); // Se agrega el archivo al array de archivos
} else {
// Se emite el mensaje
$this->emit('messageToast', ['type' => 'error', 'message' => 'No se a detectado ningun archivo']);
}
} else {
if ($this->file) {
// Agrego al archivo al array de archivos a guardar
$this->files_not_save[] = $this->file;
} else {
// Se emite el mensaje
$this->emit('messageToast', ['type' => 'error', 'message' => 'No se a detectado ningun archivo']);
}
}
// se cierra la modal
$this->emit('hideModal');
// Se limpia el campo de archivo
$this->file = null;
}
/**
* Método privado que permite subir archivos a una tarea
* @param int $task_id El id de la tarea a la que se le suben los archivos
* @return void
*/
private function uploadFile($task_id)
{
// Si existen archivos para guardar
if (count($this->files_not_save) > 0) {
// Se recorre el array de archivos
foreach($this->files_not_save as $file){
$name = $file->getClientOriginalName(); // Nombre del archivo
$filePath = $file->storeAs('tasks/'.$task_id, $name, 's3'); // Ruta del archivo
// Array de datos
$data = [
'aca_tasks_id' => $task_id,
'url' => $filePath,
'created_by' => Auth::user()->id
];
// Se guarda el registro
$query = $this->taskService->addFile($data);
}
}
// Se limpia el array de archivos
unset($this->files_not_save);
$this->files_not_save = [];
}
/**
* Eiminar archivo del array de archivos a guardar
* @param int $key La posición del archivo en el array
* @return void
*/
public function deleteDocumentArray($key)
{
// Se elimina el archivo del array
unset($this->files_not_save[$key]);
}
/**
* Eiminar archivo del array de archivos a guardar
* @param int $id El id del archivo
* @param string $url La ruta del archivo
* @param int $key La posición del archivo en el array
* @return void
*/
public function deleteDocument($id, $url, $key)
{
// Array de datos
$data = [
'aca_task_files_id' => $id,
'deleted_by' => Auth::user()->id
];
// Se elimina el archivo de la base de datos
$query = $this->taskService->removeFile($data);
// Se valida el resultado
if($query['ok']){
Storage::disk('s3')->delete($url); // Se elimina el archivo del servidor
unset($this->files[$key]); // Se elimina el archivo del array
// Se emite el mensaje
$this->emit('messageToast', ['type' => 'success', 'message' => 'Archivo eliminado.']);
}else{
// Se emite el mensaje
$this->emit('messageToast', ['type' => 'error', 'message' => $query['body']]);
}
}
}
/**
* Función para programar una tarea
*
* @return void
*/
public function program()
{
// Se consulta la tarea para preservar la configuración individual
// cuando se reprograma solamente a un estudiante.
$task = $this->taskService->getItem($this->task_id)['body'];
$isIndividual = !empty($this->matriculation_id);
if ($isIndividual) {
// Reenviar a un estudiante NO cambia la política general de la tarea.
$perTaskSetting = $task['allow_late_submission'] ?? null;
$allowLate = $perTaskSetting === null
? (bool) $this->lateTask
: ((bool) $this->lateTask && (bool) $perTaskSetting);
} else {
// Un docente decide la política de la tarea cuando programa para la clase.
$allowLate = (bool) $this->allow_late_submission;
if ($allowLate && !$this->lateTask) {
$this->emit('messageToast', [
'type' => 'error',
'message' => 'La entrega tardía no está habilitada para el colegio.'
]);
return;
}
}
$rules = [
'delivery_date' => 'required|date',
'delivery_hour' => 'required',
'late_delivery_date' => $allowLate
? 'required|date|after:delivery_date'
: 'nullable|date',
];
if (!$isIndividual) {
$rules['aca_periods_id'] = 'required';
$rules['aca_type_activities_id'] = 'required';
$rules['allow_late_submission'] = 'required|boolean';
$rules['late_penalty_percentage'] = $allowLate
? 'required|numeric|between:0,100'
: 'nullable|numeric|between:0,100';
}
$validated = $this->validate($rules);
if ($isIndividual) {
$validated['aca_matriculations_id'] = $this->matriculation_id;
$validated['aca_periods_id'] = $task['aca_periods_id'];
$validated['aca_type_activities_id'] = $task['aca_type_activities_id'];
} else {
// Se persistirá una configuración explícita solo para la tarea.
$validated['allow_late_submission'] = $allowLate ? 1 : 0;
$validated['late_penalty_percentage'] = $allowLate
? (float) $validated['late_penalty_percentage']
: null;
}
// Si la entrega tardía está desactivada, no enviar fecha extraordinaria.
$validated['late_delivery_date'] = $allowLate
? $validated['late_delivery_date']
: null;
// Periodo de evaluación correspondiente.
$period = $this->periodService->getItem($validated['aca_periods_id'])['body'];
$periodEndDate = substr($period['end_date'], 0, 10);
if ($validated['delivery_date'] > $periodEndDate) {
$this->emit('messageToast', [
'type' => 'error',
'message' => 'La tarea debe estar en el rango de fecha del periodo seleccionado.'
]);
return;
}
if ($allowLate && $validated['late_delivery_date'] > $periodEndDate) {
$this->emit('messageToast', [
'type' => 'error',
'message' => 'La fecha de entrega tardía no puede superar el fin del periodo.'
]);
return;
}
// La validación after:delivery_date también impide la misma fecha.
// Asegurar que la política global nunca cambie desde el reenvío individual.
if ($isIndividual) {
unset($validated['allow_late_submission'], $validated['late_penalty_percentage']);
}
$validated['send'] = 1;
$validated['updated_by'] = Auth::user()->id;
// Se valida si existe el id del registro a actualizar
if ($this->task_id) {
// Se actualiza los datos
$query = $this->taskService->program($validated, $this->task_id);
// Se valida la respuesta
if($query['ok']){
// Se consulta las tareas asociadas a la matrícula
$task_matriculations = $this->taskMatriculationService->getItems(['aca_tasks_id' => $this->task_id])['body'];
// se genera una notificación para cada tarea
foreach($task_matriculations as $task_matriculation){
// Se emite el mensaje
$message = 'Se ha programado una tarea de '.$task['name'].' para '. $task_matriculation['matriculation']['student']['full_name'];
if(isset($task_matriculation['matriculation']['student']['user_school']['users_id']) && isset($task_matriculation['matriculation']['student']['representative']['user_school']['users_id'])){
$this->createNotification($message, [$task_matriculation['matriculation']['student']['user_school']['users_id'], $task_matriculation['matriculation']['student']['representative']['user_school']['users_id']]);
}
}
//Se coloca la tarea como enviada
session(['task_send' => 1]);
// Se redirecciona a la vista de tareas
return redirect()->to('/academy/teacher/class/tasks');
}else{
// Se emite el mensaje
$this->emit('messageToast', ['type' => 'error', 'message' => $query['body']]);
}