doGetById([$this->invoiceRepository, 'fetchByCuota'], $id, "No existe toku_id para Cuota {$id}"); } public function getByExternalId(string $id): array { return $this->doGetById([$this->invoiceRepository, 'fetchByTokuId'], $id, "No existe Invoice para toku_id {$id}"); } public function get(string $id): array { $request_uri = "/invoices/{$id}"; return $this->sendGet($request_uri, [200], [404]); } public function add(array $data): bool { $request_uri = "/invoices"; return $this->sendAdd($request_uri, $data, [200, 201], [400, 409, 422]); } public function edit(string $id, array $data): bool { $request_uri = "/invoices/{$id}"; return $this->sendEdit($request_uri, $data, [200], [400, 404, 409, 422]); } public function delete(string $id): void { $request_uri = "/invoices/{$id}"; $this->sendDelete($request_uri, [204], [404, 409]); } public function reset(array $skip = []): array { try { $invoices = $this->invoiceRepository->fetchAll(); $invoices = array_filter($invoices, function (Model\Venta\MediosPago\Toku\Invoice $invoice) use ($skip) { return !in_array($invoice->toku_id, $skip); }); } catch (EmptyResult $exception) { $this->logger->warning($exception); return []; } foreach ($invoices as $invoice) { try { $this->delete($invoice->toku_id); $this->invoiceRepository->remove($invoice); } catch (EmptyResponse $exception) { $this->logger->warning($exception, ['invoice' => $invoice]); } } return $invoices; } /** * @param string $customer_id * @return array * @throws EmptyResponse */ public function getByCustomer(string $customer_id): array { $request_uri = "/invoices/customer/{$customer_id}"; return $this->sendGet($request_uri, [200], [404]); } /** * @param string $invoice_toku_id * @param array $data * @return bool * @throws InvalidResult */ public function update(string $invoice_toku_id, array $data): bool { try { $invoice = $this->invoiceRepository->fetchByTokuId($invoice_toku_id); } catch (EmptyResult $exception) { $this->logger->warning($exception, ['invoice_toku_id' => $invoice_toku_id, 'data' => $data]); throw new InvalidResult("No existe Invoice para toku_id {$invoice_toku_id}", 404, $exception); } if ($data['status'] !== 'AUTHORIZED') { $this->logger->warning("Pago no autorizado", ['invoice_toku_id' => $invoice_toku_id, 'data' => $data]); throw new InvalidResult("Pago no autorizado", 422); } $dateString = $data['date']; try { $date = new DateTimeImmutable($dateString); } catch (DateMalformedStringException $exception) { $this->logger->warning($exception, ['invoice_toku_id' => $invoice_toku_id, 'data' => $data]); throw new InvalidResult("Fecha no válida: {$dateString}", 422, $exception); } $uf = $this->ufService->get($date); if ($uf === 0.0) { $this->logger->warning("No hay UF para la fecha: {$dateString}", ['invoice_toku_id' => $invoice_toku_id, 'data' => $data]); throw new InvalidResult("No hay UF para la fecha: {$dateString}", 422); } $valor = $data['amount']; if ($valor > 1000) { $valor = $data['amount'] / $uf; } if (abs($valor - $invoice->cuota->pago->valor()) >= 0.0001) { $this->logger->warning("Valor en UF no coincide: {$data['amount']}, {$valor} <=> {$invoice->cuota->pago->valor()}", ['invoice_toku_id' => $invoice_toku_id, 'data' => $data]); throw new InvalidResult("Valor en UF no coincide: {$data['amount']}, {$valor} <=> {$invoice->cuota->pago->valor()}", 422); } if ($invoice->cuota->pago->isPagado()) { return true; } return $this->pagoService->depositar($invoice->cuota->pago, $date); } public function save(array $data): bool { return $this->doSave($this->invoiceRepository, $data); } protected function mapParams(array $data): array { $paramsMap = [ 'customer' => 'customer', 'product_id' => 'product_id', 'due_date' => 'fecha', 'subscription' => 'subscription', 'amount' => 'valor', 'is_paid' => 'isPagada', 'is_void' => 'isRechazada', 'link_payment' => null, 'metadata' => 'datosCuota', 'receipt_type' => null, 'id_receipt' => null, 'disable_automatic_payment' => null, 'currency_code' => 'CLF', 'invoice_external_id' => 'cuota_id' ]; $today = new DateTimeImmutable('now', new DateTimeZone('America/Santiago')); $params = []; foreach ($paramsMap as $key => $ref) { if ($ref === null) { continue; } if ($ref === 'fecha') { $params[$key] = $data['cuota']->pago->fecha->format('Y-m-d'); continue; } if ($ref === 'valor') { $valor = 0; if ($data['cuota']->pago->fecha <= $today) { $valor = $data['cuota']->pago->valor(); } if ($valor === 0) { $valor = $data['cuota']->pago->valor / $data['venta']->uf; } $params[$key] = $valor; continue; } if ($ref === 'datosCuota') { $params[$key] = $this->datosCuota($data['cuota']); continue; } if ($ref === 'isPagada') { $params[$key] = $data['cuota']->isPagada(); } if ($ref === 'isRechazada') { $params[$key] = $data['cuota']->isRechazada(); } if ($ref === 'cuota_id') { $params[$key] = $data['cuota']->id; continue; } if (array_key_exists($ref, $data) and $data[$ref] !== '' and $data[$ref] !== null) { $params[$key] = $data[$ref]; } } return $params; } protected function mapSave(array $data): array { $responseMap = [ 'invoice_external_id' => 'cuota_id', 'id' => 'toku_id' ]; $mappedData = []; foreach ($responseMap as $responseKey => $dataKey) { if (isset($data[$responseKey])) { $mappedData[$dataKey] = $data[$responseKey]; } } return $mappedData; } protected function datosCuota(Model\Venta\Cuota $cuota): array { return [ 'Numero' => $cuota->numero, 'Monto_CLP' => $cuota->pago->valor ]; } }