class JSpage { static ALL = class { static Config() { LINKS.defineAll(); LAST.executar(); } } static HOME = class { static ConfigInicial() { } static Config() { LINKS.defineAll(); } } static EXEMPLO = class { static ConfigInicial() { } static Config() { } static filtraTabela() { } static afterLoadTabela() { } static NovoItem() { } static AfterGetData() { } static ValidaForm(continua) { continua(); } static ClickItem() { } static AfterSave(res) { } } static CHECKOUT = class { static Config() { CESTO.inicio(); } static EXPRESS = class { static Config() { CESTO_EXPRESS.inicio(); } } } static CONSENT = class { static ConfigInicial() { } } static CONDICOES = class { static Config() { FUNCOES.GET('/terms', null, function (res) { $('#main-content').html(res.texto); var notas_rodape = { pt: '', en: 'The terms and conditions have been automatically translated, with the Portuguese version prevailing over any other language.', es: 'Los términos y condiciones han sido traducidos automáticamente, prevaleciendo la versión en portugués sobre cualquier otro idioma.' }; $('#nota').html(notas_rodape[lang] || notas_rodape['pt']); }); } } static TERMOS = class { static Config() { FUNCOES.GET('/terms/' + itemID, null, function (res) { $('.termo').html(res.titulo[lang]); $('#main-content').html(res.texto); var nota_topo = { pt: 'Esta informação é parte integrante da "Informação pré-contratual / Condições gerais de utilização e de venda" que pode consultar na totalidade aqui.', en: 'This information is an integral part of the "Pre-contractual Information / General Terms of Use and Sale" which can be consulted in full here.', es: 'Esta información es parte integrante de la "Información precontractual / Condiciones generales de uso y venta" que puede consultar en su totalidad aquí.' }; $('#nota-topo').html(nota_topo[lang] || nota_topo['pt']); var notas_rodape = { pt: '', en: 'The terms and conditions have been automatically translated, with the Portuguese version prevailing over any other language.', es: 'Los términos y condiciones han sido traducidos automáticamente, prevaleciendo la versión en portugués sobre cualquier otro idioma.' }; $('#nota').html(notas_rodape[lang] || notas_rodape['pt']); }); } } static MY = class { static Config() { console.log('---> CLIENTS -> Config'); CLIENT_AREA.inicio(); } static ORDERS = class { static ConfigInicial() { } static Config() { CLIENT_AREA.orders(); } } static ORDER = class { static Config() { CLIENT_AREA.order(); } } static INFO = class { static Config() { CLIENT_AREA.info(); } } static DOCS = class { static Config() { CLIENT_AREA.docs(); } } static FAV = class { static Config() { CLIENT_AREA.fav(); } } static RGPD = class { static Config() { CLIENT_AREA.rgpd(); } } static MSG = class { static Config() { CLIENT_AREA.msgs(); } } static POINTS = class { static Config() { CLIENT_AREA.points(); } static DETAILS = class { static Config() { POINTS.details(); } } static SUBSCRIBE = class { static Config() { POINTS.subscribe(); } } } } static RGPD = class { static Config() { RGPD.confirmRGPD(); } } static CART = class { static ConfigInicial() { } static Config() { } } static PRODUCT = class { static ConfigInicial() { console.log('---> PRODUCT -> ConfigInicial'); } static Config() { console.log('---> PRODUCT -> Config'); } } static PRODUCTS = class { static ConfigInicial() { console.log('---> CATEGORIA -> ConfigInicial'); } static Config() { CATEGORIAS.Carrega(); } } static CONTACTS = class { static Config() { console.log('---> CONTACTS -> Config'); FUNCOES.GET('/site/conteudo?nome=principal&url=' + link_atual, null, function (res) { $('#main-content').html(TEMPLATE.MENU.conteudo(res)); }); } } static REVIEWS = class { static ConfigInicial() { console.log('---> REVIEWS -> ConfigInicial'); } static Config() { console.log('---> REVIEWS -> Config'); } } static SE = class { static Config() { FUNCOES.GET('/site/conteudo?nome=principal&url=' + link_atual, null, function (dados_se) { let contentudo = TEMPLATE.MENU.conteudo(dados_se); let nome = TEMPLATE.MENU.nome(dados_se); $('#main-content').html(contentudo); let _html_breadcrumb = `
  • home
  • `; _html_breadcrumb += '
  • ' + nome + '
  • '; $('.breadcrumb').html(_html_breadcrumb); }); } } } console.log('v.2025.10.30'); if (/IEMobile/i.test(navigator.userAgent)) { $('.navbar-brand').addClass('windowsphone'); } var isMobile = function () { return /(iphone|ipod|ipad|android|blackberry|windows ce|palm|symbian)/i.test(navigator.userAgent); }; if (isMobile()) { $('.introContent').addClass('ismobile'); $(function () { var tshopScroll = 0; $(window).scroll(function (event) { var ts = $(this).scrollTop(); if (ts > tshopScroll) { $('.navbar').addClass('stuck'); } else { $('.navbar').removeClass('stuck'); } if (ts < 200) { $('.navbar').removeClass('stuck'); } tshopScroll = ts; }); }); } else { $(function () { var tshopScroll = 0; $(window).scroll(function (event) { var ts = $(this).scrollTop(); if (ts > tshopScroll) { $('.navbar').addClass('stuck'); } else { $('.navbar').removeClass('stuck'); } if (ts < 200) { $('.navbar').removeClass('stuck'); } tshopScroll = ts; }); }); } var menu_principal = []; var links_relacionados = null; var link_atual = window.location.pathname; // Sinalização de readiness do menu var _menuReadyResolve = null; var _menuReadyPromise = new Promise((resolve) => { _menuReadyResolve = resolve; }); class TEMPLATE { static inicio() { console.log('---> Template -> inicio'); USER.verificaLogin(() => { TEMPLATE.carrega_topo(); TEMPLATE.carrega_rodape(); TEMPLATE.carrega_menu(); LINKS.defineAll(); console.log('---> Template -> FIMMMM'); }); } static carrega_topo() { let pag = null; if (USER.atual != null) { pag = FUNCOES.GET_Pagina('template.topo.cliente_logado.html'); if (pag != null) { let _html = TRADUZ.traduzirTemplate(pag.Valor); $('#navbar-top').html(_html); } TEMPLATE.carrega_login(); } else { pag = FUNCOES.GET_Pagina('template.topo.cliente_nao_logado.html'); if (pag != null) { let _html = TRADUZ.traduzirTemplate(pag.Valor); $('#navbar-top').html(_html); } } LINGUA.selector(); } static carrega_rodape() { let pag = null; pag = FUNCOES.GET_Pagina('template.rodape_' + lang + '.html'); if (pag != null) { $('footer').html(pag.Valor); } } static carrega_menu() { let _html_menu = ''; let link_menu = '
  • {nome}
  • '; let link_menu_dropdown = ''; let link_submenu = ' '; FUNCOES.GET('/site/menu?nome=principal', null, (res) => { console.log('Menu:', res); // Suporta resposta como {dados:[...]} ou como array direto const dados = (res && Array.isArray(res.dados)) ? res.dados : res; menu_principal = dados; if (!menu_principal || menu_principal.length === 0) { console.error('Menu data is empty or invalid'); return; } menu_principal.forEach(item => { let _item_nome = TEMPLATE.MENU.nome(item); let _item_link = TEMPLATE.MENU.link(item); if (item.submenus && item.submenus.length != 0) { let _sub = ''; item.submenus.forEach(sub => { let _sub_nome = TEMPLATE.MENU.nome(sub); let _sub_link = TEMPLATE.MENU.link(sub); if (sub.ativo) { _sub += link_submenu.replace('{link}', _sub_link).replace('{nome}', _sub_nome); } }); if (item.ativo) { _html_menu += link_menu_dropdown.replace('{link}', _item_link).replace('{nome}', _item_nome).replace('{sub}', _sub); } } else { if (item.ativo) { _html_menu += link_menu.replace('{link}', _item_link).replace('{nome}', _item_nome); } } }); let menu_clientes = ''; let pag = null; if (USER.atual != null) { pag = FUNCOES.GET_Pagina('template.menu.cliente.html'); if (pag != null) { menu_clientes = pag.Valor; } } _html_menu = menu_clientes + _html_menu; _html_menu = TRADUZ.traduzirTemplate(_html_menu); $('#menu').html(_html_menu); TEMPLATE.carrega_cesto(); TEMPLATE.carrega_links_relacionados(); // Sinaliza: menu pronto (Promise + CustomEvent) if (typeof _menuReadyResolve === 'function') { _menuReadyResolve(menu_principal); _menuReadyResolve = null; // evita múltiplas resoluções } document.dispatchEvent(new CustomEvent('menu:ready', { detail: menu_principal })); }, null); } // Promise para aguardar o menu static menuReady() { if (menu_principal && menu_principal.length) { return Promise.resolve(menu_principal); } return _menuReadyPromise; } // Callback para aguardar o menu static whenMenuReady(cb) { if (menu_principal && menu_principal.length) { cb(menu_principal); return; } document.addEventListener('menu:ready', (e) => cb(e.detail), { once: true }); } static carrega_links_relacionados() { console.log('vai procurar o link_atual:', link_atual); menu_principal.forEach(item => { let item_link = TEMPLATE.MENU.link(item); if (item_link == link_atual) { links_relacionados = item; return; } else { TEMPLATE.Procurar_Links_submenus(item); if (links_relacionados != null) { return; } } }); console.log('Depois de toda a pensquisa encontrei links_relacionados:', links_relacionados); TEMPLATE.Definir_Headers_e_Meta_Tags(); } static Definir_Headers_e_Meta_Tags() { if (links_relacionados != null) { let meta_title = links_relacionados[lang].meta_title; let meta_description = links_relacionados[lang].meta_description; let meta_canonical = links_relacionados[lang].meta_canonical; if (meta_title != null && meta_title != '') { document.title = meta_title; } if (meta_description != null && meta_description != '') { let meta = document.createElement('meta'); meta.name = 'description'; meta.content = meta_description; document.head.appendChild(meta); } if (meta_canonical != null && meta_canonical != '') { let link = document.createElement('link'); link.rel = 'canonical'; link.href = meta_canonical; document.head.appendChild(link); } let link_pt = links_relacionados['pt'].link; let link_es = links_relacionados['es'].link; let link_en = links_relacionados['en'].link; if (link_pt != null && link_pt != '') { let link = document.createElement('link'); link.rel = 'alternate'; link.href = window.location.origin + link_pt; link.hreflang = 'pt'; document.head.appendChild(link); let link_default = document.createElement('link'); link_default.rel = 'alternate'; link_default.href = window.location.origin + link_pt; link_default.hreflang = 'x-default'; document.head.appendChild(link_default); } if (link_es != null && link_es != '') { let link = document.createElement('link'); link.rel = 'alternate'; link.href = window.location.origin + link_es; link.hreflang = 'es'; document.head.appendChild(link); } if (link_en != null && link_en != '') { let link = document.createElement('link'); link.rel = 'alternate'; link.href = window.location.origin + link_en; link.hreflang = 'en'; document.head.appendChild(link); } document.documentElement.lang = lang; } } static Procurar_Links_submenus(item) { if (item.submenus != null && item.submenus.length > 0) { item.submenus.forEach(sub => { let sub_link = TEMPLATE.MENU.link(sub); if (sub_link == link_atual) { links_relacionados = sub; return; } else { TEMPLATE.Procurar_Links_submenus(sub, link_atual); } }); } } static carrega_login() { $('.user_nome').html(USER.atual.nome); } static carrega_cesto() { CESTO.Menu.show(); } static MENU = class { static nome(item) { let _nome = ''; if (item.pt && lang == 'pt') _nome = item.pt.nome; else if (item.es && lang == 'es') _nome = item.es.nome; else if (item.en && lang == 'en') _nome = item.en.nome; if (_nome == '') _nome = item.nome; return _nome; } static link(item) { let _link = ''; if (item.pt && lang == 'pt') _link = item.pt.link; else if (item.es && lang == 'es') _link = item.es.link; else if (item.en && lang == 'en') _link = item.en.link; if (_link == '') _link = item.link; return _link; } static conteudo(item) { let _conteudo = ''; if (item.pt && lang == 'pt') _conteudo = item.pt.conteudo; else if (item.es && lang == 'es') _conteudo = item.es.conteudo; else if (item.en && lang == 'en') _conteudo = item.en.conteudo; if (_conteudo == '') _conteudo = item.conteudo; return _conteudo; } } } class USER { static atual = null; static isLogged() { // Retorna uma Promise que resolve para true (logado) ou false (não logado) return new Promise((resolve) => { FUNCOES.GET('/cli', null, (dados) => { USER.atual = dados; resolve(true); }, () => { USER.atual = null; resolve(false); }); }); } static verificaLogin(next) { FUNCOES.GET('/cli', null, (dados) => { USER.atual = dados; next(); }, () => { USER.atual = null; next(); }); } } class TRADUZ { static traduzir(chave) { let lingua = LINGUA.atual(); // Preserva a primeira letra da chave original let primeiraLetra = chave.charAt(0); let chaveMinuscula = chave.toLowerCase(); // Procura a tradução usando a chave em minúsculas if (this.MSG[chaveMinuscula] && this.MSG[chaveMinuscula][lingua]) { let traducao = this.MSG[chaveMinuscula][lingua].toLowerCase(); // Se a primeira letra da chave original era maiúscula, converte a primeira letra da tradução if (primeiraLetra === primeiraLetra.toUpperCase()) { return traducao.charAt(0).toUpperCase() + traducao.slice(1); } return traducao; } // Retorna a chave original se não encontrar tradução return chave; } static traduzirTemplate(template) { console.log('Traduzindo template...'); let lingua = LINGUA.atual(); return template.replace(/\{\{(\w+)\}\}/g, function (match, p1) { return TRADUZ.traduzir(p1, lingua); }); } static MSG = { lang: { pt: 'pt', es: 'es', en: 'en' }, choose_lang: { pt: 'Escolhe uma língua', es: 'Elige un idioma', en: 'Choose a language' }, ocorreu_um_erro: { pt: 'Ocorreu um erro! Por favor tente de novo.', es: '¡Ha ocurrido un error! Por favor, inténtelo de nuevo.', en: 'An error occurred! Please try again.' }, verifica_erros: { pt: 'Verifique os erros', es: 'Verifique los errores', en: 'Check the errors' }, eliminar: { pt: 'eliminar', es: 'eliminar', en: 'delete' }, remover: { pt: 'remover', es: 'quitar', en: 'remove' }, alterar: { pt: 'alterar', es: 'cambiar', en: 'change' }, adicionar: { pt: 'adicionar', es: 'añadir', en: 'add' }, inserir: { pt: 'inserir', es: 'insertar', en: 'insert' }, continuar: { pt: 'continuar', es: 'siguiente', en: 'next' }, nova_morada: { pt: 'Nova Morada', es: 'Nueva Dirección', en: 'New Address' }, alterar_morada: { pt: 'Alterar Morada', es: 'Cambiar Dirección', en: 'Update Address' }, sem_dados_faturacao: { pt: 'Sem dados de faturação', es: 'Sin datos de facturación', en: 'No billing data' }, ponto_pickup: { pt: 'Ponto Pickup', es: 'Punto Pickup', en: 'Pickup Point' }, entrega_em: { pt: 'Entrega em', es: 'Entrega en', en: 'Delivery to' }, selecione_crie_dados_faturacao: { pt: 'Selecione ou crie os dados de faturação.', es: 'Seleccione o cree los datos de facturación.', en: 'Select or create billing data.' }, selecione_crie_dados_entrega: { pt: 'Selecione ou crie os dados de entrega.', es: 'Seleccione o cree los dados de entrega.', en: 'Select or create delivery data.' }, entrega_impossivel_neste_local: { pt: 'Lamentamos, mas neste momento não é possível a entrega neste local!', es: 'Lo sentimos, pero en este momento no es posible la entrega en este lugar!', en: 'Sorry, but at this time delivery is not possible at this location!' }, introduza_telemovel: { pt: 'Introduza o seu número de telemóvel.', es: 'Introduzca su número de teléfono móvil.', en: 'Enter your mobile number.' }, selecione_entrega: { pt: 'Selecione uma forma de entrega.', es: 'Seleccione uma forma de entrega.', en: 'Select a delivery method.' }, produtos_ja_nao_estao_disponiveis: { pt: 'Um ou mais produtos já não estão disponíveis e foram retirados do cesto.', es: 'Uno o más productos ya no están disponibles y han sido retirados de la cesta.', en: 'One or more products are no longer available and have been removed from the cart.' }, desconto_pontos: { pt: 'Desconto de pontos', es: 'Descuento de puntos', en: 'Points discount' }, introduza_nome: { pt: 'Introduza o nome', es: 'Introduzca el nombre', en: 'Enter the name' }, introduza_morada: { pt: 'Introduza a morada', es: 'Introduzca la dirección', en: 'Enter the address' }, introduza_codpostal: { pt: 'Introduza o código postal', es: 'Introduzca el código postal', en: 'Enter the zip code' }, introduza_localidade: { pt: 'Introduza a localidade', es: 'Introduzca la localidad', en: 'Enter the city' }, pretende_subscrever_newsletter: { pt: 'Por favor indique-nos se pretende subscrever a nossa Newsletter com campanhas promocionais.', es: 'Por favor indíquenos si desea suscribirse a nuestra Newsletter com campanhas promocionais.', en: 'Please let us know if you want to subscribe to our newsletter with promotional campaigns.' }, aceitar_politica_e_condicoes: { pt: 'Para continuar a utilizar os nossos serviços, tem de aceitar a política de privacidade e condições gerais.', es: 'Para continuar utilizando nuestros serviços, debe aceitar la política de privacidad e las condições gerais.', en: 'To continue using our services, you must accept the privacy policy and terms of service.' }, mediante_orcamento: { pt: 'Mediante orçamento', es: 'Mediante presupuesto', en: 'Upon request' }, portes_gratis: { pt: 'Portes Grátis', es: 'Envío Gratis', en: 'Free Shipping' }, artigos_brevemente: { pt: 'Um ou mais artigos podem não estar disponíveis de imediato ou estão para chegar.', es: 'Uno o más artículos pueden no estar disponibles de inmediato o están por llegar.', en: 'One or more items may not be immediately available or are on the way.' }, encomenda: { pt: 'Encomenda', es: 'Pedido', en: 'Order' }, data: { pt: 'Data', es: 'Fecha', en: 'Date' }, estado: { pt: 'Estado', es: 'Estado', en: 'State' }, area_cliente: { pt: 'Área de cliente', es: 'Área de cliente', en: 'Client Area' }, informacao_pessoal: { pt: 'Informação pessoal', es: 'Información personal', en: 'Personal information' }, documento: { pt: 'Documento', es: 'Documento', en: 'Document' }, favorito: { pt: 'Favorito', es: 'Favorito', en: 'Favorite' }, rgpd: { pt: 'RGPD', es: 'RGPD', en: 'GDPR' }, formulario: { pt: 'Formulário', es: 'Formulario', en: 'Form' }, mensagens: { pt: 'Mensagens', es: 'Mensajes', en: 'Messages' }, pontos_printflow: { pt: 'Pontos Printflow', es: 'Puntos Printflow', en: 'Printflow Points' }, movimentos_pontos_printflow: { pt: 'Movimentos de Pontos Printflow', es: 'Movimientos de Puntos Printflow', en: 'Printflow Points Movements' }, terminar_sessao: { pt: 'Terminar Sessão', es: 'Cerrar Sesión', en: 'Log Out' }, ultimas: { pt: 'Últimas', es: 'Últimas', en: 'Last' }, ou: { pt: 'Ou', es: 'O', en: 'Or' }, registar: { pt: 'Registar', es: 'Registrar', en: 'Signup' }, apoio_cliente: { pt: 'Apoio ao cliente', es: 'Atención al cliente', en: 'Customer Support' }, nr: { pt: 'nº', es: 'nº', en: 'nr.' }, estado_atual: { pt: 'Estado atual', es: 'Estado actual', en: 'Current status' }, registada: { pt: 'Registada', es: 'Registrada', en: 'Registered' }, produto: { pt: 'Produto', es: 'Producto', en: 'Product' }, detalhes: { pt: 'Detalhes', es: 'Detalles', en: 'Details' }, qde: { pt: 'Qde', es: 'Cant', en: 'Qty' }, entrega: { pt: 'Entrega', es: 'Entrega', en: 'Delivery' }, resumo: { pt: 'Resumo', es: 'Resumen', en: 'Summary' }, modo_de_entrega: { pt: 'Modo de entrega', es: 'Modo de entrega', en: 'Delivery method' }, dados_entrega: { pt: 'Dados de entrega', es: 'Datos de entrega', en: 'Delivery data' }, dados_faturacao: { pt: 'Dados de faturação', es: 'Datos de facturación', en: 'Billing data' }, data_pagamento: { pt: 'Data de pagamento', es: 'Fecha de pago', en: 'Payment date' }, data_envio: { pt: 'Data de envio', es: 'Fecha de envío', en: 'Shipping date' }, data_entrega: { pt: 'Data de entrega', es: 'Fecha de entrega', en: 'Delivery date' }, observacoes: { pt: 'Observações', es: 'Observaciones', en: 'Observations' }, detalhes_encomenda: { pt: 'Detalhes encomenda', es: 'Detalles pedido', en: 'Order details' }, precos_com_iva_incluido: { pt: 'Preços com IVA incluído', es: 'Precios con IVA incluido', en: 'Prices with VAT included' }, voltar: { pt: 'Voltar', es: 'Volver', en: 'Back' }, dados_pessoais: { pt: 'Dados pessoais', es: 'Datos personales', en: 'Personal data' }, email: { pt: 'Email', es: 'Email', en: 'Email' }, password: { pt: 'Password', es: 'Contraseña', en: 'Password' }, nome: { pt: 'Nome', es: 'Nombre', en: 'Name' }, tipo: { pt: 'Tipo', es: 'Tipo', en: 'Type' }, subscricoes: { pt: 'Subscrições', es: 'Suscripciones', en: 'Subscriptions' }, ofertas_e_promocoes: { pt: 'Ofertas e promoções', es: 'Ofertas y promociones', en: 'Offers and promotions' }, alertas_e_notificacoes_programa_pontos: { pt: 'Alertas e notificações do programa de pontos', es: 'Alertas y notificaciones del programa de puntos', en: 'Points program alerts and notifications' }, alertas_e_notificacoes_compras: { pt: 'Alertas e notificações sobre compras', es: 'Alertas y notificaciones sobre compras', en: 'Purchase alerts and notifications' }, atualizar: { pt: 'Atualizar', es: 'Actualizar', en: 'Update' }, gravar_alteracoes: { pt: 'Gravar alterações', es: 'Guardar cambios', en: 'Save changes' }, alteracoes_gravadas_com_sucesso: { pt: 'Alterações gravadas com sucesso!', es: '¡Cambios guardados com éxito!', en: 'Changes saved successfully!' }, dados_de_entrega_e_faturacao: { pt: 'Dados de entrega e faturação', es: 'Datos de entrega y facturación', en: 'Delivery and billing data' }, adicionar_novos_dados_de_entrega_e_faturacao: { pt: 'Adicionar novos dados de entrega e faturação', es: 'Añadir nuevos datos de entrega y facturación', en: 'Add new delivery and billing data' }, email_confirmado_em: { pt: 'Email confirmado em', es: 'Email confirmado en', en: 'Email confirmed on' }, ao_cuidado_de: { pt: 'ao cuidado de', es: 'a la atención de', en: 'care of' }, empresa: { pt: 'Empresa', es: 'Empresa', en: 'Company' }, deixe_em_branco_se_e_particular_ou_empresario_em_nome_individual: { pt: 'deixe em branco se é particular ou empresário em nome individual', es: 'deje en blanco si es particular o empresario individual', en: 'leave blank if you are an individual or sole trader' }, pais: { pt: 'País', es: 'País', en: 'Country' }, morada: { pt: 'Morada', es: 'Dirección', en: 'Address' }, codigo_postal: { pt: 'Código Postal', es: 'Código Postal', en: 'Zip Code' }, localidade: { pt: 'Localidade', es: 'Localidad', en: 'City' }, telemovel: { pt: 'Telemóvel', es: 'Móvil', en: 'Mobile' }, contribuinte: { pt: 'Contribuinte', es: 'NIF', en: 'Tax ID' }, fechar: { pt: 'Fechar', es: 'Cerrar', en: 'Close' }, atencao: { pt: 'Atenção', es: 'Atención', en: 'Warning' }, confirma_eliminar_morada: { pt: 'Tem a certeza que pretende eliminar esta morada?', es: '¿Está seguro de que desea eliminar esta dirección?', en: 'Are you sure you want to delete this address?' }, confirmacao_de_morada: { pt: 'Confirmação de morada', es: 'Confirmación de dirección', en: 'Address confirmation' }, morada_sem_numero_porta: { pt: 'A morada introduzida parece não ter nº de porta!', es: '¡La dirección introducida parece no tener número de puerta!', en: 'The address entered does not seem to have a door number!' }, confirma_morada_completa: { pt: 'Confirma que a sua morada está completa?', es: '¿Confirma que su dirección está completa?', en: 'Do you confirm that your address is complete?' }, cancelar: { pt: 'Cancelar', es: 'Cancelar', en: 'Cancel' }, confirmo: { pt: 'Confirmo', es: 'Confirmo', en: 'Confirm' }, bem_vindo: { pt: 'Bem-vindo', es: 'Bienvenido', en: 'Welcome' }, nao_foram_encontrados_documentos: { pt: 'Não foram encontrados documentos', es: 'No se encontraron documentos', en: 'No documents found' }, sem_resultados: { pt: 'Sem resultados', es: 'Sin resultados', en: 'No results' }, preencha_todos_os_campos: { pt: 'Por favor, preencha todos os campos.', es: 'Por favor, complete todos los campos.', en: 'Please fill in all fields.' }, mensagens_notificacoes: { pt: 'Mensagens / Notificações', es: 'Mensajes / Notificaciones', en: 'Messages / Notifications' }, assunto: { pt: 'Assunto', es: 'Asunto', en: 'Subject' }, whatsapp_msg: { pt: 'Olá! Regista-te e adere aos Pontos da Printflow e ganhas logo um desconto na tua primeira compra. Usa o meu link: ', es: '¡Hola! Regístrate y únete a los Puntos de Printflow e obtén um desconto na tua primeira compra. Usa mi enlace: ', en: 'Hello! Sign up and join Printflow Points and get a discount on your first purchase. Use my link: ' }, link_copiado: { pt: 'Link copiado com sucesso!', es: '¡Enlace copiado con éxito!', en: 'Link copied successfully!' }, descricao: { pt: 'Descrição', es: 'Descripción', en: 'Description' }, validade: { pt: 'Validade', es: 'Validez', en: 'Validity' }, pontos_disponiveis: { pt: 'Pontos disponíveis', es: 'Puntos disponibles', en: 'Available points' }, pontos_pendentes: { pt: 'Pontos pendentes', es: 'Puntos pendientes', en: 'Pending points' }, subscrever_pontos: { pt: 'Subscrever Pontos', es: 'Suscribir Puntos', en: 'Subscribe Points' }, avaliacoes: { pt: 'Avaliações', es: 'Evaluaciones', en: 'Reviews' }, avaliacoes_opinioes: { pt: 'Avaliações e opiniões', es: 'Evaluaciones y opiniones', en: 'Reviews and opinions' }, termos_condicoes: { pt: 'Termos e Condições', es: 'Términos y Condiciones', en: 'Terms and Conditions' }, filtro_de_texto: { pt: 'Filtro de texto', es: 'Filtro de texto', en: 'Text filter' }, introduza_texto_a_filtrar: { pt: 'Introduza o texto a filtrar', es: 'Introduzca el texto a filtrar', en: 'Enter text to filter' }, foram_encontrados: { pt: 'Foram encontrados', es: 'Se encontraron', en: 'Found' }, resultado: { pt: 'Resultado', es: 'Resultado', en: 'Result' }, item: { pt: 'Item', es: 'Artículo', en: 'Item' }, filtrar: { pt: 'Filtrar', es: 'Filtrar', en: 'Filter' }, relevantes: { pt: 'Relevantes', es: 'Relevantes', en: 'Relevant' }, mais_recentes: { pt: 'Mais recentes', es: 'Más recientes', en: 'Newest' }, mais_antigos: { pt: 'Mais antigos', es: 'Más antiguos', en: 'Oldest' }, alfabetica_crescente: { pt: 'Alfabética: crescente', es: 'Alfabética: ascendente', en: 'Alphabetical: ascending' }, alfabetica_decrescente: { pt: 'Alfabética: decrescente', es: 'Alfabética: descendente', en: 'Alphabetical: descending' }, mais_baratos: { pt: 'Mais baratos', es: 'Más baratos', en: 'Cheapest' }, mais_caros: { pt: 'Mais caros', es: 'Más caros', en: 'Most expensive' }, grid: { pt: 'Grelha', es: 'Cuadrícula', en: 'Grid' }, lista: { pt: 'Lista', es: 'Lista', en: 'List' } } } class RGPD { static sendRGPD() { console.log('sendRGPD'); let _direito = $("#direito").val(); if (_direito == '') { $("#resultado_rgpd").html("

    " + TRADUZ.traduzir('Preencha_todos_os_campos') + "

    "); return; } let dados = { 'direito': $("#direito").val(), 'obs': $("#obs").val(), 'password': $("#confirm_password").val() }; FUNCOES.POST('/rgpd/send', dados, '#resultado_rgpd', function (res) { if (res == 'OK') { $(".direitos").hide(); $("#direito").val(""); $("#confirm_password").val(""); $("#obs").val(""); $(".radio input").removeAttr("checked"); let _msg = { 'pt': 'O seu pedido foi submetido com sucesso! Consulte o seu email para confirmar o seu pedido.', 'en': 'Your request has been successfully submitted! Check your email to confirm your request.', 'es': '¡Su solicitud ha sido enviada con éxito! Consulte su correo electrónico para confirmar su solicitud.' }; $("#resultado_rgpd").html("

    " + _msg[lang] + "

    "); } else { FUNCOES.MostraErros(null, '#resultado_regpd', res, null); } }); } static confirmRGPD() { console.log('confirmRGPD'); let c = FUNC.getParameterByName('c'); FUNCOES.GET('/rgpd/confirm?c=' + c, '#erroRGPD', function (res) { if (res == "OK") { $('#OK').removeClass('hidden'); } else { $('#OK').addClass('hidden'); FUNCOES.MostraErros(null, '#erroRGPD', res, null); } }); } static consentimentoRGPD(c) { if ($("#rgpd-check").is(':checked')) { if ($('#news_confirm').val() == 3) { $("#resultado_rgpd").html('' + TRADUZ.traduzir('pretende_subscrever_newsletter') + ''); } else { RGPD.GravaConsentimentoRGPD(c); } } else { $("#resultado_rgpd").html('' + TRADUZ.traduzir('aceitar_politica_e_condicoes') + ''); } } static GravaConsentimentoRGPD(c) { $.ajax({ url: "/rgpd.ashx?accao=gravaRGPD", data: { 'c': c, 'news': $('#news_confirm').val() }, type: "POST", dataType: 'text', async: false, success: function (data) { resultado = data; if (resultado == "OK") { //se existir uma query string 'url' de redirecionamento, redireciona para lá if (location.search.indexOf("url=") > -1) { var url = location.search.split("url=")[1]; window.location.href = decodeURIComponent(url); } $("#form_RGPD").hide(); $("#msg_resultado").show(); } else { if (resultado == "NOK") { $("#resultado_rgpd").html("

    " + TRADUZ.traduzir('ocorreu_um_erro') + "

    "); } else { $("#resultado_rgpd").html("

    " + resultado + "

    "); } } } }); } static mostradireito(id) { $(".direitos").hide(); $("#direito" + id).show(); $("#direito").val(id); } } class CESTO { static ativaLOG = true; //para mostrar logs de debug no console static cliente = null; //dados do cliente static moradas = []; static formasentrega = []; static cestoDATA = null; static etapa = 1; static phoneInput1; static phoneInput2; static altura = $('.cartao1').outerHeight(true) + 400; static morada_a_eliminar = 0; static paises = null; static FUNC = class { static MostraErros(url, destino_erro, res, next_apos_erro) { if (destino_erro == null) { console.log('ERRO', url, res); } else { let erro = ''; if (res.msg == null) { erro = res; } else if (typeof res.msg === 'string') { erro = res.msg; } else if (res.msg[LINGUA.atual()] != null) { erro = res.msg[LINGUA.atual()]; } $(destino_erro).html('
    ' + TRADUZ.traduzir('verifica_erros') + ':
    '); } if (next_apos_erro != null) { next_apos_erro(); } } static POST(url, postadata, destino_erro, sucesso, next_apos_erro = null) { fetch(config.apiUrl + url, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(postadata) }) .then(response => { if (!response.ok) { throw new Error("HTTP error " + response.status); } return response.json(); }) .then(res => { if (res.erro == false) { sucesso(res.dados); } else { CESTO.FUNC.MostraErros(url, destino_erro, res, next_apos_erro); } }) .catch(error => { CESTO.FUNC.MostraErros(url, destino_erro, error, next_apos_erro); }); } static GET(url, destino_erro, sucesso, next_apos_erro = null) { fetch(config.apiUrl + url) .then(response => { if (!response.ok) { throw new Error("HTTP error " + response.status); } return response.json(); }) .then(res => { if (res.erro == false) { sucesso(res.dados); } else { CESTO.FUNC.MostraErros(url, destino_erro, res, next_apos_erro); } }) .catch(error => { CESTO.FUNC.MostraErros(url, destino_erro, error, next_apos_erro); }); } static redirectToCesto() { window.location.href = '/cesto'; } static redirectToCestoLogin() { window.location.href = '/?login=do&url=/cesto'; } static checkLogin(proximo) { CESTO.FUNC.GET('/cli/checklogin', null, function (res) { proximo; }, CESTO.redirectToCestoLogin); } static erroContinuar(texto) { $('#msg-erro').html(texto); $('#modal-erro').modal('show'); } static sharebuttons() { let link = $('#referralLink').val(); let msg = $('#msg_convite').val(); let _url = 'https://www.facebook.com/sharer.php?s=100&p[title]=Printflow&p[summary]={text}&p[url]={url}&p[images][0]=https://www.printflow.pthttps://www.printflow.pt/images/logo-printflow.png'; _url = FUNC.replaceAll(_url, '{url}', link); _url = FUNC.replaceAll(_url, '{text}', msg); $('.s_facebook').attr('href', _url); _url = 'https://twitter.com/intent/tweet?url={url}&text={text}'; _url = FUNC.replaceAll(_url, '{url}', link); _url = FUNC.replaceAll(_url, '{text}', FUNC.replaceAll(msg, link, '')); $('.s_twitter').attr('href', _url); _url = 'https://api.whatsapp.com/send?phone=&text={text}'; _url = FUNC.replaceAll(_url, '{text}', msg); $('.s_whatsapp').attr('href', _url); _url = 'fb-messenger://share/?link={url}'; _url = FUNC.replaceAll(_url, '{url}', link); $('.s_messenger').attr('href', _url); _url = 'mailto:?subject=&body={text}'; _url = FUNC.replaceAll(_url, '{text}', msg); $('.s_email').attr('href', _url); $('.socialIcon a').click(function () { var b = screen.width , d = screen.height , e = c.width ? c.width : b - .2 * b , f = c.height ? c.height : d - .2 * d , g = b / 2 - e / 2 , h = d / 2 - f / 2 , i = "toolbar=0,status=0,width=" + e + ",height=" + f + ",top=" + h + ",left=" + g; return window.open($(this).attr("href"), "", i) && !1; }); } static copiarCodigo() { $('#referralLink').select(); var copiar = document.execCommand('copy'); if (copiar) { alert('Copiado'); } else { alert('Erro ao copiar, seu navegador pode não ter suporte a essa função.'); } return false; } static validaContribuinte(contribuinte) { let temErro = 0; if ( contribuinte.substr(0, 1) != '1' && contribuinte.substr(0, 1) != '2' && contribuinte.substr(0, 1) != '3' && contribuinte.substr(0, 2) != '45' && contribuinte.substr(0, 1) != '5' && contribuinte.substr(0, 1) != '6' && contribuinte.substr(0, 2) != '70' && contribuinte.substr(0, 2) != '71' && contribuinte.substr(0, 2) != '72' && contribuinte.substr(0, 2) != '77' && contribuinte.substr(0, 2) != '79' && contribuinte.substr(0, 1) != '8' && contribuinte.substr(0, 2) != '90' && contribuinte.substr(0, 2) != '91' && contribuinte.substr(0, 2) != '98' && contribuinte.substr(0, 2) != '99' ) { temErro = 1; } let check1 = contribuinte.substr(0, 1) * 9; let check2 = contribuinte.substr(1, 1) * 8; let check3 = contribuinte.substr(2, 1) * 7; let check4 = contribuinte.substr(3, 1) * 6; let check5 = contribuinte.substr(4, 1) * 5; let check6 = contribuinte.substr(5, 1) * 4; let check7 = contribuinte.substr(6, 1) * 3; let check8 = contribuinte.substr(7, 1) * 2; let total = check1 + check2 + check3 + check4 + check5 + check6 + check7 + check8; let divisao = total / 11; let modulo11 = total - parseInt(divisao) * 11; let comparador = 0; if (modulo11 == 1 || modulo11 == 0) { comparador = 0; } else { comparador = 11 - modulo11; } let ultimoDigito = contribuinte.substr(8, 1) * 1; if (ultimoDigito != comparador) { temErro = 1; } if (temErro == 1) { return false; } else { return true; } } static getValueAtIndex(index) { var str = window.location.href; return str.split("-")[index]; } static stringContainsNumber(_string) { return /\d/.test(_string); } static aplicaInputsPhone() { let phoneInputField1 = document.querySelector("#morada_telefone"); CESTO.phoneInput1 = window.intlTelInput(phoneInputField1, { initialCountry: "pt", preferredCountries: ["pt", "es"], utilsScript: "https://cdn.pladon.pt/js/intlTelInput/utils.js", }); let phoneInputField2 = document.querySelector("#entrega_tel"); CESTO.phoneInput2 = window.intlTelInput(phoneInputField2, { initialCountry: "pt", preferredCountries: ["pt", "es"], utilsScript: "https://cdn.pladon.pt/js/intlTelInput/utils.js", }); // Adiciona evento input para filtrar apenas algarismos e o sinal de + phoneInputField1.addEventListener('input', function () { this.value = this.value.replace(/[^\d+]/g, ''); }); phoneInputField2.addEventListener('input', function () { this.value = this.value.replace(/[^\d+]/g, ''); }); //phoneInputField2 onchange event listener para atualizar o telefone de entrega phoneInputField2.addEventListener('change', function () { CESTO.Action.UpdateTelefoneEntrega(); }); } static tamanhoAreaCentral() { let altura1 = $('#dadosentrega').outerHeight(true) + 300; CESTO.altura = altura1; let altura2 = $('#dadosfaturacao').outerHeight(true) + 300; if (altura2 > altura1) { CESTO.altura = altura2; } $('#areacentral').css("min-height", CESTO.altura); $('#areacentral').css("display", "block"); } static FuncoesBotoesEModals() { $('#btcontinuar').on('click', function () { CESTO.Action.proxpasso(); }); $('#nova-morada').on('shown.bs.modal', function () { $('#morada_erro').html(''); FUNC.setInputFilter(document.getElementById("morada_codpostal"), function (value) { return /^\d*\-?\d*$/.test(value); }); FUNC.setInputFilter(document.getElementById("morada_telefone"), function (value) { return /^\d*\+?\d*$/.test(value); }); $("#morada_telefone").keyup(function () { if ($(this).val() == '00') { $(this).val('+'); } }); if ($('#morada_id').val() == '0') { $('#morada_titulo').html(TRADUZ.traduzir('nova_morada')); $('#bt_grava_morada').html(TRADUZ.traduzir('adicionar')); } else { $('#morada_titulo').html(TRADUZ.traduzir('alterar_morada')); $('#bt_grava_morada').html(TRADUZ.traduzir('alterar')); } $('#morada_codpostal').keyup(function () { if ($('#morada_pais').val() == 'Portugal') { let _cod = $('#morada_codpostal').val(); let _final = ''; for (var i = 0; i < _cod.length; i++) { let _char = _cod.charAt(i); if (i == 4) { _final += '-'; if (!isNaN(_char)) { _final += _char; } } else { if (!isNaN(_char)) { _final += _char; } } } $('#morada_codpostal').val(_final); } }); }); $('#bt_grava_morada').on('click', function () { CESTO.Moradas.gravamorada(); }); $('#modal-aderir').on('shown.bs.modal', function () { CESTO.FUNC.GET('/points/condicoes', null, function (res) { let termos = res[lang]; if (termos == null || termos == '') { termos = res.pt; //fallback para português se não existir o idioma atual if (lang == 'es') { termos = '

    ¡Términos disponibles solo en Portugués!

    ' + termos; } if (lang == 'en') { termos = '

    Terms available only in Portuguese!

    ' + termos; } } $('#textocondicoes').html(termos); }); }); } } static inicio() { CESTO.FUNC.aplicaInputsPhone(); CESTO.FUNC.FuncoesBotoesEModals(); //carrega dados InitialData CESTO.Load.PreLoadData(); } static validacaoinicio() { $('#load1').addClass('active'); $('#btcontinuar').prop('disabled', true); } static validacaoconcluida() { $('#load1').removeClass('active'); $('#btcontinuar').prop('disabled', false); CESTO.Load.defineAltura(); } static preorder() { CESTO.FUNC.GET('/cli/encomendas/open', null, function (res) { if (res == 1) { $('#encomendasopen').modal('show'); CESTO.validacaoconcluida(); } else { CESTO.order(); } }); } static confirmorder() { $('#encomendasopen').modal('hide'); CESTO.order(); } static order() { MostraLOG('99 - order -->', 'Vai encomendar'); CESTO.validacaoinicio(); let dados = { obs: $("#observacoes").val(), tel: CESTO.cestoDATA.tel }; CESTO.FUNC.POST('/cesto/finalizar', dados, null, function (res) { MostraLOG('99.1 - não deu erro -->', res); let resultado = JSON.parse(res); MostraLOG('vai direcionar para a encomenda -->', resultado.registo.codigo); CESTO.validacaoconcluida(); window.location.href = '/cesto/encomenda-finalizada/' + resultado.registo.codigo; }, function (res) { MostraLOG('99.2 - deu erro -->', res); //CESTO.erroContinuar(res.msg); CESTO.validacaoconcluida(); }); } static Action = class { static proxpasso() { MostraLOG('03 - proxpasso --> etapa atual:', CESTO.etapa); CESTO.validacaoinicio(); if (CESTO.etapa == 1) { CESTO.Action.valida_passo_1(); } else if (CESTO.etapa == 2) { CESTO.Action.valida_passo_2(); } else if (CESTO.etapa == 3) { CESTO.Action.valida_passo_3(); } else if (CESTO.etapa == 4) { CESTO.preorder(); } } static valida_passo_1() { MostraLOG('03.01 - valida_passo_1 --> #dadosfaturacao .op.active:', $('#dadosfaturacao .op.active').length); if ($('#dadosfaturacao .op.active').length) { CESTO.Action.passo(2); CESTO.validacaoconcluida(); } else { CESTO.FUNC.erroContinuar(TRADUZ.traduzir('selecione_crie_dados_faturacao')); CESTO.validacaoconcluida(); } } static valida_passo_2() { MostraLOG('03.02 - valida_passo_2 --> #dadosentrega .op.active:', $('#dadosentrega .op.active').length); if ($('#dadosentrega .op.active').length) { if (CESTO.cestoDATA.entrega_ID == 0) { if (CESTO.paises.matecamen == true) { CESTO.Action.passo(3); } else { CESTO.erroContinuar(TRADUZ.traduzir('entrega_impossivel_neste_local')); CESTO.validacaoconcluida(); } } else { let _entrega = CESTO.cestoDATA.moradas.find(x => x.id == CESTO.cestoDATA.entrega_ID); let _pais_entrega = _entrega.pais; if (CESTO.paises.ativos.includes(_pais_entrega)) { if (_pais_entrega.toLowerCase == 'portugal' && _entrega.codpostal.startsWith(9) && CESTO.paises.ilhas == false) { CESTO.FUNC.erroContinuar(TRADUZ.traduzir('entrega_impossivel_neste_local')); CESTO.validacaoconcluida(); } else { CESTO.Action.passo(3); } } else { CESTO.FUNC.erroContinuar(TRADUZ.traduzir('entrega_impossivel_neste_local')); CESTO.validacaoconcluida(); } } } else { CESTO.FUNC.erroContinuar(TRADUZ.traduzir('selecione_crie_dados_entrega')); CESTO.validacaoconcluida(); } } static valida_passo_3() { MostraLOG('03.03 - valida_passo_3 --> #formas_de_entrega .op.active:', $('#formas_de_entrega .op.active').length); if ($('#formas_de_entrega .op.active').length) { if (CESTO.cestoDATA.entrega_ID == 0) { if (!CESTO.phoneInput2.isValidNumber()) { MostraLOG('03.03.01 - isValidNumber --> ', 'invalid'); CESTO.FUNC.erroContinuar(TRADUZ.traduzir('introduza_telemovel')); $('#entrega_tel').focus(); CESTO.validacaoconcluida(); } else { MostraLOG('03.03.01 - isValidNumber --> ', 'valid'); let entrega_tel = FUNC.replaceAll(CESTO.phoneInput2.getNumber(), '+351', ''); CESTO.cestoDATA.tel = entrega_tel; CESTO.Action.passo(4); } } else { CESTO.Action.passo(4); } } else { CESTO.FUNC.erroContinuar(TRADUZ.traduzir('selecione_entrega')); CESTO.validacaoconcluida(); } } static passo(i) { MostraLOG('03 - passo --> ', i); CESTO.Action.mudaCartao(i); CESTO.validacaoconcluida(); } static mudaCartao(i) { MostraLOG('04 - mudaCartao -->', i); $('.caixaresumo').addClass('hide'); if (i == 4) { //Botao finalizar $('#btcontinuar span').html('Finalizar Compra'); } else { $('#btcontinuar span').html('Continuar'); } CESTO.etapa = i; let _url = window.location.href; _url = FUNC.replaceAll(_url, 'step-' + CESTO.FUNC.getValueAtIndex(1), 'step-' + CESTO.etapa); history.pushState({}, "", _url); $('#cartoes').removeClass('passo1'); $('#cartoes').removeClass('passo2'); $('#cartoes').removeClass('passo3'); $('#cartoes').removeClass('passo4'); $('#cartoes').removeClass('passo5'); $('#cartoes').addClass('passo' + i); let t; for (t = 1; t < CESTO.etapa; t++) { $('#passo' + t).removeClass('current'); $('#passo' + t).addClass('visited'); } for (t = CESTO.etapa; t < 6; t++) { $('#passo' + t).removeClass('visited'); $('#passo' + t).removeClass('current'); } $('#passo' + CESTO.etapa).addClass('current'); $("html, body").animate({ scrollTop: 0 }, "slow"); $('.caixaresumo').removeClass('hide'); } static UpdateTelefoneEntrega(tel) { MostraLOG('03 - Atualizar Tel -->', 'vai tentar'); CESTO.FUNC.GET('/cesto/entrega/tel/' + tel, null, function (res) { MostraLOG('03 - Atualizar Tel -- resultado-->', res); }); } } static Load = class { static PreLoadData() { MostraLOG('00 - PreLoadData -->', 'Vai obter o CLI'); CESTO.FUNC.GET('/cli', null, function (res) { CESTO.cliente = res; MostraLOG('01 - Obteve CLI -->', CESTO.cliente); if (CESTO.cliente.rgpd == false) { MostraLOG('01.01 - RGPD -->', CESTO.cliente.rgpd + ' -> redirect to /cesto'); //redirect para '/cesto' window.location.href = '/clientes'; } else { MostraLOG('01.01 - RGPD -->', CESTO.cliente.rgpd); CESTO.Load.InitialData(); } }, function () { MostraLOG('01 - Obteve CLI -->', 'deu erro'); window.location.href = '/cesto?prelogin=do&url=/' + lang + '/checkout/step-1'; }); } static InitialData() { MostraLOG('02 - loadCesto -->', ''); CESTO.Load.loadCesto(); MostraLOG('03 - paises -->', ''); CESTO.Load.paises(); let step = CESTO.FUNC.getValueAtIndex(1); CESTO.Action.mudaCartao(step); } static reloadCesto(next) { CESTO.Load.loadCesto(); } static loadCesto(next) { CESTO.FUNC.GET('/cesto', null, function (res) { CESTO.cestoDATA = res; MostraLOG('02.01 - loadCesto -->', 'concluído'); MostraLOG('02.01 - loadCesto - dados -->', CESTO.cestoDATA); MostraLOG('02.02 - showCestoItens -->', ''); CESTO.Itens.showCestoItens(); MostraLOG('02.03 - mostraMoradasFaturacao -->', ''); CESTO.Moradas.mostraMoradasFaturacao(); MostraLOG('02.04 - mostraMoradasEntrega -->', ''); CESTO.Moradas.mostraMoradasEntrega(); CESTO.Moradas.selectMoradaFaturacao(CESTO.cestoDATA.fatura_ID); CESTO.Moradas.selectMoradaEntrega(CESTO.cestoDATA.entrega_ID); MostraLOG('02.05 - getOpcoesEntrega -->', ''); CESTO.Entrega.mostraOpcoesEntrega(); MostraLOG('02.06 - verificaTel -->', ''); CESTO.Entrega.verificaTel(); MostraLOG('05 - getResumo -->', ''); CESTO.Resumo.getResumo(); CESTO.FUNC.tamanhoAreaCentral(); if (next) { next(); } CESTO.Load.defineAltura(); }); } static paises() { if (CESTO.paises == null) { CESTO.FUNC.GET('/cesto/paises', null, function (res) { CESTO.paises = res; $('.paises').html(''); res.ativos.forEach((el) => { $('.paises').append(''); }); }); } } static defineAltura() { CESTO.altura = $('.cartao' + CESTO.etapa).outerHeight(true) + 300; $('#areacentral').css("min-height", CESTO.altura); } } static Moradas = class { static novamorada() { $('#morada_id').val(0); $('#morada_nome').val(''); $('#morada_empresa').val(''); $('#morada_morada').val(''); $('#morada_codpostal').val(''); $('#morada_localidade').val(''); $('#morada_pais').val('Portugal'); $('#morada_telefone').val(''); $('#morada_nif').val(''); $('#nova-morada').modal('show'); } static editmorada(id) { let add = CESTO.cestoDATA.moradas.find(o => o.id == id); $('#morada_id').val(add.id); $('#morada_nome').val(add.nome); $('#morada_empresa').val(add.empresa); $('#morada_morada').val(add.morada); $('#morada_codpostal').val(add.codpostal); $('#morada_localidade').val(add.localidade); $('#morada_pais').val(add.pais); add.tel = FUNC.replaceAll(add.tel, ' ', ''); if (add.tel.startsWith("00")) { add.tel = '+' + add.tel.substring(2); } if (add.tel.length == 9) { add.tel = '+351' + add.tel; CESTO.phoneInput1.setNumber(add.tel); } else { CESTO.phoneInput1.setNumber(add.tel); } $('#morada_nif').val(add.nif); $('#nova-morada').modal('show'); } static gravamorada() { $('#morada_erro').html(''); let erros = ''; let id = $('#morada_id').val(); let nome = $('#morada_nome').val(); let empresa = $('#morada_empresa').val(); let morada = $('#morada_morada').val(); let codpostal = $('#morada_codpostal').val(); let localidade = $('#morada_localidade').val(); let pais = $('#morada_pais').val(); let nif = $('#morada_nif').val(); let telefone = CESTO.phoneInput1.getNumber(); telefone = FUNC.replaceAll(telefone, '+351', ''); if (nome == '') { erros += '
  • ' + TRADUZ.traduzir('introduza_nome') + '
  • '; } if (morada == '') { erros += '
  • ' + TRADUZ.traduzir('introduza_morada') + '
  • '; } if (codpostal == '') { erros += '
  • ' + TRADUZ.traduzir('introduza_codpostal') + '
  • '; } if (localidade == '') { erros += '
  • ' + TRADUZ.traduzir('introduza_localidade') + '
  • '; } if (!CESTO.phoneInput1.isValidNumber()) { erros += '
  • ' + TRADUZ.traduzir('introduza_telemovel') + '
  • '; } if (erros != '') { $('#morada_erro').html('
    ' + TRADUZ.traduzir('verifica_erros') + ':
    '); return; } let nova = { id: id, nome: nome, empresa: empresa, morada: morada, codpostal: codpostal, localidade: localidade, pais: pais, nif: nif, tel: telefone }; CESTO.Moradas.moradasemnumero(nova); } static moradasemnumero(nova) { let morada = $('#morada_morada').val(); if (morada.toUpperCase().includes('S/N')) { CESTO.Moradas.gravamoradafavorita(nova); return; } if (CESTO.FUNC.stringContainsNumber(morada)) { CESTO.Moradas.gravamoradafavorita(nova); } else { $('#moradasemnumero').modal('show'); } } static confirmamoradasemnumero() { $('#moradasemnumero').modal('hide'); let morada = $('#morada_morada').val(); morada += ' S/N'; $('#morada_morada').val(morada); CESTO.Moradas.gravamorada(); } static gravamoradafavorita(nova) { CESTO.FUNC.POST('/cli/morada/grava', nova, '#morada_erro', function (res) { FUNC.fechaModal(); if (CESTO.etapa == 1) { CESTO.Moradas.changeMoradaFaturacao(res); } else { CESTO.Moradas.changeMoradaEntrega(res); } }); } static delmorada(id) { CESTO.morada_a_eliminar = id; $('#confirm-eliminar').modal('show'); } static eliminamorada() { let mooradadel = CESTO.cestoDATA.moradas.find(o => o.id == CESTO.morada_a_eliminar); CESTO.FUNC.POST('/cli/morada/eliminar', mooradadel, '#moradaeliminar_erro', function (res) { FUNC.fechaModal(); CESTO.Load.reloadCesto(); }); } //moradas faturacao static mostraMoradasFaturacao() { let res = ''; if (CESTO.moradas == null) { CESTO.moradas = []; } CESTO.cestoDATA.moradas.forEach((dados) => { res += CESTO.Moradas.makeMoradaHtml(dados, 'faturacao'); }); let primeiralinha = { id: 0, nome: 'Consumidor Final', empresa: '', morada: '' + TRADUZ.traduzir('sem_dados_faturacao') + '', codpostal: '', localidade: '', pais: '', nif: '', tel: '' }; res = CESTO.Moradas.makeMoradaHtml(primeiralinha, 'faturacao') + res; $('#selectmoradasfaturacao').html(res); if (CESTO.cestoDATA.fatura_ID == -1) { CESTO.cestoDATA.fatura_ID = 0; if (CESTO.cestoDATA.moradas.length > 0) { CESTO.cestoDATA.fatura_ID = CESTO.moradas[0].id; } } $('#selectmoradasfaturacao .op').click(function () { if (!$(this).hasClass('active')) { CESTO.Moradas.changeMoradaFaturacao($(this).data('id')); } }); $('#bt_nova_morada').on('click', function () { CESTO.Moradas.novamorada(); }); CESTO.validacaoconcluida(); } static selectMoradaFaturacao(id) { $('#selectmoradasfaturacao .well').removeClass('active'); $('#moradafaturacao' + id).addClass('active'); } static changeMoradaFaturacao(id) { if (CESTO.cestoDATA.fatura_ID != id) { CESTO.FUNC.GET('/cesto/faturacao/define/' + id, null, function (res) { CESTO.Load.reloadCesto(); }); } else { CESTO.Load.reloadCesto(); } } //moradas entrega static mostraMoradasEntrega() { let res = ''; CESTO.cestoDATA.moradas.forEach((dados) => { res += CESTO.Moradas.makeMoradaHtml(dados, 'entrega'); }); $('#selectmoradasentrega').html(res); res = ''; if (CESTO.paises.matecamen) { let primeiralinha = { id: 0, nome: TRADUZ.traduzir('ponto_pickup') + ' Porto', empresa: 'Tabacaria MATECAMEN', morada: 'Avenida Fernão Magalhães nº 1269', codpostal: '4350-169', localidade: 'Porto', pais: 'Portugal', nif: '', tel: '' }; res = CESTO.Moradas.makeMoradaHtml(primeiralinha, 'entrega'); res = '

    ' + TRADUZ.traduzir('entrega_em') + ' ' + TRADUZ.traduzir('ponto_pickup') + ':

    ' + res; } $('#selectmoradasentrega1').html(res); if (CESTO.cestoDATA.entrega_ID == -1) { CESTO.cestoDATA.entrega_ID = 0; if (CESTO.cestoDATA.moradas.length > 0) { CESTO.cestoDATA.entrega_ID = CESTO.moradas[0].id; } } $('#dadosentrega .op').click(function () { if (!$(this).hasClass('active')) { CESTO.Moradas.changeMoradaEntrega($(this).data('id')); } }); $('#bt_nova_morada1').on('click', function () { CESTO.Moradas.novamorada(); }); CESTO.validacaoconcluida(); } static selectMoradaEntrega(id) { $('#dadosentrega .well').removeClass('active'); $('#moradaentrega' + id).addClass('active'); } static changeMoradaEntrega(id) { if (CESTO.cestoDATA.entrega_ID != id) { CESTO.FUNC.GET('/cesto/entrega/define/' + id, null, function (res) { CESTO.Load.reloadCesto(); }); } else { CESTO.Load.reloadCesto(); } } //template moradas static makeMoradaHtml(dados, tipo) { let _html = '
    ' + '
    ' + dados.nome + '
    '; if (dados.empresa.length > 0) { _html += '' + dados.empresa + '
    '; } _html += '' + dados.morada + '
    ' + dados.codpostal + '  ' + dados.localidade + '    ' + dados.pais + ''; _html += '
    '; if (tipo == 'faturacao') { if (dados.nif != '') { _html += 'NIF: ' + dados.nif; } else { if (dados.id > 0) { _html += 'NIF: ---------'; } } _html += '      '; } if (dados.id > 0) { _html += 'Tel: ' + dados.tel } _html += '
    '; if (dados.id > 0) { _html += '
    ' + '' + '' + '
    '; } _html += '
    '; return _html; } } static Entrega = class { static validarCodigoPostalEspanholPeninsula(codigoPostal) { // Verificar se o código postal tem 5 dígitos if (!/^\d{5}$/.test(codigoPostal)) { return false; } // Obter os dois primeiros dígitos const primeirosDigitos = parseInt(codigoPostal.substring(0, 2)); // Verificar se os dois primeiros dígitos correspondem a províncias da península if (primeirosDigitos >= 1 && primeirosDigitos <= 52 && primeirosDigitos !== 7 && primeirosDigitos !== 35 && primeirosDigitos !== 38) { return true; // Código postal válido para a península } else { return false; // Código postal inválido (Ilhas Baleares, Canárias ou outras províncias) } } static mostraOpcoesEntrega() { let res = ''; let opcoes = CESTO.cestoDATA.opcoes_entrega; opcoes.forEach((opcao) => { res += CESTO.Entrega.makeOpcaoHtml(opcao); }); $('#formas_de_entrega').html(res); CESTO.Entrega.selectOpcaoEntrega(CESTO.cestoDATA.forma_entrega_ID); $('#formas_de_entrega .well').click(function () { if (!$(this).hasClass('active')) { CESTO.Entrega.changeOpcaoEntrega($(this).data('id')); } }); CESTO.validacaoconcluida(); } static makeOpcaoHtml(opcao) { let _logo = 'local.png'; if (opcao.condicoes.toLowerCase().includes('transportadora')) { _logo = 'transportadora.png'; } if (opcao.condicoes.toLowerCase().includes('correos')) { _logo = 'correos.png'; } if (opcao.condicoes.toLowerCase().includes('ctt')) { _logo = 'ctt.png'; } let custo = opcao.valor; custo = opcao.valor / (1 + (opcao.iva / 100)) * (1 + (CESTO.cestoDATA.iva / 100)); custo = '€ ' + FUNC.FormatEuro(custo) + ''; if (opcao.valor == 0) { custo = '' + TRADUZ.traduzir('mediante_orcamento') + ''; } if (CESTO.cestoDATA.portes_gratis) { custo = '' + TRADUZ.traduzir('portes_gratis') + ''; } let _descricao = opcao.descricao; let _condicoes = opcao.condicoes; if (lang.toLowerCase() == 'es') { _descricao = opcao.descricao_ES; _condicoes = opcao.condicoes_ES; } if (lang.toLowerCase() == 'en') { _descricao = opcao.descricao_EN; _condicoes = opcao.condicoes_EN; } let _img = ''; let _html = '
    ' + '
    ' + _condicoes + '

    ' + custo + '

    ' + '' + '
    ' + _img + '
    ' + '
    '; return _html; } static selectOpcaoEntrega(id) { $('#formas_de_entrega .well').removeClass('active'); $('#entrega' + id).addClass('active'); $('#resumo_formaentrega').html($('#entrega' + id + ' p').first().html()); CESTO.eventos_checkout(); } static verificaTel() { if (CESTO.cestoDATA.entrega_ID == 0) { $("#entrega_tel_caixa").removeClass('hide'); if (CESTO.cestoDATA.tel == '') { if (CESTO.cestoDATA.fatura_ID == 0) { //consultar tel na ficha do cliente CESTO.FUNC.GET('/cli', null, function (res) { CESTO.cestoDATA.tel = res.telefone; CESTO.Entrega.changeTel(CESTO.cestoDATA.tel); }); } if (CESTO.cestoDATA.fatura_ID != 0) { //obter tel na morada selecionada let add = CESTO.cestoDATA.moradas.find(o => o.id == CESTO.cestoDATA.fatura_ID); CESTO.cestoDATA.tel = add.tel; CESTO.Entrega.changeTel(CESTO.cestoDATA.tel); } } } if (CESTO.cestoDATA.entrega_ID != 0) { CESTO.cestoDATA.tel = ''; //esconde tel $("#entrega_tel_caixa").addClass('hide'); } if (CESTO.cestoDATA.tel != '') { if (CESTO.cestoDATA.tel.length == 9) { CESTO.cestoDATA.tel = '+351' + CESTO.cestoDATA.tel; } CESTO.phoneInput2.setNumber(CESTO.cestoDATA.tel); } MostraLOG('02.05 - verificaTel --> Tel -->', CESTO.cestoDATA.tel); } static changeTel(tel) { if (CESTO.cestoDATA.entrega_ID != 0) { CESTO.FUNC.GET('/cesto/entrega/tel/' + tel, null, function (res) { console.log(res); }); } } static changeOpcaoEntrega(id) { console.log('02.06 - changeOpcaoEntrega -->', id); } } static Itens = class { static showCestoItens() { let res = ''; if (CESTO.cestoDATA.itens.length == 0) { MostraLOG('02.02.01 - contaItens -->', 'zero --> direciona para o cesto vazio'); window.location.href = '/cesto'; } CESTO.cestoDATA.itens.forEach((prod) => { res += CESTO.Itens.makeProdHtml(prod); }); //cupao if (CESTO.cestoDATA.total_descontos != 0 && CESTO.cestoDATA.cupao != null) { let _html = `

    [` + CESTO.cestoDATA.cupao.codigo + `] ` + TRADUZ.traduzir('remover') + `

    Ref. CUPAO

    € -` + FUNC.FormatEuro(CESTO.cestoDATA.total_descontos) + ` / un.

    1 € -` + FUNC.FormatEuro(CESTO.cestoDATA.total_descontos) + ` `; res += _html; } if (CESTO.cestoDATA.cupao_msg != '') { let _html = '

    ' + CESTO.cestoDATA.cupao_msg + '

    '; $('#cupaoMSG').html(_html); } //pontos if (CESTO.cestoDATA.total_descontos != 0 && CESTO.cestoDATA.pontos != null) { let _html = `

    ` + TRADUZ.traduzir('desconto_pontos') + ` ` + TRADUZ.traduzir('remover') + `

    Ref. PONTOS

    €` + FUNC.FormatEuro(CESTO.cestoDATA.pontos.pontos_valor) + ` / un.

    ` + CESTO.cestoDATA.pontos.pontos_usados + ` € -` + FUNC.FormatEuro(CESTO.cestoDATA.pontos.pontos_usados * CESTO.cestoDATA.pontos.pontos_valor) + ` `; if (CESTO.cestoDATA.pontos.pontos_usados == 0) { _html = ''; } res += _html; } $('#linhasCesto').html(res); $('#linhasCesto1').html(res); $('#total_artigos').html('€ ' + FUNC.FormatEuro(CESTO.cestoDATA.total_artigos)); $('#total_artigos1').html('€ ' + FUNC.FormatEuro(CESTO.cestoDATA.total_artigos)); $('#total_portes').html('€ ' + FUNC.FormatEuro(CESTO.cestoDATA.portes_total)); $('#total_portes1').html('€ ' + FUNC.FormatEuro(CESTO.cestoDATA.portes_total)); $('#total_descontos').html('€ ' + FUNC.FormatEuro(CESTO.cestoDATA.total_descontos)); $('#total_descontos1').html('€ ' + FUNC.FormatEuro(CESTO.cestoDATA.total_descontos)); $('#total').html('€ ' + FUNC.FormatEuro(CESTO.cestoDATA.total)); $('#total1').html('€ ' + FUNC.FormatEuro(CESTO.cestoDATA.total)); $('#resumo_total').html('€ ' + FUNC.FormatEuro(CESTO.cestoDATA.total)); $('.iva-incluido').html(CESTO.cestoDATA.ivaIncluido[LINGUA.atual()]); if (CESTO.cestoDATA.portes_gratis) { let freeShippingText = '' + TRADUZ.traduzir('portes_gratis') + ''; $('#total_portes').html(freeShippingText); $('#total_portes1').html(freeShippingText); } if (CESTO.cestoDATA.product_msg == 'IND') { if (CESTO.etapa < 4) { $('#maisresumo').modal('show'); } CESTO.erroContinuar(TRADUZ.traduzir('produtos_ja_nao_estao_disponiveis')); CESTO.validacaoconcluida(); } CESTO.eventos_checkout(); } static makeProdHtml(prod) { let promo = ''; if (prod.price.atual < prod.price.last) { promo = '€ ' + prod.price.last + ' '; } let total = FUNC.FormatEuro(parseFloat(prod.price.atual) * parseInt(prod.quantidade)); let _nome = prod.info['name_' + LINGUA.atual()]; if (_nome == undefined || _nome == '') { _nome = prod.info.name_pt; } let brevemente = ''; if (prod.state_id == 3) { brevemente = "  "; brevemente = "brevemente  "; $('.brevemente').html(brevemente + TRADUZ.traduzir("artigos_brevemente") + '

    '); } let _html = `

    ` + brevemente + `` + _nome + `

    Ref. ` + prod.sku + `

    ` + promo + `` + prod.price.atual + ` / un.

    ` + prod.quantidade + ` € ` + total + ` `; MostraLOG('02.02.01 - html prod -->', prod); return _html } } static Resumo = class { static getResumo() { //dados faturação let _html = 'CONSUMIDOR FINAL'; if (CESTO.cestoDATA.fatura_ID > 0) { let dados = CESTO.cestoDATA.moradas.find(o => o.id == CESTO.cestoDATA.fatura_ID); _html = '' + dados.nome + '
    '; if (dados.empresa.length > 0) { _html += '' + dados.empresa + '
    '; } _html += dados.morada + '
    ' + dados.codpostal + '  ' + dados.localidade + '    ' + dados.pais + '

    '; if (dados.nif != '') { _html += 'NIF: ' + dados.nif + ''; } else { if (dados.id > 0) { _html += 'NIF: ---------'; } } } $('#resumo_faturacao').html(_html); //morada de entrega _html = '' + TRADUZ.traduzir('ponto_pickup') + ' Porto
    Tabacaria MATECAMEN

    Avenida Fernão Magalhães nº 1269
    4350-169  Porto    Portugal
    Tel. ' + CESTO.cestoDATA.tel; if (CESTO.cestoDATA.entrega_ID > 0) { dados = CESTO.cestoDATA.moradas.find(o => o.id == CESTO.cestoDATA.entrega_ID); _html = '' + dados.nome + '
    '; if (dados.empresa.length > 0) { _html += '' + dados.empresa + '
    '; } _html += dados.morada + '
    ' + dados.codpostal + '  ' + dados.localidade + '    ' + dados.pais + '
    Tel. ' + dados.tel; } $('#resumo_entrega').html(_html); //programa de pontos CESTO.Pontos.consulta(); if (CESTO.cestoDATA.cupao != null) { $('#tabelaCupao').addClass('hidden'); } if (CESTO.cestoDATA.cupao == null) { $('#tabelaCupao').removeClass('hidden'); } CESTO.FUNC.tamanhoAreaCentral(); } } static Pontos = class { //pontos static consulta() { CESTO.Pontos.define(CESTO.cestoDATA.pontos); } static define(dados) { let _html = `
    pontos

    Ainda não aderiu aos Pontos Printflow?

     

    Adira já e ganhe {pontos_novos} pontos com esta encomenda.

    Aderir

     
    `; let _html_es = `
    puntos

    ¿Aún no te has unido a los Puntos Printflow?

     

    Únete ahora y gana {pontos_novos} puntos con este pedido.

    Unirse

     
    `; let _html_en = `
    points

    Haven't joined Printflow Points yet?

     

    Join now and earn {pontos_novos} points with this order.

    Join

     
    `; let _html1 = `
    pontos

    Pontos Printflow

    Com esta encomenda irá ganhar +{pontos_novos} pontos.

    Pontos disponíveis:
    {pontos_disponiveis}
    Descontar pontos
    {destaque}
    `; let _html1_es = `
    pontos

    Puntos Printflow

    Con este pedido ganarás +{pontos_novos} puntos.

    Puntos disponibles:
    {pontos_disponiveis}
    Canjear puntos
    {destaque}
    `; let _html1_en = `
    points

    Printflow Points

    With this order you will earn +{pontos_novos} points.

    Available points:
    {pontos_disponiveis}
    Redeem points
    {destaque}
    `; let _html2 = `
    pontos

    Pontos Printflow

    Com esta encomenda irá ganhar +{pontos_novos} pontos.

    Irá descontar:
    {pontos_usados} pontos
    {destaque}
    `; let _html2_es = `
    puntos

    Puntos Printflow

    Con este pedido ganarás +{pontos_novos} puntos.

    Vas a canjear:
    {pontos_usados} puntos
    {destaque}
    `; let _html2_en = `
    points

    Printflow Points

    With this order you will earn +{pontos_novos} points.

    You will redeem:
    {pontos_usados} points
    {destaque}
    `; let destaque = ''; if (dados == null) { if (lang == 'es') { _html = _html_es; } if (lang == 'en') { _html = _html_en; } _html = FUNC.replaceAll(_html, '{pontos_valor}', 0.05); _html = FUNC.replaceAll(_html, '{pontos_disponiveis}', 0); _html = FUNC.replaceAll(_html, '{pontos_que_pode_usar}', 0); _html = FUNC.replaceAll(_html, '{pontos_usados}', 0); _html = FUNC.replaceAll(_html, '{pontos_novos}', 0); _html = FUNC.replaceAll(_html, '{destaque}', destaque); $('#programa-de-pontos').html(_html); return; } if (dados.aderiu != 1) { if (lang == 'es') { _html = _html_es; } if (lang == 'en') { _html = _html_en; } } if (dados.aderiu == 1) { _html = _html1; if (lang == 'es') { _html = _html1_es; } if (lang == 'en') { _html = _html1_en; } if (dados.newsletter == 0) { destaque = 'Subscreva a nossa Newsletter e receba já +' + dados.newsletter_pontos + ' pontos. » Subscrever'; if (lang == 'es') { destaque = 'Suscríbete a nuestra Newsletter y recibe ya +' + dados.newsletter_pontos + ' puntos. » Suscribirse'; } if (lang == 'en') { destaque = 'Subscribe to our Newsletter and get +' + dados.newsletter_pontos + ' points right away. » Subscribe'; } } else { destaque = 'Partilhe já o seu link com amigos e ganhe ' + dados.pontos_recomendar + ' pontos extra por cada recomendação.
    ' + dados.link + '» Partilhar'; if (lang == 'es') { destaque = 'Comparte ya tu enlace con amigos y gana ' + dados.pontos_recomendar + ' puntos extra por cada recomendación.
    ' + dados.link + '» Compartir'; } if (lang == 'en') { destaque = 'Share your link with friends now and earn ' + dados.pontos_recomendar + ' extra points for each recommendation.
    ' + dados.link + '» Share'; } $('#referralLink').val(dados.link); let _msg = $('#msg_convite').val(); _msg = FUNC.replaceAll(_msg, '{nome}', dados.nome); _msg = FUNC.replaceAll(_msg, '{link}', dados.link); $('#msg_convite').val(_msg); CESTO.FUNC.sharebuttons(); } if (dados.pontos_usados > 0) { _html = _html2; if (lang == 'es') { _html = _html2_es; } if (lang == 'en') { _html = _html2_en; } } } _html = FUNC.replaceAll(_html, '{pontos_valor}', dados.pontos_valor); _html = FUNC.replaceAll(_html, '{pontos_disponiveis}', dados.pontos_disponiveis); _html = FUNC.replaceAll(_html, '{pontos_que_pode_usar}', dados.pontos_que_pode_usar); _html = FUNC.replaceAll(_html, '{pontos_usados}', dados.pontos_usados); _html = FUNC.replaceAll(_html, '{pontos_novos}', dados.pontos_novos); _html = FUNC.replaceAll(_html, '{destaque}', destaque); $('#programa-de-pontos').html(_html); $("#pontos_a_descontar").on("change paste keyup", function () { CESTO.Pontos.calcularDesconto(); }); CESTO.Pontos.calcularDesconto(); } static calcularDesconto() { var a = $("#pontos_a_descontar").val(); var b = $("#pontos_valor").val(); var c = parseFloat(a * b).toFixed(2); $("#descontoObtido").html(c); } static descontar() { $("#pontosMSG").html(""); let a = $("#pontos_a_descontar").val(); let _dados = { 'valor': a }; CESTO.FUNC.POST('/points/descontar', _dados, '#pontosMSG', function (res) { FUNC.fechaModal(); CESTO.Load.reloadCesto(); }, function (res) { console.log(res); }); } static anulardescontos() { let _dados = { 'valor': 0 }; CESTO.FUNC.POST('/points/descontar', _dados, '#pontosMSG', function (res) { CESTO.Load.reloadCesto(); }, function (res) { console.log(res); }); } static aderir() { $("#erro_adesao").html(''); if ($("#termos").is(':checked')) { CESTO.FUNC.GET('/points/aderir', '#erro_adesao', function (res) { FUNC.fechaModal(); CESTO.Load.reloadCesto(); }); } else { let msg = { erro: true, msg: { pt: 'Para aderir ao Programa de Pontos tem de aceitar os Termos e Condições!', en: 'To join the Points Program you must accept the Terms and Conditions!', es: 'Para unirse al Programa de Puntos debe aceptar los Términos y Condiciones!' } }; CESTO.FUNC.MostraErros('', '#erro_adesao', msg); } } } static Cupoes = class { //cupoes static validarCupao() { $("#cupaoMSG").html(""); let _data = { 'valor': $("#cupao").val() }; CESTO.FUNC.POST('/cesto/cupao/valida', _data, '#cupaoMSG', function (res) { CESTO.Load.reloadCesto(); }); } static removeCupao() { CESTO.FUNC.GET('/cesto/cupao/remove', null, function (res) { CESTO.Load.reloadCesto(); }); } } static Newsletter = class { static subscrevernewsletter() { $("#newsletter_results").html(''); if ($("#newssubscribe-check").is(':checked')) { CESTO.Newsletter.subscrevernewsletter1(); } else { $("#newsletter_results").html('

    Para subscrever tem de dar consentimento ao tratamento de dados.

    '); } } static subscrevernewsletter1() { CESTO.FUNC.GET('/cli/newsletter/subscrever', '#newsletter_results', function (res) { FUNC.fechaModal(); CESTO.Load.reloadCesto(); }); } } static Menu = class { static show() { CESTO.FUNC.GET('/cesto', null, function (res) { CESTO.cestoDATA = res; let cesto_n_itens = CESTO.cestoDATA.itens.reduce((total, item) => total + item.quantidade, 0); let cesto_total = FUNC.FormatEuro(CESTO.cestoDATA.total, 2); $('.cesto-n-itens').html(cesto_n_itens); $('.cesto-total').html(cesto_total); }); } } static eventos_checkout() { let itens = []; $('#linhasCesto .CartProduct').each(function () { let price = parseFloat($(this).parent().find('.item_price').html()); price = FUNC.FormatEuro(price, 2); let item = { item_id: $(this).parent().find('.item_id').html(), item_name: $(this).parent().find('.item_name').html(), price: price, currency: 'EUR', quantity: parseInt($(this).parent().find('.item_qde').html()) }; itens.push(item); }); if (CESTO.etapa == 1) { try { GA4.event.begin_checkout(itens); } catch (error) { console.error(error); } } if (CESTO.etapa == 4) { try { let forma_entrega_nome = $('#entrega_descricao' + CESTO.cestoDATA.formaentrega).html(); GA4.event.add_shipping_info(itens, CESTO.cestoDATA.portes_total, forma_entrega_nome); } catch (err) { console.log(err); } } } } if (document.getElementsByTagName) { let inputElements = document.getElementsByTagName("input"); for (i = 0; inputElements[i]; i++) { inputElements[i].setAttribute("autocomplete", "xyz"); } } /* function MostraLOG(titulo, mensagem) { if (CESTO.ativaLOG) { console.log(titulo, mensagem); } } if (CESTO.ativaLOG == false) { if (window.location.hostname !== 'localhost') { console.log = function () { }; } } */ class CESTO_EXPRESS { static cestoDATA; static phoneInput; static updatetel = false; static inicio() { console.log('checkout-EXPRESS'); CESTO_EXPRESS.FUNC.aplicaInputsPhone(); CESTO_EXPRESS.FUNC.FuncoesBotoesEModals(); //carrega dados InitialData CESTO_EXPRESS.Load.loadDataInicial(); CESTO_EXPRESS.eventos(); } static Load = class { static loadDataInicial() { let _data = localStorage.getItem('cestoDATA1'); if (_data) { CESTO_EXPRESS.cestoDATA = JSON.parse(_data); } else { CESTO_EXPRESS.cestoDATA = { fa_nome: '', fa_pais: 'pt', fa_morada: '', fa_codpostal: '', fa_localidade: '', fa_nif: '', entrega_igual: true, entrega_nome: '', entrega_pais: '', entrega_morada: '', entrega_codpostal: '', entrega_localidade: '', entrega_tel: '', formaentrega: 3, listaformasdeentrega: [], obs: '', email: '', cod: '' }; localStorage.setItem('cestoDATA1', JSON.stringify(CESTO_EXPRESS.cestoDATA)); } if (CESTO_EXPRESS.cestoDATA.fa_pais == null) { CESTO_EXPRESS.cestoDATA.fa_pais = 'Portugal'; } if (CESTO_EXPRESS.cestoDATA.entrega_pais == null) { CESTO_EXPRESS.cestoDATA.entrega_pais = 'Portugal'; } if (CESTO_EXPRESS.cestoDATA.fa_nome == 'CONSUMIDOR FINAL') { $('#opcoes_faturacao .well').removeClass('active'); $('#fa_consumidor').addClass('active'); } if (CESTO_EXPRESS.cestoDATA.entrega_igual == true) { $('#opcoes_entrega .well').removeClass('active'); $('#entrega_igual').addClass('active'); } else { if (CESTO_EXPRESS.cestoDATA.formaentrega == 21) { $('#opcoes_entrega .well').removeClass('active'); $('#entrega_matecamen').addClass('active'); } } console.log('loadData'); console.log(CESTO_EXPRESS.cestoDATA); CESTO_EXPRESS.Load.reloadCesto(); } static loadCesto() { console.log('--> LoadCESTOItens '); let dados = CESTO_EXPRESS.cestoDATA; CESTO.FUNC.POST('/cesto/express', dados, null, function (res) { MostraLOG('99.1 - não deu erro -->', res); CESTO_EXPRESS.cestoDATA = res; if (CESTO_EXPRESS.cestoDATA.itens.length == 0) { window.location.href = '/cesto'; return; } CESTO_EXPRESS.Load.loadForm(); }, function (res) { MostraLOG('99.2 - deu erro -->', res); }); } static loadForm() { console.log('--> loadForm'); CESTO_EXPRESS.Load.loadPaises(); CESTO_EXPRESS.Load.showFormasEntrega(); $('#fa_nome').val(CESTO_EXPRESS.cestoDATA.fa_nome); $('#fa_pais').val(CESTO_EXPRESS.cestoDATA.fa_pais); $('#fa_morada').val(CESTO_EXPRESS.cestoDATA.fa_morada); $('#fa_codpostal').val(CESTO_EXPRESS.cestoDATA.fa_codpostal); $('#fa_localidade').val(CESTO_EXPRESS.cestoDATA.fa_localidade); $('#fa_nif').val(CESTO_EXPRESS.cestoDATA.fa_nif); $('#entrega_nome').val(CESTO_EXPRESS.cestoDATA.entrega_nome); $('#entrega_pais').val(CESTO_EXPRESS.cestoDATA.entrega_pais); $('#entrega_morada').val(CESTO_EXPRESS.cestoDATA.entrega_morada); $('#entrega_codpostal').val(CESTO_EXPRESS.cestoDATA.entrega_codpostal); $('#entrega_localidade').val(CESTO_EXPRESS.cestoDATA.entrega_localidade); $('#entrega_tel').val(CESTO_EXPRESS.cestoDATA.entrega_tel); $('#observacoes').val(CESTO_EXPRESS.cestoDATA.obs); $('#entrega_email').val(CESTO_EXPRESS.cestoDATA.email); console.log('--> loadForm ---> FIM'); CESTO_EXPRESS.Itens.showCestoItens(); } static loadPaises() { $('.paises').html(''); CESTO_EXPRESS.cestoDATA.paises.ativos.forEach((el) => { $('.paises').append(''); }); } static reloadCesto() { CESTO_EXPRESS.Load.loadCesto(); } static showFormasEntrega() { console.log('--> formas_de_entrega ---> '); let _html = ''; CESTO_EXPRESS.cestoDATA.listaformasdeentrega.forEach((opcao) => { _html += CESTO_EXPRESS.Load.makeOpcaoHtml(opcao); }); $('#formas_de_entrega').html(_html); if (CESTO_EXPRESS.cestoDATA.formaentrega != 0 && CESTO_EXPRESS.cestoDATA.listaformasdeentrega.length > 0) { //verificar se a forma de entrega existe na lista let existe = false; CESTO_EXPRESS.cestoDATA.listaformasdeentrega.forEach((opcao) => { if (opcao.id == CESTO_EXPRESS.cestoDATA.formaentrega) { existe = true; } }); if (existe == false) { CESTO_EXPRESS.cestoDATA.formaentrega = CESTO_EXPRESS.cestoDATA.listaformasdeentrega[0].id; } $('#entrega' + CESTO_EXPRESS.cestoDATA.formaentrega).addClass('active'); } console.log('--> formas_de_entrega ---> FIM'); } static makeOpcaoHtml(opcao) { let _logo = 'local.png'; if (opcao.condicoes.toLowerCase().includes('transportadora')) { _logo = 'transportadora.png'; } if (opcao.condicoes.toLowerCase().includes('correos')) { _logo = 'correos.png'; } if (opcao.condicoes.toLowerCase().includes('ctt')) { _logo = 'ctt.png'; } let custo = opcao.valor; custo = opcao.valor / (1 + (opcao.iva / 100)) * (1 + (CESTO_EXPRESS.cestoDATA.iva / 100)); custo = '€ ' + FUNC.FormatEuro(custo) + ''; if (opcao.valor == 0) { custo = '' + TRADUZ.traduzir('mediante_orcamento') + ''; } if (CESTO_EXPRESS.cestoDATA.portes_gratis) { custo = '' + TRADUZ.traduzir('portes_gratis') + ''; } let _descricao = opcao.descricao; let _condicoes = opcao.condicoes; if (lang.toLowerCase() == 'es') { _descricao = opcao.descricao_ES; _condicoes = opcao.condicoes_ES; } if (lang.toLowerCase() == 'en') { _descricao = opcao.descricao_EN; _condicoes = opcao.condicoes_EN; } let _img = ''; let _html = '
    ' + '
    ' + _condicoes + '

    ' + custo + '

    ' + '' + '
    ' + _img + '
    ' + '
    '; return _html; } static changeOpcaoEntrega(id) { CESTO_EXPRESS.cestoDATA.formaentrega = id; $('#formas_de_entrega .well').removeClass('active'); $('#entrega' + id).addClass('active'); CESTO_EXPRESS.Load.reloadCesto(); } } //Itens do cesto - COMPLETO static Itens = class { static showCestoItens() { MostraLOG('02.02 - showCestoItens -->', CESTO_EXPRESS.cestoDATA.itens); let res = ''; CESTO_EXPRESS.cestoDATA.itens.forEach((prod) => { res += CESTO.Itens.makeProdHtml(prod); }); $('#linhasCesto').html(res); $('#linhasCesto1').html(res); $('#total_artigos').html('€ ' + FUNC.FormatEuro(CESTO_EXPRESS.cestoDATA.total_artigos)); $('#total_artigos1').html('€ ' + FUNC.FormatEuro(CESTO_EXPRESS.cestoDATA.total_artigos)); $('#total_portes').html('€ ' + FUNC.FormatEuro(CESTO_EXPRESS.cestoDATA.portes_total)); $('#total_portes1').html('€ ' + FUNC.FormatEuro(CESTO_EXPRESS.cestoDATA.portes_total)); $('#total_descontos').html('€ ' + FUNC.FormatEuro(CESTO_EXPRESS.cestoDATA.total_descontos)); $('#total_descontos1').html('€ ' + FUNC.FormatEuro(CESTO_EXPRESS.cestoDATA.total_descontos)); $('#total').html('€ ' + FUNC.FormatEuro(CESTO_EXPRESS.cestoDATA.total)); $('#total1').html('€ ' + FUNC.FormatEuro(CESTO_EXPRESS.cestoDATA.total)); $('#resumo_total').html('€ ' + FUNC.FormatEuro(CESTO_EXPRESS.cestoDATA.total)); $('.iva-incluido').html(CESTO_EXPRESS.cestoDATA.ivaIncluido[LINGUA.atual()]); CESTO_EXPRESS.Save.saveData(); } } static Save = class { static saveData() { CESTO_EXPRESS.cestoDATA.fa_nome = $('#fa_nome').val(); CESTO_EXPRESS.cestoDATA.fa_pais = $('#fa_pais').val(); CESTO_EXPRESS.cestoDATA.fa_morada = $('#fa_morada').val(); CESTO_EXPRESS.cestoDATA.fa_codpostal = $('#fa_codpostal').val(); CESTO_EXPRESS.cestoDATA.fa_localidade = $('#fa_localidade').val(); CESTO_EXPRESS.cestoDATA.fa_nif = $('#fa_nif').val(); CESTO_EXPRESS.cestoDATA.entrega_nome = $('#entrega_nome').val(); CESTO_EXPRESS.cestoDATA.entrega_pais = $('#entrega_pais').val(); CESTO_EXPRESS.cestoDATA.entrega_morada = $('#entrega_morada').val(); CESTO_EXPRESS.cestoDATA.entrega_codpostal = $('#entrega_codpostal').val(); CESTO_EXPRESS.cestoDATA.entrega_localidade = $('#entrega_localidade').val(); if (CESTO_EXPRESS.updatetel) { let entrega_tel = FUNC.replaceAll(CESTO_EXPRESS.phoneInput.getNumber(), '+351', ''); entrega_tel = FUNC.replaceAll(entrega_tel, ' ', ''); CESTO_EXPRESS.cestoDATA.entrega_tel = entrega_tel; } CESTO_EXPRESS.cestoDATA.obs = $('#observacoes').val(); CESTO_EXPRESS.cestoDATA.email = $('#entrega_email').val(); CESTO_EXPRESS.cestoDATA.cod = $('#reg-cod-seguranca').val(); localStorage.setItem('cestoDATA1', JSON.stringify(CESTO_EXPRESS.cestoDATA)); CESTO_EXPRESS.Validar.validarForm(); } } static FUNC = class { static aplicaInputsPhone() { console.log('vai aplicar InputsPhone'); let phoneInputField2 = document.querySelector("#entrega_tel"); CESTO_EXPRESS.phoneInput = window.intlTelInput(phoneInputField2, { initialCountry: "pt", preferredCountries: ["pt", "es"], utilsScript: "https://cdn.pladon.pt/js/intlTelInput/utils.js", }); // Adiciona evento input para filtrar apenas algarismos e o sinal de + phoneInputField2.addEventListener('input', function () { this.value = this.value.replace(/[^\d+]/g, ''); }); console.log('aplicou InputsPhone'); } static FuncoesBotoesEModals() { } } static eventos() { $('#fa_dados').on('click', function () { $('#opcoes_faturacao .well').removeClass('active'); $('#fa_dados').addClass('active'); if (CESTO_EXPRESS.cestoDATA.fa_nome == 'CONSUMIDOR FINAL') { CESTO_EXPRESS.cestoDATA.fa_nome = ''; CESTO_EXPRESS.Load.reloadCesto(); $('#fa_nome').focus(); } }); $('#fa_consumidor').on('click', function () { $('#opcoes_faturacao .well').removeClass('active'); $('#fa_consumidor').addClass('active'); CESTO_EXPRESS.cestoDATA.fa_nome = 'CONSUMIDOR FINAL'; CESTO_EXPRESS.cestoDATA.fa_pais = 'Portugal'; CESTO_EXPRESS.cestoDATA.fa_morada = ''; CESTO_EXPRESS.cestoDATA.fa_codpostal = ''; CESTO_EXPRESS.cestoDATA.fa_localidade = ''; CESTO_EXPRESS.cestoDATA.fa_nif = ''; $('#opcoes_entrega .well').removeClass('active'); $('#entrega_dados').addClass('active'); if (CESTO_EXPRESS.cestoDATA.entrega_igual) { CESTO_EXPRESS.cestoDATA.entrega_igual = false; } CESTO_EXPRESS.Load.reloadCesto(); }); $('#entrega_dados').on('click', function () { $('#opcoes_entrega .well').removeClass('active'); $('#entrega_dados').addClass('active'); CESTO_EXPRESS.cestoDATA.formaentrega = -1; CESTO_EXPRESS.cestoDATA.entrega_igual = false; CESTO_EXPRESS.Load.reloadCesto(); }); $('#entrega_igual').on('click', function () { $('#opcoes_entrega .well').removeClass('active'); $('#entrega_igual').addClass('active'); CESTO_EXPRESS.cestoDATA.formaentrega = -1; CESTO_EXPRESS.cestoDATA.entrega_igual = true; CESTO_EXPRESS.Load.reloadCesto(); }); $('#entrega_matecamen').on('click', function () { $('#opcoes_entrega .well').removeClass('active'); $('#entrega_matecamen').addClass('active'); CESTO_EXPRESS.cestoDATA.formaentrega = 21; CESTO_EXPRESS.cestoDATA.entrega_igual = false; CESTO_EXPRESS.Load.reloadCesto(); }); $('#area .form-control').on('change keyup click', function () { if ($(this).attr("id") == 'entrega_tel') { if ($(this).val() == '00') { $(this).val('+'); } CESTO_EXPRESS.updatetel = true; } else { CESTO_EXPRESS.updatetel = false; } CESTO_EXPRESS.Save.saveData(); }); $("#signup-check").on('change', function () { CESTO_EXPRESS.Save.saveData(); }); $('#entrega_pais,#entrega_codpostal').on('change', function () { CESTO_EXPRESS.Load.reloadCesto(); }); $('#fa_pais,#fa_codpostal,#fa_nif').on('change', function () { CESTO_EXPRESS.Load.reloadCesto(); }); $('#btcontinuar').on('click', function () { CESTO_EXPRESS.confirmorder(); }); FUNC.setInputFilter(document.getElementById("fa_codpostal"), function (value) { return /^\d*\-?\d*$/.test(value); }); FUNC.setInputFilter(document.getElementById("entrega_codpostal"), function (value) { return /^\d*\-?\d*$/.test(value); }); FUNC.setInputFilter(document.getElementById("entrega_tel"), function (value) { return /^\d*\+?\d*$/.test(value); }); } static Validar = class { static validarCP(cp_in) { var pattern = /[0-9]{4}\-[0-9]{3}/; return pattern.test(cp_in); } static validarCodigoPostalEspanholPeninsula(codigoPostal) { // Verificar se o código postal tem 5 dígitos if (!/^\d{5}$/.test(codigoPostal)) { return false; } // Obter os dois primeiros dígitos const primeirosDigitos = parseInt(codigoPostal.substring(0, 2)); // Verificar se os dois primeiros dígitos correspondem a províncias da península if (primeirosDigitos >= 1 && primeirosDigitos <= 52 && primeirosDigitos !== 7 && primeirosDigitos !== 35 && primeirosDigitos !== 38) { return true; // Código postal válido para a península } else { return false; // Código postal inválido (Ilhas Baleares, Canárias ou outras províncias) } } //validar Form static validarForm() { let teste = CESTO_EXPRESS.Validar.validar(); console.log('validarForm', teste); if (teste != 'OK') { $('#msg_rodape').html('

    ' + teste[LINGUA.atual()] + '

    '); $('#btcontinuar').prop('disabled', true); } else { $('#msg_rodape').html(''); $('#btcontinuar').prop('disabled', false); } } static validar() { //se consumidor final e sem morada if (CESTO_EXPRESS.cestoDATA.fa_nome == 'CONSUMIDOR FINAL' && CESTO_EXPRESS.cestoDATA.entrega_igual == true) { return { pt: "Tem que definir uma morada de entrega.", es: "Debe definir una dirección de entrega.", en: "You must define a delivery address." }; } let nif_ok = false; $('.form-control').removeClass('invalido'); if (CESTO_EXPRESS.cestoDATA.fa_nome != 'CONSUMIDOR FINAL') { if (CESTO_EXPRESS.cestoDATA.fa_nome.length < 3) { $('#fa_nome').addClass('invalido'); return { pt: "Tem que definir o nome de faturação.", es: "Debe definir el nombre de facturación.", en: "You must define the billing name." }; } if (CESTO_EXPRESS.cestoDATA.fa_morada.length < 3) { $('#fa_morada').addClass('invalido'); return { pt: "Tem que definir a morada de faturação.", es: "Debe definir la dirección de facturación.", en: "You must define the billing address." }; } if (CESTO_EXPRESS.cestoDATA.fa_pais == 'Portugal') { if (CESTO_EXPRESS.Validar.validarCP(CESTO_EXPRESS.cestoDATA.fa_codpostal) == false) { $('#fa_codpostal').addClass('invalido'); return { pt: "Tem que indicar um código postal de faturação.", es: "Debe indicar un código postal de facturación.", en: "You must enter a billing postal code." }; } } if (CESTO_EXPRESS.cestoDATA.fa_pais == 'Espanha') { if (CESTO_EXPRESS.Validar.validarCodigoPostalEspanholPeninsula(CESTO_EXPRESS.cestoDATA.fa_codpostal) == false) { $('#fa_codpostal').addClass('invalido'); return { pt: "Tem que indicar um código postal de faturação.", es: "Debe indicar un código postal de facturación.", en: "You must enter a billing postal code." }; } } if (CESTO_EXPRESS.cestoDATA.fa_localidade.length < 2) { $('#fa_localidade').addClass('invalido'); return { pt: "Tem que definir a localidade de faturação.", es: "Debe definir la localidad de facturación.", en: "You must define the billing locality." }; } if (CESTO_EXPRESS.cestoDATA.fa_nif != '' && CESTO_EXPRESS.cestoDATA.fa_pais == 'Portugal') { if (CESTO_EXPRESS.cestoDATA.fa_nif.length != 9) { $('#fa_nif').addClass('invalido'); return { pt: "Nº de contribuinte incorreto.", es: "Número de contribuyente incorrecto.", en: "Incorrect tax number." }; } else { if (CESTO.FUNC.validaContribuinte(CESTO_EXPRESS.cestoDATA.fa_nif) == false) { $('#fa_nif').addClass('invalido'); return { pt: "Nº de contribuinte incorreto.", es: "Número de contribuyente incorrecto.", en: "Incorrect tax number." }; } else { $('#fa_nif').removeClass('invalido'); nif_ok = true; } } } } if (CESTO_EXPRESS.cestoDATA.entrega_igual == false) { if (CESTO_EXPRESS.cestoDATA.entrega_nome.length < 3) { $('#entrega_nome').addClass('invalido'); return { pt: "Tem que indicar o nome de entrega.", es: "Debe indicar el nombre de entrega.", en: "You must enter the delivery name." }; } if (CESTO_EXPRESS.cestoDATA.entrega_morada.length < 3) { $('#entrega_morada').addClass('invalido'); return { pt: "Tem que definir a morada de entrega.", es: "Debe definir la dirección de entrega.", en: "You must define the delivery address." }; } if (CESTO_EXPRESS.cestoDATA.entrega_pais == 'Portugal') { if (CESTO_EXPRESS.Validar.validarCP(CESTO_EXPRESS.cestoDATA.entrega_codpostal) == false) { $('#entrega_codpostal').addClass('invalido'); return { pt: "Tem que indicar um código postal de entrega.", es: "Debe indicar un código postal de entrega.", en: "You must enter a delivery postal code." }; } } if (CESTO_EXPRESS.cestoDATA.entrega_pais == 'Espanha') { if (CESTO_EXPRESS.Validar.validarCodigoPostalEspanholPeninsula(CESTO_EXPRESS.cestoDATA.entrega_codpostal) == false) { $('#entrega_codpostal').addClass('invalido'); return { pt: "Tem que indicar um código postal de entrega.", es: "Debe indicar un código postal de entrega.", en: "You must enter a delivery postal code." }; } } if (CESTO_EXPRESS.cestoDATA.entrega_localidade.length < 2) { $('#entrega_localidade').addClass('invalido'); return { pt: "Tem que definir a localidade de entrega.", es: "Debe definir la localidad de entrega.", en: "You must define the delivery locality." }; } } if (CESTO_EXPRESS.cestoDATA.entrega_tel.length < 9) { $('#entrega_tel').addClass('invalido'); return { pt: "Por favor introduza o seu nº de telemóvel.", es: "Por favor introduzca su número de móvil.", en: "Please enter your mobile number." }; } let email = $('#entrega_email').val(); if (email.length < 5) { $('#entrega_email').addClass('invalido'); return { pt: "Por favor introduza o seu email.", es: "Por favor introduzca su email.", en: "Please enter your email." }; } const validateEmail = (email) => { return email.match( /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ ); }; if (!validateEmail(email)) { $('#entrega_email').addClass('invalido'); return { pt: "Por favor introduza um email válido.", es: "Por favor introduzca un email válido.", en: "Please enter a valid email." }; } if (!$('#signup-check').is(":checked")) { return { pt: "Tem que aceitar a nossa política de privacidade e condições gerais.", es: "Debe aceptar nuestra política de privacidad y condiciones generales.", en: "You must accept our privacy policy and general conditions." }; } if (CESTO_EXPRESS.cestoDATA.cod.length != 5) { $('#reg-cod-seguranca').addClass('invalido'); return { pt: "Tem que preencher o código de segurança.", es: "Debe completar el código de seguridad.", en: "You must fill in the security code." }; } return "OK"; } } static confirmorder() { let validacao = CESTO_EXPRESS.Validar.validar(); if (validacao == 'OK') { CESTO_EXPRESS.order(); } else { CESTO_EXPRESS.erroContinuar(validacao); } } static order() { $('#load1').addClass('active'); $('#btcontinuar').prop('disabled', true); let encomenda = CESTO_EXPRESS.cestoDATA; if (CESTO_EXPRESS.cestoDATA.entrega_igual) { encomenda.entrega_nome = CESTO_EXPRESS.cestoDATA.fa_nome; encomenda.entrega_morada = CESTO_EXPRESS.cestoDATA.fa_morada; encomenda.entrega_codpostal = CESTO_EXPRESS.cestoDATA.fa_codpostal; encomenda.entrega_localidade = CESTO_EXPRESS.cestoDATA.fa_localidade; encomenda.entrega_pais = CESTO_EXPRESS.cestoDATA.fa_pais; } console.log('encomenda', encomenda); CESTO.FUNC.POST('/cesto/express/order', encomenda, '#msg_rodape', function (res) { let result = JSON.parse(res); console.log('resultado', result); if (result.erro == false) { MostraLOG('99.1 - não deu erro -->', result); MostraLOG('vai direcionar para a encomenda -->', result.registo.guid); window.location.href = '/checkout/express/order/' + result.registo.guid; } else { console.log('erro a criar encomenda'); $('#load1').removeClass('active'); $('#btcontinuar').prop('disabled', false); $('#msg_rodape').html('

    ' + result.msg[LINGUA.atual()] + '

    '); } }, function (res) { $('#load1').removeClass('active'); $('#btcontinuar').prop('disabled', false); }); } static erroContinuar(texto) { $('#msg-erro').html(texto); $('#modal-erro').modal('show'); } } class CLIENT_AREA { static moradas = []; static phoneInput1; static morada_a_eliminar; static inicio() { console.log('---> CLIENT_AREA -> inicio'); FUNCOES.GET_PAGINADO('/cli/orders?page=1', null, (res) => { let orders = res; orders.dados = JSON.parse(res.dados); //filtrar apenas as 3 últimas encomendas orders.dados = orders.dados.slice(0, 3); let html = ''; if (orders.dados.length > 0) { let pag = FUNCOES.GET_Pagina('template.orders.em_linha.html'); let _template = TRADUZ.traduzirTemplate(pag.Valor); orders.dados.forEach(order => { let _html = _template; _html = _html.replace(/{encomenda}/g, order.encomenda); _html = _html.replace(/{registada}/g, FUNC.trataData(order.registada)); _html = _html.replace(/{estado}/g, order.estado); _html = _html.replace(/{estado_id}/g, order.estado_id); _html = _html.replace(/{total}/g, FUNC.FormatEuro(order.total)); html += _html; }); } else { html = '

    -

    '; } document.getElementById('last_orders').innerHTML = html; }, null); } static orders() { let pagina_atual = FUNC.getParameterByName('page'); if (isNaN(pagina_atual) || pagina_atual == '') { pagina_atual = 1; } console.log('---> CLIENT_AREA -> orders -> pagina_atual: ' + pagina_atual); FUNCOES.GET_PAGINADO('/cli/orders?page=' + pagina_atual, null, (res) => { let orders = res; orders.dados = JSON.parse(res.dados); let html = ''; if (orders.dados.length > 0) { let pag = FUNCOES.GET_Pagina('template.orders.em_linha.html'); let _template = TRADUZ.traduzirTemplate(pag.Valor); orders.dados.forEach(order => { let _html = _template; _html = _html.replace(/{encomenda}/g, order.encomenda); _html = _html.replace(/{registada}/g, FUNC.trataData(order.registada)); _html = _html.replace(/{estado}/g, order.estado); _html = _html.replace(/{estado_id}/g, order.estado_id); _html = _html.replace(/{total}/g, FUNC.FormatEuro(order.total)); html += _html; }); } else { html = '

    -

    '; } /* Paginação */ html += FUNCOES.paginacao(orders.paginacao, 'paginacao'); document.getElementById('lista').innerHTML = html; }, null); } static order() { FUNCOES.GET('/cli/order/?id=' + itemID, null, (res) => { res.total = FUNC.FormatEuro(res.total); res.entrega_custo = FUNC.FormatEuro(res.entrega_custo); res.total_artigos_liquido = FUNC.FormatEuro(res.total_artigos_liquido); res.total_descontos = FUNC.FormatEuro(res.total_descontos); FUNC.popularFormulario(res, 'enc_', ''); carregaLinhas(res.linhas); $('.enc_codigo').html(res.codigo); $('#enc_estado_nome_lang').html(PARAMETROS.EstadoNome(res.estado) || '-'); let _html_enc_top = ''; if (res.entrega_modo.includes('orçamento')) { $('#enc_entrega_custo').html('
    Mediante orçamento*
    '); let _msg = { pt: '

    * Após concluir o registo da sua encomenda deve aguardar a receção de um novo email com o apuramento do valor dos portes.

    ', en: '

    * After completing the registration of your order, you must wait to receive a new email with the assessment of the value of the shipping costs.

    ', es: '

    * Después de completar el registro de su pedido, debe esperar a recibir un nuevo correo electrónico con la evaluación del valor de los costos de envío.

    ' }; _html_enc_top += _msg[lang]; } document.getElementById('enc_top').innerHTML = _html_enc_top; console.log(res); }, null ); function carregaLinhas(linhas) { let _html_linhas = '' linhas.forEach(linha => { let pag = FUNCOES.GET_Pagina('template.orders.linha.html'); let _template = TRADUZ.traduzirTemplate(pag.Valor); let _html = _template; let _link = '/' + lang + '/p/' + linha.sku; _link = _link.toLowerCase(); _html = _html.replace(/{img}/g, linha.img); _html = _html.replace(/{nome}/g, linha.nome); _html = _html.replace(/{sku}/g, linha.sku); _html = _html.replace(/{link}/g, _link); _html = _html.replace(/{qde}/g, linha.qde); _html = _html.replace(/{pvp}/g, FUNC.FormatEuro(linha.pvp)); _html = _html.replace(/{subtotal}/g, FUNC.FormatEuro(linha.subtotal)); _html_linhas += _html; }); document.getElementById('enc_linhas').innerHTML = _html_linhas; } } static info() { //adicionar intlTelInput.css no head do documento let link = document.createElement('link'); link.rel = 'stylesheet'; link.href = 'https://cdn.pladon.pt/js/intlTelInput/intlTelInput.css'; document.head.appendChild(link); FUNCOES.GET('/cli', null, (res) => { console.log(res); FUNC.popularFormulario(res, 'cli_', ''); document.getElementById('cli_newsletter').checked = res.newsletter; // Aguardar inicialização do simpleSwitch e sincronizar estado visual setTimeout(function () { let $sw = $('#cli_newsletter'); if ($sw.hasClass('simple-switch')) { let checked = res.newsletter; $sw.attr('data-switch', checked ? 'true' : 'false'); $sw.parent().removeClass(checked ? 'unchecked' : 'checked').addClass(checked ? 'checked' : 'unchecked'); } }, 200); //se res.newsletter_pontos==1 então checar a checkbox cli_newsletter_pontos document.getElementById('cli_newsletter_pontos').checked = res.newsletter_pontos; // Aguardar inicialização do simpleSwitch e sincronizar estado visual setTimeout(function () { let $sw = $('#cli_newsletter_pontos'); if ($sw.hasClass('simple-switch')) { let checked = res.newsletter_pontos; $sw.attr('data-switch', checked ? 'true' : 'false'); $sw.parent().removeClass(checked ? 'unchecked' : 'checked').addClass(checked ? 'checked' : 'unchecked'); } }, 200); CLIENT_AREA.Moradas.mostraMoradas(); CLIENT_AREA.Moradas.FuncoesBotoesEModals(); }); } static gravaInfo() { let nome = $('#cli_nome').val(); let newsletter = $('#cli_newsletter').prop('checked'); let dados = { nome: nome, newsletter: newsletter }; FUNCOES.POST('/cli/grava', dados, '#resultado', function (res) { if (res.erro) { $('#resultado').html('
    ' + res.msg[lang] + '
    '); } else { $('#resultado').html('
    ' + TRADUZ.traduzir('alteracoes_gravadas_com_sucesso') + '
    '); setTimeout(function () { $('#resultado').html(''); }, 3000); } }); } static Moradas = class { static mostraMoradas() { FUNCOES.GET('/cli/moradas', null, (result) => { CLIENT_AREA.moradas = result; let res = ''; CLIENT_AREA.moradas.forEach((dados) => { res += CLIENT_AREA.Moradas.makeMoradaHtml(dados); }); $('#selectmoradas').html(res); CLIENT_AREA.Moradas.aplicaInputsPhone(); }); } static makeMoradaHtml(dados) { let _html = '
    ' + '
    ' + dados.nome + '
    '; if (dados.empresa.length > 0) { _html += '' + dados.empresa + '
    '; } _html += '' + dados.morada + '
    ' + dados.codpostal + '  ' + dados.localidade + '    ' + dados.pais + ''; _html += '
    '; if (dados.nif != '') { _html += 'NIF: ' + dados.nif; } else { _html += 'NIF: ---------'; } _html += '      '; _html += 'Tel: ' + dados.tel _html += '
    '; _html += ''; _html += '
    '; return _html; } static novamorada() { $('#morada_id').val(0); $('#morada_nome').val(''); $('#morada_empresa').val(''); $('#morada_morada').val(''); $('#morada_codpostal').val(''); $('#morada_localidade').val(''); $('#morada_pais').val('Portugal'); $('#morada_telefone').val(''); $('#morada_nif').val(''); $('#nova-morada').modal('show'); } static editmorada(id) { let add = CLIENT_AREA.moradas.find(o => o.id == id); $('#morada_id').val(add.id); $('#morada_nome').val(add.nome); $('#morada_empresa').val(add.empresa); $('#morada_morada').val(add.morada); $('#morada_codpostal').val(add.codpostal); $('#morada_localidade').val(add.localidade); $('#morada_pais').val(add.pais); add.tel = FUNC.replaceAll(add.tel, ' ', ''); if (add.tel.startsWith("00")) { add.tel = '+' + add.tel.substring(2); } if (add.tel.length == 9) { add.tel = '+351' + add.tel; CLIENT_AREA.phoneInput1.setNumber(add.tel); } else { CLIENT_AREA.phoneInput1.setNumber(add.tel); } $('#morada_nif').val(add.nif); $('#morada_titulo').html(TRADUZ.traduzir('alterar_morada')); $('#nova-morada').modal('show'); } static gravamorada() { $('#morada_erro').html(''); let erros = ''; let id = $('#morada_id').val(); let nome = $('#morada_nome').val(); let empresa = $('#morada_empresa').val(); let morada = $('#morada_morada').val(); let codpostal = $('#morada_codpostal').val(); let localidade = $('#morada_localidade').val(); let pais = $('#morada_pais').val(); let nif = $('#morada_nif').val(); let telefone = CLIENT_AREA.phoneInput1.getNumber(); telefone = FUNC.replaceAll(telefone, '+351', ''); if (nome == '') { erros += '
  • ' + TRADUZ.traduzir('introduza_nome') + '
  • '; } if (morada == '') { erros += '
  • ' + TRADUZ.traduzir('introduza_morada') + '
  • '; } if (codpostal == '') { erros += '
  • ' + TRADUZ.traduzir('introduza_codpostal') + '
  • '; } if (localidade == '') { erros += '
  • ' + TRADUZ.traduzir('introduza_localidade') + '
  • '; } if (!CLIENT_AREA.phoneInput1.isValidNumber()) { erros += '
  • ' + TRADUZ.traduzir('introduza_telemovel') + '
  • '; } if (erros != '') { $('#morada_erro').html('
    ' + TRADUZ.traduzir('verifica_erros') + ':
      ' + erros + '
      '); return; } let nova = { id: id, nome: nome, empresa: empresa, morada: morada, codpostal: codpostal, localidade: localidade, pais: pais, nif: nif, tel: telefone }; CLIENT_AREA.Moradas.moradasemnumero(nova); function validarCodigoPostalEspanholPeninsula(codigoPostal) { // Verificar se o código postal tem 5 dígitos if (!/^\d{5}$/.test(codigoPostal)) { return false; } // Obter os dois primeiros dígitos const primeirosDigitos = parseInt(codigoPostal.substring(0, 2)); // Verificar se os dois primeiros dígitos correspondem a províncias da península if (primeirosDigitos >= 1 && primeirosDigitos <= 52 && primeirosDigitos !== 7 && primeirosDigitos !== 35 && primeirosDigitos !== 38) { return true; // Código postal válido para a península } else { return false; // Código postal inválido (Ilhas Baleares, Canárias ou outras províncias) } } } static moradasemnumero(nova) { let morada = $('#morada_morada').val(); if (morada.toUpperCase().includes('S/N')) { CLIENT_AREA.Moradas.gravamoradafavorita(nova); return; } if (CESTO.FUNC.stringContainsNumber(morada)) { CLIENT_AREA.Moradas.gravamoradafavorita(nova); } else { $('#moradasemnumero').modal('show'); } } static confirmamoradasemnumero() { $('#moradasemnumero').modal('hide'); let morada = $('#morada_morada').val(); morada += ' S/N'; $('#morada_morada').val(morada); CLIENT_AREA.Moradas.gravamorada(); } static gravamoradafavorita(nova) { FUNCOES.POST('/cli/morada/grava', nova, '#morada_erro', function (res) { FUNC.fechaModal(); CLIENT_AREA.Moradas.mostraMoradas(); }); } static delmorada(id) { CLIENT_AREA.morada_a_eliminar = id; $('#confirm-eliminar').modal('show'); } static eliminamorada() { let mooradadel = CLIENT_AREA.moradas.find(o => o.id == CLIENT_AREA.morada_a_eliminar); FUNCOES.POST('/cli/morada/eliminar', mooradadel, '#moradaeliminar_erro', function (res) { FUNC.fechaModal(); $('#morada_' + mooradadel.id).remove(); }); } static aplicaInputsPhone() { let phoneInputField1 = document.querySelector("#morada_telefone"); CLIENT_AREA.phoneInput1 = window.intlTelInput(phoneInputField1, { initialCountry: "pt", preferredCountries: ["pt", "es"], utilsScript: "https://cdn.pladon.pt/js/intlTelInput/utils.js", }); // Adiciona evento input para filtrar apenas algarismos e o sinal de + phoneInputField1.addEventListener('input', function () { this.value = this.value.replace(/[^\d+]/g, ''); }); } static FuncoesBotoesEModals() { CESTO.Load.paises(); $('#nova-morada').on('shown.bs.modal', function () { $('#morada_erro').html(''); FUNC.setInputFilter(document.getElementById("morada_codpostal"), function (value) { return /^\d*\-?\d*$/.test(value); }); FUNC.setInputFilter(document.getElementById("morada_telefone"), function (value) { return /^\d*\+?\d*$/.test(value); }); $("#morada_telefone").keyup(function () { if ($(this).val() == '00') { $(this).val('+'); } }); if ($('#morada_id').val() == '0') { $('#morada_titulo').html(TRADUZ.traduzir('nova_morada')); $('#bt_grava_morada').html(TRADUZ.traduzir('adicionar')); } else { $('#morada_titulo').html(TRADUZ.traduzir('alterar_morada')); $('#bt_grava_morada').html(TRADUZ.traduzir('alterar')); } $('#morada_codpostal').keyup(function () { if ($('#morada_pais').val() == 'Portugal') { let _cod = $('#morada_codpostal').val(); let _final = ''; for (var i = 0; i < _cod.length; i++) { let _char = _cod.charAt(i); if (i == 4) { _final += '-'; if (!isNaN(_char)) { _final += _char; } } else { if (!isNaN(_char)) { _final += _char; } } } $('#morada_codpostal').val(_final); } }); }); $('#bt_grava_morada').on('click', function () { CLIENT_AREA.Moradas.gravamorada(); }); $('#bt_nova_morada').on('click', function () { CLIENT_AREA.Moradas.novamorada(); }); } } static docs() { let pagina_atual = FUNC.getParameterByName('page'); let ano = FUNC.getParameterByName('ano'); if (isNaN(pagina_atual) || pagina_atual == '') { pagina_atual = 1; } //ano atual let ano_atual = new Date().getFullYear(); if (isNaN(ano) || ano == '') { ano = ano_atual; } console.log('---> CLIENT_AREA -> docs -> pagina_atual: ' + pagina_atual); $('#ano_txt').val(ano); $('#mais_ano').on('click', function () { let novo_ano = parseInt($('#ano_txt').val()) + 1; let url_atual = new URL(window.location.href); url_atual.searchParams.set('ano', novo_ano); window.location.href = url_atual.href; }); $('#menos_ano').on('click', function () { let novo_ano = parseInt($('#ano_txt').val()) - 1; let url_atual = new URL(window.location.href); url_atual.searchParams.set('ano', novo_ano); window.location.href = url_atual.href; }); FUNCOES.GET_PAGINADO('/cli/docs?page=' + pagina_atual + '&ano=' + ano, null, (res) => { let itens = res.dados; let html = ''; if (itens.length > 0) { let pag = FUNCOES.GET_Pagina('template.docs.em_linha.html'); let _template = TRADUZ.traduzirTemplate(pag.Valor); itens.forEach(doc => { let _html = _template; _html = _html.replace(/{data}/g, doc.DATA_DOC); _html = _html.replace(/{documento}/g, doc.DOC); _html = _html.replace(/{encomenda}/g, doc.ENCOMENDA); _html = _html.replace(/{guid}/g, doc.GUID); let _tipo_doc = 'Fatura'; if (doc.DOC.startsWith("FR")) { _tipo_doc = 'Fatura recibo'; } if (doc.DOC.startsWith("NC")) { _tipo_doc = 'Nota de crédito'; } if (doc.DOC.startsWith("FA")) { _tipo_doc = 'Fatura'; } if (doc.DOC.startsWith("ORC")) { _tipo_doc = 'Orçamento'; } if (doc.DOC.startsWith("GR")) { _tipo_doc = 'Guia de remessa'; } _html = _html.replace(/{tipo}/g, _tipo_doc); html += _html; }); /* Paginação */ html += FUNCOES.paginacao(res.paginacao, 'paginacao'); } else { html = '
      ' + TRADUZ.traduzir('Nao_foram_encontrados_documentos') + '.
      '; } document.getElementById('lista').innerHTML = html; }, null); } static fav() { } static rgpd() { $(".direitos").hide(); } static msgs() { let pagina_atual = FUNC.getParameterByName('page'); if (isNaN(pagina_atual) || pagina_atual == '') { pagina_atual = 1; } console.log('---> CLIENT_AREA -> msgs -> pagina_atual: ' + pagina_atual); FUNCOES.GET_PAGINADO('/cli/msgs?page=' + pagina_atual, null, (res) => { let itens = res.dados; let html = ''; if (itens.length > 0) { let pag = FUNCOES.GET_Pagina('template.msgs.em_linha.html'); let _template = TRADUZ.traduzirTemplate(pag.Valor); itens.forEach(item => { let _html = _template; _html = _html.replace(/{data}/g, item.data_registo); _html = _html.replace(/{codigo}/g, item.codigo); _html = _html.replace(/{tipo}/g, item.tipo); _html = _html.replace(/{encomenda}/g, item.encomenda); _html = _html.replace(/{assunto}/g, item.assunto); _html = _html.replace(/{to}/g, item.sent_to); html += _html; }); } else { html = '

      -

      '; } /* Paginação */ html += FUNCOES.paginacao(itens.paginacao, 'paginacao'); document.getElementById('lista').innerHTML = html; $(".logo_Email").toggleClass('logo_Email glyphicon glyphicon-envelope'); $(".logo_SMS").toggleClass('logo_SMS glyphicon glyphicon-phone'); }, null); } static points() { console.log('---> CLIENT_AREA -> points'); POINTS.consulta(); } } class POINTS { static consulta() { console.log('---> POINTS -> consulta'); FUNCOES.GET('/points', null, function (res) { if (res.aderiu == 0) { console.log('Não aderiu ao programa de pontos'); window.location.href = '/' + lang + '/my/points/subscribe'; } $('#pontos_disponiveis').html(res.pontos_disponiveis); $('#pontos_valor').html(res.pontos_valor); $('#pontos_pendentes').html(res.pontos_pendentes); $('#data_adesao').html(res.data_adesao); $('#pontos_recomendado').html(res.pontos_recomendado); $('#pontos_recomendar').html(res.pontos_recomendar); $('#pontos_compra').html(res.pontos_compra); $('#referralLink').val(res.link); $('#link_whatsapp').attr('href', 'https://api.whatsapp.com/send?text=' + TRADUZ.traduzir('Whatsapp_msg') + ': ' + res.link); console.log(res); }); } static copiarCodigo() { console.log('---> POINTS -> copiarCodigo'); //copiar o link do inputid=referralLink para o clipboard var copyText = document.getElementById("referralLink"); copyText.select(); copyText.setSelectionRange(0, 99999); // For mobile devices document.execCommand("copy"); alert(TRADUZ.traduzir('Link_copiado') + ": " + copyText.value); } static details() { console.log('---> POINTS -> details'); FUNCOES.GET('/points', null, function (res) { console.log(res); $('#pontos_disponiveis').html(res.pontos_disponiveis); $('#pontos_pendentes').html(res.pontos_pendentes); }); let pagina_atual = FUNC.getParameterByName('page'); if (isNaN(pagina_atual) || pagina_atual == '') { pagina_atual = 1; } FUNCOES.GET_PAGINADO('/points/details?page=' + pagina_atual, null, function (res) { console.log(res); let _htmlfinal = ''; let _estado = ['']; // para cada item no res.dados res.dados.forEach(item => { let _html = ` {data_registo} {pontos} {estado} {encomenda} {descricao} {validade} `; _html = FUNC.replaceAll(_html, '{data_registo}', FUNC.trataApenasData(item.data_registo)); _html = FUNC.replaceAll(_html, '{ID}', item.id); _html = FUNC.replaceAll(_html, '{pontos}', item.pontos); _html = FUNC.replaceAll(_html, '{estado}', item.estado); _html = FUNC.replaceAll(_html, '{encomenda}', item.encomenda); _html = FUNC.replaceAll(_html, '{descricao}', item.descricao); _html = FUNC.replaceAll(_html, '{validade}', FUNC.trataApenasData(item.validade)); _htmlfinal += _html; }); $('#movimentos1').html(_htmlfinal); $('.linhas').each(function () { var ID = $(this).data("id"); var estado = $(this).data("estado"); if (estado == 0) { $('#linha' + ID + ' .estado').html(""); } else { $('#linha' + ID + ' .estado').html(""); } var pontos = $(this).data("pontos"); if (pontos < 1) { $('#linha' + ID + ' .pontos').addClass('red'); } var encomenda = $(this).data("encomenda"); if (encomenda == 0) { $('#linha' + ID + ' .encomenda').html('-'); } else { $('#linha' + ID + ' .encomenda').html('' + encomenda + ''); } var validade = new Date($(this).data("validade")); var data_atual = new Date($('#data_pesquisa').val()); var diff = new Date(validade - data_atual); console.log(diff); if (diff < 0) { $(this).addClass("danger"); } }); $('#paginacao').html(FUNCOES.paginacao(res.paginacao, 'paginacao')); }); } static cancel() { console.log('---> POINTS -> cancel'); //points/cancel FUNCOES.GET('/points/cancel', null, function (res) { POINTS.consulta(); }); } static subscribe() { console.log('---> POINTS -> subscribe'); FUNCOES.GET('/points', null, function (res) { console.log(res); if (res.aderiu == 1) { console.log('Já aderiu ao programa de pontos'); window.location.href = '/' + lang + '/my/points'; } let valor100 = res.pontos_valor * 100; $('#desconto_100pontos').html(valor100.toFixed(2)); }); FUNCOES.GET('/points/condicoes', null, function (res) { console.log(res); $('#condicoes_pontos').html(res[lang]); }); } static aderir() { console.log('---> POINTS -> aderir'); $("#erro_adesao").html(""); if ($("#termos").is(':checked')) { console.log('Aceitou os termos e condições'); FUNCOES.GET('/points/aderir', null, function (res) { console.log(res); window.location.href = '/' + lang + '/my/points'; }); } else { let erro_msg = { 'pt': 'Tem de aceitar os termos e condições para aderir ao programa de pontos.', 'es': 'Debe aceptar los términos y condiciones para unirse al programa de puntos.', 'en': 'You must accept the terms and conditions to join the points program.' }; $("#erro_adesao").html("

      " + erro_msg[lang] + "

      "); } } } class CATEGORIAS { static cat_atual = null; static lista = []; static Carrega() { let _html = ''; CATEGORIAS.GetCategorias(function () { _html += CATEGORIAS.GetFiltros(); _html = CATEGORIAS.FormaArvoreCats(_html); $('#filtros').html(_html); CATEGORIAS.getPathCategoria(); CATEGORIAS.ComplementaCategoria(); CATEGORIAS.BindTreeEvents(); }); } static ComplementaCategoria() { let cat = CATEGORIAS.cat_atual; if (!cat) return; $('#cat_nome').html(cat[lang].nome); } static getPathCategoria() { const langKey = (typeof lang !== 'undefined') ? lang : 'pt'; const normalize = (p) => { if (!p) return ''; try { p = decodeURI(p); } catch {} // remove trailing slash, lower for robust compare return p.replace(/\/$/, '').toLowerCase(); }; const currentPath = normalize(window.location.pathname); // recursive search that returns the current item and its direct parent const findWithParent = (list, parent = null) => { for (const cat of (list || [])) { const node = cat[langKey] || cat.pt || {}; const link = normalize(node.link); if (link === currentPath) { return { current: cat, parent }; } if (cat.submenus && cat.submenus.length) { const found = findWithParent(cat.submenus, cat); if (found) return found; } } return null; }; const result = findWithParent(CATEGORIAS.lista); let crumbs = `
    • home
    • `; if (result) { if (result.parent) { const p = result.parent[langKey] || result.parent.pt || {}; crumbs += `
    • ${p.nome}
    • `; } const c = result.current[langKey] || result.current.pt || {}; crumbs += `
    • ${c.nome}
    • `; CATEGORIAS.cat_atual = result.current; console.log('Categoria atual definida:', CATEGORIAS.cat_atual); } $('ul.breadcrumb').html(crumbs); } static GetFiltros() { console.log('GetFiltros --->>>>>>>'); let filtros = paginas.find(x => x.Nome == 'template.products.filtros.html') || null; console.log('filtros encontrados', filtros); return filtros.Valor; } static FormaArvoreCats(_html) { let _arvore_html = ''; const lista = CATEGORIAS.lista || []; const langKey = (typeof lang !== 'undefined') ? lang : 'pt'; const current = (typeof link_atual !== 'undefined') ? link_atual : window.location.pathname; const isActiveLink = (l) => { if (!l) return false; return l === current || (current.startsWith(l + '/') && l !== '/'); }; const buildSub = (subs) => { if (!subs || subs.length === 0) return ''; let html = ''; return html; }; let top = ''; _arvore_html = top; _html = _html.replace('{filtros_categorias}', _arvore_html); return _html; } static BindTreeEvents() { // Delegated click for toggling $(document).off('click.catTree').on('click.catTree', '.tree .toggle-sub', function (e) { e.preventDefault(); const $a = $(this); const $li = $a.closest('li'); const $sub = $li.children('ul.category-level-2'); if ($sub.length === 0) return; const isOpen = $li.hasClass('open-tree'); if (isOpen) { $li.removeClass('open-tree'); $sub.slideUp(150); $a.attr('aria-expanded', 'false'); } else { $li.addClass('open-tree'); $sub.slideDown(150); $a.attr('aria-expanded', 'true'); } }); // Keyboard accessibility (Enter/Space) $(document).off('keydown.catTree').on('keydown.catTree', '.tree .toggle-sub', function (e) { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); $(this).trigger('click'); } }); } static GetCategorias(next) { console.log('GetCategorias --->>>>>>>'); TEMPLATE.whenMenuReady((menu) => { console.log('vai ler o menu principal', menu); //filtra o menu para pegar só as categorias de produtos CATEGORIAS.lista = menu.filter(x => x.pt && x.pt.link && x.pt.link.startsWith('/pt/produtos')); console.log('categorias filtradas', CATEGORIAS.lista); if (next) next(); }); } } class PARAMETROS { static estados = [ { id: 0, nome: { pt: "Em processamento...", en: "Processing...", es: "En proceso..." }, cor: '#99FF66' }, { id: 1, nome: { pt: "Validada. A aguardar pagamento...", en: "Validated. Awaiting payment...", es: "Validada. Esperando pago..." }, cor: '#99FF66' }, { id: 2, nome: { pt: "Em validação...", en: "Under validation...", es: "En validación..." }, cor: '#99FF66' }, { id: 3, nome: { pt: "Pagamento Efetuado!", en: "Payment Completed!", es: "¡Pago Realizado!" }, cor: '#FFCC66' }, { id: 4, nome: { pt: "Em Preparação...", en: "In Preparation...", es: "En Preparación..." }, cor: '#FF9900' }, { id: 5, nome: { pt: "Entrega em curso...", en: "Delivery in progress...", es: "Entrega en curso..." }, cor: '#FF66FF' }, { id: 6, nome: { pt: "Incidência!", en: "Incident!", es: "¡Incidencia!" }, cor: '#FF0000' }, { id: 7, nome: { pt: "Em processamento...", en: "Processing...", es: "En proceso..." }, cor: '#669999' }, { id: 8, nome: { pt: "Entrega concluída!", en: "Delivery completed!", es: "¡Entrega completada!" }, cor: '#00CC66' }, { id: 9, nome: { pt: "Finalizada!", en: "Finished!", es: "¡Finalizada!" }, cor: '#336600' }, { id: 10, nome: { pt: "Cancelada!", en: "Cancelled!", es: "¡Cancelada!" }, cor: '#701012' } ]; static EstadoNome(id) { let estado = PARAMETROS.estados.find(e => e.id === id); if (estado) { return estado.nome[lang] || estado.nome['pt']; } return '-'; } } class LINKS { static defineAll() { console.log('LINKS.defineAll'); LINKS.defineLinksGoto(); LINKS.defineLinksModal(); } static defineLinksGoto() { $('.go-to').each(function () { let link = $(this).attr('data-link'); if (link != undefined && link != null && link != '') { $(this).css('cursor', 'pointer'); $(this).off('click').on('click', function () { LINKS.goTo(link); }); } }); } static goTo(link) { link = '/' + lang + '/' + link; /* susbtituir // por / */ link = link.replace(/\/\/+/g, '/'); window.location.href = link; } static defineLinksModal() { $('.openModal').each(function () { let link = $(this).attr('data-target'); console.log('LINKS.defineLinksModal -> obter modal: ' + link); if (link != undefined && link != null && link != '') { $(this).css('cursor', 'pointer'); $(this).off('click').on('click', function () { let modal = FUNCOES.GET_Pagina('template.modal.' + link + '.html'); console.log(modal); if (modal != null) { let _html = TRADUZ.traduzirTemplate(modal.Valor); $('#placer').html(_html); LINKS.defineAll(); $('#Modal' + link).modal('show'); } else { console.log('LINKS.defineLinksModal -> modal não encontrado: ' + link); } }); } }); } } class FUNCOES { static MostraErros(url, destino_erro, res, next_apos_erro) { if (destino_erro == null) { console.log('ERRO', url, res); } else { let erro = ''; if (res.msg == null) { erro = res; } else if (typeof res.msg === 'string') { erro = res.msg; } else if (res.msg[LINGUA.atual()] != null) { erro = res.msg[LINGUA.atual()]; } $(destino_erro).html('
      ' + TRADUZ.traduzir('Verifica_erros') + ':
      • ' + erro + '
      '); } if (next_apos_erro != null) { next_apos_erro(); } } static POST(url, postadata, destino_erro, sucesso, next_apos_erro = null) { fetch(config.apiUrl + url, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(postadata) }) .then(response => { if (!response.ok) { throw new Error("HTTP error " + response.status); } return response.json(); }) .then(res => { if (res.erro == false) { sucesso(res.dados); } else { FUNCOES.MostraErros(url, destino_erro, res, next_apos_erro); } }) .catch(error => { FUNCOES.MostraErros(url, destino_erro, error, next_apos_erro); }); } static GET(url, destino_erro, sucesso, next_apos_erro = null) { fetch(config.apiUrl + url) .then(response => { if (!response.ok) { throw new Error("HTTP error " + response.status); } return response.json(); }) .then(res => { if (res.erro == false) { sucesso(res.dados); } else { FUNCOES.MostraErros(url, destino_erro, res, next_apos_erro); } }) .catch(error => { FUNCOES.MostraErros(url, destino_erro, error, next_apos_erro); }); } static GET_PAGINADO(url, destino_erro, sucesso, next_apos_erro = null) { fetch(config.apiUrl + url) .then(response => { if (!response.ok) { throw new Error("HTTP error " + response.status); } return response.json(); }) .then(res => { if (res.erro == false) { let dados = { dados: res.dados, paginacao: res.paginacao }; sucesso(dados); } else { FUNCOES.MostraErros(url, destino_erro, res, next_apos_erro); } }) .catch(error => { FUNCOES.MostraErros(url, destino_erro, error, next_apos_erro); }); } static GET_Pagina(nome) { const paginaEncontrada = paginas.find(pagina => pagina.Nome.toLowerCase() === nome.toLowerCase()); return paginaEncontrada; } static paginacao(paginacao) { if (paginacao == null) { return ''; } // Verificar primeiro se há parâmetro 'page' na URL atual let paginaURL = parseInt(FUNC.getParameterByName('page')) || 1; let paginaAtual = paginaURL || parseInt(paginacao.pagina); let totalItens = paginacao.total_itens; let itensPorPagina = paginacao.paginacao; let totalPaginas = Math.ceil(totalItens / itensPorPagina); if (totalPaginas <= 1) { return ''; } let htmlPaginacao = '
        '; // Botão "Primeira página" (|«) if (paginaAtual > 1) { htmlPaginacao += `
      • `; } // Botão "Página anterior" («) if (paginaAtual > 1) { htmlPaginacao += `
      • «
      • `; } // Determinar o range de páginas a mostrar let maxPaginas = 5; let iniciar = Math.max(1, paginaAtual - Math.floor(maxPaginas / 2)); let terminar = Math.min(totalPaginas, iniciar + maxPaginas - 1); // Ajustar o início se estivermos perto do fim if (terminar - iniciar + 1 < maxPaginas) { iniciar = Math.max(1, terminar - maxPaginas + 1); } // Páginas numéricas for (let i = iniciar; i <= terminar; i++) { if (i === paginaAtual) { htmlPaginacao += `
      • ${i}
      • `; } else { htmlPaginacao += `
      • ${i}
      • `; } } // Botão "Próxima página" (») if (paginaAtual < totalPaginas) { htmlPaginacao += `
      • »
      • `; } // Botão "Última página" (»|) if (paginaAtual < totalPaginas) { htmlPaginacao += `
      • »|
      • `; } htmlPaginacao += '
      '; return htmlPaginacao; } } class LAST { static executar() { console.log("Último módulo carregado."); // Aguardar um momento para garantir que o DOM está completamente renderizado setTimeout(function() { if ($(".switch").length > 0) { console.log("Inicializando switches:", $(".switch").length); $(".switch").simpleSwitch(); // Forçar sincronização inicial de todos os switches setTimeout(function() { $(".switch").each(function() { let $this = $(this); if ($this.hasClass('simple-switch')) { let isChecked = $this.prop('checked'); if (isChecked) { $this.attr('data-switch', 'true'); $this.parent().removeClass('unchecked').addClass('checked'); } else { $this.attr('data-switch', 'false'); $this.parent().removeClass('checked').addClass('unchecked'); } } }); }, 100); } else { console.warn("Nenhum elemento .switch encontrado"); } }, 100); } } (function ($) { $.fn.extend({ simpleSwitch: function () { this.each(function () { var This = $(this); // Verificar se já foi inicializado if (This.hasClass("simple-switch") || This.parent().hasClass("simple-switch-outter")) { console.log("Switch já inicializado, ignorando"); return; } This.addClass("simple-switch"); var outerHTML = This.prop("outerHTML") , html = ""; html += ''; This.replaceWith(html); }); // Configurar eventos após todos os switches serem criados setTimeout(function() { $(".simple-switch").each(function () { var This = $(this); // Inicializar estado _switch(This); // Event listener para change (mais confiável que click) This.off('change').on('change', function () { _switch($(this)); }); // Adicionar MutationObserver para detectar mudanças programáticas no checkbox var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.type === 'attributes' && mutation.attributeName === 'checked') { // Usar setTimeout para garantir que o DOM foi atualizado setTimeout(function() { _switch(This); }, 0); } }); }); // Observar mudanças no atributo checked observer.observe(This[0], { attributes: true, attributeFilter: ['checked'] }); // Também observar mudanças via propriedade (não apenas atributo) This[0].addEventListener('click', function(e) { // Permitir que o click padrão aconteça primeiro setTimeout(function() { _switch(This); }, 0); }); var startPos = { x: 0, y: 0 } , currentPos = { x: 0, y: 0 }; var el = This.parent().find(".simple-switch-circle").get(0); if (!el) { console.warn("Círculo do switch não encontrado"); return; } el.addEventListener('touchstart', function (event) { startPos = { x: event.changedTouches[0].pageX, y: event.changedTouches[0].pageY }; }, false); el.addEventListener('touchmove', function (event) { event.preventDefault(); currentPos = { x: event.changedTouches[0].pageX, y: event.changedTouches[0].pageY }; }, false); el.addEventListener('touchend', function (event) { currentPos = { x: event.changedTouches[0].pageX, y: event.changedTouches[0].pageY }; if (currentPos.x != startPos.x) { This.prop("checked", !This.prop("checked")); This.trigger("change"); } startPos = { x: 0, y: 0 }, currentPos = { x: 0, y: 0 }; }, false); }); }, 50); function _switch($obj) { var This = $obj , isChecked = This.prop("checked"); // Forçar atualização do atributo para corresponder à propriedade if (isChecked) { This.attr("checked", "checked"); This.attr("data-switch", "true"); This.parent().removeClass("unchecked").addClass("checked"); } else { This.removeAttr("checked"); This.attr("data-switch", "false"); This.parent().removeClass("checked").addClass("unchecked"); } // Debug log console.log("Switch atualizado:", { checked: isChecked, classes: This.parent().attr("class") }); } } }); } )(jQuery);