dta-vision-ocr
Version: 
Biblioteca Angular com PO UI para extração de dados estruturados via OCR a partir de imagens ou PDFs, retornando JSON configurável com suporte a processamento em lote.
1 lines • 58.3 kB
Source Map (JSON)
{"version":3,"file":"dta-vision-ocr.mjs","sources":["../../../projects/dta-vision-ocr/src/lib/shared/enums/sesstion-status.enum.ts","../../../projects/dta-vision-ocr/src/environments.ts","../../../projects/dta-vision-ocr/src/lib/core/services/signal-r.service.ts","../../../projects/dta-vision-ocr/src/lib/core/https/dta-vision-authentication-token.api.ts","../../../projects/dta-vision-ocr/src/lib/core/services/dta-vision-authentication-token.service.ts","../../../projects/dta-vision-ocr/src/lib/core/https/jwt-auth.api.ts","../../../projects/dta-vision-ocr/src/lib/core/https/session-id.api.ts","../../../projects/dta-vision-ocr/src/lib/modules/dta-vision-ocr/dta-vision-ocr.component.ts","../../../projects/dta-vision-ocr/src/lib/modules/dta-vision-ocr/dta-vision-ocr.component.html","../../../projects/dta-vision-ocr/src/public-api.ts","../../../projects/dta-vision-ocr/src/dta-vision-ocr.ts"],"sourcesContent":["export enum SessionStatusEnum {\r\n    /**\r\n     * PENDENTE ==> (APAGAR EM 10 MINUTOS)\r\n     */\r\n    Pendente = 1,\r\n  \r\n    /**\r\n     * ATIVADO ==> (ATUALIZAR EM 10 MINUTOS E DEPOIS 10 MINUTOS)\r\n     * E APAGAR SE CASO ULTRAPASSAR OS 10 MINUTOS.\r\n     */\r\n    Ativado = 2,\r\n  \r\n    /**\r\n     * Documento Processado ==> Entrou no loop de documentos.\r\n     */\r\n    DocumentoProcessado = 3,\r\n  \r\n    /**\r\n     * Consumido ==> Após a chamada do loop mandar uma chamada.\r\n     */\r\n    Consumido = 4,\r\n  \r\n    /**\r\n     * EXPIRADO ==> (Apenas para os status Pendente e Ativo).\r\n     */\r\n    Expirado = 5,\r\n  \r\n    /**\r\n     * Error .==> caso ocorra algum erro.\r\n     */\r\n    Error = 100\r\n  }","export const environment = {\r\n  production: false,\r\n  api: {\r\n    dtaAuth: {\r\n      baseUrl: 'https://auth.dta.totvs.io/api/productKey/auth',\r\n      endpoints: {\r\n        token: '/token',\r\n        refreshToken: '/refresh-token'\r\n      }\r\n    }\r\n  },\r\n  apiHost: 'https://visiondocument.dta.totvs.io/',\r\n  apiHostWebApp: 'https://visiondocumentwebapp.dta.totvs.io/',\r\n  sessionStorageKeys: {\r\n    idTotvsVisionDocument: '',\r\n    idProjetoDocument: '',\r\n    userDocument: '',\r\n    contingencyDocument: ''\r\n  }\r\n};","import { EventEmitter, Injectable, Output } from '@angular/core';\r\nimport * as signalR from '@microsoft/signalr';\r\nimport { DocumentResponse, DocumentModel } from '../../shared/models';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class SignalRService {\r\n  private hubConnection: signalR.HubConnection | undefined;\r\n  public host: string = '';\r\n  public messageReceived = new EventEmitter<{ menssagem: DocumentResponse, uniqueKey: number }>();\r\n  @Output() public statusUpdated = new EventEmitter<{ status: any }>();\r\n  \r\n  public initializeConnection(sessionID: string): void {\r\n    // Fechar conexão existente antes de criar uma nova\r\n    this.closeConnection();\r\n    \r\n    this.hubConnection = new signalR.HubConnectionBuilder()\r\n      .withUrl(`${this.host}documentHub?SESSIONID=${sessionID}`, {\r\n        transport: signalR.HttpTransportType.WebSockets,\r\n        withCredentials: false\r\n      })\r\n      .configureLogging(signalR.LogLevel.Information)\r\n      .withAutomaticReconnect()\r\n      .build();\r\n\r\n    this.hubConnection.onclose(() => {\r\n      console.error('Connection closed');\r\n    });\r\n  }\r\n\r\n  private closeConnection(): void {\r\n    if (this.hubConnection) {\r\n      // Fechar a conexão e remover listeners\r\n      this.hubConnection.stop().then(() => {\r\n        console.log('Connection closed');\r\n      }).catch(err => console.error('Error closing connection:', err));\r\n      this.hubConnection = undefined;\r\n    }\r\n  }\r\n\r\n  public async startConnection(): Promise<void> {\r\n    if (this.hubConnection?.state === signalR.HubConnectionState.Connected) {\r\n      await this.hubConnection.stop();\r\n    }\r\n    try {\r\n      await this.hubConnection?.start();\r\n    } catch (err) {\r\n      console.error(\"Error iniciar Hub:\", err);\r\n    }\r\n  }\r\n\r\n  public async joinSession(sessionID: string): Promise<void> {\r\n    try {\r\n      if (this.hubConnection?.state === signalR.HubConnectionState.Connected) {\r\n        await this.hubConnection.invoke('JoinSession', sessionID);\r\n        this.ensureListening();\r\n      }\r\n    } catch (err) {\r\n      console.error(\"Error ao iniciar session:\", err);\r\n    }\r\n  }\r\n\r\n  public async leaveSession(sessionID: string): Promise<void> {\r\n    try {\r\n      if (this.hubConnection?.state === signalR.HubConnectionState.Connected) {\r\n        await this.hubConnection.invoke('LeaveSession', sessionID);\r\n        // Após deixar a sessão, feche a conexão para garantir limpeza total\r\n        await this.hubConnection.stop();\r\n      }\r\n    } catch (err) {\r\n      console.error(\"Error sair da session:\", err);\r\n    }\r\n  }\r\n\r\n  public async formsLocal(sessionID: string | null, body: Array<DocumentModel | null>, idTotvs: string, idProjeto: string): Promise<Array<DocumentResponse> | undefined> {\r\n    try {\r\n      if (this.hubConnection?.state === signalR.HubConnectionState.Connected) {\r\n        const bodyString = JSON.stringify(body);\r\n        await this.hubConnection.invoke('SendMessage', sessionID, bodyString, idTotvs, idProjeto);\r\n      }\r\n    } catch (err) {\r\n      console.error(err);\r\n    }\r\n    return undefined;\r\n  }\r\n\r\n  private ensureListening(): void {\r\n    // Primeiro, verifique se já temos a conexão\r\n    if (!this.hubConnection) {\r\n      return;\r\n    }\r\n  \r\n    // Remova handlers existentes para evitar duplicações\r\n    this.hubConnection.off(\"ReceiveMessage\");\r\n    this.hubConnection.off(\"StatusUpdated\");\r\n    \r\n    // Registre os novos handlers\r\n    this.hubConnection.on(\"ReceiveMessage\", (message) => {\r\n      const documentResponse: DocumentResponse = JSON.parse(message);\r\n      const uniqueKey = new Date().getTime();\r\n      this.messageReceived.emit({ menssagem: documentResponse, uniqueKey });\r\n    });\r\n  \r\n    this.hubConnection.on(\"StatusUpdated\", (status: any) => {\r\n      this.statusUpdated.emit({ status });\r\n    });\r\n    \r\n  }\r\n  \r\n  // Método para limpar recursos quando o componente é destruído\r\n  public dispose(): void {\r\n    this.closeConnection();\r\n  }\r\n}","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { AuthenticationDtaModel, AuthenticationDtaResponseModel } from '../../shared/models/authentication-dta.model';\r\nimport { environment } from '../../../environments';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class DtaVisionAuthenticationTokenApi {\r\n  private readonly baseUrl = environment.api.dtaAuth.baseUrl;\r\n\r\n  constructor(private readonly http: HttpClient) {}\r\n\r\n  /**\r\n   * Gera um novo token de autenticação\r\n   */\r\n  postToken(authenticationDtaModel: AuthenticationDtaModel): Observable<AuthenticationDtaResponseModel> {\r\n    return this.http.post<AuthenticationDtaResponseModel>(`${this.baseUrl}${environment.api.dtaAuth.endpoints.token}`, authenticationDtaModel);\r\n  }\r\n\r\n  /**\r\n   * Faz refresh do token atual\r\n   */\r\n  postRefreshToken(tokenJwt: string): Observable<AuthenticationDtaResponseModel> {\r\n    const headers = new HttpHeaders().set('Authorization', `Bearer ${tokenJwt}`);\r\n    return this.http.post<AuthenticationDtaResponseModel>(`${this.baseUrl}${environment.api.dtaAuth.endpoints.refreshToken}`, {}, { headers });\r\n  }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable, of, map, throwError } from 'rxjs';\r\nimport { DtaVisionAuthenticationTokenApi } from '../https/dta-vision-authentication-token.api';\r\nimport { AuthenticationDtaModel, AuthenticationDtaResponseModel } from '../../shared/models/authentication-dta.model';\r\nimport { environment } from '../../../environments';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class DtaVisionAuthenticationTokenService {\r\n  private readonly storageKey = 'jwtDtaVision';\r\n  private readonly authModelStorageKey = 'authModelDtaVision'; // para salvar o modelo no storage\r\n  private readonly expWarningSeconds = 300; // 5 minutos\r\n\r\n  constructor(private readonly dtaVisionAuthenticationTokenApi: DtaVisionAuthenticationTokenApi) {}\r\n\r\n  /**\r\n   * Gera o token e armazena no sessionStorage\r\n   */\r\n  generateAndStoreToken(authenticationDtaModel: AuthenticationDtaModel): Observable<AuthenticationDtaResponseModel> {\r\n    return this.dtaVisionAuthenticationTokenApi.postToken(authenticationDtaModel).pipe(\r\n      map(response => {\r\n        if (response.token) {\r\n          sessionStorage.setItem(this.storageKey, response.token);\r\n        }\r\n        return response;\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Faz refresh do token atual e armazena no sessionStorage\r\n   */\r\n  refreshToken(tokenJwt: string): Observable<AuthenticationDtaResponseModel> {\r\n    return this.dtaVisionAuthenticationTokenApi.postRefreshToken(tokenJwt).pipe(\r\n      map(response => {\r\n        if (response.token) {\r\n          sessionStorage.setItem(this.storageKey, response.token);\r\n        }\r\n        return response;\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Verifica se o token armazenado é válido (não expirado)\r\n   */\r\n  isTokenValid(): boolean {\r\n    const token = this.getToken();\r\n    if (!token) return false;\r\n    const payload = token.split('.')[1];\r\n    if (!payload) return false;\r\n\r\n    try {\r\n      const decoded = JSON.parse(atob(payload));\r\n      if (!decoded.exp) return false;\r\n      const now = Math.floor(Date.now() / 1000);\r\n      return decoded.exp > now;\r\n    } catch {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Obtém o token JWT salvo no sessionStorage\r\n   */\r\n  getToken(): string | null {\r\n    return sessionStorage.getItem(this.storageKey);\r\n  }\r\n\r\n  /**\r\n   * Salva o model de autenticação no sessionStorage (como JSON)\r\n   */\r\n  setAuthModelToStorage() {\r\n    const model: AuthenticationDtaModel = {\r\n        totvsId: sessionStorage.getItem('idTotvsVisionDocument') ?? environment.sessionStorageKeys.idTotvsVisionDocument,\r\n        projectId: sessionStorage.getItem('idProjetoDocument') ?? environment.sessionStorageKeys.idProjetoDocument,\r\n        user: sessionStorage.getItem('userDocument') ?? environment.sessionStorageKeys.userDocument,\r\n        contingency: sessionStorage.getItem('contingencyDocument') ?? environment.sessionStorageKeys.contingencyDocument,\r\n        applicationID: 1\r\n    }\r\n\r\n    sessionStorage.setItem(this.authModelStorageKey, JSON.stringify(model));\r\n  }\r\n\r\n  /**\r\n   * Recupera o model de autenticação salvo no sessionStorage\r\n   */\r\n  getAuthModelFromStorage(): AuthenticationDtaModel | null {\r\n    const data = sessionStorage.getItem(this.authModelStorageKey);\r\n    return data ? JSON.parse(data) : null;\r\n  }\r\n\r\n  /**\r\n   * Garante um token válido: se expirado, faz novo login,\r\n   * se perto de expirar, faz refresh, senão retorna o atual\r\n   */\r\n  getTokenValidOrRefresh(): Observable<string> {\r\n    const token = this.getToken();\r\n    \r\n    // Cria o modelo de autenticação usando os dados corretos do sessionStorage\r\n    const authModel: AuthenticationDtaModel = {\r\n        totvsId: sessionStorage.getItem('idTotvsVisionDocument') ?? environment.sessionStorageKeys.idTotvsVisionDocument,\r\n        projectId: sessionStorage.getItem('idProjetoDocument') ?? environment.sessionStorageKeys.idProjetoDocument,\r\n        user: sessionStorage.getItem('userDocument') ?? environment.sessionStorageKeys.userDocument,\r\n        contingency: sessionStorage.getItem('contingencyDocument') ?? environment.sessionStorageKeys.contingencyDocument,\r\n        applicationID: 1\r\n    };\r\n        \r\n    // Não existe token? Gerar novo\r\n    if (!token) {\r\n      if (!authModel.totvsId || !authModel.projectId || !authModel.user) {\r\n        return throwError(() => new Error('Dados de autenticação DTA-VISION-DOCUMENT incompletos no sessionStorage.'));\r\n      }\r\n      return this.generateAndStoreToken(authModel).pipe(\r\n        map(res => {\r\n          if (!res.token) throw new Error('Falha ao gerar novo token!');\r\n          return res.token;\r\n        })\r\n      );\r\n    }\r\n\r\n    // Checar expiração e refresh\r\n    const payload = token.split('.')[1];\r\n    if (!payload) {\r\n      if (!authModel.totvsId || !authModel.projectId || !authModel.user) {\r\n        return throwError(() => new Error('Token inválido e dados de autenticação DTA-VISION-DOCUMENT incompletos.'));\r\n      }\r\n      return this.generateAndStoreToken(authModel).pipe(\r\n        map(res => {\r\n          if (!res.token) throw new Error('Falha ao gerar novo token!');\r\n          return res.token;\r\n        })\r\n      );\r\n    }\r\n\r\n    let decoded: { exp: number };\r\n    try {\r\n      decoded = JSON.parse(atob(payload));\r\n    } catch {\r\n      if (!authModel.totvsId || !authModel.projectId || !authModel.user) {\r\n        return throwError(() => new Error('Token inválido e dados de autenticação DTA-VISION-DOCUMENT incompletos.'));\r\n      }\r\n      return this.generateAndStoreToken(authModel).pipe(\r\n        map(res => {\r\n          if (!res.token) throw new Error('Falha ao gerar novo token!');\r\n          return res.token;\r\n        })\r\n      );\r\n    }\r\n\r\n    const now = Math.floor(Date.now() / 1000);\r\n    // Expirado já?\r\n    if (!decoded.exp || decoded.exp <= now) {\r\n      if (!authModel.totvsId || !authModel.projectId || !authModel.user) {\r\n        return throwError(() => new Error('Token expirado e dados de autenticação DTA-VISION-DOCUMENT incompletos.'));\r\n      }\r\n      return this.generateAndStoreToken(authModel).pipe(\r\n        map(res => {\r\n          if (!res.token) throw new Error('Falha ao gerar novo token!');\r\n          return res.token;\r\n        })\r\n      );\r\n    }\r\n    // Perto de expirar: faz refresh!\r\n    if (decoded.exp - now < this.expWarningSeconds) {\r\n      return this.refreshToken(token).pipe(\r\n        map(res => {\r\n          if (!res.token) throw new Error('Falha ao renovar token!');\r\n          return res.token;\r\n        })\r\n      );\r\n    }\r\n    // Se chegou aqui, token está válido e seguro para uso!\r\n    return of(token);\r\n  }\r\n}","import { Injectable } from \"@angular/core\";\r\nimport { HttpClient, HttpHeaders } from \"@angular/common/http\";\r\nimport { Observable, of, BehaviorSubject } from \"rxjs\";\r\nimport { map, catchError } from \"rxjs/operators\";\r\nimport { environment } from \"../../../environments\";\r\n\r\nconst TOKEN_URL = `${environment.api.dtaAuth.baseUrl}${environment.api.dtaAuth.endpoints.token}`;\r\nconst REFRESH_URL = `${environment.api.dtaAuth.baseUrl}${environment.api.dtaAuth.endpoints.refreshToken}`;\r\n\r\ninterface TokenPayload {\r\n  exp: number;\r\n  [key: string]: any;\r\n}\r\n\r\ninterface Credentials {\r\n  totvsId: string;\r\n  projectId: string;\r\n  user: string;\r\n  contingency: string;\r\n}\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class JwtAuthApi {\r\n  private readonly tokenSubject = new BehaviorSubject<{\r\n    credentials: Credentials,\r\n    token: string\r\n  } | null>(null);\r\n\r\n  constructor(private readonly http: HttpClient) { }\r\n\r\n  getValidToken(credentials: Credentials): Observable<string> {\r\n    const cache = this.tokenSubject.value;\r\n    if (cache && this.isSameCredentials(credentials, cache.credentials) && !this.isTokenExpiring(cache.token)) {\r\n      return of(cache.token);\r\n    }\r\n\r\n    if (cache && this.isSameCredentials(credentials, cache.credentials) && this.isTokenExpiring(cache.token)) {\r\n      return this.refreshToken(cache.token).pipe(\r\n        map(token => {\r\n          this.tokenSubject.next({ credentials, token });\r\n          return token;\r\n        }),\r\n        catchError(() => {\r\n          return this.createToken(credentials).pipe(\r\n            map(token => {\r\n              this.tokenSubject.next({ credentials, token });\r\n              return token;\r\n            })\r\n          );\r\n        })\r\n      );\r\n    }\r\n\r\n    return this.createToken(credentials).pipe(\r\n      map(token => {\r\n        this.tokenSubject.next({ credentials, token });\r\n        return token;\r\n      })\r\n    );\r\n  }\r\n\r\n  private isSameCredentials(a: Credentials, b: Credentials): boolean {\r\n    return (\r\n      a.totvsId === b.totvsId &&\r\n      a.projectId === b.projectId &&\r\n      a.user === b.user &&\r\n      a.contingency === b.contingency\r\n    );\r\n  }\r\n\r\n  private createToken(credentials: Credentials): Observable<string> {\r\n    return this.http.post<{ token: string }>(TOKEN_URL, credentials)\r\n      .pipe(map(resp => resp.token));\r\n  }\r\n\r\n  private refreshToken(token: string): Observable<string> {\r\n    const headers = new HttpHeaders().set('Authorization', `Bearer ${token}`);\r\n    return this.http.post<{ token: string }>(REFRESH_URL, {}, { headers })\r\n      .pipe(map(resp => resp.token));\r\n  }\r\n\r\n  private decodeJwt(token: string): TokenPayload | null {\r\n    try {\r\n      const base64 = token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/');\r\n      const jsonPayload = decodeURIComponent(atob(base64)\r\n        .split('')\r\n        .map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))\r\n        .join(''));\r\n      return JSON.parse(jsonPayload);\r\n    } catch {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  private isTokenExpiring(token: string, rangeSeconds = 60): boolean {\r\n    const payload = this.decodeJwt(token);\r\n    if (!payload?.exp) return true;\r\n    const nowSec = Math.floor(Date.now() / 1000);\r\n    return (payload.exp - nowSec) < rangeSeconds;\r\n  }\r\n}","import { Injectable } from \"@angular/core\";\r\nimport { ButtonDocumentModel, SessionIDModel } from \"../../shared/models\";\r\nimport { HttpClient, HttpHeaders } from \"@angular/common/http\";\r\nimport { Observable, switchMap } from \"rxjs\";\r\nimport { JwtAuthApi } from \"./jwt-auth.api\";\r\n\r\n@Injectable({\r\n    providedIn: 'root',\r\n})\r\nexport class SessionIdApi {\r\n    constructor(private readonly http: HttpClient, private readonly jwtAuthApi: JwtAuthApi) { }\r\n\r\n    post(\r\n        host: string,\r\n        idDTAVision: string,\r\n        idProjeto: string,\r\n        user: string,\r\n        contingency: string,\r\n        buttonDocumentModel: Array<ButtonDocumentModel>\r\n    ): Observable<SessionIDModel> {\r\n        const credentials = {\r\n            totvsId: idDTAVision,\r\n            projectId: idProjeto,\r\n            user: user,\r\n            contingency: contingency\r\n        };\r\n        return this.jwtAuthApi.getValidToken(credentials).pipe(\r\n            switchMap(token => {\r\n                const headers = new HttpHeaders()\r\n                    .set('Content-Type', 'application/json')\r\n                    .set('Authorization', `Bearer ${token}`);\r\n                return this.http.post<SessionIDModel>(\r\n                    `${host}api/dta-vision-ocr/new-session`,\r\n                    buttonDocumentModel,\r\n                    { headers }\r\n                );\r\n            })\r\n        );\r\n    }\r\n\r\n    delete(host: string, sessionID: string): Observable<any> {\r\n        let headers = new HttpHeaders();\r\n        headers = headers.set('Content-Type', 'application/json');\r\n        headers = headers.set('SESSIONID', `${sessionID}`);\r\n        return this.http.delete(`${host}api/dta-vision-ocr/session-id`, { headers, responseType: 'text' });\r\n    }\r\n}","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';\r\nimport { PoDialogService, PoModalComponent, PoModule, PoNotificationService } from '@po-ui/ng-components';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\r\nimport { SessionIdApi } from '../../core/https/session-id.api';\r\nimport { SignalRService } from '../../core/services';\r\nimport { ButtonDocumentModel, DocumentResponse, SessionIDModel } from '../../shared/models';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { SessionStatusEnum } from '../../shared/enums';\r\nimport { Subscription } from 'rxjs';\r\nimport { environment } from '../../../environments';\r\n\r\n@Component({\r\n  selector: 'dta-vision-ocr',\r\n  standalone: true,\r\n  imports: [CommonModule, PoModule, FormsModule],\r\n  templateUrl: './dta-vision-ocr.component.html',\r\n  styleUrl: './dta-vision-ocr.component.css'\r\n})\r\nexport class DTAVisionOCRComponent implements OnInit, OnDestroy {\r\n  @Input() public idDTAVision: string = '';\r\n  @Input() public idProjeto: string = '';\r\n  @Input() public listButtonsDocument: Array<ButtonDocumentModel> = [];\r\n  @Input() public user: string = '';\r\n  @Input() public contingency: string = '';\r\n  @Output() informacaoEnviada = new EventEmitter<{\r\n    menssagem: DocumentResponse,\r\n    uniqueKey: number\r\n  }>();\r\n  \r\n  loading: boolean = false;\r\n  screenLock: boolean = false;\r\n\r\n  doesNotDisplayMessage: boolean = localStorage?.getItem('doesNotDisplayMessage') === 'true';\r\n  telaInicial: boolean = true;\r\n  safeUrl?: SafeResourceUrl;\r\n  sessionText: string = 'Sessão iniciada. Para gerar nova sessão, aguarde 1m 30s';\r\n private readonly host = environment.apiHost; //\"https://visiondocument.dta.totvs.io/\";\r\n  private readonly hostWebApp = environment.apiHostWebApp; //\"https://visiondocumentwebapp.dta.totvs.io/\";\r\n  private routeWeb = \"#/doc/\"\r\n  private sessionID: string | null | undefined;\r\n  statusDocument: SessionStatusEnum = SessionStatusEnum.Pendente;\r\n  private statusSubscription: Subscription | undefined;\r\n\r\n  isMobileDevice: boolean = false;\r\n  sessionExpired: boolean = false;\r\n  listDocumentUniqueKey: Array<number> = [];\r\n  openDialog() {\r\n    this.poDialog.confirm({\r\n      title: 'Criar nova sessão',\r\n      message: 'Tem certeza de que deseja criar uma nova sessão ?',\r\n      confirm: () => this.newSession(),\r\n      cancel: () => {},\r\n      literals: { cancel: 'Cancelar', confirm: 'Criar nova sessão' },\r\n    });\r\n  }\r\n\r\n  iniciarSessao(): void {\r\n    this.telaInicial = false;\r\n  }\r\n\r\n  constructor(private readonly sanitizer: DomSanitizer,\r\n    private readonly poNotificationService: PoNotificationService,\r\n    private readonly signalRService: SignalRService,\r\n    private readonly sessionIDApi: SessionIdApi,\r\n    public poDialog: PoDialogService\r\n  ) {}\r\n\r\n  @ViewChild(PoModalComponent, { static: true }) webAppModal?: PoModalComponent;\r\n\r\n\r\n  ngOnInit(): void {\r\n    this.telaInicial = !this.doesNotDisplayMessage;\r\n    this.signalRService.host = this.host;\r\n    this.validateSession();\r\n    this.openWebAppModal();\r\n    this.initializeSignalRConnection(); \r\n    this.initializeSessionStatus(); \r\n  }\r\n\r\n  private initializeSessionStatus() {\r\n    this.statusSubscription = this.signalRService.statusUpdated.subscribe({\r\n      next: (statusUpdate: { status: string; }) => {\r\n        this.statusDocument = Number(statusUpdate.status);\r\n      },\r\n      error: (err: unknown) => console.error('Erro ao receber atualização de status:', err)\r\n    });\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.statusSubscription?.unsubscribe();\r\n    // Adicione esta linha para garantir limpeza total\r\n    this.signalRService.dispose();\r\n  }\r\n\r\n  documentProcess(): boolean {\r\n    return this.statusDocument == SessionStatusEnum.DocumentoProcessado;\r\n  }\r\n  \r\n  openWebAppModal(): void {\r\n    this.sessionID = sessionStorage.getItem('DTAVisionocrdata') ? JSON.parse(sessionStorage.getItem('DTAVisionocrdata') ?? '').sessionID : null;\r\n    if (this.sessionID == null || this.sessionID == undefined) {\r\n      this.getSessionID();\r\n    }\r\n    else if (this.webAppModal) {\r\n      this.setUrl();\r\n      this.webAppModal.open();\r\n    }\r\n  }\r\n\r\n  closeWebAppModal() {\r\n    if (this.webAppModal) {\r\n      this.webAppModal.close();\r\n    }\r\n  }\r\n  \r\n  async newSession() {\r\n    // Remove informações da sessão\r\n    if(this.sessionID) {\r\n      await this.signalRService.leaveSession(this.sessionID);\r\n    }\r\n  \r\n    sessionStorage.removeItem('DTAVisionocrdata');\r\n    this.telaInicial = true;\r\n    this.sessionID = null;\r\n  \r\n    // Troca o caminho da rota para forçar o recarregamento\r\n    this.safeUrl = undefined;\r\n    if (this.routeWeb === \"#/doc/\") {\r\n      this.routeWeb = \"#/doc1/\";\r\n    } else {\r\n      this.routeWeb = \"#/doc/\";\r\n    }\r\n  \r\n    // Aguarde um pouco e então reinicialize\r\n    setTimeout(() => {\r\n      this.ngOnInit();\r\n    }, 100);\r\n  }\r\n\r\n  private validateSession(): void {\r\n    const ocr = sessionStorage.getItem('DTAVisionocrdata');\r\n    if (!ocr) {\r\n      return;\r\n    }\r\n    const objectOCR = JSON.parse(ocr);\r\n    this.sessionID = objectOCR.sessionID;\r\n    this.setUrl();\r\n  }\r\n\r\n  private setUrl() {\r\n    if (this.sessionID) {\r\n      const url = `${this.hostWebApp}${this.routeWeb}${this.sessionID}`;\r\n      this.safeUrl = this.sanitizer.bypassSecurityTrustResourceUrl(url);\r\n    }\r\n  }\r\n\r\n  private async initializeSignalRConnection(): Promise<void> {\r\n    try {\r\n      if (this.sessionID && this.idProjeto) {\r\n        this.signalRService.initializeConnection(this.sessionID);\r\n        await this.signalRService.startConnection();\r\n        this.joinSession(this.sessionID ?? \"\");\r\n\r\n        this.signalRService.messageReceived.subscribe((data) => {\r\n          // Verifica se o uniqueKey já existe na lista\r\n\r\n          if (this.listDocumentUniqueKey.includes(data.uniqueKey)) {\r\n            return; // Se já existe, não faz nada\r\n          }\r\n\r\n          // Se não existe, adiciona à lista\r\n          this.listDocumentUniqueKey.push(data.uniqueKey);\r\n          this.listDocumentUniqueKey = this.listDocumentUniqueKey.slice(-5); // Mantém apenas os últimos 5 uniqueKeys\r\n          \r\n          this.informacaoEnviada.emit(data);\r\n          this.sessionID = null;\r\n          sessionStorage.removeItem('DTAVisionocrdata')\r\n        });\r\n      }\r\n    } catch (error) {\r\n      console.error('Erro ao iniciar conexão:', error);\r\n      this.poNotificationService.error('Erro ao iniciar conexão. Verifique os detalhes no console.');\r\n    }\r\n  }\r\n\r\n  private joinSession(sessionID: string): void {\r\n    this.signalRService.joinSession(sessionID).then().catch(err => console.error(err));\r\n  }\r\n\r\n  private getSessionID(): void {\r\n    if (this.listButtonsDocument.length === 0) {\r\n      this.poNotificationService.error('Nenhum documento criado');\r\n      return;\r\n    }\r\n  \r\n    this.loading = true;\r\n    this.screenLock = true;\r\n  \r\n    this.sessionIDApi.post(\r\n      this.signalRService.host,\r\n      this.idDTAVision,\r\n      this.idProjeto,\r\n      this.user,\r\n      this.contingency,\r\n      this.listButtonsDocument\r\n    ).subscribe({\r\n      next: (response: SessionIDModel) => {\r\n        if (!response.sessionID) {\r\n          return;\r\n        }\r\n        this.sessionID = response.sessionID;\r\n        const objectOCR = {\r\n          sessionID: response.sessionID,\r\n          expiredAt: response.expiredAt\r\n        };\r\n        sessionStorage.setItem('DTAVisionocrdata', JSON.stringify(objectOCR));\r\n\r\n        this.openWebAppModal();\r\n        this.initializeSignalRConnection();\r\n      },\r\n      error: () => {\r\n        this.loading = false;\r\n        this.screenLock = false;\r\n      },\r\n      complete: () => {\r\n        this.loading = false;\r\n        this.screenLock = false;\r\n      }\r\n    });\r\n  }\r\n\r\n  onCheckboxChange() {\r\n    localStorage.setItem('doesNotDisplayMessage', String(this.doesNotDisplayMessage));\r\n  }\r\n}\r\n","<po-modal #webAppModal p-title=\"DTA Vision Document\" [p-hide-close]=\"true\">\r\n  <po-loading-overlay [hidden]=\"!loading\" [p-screen-lock]=\"screenLock\">\r\n  </po-loading-overlay>\r\n\r\n  <div class=\"modal-content\" *ngIf=\"this.telaInicial\">\r\n    <svg class=\"logo\" width=\"96\" height=\"96\" viewBox=\"0 0 96 96\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n      <g clip-path=\"url(#clip0_112_3648)\">\r\n        <mask id=\"mask0_112_3648\" style=\"mask-type:luminance\" maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"96\"\r\n          height=\"96\">\r\n          <path d=\"M96 0H0V96H96V0Z\" fill=\"white\" />\r\n        </mask>\r\n        <g mask=\"url(#mask0_112_3648)\">\r\n          <mask id=\"mask1_112_3648\" style=\"mask-type:alpha\" maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"96\"\r\n            height=\"96\">\r\n            <path\r\n              d=\"M48 96C74.5096 96 96 74.5096 96 48C96 21.4903 74.5096 0 48 0C21.4903 0 0 21.4903 0 48C0 74.5096 21.4903 96 48 96Z\"\r\n              fill=\"#924242\" />\r\n          </mask>\r\n          <g mask=\"url(#mask1_112_3648)\">\r\n            <path\r\n              d=\"M47.04 94.08C73.0195 94.08 94.08 73.0195 94.08 47.04C94.08 21.0605 73.0195 0 47.04 0C21.0605 0 0 21.0605 0 47.04C0 73.0195 21.0605 94.08 47.04 94.08Z\"\r\n              fill=\"#F2F2F2\" />\r\n            <g opacity=\"0.4\">\r\n              <path\r\n                d=\"M221.76 86.622C204.962 86.88 192.543 86.3981 148.195 72.6726C73.3583 49.5105 41.7616 84.96 2.41178e-05 86.88C-2.6694e-05 79.5684 2.20514e-05 27.8399 5.36486e-07 16.32C37.6021 15.8399 59.0416 17.4017 118.863 39.9143C175.939 61.3934 190.562 16.3201 221.76 16.3201C221.76 26.4 221.76 76.8 221.76 86.622Z\"\r\n                fill=\"#E042E3\" />\r\n            </g>\r\n            <g opacity=\"0.2\">\r\n              <path\r\n                d=\"M220.8 69.1201C204 74.4 187.179 93.5393 164.64 93.6C140.856 93.664 117.904 84.4963 90.2487 72.7441C41.4259 51.9973 5.27999 66.24 1.77264e-05 69.1201C2.22364e-06 63.36 -8.17627e-06 36.2743 8.5321e-06 23.5201C14.88 16.8 47.6413 13.5319 117.422 39.5581C171.928 59.887 215.04 26.4 220.8 23.52C220.8 34.56 220.8 60.96 220.8 69.1201Z\"\r\n                fill=\"#DF6DFF\" />\r\n            </g>\r\n            <g opacity=\"0.2\">\r\n              <path\r\n                d=\"M276.481 97.4399C250.081 95.04 226.73 81.5462 186.241 84C107.041 88.8 85.9208 113.28 9.0922e-06 97.4399C9.0922e-06 71.5702 -1.59244e-05 44.6397 1.70347e-05 36.9599C20.1608 31.68 59.0599 16.9619 147.312 51.6165C218.325 79.5016 252.961 42.72 276.481 36.9599C276.481 47.5199 276.481 80.5993 276.481 97.4399Z\"\r\n                fill=\"#045B8F\" />\r\n            </g>\r\n            <g opacity=\"0.7\">\r\n              <path\r\n                d=\"M273.6 52.1605C251.04 60.4801 240.48 77.3762 216.96 78.2399C188.776 79.2748 138.792 58.7341 99.36 52.1605C85.92 49.92 77.7418 47.9971 52.32 46.56C28.7043 45.225 20.16 46.0801 2.63617e-06 52.1605C2.63617e-06 29.3741 -7.43463e-06 32.1599 1.17914e-05 24.9599C19.68 22.08 39.36 17.76 83.52 29.2801C101.657 34.0116 133.375 46.681 149.53 53.1205C216 81.1198 228.48 32.16 273.6 24.9599C273.6 37.0273 273.6 28.2697 273.6 52.1605Z\"\r\n                fill=\"#A541A7\" />\r\n            </g>\r\n          </g>\r\n          <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n            d=\"M48 5.48573C24.52 5.48573 5.48573 24.52 5.48573 48C5.48573 71.4803 24.52 90.5145 48 90.5145C71.4802 90.5145 90.5145 71.4802 90.5145 48C90.5145 24.52 71.4803 5.48573 48 5.48573ZM0 48C0 21.4903 21.4903 0 48 0C74.5099 0 96 21.4903 96 48C96 74.5099 74.5099 96 48 96C21.4903 96 0 74.5099 0 48Z\"\r\n            fill=\"url(#paint0_linear_112_3648)\" />\r\n        </g>\r\n      </g>\r\n      <defs>\r\n        <linearGradient id=\"paint0_linear_112_3648\" x1=\"72\" y1=\"0.959995\" x2=\"21.12\" y2=\"87.36\"\r\n          gradientUnits=\"userSpaceOnUse\">\r\n          <stop stop-color=\"#1271A9\" />\r\n          <stop offset=\"1\" stop-color=\"#A826AB\" />\r\n        </linearGradient>\r\n        <clipPath id=\"clip0_112_3648\">\r\n          <rect width=\"96\" height=\"96\" fill=\"white\" />\r\n        </clipPath>\r\n      </defs>\r\n    </svg>\r\n\r\n    <h3 class=\"c-modal-title po-font-title\">Boas-vindas ao DTA Vision Document</h3>\r\n    <p class=\"c-modal-subtext po-font-text\">Este é o assistente para envio otimizado de documentos. Assim que você\r\n      concluir o upload dos documentos, as informações serão carregadas automaticamente no sistema.</p>\r\n    <po-accordion class=\"c-modal-accordion-instructions\">\r\n      <po-accordion-item p-label=\"Orientações para envio dos documentos\">\r\n        <div class=\"instruction-item\">\r\n          <i class=\"ph ph-seal-check\"></i>\r\n          <p class=\"po-font-text\">Tamanho do documento: Até 2MP</p>\r\n        </div>\r\n        <div class=\"instruction-item\">\r\n          <i class=\"ph ph-seal-check\"></i>\r\n          <p class=\"po-font-text\">Imagem legível e na horizontal</p>\r\n        </div>\r\n        <div class=\"instruction-item\">\r\n          <i class=\"ph ph-seal-check\"></i>\r\n          <p class=\"po-font-text\">Documentos suportados: PNG, JPEG, JPG, WEBP e PDF (máximo de 10 páginas por PDF).</p>                \r\n        </div>\r\n      </po-accordion-item>\r\n    </po-accordion>\r\n    <p class=\"c-modal-subtext\">Lembre-se, a sessão para upload dos documentos dura 10 minutos. Caso o tempo se esgote, o\r\n      processo deverá ser reiniciado. <strong>Quando estiver pronto, clique em Avançar!</strong></p>\r\n  \r\n    <div style=\"margin-bottom: 16px;\">\r\n      <po-checkbox \r\n        p-label=\"Não exibir a mensagem de boas-vindas novamente.\"\r\n        [(ngModel)]=\"doesNotDisplayMessage\"\r\n        (p-change)=\"onCheckboxChange()\">\r\n      </po-checkbox>\r\n    </div>\r\n  \r\n    <po-modal-footer *ngIf=\"this.telaInicial\">\r\n      <po-button p-icon=\"ph ph-caret-right\" p-label=\"Iniciar Sessão\" p-kind=\"primary\"\r\n        (p-click)=\"iniciarSessao()\"></po-button>\r\n        <po-button p-label=\"Fechar\" (p-click)=\"closeWebAppModal()\"></po-button>\r\n    </po-modal-footer>\r\n  </div>\r\n  \r\n  <div class=\"session-info\" *ngIf=\"!this.telaInicial\">\r\n    <iframe [src]=\"safeUrl\" class=\"full-height-iframe\" title=\"Web Viewer\"></iframe>\r\n  </div>\r\n  <po-modal-footer *ngIf=\"!this.telaInicial\">\r\n      <po-button p-label=\"Criar nova sessão\" (p-click)=\"openDialog()\" \r\n           p-icon=\"ph ph-arrows-clockwise\"> </po-button>\r\n      <po-button p-label=\"Fechar\" (p-click)=\"closeWebAppModal()\"></po-button>\r\n  </po-modal-footer>\r\n</po-modal>","/*\r\n * Public API Surface of dta-vision-ocr\r\n*/\r\n\r\nexport * from './lib/modules/dta-vision-ocr/dta-vision-ocr.component';\r\nexport * from './lib/shared/models';\r\nexport * from './lib/core/services';\r\nexport * from './lib/core/https/dta-vision-authentication-token.api';\r\nexport * from './environments';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.DtaVisionAuthenticationTokenApi","map","i2.JwtAuthApi","i1","i3.SignalRService","i4.SessionIdApi"],"mappings":"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