File: /var/www/gestion-formularios.bdfschool/app/Imports/UploadStudentPaymentsImport.php
<?php
namespace App\Imports;
use App\Models\ConceptJournal;
use App\Models\UploadStudentPayment;
use App\Models\UploadStudentPaymentDetail;
use Carbon\Carbon;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Validators\ValidationException;
use PhpParser\Node\Stmt\TryCatch;
class UploadStudentPaymentsImport implements ToCollection, WithHeadingRow
{
/**
* Define los encabezados esperados en el archivo.
*/
protected $expectedHeaders = [
//'n',
//'apoderado',
'rut_apoderado',
//'id_apoderado',
'fecha_de_pago',
'monto_del_pago',
'forma_de_pago',
//'tarjeta_de_debito_o_credito',
//'nro_operacion_orden_compra_o_cheque',
///'n_boleta',
//'tipo_documento',
//'estado',
//'fecha_emision',
//'monto_total'
];
public $errorMessage;
public $successMessage;
public $register_id;
private $partners;
public function __construct($partners)
{
$this->partners = $partners;
}
/**
* @param Collection $rows
*/
public function collection(Collection $rows)
{
if (count($rows) <= 0) {
$this->errorMessage = 'El documento está vacío';
return;
}
// Verificar los encabezados en la primera fila.
$headers = $rows->first()->keys()->toArray();
// Comprobar que todos los encabezados coincidan.
foreach ($this->expectedHeaders as $header) {
if (!in_array($header, $headers)) {
$this->errorMessage = 'Falta el encabezado requerido: ' . $header;
return;
}
}
//dd('hello');
//Creación de la cabecera de la carga
$quantity = count($rows);
$quantity_success = 0;
$quantity_error = 0;
try {
$upload_student_payment = UploadStudentPayment::create([
'quantity' => $quantity,
'user_created' => auth()->user()->id,
'created_at' => Carbon::now()
]);
$this->register_id = $upload_student_payment->id;
} catch (\Throwable $th) {
$this->errorMessage = 'Ha ocurrido un error, por favor vuelve a intentarlo más tarde';
return;
}
$num_row = 2;
foreach ($rows as $row) {
$validation_errors = 0;
$validation_messages = '';
try {
// Validar el rut
if (!empty($row['rut_apoderado'])) {
$guardian_rut = strUpper(str_replace('.', '', formateaRut($row['rut_apoderado'])));
} else {
//registrar el error
$validation_errors++;
$validation_messages .= ($validation_errors + 1) . ': Rut de apoderado es requerido. ';
$guardian_rut = null;
}
// odoo_id de apoderado
if ($guardian_rut) {
if (isset($this->partners[$guardian_rut])) {
$odoo_parent_id = $this->partners[$guardian_rut];
} else {
//registrar el error
$validation_errors++;
$validation_messages .= ($validation_errors + 1) . ': Rut de apoderado no encontrado. ';
$odoo_parent_id = null;
}
} else {
$odoo_parent_id = null;
}
if (isset($row['fecha_emision']) && !empty($row['fecha_emision'])) {
$emision_date = ordenar_fechaHoraServidor(trim($row['fecha_emision']));
} else {
$emision_date = null;
}
if (!empty($row['monto_del_pago'])) {
$payment_amount = floatval(trim($row['monto_del_pago'])); // Convertir a float
} else {
$validation_errors++;
$validation_messages .= ($validation_errors + 1) . ': Monto del pago es requerido. ';
$payment_amount = null;
}
if (!empty($row['forma_de_pago'])) {
// Validar método de pago
$assignment = ConceptJournal::where('concept', strUpper(trim($row['forma_de_pago'])))->first();
if (!$assignment) {
$validation_messages .= ($validation_errors + 1) . ': Método de pago "' . $row['forma_de_pago'] . '" no encontrado.';
$validation_errors++;
$payment_method = null;
} else {
$payment_method = $row['forma_de_pago'];
}
} else {
$validation_messages .= ($validation_errors + 1) . ': Método de pago es requerido.';
$validation_errors++;
$payment_method = null;
}
if (!empty($row['fecha_de_pago'])) {
//$payment_date = Carbon::createFromFormat('Y-m-d', '2024-09-08')->toDateString();
$payment_date = ordenar_fechaHoraServidor(trim($row['fecha_de_pago']));
} else {
$validation_messages .= ($validation_errors + 1) . ': Fecha de pago es requerido.';
$validation_errors++;
$payment_date = null;
}
if (isset($row['monto_total']) && !empty($row['monto_total'])) {
$total_amount = floatval(trim($row['monto_total'])); // Convertir a float
} else {
$total_amount = null;
}
if ($validation_errors == 0) {
UploadStudentPaymentDetail::create([
'guardian_rut' => $guardian_rut,
'payment_number' => isset($row['n']) && !empty($row['n']) ? $row['n'] : null,
'guardian' => isset($row['apoderado']) && !empty($row['apoderado']) ? $row['apoderado'] : null,
'guardian_id' => isset($row['id_apoderado']) && !empty($row['id_apoderado']) ? $row['id_apoderado'] : null,
//'payment_date' => null,
'payment_date' => $payment_date,
'payment_amount' => $payment_amount,
'payment_method' => $payment_method,
'operation_number' => isset($row['nro_operacion_orden_compra_o_cheque']) && !empty($row['nro_operacion_orden_compra_o_cheque']) ? $row['nro_operacion_orden_compra_o_cheque'] : null,
'payment_amount' => $payment_amount,
'invoice_number' => isset($row['n_boleta']) && !empty($row['n_boleta']) ? intval($row['n_boleta']) : null,
'document_type' => isset($row['tipo_documento']) && !empty($row['tipo_documento']) ? $row['tipo_documento'] : null,
'status' => isset($row['estado']) && !empty($row['estado']) ? $row['estado'] : null,
'emision_date' => $emision_date,
'total_amount' => $total_amount,
'num_row' => $num_row,
'user_created' => auth()->user()->id,
'created_at' => Carbon::now(),
'load_status' => 1,
'upload_student_payment_id' => $upload_student_payment->id,
'detail_integration_status_id' => 1,
'debit' => isset($row['debe']) && !empty(($row['debe'])) ? $row['debe'] : null,
'credit' => isset($row['haber']) && !empty(($row['haber'])) ? $row['haber'] : null,
'odoo_parent_id' => $odoo_parent_id,
]);
$quantity_success++;
} else {
UploadStudentPaymentDetail::create([
'guardian_rut' => $guardian_rut,
'payment_number' => isset($row['n']) && !empty($row['n']) ? $row['n'] : null,
'guardian' => isset($row['apoderado']) && !empty($row['apoderado']) ? $row['apoderado'] : null,
'guardian_id' => isset($row['id_apoderado']) && !empty($row['id_apoderado']) ? $row['id_apoderado'] : null,
'payment_date' => $payment_date,
'payment_amount' => $payment_amount,
'payment_method' => $payment_method,
'operation_number' => isset($row['nro_operacion_orden_compra_o_cheque']) && !empty($row['nro_operacion_orden_compra_o_cheque']) ? $row['nro_operacion_orden_compra_o_cheque'] : null,
'payment_amount' => $payment_amount,
'invoice_number' => isset($row['n_boleta']) && !empty($row['n_boleta']) ? intval($row['n_boleta']) : null,
'document_type' => isset($row['tipo_documento']) && !empty($row['tipo_documento']) ? $row['tipo_documento'] : null,
'status' => isset($row['estado']) && !empty($row['estado']) ? $row['estado'] : null,
'emision_date' => $emision_date,
'total_amount' => $total_amount,
'num_row' => $num_row,
'user_created' => auth()->user()->id,
'created_at' => Carbon::now(),
'upload_student_payment_id' => $upload_student_payment->id,
'detail_integration_status_id' => 1,
'debit' => isset($row['debe']) && !empty(($row['debe'])) ? $row['debe'] : null,
'credit' => isset($row['haber']) && !empty(($row['haber'])) ? $row['haber'] : null,
'odoo_parent_id' => $odoo_parent_id,
'load_status' => 0,
'error' => $validation_messages
]);
$quantity_error++;
}
} catch (\Exception $e) {
UploadStudentPaymentDetail::create([
'num_row' => $num_row,
'user_created' => auth()->user()->id,
'created_at' => Carbon::now(),
'load_status' => 0,
'upload_student_payment_id' => $upload_student_payment->id,
'detail_integration_status_id' => 1,
'error' => $e->getMessage()
]);
$quantity_error++;
}
$num_row++;
}
$upload_student_payment->update([
'quantity_success' => $quantity_success,
'quantity_error' => $quantity_error,
]);
$this->successMessage = 'Importación realizada correctamente. Registros exitosos: ' . $upload_student_payment->quantity_success . ', Errores: ' . $upload_student_payment->quantity_error;
}
}