HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux Bradford-Sitios 6.14.0-1017-azure #17~24.04.1-Ubuntu SMP Mon Dec 1 20:10:50 UTC 2025 x86_64
User: www-data (33)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
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;
    }
}