bancos[$name] = $banco; return $this; } public function process(Model\Inmobiliaria $inmobiliaria, Model\Banco $banco, DateTimeInterface $mes, UploadedFileInterface $file): array { return $this->bancos[strtolower($banco->nombre)]->process($file); } public function export(Model\Inmobiliaria $inmobiliaria, Model\Banco $banco, DateTimeInterface $mes, array $movimientos): string { return $this->exporter->export($inmobiliaria, $banco, $mes, $movimientos); } public function diaria(Model\Inmobiliaria $inmobiliaria, Model\Banco $banco, DateTimeInterface $fecha, UploadedFileInterface $file): array { $cuenta = $this->cuentaRepository->fetchByInmobiliariaAndBanco($inmobiliaria->rut, $banco->id); $ms = $this->getMovimientosDiarios($banco, $file); $cartolaData = [ 'cargos' => 0, 'abonos' => 0, 'saldo' => 0 ]; $movimientos = []; foreach ($ms as $m) { $movimiento = $this->buildMovimiento($cuenta, $m); if ($movimiento->fecha->getTimestamp() === $fecha->getTimestamp()) { $movimientos []= $movimiento; $cartolaData['cargos'] += $movimiento->cargo; $cartolaData['abonos'] += $movimiento->abono; } $cartolaData['saldo'] = $movimiento->saldo; } $cartola = $this->buildCartola($cuenta, $fecha, $cartolaData); return compact('cartola', 'movimientos'); } protected function getMovimientosDiarios(Model\Banco $banco, UploadedFileInterface $file): array { $movimientos = $this->bancos[strtolower($banco->nombre)]->process($file); switch (strtolower($banco->nombre)) { case 'security': $movimientos = $this->processMovimientosDiariosSecurity($movimientos); break; case 'itau': case 'santander': break; } return $movimientos; } protected function processMovimientosDiariosSecurity(array $movimientos): array { $movimientos = array_reverse($movimientos); array_shift($movimientos); return $movimientos; } protected function buildCartola(Model\Inmobiliaria\Cuenta $cuenta, DateTimeInterface $fecha, array $data): Model\Cartola { try { return $this->cartolaRepository->fetchByCuentaAndFecha($cuenta->id, $fecha); } catch (Exception\EmptyResult) { $data['cuenta_id'] = $cuenta->id; $data['fecha'] = $fecha->format('Y-m-d'); $cartola = $this->cartolaRepository->create($data); return $this->cartolaRepository->save($cartola); } } protected function buildMovimiento(Model\Inmobiliaria\Cuenta $cuenta, array $data): Model\Movimiento { try { return $this->movimientoRepository ->fetchByCuentaAndFechaAndMonto( $cuenta->id, new DateTimeImmutable($data['fecha']), $data['cargo'] ?? $data['abono'] ); } catch (Exception\EmptyResult) { $data['cuenta_id'] = $cuenta->id; $movimiento = $this->movimientoRepository->create($data); return $this->movimientoRepository->save($movimiento); } } }