diff --git a/app/src/Service/Money/SII.php b/app/src/Service/Money/SII.php new file mode 100644 index 0000000..b76d0f7 --- /dev/null +++ b/app/src/Service/Money/SII.php @@ -0,0 +1,129 @@ +getUF($dateTime); + } + $class = __CLASS__; + throw new EmptyResponse("{$money_symbol} not found in {$class}"); + } + + /** + * @param DateTimeInterface|null $dateTime + * @return float + * @throws EmptyResponse + */ + protected function getUF(?DateTimeInterface $dateTime = null): float + { + if ($dateTime === null) { + $dateTime = new DateTimeImmutable(); + } + $year = $this->getUFYear($dateTime); + return $year[$dateTime->format('Y-m-d')]; + } + + /** + * @param DateTimeImmutable|null $dateTime + * @return array + * @throws EmptyResponse + */ + protected function getUFYear(?DateTimeImmutable $dateTime = null): array + { + if ($dateTime === null) { + $dateTime = new DateTimeImmutable(); + } + $request_uri = "uf/uf{$dateTime->format('Y')}.htm"; + try { + $response = $this->client->get($request_uri); + } catch (GuzzleException) { + throw new EmptyResponse($request_uri); + } + if ((int) floor($response->getStatusCode() / 100) !== 2) { + throw new EmptyResponse($request_uri); + } + $body = $response->getBody(); + $domHandler = HTMLDocument::createFromString($body->getContents()); + $table = $domHandler->querySelector('div#mes_all'); + $tbody = $table->querySelector('tbody'); + $trs = $tbody->querySelectorAll('tr'); + /** + * [th Dia, th Ene, Feb, Mar, Abr, May, Jun, Jul, Ago, Sep, Oct, Nov, Dic] + * [th 1, td #, #, #, #, #, #, #, #, #, #, #, #] + */ + $year = []; + foreach ($trs as $i => $tr) { + $tds = $tr->querySelectorAll('td'); + foreach ($tds as $j => $td) { + $value = $td->nodeValue; + if (trim($value) === '') { + continue; + } + $d = str_pad($j + 1, 2, '0', STR_PAD_LEFT); + $m = str_pad($i, 2, '0', STR_PAD_LEFT); + $date = "{$dateTime->format('Y')}-{$m}-{$d}"; + trigger_error($date); + $value = $this->valorService->clean($value); + $year[$date] = $value; + } + } + $this->saveUFs($year); + return $year; + } + protected function saveUFs(array $ufs): void + { + $dates = array_keys($ufs); + $dateString = "'" . implode("', '", $dates) . "'"; + + $query1 = $this->ufRepository->getConnection()->getQueryBuilder() + ->select('DISTINCT fecha') + ->from($this->ufRepository->getTable()) + ->where("fecha IN ({$dateString})"); + try { + $statement = $this->ufRepository->getConnection()->query($query1); + $results = $statement->fetchAll(PDO::FETCH_ASSOC); + foreach ($results as $row) { + if (isset($ufs[$row['fecha']])) { + unset($ufs[$row['fecha']]); + } + } + } catch (PDOException) { + return; + } + $values = []; + foreach ($ufs as $fecha => $value) { + $values []= [$fecha, $value]; + } + $valueString = implode(', ', array_fill(0, count($values), '(?, ?)')); + $query2 = "INSERT INTO {$this->ufRepository->getTable()} (fecha, valor) VALUES {$valueString}"; + $this->ufRepository->getConnection()->getPDO()->beginTransaction(); + try { + $this->ufRepository->getConnection()->execute($query2, $values); + if ($this->ufRepository->getConnection()->getPDO()->inTransaction()) { + $this->ufRepository->getConnection()->getPDO()->commit(); + } + } catch (PDOException) { + if ($this->ufRepository->getConnection()->getPDO()->inTransaction()) { + $this->ufRepository->getConnection()->getPDO()->rollBack(); + } + } + } +}