Skip to content

Instantly share code, notes, and snippets.

@hotsoft-desenv2
Last active February 21, 2025 22:14
Show Gist options
  • Select an option

  • Save hotsoft-desenv2/d7e33eeea0cd34da5b4150e935caad1b to your computer and use it in GitHub Desktop.

Select an option

Save hotsoft-desenv2/d7e33eeea0cd34da5b4150e935caad1b to your computer and use it in GitHub Desktop.

Revisions

  1. hotsoft-desenv2 revised this gist Feb 21, 2025. 1 changed file with 15 additions and 6 deletions.
    21 changes: 15 additions & 6 deletions donwload-tickets-otrs.js
    Original file line number Diff line number Diff line change
    @@ -33,12 +33,19 @@
    const processedTickets = new Set(loadProcessedTickets());
    const processedPages = new Set(loadProcessedPages());

    // Impedir o recarregamento da página
    window.addEventListener('beforeunload', function (e) {
    const confirmationMessage = "Você realmente deseja sair ou recarregar a página? Todo progresso não salvo será perdido.";
    e.returnValue = confirmationMessage;
    return confirmationMessage;
    });
    // Adiciona um aviso visual para o usuário
    const warningDiv = document.createElement('div');
    warningDiv.textContent = "Não recarregue ou feche esta página. O script está em execução.";
    warningDiv.style.position = 'fixed';
    warningDiv.style.top = '0';
    warningDiv.style.left = '0';
    warningDiv.style.width = '100%';
    warningDiv.style.padding = '10px';
    warningDiv.style.backgroundColor = 'red';
    warningDiv.style.color = 'white';
    warningDiv.style.textAlign = 'center';
    warningDiv.style.zIndex = '9999';
    document.body.appendChild(warningDiv);

    // Função para baixar o PDF sem abrir
    async function downloadPDF(ticketNumber) {
    @@ -141,6 +148,8 @@
    }

    console.log("Todas as páginas foram processadas!");
    // Remover o aviso visual após a conclusão
    warningDiv.remove();
    }

    // Iniciar
  2. hotsoft-desenv2 created this gist Feb 21, 2025.
    148 changes: 148 additions & 0 deletions donwload-tickets-otrs.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,148 @@
    (async function() {
    const baseUrl = "https://intranet.rgk4it.com/znuny/customer.pl";
    const ticketsPerPage = 30; // 30 tickets por página
    const totalTickets = 4413; // Total de tickets
    const totalPages = Math.ceil(totalTickets / ticketsPerPage); // 148 páginas

    let totalDownloaded = 0;
    let totalRemaining = totalTickets;

    // Função para carregar TicketIDs processados
    function loadProcessedTickets() {
    const processedTickets = localStorage.getItem('processedTickets');
    return processedTickets ? JSON.parse(processedTickets) : [];
    }

    // Função para salvar TicketIDs processados
    function saveProcessedTickets(processedTickets) {
    localStorage.setItem('processedTickets', JSON.stringify(processedTickets));
    }

    // Função para carregar páginas processadas
    function loadProcessedPages() {
    const processedPages = localStorage.getItem('processedPages');
    return processedPages ? JSON.parse(processedPages) : [];
    }

    // Função para salvar páginas processadas
    function saveProcessedPages(processedPages) {
    localStorage.setItem('processedPages', JSON.stringify(processedPages));
    }

    // Carregar TicketIDs e páginas já processados
    const processedTickets = new Set(loadProcessedTickets());
    const processedPages = new Set(loadProcessedPages());

    // Impedir o recarregamento da página
    window.addEventListener('beforeunload', function (e) {
    const confirmationMessage = "Você realmente deseja sair ou recarregar a página? Todo progresso não salvo será perdido.";
    e.returnValue = confirmationMessage;
    return confirmationMessage;
    });

    // Função para baixar o PDF sem abrir
    async function downloadPDF(ticketNumber) {
    if (processedTickets.has(ticketNumber)) {
    console.log(`Ticket ${ticketNumber} já processado, pulando...`);
    totalDownloaded++;
    totalRemaining--;
    console.log(`Progresso: ${totalDownloaded} baixados, ${totalRemaining} restantes.`);
    return;
    }

    console.log(`Processando ticket: ${ticketNumber}`);
    const ticketUrl = `${baseUrl}?Action=CustomerPortalTicketZoom;TicketNumber=${ticketNumber}`;

    try {
    const response = await fetch(ticketUrl);
    const htmlText = await response.text();
    const parser = new DOMParser();
    const doc = parser.parseFromString(htmlText, 'text/html');
    const ticketIdInput = doc.querySelector('input[name="TicketID"]');

    if (!ticketIdInput) {
    console.warn(`TicketID não encontrado para ${ticketNumber}`);
    return;
    }

    const ticketId = ticketIdInput.value;
    console.log(`TicketID encontrado: ${ticketId}`);

    const pdfUrl = `${baseUrl}?Action=CustomerTicketPrint;TicketID=${ticketId}`;
    const pdfResponse = await fetch(pdfUrl, {
    headers: {
    'Accept': 'application/pdf' // Força o tipo como PDF puro
    }
    });
    const blob = await pdfResponse.blob();
    const url = window.URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = `${ticketNumber}.pdf`;
    a.style.display = 'none'; // Evita interferência visual
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
    window.URL.revokeObjectURL(url);

    console.log(`PDF baixado: ${ticketNumber}.pdf`);
    totalDownloaded++;
    totalRemaining--;
    console.log(`Progresso: ${totalDownloaded} baixados, ${totalRemaining} restantes.`);

    processedTickets.add(ticketNumber); // Adicionar TicketNumber aos processados
    saveProcessedTickets([...processedTickets]); // Salvar processados
    } catch (e) {
    console.error(`Erro ao processar ${ticketNumber}: ${e.message}`);
    }
    }

    // Função para processar todos os tickets de uma página simultaneamente
    async function processPageTickets(ticketNumbers) {
    const downloadPromises = ticketNumbers.map(ticketNumber => downloadPDF(ticketNumber));
    await Promise.all(downloadPromises); // Executa todos os downloads em paralelo
    }

    // Função para processar todas as páginas via fetch
    async function processAllPages() {
    for (let page = 1; page <= totalPages; page++) {
    if (processedPages.has(page)) {
    console.log(`Página ${page} já processada, pulando...`);
    continue;
    }

    const startHit = (page - 1) * ticketsPerPage + 1; // 1, 31, 61, ...
    const pageUrl = `${baseUrl}?Action=CompanyTickets;SortBy=Age;OrderBy=Down;Filter=All;Subaction=CompanyTickets;CustomerIDs=hotsoft;StartWindow=0;StartHit=${startHit}`;
    console.log(`Buscando página ${page} de ${totalPages}: ${pageUrl}`);

    try {
    const response = await fetch(pageUrl);
    const htmlText = await response.text();
    const parser = new DOMParser();
    const doc = parser.parseFromString(htmlText, 'text/html');
    const ticketLinks = doc.querySelectorAll('td.TicketNumber a.MasterActionLink');
    const ticketNumbers = Array.from(ticketLinks).map(link => link.textContent);
    console.log(`Tickets na página ${page}: ${ticketNumbers.length}`);

    if (ticketNumbers.length === 0) {
    console.log(`Nenhum ticket encontrado na página ${page}, parando.`);
    break;
    }

    // Processar todos os tickets da página simultaneamente
    await processPageTickets(ticketNumbers);
    processedPages.add(page); // Adicionar a página aos processados
    saveProcessedPages([...processedPages]); // Salvar páginas processadas
    console.log(`Página ${page} processada. Progresso geral: ${page}/${totalPages} páginas.`);
    } catch (e) {
    console.error(`Erro ao buscar página ${page}: ${e.message}`);
    break;
    }
    }

    console.log("Todas as páginas foram processadas!");
    }

    // Iniciar
    await processAllPages();
    })();