'fecha', 'Número de operación' => 'documento', 'Descripción' => 'glosa', 'Depósitos o abonos' => 'abono', 'Giros o cargos' => 'cargo', 'Documentos' => 'documento', 'Movimientos' => 'glosa', 'Saldos' => 'saldo', 'Categoría' => 'categoria', 'Centro costo' => 'centro_costo', 'Detalle' => 'detalle', 'Factura Boleta' => 'identificador', 'RUT' => 'rut', 'Nombres' => 'nombres', 'Depto' => 'identificador', ]; } protected function getFilename(UploadedFileInterface $uploadedFile): string { return '/tmp/cartola.xls'; } protected function parseFile(string $filename): array { $reader = PhpSpreadsheet\IOFactory::createReader('Xls'); $xlsx = $reader->load($filename); $sheet = $xlsx->getActiveSheet(); $data = []; try { switch ($this->identifySheet($sheet)) { case self::CUENTA_CORRIENTE: $data = $this->parseCuentaCorriente($sheet); break; case self::ULTIMOS_MOVIMIENTOS: $data = $this->parseUltimosMovimientos($sheet); break; } } catch (PhpSpreadsheet\Exception $exception) { $this->logger->critical($exception); } return $data; } protected function parseCuentaCorriente(PhpSpreadsheet\Worksheet\Worksheet $sheet): array { $found = false; $year = 0; $columns = []; $data = []; foreach ($sheet->getRowIterator() as $row) { if (!$found and $sheet->getCell("A{$row->getRowIndex()}")->getCalculatedValue() === 'Cartola Histórica') { $columnIndex = 'A'; foreach ($row->getColumnIterator() as $column) { if ($column->getValue() !== 'Periodo') { continue; } $columnIndex = $column->getColumn(); break; } $dates = explode(' - ', $sheet->getCell("{$columnIndex}{$row->getRowIndex()}")->getCalculatedValue()); $date = DateTimeImmutable::createFromFormat('d/m/Y', $dates[0]); $year = $date->format('Y'); } if (!$found and $sheet->getCell("A{$row->getRowIndex()}")->getCalculatedValue() === 'Movimientos') { $found = true; foreach ($row->getColumnIterator() as $column) { if ($column->getValue() === null) { break; } $columns[$column->getColumn()] = trim($column->getValue()); } continue; } if (!$found) { continue; } if ($sheet->getCell("A{$row->getRowIndex()}")->getValue() === null) { break; } $rowData = []; foreach ($columns as $columnIndex => $column) { $value = $sheet->getCell("{$columnIndex}{$row->getRowIndex()}")->getCalculatedValue(); $mapped = $this->columnMap()[$column]; if ($mapped === 'fecha') { list($d, $m) = explode('/', $value); $value = "{$year}-{$m}-{$d}"; } if (in_array($mapped, ['cargo', 'abono', 'saldo'])) { $value = (int) $value; } $rowData[$column] = $value; } $data []= $rowData; } return $data; } protected function parseUltimosMovimientos(PhpSpreadsheet\Worksheet\Worksheet $sheet): array { $found = false; $data = []; $columns = []; foreach ($sheet->getRowIterator() as $row) { if (!$found and $sheet->getCell("A{$row->getRowIndex()}")->getCalculatedValue() === 'Últimos Movimientos') { $found = true; continue; } if (!$found) { continue; } if (count($columns) === 0) { foreach ($row->getColumnIterator() as $cell) { if ($cell->getValue() === null) { break; } $columns[$cell->getColumn()] = trim($cell->getValue()); } continue; } if ($sheet->getCell("A{$row->getRowIndex()}")->getValue() === null) { break; } $rowData = []; foreach ($columns as $columnIndex => $column) { $value = $sheet->getCell("{$columnIndex}{$row->getRowIndex()}")->getCalculatedValue(); $mapped = $this->columnMap()[$column] ?? $column; if ($mapped === 'fecha') { $value = PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value, 'America/Santiago')->format('Y-m-d'); } if (in_array($mapped, ['abono', 'cargo', 'saldo'])) { $value = (int) $value; } $rowData[$column] = $value; } $data []= $rowData; } return $data; } protected function identifySheet(PhpSpreadsheet\Worksheet\Worksheet $sheet): int { foreach ($sheet->getRowIterator(1, 10) as $row) { $value = $sheet->getCell("A{$row->getRowIndex()}")->getValue(); if ($value === 'Estado de Cuenta Corriente') { return self::CUENTA_CORRIENTE; } if ($value === 'Consulta Saldos y Últimos movimientos') { return self::ULTIMOS_MOVIMIENTOS; } } throw new PhpSpreadsheet\Exception(); } }