/* global jQuery, SBP_EMISSOR_RECIBOS */ (function($){ 'use strict'; function initInstance(cfg){ if(!cfg || !cfg.rootId) return; var $root = $('#' + cfg.rootId); if(!$root.length) return; var $messages = $root.find('.emissor-recibos__messages'); var $list = $root.find('.emissor-recibos__lista-recibos'); var $msg = $root.find('.emissor-recibos__mensagem'); var $loaderBtn = $root.find('.emissor-recibos__btn__loader'); var $loginBox = $root.find('.emissor-recibos__login'); function getMessage(key, fallback){ var v = $messages.data(key); if(v !== undefined && v !== null && String(v).trim() !== '') return String(v); if(cfg.messages && cfg.messages[key]) return String(cfg.messages[key]); return fallback || ''; } function setLoaded(isLoaded){ $root.toggleClass('loaded', !!isLoaded); } function showMessage(text){ $msg.empty(); if(text && String(text).trim() !== ''){ $msg.append('
' + $('
').text(String(text)).html() + ''); } } function finishLoading(message){ setLoaded(true); showMessage(message || ''); } function resetForLoading(){ setLoaded(false); showMessage(''); $list.empty(); } /** * Restaura o botão de emitir recibos para o estado clicável. */ function restoreLoaderBtn(){ $loaderBtn .show() .removeClass('emissor-recibos__btn__loader--disabled'); } /** * Extrai um ano numérico de uma string de data ISO (ex: "2025-04-04T00:00:00" -> 2025). */ function extrairAno(dateStr){ if(!dateStr || typeof dateStr !== 'string') return null; var match = dateStr.match(/^(\d{4})/); return match ? match[1] : null; } /** * Monta o link de download do recibo APONTANDO PARA O PROXY WP. * O cadid NUNCA vai na URL — o PHP deriva da sessão do usuário logado. * Só o pagid trafega, e o servidor valida se ele pertence ao usuário. */ function buildDownloadHref(pagId){ return cfg.ajaxUrl + '?action=sbp_emissor_recibos_download' + '&pagid=' + encodeURIComponent(pagId) + '&nonce=' + encodeURIComponent(cfg.nonce); } function renderList(recibos){ var rendered = 0; if(Array.isArray(recibos) && recibos.length){ var seen = []; // dedup por PagId recibos.forEach(function(e){ if(!e) return; // pagid é o identificador único do pagamento; sem ele não há recibo var pagId = e.PagId || e.pagId; if(!pagId){ console.warn('[SBP Emissor] Recibo ignorado - sem PagId:', e); return; } // Dedup: se já renderizamos esse PagId, pula if(seen.indexOf(pagId) >= 0) return; seen.push(pagId); // Label para exibição: ano limpo, com fallback para datas var anoRaw = e.PagAnuidade || e.pagAnuidade; var anoDisplay = (anoRaw && String(anoRaw).trim() !== '') ? String(anoRaw).trim() : ''; if(!anoDisplay || isNaN(parseInt(anoDisplay, 10))){ anoDisplay = extrairAno(e.PagDataInicio || e.pagDataInicio) || extrairAno(e.PagData || e.pagData) || ''; } if(!anoDisplay){ console.warn('[SBP Emissor] Recibo ignorado - sem ano identificável:', e); return; } // URL agora aponta para o proxy WP, sem expor cadid nem o endpoint da SBP var href = buildDownloadHref(pagId); var html = ""; $list.append(html); rendered++; }); if(rendered > 0){ finishLoading(''); } else { finishLoading(getMessage('zerorecipes', 'Nenhum recibo foi encontrado.')); restoreLoaderBtn(); } } else { finishLoading(getMessage('zerorecipes', 'Nenhum recibo foi encontrado.')); restoreLoaderBtn(); } } /** * Interpreta o payload devolvido pelo proxy (resp.data), suportando: * - envelope { IsValid, Return } * - array direto */ function handlePayload(payload){ if(payload && payload.IsValid === false){ console.warn('[SBP Emissor] API retornou IsValid: false. Message:', payload.Message || '(sem mensagem)'); finishLoading(getMessage('zerorecipes', 'Nenhum recibo foi encontrado.')); restoreLoaderBtn(); return; } var recibos = null; if(payload && payload.Return !== undefined){ recibos = payload.Return; } else if(Array.isArray(payload)){ recibos = payload; } renderList(recibos); } /** * Busca a lista de recibos VIA PROXY WP. * O servidor deriva o cadid da sessão — nada de cadid no cliente. */ function fetchRecibos(){ return $.ajax({ url: cfg.ajaxUrl, method: 'GET', dataType: 'json', data: { action: 'sbp_emissor_recibos_list', nonce: cfg.nonce } }) .done(function(resp){ if(!resp || !resp.success){ var err = resp && resp.error ? resp.error : 'unknown'; console.error('[SBP Emissor] Proxy retornou erro na listagem:', err); if(err === 'not_logged_in'){ finishLoading(getMessage('login', 'Você precisa estar logado para acessar os recibos.')); } else if(err === 'no_cadid'){ finishLoading(getMessage('errorloading', 'Seu cadastro não possui identificação para emissão do recibo.')); } else { finishLoading(getMessage('errorloading', 'Não foi possível trazer os recibos.')); } restoreLoaderBtn(); return; } handlePayload(resp.data); }) .fail(function(jqXHR, textStatus, errorThrown){ console.error('[SBP Emissor] Falha na requisição ao proxy:', textStatus, errorThrown, '| Status:', jqXHR.status); finishLoading(getMessage('errorloading', 'Não foi possível trazer os recibos.')); restoreLoaderBtn(); }); } function fetchUser(){ return $.ajax({ url: cfg.ajaxUrl, method: 'GET', dataType: 'json', data: { action: 'sbp_emissor_recibos_user', nonce: cfg.nonce } }); } // Click to load receipts $loaderBtn.on('click', function(e){ e.preventDefault(); var $btn = $(this); // Previne clique duplo if($btn.data('loading')) return; $btn.data('loading', true); resetForLoading(); $btn.hide(); fetchRecibos().always(function(){ $btn.data('loading', false); }); }); // Initial: check login resetForLoading(); fetchUser() .done(function(resp){ if(!resp || !resp.success){ finishLoading(getMessage('login', 'Você precisa estar logado para acessar os recibos.')); $loginBox.removeClass('error-login'); return; } // O external_id NÃO é mais guardado/usado no cliente para montar chamadas. // Mantemos apenas a checagem de que o usuário tem identificação. var externalId = resp.data && resp.data.external_id ? String(resp.data.external_id) : ''; if(!externalId){ finishLoading(getMessage('errorloading', 'Seu cadastro não possui identificação para emissão do recibo.')); $loginBox.removeClass('error-login'); return; } // Render dados do sócio (opcional) if(cfg.showSocioHeader && resp.data && resp.data.socio){ var s = resp.data.socio || {}; var parts = []; if(s.nome) parts.push('' + $('').text(String(s.nome)).html() + ''); var small = []; if(s.cpf) small.push('CPF: ' + $('').text(String(s.cpf)).html()); if(s.email) small.push('E-mail: ' + $('').text(String(s.email)).html()); if(small.length) parts.push('' + small.join(' · ') + ''); if(parts.length){ $root.find('.emissor-recibos__socio').html(parts.join('