Compare commits

..

No commits in common. "master" and "dbexport" have entirely different histories.

112 changed files with 15873 additions and 12732 deletions

View file

@ -3,110 +3,7 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [2.4.1] - 2024-01-31 ## [1.4.0]
### Changed
- Updated to Angular 17
- Updated to Node 20
## [2.4.0] - 2023-10-26
### Added
- Tip component
### Changed
- Added settings for tips, tax and VAT rates.
- Added fields for tips, tax and VAT to `order.model`
- Added a display of taxes to orders
- Added a tip display to receipts
## [2.3.1] - 2023-06-26
### Fixed
- Broken wallet link for invoices
## [2.3.0] - 2023-06-26
### Changed
- Modified order to handle new `token` field.
- Modified order service to query API using `token`.
- Modified receipt component to use the new `token`.
- Modified invoice component to use the new `token`.
- Modified payment service component to remove order-creation logic.
### Fixed
- Receipt prompt textarea is now read-only.
- Invoice prompt textarea is now read-only.
- Button text color is now correct for Invoice and Receipt.
## [2.2.0] - 2023-05-15
### Added
- New API calls for requesting language data for login page
### Changed
- Owner model modified to remove unnecessary fields
- Fullnode service uses `session` for API calls.
- User service uses `session` for API calls.
- Auth-guard service uses new `checkUser` function to confirm session exists and is validated.
### Fixed
- Business sign-up stepper skipping is corrected
## [2.1.0] - 2023-05-02
### Added
- New dialog to purchase sessions ahead of expiration.
## [2.0.0] - 2023-03-16
### Added
- Added the Xero invoice number in the memo for invoice payments.
### Changed
- Various look and feel changes to support the latest version of Angular.
### Fixed
- Correct display of translated phrases in various components.
## [2.0.0-beta] - 2023-02-23
### Added
- Service to request language tokens from server
### Changed
- Parametrization of text elements
## [1.4.1] - 2023-01-09
### Added
- Display app version
### Changed
- Copyright year
### Fixed
- Remove unnecessary logging in `fullnode.service.ts`.
## [1.4.0] - 2023-01-09
### Added ### Added
@ -155,14 +52,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
- Convenience buttons on checkout for wallets that are not ZIP-321-compliant - Convenience buttons on checkout for wallets that are not ZIP-321-compliant
- PmtService Component first alpha version ready for testing - PmtService Component first alpha version ready for testing
- Add `crmToken` field to `owner.model.ts`
- Add `externalInvoice` field and `shortCode` field to `order.model.ts`
### Fixed ### Fixed
- Memo for checkout orders - Memo for checkout orders
## [1.2.1] - 2022-08-01 ## [1.2.1] - 2022-08-01
### Changed ### Changed

View file

@ -1,7 +1,5 @@
# ZGo - The Zcash Register # ZGo - The Zcash Register
[![Please don't upload to GitHub](https://nogithub.codeberg.page/badge.svg)](https://nogithub.codeberg.page)
A Point-of-Sale application for accepting payments in [Zcash](https://z.cash/) A Point-of-Sale application for accepting payments in [Zcash](https://z.cash/)
Visit our [ZGo Homepage](https://zgo.cash/) for more details. Visit our [ZGo Homepage](https://zgo.cash/) for more details.

View file

@ -71,10 +71,10 @@
"builder": "@angular-devkit/build-angular:dev-server", "builder": "@angular-devkit/build-angular:dev-server",
"configurations": { "configurations": {
"production": { "production": {
"buildTarget": "zgo:build:production" "browserTarget": "zgo:build:production"
}, },
"development": { "development": {
"buildTarget": "zgo:build:development" "browserTarget": "zgo:build:development"
} }
}, },
"defaultConfiguration": "development" "defaultConfiguration": "development"
@ -82,7 +82,7 @@
"extract-i18n": { "extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n", "builder": "@angular-devkit/build-angular:extract-i18n",
"options": { "options": {
"buildTarget": "zgo:build" "browserTarget": "zgo:build"
} }
}, },
"test": { "test": {

View file

@ -1,829 +0,0 @@
"encode_id","view_name","view_element","view_element_text"
"br-US","business","business_accept_terms","Eu aceito os "
"br-US","business","business_addrs_nobiz","Não temos um negócio associado a este endereço Zcash, por favor insira suas informações abaixo:"
"br-US","business","business_biz_addressholder","Endereço"
"br-US","business","business_biz_addresslbl","Endereço:"
"br-US","business","business_biz_cityholder","Cidade"
"br-US","business","business_biz_citylbl","Cidade:"
"br-US","business","business_biz_countryholder","País"
"br-US","business","business_biz_countrylbl","País:"
"br-US","business","business_biz_info","Insira os dados da empresa"
"br-US","business","business_biz_mailholder","exemplo@dominio.com"
"br-US","business","business_biz_maillbl","E-mail"
"br-US","business","business_biz_nameholder","Nome da empresa"
"br-US","business","business_biz_namelbl","Nome da empresa:"
"br-US","business","business_biz_pcodeholder","Código Postal"
"br-US","business","business_biz_pcodelbl","Código postal:"
"br-US","business","business_biz_stateholder","Estado/Provincia"
"br-US","business","business_biz_statelbl","Estado/Provincia"
"br-US","business","business_biz_websiteholder","Website"
"br-US","business","business_biz_websitelbl","Website"
"br-US","business","business_contact_fnamelbl","Primeiro nome do contato:"
"br-US","business","business_contact_fnholder","Nome"
"br-US","business","business_contact_lnamelbl","Último sobrenome do contato:"
"br-US","business","business_contact_lnholder","Sobrenome "
"br-US","business","business_save_btn","Salvar"
"br-US","business","business_select_session","Selecione a duração da sessão que você necessita:"
"br-US","business","business_session_label","Sessão:"
"br-US","business","business_session_lengthlbl","Duração da sessão"
"br-US","business","business_session_paylbl","Pagar"
"br-US","business","business_signup_title","Inscrição de negócio"
"br-US","business","business_terms_ofuse","Termos de Uso"
"br-US","business","business_zgo_confirmlbl","ZGo confirma o seu pagamento"
"br-US","cancel","cancel_confirm_btn","Confirmar"
"br-US","cancel","cancel_dismiss_btn","Descartar"
"br-US","cancel","cancel_title","Cancelar"
"br-US","checkout","checkout_accept_btn","Aceitar"
"br-US","checkout","checkout_cant_scan","Não consegue escanear?"
"br-US","checkout","checkout_close_btn","Fechar"
"br-US","checkout","checkout_copyaddress_error","Erro ao copiar endereço"
"br-US","checkout","checkout_copyamount_error","Erro ao copiar o valor"
"br-US","checkout","checkout_copymemo_error","Erro ao copiar o memorando"
"br-US","checkout","checkout_copy_address","Copiar Endereço"
"br-US","checkout","checkout_copy_amount","Copiar Valor"
"br-US","checkout","checkout_copy_memo","Copiar Memo"
"br-US","checkout","checkout_copy_notavail","Funcionalidade de cópia não suportada!!"
"br-US","checkout","checkout_notserv_close","Fechar"
"br-US","checkout","checkout_notserv_error","Erro"
"br-US","checkout","checkout_scan_payment","Escaneie para fazer o pagamento"
"br-US","checkout","checkout_use_this","Use este/isso"
"br-US","checkout","checkout_wallet_link","link de carteira"
"br-US","checkout","checkout_wallet_or",", ou "
"br-US","dbexport","dbexport_btn_close","Cancelar"
"br-US","dbexport","dbexport_closed_no","Não"
"br-US","dbexport","dbexport_closed_yes","Sim"
"br-US","dbexport","dbexport_date_range","Intervalo de datas:"
"br-US","dbexport","dbexport_download_link","Download"
"br-US","dbexport","dbexport_end_date","Data de término"
"br-US","dbexport","dbexport_export_descrip","Exportar pedidos em um arquivo de formato .CSV"
"br-US","dbexport","dbexport_file_header","""Data"",""ID do pedido"",""Moeda"",""Fechado?"",""Valor"",""Taxa"",""ZEC"",""Pago?"",""Fatura"""
"br-US","dbexport","dbexport_invalid_end","Data final inválida"
"br-US","dbexport","dbexport_invalid_start","Data de início inválida"
"br-US","dbexport","dbexport_noorders_created","Você não tem pedidos criados."
"br-US","dbexport","dbexport_nothing_todo","Nada para fazer."
"br-US","dbexport","dbexport_paid_no","Não"
"br-US","dbexport","dbexport_paid_yes","Sim"
"br-US","dbexport","dbexport_settings_title","Exportar pedidos"
"br-US","dbexport","dbexport_start_date","Data de início"
"br-US","header","header_get_currency","Moeda:"
"br-US","header","header_last_block","Último Bloco:"
"br-US","invoice","invoice_cant_scan","Não consegue escanear?"
"br-US","invoice","invoice_copyaddress_error","Erro ao copiar endereço"
"br-US","invoice","invoice_copyamount_error","Erro ao copiar o valor"
"br-US","invoice","invoice_copymemo_error","Erro ao copiar o memorando"
"br-US","invoice","invoice_copy_address","Copiar Endereço"
"br-US","invoice","invoice_copy_amount","Copiar Valor"
"br-US","invoice","invoice_copy_memo","Copiar Memo"
"br-US","invoice","invoice_copy_notavail","Funcionalidade de cópia não suportada"
"br-US","invoice","invoice_dot_or",", ou"
"br-US","invoice","invoice_info_notavail","Não há informação disponível."
"br-US","invoice","invoice_invalid_id","ID do fatura incorreto."
"br-US","invoice","invoice_invoice_lbl","Fatura"
"br-US","invoice","invoice_invoice_total","Total da Fatura:"
"br-US","invoice","invoice_notserv_close","Fechar"
"br-US","invoice","invoice_notserv_error","Erro"
"br-US","invoice","invoice_order_date","Data: "
"br-US","invoice","invoice_order_id","ID do Pedido: "
"br-US","invoice","invoice_order_price","Preço "
"br-US","invoice","invoice_payment_confirmed","Pagamento Confirmado!!"
"br-US","invoice","invoice_payment_pending","Pagamento Pendente!!"
"br-US","invoice","invoice_qty_lbl","Qtde."
"br-US","invoice","invoice_return_toshop","Voltar à Loja"
"br-US","invoice","invoice_scan_qrcode","Escaneie o QR Code com sua carteira para efetuar o pagamento"
"br-US","invoice","invoice_use_this","Use isso "
"br-US","invoice","invoice_wallet_link","Link da Carteira"
"br-US","invoice","invoice_zcash_price","Preço da Zcash: "
"br-US","itemadd","itemadd_add_2order","Adicionar Item ao Pedido"
"br-US","itemadd","itemadd_cancel_btn","Cancelar"
"br-US","itemadd","itemadd_save_btn","Adicionar"
"br-US","itemcreate","itemcreate_add_item","Adicionar Item"
"br-US","itemcreate","itemcreate_close_btn","Fechar"
"br-US","itemcreate","itemcreate_item_descr","Descrição"
"br-US","itemcreate","itemcreate_item_lbl","Item"
"br-US","itemcreate","itemcreate_item_price","Preço"
"br-US","itemcreate","itemcreate_save_btn","Salvar"
"br-US","itemcreate","itemcreate_use_nums","Use apenas números"
"br-US","itemdel","itemdel_close_btn","Fechar"
"br-US","itemdel","itemdel_confirm_del","Tem certeza de que deseja apagar "
"br-US","itemdel","itemdel_delete_btn","Excluir"
"br-US","itemdel","itemdel_del_item","Excluir Item"
"br-US","itemedit","itemedit_close_btn","Fechar"
"br-US","itemedit","itemedit_edit_item","Editar Item"
"br-US","itemedit","itemedit_item_descr","Descrição "
"br-US","itemedit","itemedit_item_label","Item"
"br-US","itemedit","itemedit_item_price","Preço:"
"br-US","itemedit","itemedit_save_btn","Salvar"
"br-US","itemlist","itemlist_avail_items","Items disponíveis:"
"br-US","itemlist","itemlist_list_empty","Ainda não há itens"
"br-US","listorders","listorders_backtoshop_btn","Voltar a Loja"
"br-US","listorders","listorders_export_orders","Exportar Pedidos"
"br-US","listorders","listorders_invoice_btn","Fatura"
"br-US","listorders","listorders_item_lbl","Item"
"br-US","listorders","listorders_no_orders","Não há Pedidos"
"br-US","listorders","listorders_order_id","ID do Pedido"
"br-US","listorders","listorders_order_total","Total do Pedido:"
"br-US","listorders","listorders_overall_total","Total geral: "
"br-US","listorders","listorders_qty_lbl","Qtde."
"br-US","listorders","listorders_receipt_btn","Comprovante"
"br-US","listorders","listorders_todays_total","Total de hoje: "
"br-US","listorders","listorders_total_lbl","Total"
"br-US","login","login_check_wallet","Verifique sua carteira!!"
"br-US","login","login_confirm_login","ZGo confirma seu login na blockchain da Zcash"
"br-US","login","login_confirm_pin","Confirmar Senha"
"br-US","login","login_connect_to_zgo","Conecte sua carteira ao ZGo"
"br-US","login","login_enter_pin","Insira a senha enviada pela ZGo para confirmar a propriedade da carteira:"
"br-US","login","login_last_block","Último bloco visto:"
"br-US","login","login_link_wallet","Conecte sua carteira"
"br-US","login","login_wrong_pin","Senha incorreta!"
"br-US","main","main_price_data","Preços informados pela CoinGecko API"
"br-US","order","order_cancel_btn","Cancelar"
"br-US","order","order_cancel_ok","Pedido cancelado com sucesso!"
"br-US","order","order_cancel_order","Cancelar o pedido?"
"br-US","order","order_checkout_btn","Procesar"
"br-US","order","order_confirm_cancel","Tem certeza que deseja cancelar o pedido?"
"br-US","order","order_confirm_remove","Tem certeza que deseja remover <<"
"br-US","order","order_confirm_remove1"," deste pedido?"
"br-US","order","order_invoice_btn","Fatura"
"br-US","order","order_item_lbl","Item"
"br-US","order","order_notserv_close","Fechar"
"br-US","order","order_notserv_success","succeso"
"br-US","order","order_no_openorder","Sem pedido aberto!!"
"br-US","order","order_qty_lbl","Qtde."
"br-US","order","order_remove_item","Remover o Item?"
"br-US","order","order_total_lbl","Total"
"br-US","order","order_total_title","Total do Pedido:"
"br-US","pmtservice","pmtservice_amount_doesnot","O Valor não"
"br-US","pmtservice","pmtservice_cant_scan","Não consegue escanear?"
"br-US","pmtservice","pmtservice_connecto_xero","Conexão para o Xero"
"br-US","pmtservice","pmtservice_copyaddress_error","Erro ao copiar endereço"
"br-US","pmtservice","pmtservice_copyamount_error","Erro ao copiar o valor"
"br-US","pmtservice","pmtservice_copymemo_error","Erro ao copiar o memorando"
"br-US","pmtservice","pmtservice_copy_address","Copiar Endereço"
"br-US","pmtservice","pmtservice_copy_amount","Copiar Valor"
"br-US","pmtservice","pmtservice_copy_memo","Copiar Memo"
"br-US","pmtservice","pmtservice_copy_notavail","Funcionalidade de cópia não suportada"
"br-US","pmtservice","pmtservice_currency_notsup","não suportada!!"
"br-US","pmtservice","pmtservice_enabled_for","habilitado para"
"br-US","pmtservice","pmtservice_hdr_txt1","Fatura"
"br-US","pmtservice","pmtservice_hdr_txt2","ID do Pedido: "
"br-US","pmtservice","pmtservice_hdr_txt3","Data: "
"br-US","pmtservice","pmtservice_invalid_ownerid","ID do proprietário inválido!!"
"br-US","pmtservice","pmtservice_invoice_currency","Moeda"
"br-US","pmtservice","pmtservice_invoice_invalid","tipo inválido!!"
"br-US","pmtservice","pmtservice_invoice_item","Item:"
"br-US","pmtservice","pmtservice_invoice_notfound","não encontrada!!"
"br-US","pmtservice","pmtservice_invoice_num","Fatura"
"br-US","pmtservice","pmtservice_invoice_paid","já pago!!"
"br-US","pmtservice","pmtservice_invoice_price","Preço"
"br-US","pmtservice","pmtservice_invoice_qty","Qtde."
"br-US","pmtservice","pmtservice_invoice_total","Total da Fatura:"
"br-US","pmtservice","pmtservice_match_value","corresponde ao valor"
"br-US","pmtservice","pmtservice_notserv_close","Fechar"
"br-US","pmtservice","pmtservice_notserv_error","Erro"
"br-US","pmtservice","pmtservice_payment_confirmed","Pagamento Confirmado!!"
"br-US","pmtservice","pmtservice_payment_notprocessed","Pedido de pagamento não foi processado!!"
"br-US","pmtservice","pmtservice_payment_pending","Pagamento Pendente!!"
"br-US","pmtservice","pmtservice_pmtsrv_not","Serviço de pagamento não"
"br-US","pmtservice","pmtservice_reported_byxero","reportado por Xero!!"
"br-US","pmtservice","pmtservice_scan_qrcode","Escaneie o QR Code com sua carteira para efetuar o pagamento"
"br-US","pmtservice","pmtservice_server_failed","servidor falhou!!"
"br-US","pmtservice","pmtservice_use_this","Use isso"
"br-US","pmtservice","pmtservice_wallet_link","Link da Carteira"
"br-US","pmtservice","pmtservice_zecdata_price","Preço da Zcash:"
"br-US","pmtservice","pmtservice_zecdata_total","Total: "
"br-US","promptinvoice","promptinvoice_func_notavail","Funcionalidade não disponível para o seu navegador. Use o botão enviar ao invés disso"
"br-US","promptinvoice","promptinvoice_invoice_cancel","Cancelar"
"br-US","promptinvoice","promptinvoice_invoice_clipboard","URL da fatura copiado para a área de transferência!!"
"br-US","promptinvoice","promptinvoice_invoice_sent","Enviado!"
"br-US","promptinvoice","promptinvoice_invoice_url","URL da Fatura:"
"br-US","promptinvoice","promptinvoice_notserv_close","Fechar"
"br-US","promptinvoice","promptinvoice_notserv_error","Erro"
"br-US","promptinvoice","promptinvoice_notserv_success","Suceso"
"br-US","promptinvoice","promptinvoice_send_link","Envie o link da fatura para o seu cliente:"
"br-US","promptreceipt","promptreceipt_close_lbl","Fechar"
"br-US","promptreceipt","promptreceipt_func_notavail","Funcionalidade não disponível para o seu navegador. Use o botão Enviar"
"br-US","promptreceipt","promptreceipt_notserv_close","Fechar"
"br-US","promptreceipt","promptreceipt_notserv_error","Erro"
"br-US","promptreceipt","promptreceipt_notserv_success","Sucesso"
"br-US","promptreceipt","promptreceipt_receipt_clipboard","URL do comprovante foi copiado para a área de transferência!!"
"br-US","promptreceipt","promptreceipt_receipt_url","URL do comprovante:"
"br-US","promptreceipt","promptreceipt_send_link","Envie o link do comprovante para o seu cliente:"
"br-US","receipt","receipt_info_notavail","Não há informação disponível."
"br-US","receipt","receipt_invalid_id","ID do comprovante incorreto."
"br-US","receipt","receipt_order_date","Data:"
"br-US","receipt","receipt_order_id","ID do Pedido:"
"br-US","receipt","receipt_order_price","Preço:"
"br-US","receipt","receipt_order_total","Total:"
"br-US","receipt","receipt_qty_lbl","Qtde."
"br-US","receipt","receipt_receipt_lbl","Comprovante"
"br-US","receipt","receipt_zcash_price","Preço da Zcash:"
"br-US","receiptqr","receiptqr_close_btn","Fechar"
"br-US","receiptqr","receiptqr_scan_receipt","Escaneie para o seu comprovante"
"br-US","scan","scan_close_btn","Fechar"
"br-US","scan","scan_copy_address","Copiar Endereço"
"br-US","scan","scan_copy_amount","Copiar Valor"
"br-US","scan","scan_copy_error","Falha ao copiar o valor"
"br-US","scan","scan_copy_memo","Copiar Memo"
"br-US","scan","scan_fail_payment","Erro ao verificar o pagamento"
"br-US","scan","scan_func_notavail","Funcionalidade de cópia não suportada"
"br-US","scan","scan_memo_sent","Memorando enviado!"
"br-US","scan","scan_notserv_close","Fechar"
"br-US","scan","scan_notserv_error","Erro"
"br-US","scan","scan_scanqr_code","Scanei o QR Code"
"br-US","scan","scan_text_info","Certifique-se de selecionar ""Incluir Responder-A"" na sua carteira antes de enviar o seu memorando."
"br-US","scan","scan_use_this","Não consegue escanear ? Use isso"
"br-US","scan","scan_wallet_link","Link de carteira"
"br-US","settings","settings_acode_invalid","Número da Conta inválido (10 caracteres no máximo)"
"br-US","settings","settings_acode_lbl","Número da conta:"
"br-US","settings","settings_acode_notsaved","Número da Conta não salvo!!"
"br-US","settings","settings_acode_saved","Número da conta Salvo!!"
"br-US","settings","settings_close_btn","Cancelar"
"br-US","settings","settings_confirm_payments","Confirmar pagamentos?"
"br-US","settings","settings_copy_notavail","Funcionalidade não disponível para o seu navegador. Use o botão enviar ao invés disso"
"br-US","settings","settings_currency_lbl","Moeda"
"br-US","settings","settings_link_2xero","Conectar-se ao Xero"
"br-US","settings","settings_name_lbl","Nome"
"br-US","settings","settings_name_placeholder","Seu nome"
"br-US","settings","settings_notserv_close","Fechar"
"br-US","settings","settings_notserv_error","Erro"
"br-US","settings","settings_notserv_success","Sucesso"
"br-US","settings","settings_notserv_warning","Aviso"
"br-US","settings","settings_ownerid_copied","ID do proprietário copiado para a prancheta"
"br-US","settings","settings_ownerid_notcopied","Cópia não disponível em seu navegador"
"br-US","settings","settings_pmtserv_url","URL de Serviço de Pagamento:"
"br-US","settings","settings_relink_2xero","Reconectar-se ao Xero "
"br-US","settings","settings_save_btn","Salvar"
"br-US","settings","settings_tab_integrations","Integrações"
"br-US","settings","settings_tab_mainlbl","Principal"
"br-US","settings","settings_url_copied","URL ZGo copiado para a prancheta!!"
"br-US","settings","settings_use_satoshi","Usar zatoshis?"
"br-US","settings","settings_view_title","Definições"
"br-US","settings","settings_vkey_lbl","Chave de visualização"
"br-US","settings","settings_vkey_placeholder","Sua chave de visualização da carteira"
"br-US","settings","settings_wctoken_copied","Token WooCommerce copiado para a prancheta"
"br-US","settings","settings_wctoken_generated","Token da WoCommerce gerado"
"br-US","settings","settings_wctoken_genfail","Geração do token da WooCommerce falhou"
"br-US","settings","settings_wctoken_notcopied","Cópia não disponível no seu navegador"
"br-US","settings","settings_wc_closebtn","Fechar"
"br-US","settings","settings_wc_gentoken","Gerar Token"
"br-US","settings","settings_wc_lbl","WooCommerce"
"br-US","settings","settings_wc_ownerlbl","Proprietário:"
"br-US","settings","settings_xeropmt_confirmdis","Confirmação de pagamentos Xero desativada!! "
"br-US","settings","settings_xero_closebtn","Fechar"
"br-US","settings","settings_xero_lbl","Xero"
"br-US","settings","settings_xero_savebtn","Salvar código"
"br-US","viewer","viewer_view_orders","Ver Pedidos"
"br-US","xero","xero_connected_2xero","Conectado ao Xero!"
"br-US","xero","xero_connecting_2xero","Conectando ao Xero.."
"en-US","business","business_accept_terms","I accept the "
"en-US","business","business_addrs_nobiz","We do not have a business associated with this Zcash address, please enter your information below:"
"en-US","business","business_biz_addressholder","Address"
"en-US","business","business_biz_addresslbl","Address:"
"en-US","business","business_biz_cityholder","City"
"en-US","business","business_biz_citylbl","City:"
"en-US","business","business_biz_countryholder","Country"
"en-US","business","business_biz_countrylbl","Country:"
"en-US","business","business_biz_info","Provide business info"
"en-US","business","business_biz_mailholder","example@domain.com"
"en-US","business","business_biz_maillbl","E-mail:"
"en-US","business","business_biz_nameholder","Business name"
"en-US","business","business_biz_namelbl","Business Name:"
"en-US","business","business_biz_pcodeholder","Postal code"
"en-US","business","business_biz_pcodelbl","Postal Code:"
"en-US","business","business_biz_stateholder","State or Province"
"en-US","business","business_biz_statelbl","State/Province:"
"en-US","business","business_biz_websiteholder","website"
"en-US","business","business_biz_websitelbl","Website:"
"en-US","business","business_contact_fnamelbl","Contact First name:"
"en-US","business","business_contact_fnholder","First name"
"en-US","business","business_contact_lnamelbl","Contact Last Name:"
"en-US","business","business_contact_lnholder","Last Name"
"en-US","business","business_save_btn","Save"
"en-US","business","business_select_session ","Please select the length of session that you need:"
"en-US","business","business_session_label","Session:"
"en-US","business","business_session_lengthlbl","Session Length"
"en-US","business","business_session_paylbl","Pay"
"en-US","business","business_signup_title","Business sign-up"
"en-US","business","business_terms_ofuse","Terms of Use"
"en-US","business","business_zgo_confirmlbl","ZGo confirms your payment"
"en-US","cancel","cancel_confirm_btn","Confirm"
"en-US","cancel","cancel_dismiss_btn","Dismiss"
"en-US","cancel","cancel_title","Cancel"
"en-US","checkout","checkout_accept_btn","Accept"
"en-US","checkout","checkout_cant_scan","Can't scan?"
"en-US","checkout","checkout_close_btn","Close"
"en-US","checkout","checkout_copyaddress_error","Error copying address"
"en-US","checkout","checkout_copyamount_error","Error while copying ammount"
"en-US","checkout","checkout_copymemo_error","Error while copying Memo"
"en-US","checkout","checkout_copy_address","Copy Address"
"en-US","checkout","checkout_copy_amount","Copy Amount"
"en-US","checkout","checkout_copy_memo","Copy Memo"
"en-US","checkout","checkout_copy_notavail","Copy functionality not supported!!"
"en-US","checkout","checkout_notserv_close","Close"
"en-US","checkout","checkout_notserv_error","Error"
"en-US","checkout","checkout_scan_payment","Scan to make payment"
"en-US","checkout","checkout_use_this","Use this "
"en-US","checkout","checkout_wallet_link","wallet link"
"en-US","checkout","checkout_wallet_or",", or "
"en-US","dbexport","dbexport_btn_close","Cancel"
"en-US","dbexport","dbexport_closed_no","No"
"en-US","dbexport","dbexport_closed_yes","Yes"
"en-US","dbexport","dbexport_date_range","Date Range:"
"en-US","dbexport","dbexport_download_link","Download"
"en-US","dbexport","dbexport_end_date","End date"
"en-US","dbexport","dbexport_export_descrip","Export orders in a .CSV format file"
"en-US","dbexport","dbexport_file_header","""Date"",""Order ID"",""Currency"",""Closed?"",""Amount"",""Rate"",""ZEC"",""Paid?"",""Invoice"""
"en-US","dbexport","dbexport_invalid_end","Invalid end date"
"en-US","dbexport","dbexport_invalid_start","Invalid start date"
"en-US","dbexport","dbexport_noorders_created","You have no orders created."
"en-US","dbexport","dbexport_nothing_todo","Nothing to do."
"en-US","dbexport","dbexport_paid_no","No"
"en-US","dbexport","dbexport_paid_yes","Yes"
"en-US","dbexport","dbexport_settings_title","Export Orders"
"en-US","dbexport","dbexport_start_date","Start date"
"en-US","header","header_get_currency","Currency:"
"en-US","header","header_last_block","Last Block:"
"en-US","invoice","invoice_cant_scan","Can't scan?"
"en-US","invoice","invoice_copyaddress_error","Error while copying address"
"en-US","invoice","invoice_copyamount_error","Error while copying amount"
"en-US","invoice","invoice_copymemo_error","Error while copying Memo"
"en-US","invoice","invoice_copy_address","Copy Address"
"en-US","invoice","invoice_copy_amount","Copy Amount"
"en-US","invoice","invoice_copy_memo","Copy Memo"
"en-US","invoice","invoice_copy_notavail","Copy functionality not supported"
"en-US","invoice","invoice_dot_or",", or"
"en-US","invoice","invoice_info_notavail","No information available."
"en-US","invoice","invoice_invalid_id","Incorrect Invoice ID."
"en-US","invoice","invoice_invoice_lbl","Invoice"
"en-US","invoice","invoice_invoice_total","Invoice Total: "
"en-US","invoice","invoice_notserv_close","Close"
"en-US","invoice","invoice_notserv_error","Error"
"en-US","invoice","invoice_order_date","Date: "
"en-US","invoice","invoice_order_id","Order ID: "
"en-US","invoice","invoice_order_price","Price "
"en-US","invoice","invoice_payment_confirmed","Payment Confirmed!!"
"en-US","invoice","invoice_payment_pending","Payment Pending!!"
"en-US","invoice","invoice_qty_lbl","Qty."
"en-US","invoice","invoice_return_toshop","Return to Shop"
"en-US","invoice","invoice_scan_qrcode","Scan the QR code with your wallet to make payment"
"en-US","invoice","invoice_use_this","Use this "
"en-US","invoice","invoice_wallet_link","wallet link"
"en-US","invoice","invoice_zcash_price","Zcash price: "
"en-US","itemadd","itemadd_add_2order","Add Item to Order"
"en-US","itemadd","itemadd_cancel_btn","Cancel"
"en-US","itemadd","itemadd_save_btn","Add"
"en-US","itemcreate","itemcreate_add_item","Add Item"
"en-US","itemcreate","itemcreate_close_btn","Close"
"en-US","itemcreate","itemcreate_item_descr","Description"
"en-US","itemcreate","itemcreate_item_lbl","Item"
"en-US","itemcreate","itemcreate_item_price","Price"
"en-US","itemcreate","itemcreate_save_btn","Save"
"en-US","itemcreate","itemcreate_use_nums","Use only numbers"
"en-US","itemdel","itemdel_close_btn","Close"
"en-US","itemdel","itemdel_confirm_del","Are you sure you want to delete "
"en-US","itemdel","itemdel_delete_btn","Delete"
"en-US","itemdel","itemdel_del_item","Delete Item"
"en-US","itemedit","itemedit_close_btn","Close"
"en-US","itemedit","itemedit_edit_item","Edit Item"
"en-US","itemedit","itemedit_item_descr","Description"
"en-US","itemedit","itemedit_item_label","Item"
"en-US","itemedit","itemedit_item_price","Price:"
"en-US","itemedit","itemedit_save_btn","Save"
"en-US","itemlist","itemlist_avail_items","Available Items:"
"en-US","itemlist","itemlist_list_empty","No items yet!"
"en-US","listorders","listorders_backtoshop_btn","Back to Shop"
"en-US","listorders","listorders_export_orders","Export Orders"
"en-US","listorders","listorders_invoice_btn","Invoice"
"en-US","listorders","listorders_item_lbl","Item"
"en-US","listorders","listorders_no_orders","No orders"
"en-US","listorders","listorders_order_id","Order ID"
"en-US","listorders","listorders_order_total","Order Total: "
"en-US","listorders","listorders_overall_total","Overall Total: "
"en-US","listorders","listorders_qty_lbl","Qty."
"en-US","listorders","listorders_receipt_btn","Receipt"
"en-US","listorders","listorders_todays_total","Today's Total: "
"en-US","listorders","listorders_total_lbl","Total"
"en-US","login","login_check_wallet","Check your wallet!!"
"en-US","login","login_confirm_login","ZGo confirms your login on the Zcash blockhain"
"en-US","login","login_confirm_pin","Confirm PIN"
"en-US","login","login_connect_to_zgo","Connect your wallet to ZGo"
"en-US","login","login_enter_pin","Enter the PIN sent by ZGo to confirm wallet ownership:"
"en-US","login","login_last_block","Last block seen:"
"en-US","login","login_link_wallet","Link Wallet"
"en-US","login","login_wrong_pin","Wrong PIN!!"
"en-US","main","main_price_data","Price data provided by CoinGecko API"
"en-US","order","order_cancel_btn","Cancel"
"en-US","order","order_cancel_ok","Order successfully cancelled!"
"en-US","order","order_cancel_order","Cancel Order?"
"en-US","order","order_checkout_btn","Checkout"
"en-US","order","order_confirm_cancel","Are you sure you want to cancel the order?"
"en-US","order","order_confirm_remove","Are you sure you want to remove "
"en-US","order","order_confirm_remove1","  from this order?"
"en-US","order","order_invoice_btn","Invoice"
"en-US","order","order_item_lbl","Item"
"en-US","order","order_notserv_close","Close"
"en-US","order","order_notserv_success","success"
"en-US","order","order_no_openorder","No open order!!"
"en-US","order","order_qty_lbl","Qty."
"en-US","order","order_remove_item","Remove Item?"
"en-US","order","order_total_lbl","Total"
"en-US","order","order_total_title","Order Total:"
"en-US","pmtservice","pmtservice_amount_doesnot","Amount does not"
"en-US","pmtservice","pmtservice_cant_scan","Can't scan?"
"en-US","pmtservice","pmtservice_connecto_xero","Connection to Xero"
"en-US","pmtservice","pmtservice_copyaddress_error","Error while copying address"
"en-US","pmtservice","pmtservice_copyamount_error","Error while copying amount"
"en-US","pmtservice","pmtservice_copymemo_error","Error while copying Memo"
"en-US","pmtservice","pmtservice_copy_address","Copy Address"
"en-US","pmtservice","pmtservice_copy_amount","Copy Amount"
"en-US","pmtservice","pmtservice_copy_memo","Copy Memo"
"en-US","pmtservice","pmtservice_copy_notavail","Copy functionality not supported"
"en-US","pmtservice","pmtservice_currency_notsup","not supported!!"
"en-US","pmtservice","pmtservice_enabled_for","enabled for"
"en-US","pmtservice","pmtservice_hdr_txt1","Invoice"
"en-US","pmtservice","pmtservice_hdr_txt2","Order ID: "
"en-US","pmtservice","pmtservice_hdr_txt3","Date: "
"en-US","pmtservice","pmtservice_invalid_ownerid","Invalid Owner ID!!"
"en-US","pmtservice","pmtservice_invoice_currency","Currency"
"en-US","pmtservice","pmtservice_invoice_invalid","type invalid!!"
"en-US","pmtservice","pmtservice_invoice_item","Item:"
"en-US","pmtservice","pmtservice_invoice_notfound","not found!!"
"en-US","pmtservice","pmtservice_invoice_num","Invoice"
"en-US","pmtservice","pmtservice_invoice_paid","already paid!!"
"en-US","pmtservice","pmtservice_invoice_price","Price"
"en-US","pmtservice","pmtservice_invoice_qty","Qty."
"en-US","pmtservice","pmtservice_invoice_total","Invoice Total: "
"en-US","pmtservice","pmtservice_match_value","match value"
"en-US","pmtservice","pmtservice_notserv_close","Close"
"en-US","pmtservice","pmtservice_notserv_error","Error"
"en-US","pmtservice","pmtservice_payment_confirmed","Payment Confirmed!!"
"en-US","pmtservice","pmtservice_payment_notprocessed","Payment request was not processed!!"
"en-US","pmtservice","pmtservice_payment_pending","Payment Pending!!"
"en-US","pmtservice","pmtservice_pmtsrv_not","Payment service not"
"en-US","pmtservice","pmtservice_reported_byxero","reported by Xero!!"
"en-US","pmtservice","pmtservice_scan_qrcode","Scan the QR code with your wallet to make payment"
"en-US","pmtservice","pmtservice_server_failed","server failed!!"
"en-US","pmtservice","pmtservice_use_this","Use this "
"en-US","pmtservice","pmtservice_wallet_link","wallet link"
"en-US","pmtservice","pmtservice_zecdata_price","Zcash Price: "
"en-US","pmtservice","pmtservice_zecdata_total","Total: "
"en-US","promptinvoice","promptinvoice_func_notavail","Functionality not available for your browser. Use send button instead."
"en-US","promptinvoice","promptinvoice_invoice_cancel","Cancel"
"en-US","promptinvoice","promptinvoice_invoice_clipboard","Invoice's URL copied to Clipboard!!"
"en-US","promptinvoice","promptinvoice_invoice_sent","Sent!"
"en-US","promptinvoice","promptinvoice_invoice_url","Invoice URL:"
"en-US","promptinvoice","promptinvoice_notserv_close","Close"
"en-US","promptinvoice","promptinvoice_notserv_error","Error"
"en-US","promptinvoice","promptinvoice_notserv_success","Success"
"en-US","promptinvoice","promptinvoice_send_link","Send the invoice link to your client:"
"en-US","promptreceipt","promptreceipt_close_lbl","Close"
"en-US","promptreceipt","promptreceipt_func_notavail","Functionality not available for your browser. Use send button "
"en-US","promptreceipt","promptreceipt_notserv_close","Close"
"en-US","promptreceipt","promptreceipt_notserv_error","Error"
"en-US","promptreceipt","promptreceipt_notserv_success","Success"
"en-US","promptreceipt","promptreceipt_receipt_clipboard","Receipt's URL copied to Clipboard!!"
"en-US","promptreceipt","promptreceipt_receipt_url","Receipt URL:"
"en-US","promptreceipt","promptreceipt_send_link","Send the receipt link to your client:"
"en-US","receipt","receipt_info_notavail","No information available."
"en-US","receipt","receipt_invalid_id","Incorrect receipt ID."
"en-US","receipt","receipt_order_date","Date: "
"en-US","receipt","receipt_order_id","Order ID: "
"en-US","receipt","receipt_order_price","Price: "
"en-US","receipt","receipt_order_total","Total: "
"en-US","receipt","receipt_qty_lbl","Qty."
"en-US","receipt","receipt_receipt_lbl","Receipt"
"en-US","receipt","receipt_zcash_price","Zcash Price: "
"en-US","receiptqr","receiptqr_close_btn","Close"
"en-US","receiptqr","receiptqr_scan_receipt","Scan for your Receipt"
"en-US","scan","scan_close_btn","Close"
"en-US","scan","scan_copy_address","Copy Address"
"en-US","scan","scan_copy_amount","Copy Amount"
"en-US","scan","scan_copy_error","Error while copying ammount"
"en-US","scan","scan_copy_memo","Copy Memo"
"en-US","scan","scan_fail_payment","Error while verifying payment"
"en-US","scan","scan_func_notavail","Copy functionality not supported"
"en-US","scan","scan_memo_sent","Memo Sent!"
"en-US","scan","scan_notserv_close","Close"
"en-US","scan","scan_notserv_error","Error"
"en-US","scan","scan_scanqr_code","Scan the QR code"
"en-US","scan","scan_text_info","Ensure to check the ""Include Reply-To"" box in your wallet before sending your memo."
"en-US","scan","scan_use_this","Can't scan? Use this "
"en-US","scan","scan_wallet_link","wallet link"
"en-US","settings","settings_acode_invalid","Invalid Account code (10 chars max.)"
"en-US","settings","settings_acode_lbl","Account Code:"
"en-US","settings","settings_acode_notsaved","Account Code not saved"
"en-US","settings","settings_acode_saved","Account Code saved!!"
"en-US","settings","settings_close_btn","Cancel"
"en-US","settings","settings_confirm_payments","Confirm payments?"
"en-US","settings","settings_copy_notavail","Functionality not available for your browser. Use send button instead."
"en-US","settings","settings_currency_lbl","Currency"
"en-US","settings","settings_link_2xero","Link to Xero"
"en-US","settings","settings_name_lbl","Name"
"en-US","settings","settings_name_placeholder","Your Name"
"en-US","settings","settings_notserv_close","Close"
"en-US","settings","settings_notserv_error","Error"
"en-US","settings","settings_notserv_success","Success"
"en-US","settings","settings_notserv_warning","Warning"
"en-US","settings","settings_ownerid_copied","Owner ID copied to clipboard"
"en-US","settings","settings_ownerid_notcopied","Copying not available in your browser"
"en-US","settings","settings_pmtserv_url","Payment Service URL:"
"en-US","settings","settings_relink_2xero","Relink to Xero"
"en-US","settings","settings_save_btn","Save"
"en-US","settings","settings_tab_integrations","Integrations"
"en-US","settings","settings_tab_mainlbl","Main"
"en-US","settings","settings_URL_copied","ZGo URL copied to Clipboard!!"
"en-US","settings","settings_use_satoshi","Use zatoshis?"
"en-US","settings","settings_view_title","Settings"
"en-US","settings","settings_vkey_lbl","Viewing key"
"en-US","settings","settings_vkey_placeholder","Your wallet viewing key"
"en-US","settings","settings_wctoken_copied","WooCommerce Token copied to clipboard"
"en-US","settings","settings_wctoken_generated","WooCommerce Token generated!"
"en-US","settings","settings_wctoken_genfail","WooCommerce Token generation failed"
"en-US","settings","settings_wctoken_notcopied","Copying not available in your browser"
"en-US","settings","settings_wc_closebtn","Close"
"en-US","settings","settings_wc_gentoken","Generate Token"
"en-US","settings","settings_wc_lbl","WooCommerce"
"en-US","settings","settings_wc_ownerlbl","Owner:"
"en-US","settings","settings_xeropmt_confirmdis","Xero Payment confirmation disabled!!"
"en-US","settings","settings_xero_closebtn","Close"
"en-US","settings","settings_xero_lbl","Xero"
"en-US","settings","settings_xero_savebtn","Save Code"
"en-US","viewer","viewer_view_orders","View Orders"
"en-US","xero","xero_connected_2xero","Connected to Xero!"
"en-US","xero","xero_connecting_2xero","Connecting to Xero.."
"es-US","business","business_accept_terms","Acepto los "
"es-US","business","business_addrs_nobiz","No tenemos un negocio asociado a esta dirección de Zcash, por favor ingrese su información abajo:"
"es-US","business","business_biz_addressholder","Dirección"
"es-US","business","business_biz_addresslbl","Dirección:"
"es-US","business","business_biz_cityholder","Ciudad"
"es-US","business","business_biz_citylbl","Ciudad:"
"es-US","business","business_biz_countryholder","País"
"es-US","business","business_biz_countrylbl","País:"
"es-US","business","business_biz_info","Ingrese datos del negocio"
"es-US","business","business_biz_mailholder","ejemplo@dominio.com"
"es-US","business","business_biz_maillbl","E-mail:"
"es-US","business","business_biz_nameholder","Nombre del negocio"
"es-US","business","business_biz_namelbl","Nombre del Negocio:"
"es-US","business","business_biz_pcodeholder","Código Postal"
"es-US","business","business_biz_pcodelbl","Código Postal:"
"es-US","business","business_biz_stateholder","Estado o Provincia"
"es-US","business","business_biz_statelbl","Estado/Provincia:"
"es-US","business","business_biz_websiteholder","Sitio web"
"es-US","business","business_biz_websitelbl","Sitio Web:"
"es-US","business","business_contact_fnamelbl","Nombre del Contacto:"
"es-US","business","business_contact_fnholder","Nombre"
"es-US","business","business_contact_lnamelbl","Apellido del Contacto:"
"es-US","business","business_contact_lnholder","Apellido"
"es-US","business","business_save_btn","Salvar"
"es-US","business","business_select_session","Seleccione la duración de la sessión que necesita:"
"es-US","business","business_session_label","Sesión:"
"es-US","business","business_session_lengthlbl","Duración de la Sesión"
"es-US","business","business_session_paylbl","Pagar"
"es-US","business","business_signup_title","Registrar Negocio"
"es-US","business","business_terms_ofuse","Términos de Uso"
"es-US","business","business_zgo_confirmlbl","ZGo confirma su pago"
"es-US","cancel","cancel_confirm_btn","Confirmar"
"es-US","cancel","cancel_dismiss_btn","Descartar"
"es-US","cancel","cancel_title","Cancelar"
"es-US","checkout","checkout_accept_btn","Aceptar"
"es-US","checkout","checkout_cant_scan","No puede escanear?"
"es-US","checkout","checkout_close_btn","Cerrar"
"es-US","checkout","checkout_copyaddress_error","Error al copiar dirección"
"es-US","checkout","checkout_copyamount_error","Error al copiar el valor"
"es-US","checkout","checkout_copymemo_error","Error al copiar Memo"
"es-US","checkout","checkout_copy_address","Copiar Dirección"
"es-US","checkout","checkout_copy_amount","Copie Valor"
"es-US","checkout","checkout_copy_memo","Copie Valor"
"es-US","checkout","checkout_copy_notavail","Fucionalidad de copia no soportada!!"
"es-US","checkout","checkout_notserv_close","Cerrar"
"es-US","checkout","checkout_notserv_error","Error"
"es-US","checkout","checkout_scan_payment","Escanee para hacer el pago"
"es-US","checkout","checkout_use_this","Use este "
"es-US","checkout","checkout_wallet_link","link a billetera"
"es-US","checkout","checkout_wallet_or",", o "
"es-US","dbexport","dbexport_btn_close","Cancelar"
"es-US","dbexport","dbexport_closed_no","No"
"es-US","dbexport","dbexport_closed_yes","Si"
"es-US","dbexport","dbexport_date_range","Rango de Fechas:"
"es-US","dbexport","dbexport_download_link","Descargar"
"es-US","dbexport","dbexport_end_date","Fecha final"
"es-US","dbexport","dbexport_export_descrip","Exportar órdenes en un archivo de formato .CSV"
"es-US","dbexport","dbexport_file_header","""Fecha"",""ID Orden"",""Moneda"",""Cerrada?"",""Valor"",""Tasa"",""ZEC"",""Pagada?"",""Factura"""
"es-US","dbexport","dbexport_invalid_end","Fecha final inválida"
"es-US","dbexport","dbexport_invalid_start","Fecha de inicio inválida"
"es-US","dbexport","dbexport_noorders_created","Usted no tiene órdenes creadas."
"es-US","dbexport","dbexport_nothing_todo","Nada que hacer."
"es-US","dbexport","dbexport_paid_no","No"
"es-US","dbexport","dbexport_paid_yes","Si"
"es-US","dbexport","dbexport_settings_title","Exportar Ordenes"
"es-US","dbexport","dbexport_start_date","Fecha inicial"
"es-US","header","header_get_currency","Moneda:"
"es-US","header","header_last_block","Último Bloque:"
"es-US","invoice","invoice_cant_scan","No puede escanear?"
"es-US","invoice","invoice_copyaddress_error","Error al copiar dirección"
"es-US","invoice","invoice_copyamount_error","Error al copiar valor"
"es-US","invoice","invoice_copymemo_error","Error al copiar Memo"
"es-US","invoice","invoice_copy_address","Copie Dirección"
"es-US","invoice","invoice_copy_amount","Copiar Valor"
"es-US","invoice","invoice_copy_memo","Copiar Memo"
"es-US","invoice","invoice_copy_notavail","Funcionalidad para copia no soportada"
"es-US","invoice","invoice_dot_or",", o"
"es-US","invoice","invoice_info_notavail","No hay información disponible."
"es-US","invoice","invoice_invalid_id","ID de Factura incorrecto."
"es-US","invoice","invoice_invoice_lbl","Factura"
"es-US","invoice","invoice_invoice_total","Total Factura: "
"es-US","invoice","invoice_notserv_close","Cerrar"
"es-US","invoice","invoice_notserv_error","Error"
"es-US","invoice","invoice_order_date","Fecha: "
"es-US","invoice","invoice_order_id","ID del Pedido: "
"es-US","invoice","invoice_order_price","Precio "
"es-US","invoice","invoice_payment_confirmed","Pago Confirmado!!"
"es-US","invoice","invoice_payment_pending","Pago Pendiente!!"
"es-US","invoice","invoice_qty_lbl","Cant."
"es-US","invoice","invoice_return_toshop","Regresar a Tienda"
"es-US","invoice","invoice_scan_qrcode","Escanee el código QR con su billetera para hacer el pago"
"es-US","invoice","invoice_use_this","Use este "
"es-US","invoice","invoice_wallet_link","link de billetera"
"es-US","invoice","invoice_zcash_price","Precio de Zcash: "
"es-US","itemadd","itemadd_add_2order","Agregar Item a la orden"
"es-US","itemadd","itemadd_cancel_btn","Cancelar"
"es-US","itemadd","itemadd_save_btn","Agregar"
"es-US","itemcreate","itemcreate_add_item","Agregar Item"
"es-US","itemcreate","itemcreate_close_btn","Cerrar"
"es-US","itemcreate","itemcreate_item_descr","Descripcion"
"es-US","itemcreate","itemcreate_item_lbl","Item"
"es-US","itemcreate","itemcreate_item_price","Precio"
"es-US","itemcreate","itemcreate_save_btn","Grabar"
"es-US","itemcreate","itemcreate_use_nums","Use solo números"
"es-US","itemdel","itemdel_close_btn","Cerrar"
"es-US","itemdel","itemdel_confirm_del","Esta seguro de querer eliminar el item "
"es-US","itemdel","itemdel_delete_btn","Eliminar"
"es-US","itemdel","itemdel_del_item","Eliminar Item"
"es-US","itemedit","itemedit_close_btn","Cerrar"
"es-US","itemedit","itemedit_edit_item","Editar Item"
"es-US","itemedit","itemedit_item_descr","Descripcion"
"es-US","itemedit","itemedit_item_label","Item"
"es-US","itemedit","itemedit_item_price","Precio:"
"es-US","itemedit","itemedit_save_btn","Guardar"
"es-US","itemlist","itemlist_avail_items","Items Disponibles:"
"es-US","itemlist","itemlist_list_empty","No existen items!"
"es-US","listorders","listorders_backtoshop_btn","Regresar a Tienda"
"es-US","listorders","listorders_export_orders","Exportar Pedidos"
"es-US","listorders","listorders_invoice_btn","Factura"
"es-US","listorders","listorders_item_lbl","Item"
"es-US","listorders","listorders_no_orders","No hay órdenes"
"es-US","listorders","listorders_order_id","ID de Orden"
"es-US","listorders","listorders_order_total","Total de la Orden:"
"es-US","listorders","listorders_overall_total","Total General: "
"es-US","listorders","listorders_qty_lbl","Cant."
"es-US","listorders","listorders_receipt_btn","Recibo"
"es-US","listorders","listorders_todays_total","Total del Dia: "
"es-US","listorders","listorders_total_lbl","Total"
"es-US","login","login_check_wallet","Verifique su billetera!!"
"es-US","login","login_confirm_login","ZGo confirma su ingreso en la cadena de Zcash"
"es-US","login","login_confirm_pin","Confirme el PIN"
"es-US","login","login_connect_to_zgo","Conectar su billetera a ZGo"
"es-US","login","login_enter_pin","Ingrese el PIN enviado por ZGo para confirmar su billetera:"
"es-US","login","login_last_block","Ultimo Bloque Verificado: "
"es-US","login","login_link_wallet","Asociar Billetera"
"es-US","login","login_wrong_pin","PIN Invalido!!"
"es-US","main","main_price_data","Precios provistos por API de CoinGecko"
"es-US","order","order_cancel_btn","Cancelar"
"es-US","order","order_cancel_ok","Orden cancelada exitosamente!"
"es-US","order","order_cancel_order","Cancelar Orden?"
"es-US","order","order_checkout_btn","Procesar"
"es-US","order","order_confirm_cancel","Esta seguro que quiere cancelar la orden?"
"es-US","order","order_confirm_remove","Esta seguro de querer remover "
"es-US","order","order_confirm_remove1"," de esta orden?"
"es-US","order","order_invoice_btn","Factura"
"es-US","order","order_item_lbl","Item"
"es-US","order","order_notserv_close","Cerrar"
"es-US","order","order_notserv_success","confirmado"
"es-US","order","order_no_openorder","Sin órden abierta!!"
"es-US","order","order_qty_lbl","Cant."
"es-US","order","order_remove_item","Remover Item?"
"es-US","order","order_total_lbl","Total"
"es-US","order","order_total_title","Total Pedido:"
"es-US","pmtservice","pmtservice_amount_doesnot","Total no"
"es-US","pmtservice","pmtservice_cant_scan","No puede escanear?"
"es-US","pmtservice","pmtservice_connecto_xero","Conexion con Xero"
"es-US","pmtservice","pmtservice_copyaddress_error","Error al copiar dirección"
"es-US","pmtservice","pmtservice_copyamount_error","Error al copiar valor"
"es-US","pmtservice","pmtservice_copymemo_error","Error al copiar Memo"
"es-US","pmtservice","pmtservice_copy_address","Copiar Dirección"
"es-US","pmtservice","pmtservice_copy_amount","Copiar Valor"
"es-US","pmtservice","pmtservice_copy_memo","Copiar Memo"
"es-US","pmtservice","pmtservice_copy_notavail","Funcionalidad para copia no soportada"
"es-US","pmtservice","pmtservice_currency_notsup","no soportada!!"
"es-US","pmtservice","pmtservice_enabled_for","habilitado para"
"es-US","pmtservice","pmtservice_hdr_txt1","Factura"
"es-US","pmtservice","pmtservice_hdr_txt2","ID de Orden: "
"es-US","pmtservice","pmtservice_hdr_txt3","Fecha: "
"es-US","pmtservice","pmtservice_invalid_ownerid","ID de propietario inválida!!"
"es-US","pmtservice","pmtservice_invoice_currency","Moneda"
"es-US","pmtservice","pmtservice_invoice_invalid","tipo inválido!!"
"es-US","pmtservice","pmtservice_invoice_item","Item:"
"es-US","pmtservice","pmtservice_invoice_notfound","no encontrada!!"
"es-US","pmtservice","pmtservice_invoice_num","Factura"
"es-US","pmtservice","pmtservice_invoice_paid","ya pagada!!"
"es-US","pmtservice","pmtservice_invoice_price","Precio"
"es-US","pmtservice","pmtservice_invoice_qty","Cant."
"es-US","pmtservice","pmtservice_invoice_total","Total Factura:"
"es-US","pmtservice","pmtservice_match_value","es igual al valor"
"es-US","pmtservice","pmtservice_notserv_close","Cerrar"
"es-US","pmtservice","pmtservice_notserv_error","Error"
"es-US","pmtservice","pmtservice_payment_confirmed","Pago Confirmado!!"
"es-US","pmtservice","pmtservice_payment_notprocessed","Solicitud de pago no fue procesada!!"
"es-US","pmtservice","pmtservice_payment_pending","Pago Pendiente!!"
"es-US","pmtservice","pmtservice_pmtsrv_not","Servicio de pagos no "
"es-US","pmtservice","pmtservice_reported_byxero","reportado por Xero!!"
"es-US","pmtservice","pmtservice_scan_qrcode","Escanee el código QR con su billetera para hacer el pago"
"es-US","pmtservice","pmtservice_server_failed","servidor falló!!"
"es-US","pmtservice","pmtservice_use_this","Use este "
"es-US","pmtservice","pmtservice_wallet_link","link de billetera"
"es-US","pmtservice","pmtservice_zecdata_price","Precio Zcash: "
"es-US","pmtservice","pmtservice_zecdata_total","Total: "
"es-US","promptinvoice","promptinvoice_func_notavail","Funcionalidad no disponible en su navegador. Use el botón de enviar en lugar de eso."
"es-US","promptinvoice","promptinvoice_invoice_cancel","Cancelar"
"es-US","promptinvoice","promptinvoice_invoice_clipboard","URL de la factura copiado al Portapapeles!!"
"es-US","promptinvoice","promptinvoice_invoice_sent","Enviado!"
"es-US","promptinvoice","promptinvoice_invoice_url","URL de Factura:"
"es-US","promptinvoice","promptinvoice_notserv_close","Cerrar"
"es-US","promptinvoice","promptinvoice_notserv_error","Error"
"es-US","promptinvoice","promptinvoice_notserv_success","Suceso"
"es-US","promptinvoice","promptinvoice_send_link","Envíe el link de la factura a su cliente:"
"es-US","promptreceipt","promptreceipt_close_lbl","Cerrar"
"es-US","promptreceipt","promptreceipt_func_notavail","Functionality not available for your browser. Use send button "
"es-US","promptreceipt","promptreceipt_notserv_close","Cerrar"
"es-US","promptreceipt","promptreceipt_notserv_error","Error"
"es-US","promptreceipt","promptreceipt_notserv_success","Suceso"
"es-US","promptreceipt","promptreceipt_receipt_clipboard","URL del Recibo copiado a portapapeles!!"
"es-US","promptreceipt","promptreceipt_receipt_url","URL del Recibo:"
"es-US","promptreceipt","promptreceipt_send_link","Envíe el enlace del recibo a su cliente :"
"es-US","receipt","receipt_info_notavail","No hay información disponible."
"es-US","receipt","receipt_invalid_id","ID de Recibo incorrecto."
"es-US","receipt","receipt_order_date","Fecha: "
"es-US","receipt","receipt_order_id","ID de Orden:"
"es-US","receipt","receipt_order_price","Precio: "
"es-US","receipt","receipt_order_total","Total: "
"es-US","receipt","receipt_qty_lbl","Cant."
"es-US","receipt","receipt_receipt_lbl","Recibo "
"es-US","receipt","receipt_zcash_price","Precio de Zcash: "
"es-US","receiptqr","receiptqr_close_btn","Cerrar"
"es-US","receiptqr","receiptqr_scan_receipt","Escanee para obtener su Recibo"
"es-US","scan","scan_close_btn","Cerrar"
"es-US","scan","scan_copy_address","Copiar Dirección"
"es-US","scan","scan_copy_amount","Copiar Valor"
"es-US","scan","scan_copy_error","Error al copiar valor"
"es-US","scan","scan_copy_memo","Copiar Memo"
"es-US","scan","scan_fail_payment","Error al verificar pago"
"es-US","scan","scan_func_notavail","Funcionalidad de copia no soportada"
"es-US","scan","scan_memo_sent","Memorando enviado!"
"es-US","scan","scan_notserv_close","Cerrar"
"es-US","scan","scan_notserv_error","Error"
"es-US","scan","scan_scanqr_code","Escanee el código QR"
"es-US","scan","scan_text_info","Asegúrese de marcar la caja ""Incluir Responder-A"" en su billetera antes de enviar su memo"
"es-US","scan","scan_use_this","No puede escanear? Use este "
"es-US","scan","scan_wallet_link","Link de billetera"
"es-US","settings","settings_acode_invalid","Código de Cuenta inválido (10 caracteres max.)"
"es-US","settings","settings_acode_lbl","Código de Cuenta:"
"es-US","settings","settings_acode_notsaved","Código de cuenta no guardado!"
"es-US","settings","settings_acode_saved","Código de cuenta guardado!!"
"es-US","settings","settings_close_btn","Cancelar"
"es-US","settings","settings_confirm_payments","Confirmar pagos?"
"es-US","settings","settings_copy_notavail","Funcionalidad no disponible para su navegador. Use el botón de enviar."
"es-US","settings","settings_currency_lbl","Moneda"
"es-US","settings","settings_link_2xero","Enlazar a Xero"
"es-US","settings","settings_name_lbl","Nombre"
"es-US","settings","settings_name_placeholder","Su nombre"
"es-US","settings","settings_notserv_close","Cerrar"
"es-US","settings","settings_notserv_error","Error"
"es-US","settings","settings_notserv_success","Suceso"
"es-US","settings","settings_notserv_warning","Advertencia"
"es-US","settings","settings_ownerid_copied","ID del propietario copiado a la papelera"
"es-US","settings","settings_ownerid_notcopied","Copiar no disponible en su navegador"
"es-US","settings","settings_pmtserv_url","URL del Servicio de Pago:"
"es-US","settings","settings_relink_2xero","Reconectar a Xero"
"es-US","settings","settings_save_btn","Salvar"
"es-US","settings","settings_tab_integrations","Integraciones"
"es-US","settings","settings_tab_mainlbl","Principal"
"es-US","settings","settings_URL_copied","URL de ZGo copiado a la papelera!!"
"es-US","settings","settings_use_satoshi","Usar zatoshis?"
"es-US","settings","settings_view_title","Configuración"
"es-US","settings","settings_vkey_lbl","Clave de visualización"
"es-US","settings","settings_vkey_placeholder","Clave de visualización de su billetera"
"es-US","settings","settings_wctoken_copied","Token de WooCommerce copiado a la papelera"
"es-US","settings","settings_wctoken_generated","Token de WooCommerce generado!"
"es-US","settings","settings_wctoken_genfail","Falla generación de Token de WooCommerce"
"es-US","settings","settings_wctoken_notcopied","Copiar no disponible en su navegador"
"es-US","settings","settings_wc_closebtn","Cerrar"
"es-US","settings","settings_wc_gentoken","Generar Token"
"es-US","settings","settings_wc_lbl","WooCommerce"
"es-US","settings","settings_wc_ownerlbl","Propietario:"
"es-US","settings","settings_xeropmt_confirmdis","Confirmación de pagos de Xero desactivada!!"
"es-US","settings","settings_xero_closebtn","Cerrar"
"es-US","settings","settings_xero_lbl","Xero"
"es-US","settings","settings_xero_savebtn","Guardar Código"
"es-US","viewer","viewer_view_orders","Ver Ordenes"
"es-US","xero","xero_connected_2xero","Conectado a Xero!"
"es-US","xero","xero_connecting_2xero","Conectando a Xero.."
1 encode_id view_name view_element view_element_text
2 br-US business business_accept_terms Eu aceito os
3 br-US business business_addrs_nobiz Não temos um negócio associado a este endereço Zcash, por favor insira suas informações abaixo:
4 br-US business business_biz_addressholder Endereço
5 br-US business business_biz_addresslbl Endereço:
6 br-US business business_biz_cityholder Cidade
7 br-US business business_biz_citylbl Cidade:
8 br-US business business_biz_countryholder País
9 br-US business business_biz_countrylbl País:
10 br-US business business_biz_info Insira os dados da empresa
11 br-US business business_biz_mailholder exemplo@dominio.com
12 br-US business business_biz_maillbl E-mail
13 br-US business business_biz_nameholder Nome da empresa
14 br-US business business_biz_namelbl Nome da empresa:
15 br-US business business_biz_pcodeholder Código Postal
16 br-US business business_biz_pcodelbl Código postal:
17 br-US business business_biz_stateholder Estado/Provincia
18 br-US business business_biz_statelbl Estado/Provincia
19 br-US business business_biz_websiteholder Website
20 br-US business business_biz_websitelbl Website
21 br-US business business_contact_fnamelbl Primeiro nome do contato:
22 br-US business business_contact_fnholder Nome
23 br-US business business_contact_lnamelbl Último sobrenome do contato:
24 br-US business business_contact_lnholder Sobrenome
25 br-US business business_save_btn Salvar
26 br-US business business_select_session Selecione a duração da sessão que você necessita:
27 br-US business business_session_label Sessão:
28 br-US business business_session_lengthlbl Duração da sessão
29 br-US business business_session_paylbl Pagar
30 br-US business business_signup_title Inscrição de negócio
31 br-US business business_terms_ofuse Termos de Uso
32 br-US business business_zgo_confirmlbl ZGo confirma o seu pagamento
33 br-US cancel cancel_confirm_btn Confirmar
34 br-US cancel cancel_dismiss_btn Descartar
35 br-US cancel cancel_title Cancelar
36 br-US checkout checkout_accept_btn Aceitar
37 br-US checkout checkout_cant_scan Não consegue escanear?
38 br-US checkout checkout_close_btn Fechar
39 br-US checkout checkout_copyaddress_error Erro ao copiar endereço
40 br-US checkout checkout_copyamount_error Erro ao copiar o valor
41 br-US checkout checkout_copymemo_error Erro ao copiar o memorando
42 br-US checkout checkout_copy_address Copiar Endereço
43 br-US checkout checkout_copy_amount Copiar Valor
44 br-US checkout checkout_copy_memo Copiar Memo
45 br-US checkout checkout_copy_notavail Funcionalidade de cópia não suportada!!
46 br-US checkout checkout_notserv_close Fechar
47 br-US checkout checkout_notserv_error Erro
48 br-US checkout checkout_scan_payment Escaneie para fazer o pagamento
49 br-US checkout checkout_use_this Use este/isso
50 br-US checkout checkout_wallet_link link de carteira
51 br-US checkout checkout_wallet_or , ou
52 br-US dbexport dbexport_btn_close Cancelar
53 br-US dbexport dbexport_closed_no Não
54 br-US dbexport dbexport_closed_yes Sim
55 br-US dbexport dbexport_date_range Intervalo de datas:
56 br-US dbexport dbexport_download_link Download
57 br-US dbexport dbexport_end_date Data de término
58 br-US dbexport dbexport_export_descrip Exportar pedidos em um arquivo de formato .CSV
59 br-US dbexport dbexport_file_header "Data","ID do pedido","Moeda","Fechado?","Valor","Taxa","ZEC","Pago?","Fatura"
60 br-US dbexport dbexport_invalid_end Data final inválida
61 br-US dbexport dbexport_invalid_start Data de início inválida
62 br-US dbexport dbexport_noorders_created Você não tem pedidos criados.
63 br-US dbexport dbexport_nothing_todo Nada para fazer.
64 br-US dbexport dbexport_paid_no Não
65 br-US dbexport dbexport_paid_yes Sim
66 br-US dbexport dbexport_settings_title Exportar pedidos
67 br-US dbexport dbexport_start_date Data de início
68 br-US header header_get_currency Moeda:
69 br-US header header_last_block Último Bloco:
70 br-US invoice invoice_cant_scan Não consegue escanear?
71 br-US invoice invoice_copyaddress_error Erro ao copiar endereço
72 br-US invoice invoice_copyamount_error Erro ao copiar o valor
73 br-US invoice invoice_copymemo_error Erro ao copiar o memorando
74 br-US invoice invoice_copy_address Copiar Endereço
75 br-US invoice invoice_copy_amount Copiar Valor
76 br-US invoice invoice_copy_memo Copiar Memo
77 br-US invoice invoice_copy_notavail Funcionalidade de cópia não suportada
78 br-US invoice invoice_dot_or , ou
79 br-US invoice invoice_info_notavail Não há informação disponível.
80 br-US invoice invoice_invalid_id ID do fatura incorreto.
81 br-US invoice invoice_invoice_lbl Fatura
82 br-US invoice invoice_invoice_total Total da Fatura:
83 br-US invoice invoice_notserv_close Fechar
84 br-US invoice invoice_notserv_error Erro
85 br-US invoice invoice_order_date Data:
86 br-US invoice invoice_order_id ID do Pedido:
87 br-US invoice invoice_order_price Preço
88 br-US invoice invoice_payment_confirmed Pagamento Confirmado!!
89 br-US invoice invoice_payment_pending Pagamento Pendente!!
90 br-US invoice invoice_qty_lbl Qtde.
91 br-US invoice invoice_return_toshop Voltar à Loja
92 br-US invoice invoice_scan_qrcode Escaneie o QR Code com sua carteira para efetuar o pagamento
93 br-US invoice invoice_use_this Use isso
94 br-US invoice invoice_wallet_link Link da Carteira
95 br-US invoice invoice_zcash_price Preço da Zcash:
96 br-US itemadd itemadd_add_2order Adicionar Item ao Pedido
97 br-US itemadd itemadd_cancel_btn Cancelar
98 br-US itemadd itemadd_save_btn Adicionar
99 br-US itemcreate itemcreate_add_item Adicionar Item
100 br-US itemcreate itemcreate_close_btn Fechar
101 br-US itemcreate itemcreate_item_descr Descrição
102 br-US itemcreate itemcreate_item_lbl Item
103 br-US itemcreate itemcreate_item_price Preço
104 br-US itemcreate itemcreate_save_btn Salvar
105 br-US itemcreate itemcreate_use_nums Use apenas números
106 br-US itemdel itemdel_close_btn Fechar
107 br-US itemdel itemdel_confirm_del Tem certeza de que deseja apagar
108 br-US itemdel itemdel_delete_btn Excluir
109 br-US itemdel itemdel_del_item Excluir Item
110 br-US itemedit itemedit_close_btn Fechar
111 br-US itemedit itemedit_edit_item Editar Item
112 br-US itemedit itemedit_item_descr Descrição
113 br-US itemedit itemedit_item_label Item
114 br-US itemedit itemedit_item_price Preço:
115 br-US itemedit itemedit_save_btn Salvar
116 br-US itemlist itemlist_avail_items Items disponíveis:
117 br-US itemlist itemlist_list_empty Ainda não há itens
118 br-US listorders listorders_backtoshop_btn Voltar a Loja
119 br-US listorders listorders_export_orders Exportar Pedidos
120 br-US listorders listorders_invoice_btn Fatura
121 br-US listorders listorders_item_lbl Item
122 br-US listorders listorders_no_orders Não há Pedidos
123 br-US listorders listorders_order_id ID do Pedido
124 br-US listorders listorders_order_total Total do Pedido:
125 br-US listorders listorders_overall_total Total geral:
126 br-US listorders listorders_qty_lbl Qtde.
127 br-US listorders listorders_receipt_btn Comprovante
128 br-US listorders listorders_todays_total Total de hoje:
129 br-US listorders listorders_total_lbl Total
130 br-US login login_check_wallet Verifique sua carteira!!
131 br-US login login_confirm_login ZGo confirma seu login na blockchain da Zcash
132 br-US login login_confirm_pin Confirmar Senha
133 br-US login login_connect_to_zgo Conecte sua carteira ao ZGo
134 br-US login login_enter_pin Insira a senha enviada pela ZGo para confirmar a propriedade da carteira:
135 br-US login login_last_block Último bloco visto:
136 br-US login login_link_wallet Conecte sua carteira
137 br-US login login_wrong_pin Senha incorreta!
138 br-US main main_price_data Preços informados pela CoinGecko API
139 br-US order order_cancel_btn Cancelar
140 br-US order order_cancel_ok Pedido cancelado com sucesso!
141 br-US order order_cancel_order Cancelar o pedido?
142 br-US order order_checkout_btn Procesar
143 br-US order order_confirm_cancel Tem certeza que deseja cancelar o pedido?
144 br-US order order_confirm_remove Tem certeza que deseja remover <<
145 br-US order order_confirm_remove1  deste pedido?
146 br-US order order_invoice_btn Fatura
147 br-US order order_item_lbl Item
148 br-US order order_notserv_close Fechar
149 br-US order order_notserv_success succeso
150 br-US order order_no_openorder Sem pedido aberto!!
151 br-US order order_qty_lbl Qtde.
152 br-US order order_remove_item Remover o Item?
153 br-US order order_total_lbl Total
154 br-US order order_total_title Total do Pedido:
155 br-US pmtservice pmtservice_amount_doesnot O Valor não
156 br-US pmtservice pmtservice_cant_scan Não consegue escanear?
157 br-US pmtservice pmtservice_connecto_xero Conexão para o Xero
158 br-US pmtservice pmtservice_copyaddress_error Erro ao copiar endereço
159 br-US pmtservice pmtservice_copyamount_error Erro ao copiar o valor
160 br-US pmtservice pmtservice_copymemo_error Erro ao copiar o memorando
161 br-US pmtservice pmtservice_copy_address Copiar Endereço
162 br-US pmtservice pmtservice_copy_amount Copiar Valor
163 br-US pmtservice pmtservice_copy_memo Copiar Memo
164 br-US pmtservice pmtservice_copy_notavail Funcionalidade de cópia não suportada
165 br-US pmtservice pmtservice_currency_notsup não suportada!!
166 br-US pmtservice pmtservice_enabled_for habilitado para
167 br-US pmtservice pmtservice_hdr_txt1 Fatura
168 br-US pmtservice pmtservice_hdr_txt2 ID do Pedido:
169 br-US pmtservice pmtservice_hdr_txt3 Data:
170 br-US pmtservice pmtservice_invalid_ownerid ID do proprietário inválido!!
171 br-US pmtservice pmtservice_invoice_currency Moeda
172 br-US pmtservice pmtservice_invoice_invalid tipo inválido!!
173 br-US pmtservice pmtservice_invoice_item Item:
174 br-US pmtservice pmtservice_invoice_notfound não encontrada!!
175 br-US pmtservice pmtservice_invoice_num Fatura
176 br-US pmtservice pmtservice_invoice_paid já pago!!
177 br-US pmtservice pmtservice_invoice_price Preço
178 br-US pmtservice pmtservice_invoice_qty Qtde.
179 br-US pmtservice pmtservice_invoice_total Total da Fatura:
180 br-US pmtservice pmtservice_match_value corresponde ao valor
181 br-US pmtservice pmtservice_notserv_close Fechar
182 br-US pmtservice pmtservice_notserv_error Erro
183 br-US pmtservice pmtservice_payment_confirmed Pagamento Confirmado!!
184 br-US pmtservice pmtservice_payment_notprocessed Pedido de pagamento não foi processado!!
185 br-US pmtservice pmtservice_payment_pending Pagamento Pendente!!
186 br-US pmtservice pmtservice_pmtsrv_not Serviço de pagamento não
187 br-US pmtservice pmtservice_reported_byxero reportado por Xero!!
188 br-US pmtservice pmtservice_scan_qrcode Escaneie o QR Code com sua carteira para efetuar o pagamento
189 br-US pmtservice pmtservice_server_failed servidor falhou!!
190 br-US pmtservice pmtservice_use_this Use isso
191 br-US pmtservice pmtservice_wallet_link Link da Carteira
192 br-US pmtservice pmtservice_zecdata_price Preço da Zcash:
193 br-US pmtservice pmtservice_zecdata_total Total:
194 br-US promptinvoice promptinvoice_func_notavail Funcionalidade não disponível para o seu navegador. Use o botão enviar ao invés disso
195 br-US promptinvoice promptinvoice_invoice_cancel Cancelar
196 br-US promptinvoice promptinvoice_invoice_clipboard URL da fatura copiado para a área de transferência!!
197 br-US promptinvoice promptinvoice_invoice_sent Enviado!
198 br-US promptinvoice promptinvoice_invoice_url URL da Fatura:
199 br-US promptinvoice promptinvoice_notserv_close Fechar
200 br-US promptinvoice promptinvoice_notserv_error Erro
201 br-US promptinvoice promptinvoice_notserv_success Suceso
202 br-US promptinvoice promptinvoice_send_link Envie o link da fatura para o seu cliente:
203 br-US promptreceipt promptreceipt_close_lbl Fechar
204 br-US promptreceipt promptreceipt_func_notavail Funcionalidade não disponível para o seu navegador. Use o botão Enviar
205 br-US promptreceipt promptreceipt_notserv_close Fechar
206 br-US promptreceipt promptreceipt_notserv_error Erro
207 br-US promptreceipt promptreceipt_notserv_success Sucesso
208 br-US promptreceipt promptreceipt_receipt_clipboard URL do comprovante foi copiado para a área de transferência!!
209 br-US promptreceipt promptreceipt_receipt_url URL do comprovante:
210 br-US promptreceipt promptreceipt_send_link Envie o link do comprovante para o seu cliente:
211 br-US receipt receipt_info_notavail Não há informação disponível.
212 br-US receipt receipt_invalid_id ID do comprovante incorreto.
213 br-US receipt receipt_order_date Data:
214 br-US receipt receipt_order_id ID do Pedido:
215 br-US receipt receipt_order_price Preço:
216 br-US receipt receipt_order_total Total:
217 br-US receipt receipt_qty_lbl Qtde.
218 br-US receipt receipt_receipt_lbl Comprovante
219 br-US receipt receipt_zcash_price Preço da Zcash:
220 br-US receiptqr receiptqr_close_btn Fechar
221 br-US receiptqr receiptqr_scan_receipt Escaneie para o seu comprovante
222 br-US scan scan_close_btn Fechar
223 br-US scan scan_copy_address Copiar Endereço
224 br-US scan scan_copy_amount Copiar Valor
225 br-US scan scan_copy_error Falha ao copiar o valor
226 br-US scan scan_copy_memo Copiar Memo
227 br-US scan scan_fail_payment Erro ao verificar o pagamento
228 br-US scan scan_func_notavail Funcionalidade de cópia não suportada
229 br-US scan scan_memo_sent Memorando enviado!
230 br-US scan scan_notserv_close Fechar
231 br-US scan scan_notserv_error Erro
232 br-US scan scan_scanqr_code Scanei o QR Code
233 br-US scan scan_text_info Certifique-se de selecionar "Incluir Responder-A" na sua carteira antes de enviar o seu memorando.
234 br-US scan scan_use_this Não consegue escanear ? Use isso
235 br-US scan scan_wallet_link Link de carteira
236 br-US settings settings_acode_invalid Número da Conta inválido (10 caracteres no máximo)
237 br-US settings settings_acode_lbl Número da conta:
238 br-US settings settings_acode_notsaved Número da Conta não salvo!!
239 br-US settings settings_acode_saved Número da conta Salvo!!
240 br-US settings settings_close_btn Cancelar
241 br-US settings settings_confirm_payments Confirmar pagamentos?
242 br-US settings settings_copy_notavail Funcionalidade não disponível para o seu navegador. Use o botão enviar ao invés disso
243 br-US settings settings_currency_lbl Moeda
244 br-US settings settings_link_2xero Conectar-se ao Xero
245 br-US settings settings_name_lbl Nome
246 br-US settings settings_name_placeholder Seu nome
247 br-US settings settings_notserv_close Fechar
248 br-US settings settings_notserv_error Erro
249 br-US settings settings_notserv_success Sucesso
250 br-US settings settings_notserv_warning Aviso
251 br-US settings settings_ownerid_copied ID do proprietário copiado para a prancheta
252 br-US settings settings_ownerid_notcopied Cópia não disponível em seu navegador
253 br-US settings settings_pmtserv_url URL de Serviço de Pagamento:
254 br-US settings settings_relink_2xero Reconectar-se ao Xero
255 br-US settings settings_save_btn Salvar
256 br-US settings settings_tab_integrations Integrações
257 br-US settings settings_tab_mainlbl Principal
258 br-US settings settings_url_copied URL ZGo copiado para a prancheta!!
259 br-US settings settings_use_satoshi Usar zatoshis?
260 br-US settings settings_view_title Definições
261 br-US settings settings_vkey_lbl Chave de visualização
262 br-US settings settings_vkey_placeholder Sua chave de visualização da carteira
263 br-US settings settings_wctoken_copied Token WooCommerce copiado para a prancheta
264 br-US settings settings_wctoken_generated Token da WoCommerce gerado
265 br-US settings settings_wctoken_genfail Geração do token da WooCommerce falhou
266 br-US settings settings_wctoken_notcopied Cópia não disponível no seu navegador
267 br-US settings settings_wc_closebtn Fechar
268 br-US settings settings_wc_gentoken Gerar Token
269 br-US settings settings_wc_lbl WooCommerce
270 br-US settings settings_wc_ownerlbl Proprietário:
271 br-US settings settings_xeropmt_confirmdis Confirmação de pagamentos Xero desativada!!
272 br-US settings settings_xero_closebtn Fechar
273 br-US settings settings_xero_lbl Xero
274 br-US settings settings_xero_savebtn Salvar código
275 br-US viewer viewer_view_orders Ver Pedidos
276 br-US xero xero_connected_2xero Conectado ao Xero!
277 br-US xero xero_connecting_2xero Conectando ao Xero..
278 en-US business business_accept_terms I accept the
279 en-US business business_addrs_nobiz We do not have a business associated with this Zcash address, please enter your information below:
280 en-US business business_biz_addressholder Address
281 en-US business business_biz_addresslbl Address:
282 en-US business business_biz_cityholder City
283 en-US business business_biz_citylbl City:
284 en-US business business_biz_countryholder Country
285 en-US business business_biz_countrylbl Country:
286 en-US business business_biz_info Provide business info
287 en-US business business_biz_mailholder example@domain.com
288 en-US business business_biz_maillbl E-mail:
289 en-US business business_biz_nameholder Business name
290 en-US business business_biz_namelbl Business Name:
291 en-US business business_biz_pcodeholder Postal code
292 en-US business business_biz_pcodelbl Postal Code:
293 en-US business business_biz_stateholder State or Province
294 en-US business business_biz_statelbl State/Province:
295 en-US business business_biz_websiteholder website
296 en-US business business_biz_websitelbl Website:
297 en-US business business_contact_fnamelbl Contact First name:
298 en-US business business_contact_fnholder First name
299 en-US business business_contact_lnamelbl Contact Last Name:
300 en-US business business_contact_lnholder Last Name
301 en-US business business_save_btn Save
302 en-US business business_select_session Please select the length of session that you need:
303 en-US business business_session_label Session:
304 en-US business business_session_lengthlbl Session Length
305 en-US business business_session_paylbl Pay
306 en-US business business_signup_title Business sign-up
307 en-US business business_terms_ofuse Terms of Use
308 en-US business business_zgo_confirmlbl ZGo confirms your payment
309 en-US cancel cancel_confirm_btn Confirm
310 en-US cancel cancel_dismiss_btn Dismiss
311 en-US cancel cancel_title Cancel
312 en-US checkout checkout_accept_btn Accept
313 en-US checkout checkout_cant_scan Can't scan?
314 en-US checkout checkout_close_btn Close
315 en-US checkout checkout_copyaddress_error Error copying address
316 en-US checkout checkout_copyamount_error Error while copying ammount
317 en-US checkout checkout_copymemo_error Error while copying Memo
318 en-US checkout checkout_copy_address Copy Address
319 en-US checkout checkout_copy_amount Copy Amount
320 en-US checkout checkout_copy_memo Copy Memo
321 en-US checkout checkout_copy_notavail Copy functionality not supported!!
322 en-US checkout checkout_notserv_close Close
323 en-US checkout checkout_notserv_error Error
324 en-US checkout checkout_scan_payment Scan to make payment
325 en-US checkout checkout_use_this Use this
326 en-US checkout checkout_wallet_link wallet link
327 en-US checkout checkout_wallet_or , or
328 en-US dbexport dbexport_btn_close Cancel
329 en-US dbexport dbexport_closed_no No
330 en-US dbexport dbexport_closed_yes Yes
331 en-US dbexport dbexport_date_range Date Range:
332 en-US dbexport dbexport_download_link Download
333 en-US dbexport dbexport_end_date End date
334 en-US dbexport dbexport_export_descrip Export orders in a .CSV format file
335 en-US dbexport dbexport_file_header "Date","Order ID","Currency","Closed?","Amount","Rate","ZEC","Paid?","Invoice"
336 en-US dbexport dbexport_invalid_end Invalid end date
337 en-US dbexport dbexport_invalid_start Invalid start date
338 en-US dbexport dbexport_noorders_created You have no orders created.
339 en-US dbexport dbexport_nothing_todo Nothing to do.
340 en-US dbexport dbexport_paid_no No
341 en-US dbexport dbexport_paid_yes Yes
342 en-US dbexport dbexport_settings_title Export Orders
343 en-US dbexport dbexport_start_date Start date
344 en-US header header_get_currency Currency:
345 en-US header header_last_block Last Block:
346 en-US invoice invoice_cant_scan Can't scan?
347 en-US invoice invoice_copyaddress_error Error while copying address
348 en-US invoice invoice_copyamount_error Error while copying amount
349 en-US invoice invoice_copymemo_error Error while copying Memo
350 en-US invoice invoice_copy_address Copy Address
351 en-US invoice invoice_copy_amount Copy Amount
352 en-US invoice invoice_copy_memo Copy Memo
353 en-US invoice invoice_copy_notavail Copy functionality not supported
354 en-US invoice invoice_dot_or , or
355 en-US invoice invoice_info_notavail No information available.
356 en-US invoice invoice_invalid_id Incorrect Invoice ID.
357 en-US invoice invoice_invoice_lbl Invoice
358 en-US invoice invoice_invoice_total Invoice Total:
359 en-US invoice invoice_notserv_close Close
360 en-US invoice invoice_notserv_error Error
361 en-US invoice invoice_order_date Date:
362 en-US invoice invoice_order_id Order ID:
363 en-US invoice invoice_order_price Price
364 en-US invoice invoice_payment_confirmed Payment Confirmed!!
365 en-US invoice invoice_payment_pending Payment Pending!!
366 en-US invoice invoice_qty_lbl Qty.
367 en-US invoice invoice_return_toshop Return to Shop
368 en-US invoice invoice_scan_qrcode Scan the QR code with your wallet to make payment
369 en-US invoice invoice_use_this Use this
370 en-US invoice invoice_wallet_link wallet link
371 en-US invoice invoice_zcash_price Zcash price:
372 en-US itemadd itemadd_add_2order Add Item to Order
373 en-US itemadd itemadd_cancel_btn Cancel
374 en-US itemadd itemadd_save_btn Add
375 en-US itemcreate itemcreate_add_item Add Item
376 en-US itemcreate itemcreate_close_btn Close
377 en-US itemcreate itemcreate_item_descr Description
378 en-US itemcreate itemcreate_item_lbl Item
379 en-US itemcreate itemcreate_item_price Price
380 en-US itemcreate itemcreate_save_btn Save
381 en-US itemcreate itemcreate_use_nums Use only numbers
382 en-US itemdel itemdel_close_btn Close
383 en-US itemdel itemdel_confirm_del Are you sure you want to delete
384 en-US itemdel itemdel_delete_btn Delete
385 en-US itemdel itemdel_del_item Delete Item
386 en-US itemedit itemedit_close_btn Close
387 en-US itemedit itemedit_edit_item Edit Item
388 en-US itemedit itemedit_item_descr Description
389 en-US itemedit itemedit_item_label Item
390 en-US itemedit itemedit_item_price Price:
391 en-US itemedit itemedit_save_btn Save
392 en-US itemlist itemlist_avail_items Available Items:
393 en-US itemlist itemlist_list_empty No items yet!
394 en-US listorders listorders_backtoshop_btn Back to Shop
395 en-US listorders listorders_export_orders Export Orders
396 en-US listorders listorders_invoice_btn Invoice
397 en-US listorders listorders_item_lbl Item
398 en-US listorders listorders_no_orders No orders
399 en-US listorders listorders_order_id Order ID
400 en-US listorders listorders_order_total Order Total:
401 en-US listorders listorders_overall_total Overall Total:
402 en-US listorders listorders_qty_lbl Qty.
403 en-US listorders listorders_receipt_btn Receipt
404 en-US listorders listorders_todays_total Today's Total:
405 en-US listorders listorders_total_lbl Total
406 en-US login login_check_wallet Check your wallet!!
407 en-US login login_confirm_login ZGo confirms your login on the Zcash blockhain
408 en-US login login_confirm_pin Confirm PIN
409 en-US login login_connect_to_zgo Connect your wallet to ZGo
410 en-US login login_enter_pin Enter the PIN sent by ZGo to confirm wallet ownership:
411 en-US login login_last_block Last block seen:
412 en-US login login_link_wallet Link Wallet
413 en-US login login_wrong_pin Wrong PIN!!
414 en-US main main_price_data Price data provided by CoinGecko API
415 en-US order order_cancel_btn Cancel
416 en-US order order_cancel_ok Order successfully cancelled!
417 en-US order order_cancel_order Cancel Order?
418 en-US order order_checkout_btn Checkout
419 en-US order order_confirm_cancel Are you sure you want to cancel the order?
420 en-US order order_confirm_remove Are you sure you want to remove
421 en-US order order_confirm_remove1  from this order?
422 en-US order order_invoice_btn Invoice
423 en-US order order_item_lbl Item
424 en-US order order_notserv_close Close
425 en-US order order_notserv_success success
426 en-US order order_no_openorder No open order!!
427 en-US order order_qty_lbl Qty.
428 en-US order order_remove_item Remove Item?
429 en-US order order_total_lbl Total
430 en-US order order_total_title Order Total:
431 en-US pmtservice pmtservice_amount_doesnot Amount does not
432 en-US pmtservice pmtservice_cant_scan Can't scan?
433 en-US pmtservice pmtservice_connecto_xero Connection to Xero
434 en-US pmtservice pmtservice_copyaddress_error Error while copying address
435 en-US pmtservice pmtservice_copyamount_error Error while copying amount
436 en-US pmtservice pmtservice_copymemo_error Error while copying Memo
437 en-US pmtservice pmtservice_copy_address Copy Address
438 en-US pmtservice pmtservice_copy_amount Copy Amount
439 en-US pmtservice pmtservice_copy_memo Copy Memo
440 en-US pmtservice pmtservice_copy_notavail Copy functionality not supported
441 en-US pmtservice pmtservice_currency_notsup not supported!!
442 en-US pmtservice pmtservice_enabled_for enabled for
443 en-US pmtservice pmtservice_hdr_txt1 Invoice
444 en-US pmtservice pmtservice_hdr_txt2 Order ID:
445 en-US pmtservice pmtservice_hdr_txt3 Date:
446 en-US pmtservice pmtservice_invalid_ownerid Invalid Owner ID!!
447 en-US pmtservice pmtservice_invoice_currency Currency
448 en-US pmtservice pmtservice_invoice_invalid type invalid!!
449 en-US pmtservice pmtservice_invoice_item Item:
450 en-US pmtservice pmtservice_invoice_notfound not found!!
451 en-US pmtservice pmtservice_invoice_num Invoice
452 en-US pmtservice pmtservice_invoice_paid already paid!!
453 en-US pmtservice pmtservice_invoice_price Price
454 en-US pmtservice pmtservice_invoice_qty Qty.
455 en-US pmtservice pmtservice_invoice_total Invoice Total:
456 en-US pmtservice pmtservice_match_value match value
457 en-US pmtservice pmtservice_notserv_close Close
458 en-US pmtservice pmtservice_notserv_error Error
459 en-US pmtservice pmtservice_payment_confirmed Payment Confirmed!!
460 en-US pmtservice pmtservice_payment_notprocessed Payment request was not processed!!
461 en-US pmtservice pmtservice_payment_pending Payment Pending!!
462 en-US pmtservice pmtservice_pmtsrv_not Payment service not
463 en-US pmtservice pmtservice_reported_byxero reported by Xero!!
464 en-US pmtservice pmtservice_scan_qrcode Scan the QR code with your wallet to make payment
465 en-US pmtservice pmtservice_server_failed server failed!!
466 en-US pmtservice pmtservice_use_this Use this
467 en-US pmtservice pmtservice_wallet_link wallet link
468 en-US pmtservice pmtservice_zecdata_price Zcash Price:
469 en-US pmtservice pmtservice_zecdata_total Total:
470 en-US promptinvoice promptinvoice_func_notavail Functionality not available for your browser. Use send button instead.
471 en-US promptinvoice promptinvoice_invoice_cancel Cancel
472 en-US promptinvoice promptinvoice_invoice_clipboard Invoice's URL copied to Clipboard!!
473 en-US promptinvoice promptinvoice_invoice_sent Sent!
474 en-US promptinvoice promptinvoice_invoice_url Invoice URL:
475 en-US promptinvoice promptinvoice_notserv_close Close
476 en-US promptinvoice promptinvoice_notserv_error Error
477 en-US promptinvoice promptinvoice_notserv_success Success
478 en-US promptinvoice promptinvoice_send_link Send the invoice link to your client:
479 en-US promptreceipt promptreceipt_close_lbl Close
480 en-US promptreceipt promptreceipt_func_notavail Functionality not available for your browser. Use send button
481 en-US promptreceipt promptreceipt_notserv_close Close
482 en-US promptreceipt promptreceipt_notserv_error Error
483 en-US promptreceipt promptreceipt_notserv_success Success
484 en-US promptreceipt promptreceipt_receipt_clipboard Receipt's URL copied to Clipboard!!
485 en-US promptreceipt promptreceipt_receipt_url Receipt URL:
486 en-US promptreceipt promptreceipt_send_link Send the receipt link to your client:
487 en-US receipt receipt_info_notavail No information available.
488 en-US receipt receipt_invalid_id Incorrect receipt ID.
489 en-US receipt receipt_order_date Date:
490 en-US receipt receipt_order_id Order ID:
491 en-US receipt receipt_order_price Price:
492 en-US receipt receipt_order_total Total:
493 en-US receipt receipt_qty_lbl Qty.
494 en-US receipt receipt_receipt_lbl Receipt
495 en-US receipt receipt_zcash_price Zcash Price:
496 en-US receiptqr receiptqr_close_btn Close
497 en-US receiptqr receiptqr_scan_receipt Scan for your Receipt
498 en-US scan scan_close_btn Close
499 en-US scan scan_copy_address Copy Address
500 en-US scan scan_copy_amount Copy Amount
501 en-US scan scan_copy_error Error while copying ammount
502 en-US scan scan_copy_memo Copy Memo
503 en-US scan scan_fail_payment Error while verifying payment
504 en-US scan scan_func_notavail Copy functionality not supported
505 en-US scan scan_memo_sent Memo Sent!
506 en-US scan scan_notserv_close Close
507 en-US scan scan_notserv_error Error
508 en-US scan scan_scanqr_code Scan the QR code
509 en-US scan scan_text_info Ensure to check the "Include Reply-To" box in your wallet before sending your memo.
510 en-US scan scan_use_this Can't scan? Use this
511 en-US scan scan_wallet_link wallet link
512 en-US settings settings_acode_invalid Invalid Account code (10 chars max.)
513 en-US settings settings_acode_lbl Account Code:
514 en-US settings settings_acode_notsaved Account Code not saved
515 en-US settings settings_acode_saved Account Code saved!!
516 en-US settings settings_close_btn Cancel
517 en-US settings settings_confirm_payments Confirm payments?
518 en-US settings settings_copy_notavail Functionality not available for your browser. Use send button instead.
519 en-US settings settings_currency_lbl Currency
520 en-US settings settings_link_2xero Link to Xero
521 en-US settings settings_name_lbl Name
522 en-US settings settings_name_placeholder Your Name
523 en-US settings settings_notserv_close Close
524 en-US settings settings_notserv_error Error
525 en-US settings settings_notserv_success Success
526 en-US settings settings_notserv_warning Warning
527 en-US settings settings_ownerid_copied Owner ID copied to clipboard
528 en-US settings settings_ownerid_notcopied Copying not available in your browser
529 en-US settings settings_pmtserv_url Payment Service URL:
530 en-US settings settings_relink_2xero Relink to Xero
531 en-US settings settings_save_btn Save
532 en-US settings settings_tab_integrations Integrations
533 en-US settings settings_tab_mainlbl Main
534 en-US settings settings_URL_copied ZGo URL copied to Clipboard!!
535 en-US settings settings_use_satoshi Use zatoshis?
536 en-US settings settings_view_title Settings
537 en-US settings settings_vkey_lbl Viewing key
538 en-US settings settings_vkey_placeholder Your wallet viewing key
539 en-US settings settings_wctoken_copied WooCommerce Token copied to clipboard
540 en-US settings settings_wctoken_generated WooCommerce Token generated!
541 en-US settings settings_wctoken_genfail WooCommerce Token generation failed
542 en-US settings settings_wctoken_notcopied Copying not available in your browser
543 en-US settings settings_wc_closebtn Close
544 en-US settings settings_wc_gentoken Generate Token
545 en-US settings settings_wc_lbl WooCommerce
546 en-US settings settings_wc_ownerlbl Owner:
547 en-US settings settings_xeropmt_confirmdis Xero Payment confirmation disabled!!
548 en-US settings settings_xero_closebtn Close
549 en-US settings settings_xero_lbl Xero
550 en-US settings settings_xero_savebtn Save Code
551 en-US viewer viewer_view_orders View Orders
552 en-US xero xero_connected_2xero Connected to Xero!
553 en-US xero xero_connecting_2xero Connecting to Xero..
554 es-US business business_accept_terms Acepto los
555 es-US business business_addrs_nobiz No tenemos un negocio asociado a esta dirección de Zcash, por favor ingrese su información abajo:
556 es-US business business_biz_addressholder Dirección
557 es-US business business_biz_addresslbl Dirección:
558 es-US business business_biz_cityholder Ciudad
559 es-US business business_biz_citylbl Ciudad:
560 es-US business business_biz_countryholder País
561 es-US business business_biz_countrylbl País:
562 es-US business business_biz_info Ingrese datos del negocio
563 es-US business business_biz_mailholder ejemplo@dominio.com
564 es-US business business_biz_maillbl E-mail:
565 es-US business business_biz_nameholder Nombre del negocio
566 es-US business business_biz_namelbl Nombre del Negocio:
567 es-US business business_biz_pcodeholder Código Postal
568 es-US business business_biz_pcodelbl Código Postal:
569 es-US business business_biz_stateholder Estado o Provincia
570 es-US business business_biz_statelbl Estado/Provincia:
571 es-US business business_biz_websiteholder Sitio web
572 es-US business business_biz_websitelbl Sitio Web:
573 es-US business business_contact_fnamelbl Nombre del Contacto:
574 es-US business business_contact_fnholder Nombre
575 es-US business business_contact_lnamelbl Apellido del Contacto:
576 es-US business business_contact_lnholder Apellido
577 es-US business business_save_btn Salvar
578 es-US business business_select_session Seleccione la duración de la sessión que necesita:
579 es-US business business_session_label Sesión:
580 es-US business business_session_lengthlbl Duración de la Sesión
581 es-US business business_session_paylbl Pagar
582 es-US business business_signup_title Registrar Negocio
583 es-US business business_terms_ofuse Términos de Uso
584 es-US business business_zgo_confirmlbl ZGo confirma su pago
585 es-US cancel cancel_confirm_btn Confirmar
586 es-US cancel cancel_dismiss_btn Descartar
587 es-US cancel cancel_title Cancelar
588 es-US checkout checkout_accept_btn Aceptar
589 es-US checkout checkout_cant_scan No puede escanear?
590 es-US checkout checkout_close_btn Cerrar
591 es-US checkout checkout_copyaddress_error Error al copiar dirección
592 es-US checkout checkout_copyamount_error Error al copiar el valor
593 es-US checkout checkout_copymemo_error Error al copiar Memo
594 es-US checkout checkout_copy_address Copiar Dirección
595 es-US checkout checkout_copy_amount Copie Valor
596 es-US checkout checkout_copy_memo Copie Valor
597 es-US checkout checkout_copy_notavail Fucionalidad de copia no soportada!!
598 es-US checkout checkout_notserv_close Cerrar
599 es-US checkout checkout_notserv_error Error
600 es-US checkout checkout_scan_payment Escanee para hacer el pago
601 es-US checkout checkout_use_this Use este
602 es-US checkout checkout_wallet_link link a billetera
603 es-US checkout checkout_wallet_or , o
604 es-US dbexport dbexport_btn_close Cancelar
605 es-US dbexport dbexport_closed_no No
606 es-US dbexport dbexport_closed_yes Si
607 es-US dbexport dbexport_date_range Rango de Fechas:
608 es-US dbexport dbexport_download_link Descargar
609 es-US dbexport dbexport_end_date Fecha final
610 es-US dbexport dbexport_export_descrip Exportar órdenes en un archivo de formato .CSV
611 es-US dbexport dbexport_file_header "Fecha","ID Orden","Moneda","Cerrada?","Valor","Tasa","ZEC","Pagada?","Factura"
612 es-US dbexport dbexport_invalid_end Fecha final inválida
613 es-US dbexport dbexport_invalid_start Fecha de inicio inválida
614 es-US dbexport dbexport_noorders_created Usted no tiene órdenes creadas.
615 es-US dbexport dbexport_nothing_todo Nada que hacer.
616 es-US dbexport dbexport_paid_no No
617 es-US dbexport dbexport_paid_yes Si
618 es-US dbexport dbexport_settings_title Exportar Ordenes
619 es-US dbexport dbexport_start_date Fecha inicial
620 es-US header header_get_currency Moneda:
621 es-US header header_last_block Último Bloque:
622 es-US invoice invoice_cant_scan No puede escanear?
623 es-US invoice invoice_copyaddress_error Error al copiar dirección
624 es-US invoice invoice_copyamount_error Error al copiar valor
625 es-US invoice invoice_copymemo_error Error al copiar Memo
626 es-US invoice invoice_copy_address Copie Dirección
627 es-US invoice invoice_copy_amount Copiar Valor
628 es-US invoice invoice_copy_memo Copiar Memo
629 es-US invoice invoice_copy_notavail Funcionalidad para copia no soportada
630 es-US invoice invoice_dot_or , o
631 es-US invoice invoice_info_notavail No hay información disponible.
632 es-US invoice invoice_invalid_id ID de Factura incorrecto.
633 es-US invoice invoice_invoice_lbl Factura
634 es-US invoice invoice_invoice_total Total Factura:
635 es-US invoice invoice_notserv_close Cerrar
636 es-US invoice invoice_notserv_error Error
637 es-US invoice invoice_order_date Fecha:
638 es-US invoice invoice_order_id ID del Pedido:
639 es-US invoice invoice_order_price Precio
640 es-US invoice invoice_payment_confirmed Pago Confirmado!!
641 es-US invoice invoice_payment_pending Pago Pendiente!!
642 es-US invoice invoice_qty_lbl Cant.
643 es-US invoice invoice_return_toshop Regresar a Tienda
644 es-US invoice invoice_scan_qrcode Escanee el código QR con su billetera para hacer el pago
645 es-US invoice invoice_use_this Use este
646 es-US invoice invoice_wallet_link link de billetera
647 es-US invoice invoice_zcash_price Precio de Zcash:
648 es-US itemadd itemadd_add_2order Agregar Item a la orden
649 es-US itemadd itemadd_cancel_btn Cancelar
650 es-US itemadd itemadd_save_btn Agregar
651 es-US itemcreate itemcreate_add_item Agregar Item
652 es-US itemcreate itemcreate_close_btn Cerrar
653 es-US itemcreate itemcreate_item_descr Descripcion
654 es-US itemcreate itemcreate_item_lbl Item
655 es-US itemcreate itemcreate_item_price Precio
656 es-US itemcreate itemcreate_save_btn Grabar
657 es-US itemcreate itemcreate_use_nums Use solo números
658 es-US itemdel itemdel_close_btn Cerrar
659 es-US itemdel itemdel_confirm_del Esta seguro de querer eliminar el item
660 es-US itemdel itemdel_delete_btn Eliminar
661 es-US itemdel itemdel_del_item Eliminar Item
662 es-US itemedit itemedit_close_btn Cerrar
663 es-US itemedit itemedit_edit_item Editar Item
664 es-US itemedit itemedit_item_descr Descripcion
665 es-US itemedit itemedit_item_label Item
666 es-US itemedit itemedit_item_price Precio:
667 es-US itemedit itemedit_save_btn Guardar
668 es-US itemlist itemlist_avail_items Items Disponibles:
669 es-US itemlist itemlist_list_empty No existen items!
670 es-US listorders listorders_backtoshop_btn Regresar a Tienda
671 es-US listorders listorders_export_orders Exportar Pedidos
672 es-US listorders listorders_invoice_btn Factura
673 es-US listorders listorders_item_lbl Item
674 es-US listorders listorders_no_orders No hay órdenes
675 es-US listorders listorders_order_id ID de Orden
676 es-US listorders listorders_order_total Total de la Orden:
677 es-US listorders listorders_overall_total Total General:
678 es-US listorders listorders_qty_lbl Cant.
679 es-US listorders listorders_receipt_btn Recibo
680 es-US listorders listorders_todays_total Total del Dia:
681 es-US listorders listorders_total_lbl Total
682 es-US login login_check_wallet Verifique su billetera!!
683 es-US login login_confirm_login ZGo confirma su ingreso en la cadena de Zcash
684 es-US login login_confirm_pin Confirme el PIN
685 es-US login login_connect_to_zgo Conectar su billetera a ZGo
686 es-US login login_enter_pin Ingrese el PIN enviado por ZGo para confirmar su billetera:
687 es-US login login_last_block Ultimo Bloque Verificado:
688 es-US login login_link_wallet Asociar Billetera
689 es-US login login_wrong_pin PIN Invalido!!
690 es-US main main_price_data Precios provistos por API de CoinGecko
691 es-US order order_cancel_btn Cancelar
692 es-US order order_cancel_ok Orden cancelada exitosamente!
693 es-US order order_cancel_order Cancelar Orden?
694 es-US order order_checkout_btn Procesar
695 es-US order order_confirm_cancel Esta seguro que quiere cancelar la orden?
696 es-US order order_confirm_remove Esta seguro de querer remover
697 es-US order order_confirm_remove1  de esta orden?
698 es-US order order_invoice_btn Factura
699 es-US order order_item_lbl Item
700 es-US order order_notserv_close Cerrar
701 es-US order order_notserv_success confirmado
702 es-US order order_no_openorder Sin órden abierta!!
703 es-US order order_qty_lbl Cant.
704 es-US order order_remove_item Remover Item?
705 es-US order order_total_lbl Total
706 es-US order order_total_title Total Pedido:
707 es-US pmtservice pmtservice_amount_doesnot Total no
708 es-US pmtservice pmtservice_cant_scan No puede escanear?
709 es-US pmtservice pmtservice_connecto_xero Conexion con Xero
710 es-US pmtservice pmtservice_copyaddress_error Error al copiar dirección
711 es-US pmtservice pmtservice_copyamount_error Error al copiar valor
712 es-US pmtservice pmtservice_copymemo_error Error al copiar Memo
713 es-US pmtservice pmtservice_copy_address Copiar Dirección
714 es-US pmtservice pmtservice_copy_amount Copiar Valor
715 es-US pmtservice pmtservice_copy_memo Copiar Memo
716 es-US pmtservice pmtservice_copy_notavail Funcionalidad para copia no soportada
717 es-US pmtservice pmtservice_currency_notsup no soportada!!
718 es-US pmtservice pmtservice_enabled_for habilitado para
719 es-US pmtservice pmtservice_hdr_txt1 Factura
720 es-US pmtservice pmtservice_hdr_txt2 ID de Orden:
721 es-US pmtservice pmtservice_hdr_txt3 Fecha:
722 es-US pmtservice pmtservice_invalid_ownerid ID de propietario inválida!!
723 es-US pmtservice pmtservice_invoice_currency Moneda
724 es-US pmtservice pmtservice_invoice_invalid tipo inválido!!
725 es-US pmtservice pmtservice_invoice_item Item:
726 es-US pmtservice pmtservice_invoice_notfound no encontrada!!
727 es-US pmtservice pmtservice_invoice_num Factura
728 es-US pmtservice pmtservice_invoice_paid ya pagada!!
729 es-US pmtservice pmtservice_invoice_price Precio
730 es-US pmtservice pmtservice_invoice_qty Cant.
731 es-US pmtservice pmtservice_invoice_total Total Factura:
732 es-US pmtservice pmtservice_match_value es igual al valor
733 es-US pmtservice pmtservice_notserv_close Cerrar
734 es-US pmtservice pmtservice_notserv_error Error
735 es-US pmtservice pmtservice_payment_confirmed Pago Confirmado!!
736 es-US pmtservice pmtservice_payment_notprocessed Solicitud de pago no fue procesada!!
737 es-US pmtservice pmtservice_payment_pending Pago Pendiente!!
738 es-US pmtservice pmtservice_pmtsrv_not Servicio de pagos no
739 es-US pmtservice pmtservice_reported_byxero reportado por Xero!!
740 es-US pmtservice pmtservice_scan_qrcode Escanee el código QR con su billetera para hacer el pago
741 es-US pmtservice pmtservice_server_failed servidor falló!!
742 es-US pmtservice pmtservice_use_this Use este
743 es-US pmtservice pmtservice_wallet_link link de billetera
744 es-US pmtservice pmtservice_zecdata_price Precio Zcash:
745 es-US pmtservice pmtservice_zecdata_total Total:
746 es-US promptinvoice promptinvoice_func_notavail Funcionalidad no disponible en su navegador. Use el botón de enviar en lugar de eso.
747 es-US promptinvoice promptinvoice_invoice_cancel Cancelar
748 es-US promptinvoice promptinvoice_invoice_clipboard URL de la factura copiado al Portapapeles!!
749 es-US promptinvoice promptinvoice_invoice_sent Enviado!
750 es-US promptinvoice promptinvoice_invoice_url URL de Factura:
751 es-US promptinvoice promptinvoice_notserv_close Cerrar
752 es-US promptinvoice promptinvoice_notserv_error Error
753 es-US promptinvoice promptinvoice_notserv_success Suceso
754 es-US promptinvoice promptinvoice_send_link Envíe el link de la factura a su cliente:
755 es-US promptreceipt promptreceipt_close_lbl Cerrar
756 es-US promptreceipt promptreceipt_func_notavail Functionality not available for your browser. Use send button
757 es-US promptreceipt promptreceipt_notserv_close Cerrar
758 es-US promptreceipt promptreceipt_notserv_error Error
759 es-US promptreceipt promptreceipt_notserv_success Suceso
760 es-US promptreceipt promptreceipt_receipt_clipboard URL del Recibo copiado a portapapeles!!
761 es-US promptreceipt promptreceipt_receipt_url URL del Recibo:
762 es-US promptreceipt promptreceipt_send_link Envíe el enlace del recibo a su cliente :
763 es-US receipt receipt_info_notavail No hay información disponible.
764 es-US receipt receipt_invalid_id ID de Recibo incorrecto.
765 es-US receipt receipt_order_date Fecha:
766 es-US receipt receipt_order_id ID de Orden:
767 es-US receipt receipt_order_price Precio:
768 es-US receipt receipt_order_total Total:
769 es-US receipt receipt_qty_lbl Cant.
770 es-US receipt receipt_receipt_lbl Recibo
771 es-US receipt receipt_zcash_price Precio de Zcash:
772 es-US receiptqr receiptqr_close_btn Cerrar
773 es-US receiptqr receiptqr_scan_receipt Escanee para obtener su Recibo
774 es-US scan scan_close_btn Cerrar
775 es-US scan scan_copy_address Copiar Dirección
776 es-US scan scan_copy_amount Copiar Valor
777 es-US scan scan_copy_error Error al copiar valor
778 es-US scan scan_copy_memo Copiar Memo
779 es-US scan scan_fail_payment Error al verificar pago
780 es-US scan scan_func_notavail Funcionalidad de copia no soportada
781 es-US scan scan_memo_sent Memorando enviado!
782 es-US scan scan_notserv_close Cerrar
783 es-US scan scan_notserv_error Error
784 es-US scan scan_scanqr_code Escanee el código QR
785 es-US scan scan_text_info Asegúrese de marcar la caja "Incluir Responder-A" en su billetera antes de enviar su memo
786 es-US scan scan_use_this No puede escanear? Use este
787 es-US scan scan_wallet_link Link de billetera
788 es-US settings settings_acode_invalid Código de Cuenta inválido (10 caracteres max.)
789 es-US settings settings_acode_lbl Código de Cuenta:
790 es-US settings settings_acode_notsaved Código de cuenta no guardado!
791 es-US settings settings_acode_saved Código de cuenta guardado!!
792 es-US settings settings_close_btn Cancelar
793 es-US settings settings_confirm_payments Confirmar pagos?
794 es-US settings settings_copy_notavail Funcionalidad no disponible para su navegador. Use el botón de enviar.
795 es-US settings settings_currency_lbl Moneda
796 es-US settings settings_link_2xero Enlazar a Xero
797 es-US settings settings_name_lbl Nombre
798 es-US settings settings_name_placeholder Su nombre
799 es-US settings settings_notserv_close Cerrar
800 es-US settings settings_notserv_error Error
801 es-US settings settings_notserv_success Suceso
802 es-US settings settings_notserv_warning Advertencia
803 es-US settings settings_ownerid_copied ID del propietario copiado a la papelera
804 es-US settings settings_ownerid_notcopied Copiar no disponible en su navegador
805 es-US settings settings_pmtserv_url URL del Servicio de Pago:
806 es-US settings settings_relink_2xero Reconectar a Xero
807 es-US settings settings_save_btn Salvar
808 es-US settings settings_tab_integrations Integraciones
809 es-US settings settings_tab_mainlbl Principal
810 es-US settings settings_URL_copied URL de ZGo copiado a la papelera!!
811 es-US settings settings_use_satoshi Usar zatoshis?
812 es-US settings settings_view_title Configuración
813 es-US settings settings_vkey_lbl Clave de visualización
814 es-US settings settings_vkey_placeholder Clave de visualización de su billetera
815 es-US settings settings_wctoken_copied Token de WooCommerce copiado a la papelera
816 es-US settings settings_wctoken_generated Token de WooCommerce generado!
817 es-US settings settings_wctoken_genfail Falla generación de Token de WooCommerce
818 es-US settings settings_wctoken_notcopied Copiar no disponible en su navegador
819 es-US settings settings_wc_closebtn Cerrar
820 es-US settings settings_wc_gentoken Generar Token
821 es-US settings settings_wc_lbl WooCommerce
822 es-US settings settings_wc_ownerlbl Propietario:
823 es-US settings settings_xeropmt_confirmdis Confirmación de pagos de Xero desactivada!!
824 es-US settings settings_xero_closebtn Cerrar
825 es-US settings settings_xero_lbl Xero
826 es-US settings settings_xero_savebtn Guardar Código
827 es-US viewer viewer_view_orders Ver Ordenes
828 es-US xero xero_connected_2xero Conectado a Xero!
829 es-US xero xero_connecting_2xero Conectando a Xero..

View file

@ -1,886 +0,0 @@
-- phpMyAdmin SQL Dump
-- version 5.2.1-1.fc37.remi
-- https://www.phpmyadmin.net/
--
-- Host: localhost
-- Generation Time: Feb 23, 2023 at 02:58 PM
-- Server version: 10.7.7-MariaDB
-- PHP Version: 8.1.16
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Database: `zgoi18n`
--
-- --------------------------------------------------------
--
-- Table structure for table `languages`
--
DROP TABLE IF EXISTS `languages`;
CREATE TABLE `languages` (
`encode_id` varchar(10) NOT NULL DEFAULT '' COMMENT 'Language encoding id',
`view_name` varchar(32) NOT NULL DEFAULT '' COMMENT 'View name that use this language',
`view_element` varchar(32) NOT NULL DEFAULT '' COMMENT 'Element name',
`view_element_text` varchar(4000) NOT NULL DEFAULT '' COMMENT 'Text to be displayed'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='ZGo Language translation database';
--
-- Dumping data for table `languages`
--
INSERT INTO `languages` (`encode_id`, `view_name`, `view_element`, `view_element_text`) VALUES
('br-US', 'business', 'business_accept_terms', 'Eu aceito os '),
('br-US', 'business', 'business_addrs_nobiz', 'Não temos um negócio associado a este endereço Zcash, por favor insira suas informações abaixo:'),
('br-US', 'business', 'business_biz_addressholder', 'Endereço'),
('br-US', 'business', 'business_biz_addresslbl', 'Endereço:'),
('br-US', 'business', 'business_biz_cityholder', 'Cidade'),
('br-US', 'business', 'business_biz_citylbl', 'Cidade:'),
('br-US', 'business', 'business_biz_countryholder', 'País'),
('br-US', 'business', 'business_biz_countrylbl', 'País:'),
('br-US', 'business', 'business_biz_info', 'Insira os dados da empresa'),
('br-US', 'business', 'business_biz_mailholder', 'exemplo@dominio.com'),
('br-US', 'business', 'business_biz_maillbl', 'E-mail'),
('br-US', 'business', 'business_biz_nameholder', 'Nome da empresa'),
('br-US', 'business', 'business_biz_namelbl', 'Nome da empresa:'),
('br-US', 'business', 'business_biz_pcodeholder', 'Código Postal'),
('br-US', 'business', 'business_biz_pcodelbl', 'Código postal:'),
('br-US', 'business', 'business_biz_stateholder', 'Estado/Provincia'),
('br-US', 'business', 'business_biz_statelbl', 'Estado/Provincia'),
('br-US', 'business', 'business_biz_websiteholder', 'Website'),
('br-US', 'business', 'business_biz_websitelbl', 'Website'),
('br-US', 'business', 'business_contact_fnamelbl', 'Primeiro nome do contato:'),
('br-US', 'business', 'business_contact_fnholder', 'Nome'),
('br-US', 'business', 'business_contact_lnamelbl', 'Último sobrenome do contato:'),
('br-US', 'business', 'business_contact_lnholder', 'Sobrenome '),
('br-US', 'business', 'business_save_btn', 'Salvar'),
('br-US', 'business', 'business_select_session', 'Selecione a duração da sessão que você necessita:'),
('br-US', 'business', 'business_session_label', 'Sessão:'),
('br-US', 'business', 'business_session_lengthlbl', 'Duração da sessão'),
('br-US', 'business', 'business_session_paylbl', 'Pagar'),
('br-US', 'business', 'business_signup_title', 'Inscrição de negócio'),
('br-US', 'business', 'business_terms_ofuse', 'Termos de Uso'),
('br-US', 'business', 'business_zgo_confirmlbl', 'ZGo confirma o seu pagamento'),
('br-US', 'cancel', 'cancel_confirm_btn', 'Confirmar'),
('br-US', 'cancel', 'cancel_dismiss_btn', 'Descartar'),
('br-US', 'cancel', 'cancel_title', 'Cancelar'),
('br-US', 'checkout', 'checkout_accept_btn', 'Aceitar'),
('br-US', 'checkout', 'checkout_cant_scan', 'Não consegue escanear?'),
('br-US', 'checkout', 'checkout_close_btn', 'Fechar'),
('br-US', 'checkout', 'checkout_copyaddress_error', 'Erro ao copiar endereço'),
('br-US', 'checkout', 'checkout_copyamount_error', 'Erro ao copiar o valor'),
('br-US', 'checkout', 'checkout_copymemo_error', 'Erro ao copiar o memorando'),
('br-US', 'checkout', 'checkout_copy_address', 'Copiar Endereço'),
('br-US', 'checkout', 'checkout_copy_amount', 'Copiar Valor'),
('br-US', 'checkout', 'checkout_copy_memo', 'Copiar Memo'),
('br-US', 'checkout', 'checkout_copy_notavail', 'Funcionalidade de cópia não suportada!!'),
('br-US', 'checkout', 'checkout_notserv_close', 'Fechar'),
('br-US', 'checkout', 'checkout_notserv_error', 'Erro'),
('br-US', 'checkout', 'checkout_scan_payment', 'Escaneie para fazer o pagamento'),
('br-US', 'checkout', 'checkout_use_this', 'Use este/isso'),
('br-US', 'checkout', 'checkout_wallet_link', 'link de carteira'),
('br-US', 'checkout', 'checkout_wallet_or', ', ou '),
('br-US', 'dbexport', 'dbexport_btn_close', 'Cancelar'),
('br-US', 'dbexport', 'dbexport_closed_no', 'Não'),
('br-US', 'dbexport', 'dbexport_closed_yes', 'Sim'),
('br-US', 'dbexport', 'dbexport_date_range', 'Intervalo de datas:'),
('br-US', 'dbexport', 'dbexport_download_link', 'Download'),
('br-US', 'dbexport', 'dbexport_end_date', 'Data de término'),
('br-US', 'dbexport', 'dbexport_export_descrip', 'Exportar pedidos em um arquivo de formato .CSV'),
('br-US', 'dbexport', 'dbexport_file_header', '\"Data\",\"ID do pedido\",\"Moeda\",\"Fechado?\",\"Valor\",\"Taxa\",\"ZEC\",\"Pago?\",\"Fatura\"'),
('br-US', 'dbexport', 'dbexport_invalid_end', 'Data final inválida'),
('br-US', 'dbexport', 'dbexport_invalid_start', 'Data de início inválida'),
('br-US', 'dbexport', 'dbexport_noorders_created', 'Você não tem pedidos criados.'),
('br-US', 'dbexport', 'dbexport_nothing_todo', 'Nada para fazer.'),
('br-US', 'dbexport', 'dbexport_paid_no', 'Não'),
('br-US', 'dbexport', 'dbexport_paid_yes', 'Sim'),
('br-US', 'dbexport', 'dbexport_settings_title', 'Exportar pedidos'),
('br-US', 'dbexport', 'dbexport_start_date', 'Data de início'),
('br-US', 'header', 'header_get_currency', 'Moeda:'),
('br-US', 'header', 'header_last_block', 'Último Bloco:'),
('br-US', 'invoice', 'invoice_cant_scan', 'Não consegue escanear?'),
('br-US', 'invoice', 'invoice_copyaddress_error', 'Erro ao copiar endereço'),
('br-US', 'invoice', 'invoice_copyamount_error', 'Erro ao copiar o valor'),
('br-US', 'invoice', 'invoice_copymemo_error', 'Erro ao copiar o memorando'),
('br-US', 'invoice', 'invoice_copy_address', 'Copiar Endereço'),
('br-US', 'invoice', 'invoice_copy_amount', 'Copiar Valor'),
('br-US', 'invoice', 'invoice_copy_memo', 'Copiar Memo'),
('br-US', 'invoice', 'invoice_copy_notavail', 'Funcionalidade de cópia não suportada'),
('br-US', 'invoice', 'invoice_dot_or', ', ou'),
('br-US', 'invoice', 'invoice_info_notavail', 'Não há informação disponível.'),
('br-US', 'invoice', 'invoice_invalid_id', 'ID do fatura incorreto.'),
('br-US', 'invoice', 'invoice_invoice_lbl', 'Fatura'),
('br-US', 'invoice', 'invoice_invoice_total', 'Total da Fatura:'),
('br-US', 'invoice', 'invoice_notserv_close', 'Fechar'),
('br-US', 'invoice', 'invoice_notserv_error', 'Erro'),
('br-US', 'invoice', 'invoice_order_date', 'Data: '),
('br-US', 'invoice', 'invoice_order_id', 'ID do Pedido: '),
('br-US', 'invoice', 'invoice_order_price', 'Preço '),
('br-US', 'invoice', 'invoice_payment_confirmed', 'Pagamento Confirmado!!'),
('br-US', 'invoice', 'invoice_payment_pending', 'Pagamento Pendente!!'),
('br-US', 'invoice', 'invoice_qty_lbl', 'Qtde.'),
('br-US', 'invoice', 'invoice_return_toshop', 'Voltar à Loja'),
('br-US', 'invoice', 'invoice_scan_qrcode', 'Escaneie o QR Code com sua carteira para efetuar o pagamento'),
('br-US', 'invoice', 'invoice_use_this', 'Use isso '),
('br-US', 'invoice', 'invoice_wallet_link', 'Link da Carteira'),
('br-US', 'invoice', 'invoice_zcash_price', 'Preço da Zcash: '),
('br-US', 'itemadd', 'itemadd_add_2order', 'Adicionar Item ao Pedido'),
('br-US', 'itemadd', 'itemadd_cancel_btn', 'Cancelar'),
('br-US', 'itemadd', 'itemadd_save_btn', 'Adicionar'),
('br-US', 'itemcreate', 'itemcreate_add_item', 'Adicionar Item'),
('br-US', 'itemcreate', 'itemcreate_close_btn', 'Fechar'),
('br-US', 'itemcreate', 'itemcreate_item_descr', 'Descrição'),
('br-US', 'itemcreate', 'itemcreate_item_lbl', 'Item'),
('br-US', 'itemcreate', 'itemcreate_item_price', 'Preço'),
('br-US', 'itemcreate', 'itemcreate_save_btn', 'Salvar'),
('br-US', 'itemcreate', 'itemcreate_use_nums', 'Use apenas números'),
('br-US', 'itemdel', 'itemdel_close_btn', 'Fechar'),
('br-US', 'itemdel', 'itemdel_confirm_del', 'Tem certeza de que deseja apagar '),
('br-US', 'itemdel', 'itemdel_delete_btn', 'Excluir'),
('br-US', 'itemdel', 'itemdel_del_item', 'Excluir Item'),
('br-US', 'itemedit', 'itemedit_close_btn', 'Fechar'),
('br-US', 'itemedit', 'itemedit_edit_item', 'Editar Item'),
('br-US', 'itemedit', 'itemedit_item_descr', 'Descrição '),
('br-US', 'itemedit', 'itemedit_item_label', 'Item'),
('br-US', 'itemedit', 'itemedit_item_price', 'Preço:'),
('br-US', 'itemedit', 'itemedit_save_btn', 'Salvar'),
('br-US', 'itemlist', 'itemlist_avail_items', 'Items disponíveis:'),
('br-US', 'itemlist', 'itemlist_list_empty', 'Ainda não há itens'),
('br-US', 'listorders', 'listorders_backtoshop_btn', 'Voltar a Loja'),
('br-US', 'listorders', 'listorders_export_orders', 'Exportar Pedidos'),
('br-US', 'listorders', 'listorders_invoice_btn', 'Fatura'),
('br-US', 'listorders', 'listorders_item_lbl', 'Item'),
('br-US', 'listorders', 'listorders_no_orders', 'Não há Pedidos'),
('br-US', 'listorders', 'listorders_order_id', 'ID do Pedido'),
('br-US', 'listorders', 'listorders_order_total', 'Total do Pedido:'),
('br-US', 'listorders', 'listorders_overall_total', 'Total geral: '),
('br-US', 'listorders', 'listorders_qty_lbl', 'Qtde.'),
('br-US', 'listorders', 'listorders_receipt_btn', 'Comprovante'),
('br-US', 'listorders', 'listorders_todays_total', 'Total de hoje: '),
('br-US', 'listorders', 'listorders_total_lbl', 'Total'),
('br-US', 'login', 'login_check_wallet', 'Verifique sua carteira!!'),
('br-US', 'login', 'login_confirm_login', 'ZGo confirma seu login na blockchain da Zcash'),
('br-US', 'login', 'login_confirm_pin', 'Confirmar Senha'),
('br-US', 'login', 'login_connect_to_zgo', 'Conecte sua carteira ao ZGo'),
('br-US', 'login', 'login_enter_pin', 'Insira a senha enviada pela ZGo para confirmar a propriedade da carteira:'),
('br-US', 'login', 'login_last_block', 'Último bloco visto:'),
('br-US', 'login', 'login_link_wallet', 'Conecte sua carteira'),
('br-US', 'login', 'login_wrong_pin', 'Senha incorreta!'),
('br-US', 'main', 'main_price_data', 'Preços informados pela CoinGecko API'),
('br-US', 'order', 'order_cancel_btn', 'Cancelar'),
('br-US', 'order', 'order_cancel_ok', 'Pedido cancelado com sucesso!'),
('br-US', 'order', 'order_cancel_order', 'Cancelar o pedido?'),
('br-US', 'order', 'order_checkout_btn', 'Procesar'),
('br-US', 'order', 'order_confirm_cancel', 'Tem certeza que deseja cancelar o pedido?'),
('br-US', 'order', 'order_confirm_remove', 'Tem certeza que deseja remover <<'),
('br-US', 'order', 'order_confirm_remove1', ' deste pedido?'),
('br-US', 'order', 'order_invoice_btn', 'Fatura'),
('br-US', 'order', 'order_item_lbl', 'Item'),
('br-US', 'order', 'order_notserv_close', 'Fechar'),
('br-US', 'order', 'order_notserv_success', 'succeso'),
('br-US', 'order', 'order_no_openorder', 'Sem pedido aberto!!'),
('br-US', 'order', 'order_qty_lbl', 'Qtde.'),
('br-US', 'order', 'order_remove_item', 'Remover o Item?'),
('br-US', 'order', 'order_total_lbl', 'Total'),
('br-US', 'order', 'order_total_title', 'Total do Pedido:'),
('br-US', 'pmtservice', 'pmtservice_amount_doesnot', 'O Valor não'),
('br-US', 'pmtservice', 'pmtservice_cant_scan', 'Não consegue escanear?'),
('br-US', 'pmtservice', 'pmtservice_connecto_xero', 'Conexão para o Xero'),
('br-US', 'pmtservice', 'pmtservice_copyaddress_error', 'Erro ao copiar endereço'),
('br-US', 'pmtservice', 'pmtservice_copyamount_error', 'Erro ao copiar o valor'),
('br-US', 'pmtservice', 'pmtservice_copymemo_error', 'Erro ao copiar o memorando'),
('br-US', 'pmtservice', 'pmtservice_copy_address', 'Copiar Endereço'),
('br-US', 'pmtservice', 'pmtservice_copy_amount', 'Copiar Valor'),
('br-US', 'pmtservice', 'pmtservice_copy_memo', 'Copiar Memo'),
('br-US', 'pmtservice', 'pmtservice_copy_notavail', 'Funcionalidade de cópia não suportada'),
('br-US', 'pmtservice', 'pmtservice_currency_notsup', 'não suportada!!'),
('br-US', 'pmtservice', 'pmtservice_enabled_for', 'habilitado para'),
('br-US', 'pmtservice', 'pmtservice_hdr_txt1', 'Fatura'),
('br-US', 'pmtservice', 'pmtservice_hdr_txt2', 'ID do Pedido: '),
('br-US', 'pmtservice', 'pmtservice_hdr_txt3', 'Data: '),
('br-US', 'pmtservice', 'pmtservice_invalid_ownerid', 'ID do proprietário inválido!!'),
('br-US', 'pmtservice', 'pmtservice_invoice_currency', 'Moeda'),
('br-US', 'pmtservice', 'pmtservice_invoice_invalid', 'tipo inválido!!'),
('br-US', 'pmtservice', 'pmtservice_invoice_item', 'Item:'),
('br-US', 'pmtservice', 'pmtservice_invoice_notfound', 'não encontrada!!'),
('br-US', 'pmtservice', 'pmtservice_invoice_num', 'Fatura'),
('br-US', 'pmtservice', 'pmtservice_invoice_paid', 'já pago!!'),
('br-US', 'pmtservice', 'pmtservice_invoice_price', 'Preço'),
('br-US', 'pmtservice', 'pmtservice_invoice_qty', 'Qtde.'),
('br-US', 'pmtservice', 'pmtservice_invoice_total', 'Total da Fatura:'),
('br-US', 'pmtservice', 'pmtservice_match_value', 'corresponde ao valor'),
('br-US', 'pmtservice', 'pmtservice_notserv_close', 'Fechar'),
('br-US', 'pmtservice', 'pmtservice_notserv_error', 'Erro'),
('br-US', 'pmtservice', 'pmtservice_payment_confirmed', 'Pagamento Confirmado!!'),
('br-US', 'pmtservice', 'pmtservice_payment_notprocessed', 'Pedido de pagamento não foi processado!!'),
('br-US', 'pmtservice', 'pmtservice_payment_pending', 'Pagamento Pendente!!'),
('br-US', 'pmtservice', 'pmtservice_pmtsrv_not', 'Serviço de pagamento não'),
('br-US', 'pmtservice', 'pmtservice_reported_byxero', 'reportado por Xero!!'),
('br-US', 'pmtservice', 'pmtservice_scan_qrcode', 'Escaneie o QR Code com sua carteira para efetuar o pagamento'),
('br-US', 'pmtservice', 'pmtservice_server_failed', 'servidor falhou!!'),
('br-US', 'pmtservice', 'pmtservice_use_this', 'Use isso'),
('br-US', 'pmtservice', 'pmtservice_wallet_link', 'Link da Carteira'),
('br-US', 'pmtservice', 'pmtservice_zecdata_price', 'Preço da Zcash:'),
('br-US', 'pmtservice', 'pmtservice_zecdata_total', 'Total: '),
('br-US', 'promptinvoice', 'promptinvoice_func_notavail', 'Funcionalidade não disponível para o seu navegador. Use o botão enviar ao invés disso'),
('br-US', 'promptinvoice', 'promptinvoice_invoice_cancel', 'Cancelar'),
('br-US', 'promptinvoice', 'promptinvoice_invoice_clipboard', 'URL da fatura copiado para a área de transferência!!'),
('br-US', 'promptinvoice', 'promptinvoice_invoice_sent', 'Enviado!'),
('br-US', 'promptinvoice', 'promptinvoice_invoice_url', 'URL da Fatura:'),
('br-US', 'promptinvoice', 'promptinvoice_notserv_close', 'Fechar'),
('br-US', 'promptinvoice', 'promptinvoice_notserv_error', 'Erro'),
('br-US', 'promptinvoice', 'promptinvoice_notserv_success', 'Suceso'),
('br-US', 'promptinvoice', 'promptinvoice_send_link', 'Envie o link da fatura para o seu cliente:'),
('br-US', 'promptreceipt', 'promptreceipt_close_lbl', 'Fechar'),
('br-US', 'promptreceipt', 'promptreceipt_func_notavail', 'Funcionalidade não disponível para o seu navegador. Use o botão Enviar'),
('br-US', 'promptreceipt', 'promptreceipt_notserv_close', 'Fechar'),
('br-US', 'promptreceipt', 'promptreceipt_notserv_error', 'Erro'),
('br-US', 'promptreceipt', 'promptreceipt_notserv_success', 'Sucesso'),
('br-US', 'promptreceipt', 'promptreceipt_receipt_clipboard', 'URL do comprovante foi copiado para a área de transferência!!'),
('br-US', 'promptreceipt', 'promptreceipt_receipt_url', 'URL do comprovante:'),
('br-US', 'promptreceipt', 'promptreceipt_send_link', 'Envie o link do comprovante para o seu cliente:'),
('br-US', 'receipt', 'receipt_info_notavail', 'Não há informação disponível.'),
('br-US', 'receipt', 'receipt_invalid_id', 'ID do comprovante incorreto.'),
('br-US', 'receipt', 'receipt_order_date', 'Data:'),
('br-US', 'receipt', 'receipt_order_id', 'ID do Pedido:'),
('br-US', 'receipt', 'receipt_order_price', 'Preço:'),
('br-US', 'receipt', 'receipt_order_total', 'Total:'),
('br-US', 'receipt', 'receipt_qty_lbl', 'Qtde.'),
('br-US', 'receipt', 'receipt_receipt_lbl', 'Comprovante'),
('br-US', 'receipt', 'receipt_zcash_price', 'Preço da Zcash:'),
('br-US', 'receiptqr', 'receiptqr_close_btn', 'Fechar'),
('br-US', 'receiptqr', 'receiptqr_scan_receipt', 'Escaneie para o seu comprovante'),
('br-US', 'scan', 'scan_close_btn', 'Fechar'),
('br-US', 'scan', 'scan_copy_address', 'Copiar Endereço'),
('br-US', 'scan', 'scan_copy_amount', 'Copiar Valor'),
('br-US', 'scan', 'scan_copy_error', 'Falha ao copiar o valor'),
('br-US', 'scan', 'scan_copy_memo', 'Copiar Memo'),
('br-US', 'scan', 'scan_fail_payment', 'Erro ao verificar o pagamento'),
('br-US', 'scan', 'scan_func_notavail', 'Funcionalidade de cópia não suportada'),
('br-US', 'scan', 'scan_memo_sent', 'Memorando enviado!'),
('br-US', 'scan', 'scan_notserv_close', 'Fechar'),
('br-US', 'scan', 'scan_notserv_error', 'Erro'),
('br-US', 'scan', 'scan_scanqr_code', 'Scanei o QR Code'),
('br-US', 'scan', 'scan_text_info', 'Certifique-se de selecionar \"Incluir Responder-A\" na sua carteira antes de enviar o seu memorando.'),
('br-US', 'scan', 'scan_use_this', 'Não consegue escanear ? Use isso'),
('br-US', 'scan', 'scan_wallet_link', 'Link de carteira'),
('br-US', 'settings', 'settings_acode_invalid', 'Número da Conta inválido (10 caracteres no máximo)'),
('br-US', 'settings', 'settings_acode_lbl', 'Número da conta:'),
('br-US', 'settings', 'settings_acode_notsaved', 'Número da Conta não salvo!!'),
('br-US', 'settings', 'settings_acode_saved', 'Número da conta Salvo!!'),
('br-US', 'settings', 'settings_close_btn', 'Cancelar'),
('br-US', 'settings', 'settings_confirm_payments', 'Confirmar pagamentos?'),
('br-US', 'settings', 'settings_copy_notavail', 'Funcionalidade não disponível para o seu navegador. Use o botão enviar ao invés disso'),
('br-US', 'settings', 'settings_currency_lbl', 'Moeda'),
('br-US', 'settings', 'settings_link_2xero', 'Conectar-se ao Xero'),
('br-US', 'settings', 'settings_name_lbl', 'Nome'),
('br-US', 'settings', 'settings_name_placeholder', 'Seu nome'),
('br-US', 'settings', 'settings_notserv_close', 'Fechar'),
('br-US', 'settings', 'settings_notserv_error', 'Erro'),
('br-US', 'settings', 'settings_notserv_success', 'Sucesso'),
('br-US', 'settings', 'settings_notserv_warning', 'Aviso'),
('br-US', 'settings', 'settings_ownerid_copied', 'ID do proprietário copiado para a prancheta'),
('br-US', 'settings', 'settings_ownerid_notcopied', 'Cópia não disponível em seu navegador'),
('br-US', 'settings', 'settings_pmtserv_url', 'URL de Serviço de Pagamento:'),
('br-US', 'settings', 'settings_relink_2xero', 'Reconectar-se ao Xero '),
('br-US', 'settings', 'settings_save_btn', 'Salvar'),
('br-US', 'settings', 'settings_tab_integrations', 'Integrações'),
('br-US', 'settings', 'settings_tab_mainlbl', 'Principal'),
('br-US', 'settings', 'settings_url_copied', 'URL ZGo copiado para a prancheta!!'),
('br-US', 'settings', 'settings_use_satoshi', 'Usar zatoshis?'),
('br-US', 'settings', 'settings_view_title', 'Definições'),
('br-US', 'settings', 'settings_vkey_lbl', 'Chave de visualização'),
('br-US', 'settings', 'settings_vkey_placeholder', 'Sua chave de visualização da carteira'),
('br-US', 'settings', 'settings_wctoken_copied', 'Token WooCommerce copiado para a prancheta'),
('br-US', 'settings', 'settings_wctoken_generated', 'Token da WoCommerce gerado'),
('br-US', 'settings', 'settings_wctoken_genfail', 'Geração do token da WooCommerce falhou'),
('br-US', 'settings', 'settings_wctoken_notcopied', 'Cópia não disponível no seu navegador'),
('br-US', 'settings', 'settings_wc_closebtn', 'Fechar'),
('br-US', 'settings', 'settings_wc_gentoken', 'Gerar Token'),
('br-US', 'settings', 'settings_wc_lbl', 'WooCommerce'),
('br-US', 'settings', 'settings_wc_ownerlbl', 'Proprietário:'),
('br-US', 'settings', 'settings_xeropmt_confirmdis', 'Confirmação de pagamentos Xero desativada!! '),
('br-US', 'settings', 'settings_xero_closebtn', 'Fechar'),
('br-US', 'settings', 'settings_xero_lbl', 'Xero'),
('br-US', 'settings', 'settings_xero_savebtn', 'Salvar código'),
('br-US', 'viewer', 'viewer_view_orders', 'Ver Pedidos'),
('br-US', 'xero', 'xero_connected_2xero', 'Conectado ao Xero!'),
('br-US', 'xero', 'xero_connecting_2xero', 'Conectando ao Xero..'),
('en-US', 'business', 'business_accept_terms', 'I accept the '),
('en-US', 'business', 'business_addrs_nobiz', 'We do not have a business associated with this Zcash address, please enter your information below:'),
('en-US', 'business', 'business_biz_addressholder', 'Address'),
('en-US', 'business', 'business_biz_addresslbl', 'Address:'),
('en-US', 'business', 'business_biz_cityholder', 'City'),
('en-US', 'business', 'business_biz_citylbl', 'City:'),
('en-US', 'business', 'business_biz_countryholder', 'Country'),
('en-US', 'business', 'business_biz_countrylbl', 'Country:'),
('en-US', 'business', 'business_biz_info', 'Provide business info'),
('en-US', 'business', 'business_biz_mailholder', 'example@domain.com'),
('en-US', 'business', 'business_biz_maillbl', 'E-mail:'),
('en-US', 'business', 'business_biz_nameholder', 'Business name'),
('en-US', 'business', 'business_biz_namelbl', 'Business Name:'),
('en-US', 'business', 'business_biz_pcodeholder', 'Postal code'),
('en-US', 'business', 'business_biz_pcodelbl', 'Postal Code:'),
('en-US', 'business', 'business_biz_stateholder', 'State or Province'),
('en-US', 'business', 'business_biz_statelbl', 'State/Province:'),
('en-US', 'business', 'business_biz_websiteholder', 'website'),
('en-US', 'business', 'business_biz_websitelbl', 'Website:'),
('en-US', 'business', 'business_contact_fnamelbl', 'Contact First name:'),
('en-US', 'business', 'business_contact_fnholder', 'First name'),
('en-US', 'business', 'business_contact_lnamelbl', 'Contact Last Name:'),
('en-US', 'business', 'business_contact_lnholder', 'Last Name'),
('en-US', 'business', 'business_save_btn', 'Save'),
('en-US', 'business', 'business_select_session ', 'Please select the length of session that you need:'),
('en-US', 'business', 'business_session_label', 'Session:'),
('en-US', 'business', 'business_session_lengthlbl', 'Session Length'),
('en-US', 'business', 'business_session_paylbl', 'Pay'),
('en-US', 'business', 'business_signup_title', 'Business sign-up'),
('en-US', 'business', 'business_terms_ofuse', 'Terms of Use'),
('en-US', 'business', 'business_zgo_confirmlbl', 'ZGo confirms your payment'),
('en-US', 'cancel', 'cancel_confirm_btn', 'Confirm'),
('en-US', 'cancel', 'cancel_dismiss_btn', 'Dismiss'),
('en-US', 'cancel', 'cancel_title', 'Cancel'),
('en-US', 'checkout', 'checkout_accept_btn', 'Accept'),
('en-US', 'checkout', 'checkout_cant_scan', 'Can\'t scan?'),
('en-US', 'checkout', 'checkout_close_btn', 'Close'),
('en-US', 'checkout', 'checkout_copyaddress_error', 'Error copying address'),
('en-US', 'checkout', 'checkout_copyamount_error', 'Error while copying ammount'),
('en-US', 'checkout', 'checkout_copymemo_error', 'Error while copying Memo'),
('en-US', 'checkout', 'checkout_copy_address', 'Copy Address'),
('en-US', 'checkout', 'checkout_copy_amount', 'Copy Amount'),
('en-US', 'checkout', 'checkout_copy_memo', 'Copy Memo'),
('en-US', 'checkout', 'checkout_copy_notavail', 'Copy functionality not supported!!'),
('en-US', 'checkout', 'checkout_notserv_close', 'Close'),
('en-US', 'checkout', 'checkout_notserv_error', 'Error'),
('en-US', 'checkout', 'checkout_scan_payment', 'Scan to make payment'),
('en-US', 'checkout', 'checkout_use_this', 'Use this '),
('en-US', 'checkout', 'checkout_wallet_link', 'wallet link'),
('en-US', 'checkout', 'checkout_wallet_or', ', or '),
('en-US', 'dbexport', 'dbexport_btn_close', 'Cancel'),
('en-US', 'dbexport', 'dbexport_closed_no', 'No'),
('en-US', 'dbexport', 'dbexport_closed_yes', 'Yes'),
('en-US', 'dbexport', 'dbexport_date_range', 'Date Range:'),
('en-US', 'dbexport', 'dbexport_download_link', 'Download'),
('en-US', 'dbexport', 'dbexport_end_date', 'End date'),
('en-US', 'dbexport', 'dbexport_export_descrip', 'Export orders in a .CSV format file'),
('en-US', 'dbexport', 'dbexport_file_header', '\"Date\",\"Order ID\",\"Currency\",\"Closed?\",\"Amount\",\"Rate\",\"ZEC\",\"Paid?\",\"Invoice\"'),
('en-US', 'dbexport', 'dbexport_invalid_end', 'Invalid end date'),
('en-US', 'dbexport', 'dbexport_invalid_start', 'Invalid start date'),
('en-US', 'dbexport', 'dbexport_noorders_created', 'You have no orders created.'),
('en-US', 'dbexport', 'dbexport_nothing_todo', 'Nothing to do.'),
('en-US', 'dbexport', 'dbexport_paid_no', 'No'),
('en-US', 'dbexport', 'dbexport_paid_yes', 'Yes'),
('en-US', 'dbexport', 'dbexport_settings_title', 'Export Orders'),
('en-US', 'dbexport', 'dbexport_start_date', 'Start date'),
('en-US', 'header', 'header_get_currency', 'Currency:'),
('en-US', 'header', 'header_last_block', 'Last Block:'),
('en-US', 'invoice', 'invoice_cant_scan', 'Can\'t scan?'),
('en-US', 'invoice', 'invoice_copyaddress_error', 'Error while copying address'),
('en-US', 'invoice', 'invoice_copyamount_error', 'Error while copying amount'),
('en-US', 'invoice', 'invoice_copymemo_error', 'Error while copying Memo'),
('en-US', 'invoice', 'invoice_copy_address', 'Copy Address'),
('en-US', 'invoice', 'invoice_copy_amount', 'Copy Amount'),
('en-US', 'invoice', 'invoice_copy_memo', 'Copy Memo'),
('en-US', 'invoice', 'invoice_copy_notavail', 'Copy functionality not supported'),
('en-US', 'invoice', 'invoice_dot_or', ', or'),
('en-US', 'invoice', 'invoice_info_notavail', 'No information available.'),
('en-US', 'invoice', 'invoice_invalid_id', 'Incorrect Invoice ID.'),
('en-US', 'invoice', 'invoice_invoice_lbl', 'Invoice'),
('en-US', 'invoice', 'invoice_invoice_total', 'Invoice Total: '),
('en-US', 'invoice', 'invoice_notserv_close', 'Close'),
('en-US', 'invoice', 'invoice_notserv_error', 'Error'),
('en-US', 'invoice', 'invoice_order_date', 'Date: '),
('en-US', 'invoice', 'invoice_order_id', 'Order ID: '),
('en-US', 'invoice', 'invoice_order_price', 'Price '),
('en-US', 'invoice', 'invoice_payment_confirmed', 'Payment Confirmed!!'),
('en-US', 'invoice', 'invoice_payment_pending', 'Payment Pending!!'),
('en-US', 'invoice', 'invoice_qty_lbl', 'Qty.'),
('en-US', 'invoice', 'invoice_return_toshop', 'Return to Shop'),
('en-US', 'invoice', 'invoice_scan_qrcode', 'Scan the QR code with your wallet to make payment'),
('en-US', 'invoice', 'invoice_use_this', 'Use this '),
('en-US', 'invoice', 'invoice_wallet_link', 'wallet link'),
('en-US', 'invoice', 'invoice_zcash_price', 'Zcash price: '),
('en-US', 'itemadd', 'itemadd_add_2order', 'Add Item to Order'),
('en-US', 'itemadd', 'itemadd_cancel_btn', 'Cancel'),
('en-US', 'itemadd', 'itemadd_save_btn', 'Add'),
('en-US', 'itemcreate', 'itemcreate_add_item', 'Add Item'),
('en-US', 'itemcreate', 'itemcreate_close_btn', 'Close'),
('en-US', 'itemcreate', 'itemcreate_item_descr', 'Description'),
('en-US', 'itemcreate', 'itemcreate_item_lbl', 'Item'),
('en-US', 'itemcreate', 'itemcreate_item_price', 'Price'),
('en-US', 'itemcreate', 'itemcreate_save_btn', 'Save'),
('en-US', 'itemcreate', 'itemcreate_use_nums', 'Use only numbers'),
('en-US', 'itemdel', 'itemdel_close_btn', 'Close'),
('en-US', 'itemdel', 'itemdel_confirm_del', 'Are you sure you want to delete '),
('en-US', 'itemdel', 'itemdel_delete_btn', 'Delete'),
('en-US', 'itemdel', 'itemdel_del_item', 'Delete Item'),
('en-US', 'itemedit', 'itemedit_close_btn', 'Close'),
('en-US', 'itemedit', 'itemedit_edit_item', 'Edit Item'),
('en-US', 'itemedit', 'itemedit_item_descr', 'Description'),
('en-US', 'itemedit', 'itemedit_item_label', 'Item'),
('en-US', 'itemedit', 'itemedit_item_price', 'Price:'),
('en-US', 'itemedit', 'itemedit_save_btn', 'Save'),
('en-US', 'itemlist', 'itemlist_avail_items', 'Available Items:'),
('en-US', 'itemlist', 'itemlist_list_empty', 'No items yet!'),
('en-US', 'listorders', 'listorders_backtoshop_btn', 'Back to Shop'),
('en-US', 'listorders', 'listorders_export_orders', 'Export Orders'),
('en-US', 'listorders', 'listorders_invoice_btn', 'Invoice'),
('en-US', 'listorders', 'listorders_item_lbl', 'Item'),
('en-US', 'listorders', 'listorders_no_orders', 'No orders'),
('en-US', 'listorders', 'listorders_order_id', 'Order ID'),
('en-US', 'listorders', 'listorders_order_total', 'Order Total: '),
('en-US', 'listorders', 'listorders_overall_total', 'Overall Total: '),
('en-US', 'listorders', 'listorders_qty_lbl', 'Qty.'),
('en-US', 'listorders', 'listorders_receipt_btn', 'Receipt'),
('en-US', 'listorders', 'listorders_todays_total', 'Today\'s Total: '),
('en-US', 'listorders', 'listorders_total_lbl', 'Total'),
('en-US', 'login', 'login_check_wallet', 'Check your wallet!!'),
('en-US', 'login', 'login_confirm_login', 'ZGo confirms your login on the Zcash blockhain'),
('en-US', 'login', 'login_confirm_pin', 'Confirm PIN'),
('en-US', 'login', 'login_connect_to_zgo', 'Connect your wallet to ZGo'),
('en-US', 'login', 'login_enter_pin', 'Enter the PIN sent by ZGo to confirm wallet ownership:'),
('en-US', 'login', 'login_last_block', 'Last block seen:'),
('en-US', 'login', 'login_link_wallet', 'Link Wallet'),
('en-US', 'login', 'login_wrong_pin', 'Wrong PIN!!'),
('en-US', 'main', 'main_price_data', 'Price data provided by CoinGecko API'),
('en-US', 'order', 'order_cancel_btn', 'Cancel'),
('en-US', 'order', 'order_cancel_ok', 'Order successfully cancelled!'),
('en-US', 'order', 'order_cancel_order', 'Cancel Order?'),
('en-US', 'order', 'order_checkout_btn', 'Checkout'),
('en-US', 'order', 'order_confirm_cancel', 'Are you sure you want to cancel the order?'),
('en-US', 'order', 'order_confirm_remove', 'Are you sure you want to remove '),
('en-US', 'order', 'order_confirm_remove1', '  from this order?'),
('en-US', 'order', 'order_invoice_btn', 'Invoice'),
('en-US', 'order', 'order_item_lbl', 'Item'),
('en-US', 'order', 'order_notserv_close', 'Close'),
('en-US', 'order', 'order_notserv_success', 'success'),
('en-US', 'order', 'order_no_openorder', 'No open order!!'),
('en-US', 'order', 'order_qty_lbl', 'Qty.'),
('en-US', 'order', 'order_remove_item', 'Remove Item?'),
('en-US', 'order', 'order_total_lbl', 'Total'),
('en-US', 'order', 'order_total_title', 'Order Total:'),
('en-US', 'pmtservice', 'pmtservice_amount_doesnot', 'Amount does not'),
('en-US', 'pmtservice', 'pmtservice_cant_scan', 'Can\'t scan?'),
('en-US', 'pmtservice', 'pmtservice_connecto_xero', 'Connection to Xero'),
('en-US', 'pmtservice', 'pmtservice_copyaddress_error', 'Error while copying address'),
('en-US', 'pmtservice', 'pmtservice_copyamount_error', 'Error while copying amount'),
('en-US', 'pmtservice', 'pmtservice_copymemo_error', 'Error while copying Memo'),
('en-US', 'pmtservice', 'pmtservice_copy_address', 'Copy Address'),
('en-US', 'pmtservice', 'pmtservice_copy_amount', 'Copy Amount'),
('en-US', 'pmtservice', 'pmtservice_copy_memo', 'Copy Memo'),
('en-US', 'pmtservice', 'pmtservice_copy_notavail', 'Copy functionality not supported'),
('en-US', 'pmtservice', 'pmtservice_currency_notsup', 'not supported!!'),
('en-US', 'pmtservice', 'pmtservice_enabled_for', 'enabled for'),
('en-US', 'pmtservice', 'pmtservice_hdr_txt1', 'Invoice'),
('en-US', 'pmtservice', 'pmtservice_hdr_txt2', 'Order ID: '),
('en-US', 'pmtservice', 'pmtservice_hdr_txt3', 'Date: '),
('en-US', 'pmtservice', 'pmtservice_invalid_ownerid', 'Invalid Owner ID!!'),
('en-US', 'pmtservice', 'pmtservice_invoice_currency', 'Currency'),
('en-US', 'pmtservice', 'pmtservice_invoice_invalid', 'type invalid!!'),
('en-US', 'pmtservice', 'pmtservice_invoice_item', 'Item:'),
('en-US', 'pmtservice', 'pmtservice_invoice_notfound', 'not found!!'),
('en-US', 'pmtservice', 'pmtservice_invoice_num', 'Invoice'),
('en-US', 'pmtservice', 'pmtservice_invoice_paid', 'already paid!!'),
('en-US', 'pmtservice', 'pmtservice_invoice_price', 'Price'),
('en-US', 'pmtservice', 'pmtservice_invoice_qty', 'Qty.'),
('en-US', 'pmtservice', 'pmtservice_invoice_total', 'Invoice Total: '),
('en-US', 'pmtservice', 'pmtservice_match_value', 'match value'),
('en-US', 'pmtservice', 'pmtservice_notserv_close', 'Close'),
('en-US', 'pmtservice', 'pmtservice_notserv_error', 'Error'),
('en-US', 'pmtservice', 'pmtservice_payment_confirmed', 'Payment Confirmed!!'),
('en-US', 'pmtservice', 'pmtservice_payment_notprocessed', 'Payment request was not processed!!'),
('en-US', 'pmtservice', 'pmtservice_payment_pending', 'Payment Pending!!'),
('en-US', 'pmtservice', 'pmtservice_pmtsrv_not', 'Payment service not'),
('en-US', 'pmtservice', 'pmtservice_reported_byxero', 'reported by Xero!!'),
('en-US', 'pmtservice', 'pmtservice_scan_qrcode', 'Scan the QR code with your wallet to make payment'),
('en-US', 'pmtservice', 'pmtservice_server_failed', 'server failed!!'),
('en-US', 'pmtservice', 'pmtservice_use_this', 'Use this '),
('en-US', 'pmtservice', 'pmtservice_wallet_link', 'wallet link'),
('en-US', 'pmtservice', 'pmtservice_zecdata_price', 'Zcash Price: '),
('en-US', 'pmtservice', 'pmtservice_zecdata_total', 'Total: '),
('en-US', 'promptinvoice', 'promptinvoice_func_notavail', 'Functionality not available for your browser. Use send button instead.'),
('en-US', 'promptinvoice', 'promptinvoice_invoice_cancel', 'Cancel'),
('en-US', 'promptinvoice', 'promptinvoice_invoice_clipboard', 'Invoice\'s URL copied to Clipboard!!'),
('en-US', 'promptinvoice', 'promptinvoice_invoice_sent', 'Sent!'),
('en-US', 'promptinvoice', 'promptinvoice_invoice_url', 'Invoice URL:'),
('en-US', 'promptinvoice', 'promptinvoice_notserv_close', 'Close'),
('en-US', 'promptinvoice', 'promptinvoice_notserv_error', 'Error'),
('en-US', 'promptinvoice', 'promptinvoice_notserv_success', 'Success'),
('en-US', 'promptinvoice', 'promptinvoice_send_link', 'Send the invoice link to your client:'),
('en-US', 'promptreceipt', 'promptreceipt_close_lbl', 'Close'),
('en-US', 'promptreceipt', 'promptreceipt_func_notavail', 'Functionality not available for your browser. Use send button '),
('en-US', 'promptreceipt', 'promptreceipt_notserv_close', 'Close'),
('en-US', 'promptreceipt', 'promptreceipt_notserv_error', 'Error'),
('en-US', 'promptreceipt', 'promptreceipt_notserv_success', 'Success'),
('en-US', 'promptreceipt', 'promptreceipt_receipt_clipboard', 'Receipt\'s URL copied to Clipboard!!'),
('en-US', 'promptreceipt', 'promptreceipt_receipt_url', 'Receipt URL:'),
('en-US', 'promptreceipt', 'promptreceipt_send_link', 'Send the receipt link to your client:'),
('en-US', 'receipt', 'receipt_info_notavail', 'No information available.'),
('en-US', 'receipt', 'receipt_invalid_id', 'Incorrect receipt ID.'),
('en-US', 'receipt', 'receipt_order_date', 'Date: '),
('en-US', 'receipt', 'receipt_order_id', 'Order ID: '),
('en-US', 'receipt', 'receipt_order_price', 'Price: '),
('en-US', 'receipt', 'receipt_order_total', 'Total: '),
('en-US', 'receipt', 'receipt_qty_lbl', 'Qty.'),
('en-US', 'receipt', 'receipt_receipt_lbl', 'Receipt'),
('en-US', 'receipt', 'receipt_zcash_price', 'Zcash Price: '),
('en-US', 'receiptqr', 'receiptqr_close_btn', 'Close'),
('en-US', 'receiptqr', 'receiptqr_scan_receipt', 'Scan for your Receipt'),
('en-US', 'scan', 'scan_close_btn', 'Close'),
('en-US', 'scan', 'scan_copy_address', 'Copy Address'),
('en-US', 'scan', 'scan_copy_amount', 'Copy Amount'),
('en-US', 'scan', 'scan_copy_error', 'Error while copying ammount'),
('en-US', 'scan', 'scan_copy_memo', 'Copy Memo'),
('en-US', 'scan', 'scan_fail_payment', 'Error while verifying payment'),
('en-US', 'scan', 'scan_func_notavail', 'Copy functionality not supported'),
('en-US', 'scan', 'scan_memo_sent', 'Memo Sent!'),
('en-US', 'scan', 'scan_notserv_close', 'Close'),
('en-US', 'scan', 'scan_notserv_error', 'Error'),
('en-US', 'scan', 'scan_scanqr_code', 'Scan the QR code'),
('en-US', 'scan', 'scan_text_info', 'Ensure to check the \"Include Reply-To\" box in your wallet before sending your memo.'),
('en-US', 'scan', 'scan_use_this', 'Can\'t scan? Use this '),
('en-US', 'scan', 'scan_wallet_link', 'wallet link'),
('en-US', 'settings', 'settings_acode_invalid', 'Invalid Account code (10 chars max.)'),
('en-US', 'settings', 'settings_acode_lbl', 'Account Code:'),
('en-US', 'settings', 'settings_acode_notsaved', 'Account Code not saved'),
('en-US', 'settings', 'settings_acode_saved', 'Account Code saved!!'),
('en-US', 'settings', 'settings_close_btn', 'Cancel'),
('en-US', 'settings', 'settings_confirm_payments', 'Confirm payments?'),
('en-US', 'settings', 'settings_copy_notavail', 'Functionality not available for your browser. Use send button instead.'),
('en-US', 'settings', 'settings_currency_lbl', 'Currency'),
('en-US', 'settings', 'settings_link_2xero', 'Link to Xero'),
('en-US', 'settings', 'settings_name_lbl', 'Name'),
('en-US', 'settings', 'settings_name_placeholder', 'Your Name'),
('en-US', 'settings', 'settings_notserv_close', 'Close'),
('en-US', 'settings', 'settings_notserv_error', 'Error'),
('en-US', 'settings', 'settings_notserv_success', 'Success'),
('en-US', 'settings', 'settings_notserv_warning', 'Warning'),
('en-US', 'settings', 'settings_ownerid_copied', 'Owner ID copied to clipboard'),
('en-US', 'settings', 'settings_ownerid_notcopied', 'Copying not available in your browser'),
('en-US', 'settings', 'settings_pmtserv_url', 'Payment Service URL:'),
('en-US', 'settings', 'settings_relink_2xero', 'Relink to Xero'),
('en-US', 'settings', 'settings_save_btn', 'Save'),
('en-US', 'settings', 'settings_tab_integrations', 'Integrations'),
('en-US', 'settings', 'settings_tab_mainlbl', 'Main'),
('en-US', 'settings', 'settings_URL_copied', 'ZGo URL copied to Clipboard!!'),
('en-US', 'settings', 'settings_use_satoshi', 'Use zatoshis?'),
('en-US', 'settings', 'settings_view_title', 'Settings'),
('en-US', 'settings', 'settings_vkey_lbl', 'Viewing key'),
('en-US', 'settings', 'settings_vkey_placeholder', 'Your wallet viewing key'),
('en-US', 'settings', 'settings_wctoken_copied', 'WooCommerce Token copied to clipboard'),
('en-US', 'settings', 'settings_wctoken_generated', 'WooCommerce Token generated!'),
('en-US', 'settings', 'settings_wctoken_genfail', 'WooCommerce Token generation failed'),
('en-US', 'settings', 'settings_wctoken_notcopied', 'Copying not available in your browser'),
('en-US', 'settings', 'settings_wc_closebtn', 'Close'),
('en-US', 'settings', 'settings_wc_gentoken', 'Generate Token'),
('en-US', 'settings', 'settings_wc_lbl', 'WooCommerce'),
('en-US', 'settings', 'settings_wc_ownerlbl', 'Owner:'),
('en-US', 'settings', 'settings_xeropmt_confirmdis', 'Xero Payment confirmation disabled!!'),
('en-US', 'settings', 'settings_xero_closebtn', 'Close'),
('en-US', 'settings', 'settings_xero_lbl', 'Xero'),
('en-US', 'settings', 'settings_xero_savebtn', 'Save Code'),
('en-US', 'viewer', 'viewer_view_orders', 'View Orders'),
('en-US', 'xero', 'xero_connected_2xero', 'Connected to Xero!'),
('en-US', 'xero', 'xero_connecting_2xero', 'Connecting to Xero..'),
('es-US', 'business', 'business_accept_terms', 'Acepto los '),
('es-US', 'business', 'business_addrs_nobiz', 'No tenemos un negocio asociado a esta dirección de Zcash, por favor ingrese su información abajo:'),
('es-US', 'business', 'business_biz_addressholder', 'Dirección'),
('es-US', 'business', 'business_biz_addresslbl', 'Dirección:'),
('es-US', 'business', 'business_biz_cityholder', 'Ciudad'),
('es-US', 'business', 'business_biz_citylbl', 'Ciudad:'),
('es-US', 'business', 'business_biz_countryholder', 'País'),
('es-US', 'business', 'business_biz_countrylbl', 'País:'),
('es-US', 'business', 'business_biz_info', 'Ingrese datos del negocio'),
('es-US', 'business', 'business_biz_mailholder', 'ejemplo@dominio.com'),
('es-US', 'business', 'business_biz_maillbl', 'E-mail:'),
('es-US', 'business', 'business_biz_nameholder', 'Nombre del negocio'),
('es-US', 'business', 'business_biz_namelbl', 'Nombre del Negocio:'),
('es-US', 'business', 'business_biz_pcodeholder', 'Código Postal'),
('es-US', 'business', 'business_biz_pcodelbl', 'Código Postal:'),
('es-US', 'business', 'business_biz_stateholder', 'Estado o Provincia'),
('es-US', 'business', 'business_biz_statelbl', 'Estado/Provincia:'),
('es-US', 'business', 'business_biz_websiteholder', 'Sitio web'),
('es-US', 'business', 'business_biz_websitelbl', 'Sitio Web:'),
('es-US', 'business', 'business_contact_fnamelbl', 'Nombre del Contacto:'),
('es-US', 'business', 'business_contact_fnholder', 'Nombre'),
('es-US', 'business', 'business_contact_lnamelbl', 'Apellido del Contacto:'),
('es-US', 'business', 'business_contact_lnholder', 'Apellido'),
('es-US', 'business', 'business_save_btn', 'Salvar'),
('es-US', 'business', 'business_select_session', 'Seleccione la duración de la sessión que necesita:'),
('es-US', 'business', 'business_session_label', 'Sesión:'),
('es-US', 'business', 'business_session_lengthlbl', 'Duración de la Sesión'),
('es-US', 'business', 'business_session_paylbl', 'Pagar'),
('es-US', 'business', 'business_signup_title', 'Registrar Negocio'),
('es-US', 'business', 'business_terms_ofuse', 'Términos de Uso'),
('es-US', 'business', 'business_zgo_confirmlbl', 'ZGo confirma su pago'),
('es-US', 'cancel', 'cancel_confirm_btn', 'Confirmar'),
('es-US', 'cancel', 'cancel_dismiss_btn', 'Descartar'),
('es-US', 'cancel', 'cancel_title', 'Cancelar'),
('es-US', 'checkout', 'checkout_accept_btn', 'Aceptar'),
('es-US', 'checkout', 'checkout_cant_scan', 'No puede escanear?'),
('es-US', 'checkout', 'checkout_close_btn', 'Cerrar'),
('es-US', 'checkout', 'checkout_copyaddress_error', 'Error al copiar dirección'),
('es-US', 'checkout', 'checkout_copyamount_error', 'Error al copiar el valor'),
('es-US', 'checkout', 'checkout_copymemo_error', 'Error al copiar Memo'),
('es-US', 'checkout', 'checkout_copy_address', 'Copiar Dirección'),
('es-US', 'checkout', 'checkout_copy_amount', 'Copie Valor'),
('es-US', 'checkout', 'checkout_copy_memo', 'Copie Valor'),
('es-US', 'checkout', 'checkout_copy_notavail', 'Fucionalidad de copia no soportada!!'),
('es-US', 'checkout', 'checkout_notserv_close', 'Cerrar'),
('es-US', 'checkout', 'checkout_notserv_error', 'Error'),
('es-US', 'checkout', 'checkout_scan_payment', 'Escanee para hacer el pago'),
('es-US', 'checkout', 'checkout_use_this', 'Use este '),
('es-US', 'checkout', 'checkout_wallet_link', 'link a billetera'),
('es-US', 'checkout', 'checkout_wallet_or', ', o '),
('es-US', 'dbexport', 'dbexport_btn_close', 'Cancelar'),
('es-US', 'dbexport', 'dbexport_closed_no', 'No'),
('es-US', 'dbexport', 'dbexport_closed_yes', 'Si'),
('es-US', 'dbexport', 'dbexport_date_range', 'Rango de Fechas:'),
('es-US', 'dbexport', 'dbexport_download_link', 'Descargar'),
('es-US', 'dbexport', 'dbexport_end_date', 'Fecha final'),
('es-US', 'dbexport', 'dbexport_export_descrip', 'Exportar órdenes en un archivo de formato .CSV'),
('es-US', 'dbexport', 'dbexport_file_header', '\"Fecha\",\"ID Orden\",\"Moneda\",\"Cerrada?\",\"Valor\",\"Tasa\",\"ZEC\",\"Pagada?\",\"Factura\"'),
('es-US', 'dbexport', 'dbexport_invalid_end', 'Fecha final inválida'),
('es-US', 'dbexport', 'dbexport_invalid_start', 'Fecha de inicio inválida'),
('es-US', 'dbexport', 'dbexport_noorders_created', 'Usted no tiene órdenes creadas.'),
('es-US', 'dbexport', 'dbexport_nothing_todo', 'Nada que hacer.'),
('es-US', 'dbexport', 'dbexport_paid_no', 'No'),
('es-US', 'dbexport', 'dbexport_paid_yes', 'Si'),
('es-US', 'dbexport', 'dbexport_settings_title', 'Exportar Ordenes'),
('es-US', 'dbexport', 'dbexport_start_date', 'Fecha inicial'),
('es-US', 'header', 'header_get_currency', 'Moneda:'),
('es-US', 'header', 'header_last_block', 'Último Bloque:'),
('es-US', 'invoice', 'invoice_cant_scan', 'No puede escanear?'),
('es-US', 'invoice', 'invoice_copyaddress_error', 'Error al copiar dirección'),
('es-US', 'invoice', 'invoice_copyamount_error', 'Error al copiar valor'),
('es-US', 'invoice', 'invoice_copymemo_error', 'Error al copiar Memo'),
('es-US', 'invoice', 'invoice_copy_address', 'Copie Dirección'),
('es-US', 'invoice', 'invoice_copy_amount', 'Copiar Valor'),
('es-US', 'invoice', 'invoice_copy_memo', 'Copiar Memo'),
('es-US', 'invoice', 'invoice_copy_notavail', 'Funcionalidad para copia no soportada'),
('es-US', 'invoice', 'invoice_dot_or', ', o'),
('es-US', 'invoice', 'invoice_info_notavail', 'No hay información disponible.'),
('es-US', 'invoice', 'invoice_invalid_id', 'ID de Factura incorrecto.'),
('es-US', 'invoice', 'invoice_invoice_lbl', 'Factura'),
('es-US', 'invoice', 'invoice_invoice_total', 'Total Factura: '),
('es-US', 'invoice', 'invoice_notserv_close', 'Cerrar'),
('es-US', 'invoice', 'invoice_notserv_error', 'Error'),
('es-US', 'invoice', 'invoice_order_date', 'Fecha: '),
('es-US', 'invoice', 'invoice_order_id', 'ID del Pedido: '),
('es-US', 'invoice', 'invoice_order_price', 'Precio '),
('es-US', 'invoice', 'invoice_payment_confirmed', 'Pago Confirmado!!'),
('es-US', 'invoice', 'invoice_payment_pending', 'Pago Pendiente!!'),
('es-US', 'invoice', 'invoice_qty_lbl', 'Cant.'),
('es-US', 'invoice', 'invoice_return_toshop', 'Regresar a Tienda'),
('es-US', 'invoice', 'invoice_scan_qrcode', 'Escanee el código QR con su billetera para hacer el pago'),
('es-US', 'invoice', 'invoice_use_this', 'Use este '),
('es-US', 'invoice', 'invoice_wallet_link', 'link de billetera'),
('es-US', 'invoice', 'invoice_zcash_price', 'Precio de Zcash: '),
('es-US', 'itemadd', 'itemadd_add_2order', 'Agregar Item a la orden'),
('es-US', 'itemadd', 'itemadd_cancel_btn', 'Cancelar'),
('es-US', 'itemadd', 'itemadd_save_btn', 'Agregar'),
('es-US', 'itemcreate', 'itemcreate_add_item', 'Agregar Item'),
('es-US', 'itemcreate', 'itemcreate_close_btn', 'Cerrar'),
('es-US', 'itemcreate', 'itemcreate_item_descr', 'Descripcion'),
('es-US', 'itemcreate', 'itemcreate_item_lbl', 'Item'),
('es-US', 'itemcreate', 'itemcreate_item_price', 'Precio'),
('es-US', 'itemcreate', 'itemcreate_save_btn', 'Grabar'),
('es-US', 'itemcreate', 'itemcreate_use_nums', 'Use solo números'),
('es-US', 'itemdel', 'itemdel_close_btn', 'Cerrar'),
('es-US', 'itemdel', 'itemdel_confirm_del', 'Esta seguro de querer eliminar el item '),
('es-US', 'itemdel', 'itemdel_delete_btn', 'Eliminar'),
('es-US', 'itemdel', 'itemdel_del_item', 'Eliminar Item'),
('es-US', 'itemedit', 'itemedit_close_btn', 'Cerrar'),
('es-US', 'itemedit', 'itemedit_edit_item', 'Editar Item'),
('es-US', 'itemedit', 'itemedit_item_descr', 'Descripcion'),
('es-US', 'itemedit', 'itemedit_item_label', 'Item'),
('es-US', 'itemedit', 'itemedit_item_price', 'Precio:'),
('es-US', 'itemedit', 'itemedit_save_btn', 'Guardar'),
('es-US', 'itemlist', 'itemlist_avail_items', 'Items Disponibles:'),
('es-US', 'itemlist', 'itemlist_list_empty', 'No existen items!'),
('es-US', 'listorders', 'listorders_backtoshop_btn', 'Regresar a Tienda'),
('es-US', 'listorders', 'listorders_export_orders', 'Exportar Pedidos'),
('es-US', 'listorders', 'listorders_invoice_btn', 'Factura'),
('es-US', 'listorders', 'listorders_item_lbl', 'Item'),
('es-US', 'listorders', 'listorders_no_orders', 'No hay órdenes'),
('es-US', 'listorders', 'listorders_order_id', 'ID de Orden'),
('es-US', 'listorders', 'listorders_order_total', 'Total de la Orden:'),
('es-US', 'listorders', 'listorders_overall_total', 'Total General: '),
('es-US', 'listorders', 'listorders_qty_lbl', 'Cant.'),
('es-US', 'listorders', 'listorders_receipt_btn', 'Recibo'),
('es-US', 'listorders', 'listorders_todays_total', 'Total del Dia: '),
('es-US', 'listorders', 'listorders_total_lbl', 'Total'),
('es-US', 'login', 'login_check_wallet', 'Verifique su billetera!!'),
('es-US', 'login', 'login_confirm_login', 'ZGo confirma su ingreso en la cadena de Zcash'),
('es-US', 'login', 'login_confirm_pin', 'Confirme el PIN'),
('es-US', 'login', 'login_connect_to_zgo', 'Conectar su billetera a ZGo'),
('es-US', 'login', 'login_enter_pin', 'Ingrese el PIN enviado por ZGo para confirmar su billetera:'),
('es-US', 'login', 'login_last_block', 'Ultimo Bloque Verificado: '),
('es-US', 'login', 'login_link_wallet', 'Asociar Billetera'),
('es-US', 'login', 'login_wrong_pin', 'PIN Invalido!!'),
('es-US', 'main', 'main_price_data', 'Precios provistos por API de CoinGecko'),
('es-US', 'order', 'order_cancel_btn', 'Cancelar'),
('es-US', 'order', 'order_cancel_ok', 'Orden cancelada exitosamente!'),
('es-US', 'order', 'order_cancel_order', 'Cancelar Orden?'),
('es-US', 'order', 'order_checkout_btn', 'Procesar'),
('es-US', 'order', 'order_confirm_cancel', 'Esta seguro que quiere cancelar la orden?'),
('es-US', 'order', 'order_confirm_remove', 'Esta seguro de querer remover '),
('es-US', 'order', 'order_confirm_remove1', ' de esta orden?'),
('es-US', 'order', 'order_invoice_btn', 'Factura'),
('es-US', 'order', 'order_item_lbl', 'Item'),
('es-US', 'order', 'order_notserv_close', 'Cerrar'),
('es-US', 'order', 'order_notserv_success', 'confirmado'),
('es-US', 'order', 'order_no_openorder', 'Sin órden abierta!!'),
('es-US', 'order', 'order_qty_lbl', 'Cant.'),
('es-US', 'order', 'order_remove_item', 'Remover Item?'),
('es-US', 'order', 'order_total_lbl', 'Total'),
('es-US', 'order', 'order_total_title', 'Total Pedido:'),
('es-US', 'pmtservice', 'pmtservice_amount_doesnot', 'Total no'),
('es-US', 'pmtservice', 'pmtservice_cant_scan', 'No puede escanear?'),
('es-US', 'pmtservice', 'pmtservice_connecto_xero', 'Conexion con Xero'),
('es-US', 'pmtservice', 'pmtservice_copyaddress_error', 'Error al copiar dirección'),
('es-US', 'pmtservice', 'pmtservice_copyamount_error', 'Error al copiar valor'),
('es-US', 'pmtservice', 'pmtservice_copymemo_error', 'Error al copiar Memo'),
('es-US', 'pmtservice', 'pmtservice_copy_address', 'Copiar Dirección'),
('es-US', 'pmtservice', 'pmtservice_copy_amount', 'Copiar Valor'),
('es-US', 'pmtservice', 'pmtservice_copy_memo', 'Copiar Memo'),
('es-US', 'pmtservice', 'pmtservice_copy_notavail', 'Funcionalidad para copia no soportada'),
('es-US', 'pmtservice', 'pmtservice_currency_notsup', 'no soportada!!'),
('es-US', 'pmtservice', 'pmtservice_enabled_for', 'habilitado para'),
('es-US', 'pmtservice', 'pmtservice_hdr_txt1', 'Factura'),
('es-US', 'pmtservice', 'pmtservice_hdr_txt2', 'ID de Orden: '),
('es-US', 'pmtservice', 'pmtservice_hdr_txt3', 'Fecha: '),
('es-US', 'pmtservice', 'pmtservice_invalid_ownerid', 'ID de propietario inválida!!'),
('es-US', 'pmtservice', 'pmtservice_invoice_currency', 'Moneda'),
('es-US', 'pmtservice', 'pmtservice_invoice_invalid', 'tipo inválido!!'),
('es-US', 'pmtservice', 'pmtservice_invoice_item', 'Item:'),
('es-US', 'pmtservice', 'pmtservice_invoice_notfound', 'no encontrada!!'),
('es-US', 'pmtservice', 'pmtservice_invoice_num', 'Factura'),
('es-US', 'pmtservice', 'pmtservice_invoice_paid', 'ya pagada!!'),
('es-US', 'pmtservice', 'pmtservice_invoice_price', 'Precio'),
('es-US', 'pmtservice', 'pmtservice_invoice_qty', 'Cant.'),
('es-US', 'pmtservice', 'pmtservice_invoice_total', 'Total Factura:'),
('es-US', 'pmtservice', 'pmtservice_match_value', 'es igual al valor'),
('es-US', 'pmtservice', 'pmtservice_notserv_close', 'Cerrar'),
('es-US', 'pmtservice', 'pmtservice_notserv_error', 'Error'),
('es-US', 'pmtservice', 'pmtservice_payment_confirmed', 'Pago Confirmado!!'),
('es-US', 'pmtservice', 'pmtservice_payment_notprocessed', 'Solicitud de pago no fue procesada!!'),
('es-US', 'pmtservice', 'pmtservice_payment_pending', 'Pago Pendiente!!'),
('es-US', 'pmtservice', 'pmtservice_pmtsrv_not', 'Servicio de pagos no '),
('es-US', 'pmtservice', 'pmtservice_reported_byxero', 'reportado por Xero!!'),
('es-US', 'pmtservice', 'pmtservice_scan_qrcode', 'Escanee el código QR con su billetera para hacer el pago'),
('es-US', 'pmtservice', 'pmtservice_server_failed', 'servidor falló!!'),
('es-US', 'pmtservice', 'pmtservice_use_this', 'Use este '),
('es-US', 'pmtservice', 'pmtservice_wallet_link', 'link de billetera'),
('es-US', 'pmtservice', 'pmtservice_zecdata_price', 'Precio Zcash: '),
('es-US', 'pmtservice', 'pmtservice_zecdata_total', 'Total: '),
('es-US', 'promptinvoice', 'promptinvoice_func_notavail', 'Funcionalidad no disponible en su navegador. Use el botón de enviar en lugar de eso.'),
('es-US', 'promptinvoice', 'promptinvoice_invoice_cancel', 'Cancelar'),
('es-US', 'promptinvoice', 'promptinvoice_invoice_clipboard', 'URL de la factura copiado al Portapapeles!!'),
('es-US', 'promptinvoice', 'promptinvoice_invoice_sent', 'Enviado!'),
('es-US', 'promptinvoice', 'promptinvoice_invoice_url', 'URL de Factura:'),
('es-US', 'promptinvoice', 'promptinvoice_notserv_close', 'Cerrar'),
('es-US', 'promptinvoice', 'promptinvoice_notserv_error', 'Error'),
('es-US', 'promptinvoice', 'promptinvoice_notserv_success', 'Suceso');
INSERT INTO `languages` (`encode_id`, `view_name`, `view_element`, `view_element_text`) VALUES
('es-US', 'promptinvoice', 'promptinvoice_send_link', 'Envíe el link de la factura a su cliente:'),
('es-US', 'promptreceipt', 'promptreceipt_close_lbl', 'Cerrar'),
('es-US', 'promptreceipt', 'promptreceipt_func_notavail', 'Functionality not available for your browser. Use send button '),
('es-US', 'promptreceipt', 'promptreceipt_notserv_close', 'Cerrar'),
('es-US', 'promptreceipt', 'promptreceipt_notserv_error', 'Error'),
('es-US', 'promptreceipt', 'promptreceipt_notserv_success', 'Suceso'),
('es-US', 'promptreceipt', 'promptreceipt_receipt_clipboard', 'URL del Recibo copiado a portapapeles!!'),
('es-US', 'promptreceipt', 'promptreceipt_receipt_url', 'URL del Recibo:'),
('es-US', 'promptreceipt', 'promptreceipt_send_link', 'Envíe el enlace del recibo a su cliente :'),
('es-US', 'receipt', 'receipt_info_notavail', 'No hay información disponible.'),
('es-US', 'receipt', 'receipt_invalid_id', 'ID de Recibo incorrecto.'),
('es-US', 'receipt', 'receipt_order_date', 'Fecha: '),
('es-US', 'receipt', 'receipt_order_id', 'ID de Orden:'),
('es-US', 'receipt', 'receipt_order_price', 'Precio: '),
('es-US', 'receipt', 'receipt_order_total', 'Total: '),
('es-US', 'receipt', 'receipt_qty_lbl', 'Cant.'),
('es-US', 'receipt', 'receipt_receipt_lbl', 'Recibo '),
('es-US', 'receipt', 'receipt_zcash_price', 'Precio de Zcash: '),
('es-US', 'receiptqr', 'receiptqr_close_btn', 'Cerrar'),
('es-US', 'receiptqr', 'receiptqr_scan_receipt', 'Escanee para obtener su Recibo'),
('es-US', 'scan', 'scan_close_btn', 'Cerrar'),
('es-US', 'scan', 'scan_copy_address', 'Copiar Dirección'),
('es-US', 'scan', 'scan_copy_amount', 'Copiar Valor'),
('es-US', 'scan', 'scan_copy_error', 'Error al copiar valor'),
('es-US', 'scan', 'scan_copy_memo', 'Copiar Memo'),
('es-US', 'scan', 'scan_fail_payment', 'Error al verificar pago'),
('es-US', 'scan', 'scan_func_notavail', 'Funcionalidad de copia no soportada'),
('es-US', 'scan', 'scan_memo_sent', 'Memorando enviado!'),
('es-US', 'scan', 'scan_notserv_close', 'Cerrar'),
('es-US', 'scan', 'scan_notserv_error', 'Error'),
('es-US', 'scan', 'scan_scanqr_code', 'Escanee el código QR'),
('es-US', 'scan', 'scan_text_info', 'Asegúrese de marcar la caja \"Incluir Responder-A\" en su billetera antes de enviar su memo'),
('es-US', 'scan', 'scan_use_this', 'No puede escanear? Use este '),
('es-US', 'scan', 'scan_wallet_link', 'Link de billetera'),
('es-US', 'settings', 'settings_acode_invalid', 'Código de Cuenta inválido (10 caracteres max.)'),
('es-US', 'settings', 'settings_acode_lbl', 'Código de Cuenta:'),
('es-US', 'settings', 'settings_acode_notsaved', 'Código de cuenta no guardado!'),
('es-US', 'settings', 'settings_acode_saved', 'Código de cuenta guardado!!'),
('es-US', 'settings', 'settings_close_btn', 'Cancelar'),
('es-US', 'settings', 'settings_confirm_payments', 'Confirmar pagos?'),
('es-US', 'settings', 'settings_copy_notavail', 'Funcionalidad no disponible para su navegador. Use el botón de enviar.'),
('es-US', 'settings', 'settings_currency_lbl', 'Moneda'),
('es-US', 'settings', 'settings_link_2xero', 'Enlazar a Xero'),
('es-US', 'settings', 'settings_name_lbl', 'Nombre'),
('es-US', 'settings', 'settings_name_placeholder', 'Su nombre'),
('es-US', 'settings', 'settings_notserv_close', 'Cerrar'),
('es-US', 'settings', 'settings_notserv_error', 'Error'),
('es-US', 'settings', 'settings_notserv_success', 'Suceso'),
('es-US', 'settings', 'settings_notserv_warning', 'Advertencia'),
('es-US', 'settings', 'settings_ownerid_copied', 'ID del propietario copiado a la papelera'),
('es-US', 'settings', 'settings_ownerid_notcopied', 'Copiar no disponible en su navegador'),
('es-US', 'settings', 'settings_pmtserv_url', 'URL del Servicio de Pago:'),
('es-US', 'settings', 'settings_relink_2xero', 'Reconectar a Xero'),
('es-US', 'settings', 'settings_save_btn', 'Salvar'),
('es-US', 'settings', 'settings_tab_integrations', 'Integraciones'),
('es-US', 'settings', 'settings_tab_mainlbl', 'Principal'),
('es-US', 'settings', 'settings_URL_copied', 'URL de ZGo copiado a la papelera!!'),
('es-US', 'settings', 'settings_use_satoshi', 'Usar zatoshis?'),
('es-US', 'settings', 'settings_view_title', 'Configuración'),
('es-US', 'settings', 'settings_vkey_lbl', 'Clave de visualización'),
('es-US', 'settings', 'settings_vkey_placeholder', 'Clave de visualización de su billetera'),
('es-US', 'settings', 'settings_wctoken_copied', 'Token de WooCommerce copiado a la papelera'),
('es-US', 'settings', 'settings_wctoken_generated', 'Token de WooCommerce generado!'),
('es-US', 'settings', 'settings_wctoken_genfail', 'Falla generación de Token de WooCommerce'),
('es-US', 'settings', 'settings_wctoken_notcopied', 'Copiar no disponible en su navegador'),
('es-US', 'settings', 'settings_wc_closebtn', 'Cerrar'),
('es-US', 'settings', 'settings_wc_gentoken', 'Generar Token'),
('es-US', 'settings', 'settings_wc_lbl', 'WooCommerce'),
('es-US', 'settings', 'settings_wc_ownerlbl', 'Propietario:'),
('es-US', 'settings', 'settings_xeropmt_confirmdis', 'Confirmación de pagos de Xero desactivada!!'),
('es-US', 'settings', 'settings_xero_closebtn', 'Cerrar'),
('es-US', 'settings', 'settings_xero_lbl', 'Xero'),
('es-US', 'settings', 'settings_xero_savebtn', 'Guardar Código'),
('es-US', 'viewer', 'viewer_view_orders', 'Ver Ordenes'),
('es-US', 'xero', 'xero_connected_2xero', 'Conectado a Xero!'),
('es-US', 'xero', 'xero_connecting_2xero', 'Conectando a Xero..');
--
-- Indexes for dumped tables
--
--
-- Indexes for table `languages`
--
ALTER TABLE `languages`
ADD UNIQUE KEY `language_ix` (`encode_id`,`view_name`,`view_element`);
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

21614
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
{ {
"name": "zgo", "name": "zgo",
"version": "2.4.0", "version": "1.4.0",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
"start": "ng serve", "start": "ng serve",
@ -10,52 +10,55 @@
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
"@angular/animations": "^17.1.2", "@angular-material-components/datetime-picker": "^8.0.0",
"@angular/cdk": "^17.1.2", "@angular/animations": "^14.2.5",
"@angular/common": "^17.1.2", "@angular/cdk": "^14.2.4",
"@angular/compiler": "^17.1.2", "@angular/common": "^14.2.5",
"@angular/core": "^17.1.2", "@angular/compiler": "^14.2.5",
"@angular/forms": "^17.3.9", "@angular/core": "^14.2.5",
"@angular/material": "^17.3.9", "@angular/forms": "^14.2.5",
"@angular/platform-browser": "^17.1.2", "@angular/material": "^14.2.4",
"@angular/platform-browser-dynamic": "^17.3.9", "@angular/platform-browser": "^14.2.5",
"@angular/router": "^17.3.9", "@angular/platform-browser-dynamic": "^14.2.5",
"@fortawesome/angular-fontawesome": "^0.14.1", "@angular/router": "^14.2.5",
"@fortawesome/fontawesome-free": "^6.5.2", "@fortawesome/angular-fontawesome": "^0.10.2",
"@fortawesome/fontawesome-svg-core": "^6.5.2", "@fortawesome/fontawesome-free": "^6.1.1",
"@fortawesome/free-brands-svg-icons": "^6.5.2", "@fortawesome/fontawesome-svg-core": "^6.1.0",
"@fortawesome/free-regular-svg-icons": "^6.5.2", "@fortawesome/free-brands-svg-icons": "^6.1.0",
"@fortawesome/free-solid-svg-icons": "^6.5.2", "@fortawesome/free-regular-svg-icons": "^6.1.0",
"@supercharge/request-ip": "^1.2.0", "@fortawesome/free-solid-svg-icons": "^6.1.0",
"@supercharge/request-ip": "^1.1.2",
"angular-local-storage": "^0.7.1", "angular-local-storage": "^0.7.1",
"angular-material-datepicker": "^1.0.2", "angular-material-datepicker": "^1.0.2",
"async": "^3.2.5", "async": "^3.2.2",
"coingecko-api": "^1.0.10", "coingecko-api": "^1.0.10",
"easyqrcodejs": "^4.6.1", "easyqrcodejs": "^4.4.6",
"hammerjs": "^2.0.8",
"material-design-icons": "^3.0.1", "material-design-icons": "^3.0.1",
"rxjs": "~7.8.0", "mongoose": "^6.0.13",
"rxjs": "~6.6.0",
"sha.js": "^2.4.11", "sha.js": "^2.4.11",
"tslib": "^2.5.0", "stdrpc": "^1.3.0",
"tslib": "^2.3.0",
"urlsafe-base64": "^1.0.0", "urlsafe-base64": "^1.0.0",
"uuid": "^9.0.1", "uuid": "^8.3.2",
"zone.js": "^0.14.6" "xero-node": "^4.23.0",
"zone.js": "~0.11.4"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/build-angular": "^17.3.7", "@angular-devkit/build-angular": "^14.2.5",
"@angular/cli": "^17.3.7", "@angular/cli": "^14.2.5",
"@angular/compiler-cli": "^17.3.9", "@angular/compiler-cli": "^14.2.5",
"@types/jasmine": "~4.3.1", "@types/jasmine": "~3.8.0",
"@types/node": "^18.19.33", "@types/node": "^12.20.33",
"@types/request": "^2.48.12", "@types/request": "^2.48.8",
"@types/urlsafe-base64": "^1.0.31", "@types/urlsafe-base64": "^1.0.28",
"@types/uuid": "^9.0.8", "@types/uuid": "^8.3.1",
"jasmine-core": "~4.5.0", "jasmine-core": "~3.8.0",
"karma": "~6.4.2", "karma": "~6.3.0",
"karma-chrome-launcher": "~3.1.1", "karma-chrome-launcher": "~3.1.0",
"karma-coverage": "~2.2.0", "karma-coverage": "~2.0.3",
"karma-jasmine": "~5.1.0", "karma-jasmine": "~4.0.0",
"karma-jasmine-html-reporter": "~2.0.0", "karma-jasmine-html-reporter": "~1.7.0",
"typescript": "~5.3.3" "typescript": "~4.7.4"
} }
} }

View file

@ -8,6 +8,5 @@ main{
} }
.tiny{ .tiny{
font-size: 12px; font-size: 10px;
margin-top: 3px;
} }

View file

@ -1,52 +1,8 @@
<main > <main>
<router-outlet ></router-outlet> <router-outlet></router-outlet>
<!--
<app-login (newLanguageEvent) = "chgUILanguage($event)"></app-login>
-->
</main> </main>
<mat-divider></mat-divider> <mat-divider></mat-divider>
<div align="center"> <div class="footer" align="center">
<img *ngIf="zgoLanguage == 'en-US'" <p>&copy; 2022 Vergara Technologies LLC</p>
src="../assets/zgo-usa-flag-default.png" <p class="tiny">Price data provided by CoinGecko API</p>
(click)="usFlagClicked()"
height="24px"
title="English (Default)"/>
<img *ngIf="zgoLanguage != 'en-US'"
src="../assets/zgo-usa-flag.png"
(click)="usFlagClicked()"
height="24px"
title="English"/>
<img src="../assets/flag-spacer.png"
height="24px">
<img *ngIf="zgoLanguage == 'es-US'"
src="../assets/zgo-spain-flag-default.png"
(click)="esFlagClicked()"
height="24px"
title="Spanish (Default)"/>
<img *ngIf="zgoLanguage != 'es-US'"
src="../assets/zgo-spain-flag.png"
(click)="esFlagClicked()"
height="24px"
title="Spanish"/>
<img src="../assets/flag-spacer.png"
height="24px">
<img *ngIf="zgoLanguage == 'br-US'"
src="../assets/zgo-brazil-flag-default.png"
(click)="brFlagClicked()"
height="24px"
title="Portuguese (Default)"/>
<img *ngIf="zgoLanguage != 'br-US'"
src="../assets/zgo-brazil-flag.png"
(click)="brFlagClicked()"
height="24px"
title="Portuguese"/>
</div> </div>
<div class="footer" align="center"
style="margin-top: 10px;
margin-bottom: 20px;">
<div >&copy; 2024 Vergara Technologies LLC</div>
<div class="tiny">Version 2.4.1</div>
<div class="tiny">{{ vE.mainPriceData }}</div>
</div>
<div></div>

View file

@ -1,6 +1,5 @@
import { Component, OnInit } from '@angular/core'; import { Component } from '@angular/core';
import { LanguageService } from './language.service'; //import { Post} from './posts/post.model';
@Component({ @Component({
selector: 'app-root', selector: 'app-root',
@ -9,56 +8,6 @@ import { LanguageService } from './language.service';
}) })
export class AppComponent { export class AppComponent {
title = 'ZGo';
title = 'ZGo';
zgoLanguage:string = '';
vE = {
mainPriceData : ''
}
constructor(
private languageService: LanguageService){
}
ngOnInit(){
//console.log('chgUILanguage() called on ngOnInit ');
this.chgUILanguage();
}
chgUILanguage() {
//console.log('MAIN.chgUILanguage Called ');
this.languageService.getViewElements('main').subscribe({
next: response => {
//console.log('response >> ', response );
//console.log('main_price_data -> ',response.data.main_price_data);
this.vE.mainPriceData = response.data.main_price_data;
this.zgoLanguage = response.language;
},
error: error => { console.log('Error --> ',error); }
});
}
usFlagClicked() {
if ( this.zgoLanguage != 'en-US' ) {
localStorage.setItem('zgo_language','en-US');
window.location.reload();
}
}
esFlagClicked() {
if ( this.zgoLanguage != 'es-US' ) {
localStorage.setItem('zgo_language','es-US');
window.location.reload();
}
}
brFlagClicked() {
if ( this.zgoLanguage != 'br-US' ) {
localStorage.setItem('zgo_language','br-US');
window.location.reload();
}
}
} }

View file

@ -1,5 +1,5 @@
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { BrowserModule, } from '@angular/platform-browser'; import { BrowserModule } from '@angular/platform-browser';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatAutocompleteModule } from '@angular/material/autocomplete';
@ -51,8 +51,6 @@ import { NotifierComponent } from './notifier/notifier.component';
import { PmtserviceComponent } from './pmtservice/pmtservice.component'; import { PmtserviceComponent } from './pmtservice/pmtservice.component';
import { XeroRegComponent } from './xeroreg/xeroreg.component'; import { XeroRegComponent } from './xeroreg/xeroreg.component';
import { DbExportComponent } from './db-export/db-export.component'; import { DbExportComponent } from './db-export/db-export.component';
import { SessionpayComponent } from './sessionpay/sessionpay.component';
import { TipsComponent } from './tips/tips.component';
@NgModule({ @NgModule({
declarations: [ declarations: [
@ -82,12 +80,10 @@ import { TipsComponent } from './tips/tips.component';
NotifierComponent, NotifierComponent,
PmtserviceComponent, PmtserviceComponent,
XeroRegComponent, XeroRegComponent,
DbExportComponent, DbExportComponent
SessionpayComponent,
TipsComponent,
], ],
imports: [ imports: [
BrowserAnimationsModule, BrowserModule,
AppRoutingModule, AppRoutingModule,
FormsModule, FormsModule,
ReactiveFormsModule, ReactiveFormsModule,
@ -110,14 +106,13 @@ import { TipsComponent } from './tips/tips.component';
MatTabsModule, MatTabsModule,
MatDatepickerModule, MatDatepickerModule,
MatNativeDateModule, MatNativeDateModule,
BrowserModule, BrowserAnimationsModule,
FontAwesomeModule FontAwesomeModule
], ],
exports: [ exports: [
MatIconModule MatIconModule
], ],
providers: [ providers: [],
],
bootstrap: [AppComponent] bootstrap: [AppComponent]
}) })
export class AppModule { } export class AppModule { }

View file

@ -1,51 +1,57 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Router, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router'; import { CanActivate, Router, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router';
import {HttpClient, HttpParams} from '@angular/common/http'; import {HttpClient, HttpParams} from '@angular/common/http';
import { UserService } from './user.service'; import { UserService } from './user.service';
import { Observable } from 'rxjs'; import { Subscription, Observable } from 'rxjs';
import { Owner } from './owner.model';
@Injectable() @Injectable()
export class AuthGuardService { export class AuthGuardService implements CanActivate {
private UserSub: Subscription = new Subscription();
private addr = ''; private addr = '';
private paid = false; private paid = false;
private paidUpdate: Observable<boolean>; private paidUpdate: Observable<boolean>;
constructor( constructor(
private router: Router, private router: Router,
private http: HttpClient,
public userService: UserService public userService: UserService
){ ){
this.userService.findUser();
this.paidUpdate = this.userService.paidUpdate; this.paidUpdate = this.userService.paidUpdate;
this.paidUpdate.subscribe((indicator) => { this.paidUpdate.subscribe((indicator) => {
this.paid = indicator; this.paid = indicator;
}); });
} }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
const token = localStorage.getItem('s4z_token'); const token = localStorage.getItem('s4z_token');
var path = route.url[0].path; var path = route.url[0].path;
if(token != null){ if(token != null){
this.userService.uZaddrUpdate.
subscribe((addr) => {
if (addr != null) {
console.log(addr);
this.addr = addr;
} else {
console.log("No record for that token");
}
});
if (path === 'biz') { if (path === 'biz') {
this.userService.checkUser()?.subscribe( response => { if (this.addr.length > 0) {
if (response.status == 200 && response.body?.validated) { return true;
return true; } else {
} else { this.router.navigate(['/login']);
this.router.navigate(['/login']); return false;
return false; }
}
});
} else { } else {
this.userService.checkUser()?.subscribe( response => { if (this.addr != null && this.paid) {
if (response.status == 200 && response.body?.validated && this.paid) { return true;
return true; } else {
} else { this.router.navigate(['/login']);
this.router.navigate(['/login']); return false;
return false; }
}
});
} }
} else { } else {
console.log("Not logged in"); console.log("Not logged in");

View file

@ -13,11 +13,6 @@ mat-card.centercard{
font-family: 'Spartan', sans-serif; font-family: 'Spartan', sans-serif;
font-size: 11px; font-size: 11px;
} }
::ng-deep .mat-vertical-stepper-header{
pointer-events: none;
}
a.link{ a.link{
text-decoration: underline; text-decoration: underline;
} }

View file

@ -1,43 +1,43 @@
<app-header></app-header> <app-header></app-header>
<div align="center"> <div align="center">
<mat-card class="centercard"> <mat-card class="centercard">
<h3>{{ vE.businessSignupTitle }}</h3> <h3>Business sign-up</h3>
<mat-vertical-stepper #stepper [linear]="true"> <mat-vertical-stepper #stepper linear>
<mat-step label="{{ vE.businessBizInfo }}" editable="false"> <mat-step label="Provide business info" editable="false">
<p>{{ vE.businessAddrsNobiz }}</p> <p>We do not have a business associated with this Zcash address, please enter your information below:</p>
<mat-card [formGroup]="bizForm"> <mat-card [formGroup]="bizForm">
<mat-form-field appearance="outline" [style.width.px]=300> <mat-form-field appearance="outline" [style.width.px]=300>
<mat-label>{{ vE.businessBizNamelbl }}</mat-label> <mat-label>Business Name</mat-label>
<input matInput placeholder="{{ vE.businessBizNameholder }}" formControlName="name"> <input matInput placeholder="Business Name" formControlName="name">
</mat-form-field> </mat-form-field>
<br> <br>
<mat-form-field appearance="outline"> <mat-form-field appearance="outline">
<mat-label>{{ vE.businessContactFnamelbl }}</mat-label> <mat-label>Contact First Name</mat-label>
<input matInput placeholder="{{ vE.businessContactFnholder }}" formControlName="first"> <input matInput placeholder="First Name" formControlName="first">
</mat-form-field> </mat-form-field>
<mat-form-field appearance="outline"> <mat-form-field appearance="outline">
<mat-label>{{ vE.businessContactLnamelbl }}</mat-label> <mat-label>Contact Last Name</mat-label>
<input matInput placeholder="{{ vE.businessContactLnholder }}" formControlName="last"> <input matInput placeholder="Last Name" formControlName="last">
</mat-form-field> </mat-form-field>
<mat-form-field appearance="outline"> <mat-form-field appearance="outline">
<mat-label>{{ vE.businessBizAddresslbl }}</mat-label> <mat-label>Address</mat-label>
<input matInput placeholder="{{ vE.businessBizAddressholder }}" formControlName="street"> <input matInput placeholder="Address" formControlName="street">
</mat-form-field> </mat-form-field>
<mat-form-field appearance="outline"> <mat-form-field appearance="outline">
<mat-label>{{ vE.businessBizCitylbl }}</mat-label> <mat-label>City</mat-label>
<input matInput placeholder="{{ vE.businessBizCityholder }}" formControlName="city"> <input matInput placeholder="City" formControlName="city">
</mat-form-field> </mat-form-field>
<mat-form-field appearance="outline"> <mat-form-field appearance="outline">
<mat-label>{{ vE.businessBizStatelbl }}</mat-label> <mat-label>State/Province</mat-label>
<input matInput placeholder="{{ vE.businessBizStateholder }}" formControlName="state"> <input matInput placeholder="State or Province" formControlName="state">
</mat-form-field> </mat-form-field>
<mat-form-field appearance="outline"> <mat-form-field appearance="outline">
<mat-label>{{ vE.businessBizPcodelbl }}</mat-label> <mat-label>Postal Code</mat-label>
<input matInput placeholder="{{ vE.businessBizPcodeholder }}" formControlName="postal"> <input matInput placeholder="Postal Code" formControlName="postal">
</mat-form-field> </mat-form-field>
<mat-form-field appearance="outline"> <mat-form-field appearance="outline">
<mat-label>{{ vE.businessBizCountrylbl }}</mat-label> <mat-label>Country</mat-label>
<input matInput placeholder="{{ vE.businessBizCountryholder }}" formControlName="country" [matAutocomplete]="auto"> <input matInput placeholder="Country" formControlName="country" [matAutocomplete]="auto">
<mat-autocomplete #auto="matAutocomplete"> <mat-autocomplete #auto="matAutocomplete">
<mat-option *ngFor="let ctry of countries | searchOptions:bizForm.get('country')!.value" [value]="ctry.name"> <mat-option *ngFor="let ctry of countries | searchOptions:bizForm.get('country')!.value" [value]="ctry.name">
{{ctry.name}} {{ctry.name}}
@ -45,27 +45,27 @@
</mat-autocomplete> </mat-autocomplete>
</mat-form-field> </mat-form-field>
<mat-form-field appearance="outline"> <mat-form-field appearance="outline">
<mat-label>{{ vE.businessBizMaillbl }}</mat-label> <mat-label>E-mail</mat-label>
<input matInput type="email" placeholder="{{ vE.businessBizMailholder }}" formControlName="email"> <input matInput type="email" placeholder="E-mail" formControlName="email">
</mat-form-field> </mat-form-field>
<mat-form-field appearance="outline"> <mat-form-field appearance="outline">
<mat-label>{{ vE.businessBizWebsitelbl }}</mat-label> <mat-label>Website</mat-label>
<input matInput placeholder="{{ vE.businessBizWebsiteholder }}" formControlName="website"> <input matInput placeholder="Website" formControlName="website">
</mat-form-field> </mat-form-field>
<mat-slide-toggle (change)="onChange($event)"> <mat-slide-toggle (change)="onChange($event)">
{{ vE.businessAcceptTerms }} <a class="link" (click)="showTerms()">{{ vE.businessTermsOfuse }}</a> I accept the <a class="link" (click)="showTerms()">Terms of Use</a>
</mat-slide-toggle> </mat-slide-toggle>
<mat-card-actions> <mat-card-actions>
<button mat-raised-button color="primary" [disabled]="bizForm.invalid || !termsChecked" (click)="save()">{{ vE.businessSaveBtn }}</button> <button mat-raised-button color="primary" [disabled]="bizForm.invalid || !termsChecked" (click)="save()">Save</button>
</mat-card-actions> </mat-card-actions>
</mat-card> </mat-card>
</mat-step> </mat-step>
<mat-step label="{{ vE.businessSessionLengthlbl }}" editable="false"> <mat-step label="Select your session" editable="false">
<p>{{ vE.businessSelectSession }}</p> <p>Please select the length of session that you need:</p>
<mat-card [formGroup]="payForm"> <mat-card [formGroup]="payForm">
<mat-form-field appearance="outline"> <mat-form-field appearance="outline">
<mat-label>{{ vE.businessSessionLabel }}</mat-label> <mat-label>Session</mat-label>
<mat-select formControlName="session"> <mat-select formControlName="session">
<mat-option *ngFor="let ticket of tickets" [value]="ticket.value"> <mat-option *ngFor="let ticket of tickets" [value]="ticket.value">
{{ticket.viewValue}} {{ticket.viewValue}}
@ -73,11 +73,11 @@
</mat-select> </mat-select>
</mat-form-field> </mat-form-field>
<mat-card-actions> <mat-card-actions>
<button mat-raised-button color="primary" [disabled]="payForm.invalid" (click)="pay()">{{ vE.businessSessionPaylbl }}</button> <button mat-raised-button color="primary" [disabled]="payForm.invalid" (click)="pay()">Pay</button>
</mat-card-actions> </mat-card-actions>
</mat-card> </mat-card>
</mat-step> </mat-step>
<mat-step label="{{ vE.businessZGoConfirmlbl }}" editable="false"> <mat-step label="ZGo confirms your payment" editable="false">
<p>{{barMessage}}</p> <p>{{barMessage}}</p>
<mat-progress-bar <mat-progress-bar
[mode]="barMode" [mode]="barMode"

View file

@ -14,8 +14,6 @@ import { FullnodeService } from '../fullnode.service';
import { ScanComponent } from '../scan/scan.component'; import { ScanComponent } from '../scan/scan.component';
import { TermsComponent } from '../terms/terms.component'; import { TermsComponent } from '../terms/terms.component';
import { LanguageService } from '../language.service';
@Component({ @Component({
selector: 'app-business', selector: 'app-business',
templateUrl: './business.component.html', templateUrl: './business.component.html',
@ -50,20 +48,29 @@ export class BusinessComponent implements OnInit {
countries: Country[] = []; countries: Country[] = [];
owner: Owner = { owner: Owner = {
address: '', address: '',
name: '',
currency: 'usd', currency: 'usd',
tax: false, tax: false,
taxValue: 0, taxValue: 0,
vat: false, vat: false,
vatValue: 0, vatValue: 0,
phone: '',
paid: false, paid: false,
first: '',
last: '',
name: '',
street: '',
city: '',
state: '',
postal: '',
country: '',
email: '',
website: '',
zats: false, zats: false,
invoices: false, invoices: false,
expiration: new Date(Date.now()).toISOString(), expiration: new Date(Date.now()).toISOString(),
payconf: false, payconf: false,
crmToken: '',
viewkey: '', viewkey: '',
tips: false crmToken: ''
} }
public countriesUpdate: Observable<Country[]>; public countriesUpdate: Observable<Country[]>;
public ownerUpdate: Observable<Owner>; public ownerUpdate: Observable<Owner>;
@ -73,62 +80,8 @@ export class BusinessComponent implements OnInit {
sessionId = ''; sessionId = '';
ownerKnown = false; ownerKnown = false;
termsChecked = false; termsChecked = false;
ownerdata = {
first: '',
last: '',
phone: '',
name: '',
street: '',
city: '',
state: '',
postal: '',
country: '',
email: '',
website: '',
payconf: false
};
// -------------------------------------
//
// Language Support
//
vE = {
businessSignupTitle : '',
businessBizInfo : '',
businessAddrsNobiz : '',
businessBizNamelbl : '',
businessBizNameholder : '',
businessContactFnamelbl : '',
businessContactFnholder : '',
businessContactLnamelbl : '',
businessContactLnholder : '',
businessBizAddresslbl : '',
businessBizAddressholder : '',
businessBizCitylbl : '',
businessBizCityholder : '',
businessBizStatelbl : '',
businessBizStateholder : '',
businessBizPcodelbl : '',
businessBizPcodeholder : '',
businessBizCountrylbl : '',
businessBizCountryholder : '',
businessBizMaillbl : '',
businessBizMailholder : '',
businessBizWebsitelbl : '',
businessBizWebsiteholder : '',
businessAcceptTerms : '',
businessTermsOfuse : '',
businessSaveBtn : '',
businessSessionLengthlbl : '',
businessSelectSession : '',
businessSessionLabel : '',
businessSessionPaylbl : '',
businessZGoConfirmlbl : ''
};
//
//
constructor( constructor(
private languageService : LanguageService,
private fb: UntypedFormBuilder, private fb: UntypedFormBuilder,
private userService: UserService, private userService: UserService,
private fullnodeService: FullnodeService, private fullnodeService: FullnodeService,
@ -175,7 +128,6 @@ export class BusinessComponent implements OnInit {
} }
ngOnInit(): void { ngOnInit(): void {
this.chgUILanguage();
this.intervalHolder = setInterval(() => { this.intervalHolder = setInterval(() => {
this.loginCheck(); this.loginCheck();
}, 1000 * 60); }, 1000 * 60);
@ -191,7 +143,7 @@ export class BusinessComponent implements OnInit {
} }
onChange(ob: MatSlideToggleChange){ onChange(ob: MatSlideToggleChange){
//console.log(ob.checked); console.log(ob.checked);
this.termsChecked = ob.checked; this.termsChecked = ob.checked;
} }
@ -200,17 +152,25 @@ export class BusinessComponent implements OnInit {
dialogConfig.disableClose = true; dialogConfig.disableClose = true;
dialogConfig.autoFocus = true; dialogConfig.autoFocus = true;
this.dialog.open(TermsComponent, dialogConfig); const dialogRef = this.dialog.open(TermsComponent, dialogConfig);
//dialogRef.afterClosed().subscribe(val => { dialogRef.afterClosed().subscribe(val => {
//console.log('Terms read'); console.log('Terms read');
//}); });
} }
save() { save() {
this.ownerdata = { this.owner = {
_id: '',
address: '',
currency: 'usd',
tax: false,
taxValue: 0,
vat: false,
vatValue: 0,
first: this.bizForm.get('first')!.value, first: this.bizForm.get('first')!.value,
last: this.bizForm.get('last')!.value, last: this.bizForm.get('last')!.value,
phone: '', phone: '',
paid: false,
name: this.bizForm.get('name')!.value, name: this.bizForm.get('name')!.value,
street: this.bizForm.get('street')!.value, street: this.bizForm.get('street')!.value,
city: this.bizForm.get('city')!.value, city: this.bizForm.get('city')!.value,
@ -219,9 +179,14 @@ export class BusinessComponent implements OnInit {
country: this.bizForm.get('country')!.value, country: this.bizForm.get('country')!.value,
email: this.bizForm.get('email')!.value, email: this.bizForm.get('email')!.value,
website: this.bizForm.get('website')!.value, website: this.bizForm.get('website')!.value,
payconf: false zats: false,
invoices: false,
expiration: new Date(Date.now()).toISOString(),
payconf: false,
viewkey: '',
crmToken: ''
}; };
this.userService.addOwner(this.ownerdata); this.userService.addOwner(this.owner);
this.stepper!.next(); this.stepper!.next();
} }
@ -239,7 +204,7 @@ export class BusinessComponent implements OnInit {
const dialogRef = this.dialog.open(ScanComponent, dialogConfig); const dialogRef = this.dialog.open(ScanComponent, dialogConfig);
dialogRef.afterClosed().subscribe(val => { dialogRef.afterClosed().subscribe(val => {
//console.log('Awaiting payment'); console.log('Awaiting payment');
if(val){ if(val){
this.stepper!.next(); this.stepper!.next();
} }
@ -256,51 +221,4 @@ export class BusinessComponent implements OnInit {
}); });
} }
chgUILanguage(){
//console.log('BUSINESS.chgUILanguage Called ');
this.languageService.getViewElements('business').subscribe(
response => {
//console.log('Received >> ', response );
//console.log('Language Code : ', response.language);
//console.log('Component Name : ',response.component);
//console.log('Language data : ',response.data);
this.vE.businessSignupTitle = response.data.business_signup_title;
this.vE.businessBizInfo = response.data.business_biz_info;
this.vE.businessAddrsNobiz = response.data.business_addrs_nobiz;
this.vE.businessBizNamelbl = response.data.business_biz_namelbl;
this.vE.businessBizNameholder = response.data.business_biz_nameholder;
this.vE.businessContactFnamelbl = response.data.business_contact_fnamelbl;
this.vE.businessContactFnholder = response.data.business_contact_fnholder;
this.vE.businessContactLnamelbl = response.data.business_contact_lnamelbl;
this.vE.businessBizAddresslbl = response.data.business_biz_addresslbl;
this.vE.businessBizAddressholder = response.data.business_biz_addressholder;
this.vE.businessBizCitylbl = response.data.business_biz_citylbl;
this.vE.businessBizCityholder = response.data.business_biz_cityholder;
this.vE.businessBizStatelbl = response.data.business_biz_statelbl;
this.vE.businessBizStateholder = response.data.business_biz_stateholder;
this.vE.businessBizPcodelbl = response.data.business_biz_pcodelbl;
this.vE.businessBizPcodeholder = response.data.business_biz_pcodeholder;
this.vE.businessBizCitylbl = response.data.business_biz_citylbl;
this.vE.businessBizCityholder = response.data.business_biz_cityholder;
this.vE.businessBizCountrylbl = response.data.business_biz_countrylbl;
this.vE.businessBizCountryholder = response.data.business_biz_countryholder;
this.vE.businessBizMaillbl = response.data.business_biz_maillbl;
this.vE.businessBizMailholder = response.data.business_biz_mailholder;
this.vE.businessBizWebsitelbl = response.data.business_biz_websitelbl;
this.vE.businessBizWebsiteholder = response.data.business_biz_websiteholder;
this.vE.businessAcceptTerms = response.data.business_accept_terms;
this.vE.businessTermsOfuse = response.data.business_terms_ofuse;
this.vE.businessSaveBtn = response.data.business_save_btn;
this.vE.businessSessionLengthlbl = response.data.business_session_lengthlbl;
this.vE.businessSelectSession = response.data.business_select_session;
this.vE.businessSessionLabel = response.data.business_session_label;
this.vE.businessSessionPaylbl = response.data.business_session_paylbl;
this.vE.businessZGoConfirmlbl = response.data.business_zgo_confirmlbl;
},
error => { console.log('Error >> ',error); }
);
}
} }

View file

@ -1,33 +1,28 @@
<div class='cancelTitle'>{{title}}</div> <div class="container" style="margin-top: 10px;">
<div class="container" >
<mat-dialog-content <div class="cancelTitle">{{title}}</div>
style="font-family: 'Spartan', sans-serif;
display: flex; <mat-dialog-content>
justify-content: space-between; <p class="text">{{msg}}</p>
margin-top: 20px;
padding: 20px;">
{{msg1}}<br>{{msg2}}
</mat-dialog-content> </mat-dialog-content>
<div style="font-family: 'Spartan', sans-serif;
display: flex; <mat-dialog-actions>
justify-content: space-between; <table cellspacing="0" width="100%">
margin-top: 20px; <tr>
padding: 20px;"> <td>
<button mat-raised-button <button mat-raised-button color="primary" (click)="confirm()">
style="background-color: #ff5722; Yes
font-family: 'Spartan', sans-serif; </button>
font-size: 14px;
font-weight: 600; </td>
color : white;" <td align="right">
(click)="confirm()"> <button mat-raised-button (click)="close()">
{{ vE.cancelConfirmBtn }} No
</button> </button>
<button mat-raised-button
style="font-family: 'Spartan', sans-serif; </td>
font-size: 14px; </tr>
font-weight: 600;" </table>
(click)="close()"> </mat-dialog-actions>
{{ vE.cancelDismissBtn }}
</button>
</div>
</div> </div>

View file

@ -1,8 +1,6 @@
import { Inject, Component, OnInit, ViewEncapsulation} from '@angular/core'; import { Inject, Component, OnInit, ViewEncapsulation} from '@angular/core';
import { MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog'; import { MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';
import { LanguageService } from '../language.service';
import { LanguageData } from '../language.model';
@Component({ @Component({
selector: 'app-cancel', selector: 'app-cancel',
@ -12,31 +10,14 @@ import { LanguageData } from '../language.model';
export class CancelComponent { export class CancelComponent {
title: string; title: string;
msg1: string; msg: string;
msg2: string;
// -------------------------------------
//
// Language Support
//
vE = {
cancelTitle : '',
cancelConfirmBtn : '',
cancelDismissBtn : ''
}
//
// ------------------------------------------------------------
constructor( constructor(
private languageService : LanguageService,
private dialogRef: MatDialogRef<CancelComponent>, private dialogRef: MatDialogRef<CancelComponent>,
@Inject(MAT_DIALOG_DATA) public data: { title: string, msg1: string, msg2: string;} @Inject(MAT_DIALOG_DATA) public data: { title: string, msg: string}
) { ) {
this.title = data.title; this.title = data.title;
this.msg1 = data.msg1; this.msg = data.msg;
this.msg2 = data.msg2;
}
ngOnInit() {
this.chgUILanguage();
} }
confirm() { confirm() {
@ -46,22 +27,4 @@ export class CancelComponent {
close() { close() {
this.dialogRef.close(false); this.dialogRef.close(false);
} }
chgUILanguage(){
console.log('CANCEL.chgUILanguage Called ');
this.languageService.getViewElements('cancel').subscribe(
response => {
console.log('Received >> ', response );
console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component);
console.log('Language data : ',response.data);
this.vE.cancelTitle = response.data.cancel_title;
this.vE.cancelConfirmBtn = response.data.cancel_confirm_btn;
this.vE.cancelDismissBtn = response.data.cancel_dismiss_btn;
},
error => { console.log('Error >> ',error); }
);
}
} }

View file

@ -1,10 +1,9 @@
<div class="askPayment">
{{ vE.checkoutScanPayment }}
</div>
<div class="container" style="font-family: 'Spartan', sans-serif; <div class="container" style="font-family: 'Spartan', sans-serif;
padding: 15px;"> margin-top: 10px;">
<div class="askPayment">
Scan to make payment
</div>
<pre></pre> <pre></pre>
<table style="align-content: center;"> <table style="align-content: center;">
<tr> <tr>
@ -21,43 +20,43 @@
width="100%"> width="100%">
<tr> <tr>
<td> <td>
<button mat-raised-button color="primary" (click)="confirm()"><mat-icon>verified_user</mat-icon> <button mat-raised-button color="primary" (click)="confirm()">
{{ vE.checkoutAcceptBtn }} <mat-icon>verified_user</mat-icon>
</button> </button>
</td> </td>
<td align="right"> <td align="right">
<button mat-raised-button (click)="close()"> <button mat-raised-button (click)="close()">
<mat-icon>close_btn</mat-icon>{{ vE.checkoutCloseBtn }} <mat-icon>close</mat-icon>
</button> </button>
</td> </td>
</tr> </tr>
</table> </table>
</div> </div>
<div style="text-align: center; <div style="text-align: center;
margin-top: 10px; margin-top: 10px;
line-height: 30px;">{{ vE.checkoutCantScan }}<br> line-height: 30px;">
{{ vE.checkoutUseThis }}<a [href]="zcashUrl">{{ vE.checkoutWalletLink }}</a>{{ vE.checkoutWalletOr }}
Can't scan?<br>Use this <a [href]="zcashUrl">wallet link</a>, or
<div style="display: flex; <div style="display: flex;
justify-content: space-between;"> justify-content: space-between;">
<button style="margin-top: 20px; <button style="margin-top: 20px;
font-weight: 700; font-weight: 700;
background-color: lightgray;" background-color: lightgray;"
mat-raised-button mat-raised-button
(click)="copyAddress()">{{ vE.checkoutCopyAddress }}</button> (click)="copyAddress()">Copy Address</button>
<button style="margin-top: 20px; <button style="margin-top: 20px;
font-weight: 700; font-weight: 700;
background-color: lightgray;" background-color: lightgray;"
mat-raised-button mat-raised-button
(click)="copyAmount()">{{ vE.checkoutCopyAmount }}</button> (click)="copyAmount()">Copy Amount</button>
</div> </div>
<button style="margin-top: 20px; <button style="margin-top: 20px;
font-weight: 700; font-weight: 700;
background-color: lightgray;" background-color: lightgray;"
mat-raised-button mat-raised-button
(click)="copyMemo()">{{ vE.checkoutCopyMemo }}</button> (click)="copyMemo()">Copy Memo</button>
</div> </div>

View file

@ -4,9 +4,6 @@ import { DomSanitizer, SafeUrl } from '@angular/platform-browser';
import { NotifierService } from '../notifier.service'; import { NotifierService } from '../notifier.service';
import { LanguageService } from '../language.service';
import { LanguageData } from '../language.model';
var QRCode = require('easyqrcodejs'); var QRCode = require('easyqrcodejs');
var URLSafeBase64 = require('urlsafe-base64'); var URLSafeBase64 = require('urlsafe-base64');
var Buffer = require('buffer/').Buffer; var Buffer = require('buffer/').Buffer;
@ -17,38 +14,14 @@ var Buffer = require('buffer/').Buffer;
styleUrls: ['./checkout.component.css'] styleUrls: ['./checkout.component.css']
}) })
export class CheckoutComponent implements OnInit { export class CheckoutComponent implements OnInit{
address: string; address: string;
total: number; total: number;
orderId: string; orderId: string;
codeString: string = ''; codeString: string = '';
zcashUrl: SafeUrl; zcashUrl: SafeUrl;
// -------------------------------------
//
// Language Support
//
vE = {
checkoutScanPayment : '',
checkoutAcceptBtn : '',
checkoutCloseBtn : '',
checkoutCantScan : '',
checkoutUseThis : '',
checkoutWalletLink : '',
checkoutWalletOr : '',
checkoutCopyAddress : '',
checkoutCopyAmount : '',
checkoutCopyMemo : '',
checkoutCopyNotavail : '',
checkoutNotservClose : '',
checkoutNotservError : '',
checkoutCopyaddressError : '',
checkoutCopyamountError : '',
checkoutCopymemoError : ''
};
//
constructor( constructor(
private languageService : LanguageService,
private dialogRef: MatDialogRef<CheckoutComponent>, private dialogRef: MatDialogRef<CheckoutComponent>,
private sanitizer: DomSanitizer, private sanitizer: DomSanitizer,
@Inject(MAT_DIALOG_DATA) public data: { totalZec: number, addr: string, orderId: string}, @Inject(MAT_DIALOG_DATA) public data: { totalZec: number, addr: string, orderId: string},
@ -74,7 +47,7 @@ export class CheckoutComponent implements OnInit {
correctLevel: QRCode.CorrectLevel.H correctLevel: QRCode.CorrectLevel.H
}); });
console.log("mgOnInit - pasa"); console.log("mgOnInit - pasa");
this.chgUILanguage();
} }
confirm() { confirm() {
@ -89,40 +62,27 @@ export class CheckoutComponent implements OnInit {
if (!navigator.clipboard) { if (!navigator.clipboard) {
// alert("Copy functionality not supported"); // alert("Copy functionality not supported");
this.notifierService this.notifierService
.showNotification(this.vE.checkoutCopyNotavail, .showNotification("Copy functionality not supported","Close","error");
this.vE.checkoutNotservClose,
"error",
this.vE.checkoutNotservError);
} }
try { try {
navigator.clipboard.writeText(this.address); navigator.clipboard.writeText(this.address);
} catch (err) { } catch (err) {
this.notifierService this.notifierService
.showNotification(this.vE.checkoutCopyaddressError, .showNotification("Error copying address","Close","error");
this.vE.checkoutNotservClose,
"error",
this.vE.checkoutNotservError);
// console.error("Error", err); // console.error("Error", err);
} }
} }
copyAmount() { copyAmount() {
if (!navigator.clipboard) { if (!navigator.clipboard) {
// alert("Copy functionality not supported"); // alert("Copy functionality not supported");
this.notifierService this.notifierService
.showNotification(this.vE.checkoutCopyNotavail, .showNotification("Copy functionality not supported","Close","error");
this.vE.checkoutNotservClose,
"error",
this.vE.checkoutNotservError);
} }
try { try {
navigator.clipboard.writeText(this.total.toString()); navigator.clipboard.writeText(this.total.toString());
} catch (err) { } catch (err) {
this.notifierService this.notifierService
.showNotification(this.vE.checkoutCopyamountError, .showNotification("Error while copying ammount","Close","error");
this.vE.checkoutNotservClose,
"error",
this.vE.checkoutNotservError);
// console.error("Error", err); // console.error("Error", err);
} }
} }
@ -131,51 +91,14 @@ export class CheckoutComponent implements OnInit {
if (!navigator.clipboard) { if (!navigator.clipboard) {
// alert("Copy functionality not supported"); // alert("Copy functionality not supported");
this.notifierService this.notifierService
.showNotification(this.vE.checkoutCopyNotavail, .showNotification("Copy functionality not supported","Close","error");
this.vE.checkoutNotservClose,
"error",
this.vE.checkoutNotservError);
} }
try { try {
navigator.clipboard.writeText("ZGo Order::" + this.orderId); navigator.clipboard.writeText("ZGo Order::" + this.orderId);
} catch (err) { } catch (err) {
this.notifierService this.notifierService
.showNotification(this.vE.checkoutCopymemoError, .showNotification("Error while copying Memo","Close","error");
this.vE.checkoutNotservClose,
"error",
this.vE.checkoutNotservError);
// console.error("Error", err); // console.error("Error", err);
} }
} }
chgUILanguage(){
console.log('CHECKOUT.chgUILanguage Called ');
this.languageService.getViewElements('checkout').subscribe(
response => {
console.log('Received >> ', response );
console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component);
console.log('Language data : ',response.data);
this.vE.checkoutScanPayment = response.data.checkout_scan_payment;
this.vE.checkoutAcceptBtn = response.data.checkout_accept_btn;
this.vE.checkoutCloseBtn = response.data.checkout_close_btn;
this.vE.checkoutCantScan = response.data.checkout_cant_scan;
this.vE.checkoutUseThis = response.data.checkout_use_this;
this.vE.checkoutWalletLink = response.data.checkout_wallet_link;
this.vE.checkoutWalletOr = response.data.checkout_wallet_or;
this.vE.checkoutCopyAddress = response.data.checkout_copy_address;
this.vE.checkoutCopyAmount = response.data.checkout_copy_amount;
this.vE.checkoutCopyMemo = response.data.checkout_copy_memo;
this.vE.checkoutCopyNotavail = response.data.checkout_copy_notavail;
this.vE.checkoutNotservClose = response.data.checkout_notserv_close;
this.vE.checkoutNotservError = response.data.checkout_notserv_error;
this.vE.checkoutCopyaddressError = response.data.checkout_copyaddress_error;
this.vE.checkoutCopyamountError = response.data.checkout_copyamount_error;
this.vE.checkoutCopymemoError = response.data.checkout_copymemo_error;
},
error => { console.log('Error >> ',error); }
);
}
} }

View file

@ -3,12 +3,9 @@
font-size: 11px; font-size: 11px;
} }
.daterangecard {
padding: 30px;
}
.description { .description {
margin-bottom: 20px; padding-top: 30px;
padding-bottom: 20px;
font-size: 14px; font-size: 14px;
font-weight: 700; font-weight: 700;
text-align: center; text-align: center;
@ -39,8 +36,7 @@
color: white; color: white;
font-size: 30px; font-size: 30px;
text-align: center; text-align: center;
vertical-align: middle; padding: 5px;
padding: 10px;
} }
.daterange { .daterange {

View file

@ -1,61 +1,54 @@
<div class="settings-title">{{ vE.dbexportSettingsTitle }}</div> <div class="settings-title">Export Orders</div>
<div class='daterangecard'> <div class='description'>
<div class='description'> Export orders in a .CSV format file
{{ vE.dbexportExportDescrip }} </div>
</div> <div class="datepicker"
<div class="datepicker" *ngIf="ordersOk()">
*ngIf="ordersOk()"> <mat-form-field appearance="fill">
<mat-form-field appearance="fill"> <!--
<!-- <mat-label >Enter a date range</mat-label>
<mat-label >Enter a date range</mat-label> -->
--> <div class="daterange">Date range:</div>
<div class="daterange">{{ vE.dbexportDateRange }}</div> <mat-date-range-input [formGroup]="range" [rangePicker]="picker">
<mat-date-range-input [formGroup]="range" [rangePicker]="picker"> <input matStartDate formControlName="start" placeholder="Start date">
<input matStartDate formControlName="start" placeholder="{{ vE.dbexportStartDate }}"> <input matEndDate formControlName="end" placeholder="End date">
<input matEndDate formControlName="end" placeholder="{{ vE.dbexportEndDate }}"> </mat-date-range-input>
</mat-date-range-input> <mat-hint>MM/DD/YYYY MM/DD/YYYY</mat-hint>
<mat-hint>MM/DD/YYYY MM/DD/YYYY</mat-hint> <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
<mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle> <mat-date-range-picker #picker></mat-date-range-picker>
<mat-date-range-picker #picker></mat-date-range-picker>
<mat-error *ngIf="range.controls.start.hasError('matStartDateInvalid')">Invalid start date</mat-error>
<mat-error *ngIf="range.controls.start.hasError('matStartDateInvalid')">{{ vE.dbexportInvalidStart }}</mat-error> <mat-error *ngIf="range.controls.end.hasError('matEndDateInvalid')">Invalid end date</mat-error>
<mat-error *ngIf="range.controls.end.hasError('matEndDateInvalid')">{{ vE.dbexportInvalidEnd }}</mat-error> </mat-form-field>
</mat-form-field> <br>
<br> <br>
<br> <br>
<br> </div>
</div>
<div class="noorders"
<div class="noorders" *ngIf="!ordersOk()">
*ngIf="!ordersOk()"> <br>
<br> You have no orders created.
{{ vE.dbexportNoordersCreated }} <br>
<br> Nothing to do.
{{ vE.dbexportNothingTodo }} <br>
<br> <br>
<br> <br>
<br> </div>
</div> <br>
<br> <br>
<br> <div style="display: flex;
<div style="display: flex; justify-content: space-between;
justify-content: space-between; align-items: center;">
align-items: center;"> <button mat-raised-button
<button mat-raised-button (click)="closedbExport()">
style="background: #ff5722; Close
color: white; </button>
font-weight: 700;"
(click)="closedbExport()"> <a mat-raised-button *ngIf="checkReady()" color="primary" [href]="fileUrl"
{{ vE.dbexportBtnClose }} download="orders.csv">Download</a>
</button>
</div>
<a mat-raised-button *ngIf="checkReady()" color="primary" [href]="fileUrl" <div style="height: 20px;
download="orders.csv">{{ vE.dbexportDownloadLink }}</a> margin-top: 10px;">
</div>
<!--
<div style="height: 20px;
margin-top: 10px;">
</div>
-->
</div> </div>

View file

@ -9,9 +9,8 @@ import { FullnodeService } from '../fullnode.service';
import { UserService } from '../user.service'; import { UserService } from '../user.service';
import { Owner } from '../owner.model'; import { Owner } from '../owner.model';
import { OrderService } from '../order/order.service'; import { OrderService } from '../order/order.service';
import { NotifierService } from '../notifier.service';
import { LanguageService } from '../language.service';
import { LanguageData } from '../language.model';
@Component({ @Component({
selector: 'app-db-export', selector: 'app-db-export',
@ -33,14 +32,23 @@ export class DbExportComponent implements OnInit {
taxValue: 0, taxValue: 0,
vat: false, vat: false,
vatValue: 0, vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false, paid: false,
website: '',
country: '',
zats: false, zats: false,
invoices: false, invoices: false,
expiration: new Date(Date.now()).toISOString(), expiration: new Date(Date.now()).toISOString(),
payconf: false, payconf: false,
crmToken: '',
viewkey: '', viewkey: '',
tips: false crmToken: ''
}; };
_ordersOk = false; _ordersOk = false;
@ -49,31 +57,8 @@ export class DbExportComponent implements OnInit {
start: new FormControl<Date | null>(null), start: new FormControl<Date | null>(null),
end: new FormControl<Date | null>(null), end: new FormControl<Date | null>(null),
}); });
// -------------------------------------
//
// Language Support
//
vE = {
dbexportSettingsTitle : '',
dbexportExportDescrip : '',
dbexportDateRange : '',
dbexportStartDate : '',
dbexportEndDate : '',
dbexportInvalidStart : '',
dbexportInvalidEnd : '',
dbexportNoordersCreated : '',
dbexportNothingTodo : '',
dbexportBtnClose : '',
dbexportDownloadLink : '',
dbexportFileHeader : '',
dbexportClosedYes : '',
dbexportClosedNo : '',
dbexportPaidYes : '',
dbexportPaidNo : ''
};
//
constructor(private languageService : LanguageService, constructor(private notifierService : NotifierService,
private dialogRef: MatDialogRef<DbExportComponent>, private dialogRef: MatDialogRef<DbExportComponent>,
private sanitizer: DomSanitizer, private sanitizer: DomSanitizer,
public orderService: OrderService, public orderService: OrderService,
@ -85,7 +70,6 @@ export class DbExportComponent implements OnInit {
ngOnInit(): void { ngOnInit(): void {
console.log('db-export Init -->'); console.log('db-export Init -->');
this.chgUILanguage();
this.owner = this.userService.currentOwner(); this.owner = this.userService.currentOwner();
console.log(this.owner.name); console.log(this.owner.name);
console.log(this.range); console.log(this.range);
@ -98,6 +82,8 @@ export class DbExportComponent implements OnInit {
}); });
} }
ordersOk() : boolean { ordersOk() : boolean {
return this._ordersOk; return this._ordersOk;
} }
@ -114,20 +100,20 @@ export class DbExportComponent implements OnInit {
}); });
// create header // create header
data = this.vE.dbexportFileHeader + "\n"; data = '"Date","Order ID","Currency","Closed?","Amount","Rate","ZEC","Paid?","Invoice"' + "\n";
var iniDate = new Date(this.range.value.start); var iniDate = new Date(this.range.value.start);
var endDate = new Date(this.range.value.end); var endDate = new Date(this.range.value.end);
for (let i=0; i < this.orders.length; i++){ for (let i=0; i < this.orders.length; i++){
var date = new Date(this.orders[i]!.timestamp!); var date = new Date(this.orders[i]!.timestamp!);
var orderid = String(this.orders[i]._id); var orderid = String(this.orders[i]._id);
var closed = this.orders[i].closed ? this.vE.dbexportClosedYes : this.vE.dbexportClosedNo ; var closed = this.orders[i].closed ? 'Yes' : 'No';
/* /*
console.log('Order No. ' + console.log('Order No. ' +
this.orders[i]._id! + ' - totalZec = ' + this.orders[i]._id! + ' - totalZec = ' +
this.orders[i].totalZec); this.orders[i].totalZec);
*/ */
var paid = this.orders[i].paid ? this.vE.dbexportPaidYes : this.vE.dbexportPaidNo ; var paid = this.orders[i].paid ? 'Yes' : 'No';
if ( (date >= iniDate) && (date <= endDate) ) { if ( (date >= iniDate) && (date <= endDate) ) {
data = data + data = data +
date.getFullYear() + '-' + date.getFullYear() + '-' +
@ -140,9 +126,6 @@ export class DbExportComponent implements OnInit {
this.orders[i].total + ',' + this.orders[i].total + ',' +
this.orders[i].price! + ',' + this.orders[i].price! + ',' +
this.orders[i].totalZec + ',' + this.orders[i].totalZec + ',' +
this.orders[i].taxAmount + ',' +
this.orders[i].vatAmount + ',' +
this.orders[i].tipAmount + ',' +
paid + ',"' + paid + ',"' +
this.orders[i].externalInvoice + '"' + this.orders[i].externalInvoice + '"' +
'\n'; '\n';
@ -160,35 +143,4 @@ export class DbExportComponent implements OnInit {
this.dialogRef.close(); this.dialogRef.close();
} }
chgUILanguage(){
console.log('DBEXPORT.chgUILanguage Called ');
this.languageService.getViewElements('dbexport').subscribe(
response => {
console.log('Received >> ', response );
console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component);
console.log('Language data : ',response.data);
this.vE.dbexportSettingsTitle = response.data.dbexport_settings_title;
this.vE.dbexportExportDescrip = response.data.dbexport_export_descrip;
this.vE.dbexportDateRange = response.data.dbexport_date_range;
this.vE.dbexportStartDate = response.data.dbexport_start_date;
this.vE.dbexportEndDate = response.data.dbexport_end_date;
this.vE.dbexportInvalidStart = response.data.dbexport_invalid_start;
this.vE.dbexportInvalidEnd = response.data.dbexport_invalid_end;
this.vE.dbexportNoordersCreated = response.data.dbexport_noorders_created;
this.vE.dbexportNothingTodo = response.data.dbexport_nothing_todo;
this.vE.dbexportBtnClose = response.data.dbexport_btn_close;
this.vE.dbexportDownloadLink = response.data.dbexport_download_link;
this.vE.dbexportFileHeader = response.data.dbexport_file_header;
this.vE.dbexportClosedYes = response.data.dbexport_closed_yes;
this.vE.dbexportClosedNo = response.data.dbexport_closed_no;
this.vE.dbexportPaidYes = response.data.dbexport_paid_yes;
this.vE.dbexportPaidNo = response.data.dbexport_paid_no;
},
error => { console.log('Error >> ',error); }
);
}
} }

View file

@ -1,5 +1,5 @@
import {Injectable} from '@angular/core'; import {Injectable} from '@angular/core';
import {BehaviorSubject, Observable} from 'rxjs'; import {Subject, Subscription, BehaviorSubject, Observable} from 'rxjs';
import {HttpClient, HttpParams, HttpHeaders} from '@angular/common/http'; import {HttpClient, HttpParams, HttpHeaders} from '@angular/common/http';
import {UserService} from './user.service'; import {UserService} from './user.service';
import { Owner } from './owner.model'; import { Owner } from './owner.model';
@ -12,7 +12,6 @@ var Buffer = require('buffer/').Buffer;
@Injectable({providedIn: 'root'}) @Injectable({providedIn: 'root'})
export class FullnodeService{ export class FullnodeService{
beUrl = ConfigData.Be_URL; beUrl = ConfigData.Be_URL;
private session: null|string = '';
private dataStore: { height: number, memoList: string[], addr: string, price: number } = { height: 0, memoList: [], addr: '', price:0 }; private dataStore: { height: number, memoList: string[], addr: string, price: number } = { height: 0, memoList: [], addr: '', price:0 };
private _heightUpdated: BehaviorSubject<number> = new BehaviorSubject(this.dataStore.height); private _heightUpdated: BehaviorSubject<number> = new BehaviorSubject(this.dataStore.height);
private _memoUpdated: BehaviorSubject<string[]> = new BehaviorSubject(this.dataStore.memoList); private _memoUpdated: BehaviorSubject<string[]> = new BehaviorSubject(this.dataStore.memoList);
@ -23,8 +22,8 @@ export class FullnodeService{
public readonly memoUpdate: Observable<string[]> = this._memoUpdated.asObservable(); public readonly memoUpdate: Observable<string[]> = this._memoUpdated.asObservable();
public readonly priceUpdate: Observable<number> = this._priceUpdated.asObservable(); public readonly priceUpdate: Observable<number> = this._priceUpdated.asObservable();
public readonly ownerUpdate: Observable<Owner>; public readonly ownerUpdate: Observable<Owner>;
private UserSub: Subscription = new Subscription();
private reqHeaders: HttpHeaders; private reqHeaders: HttpHeaders;
private params : HttpParams;
private owner: Owner = { private owner: Owner = {
_id: '', _id: '',
name: '', name: '',
@ -34,21 +33,30 @@ export class FullnodeService{
taxValue: 0, taxValue: 0,
vat: false, vat: false,
vatValue: 0, vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false, paid: false,
website: '',
country: '',
zats: false, zats: false,
invoices: false, invoices: false,
expiration: new Date(Date.now()).toISOString(), expiration: new Date(Date.now()).toISOString(),
payconf: false, payconf: false,
crmToken: '',
viewkey: '', viewkey: '',
tips: false crmToken: ''
}; };
constructor(private http: HttpClient, public userService: UserService){ constructor(private http: HttpClient, public userService: UserService){
this.session = localStorage.getItem('s4z_token');
this.params = new HttpParams().append('session', this.session!);
var auth = 'Basic ' + Buffer.from(ConfigData.UsrPwd).toString('base64'); var auth = 'Basic ' + Buffer.from(ConfigData.UsrPwd).toString('base64');
console.log('auth: ' + auth);
this.reqHeaders = new HttpHeaders().set('Authorization', auth); this.reqHeaders = new HttpHeaders().set('Authorization', auth);
console.log(this.reqHeaders);
this.ownerUpdate = userService.ownerUpdate; this.ownerUpdate = userService.ownerUpdate;
this.getAddr(); this.getAddr();
this.getHeight(); this.getHeight();
@ -59,7 +67,7 @@ export class FullnodeService{
} }
getHeight(){ getHeight(){
let obs = this.http.get<{message: string, height: number}>(this.beUrl+'blockheight', { headers: this.reqHeaders, params: this.params }); let obs = this.http.get<{message: string, height: number}>(this.beUrl+'api/blockheight', { headers: this.reqHeaders });
obs.subscribe((BlockData) => { obs.subscribe((BlockData) => {
this.dataStore.height = BlockData.height; this.dataStore.height = BlockData.height;
this._heightUpdated.next(Object.assign({}, this.dataStore).height); this._heightUpdated.next(Object.assign({}, this.dataStore).height);
@ -70,8 +78,8 @@ export class FullnodeService{
getPrice(currency: string){ getPrice(currency: string){
//var currency = 'usd'; //var currency = 'usd';
const params = this.params.append('currency', currency); const params = new HttpParams().append('currency', currency);
let obs = this.http.get<{message: string, price: any}>(this.beUrl+'price', { headers:this.reqHeaders, params: params, observe: 'response'}); let obs = this.http.get<{message: string, price: any}>(this.beUrl+'api/price', { headers:this.reqHeaders, params: params, observe: 'response'});
obs.subscribe((PriceData) => { obs.subscribe((PriceData) => {
if (PriceData.status == 200) { if (PriceData.status == 200) {
this.dataStore.price = PriceData.body!.price.price; this.dataStore.price = PriceData.body!.price.price;
@ -86,7 +94,7 @@ export class FullnodeService{
} }
getAddr() { getAddr() {
let obs = this.http.get<{message: string, addr: string}>(this.beUrl+'getaddr', { headers: this.reqHeaders, params: this.params }); let obs = this.http.get<{message: string, addr: string}>(this.beUrl+'api/getaddr', { headers: this.reqHeaders });
obs.subscribe((AddrData) => { obs.subscribe((AddrData) => {
this.dataStore.addr = AddrData.addr; this.dataStore.addr = AddrData.addr;

View file

@ -4,11 +4,11 @@
</span> </span>
<span class="spacer"></span> <span class="spacer"></span>
<span align="center"> <span align="center">
<p class="mini text"> {{ vE.headerGetCurrency }} {{ getCurrency() }}</p> <p class="mini text">Currency: {{ getCurrency() }}</p>
<p class="mini text">{{ vE.headerLastBlock }} </p> <p class="mini text">Last block:</p>
<p class="mini text">{{heightUpdate | async}}</p> <p class="mini text">{{heightUpdate | async}}</p>
</span> </span>
<span> <span>
<button mat-icon-button (click)="logout()"><mat-icon>logout</mat-icon></button> <button mat-raised-button (click)="logout()"><mat-icon class="logbutton">logout</mat-icon></button>
</span> </span>
</mat-toolbar> </mat-toolbar>

View file

@ -1,15 +1,13 @@
import {Component, OnInit, OnDestroy} from '@angular/core'; import {Component, OnInit, OnDestroy} from '@angular/core';
import { MatDialog, MatDialogConfig} from '@angular/material/dialog'; import { MatDialog, MatDialogConfig} from '@angular/material/dialog';
import { FullnodeService } from '../fullnode.service'; import {FullnodeService} from '../fullnode.service';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { UserService } from '../user.service'; import { UserService } from '../user.service';
import { CancelComponent } from '../cancel/cancel.component'; import { CancelComponent } from '../cancel/cancel.component';
import { Observable } from 'rxjs'; import {Subscription, Observable} from 'rxjs';
import {Owner} from '../owner.model'; import {Owner} from '../owner.model';
import { LanguageService } from '../language.service';
@Component({ @Component({
selector: 'app-header', selector: 'app-header',
templateUrl: './header.component.html', templateUrl: './header.component.html',
@ -28,37 +26,34 @@ export class HeaderComponent implements OnInit, OnDestroy {
taxValue: 0, taxValue: 0,
vat: false, vat: false,
vatValue: 0, vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false, paid: false,
website: '',
country: '',
zats: false, zats: false,
invoices: false, invoices: false,
expiration: new Date(Date.now()).toISOString(), expiration: new Date(Date.now()).toISOString(),
payconf: false, payconf: false,
crmToken: '',
viewkey: '', viewkey: '',
tips: false crmToken: ''
}; };
private session: string | null = '';
public heightUpdate: Observable<number>; public heightUpdate: Observable<number>;
public ownerUpdate: Observable<Owner>; public ownerUpdate: Observable<Owner>;
public uZaddrUpdate: Observable<string>; public uZaddrUpdate: Observable<string>;
//
// Language Support
//
vE = {
headerGetCurrency : '',
headerLastBlock : '',
headerLogoutLbl : '',
headerLogoutMsg1 : '',
headerLogoutMsg2 : ''
}
//
// ------------------------------------------------------------
constructor( constructor(
public fullnodeService: FullnodeService, public fullnodeService: FullnodeService,
public userService: UserService, public userService: UserService,
private dialog: MatDialog, private dialog: MatDialog,
private router: Router, private router: Router
private languageService: LanguageService
){ ){
this.heightUpdate = fullnodeService.heightUpdate; this.heightUpdate = fullnodeService.heightUpdate;
this.uZaddrUpdate = userService.uZaddrUpdate; this.uZaddrUpdate = userService.uZaddrUpdate;
@ -68,8 +63,8 @@ export class HeaderComponent implements OnInit, OnDestroy {
}); });
} }
ngOnInit(){ ngOnInit(){
this.chgUILanguage();
} }
ngOnDestroy(){ ngOnDestroy(){
@ -84,43 +79,18 @@ export class HeaderComponent implements OnInit, OnDestroy {
dialogConfig.disableClose = true; dialogConfig.disableClose = true;
dialogConfig.autoFocus = true; dialogConfig.autoFocus = true;
dialogConfig.data = { title: this.vE.headerLogoutLbl, dialogConfig.data = {title: 'Logout?', msg: 'Are you sure you want to disconnect from ZGo? You will have to re-link your wallet via shielded memo.'};
msg1: this.vE.headerLogoutMsg1,
msg2: this.vE.headerLogoutMsg2 };
//console.log(dialogConfig.data);
const dialogRef = this.dialog.open(CancelComponent, dialogConfig); const dialogRef = this.dialog.open(CancelComponent, dialogConfig);
dialogRef.afterClosed().subscribe(val => { dialogRef.afterClosed().subscribe(val => {
if(val){ if(val){
// console.log('Logout!'); // console.log('Logout!');
this.userService.deleteUser().subscribe(UserResponse => { this.userService.deleteUser().subscribe(UserResponse => {
//console.log('Rerouting'); console.log('Rerouting');
this.userService.findUser(); this.userService.findUser();
this.router.navigate(['/login']); this.router.navigate(['/login']);
}); });
} }
}); });
} }
chgUILanguage(){
//console.log('HEADER.chgUILanguage Called ');
this.languageService.getViewElements('header').subscribe({
next: response => {
//console.log('Received >> ', response );
//console.log('Language Code : ', response.language);
//console.log('Component Name : ',response.component);
//console.log('Language data : ',response.data);
this.vE.headerLastBlock = response.data.header_last_block;
this.vE.headerGetCurrency = response.data.header_get_currency;
this.vE.headerLogoutLbl = response.data.header_logout_lbl;
this.vE.headerLogoutMsg1 = response.data.header_logout_msg1;
this.vE.headerLogoutMsg2 = response.data.header_logout_msg2;
},
error: error => { console.log('Error >> ',error); }
});
}
} }

View file

@ -9,12 +9,12 @@
<div class="invoiceDetail" <div class="invoiceDetail"
*ngIf="!error" *ngIf="!error"
id="invoice"> id="invoice">
<div class="invoiceHdrTxt1">{{ vE.invoiceInvoiceLbl }}</div> <div class="invoiceHdrTxt1">Invoice</div>
<div class="invoiceHdrTxt2">{{ vE.invoiceOrderId }} {{orderId}}</div> <div class="invoiceHdrTxt2">Order ID: {{orderId}}</div>
<div class="invoiceHdrTxt3"> {{ vE.invoiceOrderDate }} {{order.timestamp | date}} <div class="invoiceHdrTxt3">Date:{{order.timestamp | date}}
</div> </div>
<div style="height: 10px;"></div> <div style="height: 10px;"></div>
<div class="zecData">{{ vE.invoiceZcashPrice }} {{order.price | number: '1.02' | currency: order.currency.toUpperCase()}}</div> <div class="zecData">Zcash Price: {{order.price | number: '1.02' | currency: order.currency.toUpperCase()}}</div>
<div style="height: 2px;"></div> <div style="height: 2px;"></div>
<div class="zecData">Total: <img class="zecSign" src="/assets/zec_rv.png" />{{order.totalZec | number: '1.08'}} <div class="zecData">Total: <img class="zecSign" src="/assets/zec_rv.png" />{{order.totalZec | number: '1.08'}}
</div> </div>
@ -29,11 +29,11 @@
</th> </th>
<th width="15%" <th width="15%"
class="detailTitle1"> class="detailTitle1">
{{ vE.invoiceQtyLbl }} Qty.
</th> </th>
<th width="30%" <th width="30%"
class="detailTitle2"> class="detailTitle2">
{{ vE.invoiceOrderPrice }}({{order.currency.toUpperCase()}}) Price ({{order.currency.toUpperCase()}})
</th> </th>
</tr> </tr>
<tr class="invoice-detail" <tr class="invoice-detail"
@ -51,28 +51,10 @@
{{( item.qty * item.cost ) | number : '1.02' | currency: order.currency.toUpperCase()}} {{( item.qty * item.cost ) | number : '1.02' | currency: order.currency.toUpperCase()}}
</td> </td>
</tr> </tr>
<tr *ngIf="order.taxAmount > 0">
<td class="newOrdertbdetail" style="text-align: right;">{{ vE.invoiceTax }}</td>
<td class="newOrdertbdetail" style="text-align: right;"></td>
<td class="newOrdertbdetail" style="text-align: right;">{{ order.taxAmount | currency: order.currency.toUpperCase() }}</td>
<td></td>
</tr>
<tr *ngIf="order.vatAmount > 0">
<td class="newOrdertbdetail" style="text-align: right;">{{ vE.invoiceVAT }}</td>
<td class="newOrdertbdetail" style="text-align: right;"></td>
<td class="newOrdertbdetail" style="text-align: right;">{{ order.vatAmount | currency: order.currency.toUpperCase() }}</td>
<td></td>
</tr>
<tr *ngIf="order.tipAmount > 0">
<td class="newOrdertbdetail" style="text-align: right;">{{ vE.invoiceTip }}</td>
<td class="newOrdertbdetail" style="text-align: right;"></td>
<td class="newOrdertbdetail" style="text-align: right;">{{ order.tipAmount | currency: order.currency.toUpperCase() }}</td>
<td></td>
</tr>
<tr class="invoice-title"> <tr class="invoice-title">
<th width="55%" <th width="55%"
class="detailLineRight"> class="detailLineRight">
{{ vE.invoiceInvoiceTotal }} Invoice Total:
</th> </th>
<th width="15%" <th width="15%"
class="detailLineLeft"> class="detailLineLeft">
@ -94,10 +76,10 @@
text-align: center;"> text-align: center;">
<p *ngIf="order.paid"> <p *ngIf="order.paid">
<fa-icon [icon]="faCheck" <fa-icon [icon]="faCheck"
color="primary"></fa-icon>&nbsp;{{ vE.invoicePaymentConfirmed }}</p> color="primary"></fa-icon>&nbsp;Payment confirmed</p>
<p *ngIf="!order.paid"> <p *ngIf="!order.paid">
<fa-icon [style]="getIconStyle(order)" <fa-icon [style]="getIconStyle(order)"
[icon]="faHourglass"></fa-icon>&nbsp;{{ vE.invoicePaymentPending }}</p> [icon]="faHourglass"></fa-icon>&nbsp;Payment pending!!</p>
</td> </td>
<td width="25%"> <td width="25%">
<div style="text-align: right;" <div style="text-align: right;"
@ -107,39 +89,39 @@
</tr> </tr>
</table> </table>
<div style="height: 15px;"></div> <div style="height: 15px;"></div>
<div *ngIf="!order.paid" width="100%" <div width="100%"
style="font-size: 14px; style="font-size: 14px;
font-weight: 700; font-weight: 700;
font-style: italic; font-style: italic;
text-align: center;"> text-align: center;">
{{ vE.invoiceScanQrcode }} Scan the QR code with your wallet to make payment
</div> </div>
<div *ngIf="!order.paid" style="text-align: center; <div style="text-align: center;
margin-top: 10px; margin-top: 10px;
line-height: 30px;"> line-height: 30px;">
<div style="font-family: 'Spartan'; <div style="font-family: 'Spartan';
font-size: 14px; font-size: 14px;
line-height: 20px;"> line-height: 20px;">
{{ vE.invoiceCantScan }}<br> Can't scan?<br>Use this <a [href]="zcashUrl">wallet link</a>, or
{{ vE.invoiceUseThis }} <a [href]="zcashUrl">{{ vE.invoiceWalletLink }}</a>{{ vE.invoiceDotOr }} </div>
<div style="display: flex; <div style="display: flex;
justify-content: space-between;"> justify-content: space-between;">
<button style="margin-top: 20px; <button style="margin-top: 20px;
font-weight: 700; font-weight: 700;
background-color: lightgray;" background-color: lightgray;"
mat-raised-button mat-raised-button
(click)="copyAddress()">{{ vE.invoiceCopyAddress }}</button> (click)="copyAddress()">Copy Address</button>
<button style="margin-top: 20px; <button style="margin-top: 20px;
font-weight: 700; font-weight: 700;
background-color: lightgray;" background-color: lightgray;"
mat-raised-button mat-raised-button
(click)="copyAmount()">{{ vE.invoiceCopyAmount }}</button> (click)="copyAmount()">Copy Amount</button>
</div> </div>
<button style="margin-top: 20px; <button style="margin-top: 20px;
font-weight: 700; font-weight: 700;
background-color: lightgray;" background-color: lightgray;"
mat-raised-button mat-raised-button
(click)="copyMemo()" *ngIf="!isWCOrder">{{ vE.invoiceCopyMemo }}</button> (click)="copyMemo()" *ngIf="!isWCOrder">Copy Memo</button>
<div style="display: flex; <div style="display: flex;
justify-content: space-between;" justify-content: space-between;"
@ -148,7 +130,7 @@
font-weight: 700; font-weight: 700;
background-color: lightgray;" background-color: lightgray;"
mat-raised-button mat-raised-button
(click)="copyMemo()">{{ vE.invoiceCopyMemo }}</button> (click)="copyMemo()">Copy Memo</button>
<button style="margin-top: 20px; <button style="margin-top: 20px;
font-weight: 700; font-weight: 700;
@ -161,7 +143,7 @@
font-size: 20px; font-size: 20px;
cursor: pointer;" cursor: pointer;"
[icon]="faArrowUpRightFromSquare"> </fa-icon> [icon]="faArrowUpRightFromSquare"> </fa-icon>
{{ vE.invoiceReturnToshop }}</button> Return to Shop</button>
</div> </div>
</div> </div>
@ -175,12 +157,12 @@
font-size: 20px; font-size: 20px;
padding: 4px; padding: 4px;
height: 24px;"> height: 24px;">
{{ vE.invoiceInvalidId }} Incorrect Invoice ID.
</div> </div>
<div style="font-family: Spartan !important; <div style="font-family: Spartan !important;
font-size: 16px; font-size: 16px;
padding: 4px;"> padding: 4px;">
{{ vE.invoiceInfoNotavail }} No information available.
</div> </div>
<div style="height: 10px;"></div> <div style="height: 10px;"></div>
<mat-card-actions> <mat-card-actions>

View file

@ -8,8 +8,6 @@ import { faCheck, faHourglass, faArrowUpRightFromSquare } from '@fortawesome/fre
import { NotifierService } from '../notifier.service'; import { NotifierService } from '../notifier.service';
import { LanguageService } from '../language.service';
var QRCode = require('easyqrcodejs'); var QRCode = require('easyqrcodejs');
var URLSafeBase64 = require('urlsafe-base64'); var URLSafeBase64 = require('urlsafe-base64');
var Buffer = require('buffer/').Buffer; var Buffer = require('buffer/').Buffer;
@ -25,122 +23,73 @@ export class InvoiceComponent implements OnInit {
faHourglass = faHourglass; faHourglass = faHourglass;
faArrowUpRightFromSquare = faArrowUpRightFromSquare; faArrowUpRightFromSquare = faArrowUpRightFromSquare;
orderId; orderId;
orderToken: string = '';
public orderUpdate: Observable<Order>; public orderUpdate: Observable<Order>;
public nameUpdate: Observable<string>; public nameUpdate: Observable<string>;
name: string = ''; name: string = '';
error: boolean = false; error: boolean = false;
codeString: string = ''; codeString: string = 'Test';
invString: string = ''; public isWCOrder : boolean = false;
public isWCOrder : boolean = false;
zcashUrl: SafeUrl = ''; zcashUrl: SafeUrl = '';
externalURL: string = ''; externalURL: string = '';
order:Order = { order:Order = {
_id: '', _id: '',
address: '', address: '',
session: '', session: '',
timestamp: '', timestamp: '',
closed: false, closed: false,
currency: '', currency: '',
price: 0, price: 0,
total: 0, total: 0,
totalZec: 0, totalZec: 0,
paid: false, paid: false,
externalInvoice: '', externalInvoice: '',
shortCode: '', shortCode: '',
token: '', lines: [
taxAmount: 0, {
vatAmount: 0, qty: 1,
tipAmount: 0, name: '',
lines: [ cost:0
{ }
qty: 1, ]
name: '', };
cost:0
}
]
};
// -------------------------------------
//
// Language Support
//
vE = {
invoiceInvoiceLbl : '',
invoiceOrderId : '',
invoiceOrderDate : '',
invoiceZcashPrice : '',
invoiceQtyLbl : '',
invoiceOrderPrice : '',
invoiceInvoiceTotal : '',
invoicePaymentConfirmed : '',
invoicePaymentPending : '',
invoiceScanQrcode : '',
invoiceCantScan : '',
invoiceUseThis : '',
invoiceWalletLink : '',
invoiceDotOr : '',
invoiceCopyAddress : '',
invoiceCopyAmount : '',
invoiceCopyMemo : '',
invoiceReturnToshop : '',
invoiceCopyNotavail : '',
invoiceNotservClose : '',
invoiceNotservError : '',
invoiceCopyaddressError : '',
invoiceCopyamountError : '',
invoiceCopymemoError : '',
invoiceInvalidId : '',
invoiceInfoNotavail : '',
invoiceTax : '',
invoiceVAT : '',
invoiceTip : ''
};
//
constructor( constructor(
private _ActiveRoute:ActivatedRoute, private _ActiveRoute:ActivatedRoute,
private router: Router, private router: Router,
private sanitizer: DomSanitizer, private sanitizer: DomSanitizer,
public receiptService: ReceiptService, public receiptService: ReceiptService,
private notifierService : NotifierService, private notifierService : NotifierService
private languageService : LanguageService
) { ) {
this.orderId = this._ActiveRoute.snapshot.paramMap.get("orderId"); this.orderId = this._ActiveRoute.snapshot.paramMap.get("orderId");
this._ActiveRoute.queryParams.subscribe((params) => { console.log('constructor - orderId -> ' + this.orderId);
this.orderToken = params["token"]; this.orderUpdate = receiptService.orderUpdate;
receiptService.getOrderById(this.orderId!, this.orderToken!).subscribe(response => { this.nameUpdate = receiptService.nameUpdate;
if (response.status == 200){ receiptService.getOrderById(this.orderId!).subscribe(response => {
this.error = false; if (response.status == 200){
if( response.body!.order.session.substring(0,1) == 'X') { this.error = false;
this.invString = response.body!.order.externalInvoice; this.codeString = `zcash:${response.body!.order.address}?amount=${response.body!.order.totalZec.toFixed(8)}&memo=${URLSafeBase64.encode(Buffer.from('ZGo Order::'.concat(this.orderId!)))}`;
this.codeString = `zcash:${this.order.address}?amount=${this.order.totalZec.toFixed(8)}&memo=${URLSafeBase64.encode(Buffer.from('ZGo Order::'.concat(this.orderId!).concat(" Invoice: ").concat(this.invString)))}`; var qrcode = new QRCode(document.getElementById("payment-qr"), {
} else { text: this.codeString,
this.codeString = `zcash:${response.body!.order.address}?amount=${response.body!.order.totalZec.toFixed(8)}&memo=${URLSafeBase64.encode(Buffer.from('ZGo Order::'.concat(this.orderId!)))}`;
}
var qrcode = new QRCode(document.getElementById("payment-qr"), {
text: this.codeString,
logo: "/assets/zcash.png", logo: "/assets/zcash.png",
width: 180, width: 180,
height: 180, height: 180,
logoWidth: 50, logoWidth: 50,
logoHeight: 50, logoHeight: 50,
correctLevel: QRCode.CorrectLevel.H correctLevel: QRCode.CorrectLevel.H
}); });
this.error = false; this.error = false;
this.zcashUrl = this.sanitizer.bypassSecurityTrustUrl(this.codeString); } else {
} else { this.error = true;
this.error = true; this.codeString = 'Test';
this.codeString = 'Test'; }
}
});
}); });
//console.log('constructor - orderId -> ' + this.orderId);
this.orderUpdate = receiptService.orderUpdate;
this.nameUpdate = receiptService.nameUpdate;
this.orderUpdate.subscribe(order => { this.orderUpdate.subscribe(order => {
this.order = order; this.order = order;
if ( order.session.substring(0,1) == 'W') { if ( order.session.substring(0,1) == 'W') {
this.isWCOrder = true; this.isWCOrder = true;
} }
this.codeString = `zcash:${this.order.address}?amount=${this.order.totalZec.toFixed(8)}&memo=${URLSafeBase64.encode(Buffer.from('ZGo Order::'.concat(this.orderId!)))}`;
this.zcashUrl = this.sanitizer.bypassSecurityTrustUrl(this.codeString);
}); });
this.nameUpdate.subscribe(name => { this.nameUpdate.subscribe(name => {
this.name = name; this.name = name;
@ -148,23 +97,22 @@ export class InvoiceComponent implements OnInit {
} }
ngOnInit(): void { ngOnInit(): void {
this.chgUILanguage(); }
}
backToShop() { backToShop() {
if ( this.isWCOrder ) { if ( this.isWCOrder ) {
// console.log('External Invoice -> ' + this.order.externalInvoice ); // console.log('External Invoice -> ' + this.order.externalInvoice );
const b64URL:string = this.order.externalInvoice.substring(0,this.order.externalInvoice.indexOf("-")); const b64URL:string = this.order.externalInvoice.substring(0,this.order.externalInvoice.indexOf("-"));
// console.log('encodedURL -> ' + b64URL ); // console.log('encodedURL -> ' + b64URL );
const shopURL: string = Buffer.from(b64URL, 'base64').toString(); const shopURL: string = Buffer.from(b64URL, 'base64').toString();
const tmp_orderid = this.order.externalInvoice.substring(this.order.externalInvoice.indexOf('-')+1); const tmp_orderid = this.order.externalInvoice.substring(this.order.externalInvoice.indexOf('-')+1);
const wc_order_key = tmp_orderid.substring(tmp_orderid.indexOf('-')+1); const wc_order_key = tmp_orderid.substring(tmp_orderid.indexOf('-')+1);
const wc_orderid = tmp_orderid.substring(0,tmp_orderid.indexOf('-')); const wc_orderid = tmp_orderid.substring(0,tmp_orderid.indexOf('-'));
// console.log('wc_order_id -> ' + wc_orderid); // console.log('wc_order_id -> ' + wc_orderid);
// console.log('wc_order_key -> ' + wc_order_key); // console.log('wc_order_key -> ' + wc_order_key);
// console.log('new URL -> ' + shopURL + '/checkout/order-received/' + wc_orderid + '/?key=' + wc_order_key); // console.log('new URL -> ' + shopURL + '/checkout/order-received/' + wc_orderid + '/?key=' + wc_order_key);
if ( shopURL ) { if ( shopURL ) {
// console.log('Opening URL....' + shopURL); // console.log('Opening URL....' + shopURL);
window.open( shopURL + '/checkout/order-received/' + wc_orderid + '/?key=' + wc_order_key,"_blank"); window.open( shopURL + '/checkout/order-received/' + wc_orderid + '/?key=' + wc_order_key,"_blank");
} }
} }
@ -172,122 +120,54 @@ export class InvoiceComponent implements OnInit {
getIconStyle(order : Order) { getIconStyle(order : Order) {
if( order.paid ) if( order.paid )
return "font-size: 14px; color: #72cc50; margin-bottom: -2px;"; return "font-size: 14px; color: #72cc50; margin-bottom: -2px;";
return "color: #FB4F14; margin-bottom: -2px; cursor: pointer;"; return "color: #FB4F14; margin-bottom: -2px; cursor: pointer;";
} }
copyAddress() { copyAddress() {
if (!navigator.clipboard) { if (!navigator.clipboard) {
// alert("Copy functionality not supported"); // alert("Copy functionality not supported");
this.notifierService this.notifierService
.showNotification( .showNotification("Copy functionality not supported","Close","error");
this.vE.invoiceCopyNotavail, }
this.vE.invoiceNotservClose, try {
'error', navigator.clipboard.writeText(this.order.address);
this.vE.invoiceNotservError); } catch (err) {
} this.notifierService
try { .showNotification("Error copying address","Close","error");
navigator.clipboard.writeText(this.order.address); // console.error("Error", err);
} catch (err) { }
this.notifierService }
.showNotification(
this.vE.invoiceCopyaddressError,
this.vE.invoiceNotservClose,
'error',
this.vE.invoiceNotservError);
// console.error("Error", err);
}
}
copyAmount() { copyAmount() {
if (!navigator.clipboard) { if (!navigator.clipboard) {
// alert("Copy functionality not supported"); // alert("Copy functionality not supported");
this.notifierService this.notifierService
.showNotification( .showNotification("Copy functionality not supported","Close","error");
this.vE.invoiceCopyNotavail, }
this.vE.invoiceNotservClose, try {
'error', navigator.clipboard.writeText(this.order.totalZec.toString());
this.vE.invoiceNotservError); } catch (err) {
} this.notifierService
try { .showNotification("Error while copying ammount","Close","error");
navigator.clipboard.writeText(this.order.totalZec.toString()); // console.error("Error", err);
} catch (err) { }
this.notifierService }
.showNotification(
this.vE.invoiceCopyamountError,
this.vE.invoiceNotservClose,
'error',
this.vE.invoiceNotservError);
// console.error("Error", err);
}
}
copyMemo() { copyMemo() {
if (!navigator.clipboard) { if (!navigator.clipboard) {
// alert("Copy functionality not supported"); // alert("Copy functionality not supported");
this.notifierService this.notifierService
.showNotification( .showNotification("Copy functionality not supported","Close","error");
this.vE.invoiceCopyNotavail, }
this.vE.invoiceNotservClose, try {
'error', navigator.clipboard.writeText("ZGo Order::" + this.order._id);
this.vE.invoiceNotservError); } catch (err) {
} this.notifierService
try { .showNotification("Error while copying Memo","Close","error");
navigator.clipboard.writeText("ZGo Order::" + this.order._id); // console.error("Error", err);
} catch (err) { }
this.notifierService }
.showNotification(
this.vE.invoiceCopymemoError,
this.vE.invoiceNotservClose,
'error',
this.vE.invoiceNotservError);
// console.error("Error", err);
}
}
chgUILanguage(){
console.log('INVOICE.chgUILanguage Called ');
this.languageService.getViewElements('invoice').subscribe(
response => {
console.log('Received >> ', response );
console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component);
console.log('Language data : ',response.data);
this.vE.invoiceInvoiceLbl = response.data.invoice_invoice_lbl;
this.vE.invoiceOrderId = response.data.invoice_order_id;
this.vE.invoiceOrderDate = response.data.invoice_order_date;
this.vE.invoiceZcashPrice = response.data.invoice_zcash_price;
this.vE.invoiceQtyLbl = response.data.invoice_qty_lbl;
this.vE.invoiceOrderPrice = response.data.invoice_order_price;
this.vE.invoiceInvoiceTotal = response.data.invoice_invoice_total;
this.vE.invoicePaymentConfirmed = response.data.invoice_payment_confirmed;
this.vE.invoicePaymentPending = response.data.invoice_payment_pending;
this.vE.invoiceScanQrcode = response.data.invoice_scan_qrcode;
this.vE.invoiceCantScan = response.data.invoice_cant_scan;
this.vE.invoiceUseThis = response.data.invoice_use_this;
this.vE.invoiceWalletLink = response.data.invoice_wallet_link;
this.vE.invoiceDotOr = response.data.invoice_dot_or;
this.vE.invoiceCopyAddress = response.data.invoice_copy_address;
this.vE.invoiceCopyAmount = response.data.invoice_copy_amount;
this.vE.invoiceCopyMemo = response.data.invoice_copy_memo;
this.vE.invoiceReturnToshop = response.data.invoice_return_toshop;
this.vE.invoiceCopyNotavail = response.data.invoice_copy_notavail;
this.vE.invoiceNotservClose = response.data.invoice_notserv_close;
this.vE.invoiceNotservError = response.data.invoice_notserv_error;
this.vE.invoiceCopyaddressError = response.data.invoice_copyaddress_error;
this.vE.invoiceCopyamountError = response.data.invoice_copyamount_error;
this.vE.invoiceCopymemoError = response.data.invoice_copymemo_error;
this.vE.invoiceInvalidId = response.data.invoice_invalid_id;
this.vE.invoiceInfoNotavail = response.data.invoice_info_notavail;
this.vE.invoiceTax = response.data.invoice_tax;
this.vE.invoiceVAT = response.data.invoice_vat;
this.vE.invoiceTip = response.data.invoice_tip;
},
error => { console.log('Error >> ',error); }
);
}
} }

View file

@ -12,5 +12,5 @@ input[type=number]{
color: white; color: white;
font-size: 26px; font-size: 26px;
text-align: center; text-align: center;
padding: 10px; padding: 5px;
} }

View file

@ -1,4 +1,4 @@
<div class='itemDataTitle'>{{ vE.itemaddAdd2Order }}</div> <div class='itemDataTitle'>Add to Order</div>
<div class='container'> <div class='container'>
<mat-dialog-content [formGroup]="orderForm"> <mat-dialog-content [formGroup]="orderForm">
@ -9,15 +9,13 @@
</mat-dialog-content> </mat-dialog-content>
<div style="display: flex; <div style="display: flex;
justify-content: space-between; justify-content: space-between;">
margin-top: 20px;
padding: 20px;">
<button mat-raised-button <button mat-raised-button
class="text" class="text"
(click)="close()">{{ vE.itemaddCancelBtn }}</button> (click)="close()">Cancel</button>
<button mat-raised-button <button mat-raised-button
class="text" class="text"
color="primary" color="primary"
(click)="save()">{{ vE.itemaddSaveBtn }}</button> (click)="save()">Add</button>
</div> </div>
</div> </div>

View file

@ -4,9 +4,6 @@ import { UntypedFormBuilder, Validators, UntypedFormGroup, FormControl } from '@
import { LineItem } from '../lineitem.model'; import { LineItem } from '../lineitem.model';
import { Order } from '../../order/order.model'; import { Order } from '../../order/order.model';
import { LanguageService } from '../../language.service';
import { LanguageData } from '../../language.model';
@Component({ @Component({
selector: 'app-item-add', selector: 'app-item-add',
templateUrl: './item-add.component.html', templateUrl: './item-add.component.html',
@ -18,18 +15,8 @@ export class ItemAddComponent implements OnInit {
orderForm: UntypedFormGroup; orderForm: UntypedFormGroup;
lineItem: LineItem; lineItem: LineItem;
//order: Order; //order: Order;
//
// Language Support
//
vE = {
itemaddAdd2Order : '',
itemaddCancelBtn : '',
itemaddSaveBtn : ''
}
//
// ------------------------------------------------------------
constructor( constructor(
private languageService : LanguageService,
private fb: UntypedFormBuilder, private fb: UntypedFormBuilder,
private dialogRef: MatDialogRef<ItemAddComponent>, private dialogRef: MatDialogRef<ItemAddComponent>,
@Inject(MAT_DIALOG_DATA) public data: LineItem @Inject(MAT_DIALOG_DATA) public data: LineItem
@ -45,7 +32,6 @@ export class ItemAddComponent implements OnInit {
} }
ngOnInit() { ngOnInit() {
this.chgUILanguage();
} }
close() { close() {
@ -56,22 +42,4 @@ export class ItemAddComponent implements OnInit {
this.lineItem.qty = this.orderForm.value.qty; this.lineItem.qty = this.orderForm.value.qty;
this.dialogRef.close(this.lineItem); this.dialogRef.close(this.lineItem);
} }
chgUILanguage(){
console.log('ITEMADD.chgUILanguage Called ');
this.languageService.getViewElements('itemadd').subscribe(
response => {
console.log('Received >> ', response );
console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component);
console.log('Language data : ',response.data);
this.vE.itemaddAdd2Order = response.data.itemadd_add_2order;
this.vE.itemaddCancelBtn = response.data.itemadd_cancel_btn;
this.vE.itemaddSaveBtn = response.data.itemadd_save_btn;
},
error => { console.log('Error >> ',error); }
);
}
} }

View file

@ -1,11 +1,11 @@
<div class='itemDataTitle'>{{ vE.itemcreateAddItem }}</div> <div class='itemDataTitle'>Add Item</div>
<div class='container' style="margin-top: 20px;"> <div class='container' style="margin-top: 20px;">
<mat-dialog-content [formGroup]="form"> <mat-dialog-content [formGroup]="form">
<span style="line-height: 10px;"></span> <span style="line-height: 10px;"></span>
<mat-form-field class="text" [style.width.%]="100"> <mat-form-field class="text" [style.width.%]="100">
<mat-label>{{ vE.itemcreateItemLbl }}</mat-label> <mat-label>Item</mat-label>
<input type="hidden" formControlName="id"> <input type="hidden" formControlName="id">
<input matInput <input matInput
placeholder="Item" placeholder="Item"
@ -13,7 +13,7 @@
maxlength="16"> maxlength="16">
</mat-form-field > </mat-form-field >
<mat-form-field class="text" [style.width.%]="100"> <mat-form-field class="text" [style.width.%]="100">
<mat-label>{{ vE.itemcreateItemDescr }}</mat-label> <mat-label>Description</mat-label>
<textarea matInput <textarea matInput
placeholder="Description" placeholder="Description"
formControlName="description" formControlName="description"
@ -22,20 +22,18 @@
overflow:auto;"></textarea> overflow:auto;"></textarea>
</mat-form-field> </mat-form-field>
<mat-form-field class="text" [style.width.%]="100"> <mat-form-field class="text" [style.width.%]="100">
<mat-label>{{ vE.itemcreateItemPrice }}</mat-label> <mat-label>Price</mat-label>
<input matInput type="number" placeholder="Price" formControlName="cost"> <input matInput type="number" placeholder="Price" formControlName="cost">
<div *ngIf="!form.controls['cost'].valid && form.controls['cost'].touched"> <div *ngIf="!form.controls['cost'].valid && form.controls['cost'].touched">
<div *ngIf="form.controls['cost'].errors?.pattern">{{ vE.itemcreateUseNums }}</div> <div *ngIf="form.controls['cost'].errors?.pattern">Use only numbers</div>
</div> </div>
</mat-form-field> </mat-form-field>
</mat-dialog-content> </mat-dialog-content>
<div style="display: flex; <div style="display: flex;
justify-content: space-between; justify-content: space-between;">
margin-top: 20px; <button mat-raised-button class="text" (click)="close()">Close</button>
padding: 20px;"> <button mat-raised-button class="text" color="primary" (click)="save()">Save</button>
<button mat-raised-button class="text" (click)="close()">{{ vE.itemcreateCloseBtn }}</button>
<button mat-raised-button class="text" color="primary" (click)="save()">{{ vE.itemcreateSaveBtn }}</button>
</div> </div>
</div> </div>

View file

@ -3,8 +3,6 @@ import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dial
import { UntypedFormBuilder, Validators, UntypedFormGroup, UntypedFormControl } from '@angular/forms'; import { UntypedFormBuilder, Validators, UntypedFormGroup, UntypedFormControl } from '@angular/forms';
import { Item } from '../item.model'; import { Item } from '../item.model';
import { LanguageService } from '../../language.service';
import { LanguageData } from '../../language.model';
@Component({ @Component({
selector: 'app-item-create', selector: 'app-item-create',
@ -17,22 +15,8 @@ export class ItemCreateComponent implements OnInit {
form: UntypedFormGroup; form: UntypedFormGroup;
id: string | undefined = ''; id: string | undefined = '';
numberRegEx = /\d*\.?\d{1,2}/; numberRegEx = /\d*\.?\d{1,2}/;
//
// Language Support
//
vE = {
itemcreateAddItem : '',
itemcreateItemLbl : '',
itemcreateItemDescr : '',
itemcreateItemPrice : '',
itemcreateUseNums : '',
itemcreateCloseBtn : '',
itemcreateSaveBtn : ''
}
//
// ------------------------------------------------------------
constructor( constructor(
private languageService : LanguageService,
private fb: UntypedFormBuilder, private fb: UntypedFormBuilder,
private dialogRef: MatDialogRef<ItemCreateComponent>, private dialogRef: MatDialogRef<ItemCreateComponent>,
@Inject(MAT_DIALOG_DATA) public data: Item @Inject(MAT_DIALOG_DATA) public data: Item
@ -62,7 +46,6 @@ export class ItemCreateComponent implements OnInit {
} }
ngOnInit () { ngOnInit () {
this.chgUILanguage();
} }
save() { save() {
@ -73,25 +56,4 @@ export class ItemCreateComponent implements OnInit {
close () { close () {
this.dialogRef.close(); this.dialogRef.close();
} }
chgUILanguage(){
console.log('ITEMLREATE.chgUILanguage Called ');
this.languageService.getViewElements('itemcreate').subscribe(
response => {
console.log('Received >> ', response );
console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component);
console.log('Language data : ',response.data);
this.vE.itemcreateAddItem = response.data.itemcreate_add_item;
this.vE.itemcreateItemLbl = response.data.itemcreate_item_lbl;
this.vE.itemcreateItemDescr = response.data.itemcreate_item_descr;
this.vE.itemcreateItemPrice = response.data.itemcreate_item_price;
this.vE.itemcreateUseNums = response.data.itemcreate_use_nums;
this.vE.itemcreateCloseBtn = response.data.itemcreate_close_btn;
this.vE.itemcreateSaveBtn = response.data.itemcreate_save_btn;
},
error => { console.log('Error >> ',error); }
);
}
} }

View file

@ -1,4 +1,4 @@
<div class='itemDataTitle'>{{ vE.itemdelDelItem }}</div> <div class='itemDataTitle'>Delete Item</div>
<div class='container' style="margin-top: 20px;"> <div class='container' style="margin-top: 20px;">
<mat-dialog-content > <mat-dialog-content >
@ -6,17 +6,15 @@
<span style="line-height: 10px;"></span> <span style="line-height: 10px;"></span>
<mat-dialog-content> <mat-dialog-content>
<p class="text">{{ vE.itemdelConfirmDel }}"{{item.name}}"?</p> <p class="text">Are you sure you want to delete "{{item.name}}"?</p>
</mat-dialog-content> </mat-dialog-content>
</mat-dialog-content> </mat-dialog-content>
<div style="display: flex; <div style="display: flex;
justify-content: space-between; justify-content: space-between;">
margin-top: 20px; <button mat-raised-button class="text" (click)="close()">Close</button>
padding: 20px;"> <button mat-raised-button class="text" color="primary" (click)="save()">Delete</button>
<button mat-raised-button class="text" (click)="close()">{{ vE.itemdelCloseBtn }}</button>
<button mat-raised-button class="text" color="primary" (click)="save()">{{ vE.itemdelDeleteBtn }}</button>
</div> </div>
</div> </div>

View file

@ -2,8 +2,6 @@ import { Inject, Component, OnInit, OnDestroy, ViewEncapsulation } from '@angula
import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { Item } from '../item.model'; import { Item } from '../item.model';
import { LanguageService } from '../../language.service';
import { LanguageData } from '../../language.model';
@Component({ @Component({
selector: 'app-item-delete', selector: 'app-item-delete',
@ -13,19 +11,8 @@ import { LanguageData } from '../../language.model';
export class ItemDeleteComponent implements OnInit{ export class ItemDeleteComponent implements OnInit{
item: Item; item: Item;
//
// Language Support
//
vE = {
itemdelDelItem : '',
itemdelConfirmDel : '',
itemdelCloseBtn : '',
itemdelDeleteBtn : ''
}
//
// ------------------------------------------------------------
constructor( constructor(
private languageService : LanguageService,
private dialogRef: MatDialogRef<ItemDeleteComponent>, private dialogRef: MatDialogRef<ItemDeleteComponent>,
@Inject(MAT_DIALOG_DATA) public data: Item @Inject(MAT_DIALOG_DATA) public data: Item
) { ) {
@ -33,7 +20,6 @@ export class ItemDeleteComponent implements OnInit{
} }
ngOnInit() { ngOnInit() {
this.chgUILanguage();
} }
save() { save() {
@ -43,23 +29,4 @@ export class ItemDeleteComponent implements OnInit{
close() { close() {
this.dialogRef.close(); this.dialogRef.close();
} }
chgUILanguage(){
console.log('ITEMDEL.chgUILanguage Called ');
this.languageService.getViewElements('itemdel').subscribe(
response => {
console.log('Received >> ', response );
console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component);
console.log('Language data : ',response.data);
this.vE.itemdelDelItem = response.data.itemdel_del_item;
this.vE.itemdelConfirmDel = response.data.itemdel_confirm_del;
this.vE.itemdelCloseBtn = response.data.itemdel_close_btn;
this.vE.itemdelDeleteBtn = response.data.itemdel_delete_btn;
},
error => { console.log('Error >> ',error); }
);
}
} }

View file

@ -1,11 +1,11 @@
<div class='itemDataTitle'>{{ vE.itemeditEditItem }}</div> <div class='itemDataTitle'>Edit Item</div>
<div class='container' style="margin-top: 20px;"> <div class='container' style="margin-top: 20px;">
<mat-dialog-content [formGroup]="form"> <mat-dialog-content [formGroup]="form">
<span style="line-height: 10px;"></span> <span style="line-height: 10px;"></span>
<mat-form-field class="text" [style.width.%]="100"> <mat-form-field class="text" [style.width.%]="100">
<mat-label>{{ vE.itemeditItemLabel}}</mat-label> <mat-label>Item</mat-label>
<input type="hidden" formControlName="id"> <input type="hidden" formControlName="id">
<input matInput <input matInput
placeholder="Item" placeholder="Item"
@ -13,7 +13,7 @@
maxlength="16"> maxlength="16">
</mat-form-field > </mat-form-field >
<mat-form-field class="text" [style.width.%]="100"> <mat-form-field class="text" [style.width.%]="100">
<mat-label>{{ vE.itemeditItemDescr }}</mat-label> <mat-label>Description</mat-label>
<textarea matInput <textarea matInput
placeholder="Description" placeholder="Description"
formControlName="description" formControlName="description"
@ -22,7 +22,7 @@
overflow:auto;"></textarea> overflow:auto;"></textarea>
</mat-form-field> </mat-form-field>
<mat-form-field class="text" [style.width.%]="100"> <mat-form-field class="text" [style.width.%]="100">
<mat-label>{{ vE.itemeditItemPrice }}</mat-label> <mat-label>Price</mat-label>
<input matInput type="number" placeholder="Price" formControlName="cost"> <input matInput type="number" placeholder="Price" formControlName="cost">
<div *ngIf="!form.controls['cost'].valid && form.controls['cost'].touched"> <div *ngIf="!form.controls['cost'].valid && form.controls['cost'].touched">
<div *ngIf="form.controls['cost'].errors?.pattern">Use only numbers</div> <div *ngIf="form.controls['cost'].errors?.pattern">Use only numbers</div>
@ -31,11 +31,9 @@
</mat-dialog-content> </mat-dialog-content>
<div style="display: flex; <div style="display: flex;
justify-content: space-between; justify-content: space-between;">
margin-top: 20px; <button mat-raised-button class="text" (click)="close()">Close</button>
padding: 20px;"> <button mat-raised-button class="text" color="primary" (click)="save()">Save</button>
<button mat-raised-button class="text" (click)="close()">{{ vE.itemeditCloseBtn }}</button>
<button mat-raised-button class="text" color="primary" (click)="save()">{{ vE.itemeditSaveBtn }}</button>
</div> </div>
</div> </div>

View file

@ -3,8 +3,6 @@ import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dial
import { UntypedFormBuilder, Validators, UntypedFormGroup, UntypedFormControl } from '@angular/forms'; import { UntypedFormBuilder, Validators, UntypedFormGroup, UntypedFormControl } from '@angular/forms';
import { Item } from '../item.model'; import { Item } from '../item.model';
import { LanguageService } from '../../language.service';
import { LanguageData } from '../../language.model';
@Component({ @Component({
selector: 'app-item-edit', selector: 'app-item-edit',
@ -17,21 +15,8 @@ export class ItemEditComponent implements OnInit {
form: UntypedFormGroup; form: UntypedFormGroup;
id: string | undefined = ''; id: string | undefined = '';
numberRegEx = /\d*\.?\d{1,2}/; numberRegEx = /\d*\.?\d{1,2}/;
//
// Language Support
//
vE = {
itemeditCloseBtn : '',
itemeditEditItem : '',
itemeditItemDescr : '',
itemeditItemLabel : '',
itemeditItemPrice : '',
itemeditSaveBtn : ''
}
//
// ------------------------------------------------------------
constructor( constructor(
private languageService : LanguageService,
private fb: UntypedFormBuilder, private fb: UntypedFormBuilder,
private dialogRef: MatDialogRef<ItemEditComponent>, private dialogRef: MatDialogRef<ItemEditComponent>,
@Inject(MAT_DIALOG_DATA) public data: Item @Inject(MAT_DIALOG_DATA) public data: Item
@ -61,7 +46,6 @@ export class ItemEditComponent implements OnInit {
} }
ngOnInit () { ngOnInit () {
this.chgUILanguage();
} }
save() { save() {
@ -72,25 +56,4 @@ export class ItemEditComponent implements OnInit {
close () { close () {
this.dialogRef.close(); this.dialogRef.close();
} }
chgUILanguage(){
console.log('ITEMEDIT.chgUILanguage Called ');
this.languageService.getViewElements('itemedit').subscribe(
response => {
console.log('Received >> ', response );
console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component);
console.log('Language data : ',response.data);
this.vE.itemeditEditItem = response.data.itemedit_edit_item;
this.vE.itemeditItemLabel = response.data.itemedit_item_label;
this.vE.itemeditItemDescr = response.data.itemedit_item_descr;
this.vE.itemeditItemPrice = response.data.itemedit_item_price;
this.vE.itemeditCloseBtn = response.data.itemedit_close_btn;
this.vE.itemeditSaveBtn = response.data.itemedit_save_btn;
},
error => { console.log('Error >> ',error); }
);
}
} }

View file

@ -1,19 +1,16 @@
<div *ngIf="items.length > 0"> <div *ngIf="items.length > 0">
<mat-toolbar color="accent"> <div class="availableItems" >
<span align="center" class="text"> Available Items:
{{ vE.itemlistAvailItems }} <button mat-raised-button
</span> class="buttons-class"
<span class="spacer"></span>
<span align="center">
<button mat-icon-button
color="primary"
(click)="openDialog()"> (click)="openDialog()">
<mat-icon aria-button-label="Add Item"> <mat-icon class="icon">
add add
</mat-icon> </mat-icon>
Add item
</button> </button>
</span>
</mat-toolbar> </div>
<div style="display: block; <div style="display: block;
overflow-y: auto; overflow-y: auto;
height: 500px;"> height: 500px;">
@ -47,7 +44,7 @@
</div> </div>
<p class="rv_price" <p class="rv_price"
*ngIf="owner.zats"> *ngIf="owner.zats">
&#x24e9; {{ ((item.cost/zecPrice)*100000000).toString().substring( 0, ((item.cost/zecPrice)*100000000 ).toString().indexOf('.')) }} [{{item.cost | number: '1.02' | currency: getCurrency() }}] &#x24e9;{{(item.cost/zecPrice)*100000000 | number: '1.0-0'}}
</p> </p>
</td> </td>
</tr> </tr>
@ -57,18 +54,18 @@
<tr> <tr>
<td> <td>
<button mat-icon-button class="icons" (click)="edit(item._id!)"> <button mat-icon-button class="icons" (click)="edit(item._id!)">
<mat-icon>edit</mat-icon> <mat-icon inline=true>edit</mat-icon>
</button> </button>
<button mat-icon-button class="icons" (click)="delete(item._id!)"> <button mat-icon-button class="icons" (click)="delete(item._id!)">
<mat-icon>delete</mat-icon> <mat-icon inline=true>delete</mat-icon>
</button> </button>
</td> </td>
<td align="right"> <td align="right">
<button mat-icon-button <button mat-raised-button
color="primary" color="primary"
class="buttons-class-cart" class="buttons-class-cart"
(click)="addToOrder(item._id!)"> (click)="addToOrder(item._id!)">
<mat-icon> <mat-icon [inline]="true">
shopping_cart shopping_cart
</mat-icon> </mat-icon>
</button> </button>
@ -82,7 +79,7 @@
</div> </div>
<div *ngIf = "items.length <= 0"> <div *ngIf = "items.length <= 0">
<div class="availableItems" > <div class="availableItems" >
{{ vE.itemlistListEmpty }} No items yet!
<button mat-raised-button <button mat-raised-button
class="buttons-class" class="buttons-class"
(click)="openDialog()"> (click)="openDialog()">

View file

@ -1,4 +1,4 @@
import { Input, Component, OnInit } from '@angular/core'; import { Input, Inject, Component, OnInit } from '@angular/core';
import { MatDialog, MatDialogConfig} from '@angular/material/dialog'; import { MatDialog, MatDialogConfig} from '@angular/material/dialog';
import { faCartShopping } from '@fortawesome/free-solid-svg-icons'; import { faCartShopping } from '@fortawesome/free-solid-svg-icons';
@ -16,8 +16,6 @@ import { ItemDeleteComponent } from '../item-delete/item-delete.component';
import { ItemAddComponent } from '../item-add/item-add.component'; import { ItemAddComponent } from '../item-add/item-add.component';
import { NotifierService } from '../../notifier.service'; import { NotifierService } from '../../notifier.service';
import { LanguageService } from '../../language.service';
@Component({ @Component({
selector: 'app-item-list', selector: 'app-item-list',
templateUrl: './item-list.component.html', templateUrl: './item-list.component.html',
@ -41,42 +39,35 @@ export class ItemListComponent implements OnInit{
taxValue: 0, taxValue: 0,
vat: false, vat: false,
vatValue: 0, vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false, paid: false,
website: '',
country: '',
zats: false, zats: false,
invoices: false, invoices: false,
expiration: new Date(Date.now()).toISOString(), expiration: new Date(Date.now()).toISOString(),
payconf: false, payconf: false,
crmToken: '',
viewkey: '', viewkey: '',
tips: false crmToken: ''
}; };
public ownerUpdate: Observable<Owner>; public ownerUpdate: Observable<Owner>;
public itemsUpdate: Observable<Item[]>; public itemsUpdate: Observable<Item[]>;
//
// Language Support
//
vE = {
itemlistAvailItems : '',
itemlistListEmpty : '',
itemlistItemAdded : '',
itemlistItemUpdated : '',
itemlistItemDeleted : '',
itemlistNotifClose : '',
itemlistNotifSuccess : ''
}
//
// ------------------------------------------------------------
constructor( constructor(
public itemService: ItemService, public itemService: ItemService,
userService: UserService, userService: UserService,
public orderService: OrderService, public orderService: OrderService,
public fullnodeService: FullnodeService, public fullnodeService: FullnodeService,
private dialog: MatDialog, private dialog: MatDialog,
private notifierService: NotifierService, private notifierService: NotifierService )
private languageService: LanguageService )
{ {
this.ownerUpdate = userService.ownerUpdate; this.ownerUpdate = userService.ownerUpdate;
this.itemsUpdate = itemService.itemsUpdated; this.itemsUpdate = itemService.itemsUpdated;
@ -91,7 +82,6 @@ export class ItemListComponent implements OnInit{
} }
ngOnInit(){ ngOnInit(){
this.chgUILanguage();
this.itemsUpdate.subscribe((items) => { this.itemsUpdate.subscribe((items) => {
this.items = items; this.items = items;
}); });
@ -110,12 +100,9 @@ export class ItemListComponent implements OnInit{
if(val != null) { if(val != null) {
var item:Item = {_id: '', name: val.name, description: val.description, cost: val.cost, owner: this.owner.address}; var item:Item = {_id: '', name: val.name, description: val.description, cost: val.cost, owner: this.owner.address};
this.itemService.addItem(item); this.itemService.addItem(item);
//console.log('creando item y llamando a notifier >>>');
this.notifierService this.notifierService
.showNotification(this.vE.itemlistItemAdded , .showNotification("Item successfully created!",
this.vE.itemlistNotifClose, "Close","success");
"success",
this.vE.itemlistNotifSuccess);
} }
this.itemService.getItems(this.owner.address); this.itemService.getItems(this.owner.address);
this.itemsUpdate.subscribe((items) => { this.itemsUpdate.subscribe((items) => {
@ -133,7 +120,7 @@ export class ItemListComponent implements OnInit{
dialogConfig.disableClose = true; dialogConfig.disableClose = true;
dialogConfig.autoFocus = true; dialogConfig.autoFocus = true;
dialogConfig.data = item; dialogConfig.data = item;
//console.log('Entrando a dialogo de edicion')
const dialogRef = this.dialog.open(ItemEditComponent, dialogConfig); const dialogRef = this.dialog.open(ItemEditComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => { dialogRef.afterClosed().subscribe((val) => {
if (val != null) { if (val != null) {
@ -145,15 +132,12 @@ export class ItemListComponent implements OnInit{
owner: this.owner.address owner: this.owner.address
}; };
//console.log('Edit:', editItem); //console.log('Edit:', editItem);
//console.log('itemlistItemUpdated = ' + this.vE.itemlistItemUpdated);
this.itemService.addItem(editItem).subscribe((response) => { this.itemService.addItem(editItem).subscribe((response) => {
this.itemService.getItems(this.owner.address); this.itemService.getItems(this.owner.address);
}); });
this.notifierService this.notifierService
.showNotification(this.vE.itemlistItemUpdated, .showNotification("Item information updated!!",
this.vE.itemlistNotifClose, "Close","success");
"success",
this.vE.itemlistNotifSuccess);
} }
this.itemService.getItems(this.owner.address); this.itemService.getItems(this.owner.address);
}); });
@ -176,10 +160,8 @@ export class ItemListComponent implements OnInit{
this.itemService.deleteItem(val); this.itemService.deleteItem(val);
this.items = []; this.items = [];
this.notifierService this.notifierService
.showNotification(this.vE.itemlistItemDeleted, .showNotification("Item deleted!!",
this.vE.itemlistNotifClose, "Close","success");
"success",
this.vE.itemlistNotifSuccess);
} }
this.itemService.getItems(this.owner.address); this.itemService.getItems(this.owner.address);
this.itemsUpdate.subscribe((items) => { this.itemsUpdate.subscribe((items) => {
@ -204,7 +186,7 @@ export class ItemListComponent implements OnInit{
const dialogRef = this.dialog.open(ItemAddComponent, dialogConfig); const dialogRef = this.dialog.open(ItemAddComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => { dialogRef.afterClosed().subscribe((val) => {
if (val != null) { if (val != null) {
//console.log('Adding to order', val); console.log('Adding to order', val);
this.orderService.addToOrder(val); this.orderService.addToOrder(val);
} }
this.itemService.getItems(this.owner.address); this.itemService.getItems(this.owner.address);
@ -214,28 +196,5 @@ export class ItemListComponent implements OnInit{
getCurrency(){ getCurrency(){
return this.owner.currency.toUpperCase(); return this.owner.currency.toUpperCase();
} }
chgUILanguage(){
//console.log('ITEMLIST.chgUILanguage Called ');
this.languageService.getViewElements('itemlist').subscribe({next:
response => {
//console.log('Received >> ', response );
//console.log('Language Code : ', response.language);
//console.log('Component Name : ',response.component);
//console.log('Language data : ',response.data);
this.vE.itemlistListEmpty = response.data.itemlist_list_empty;
this.vE.itemlistAvailItems = response.data.itemlist_avail_items;
this.vE.itemlistItemAdded = response.data.itemlist_item_added;
this.vE.itemlistItemUpdated = response.data.itemlist_item_updated;
this.vE.itemlistItemDeleted = response.data.itemlist_item_deleted;
this.vE.itemlistNotifClose = response.data.itemlist_notif_close;
this.vE.itemlistNotifSuccess = response.data.itemlist_notif_success;
},
error:
error => { console.log('Error >> ',error); }
});
}
} }

View file

@ -1,6 +1,6 @@
import { Item } from './item.model'; import { Item } from './item.model';
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs'; import { Subject, BehaviorSubject, Observable } from 'rxjs';
import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http'; import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http';
import { ConfigData } from '../configdata'; import { ConfigData } from '../configdata';
@ -10,29 +10,27 @@ var Buffer = require('buffer/').Buffer;
@Injectable({providedIn: 'root'}) @Injectable({providedIn: 'root'})
export class ItemService{ export class ItemService{
// beUrl = 'https://test.zgo.cash/';
beUrl = ConfigData.Be_URL; beUrl = ConfigData.Be_URL;
// console.log(ConfigData.Be_URL);
private dataStore: { items: Item[] } = { items: [] } ; private dataStore: { items: Item[] } = { items: [] } ;
private _itemsUpdated: BehaviorSubject<Item[]> = new BehaviorSubject(this.dataStore.items); private _itemsUpdated: BehaviorSubject<Item[]> = new BehaviorSubject(this.dataStore.items);
public readonly itemsUpdated: Observable<Item[]> = this._itemsUpdated.asObservable(); public readonly itemsUpdated: Observable<Item[]> = this._itemsUpdated.asObservable();
private address:string = ''; private address:string = '';
private reqHeaders: HttpHeaders; private reqHeaders: HttpHeaders;
private session: null|string;
private params: HttpParams;
constructor(private http: HttpClient){ constructor(private http: HttpClient){
var auth = 'Basic ' + Buffer.from(ConfigData.UsrPwd).toString('base64'); var auth = 'Basic ' + Buffer.from(ConfigData.UsrPwd).toString('base64');
this.reqHeaders = new HttpHeaders().set('Authorization', auth); this.reqHeaders = new HttpHeaders().set('Authorization', auth);
this.session = localStorage.getItem('s4z_token');
this.params = new HttpParams().append('session', this.session!);
} }
getItems(addr: string){ getItems(addr: string){
this.address = addr; this.address = addr;
const newParams = this.params.append('address', addr); const params = new HttpParams().append('address', addr);
let obs = this.http.get<{message: string, items: any}>(this.beUrl+'api/items', { headers:this.reqHeaders, params: newParams, observe: 'response'}); let obs = this.http.get<{message: string, items: any}>(this.beUrl+'api/items', { headers:this.reqHeaders, params: params, observe: 'response'});
obs.subscribe((ItemDataResponse) => { obs.subscribe((ItemDataResponse) => {
if (ItemDataResponse.status == 200 ) { if (ItemDataResponse.status == 200 ) {
@ -41,6 +39,7 @@ export class ItemService{
} else { } else {
this.dataStore.items = []; this.dataStore.items = [];
this._itemsUpdated.next(Object.assign({},this.dataStore).items); this._itemsUpdated.next(Object.assign({},this.dataStore).items);
// console.log('No items found');
} }
}); });
@ -48,9 +47,11 @@ export class ItemService{
} }
addItem(item: Item) { addItem(item: Item) {
let obs = this.http.post<{message: string}>(this.beUrl+'api/item', { payload: item }, { headers: this.reqHeaders, params: this.params }); //const params = new HttpParams().append('item', JSON.stringify(item));
let obs = this.http.post<{message: string}>(this.beUrl+'api/item', { payload: item }, { headers: this.reqHeaders });
obs.subscribe(() => { obs.subscribe((ItemResponse) => {
// console.log('Item added');
this.getItems(this.address); this.getItems(this.address);
}); });
@ -58,9 +59,10 @@ export class ItemService{
} }
deleteItem(id: string) { deleteItem(id: string) {
let obs = this.http.delete<{message: string}>(this.beUrl+'api/item/'+id, { headers: this.reqHeaders, params: this.params }); let obs = this.http.delete<{message: string}>(this.beUrl+'api/item/'+id, { headers: this.reqHeaders });
obs.subscribe(() => { obs.subscribe((ItemResponse) => {
// console.log('Item deleted');
this.getItems(this.address); this.getItems(this.address);
}); });

View file

@ -1,6 +0,0 @@
export interface LanguageData {
_id: string;
language: string;
component: string;
data?: any;
}

View file

@ -1,16 +0,0 @@
import { TestBed } from '@angular/core/testing';
import { LanguageService } from './language.service';
describe('LanguageService', () => {
let service: LanguageService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(LanguageService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});

View file

@ -1,79 +0,0 @@
import { Injectable } from '@angular/core';
import { LanguageData } from './language.model';
import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http';
import { ConfigData } from './configdata';
var Buffer = require('buffer/').Buffer;
@Injectable({
providedIn: 'root'
})
export class LanguageService {
//
// URL for test using REST API to local MariaDB database
// private baseURL = 'http://192.168.1.18:8080/zgointl';
//
// URL for test using REST API to local MongoDB database
// private baseURL = 'http://localhost:5000/zgointl';
//
// URL for access MongoDB database from remote server
private baseURL = ConfigData.Be_URL + 'api/getlang';
private loginURL = ConfigData.Be_URL + 'getloginlang';
private mainURL = ConfigData.Be_URL + 'getmainlang';
private scanURL = ConfigData.Be_URL + 'getscanlang';
private invoiceURL = ConfigData.Be_URL + 'getinvoicelang';
private pmtservURL = ConfigData.Be_URL + 'getpmtservicelang';
public zgoLanguage: string = '';
private session: string|null = '';
constructor(private http:HttpClient) {
this.session = localStorage.getItem('s4z_token');
}
getViewElements ( viewName:string ) {
//
// Get default language from localStorage
//
const def_zgoLanguage = localStorage.getItem('zgo_language');
//
// Set authorizacion paramaters
//
const Auth = 'Basic ' + Buffer.from(ConfigData.UsrPwd).toString('base64');
const reqHeaders = new HttpHeaders().set('Authorization', Auth);
if ( def_zgoLanguage == null ) {
this.zgoLanguage = 'en-US';
localStorage.setItem('zgo_language',this.zgoLanguage);
} else {
this.zgoLanguage = def_zgoLanguage;
}
//
// Get component's text data from language database
//
const params = new HttpParams().append('session', this.session!);
// console.log("Params -> ");
// console.log(params);
if (viewName === 'login') {
return this.http.get<LanguageData>(this.loginURL + '/?lang=' + this.zgoLanguage, {headers: reqHeaders, params: params});
} else if (viewName === 'main') {
return this.http.get<LanguageData>(this.mainURL + '/?lang=' + this.zgoLanguage, {headers: reqHeaders, params: params});
} else if (viewName === 'scan') {
return this.http.get<LanguageData>(this.scanURL + '/?lang=' + this.zgoLanguage, {headers: reqHeaders, params: params});
} else if (viewName === 'invoice') {
return this.http.get<LanguageData>(this.invoiceURL + '/?lang=' + this.zgoLanguage, {headers: reqHeaders, params: params});
} else if (viewName === 'pmtservice') {
return this.http.get<LanguageData>(this.pmtservURL + '/?lang=' + this.zgoLanguage, {headers: reqHeaders, params: params});
} else {
return this.http.get<LanguageData>(this.baseURL +
'/?lang=' + this.zgoLanguage +
'&component=' + viewName
,{ headers : reqHeaders
, params: params
}
);
}
}
}

View file

@ -2,20 +2,6 @@
font-family: 'Spartan', sans-serif; font-family: 'Spartan', sans-serif;
} }
.text1{
font-family: 'Spartan', sans-serif;
font-size: 24px;
font-weight: 700;
padding-top: 15px;
}
.text1a{
font-family: 'Spartan', sans-serif;
font-size: 16px;
font-weight: 600;
padding-top: 10px;
}
.text2 { .text2 {
font-family: 'Roboto Mono'; font-family: 'Roboto Mono';
font-size: 14px; font-size: 14px;
@ -25,10 +11,6 @@
background: lightgray; background: lightgray;
} }
.icon{
font-family: 'Material Icons';
}
.orderheader { .orderheader {
background-color: lightgrey !important; background-color: lightgrey !important;
} }
@ -128,12 +110,12 @@ img.icon{
.minibutton { .minibutton {
font-family: 'Spartan', sans-serif; font-family: 'Spartan', sans-serif;
font-size: 14px; font-size: 12px;
/*background: #ff5722;*/ background: #ff5722;
/*color: white;*/ color: white;
height: 24px; height: 24px;
line-height: 20px; line-height: 20px;
padding: 10px; padding: 2px;
} }
.spacer { .spacer {

View file

@ -1,25 +1,11 @@
<app-header></app-header> <app-header></app-header>
<div align="center"> <div align="center">
<div class="text1">{{(ownerUpdate | async)!.name}}</div> <h3 class="text">{{(ownerUpdate | async)!.name}}</h3>
<table style="padding-top: 10px;
padding-bottom: 10px;">
<tr class="text1a">
<td>
{{ vE.listordersEndDate }}{{(ownerUpdate | async)!.expiration | date: 'YYYY-MM-dd'}}
</td>
<td>
<button mat-icon-button color="primary" (click)="paySession()">
<mat-icon class="icon">queue</mat-icon>
</button>
</td>
</tr>
</table>
<table > <table >
<tr> <tr>
<td width="45%"> <td width="45%">
<button class="text" mat-raised-button [routerLink]="['/shop']" color="primary"> <button class="text" mat-raised-button [routerLink]="['/shop']" color="primary">
<mat-icon class="icon">home</mat-icon> Back to Shop
{{ vE.listordersBacktoshopBtn }}
</button> </button>
</td> </td>
<td width="10%"> <td width="10%">
@ -27,8 +13,7 @@
<td width="45%"> <td width="45%">
<button mat-raised-button color="primary" <button mat-raised-button color="primary"
class="text" (click)="openDbExport()"> class="text" (click)="openDbExport()">
<mat-icon class="icon">get_app</mat-icon> Export Orders
{{ vE.listordersExportOrders }}
</button> </button>
</td> </td>
</tr> </tr>
@ -38,7 +23,7 @@
<tr class="totalsHdr"> <tr class="totalsHdr">
<td width="10%"></td> <td width="10%"></td>
<td width="40%" > <td width="40%" >
<div class="totalsHdrTitle">{{ vE.listordersTodaysTotal }}</div> <div class="totalsHdrTitle">Today's Total:</div>
<div class="totalsHdrDetail"> <div class="totalsHdrDetail">
<img src="/assets/zec_rv.png" <img src="/assets/zec_rv.png"
style="height: 16px !important; style="height: 16px !important;
@ -46,7 +31,7 @@
</div> </div>
</td> </td>
<td width="40%" > <td width="40%" >
<div class="totalsHdrTitle">{{ vE.listordersOverallTotal }}</div> <div class="totalsHdrTitle">Overall Total:</div>
<div class="totalsHdrDetail"> <div class="totalsHdrDetail">
<img src="/assets/zec_rv.png" <img src="/assets/zec_rv.png"
style="height: 16px !important; style="height: 16px !important;
@ -88,7 +73,7 @@
</mat-panel-description> </mat-panel-description>
</mat-expansion-panel-header> </mat-expansion-panel-header>
<div class='orderheader'> <div class='orderheader'>
<div class="text2"> <b>{{ vE.listordersOrderId }}</b>: {{order._id}}</div> <div class="text2"> <b>Order Id</b>: {{order._id}}</div>
</div> </div>
<table style="width: 100%;" <table style="width: 100%;"
@ -97,7 +82,7 @@
font-weight: 700; font-weight: 700;
font-size: 16px; font-size: 16px;
height: 20px;"> height: 20px;">
<td width="50%">{{ vE.listordersOrderTotal }}</td> <td width="50%">Order Total:</td>
<td align="right" <td align="right"
width="50%"> width="50%">
<img class="icon" src="/assets/zec_rv.png" <img class="icon" src="/assets/zec_rv.png"
@ -126,15 +111,15 @@
<tr style="background: lightblue;"> <tr style="background: lightblue;">
<th class="tbheader" <th class="tbheader"
style="text-align: left;" style="text-align: left;"
width="55%">{{ vE.listordersItemLbl }} width="55%">Item
</th> </th>
<th class="tbheader" <th class="tbheader"
style="text-align: left;" style="text-align: left;"
width="15%">{{ vE.listordersQtyLbl }} width="15%">Qty.
</th> </th>
<th class="tbheader" <th class="tbheader"
style="text-align: right;" style="text-align: right;"
width="30%">{{ vE.listordersTotalLbl }} width="30%">Total
</th> </th>
</tr> </tr>
</thead> </thead>
@ -154,24 +139,6 @@
width="30%">{{item.qty * item.cost | number:'1.02' | currency: order.currency.toUpperCase() }} width="30%">{{item.qty * item.cost | number:'1.02' | currency: order.currency.toUpperCase() }}
</td> </td>
</tr> </tr>
<tr class="tbdetail" *ngIf="order.taxAmount > 0">
<td class="newOrdertbdetail" style="text-align: right;">{{ vE.listordersTax }}</td>
<td class="newOrdertbdetail" style="text-align: right;"></td>
<td class="newOrdertbdetail" style="text-align: right;">{{ order.taxAmount | currency: order.currency.toUpperCase() }}</td>
<td></td>
</tr>
<tr class="tbdetail" *ngIf="order.vatAmount > 0">
<td class="newOrdertbdetail" style="text-align: right;">{{ vE.listordersVAT }}</td>
<td class="newOrdertbdetail" style="text-align: right;"></td>
<td class="newOrdertbdetail" style="text-align: right;">{{ order.vatAmount | currency: order.currency.toUpperCase() }}</td>
<td></td>
</tr>
<tr class="tbdetail" *ngIf="order.tipAmount > 0">
<td class="newOrdertbdetail" style="text-align: right;">{{ vE.listordersTip }}</td>
<td class="newOrdertbdetail" style="text-align: right;"></td>
<td class="newOrdertbdetail" style="text-align: right;">{{ order.tipAmount | currency: order.currency.toUpperCase() }}</td>
<td></td>
</tr>
</tbody> </tbody>
</table> </table>
<div style="display: flex; <div style="display: flex;
@ -180,13 +147,13 @@
padding-right: 20%; padding-right: 20%;
margin-top: 10px;"> margin-top: 10px;">
<span> <span>
<button mat-raised-button class="minibutton" color="primary" (click)="invoice(order)">{{ vE.listordersInvoiceBtn }}</button> <button mat-stroked-button class="minibutton" color="primary" (click)="invoice(order)">Invoice</button>
</span> </span>
<span> <span>
<button mat-raised-button class="minibutton" color="primary" (click)="receipt(order)">{{ vE.listordersReceiptBtn }}</button> <button mat-stroked-button class="minibutton" color="primary" (click)="receipt(order)">Receipt</button>
</span> </span>
</div> </div>
</mat-expansion-panel> </mat-expansion-panel>
</mat-accordion> </mat-accordion>
<p class="text" *ngIf = "orders.length <= 0">{{ vE.listordersNoOrders }}</p> <p class="text" *ngIf = "orders.length <= 0">No orders</p>
</div> </div>

View file

@ -4,7 +4,6 @@ import { Order } from '../order/order.model';
import { FullnodeService } from '../fullnode.service'; import { FullnodeService } from '../fullnode.service';
import { UserService } from '../user.service'; import { UserService } from '../user.service';
import { Owner } from '../owner.model'; import { Owner } from '../owner.model';
import { User } from '../user.model';
import { OrderService } from '../order/order.service'; import { OrderService } from '../order/order.service';
import { MatDialog, MatDialogConfig} from '@angular/material/dialog'; import { MatDialog, MatDialogConfig} from '@angular/material/dialog';
@ -19,9 +18,6 @@ import { faCheckCircle } from '@fortawesome/free-solid-svg-icons';
import { faHourglass } from '@fortawesome/free-solid-svg-icons'; import { faHourglass } from '@fortawesome/free-solid-svg-icons';
import { faTrash } from '@fortawesome/free-solid-svg-icons'; import { faTrash } from '@fortawesome/free-solid-svg-icons';
import { LanguageService } from '../language.service';
import {SessionpayComponent} from '../sessionpay/sessionpay.component';
@Component({ @Component({
selector: 'app-list-orders', selector: 'app-list-orders',
templateUrl: './listorders.component.html', templateUrl: './listorders.component.html',
@ -54,73 +50,39 @@ export class ListOrdersComponent implements OnInit, OnDestroy{
taxValue: 0, taxValue: 0,
vat: false, vat: false,
vatValue: 0, vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false, paid: false,
website: '',
country: '',
zats: false, zats: false,
invoices: false, invoices: false,
expiration: new Date(Date.now()).toISOString(), expiration: new Date(Date.now()).toISOString(),
payconf: false, payconf: false,
crmToken: '',
viewkey: '', viewkey: '',
tips: false crmToken: ''
}; };
zecPrice: number = 1;
nodeAddress: string = '';
session: string = '';
addrUpdate: Observable<string>;
priceUpdate: Observable<number>;
userUpdate: Observable<User>;
// ------------------------------------- // -------------------------------------
// -------------------------------------
//
// Language Support
//
vE = {
listordersBacktoshopBtn : '',
listordersExportOrders : '',
listordersTodaysTotal : '',
listordersOverallTotal : '',
listordersOrderTotal : '',
listordersOrderId : '',
listordersItemLbl : '',
listordersQtyLbl : '',
listordersTotalLbl : '',
listordersInvoiceBtn : '',
listordersReceiptBtn : '',
listordersNoOrders : '',
listordersEndDate : '',
listordersTax : '',
listordersVAT : '',
listordersTip : ''
}
//
constructor( constructor(
private languageService : LanguageService,
public orderService: OrderService, public orderService: OrderService,
public userService: UserService, public userService: UserService,
public fullnodeService: FullnodeService,
private dialog: MatDialog) private dialog: MatDialog)
{ {
this.ownerUpdate = userService.ownerUpdate; this.ownerUpdate = userService.ownerUpdate;
this.userUpdate = userService.userUpdate;
this.orderService.getAllOrders(); this.orderService.getAllOrders();
this.ordersUpdate = orderService.allOrdersUpdate; this.ordersUpdate = orderService.allOrdersUpdate;
this.addrUpdate = fullnodeService.addrUpdate;
this.priceUpdate = fullnodeService.priceUpdate;
this.priceUpdate.subscribe(price => {
this.zecPrice = price;
});
this.addrUpdate.subscribe(nAddress => {
this.nodeAddress = nAddress;
});
this.userUpdate.subscribe(user => {
this.session = user.session;
});
} }
ngOnInit(){ ngOnInit(){
// console.log('listOrders Init -->'); // console.log('listOrders Init -->');
this.chgUILanguage();
this.owner = this.userService.currentOwner(); this.owner = this.userService.currentOwner();
// console.log(this.owner.name); // console.log(this.owner.name);
this.payConf = this.owner.payconf; this.payConf = this.owner.payconf;
@ -133,7 +95,7 @@ export class ListOrdersComponent implements OnInit, OnDestroy{
var today = new Date(); var today = new Date();
this.orders = orders; this.orders = orders;
//console.log(this.ownerUpdate); console.log(this.ownerUpdate);
for (let i=0; i < this.orders.length; i++){ for (let i=0; i < this.orders.length; i++){
this.total += this.orders[i].totalZec; this.total += this.orders[i].totalZec;
// //
@ -177,8 +139,7 @@ export class ListOrdersComponent implements OnInit, OnDestroy{
dialogConfig.disableClose = true; dialogConfig.disableClose = true;
dialogConfig.autoFocus = true; dialogConfig.autoFocus = true;
dialogConfig.data = { dialogConfig.data = {
orderId: order._id, orderId: order._id
orderToken: order.token
}; };
const dialogRef = this.dialog.open(PromptInvoiceComponent, dialogConfig); const dialogRef = this.dialog.open(PromptInvoiceComponent, dialogConfig);
@ -199,8 +160,7 @@ export class ListOrdersComponent implements OnInit, OnDestroy{
dialogConfig.disableClose = true; dialogConfig.disableClose = true;
dialogConfig.autoFocus = true; dialogConfig.autoFocus = true;
dialogConfig.data = { dialogConfig.data = {
orderId: order._id, orderId: order._id
orderToken: order.token
}; };
const dialogRef = this.dialog.open(PromptReceiptComponent, dialogConfig); const dialogRef = this.dialog.open(PromptReceiptComponent, dialogConfig);
@ -212,7 +172,7 @@ export class ListOrdersComponent implements OnInit, OnDestroy{
openDbExport(){ openDbExport(){
const dialogConfig = new MatDialogConfig(); const dialogConfig = new MatDialogConfig();
//console.log('openDbExport ---'); console.log('openDbExport ---');
dialogConfig.disableClose = false; dialogConfig.disableClose = false;
dialogConfig.autoFocus = true; dialogConfig.autoFocus = true;
@ -225,48 +185,4 @@ export class ListOrdersComponent implements OnInit, OnDestroy{
} }
chgUILanguage(){
//console.log('LISTORDERS.chgUILanguage Called ');
this.languageService.getViewElements('listorders').subscribe({
next: response => {
//console.log('Received >> ', response );
//console.log('Language Code : ', response.language);
//console.log('Component Name : ',response.component);
//console.log('Language data : ',response.data);
this.vE.listordersBacktoshopBtn = response.data.listorders_backtoshop_btn;
this.vE.listordersExportOrders = response.data.listorders_export_orders;
this.vE.listordersTodaysTotal = response.data.listorders_todays_total;
this.vE.listordersOverallTotal = response.data.listorders_overall_total;
this.vE.listordersOrderId = response.data.listorders_order_id;
this.vE.listordersOrderTotal = response.data.listorders_order_total;
this.vE.listordersItemLbl = response.data.listorders_item_lbl;
this.vE.listordersQtyLbl = response.data.listorders_qty_lbl;
this.vE.listordersTotalLbl = response.data.listorders_total_lbl;
this.vE.listordersInvoiceBtn = response.data.listorders_invoice_btn;
this.vE.listordersReceiptBtn = response.data.listorders_receipt_btn;
this.vE.listordersNoOrders = response.data.listorders_no_orders;
this.vE.listordersEndDate = response.data.listorders_end_date;
this.vE.listordersTax = response.data.listorders_tax;
this.vE.listordersVAT = response.data.listorders_vat;
this.vE.listordersTip = response.data.listorders_tip;
},
error: error => { console.log('Error >> ',error); }
});
}
paySession() {
const dialogConfig = new MatDialogConfig();
dialogConfig.disableClose = true;
dialogConfig.autoFocus = true;
dialogConfig.data = {
addr: this.nodeAddress,
session: this.session,
zecPrice: this.zecPrice
};
const dialogRef = this.dialog.open(SessionpayComponent, dialogConfig);
}
} }

View file

@ -5,13 +5,10 @@ mat-card.coolcard{
background-color: #FF5722; background-color: #FF5722;
color: #FFFFFF; color: #FFFFFF;
margin: 5px; margin: 5px;
width: 90%;
justify-content: center;
} }
mat-card.centercard{ mat-card.centercard{
max-width: 450px; max-width: 450px;
border: 1px solid #CCCCCC; border: 1px solid #CCCCCC;
justify-content: center;
} }
.icon{ .icon{
font-family: 'Material Icons'; font-family: 'Material Icons';

View file

@ -1,42 +1,44 @@
<div align="center" class="text"> <div align="center" class="text">
<mat-card class="coolcard"> <mat-card class="coolcard">
<mat-card-content> <img src="/assets/logo-new-white_01.png" height="120px" />
<img mat-card-image src="/assets/logo-new-white_01.png" height="120px" /> <p class="text">Last block seen: <span class="numbers">{{ heightUpdate | async }}</span></p>
<p class="text">{{ vE.loginLastBlock }}<span class="numbers"> {{ heightUpdate | async }}</span></p>
</mat-card-content>
</mat-card> </mat-card>
</div> </div>
<div align="center"> <div align="center">
<mat-card class="centercard"> <mat-card class="centercard">
<h3>The Zcash Register</h3> <h3>The Zcash Register</h3>
<mat-vertical-stepper #stepper linear> <mat-vertical-stepper #stepper linear>
<mat-step label= "{{ vE.loginConnectToZGo }}" editable="false"> <mat-step label="Connect your wallet to ZGo" editable="false">
<div align="center" id="info"> <mat-card>
<button mat-raised-button color="primary" (click)="login(stepper)"> <div align="center" id="info">
<mat-icon class="icon">login</mat-icon><span class="bigbutton">{{ vE.loginLinkWallet }}</span> <mat-card-actions>
</button> <button mat-raised-button color="primary" (click)="login(stepper)">
</div> <mat-icon class="icon">login</mat-icon><span class="bigbutton">Link wallet</span>
</button>
</mat-card-actions>
</div>
</mat-card>
</mat-step> </mat-step>
<mat-step label="{{ vE.loginConfirmLogin }}" editable="false"> <mat-step label="ZGo confirms your login on the Zcash blockhain:" editable="false">
<p>{{barMessage}}</p> <p>{{barMessage}}</p>
<mat-progress-bar <mat-progress-bar
[mode]="barMode" [mode]="barMode"
[value]="barValue"> [value]="barValue">
</mat-progress-bar> </mat-progress-bar>
</mat-step> </mat-step>
<mat-step label="{{ vE.loginEnterPin }}"> <mat-step label="Enter the PIN sent by ZGo to confirm wallet ownership:">
<mat-card [formGroup]="pinForm"> <mat-card [formGroup]="pinForm">
<h4> <h4>
{{ vE.loginCheckWallet}} Check your wallet
</h4> </h4>
<mat-form-field appearance="outline"> <mat-form-field appearance="outline">
<mat-label>PIN</mat-label> <mat-label>PIN</mat-label>
<input matInput formControlName="pinValue"> <input matInput formControlName="pinValue">
</mat-form-field> </mat-form-field>
<p *ngIf="pinError">{{ vE.loginWrongPin }}</p> <p *ngIf="pinError">Wrong pin!</p>
<mat-card-actions> <mat-card-actions>
<button mat-raised-button color="primary" [disabled]="!pinForm.valid" (click)="confirmPin()"> <button mat-raised-button color="primary" [disabled]="!pinForm.valid" (click)="confirmPin()">
{{ vE.loginConfirmPin }} Confirm
</button> </button>
</mat-card-actions> </mat-card-actions>
</mat-card> </mat-card>

View file

@ -1,19 +1,22 @@
import { Component, OnInit, ChangeDetectorRef, ViewChild, AfterViewInit } from '@angular/core'; import { Component, OnInit, OnDestroy, Injectable, ChangeDetectorRef, ViewChild, AfterViewInit } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router'; import { CanActivate, Router, RouterStateSnapshot, ActivatedRouteSnapshot, ActivatedRoute } from '@angular/router';
import { MatDialog, MatDialogConfig} from '@angular/material/dialog'; import { MatDialog, MatDialogConfig} from '@angular/material/dialog';
import { UntypedFormBuilder, Validators, UntypedFormGroup } from '@angular/forms'; import { UntypedFormBuilder, Validators, UntypedFormGroup, FormControl } from '@angular/forms';
import { ProgressBarMode } from '@angular/material/progress-bar'; import { ProgressBarMode } from '@angular/material/progress-bar';
import { MatStepper } from '@angular/material/stepper'; import { MatStepper } from '@angular/material/stepper';
import { UserService } from '../user.service'; import { UserService } from '../user.service';
import { FullnodeService } from '../fullnode.service'; import { FullnodeService } from '../fullnode.service';
import { ScanComponent} from '../scan/scan.component'; import { ScanComponent} from '../scan/scan.component';
import { Tx } from '../tx.model'; import { Tx } from '../tx.model';
import { User } from '../user.model'; import {User} from '../user.model';
import { Owner } from '../owner.model'; import { Owner } from '../owner.model';
import { Subscription, Observable } from 'rxjs'; import { Subscription, Observable } from 'rxjs';
import { take } from 'rxjs/operators';
import { v4 as uuidv4 } from 'uuid'; import { v4 as uuidv4 } from 'uuid';
var QRCode = require('easyqrcodejs');
var URLSafeBase64 = require('urlsafe-base64');
var Buffer = require('buffer/').Buffer;
import { LanguageService } from '../language.service';
@Component({ @Component({
selector: 'app-login', selector: 'app-login',
@ -43,22 +46,31 @@ export class LoginComponent implements OnInit, AfterViewInit {
taxValue:0, taxValue:0,
vat: false, vat: false,
vatValue: 0, vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false, paid: false,
website: '',
country: '',
zats: false, zats: false,
invoices: false, invoices: false,
expiration: new Date(Date.now()).toISOString(), expiration: new Date(Date.now()).toISOString(),
payconf: false, payconf: false,
crmToken: '',
viewkey: '', viewkey: '',
tips: false crmToken: ''
}; };
private FullnodeSub: Subscription = new Subscription(); private FullnodeSub: Subscription = new Subscription();
private UserSub: Subscription = new Subscription(); private UserSub: Subscription = new Subscription();
public heightUpdate: Observable<number>; public heightUpdate: Observable<number>;
public uZaddrUpdate: Observable<string>; public uZaddrUpdate: Observable<string>;
public userUpdate: Observable<User>; public userUpdate:Observable<User>;
public ownerUpdate: Observable<Owner>; public ownerUpdate:Observable<Owner>;
//public txsUpdate: Observable<Tx[]>; public txsUpdate: Observable<Tx[]>;
prompt: boolean = false; prompt: boolean = false;
confirmedMemo: boolean = false; confirmedMemo: boolean = false;
targetBlock: number = 0; targetBlock: number = 0;
@ -67,23 +79,10 @@ export class LoginComponent implements OnInit, AfterViewInit {
barMessage = 'Scanning blockchain for login memo, please wait.'; barMessage = 'Scanning blockchain for login memo, please wait.';
@ViewChild('stepper') private myStepper?: MatStepper; @ViewChild('stepper') private myStepper?: MatStepper;
entryForm: UntypedFormGroup;
pinForm: UntypedFormGroup; pinForm: UntypedFormGroup;
//
// Language Support
//
vE = {
loginConfirmLogin : '',
loginConnectToZGo : '',
loginEnterPin : '',
loginLastBlock : '',
loginLinkWallet : '',
loginCheckWallet : '',
loginWrongPin : '',
loginConfirmPin : ''
}
//
// ------------------------------------------------------------
constructor( constructor(
private fb: UntypedFormBuilder, private fb: UntypedFormBuilder,
private activatedRoute: ActivatedRoute, private activatedRoute: ActivatedRoute,
@ -91,11 +90,12 @@ export class LoginComponent implements OnInit, AfterViewInit {
private router: Router, private router: Router,
public userService: UserService, public userService: UserService,
private dialog: MatDialog, private dialog: MatDialog,
private _changeDetectorRef: ChangeDetectorRef, private _changeDetectorRef: ChangeDetectorRef
private languageService: LanguageService
){ ){
//this.fullnodeService.getAddr(); //this.fullnodeService.getAddr();
this.entryForm = fb.group({
selectedSession: [0.001, Validators.required]
});
this.pinForm = fb.group({ this.pinForm = fb.group({
pinValue: [null, Validators.required] pinValue: [null, Validators.required]
}); });
@ -109,14 +109,13 @@ export class LoginComponent implements OnInit, AfterViewInit {
this.ownerUpdate.subscribe((owner) => { this.ownerUpdate.subscribe((owner) => {
this.owner = owner; this.owner = owner;
}); });
//this.txsUpdate = userService.txUpdate; this.txsUpdate = userService.txUpdate;
//this.txsUpdate.subscribe((txs) => { this.txsUpdate.subscribe((txs) => {
//this.txs = txs; this.txs = txs;
//}); });
} }
ngAfterViewInit(){ ngAfterViewInit(){
//console.log('Step', this.myStepper); //console.log('Step', this.myStepper);
this.pinError = false; this.pinError = false;
//console.log('Activated route data in Component:::', this.activatedRoute.data); //console.log('Activated route data in Component:::', this.activatedRoute.data);
@ -136,38 +135,36 @@ export class LoginComponent implements OnInit, AfterViewInit {
} }
ngOnInit(){ ngOnInit(){
this.chgUILanguage();
this.intervalHolder = setInterval(() => { this.intervalHolder = setInterval(() => {
this.fullnodeService.getHeight(); this.fullnodeService.getHeight();
//this.userService.findUser();
this.loginCheck(); this.loginCheck();
this._changeDetectorRef.markForCheck(); this._changeDetectorRef.markForCheck();
}, 1000 * 60); }, 1000 * 60);
} }
loginCheck(){ loginCheck(){
this.userService.checkUser()!.subscribe({ this.userService.findUser();
next: (checkResponse) => { this.userUpdate.subscribe((user) => {
if (checkResponse.status == 200) { if (user.blocktime > 0) {
console.log('checkUser true'); if(this.myStepper!.selectedIndex === 0) {
if(this.myStepper!.selectedIndex === 0) { this.myStepper!.next();
this.myStepper!.next();
} else {
if(this.myStepper!.selectedIndex === 1){
this.myStepper!.next(); this.myStepper!.next();
this.myStepper!.next();
} else {
if(this.myStepper!.selectedIndex === 1){
this.myStepper!.next();
}
}
if(checkResponse.body!.validated) {
console.log('redirecting to biz');
this.userService.getOwner();
this.router.navigate(['/biz']);
clearInterval(this.intervalHolder);
} else {
console.log('validated failed');
} }
} }
}, //console.log('Log in found in blockchain!');
error: (error) => {console.log(error);} if (user.validated) {
clearInterval(this.intervalHolder);
if (this.owner.paid) {
this.router.navigate(['/shop']);
} else {
this.router.navigate(['/biz']);
}
}
}
}); });
} }
@ -209,26 +206,4 @@ export class LoginComponent implements OnInit, AfterViewInit {
this.UserSub.unsubscribe(); this.UserSub.unsubscribe();
clearInterval(this.intervalHolder); clearInterval(this.intervalHolder);
} }
chgUILanguage(){
//console.log('LOGIN.chgUILanguage Called ');
this.languageService.getViewElements('login').subscribe(
response => {
//console.log('Received >> ', response );
//console.log('Language Code : ', response.language);
//console.log('Component Name : ',response.component);
//console.log('Language data : ',response.data);
this.vE.loginLastBlock = response.data.login_last_block;
this.vE.loginConnectToZGo = response.data.login_connect_to_zgo;
this.vE.loginLinkWallet = response.data.login_link_wallet;
this.vE.loginConfirmLogin = response.data.login_confirm_login;
this.vE.loginEnterPin = response.data.login_enter_pin;
this.vE.loginCheckWallet = response.data.login_check_wallet;
this.vE.loginWrongPin = response.data.login_wrong_pin;
this.vE.loginConfirmPin = response.data.login_confirm_pin;
},
error => { console.log('Error >> ',error); }
);
}
} }

View file

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot } from '@angular/router'; import { ActivatedRouteSnapshot, Resolve } from '@angular/router';
import { Observable, of } from 'rxjs'; import { Observable, of } from 'rxjs';
import { catchError } from 'rxjs/operators'; import { catchError } from 'rxjs/operators';
@ -9,13 +9,13 @@ import { FullnodeService} from './fullnode.service';
providedIn: 'root' providedIn: 'root'
}) })
export class NodeResolverService { export class NodeResolverService implements Resolve<any> {
constructor(private fullnode: FullnodeService) {} constructor(private fullnode: FullnodeService) {}
resolve(route: ActivatedRouteSnapshot): Observable<any> { resolve(route: ActivatedRouteSnapshot): Observable<any> {
//console.log('Called getAddr in resolver...', route); console.log('Called getAddr in resolver...', route);
return this.fullnode.getAddr().pipe( return this.fullnode.getAddr().pipe(
catchError(() => { catchError(error => {
return of('No data'); return of('No data');
}) })
); );

View file

@ -1,6 +1,5 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { MatSnackBar, MatSnackBarHorizontalPosition, import { MatSnackBar } from '@angular/material/snack-bar';
MatSnackBarVerticalPosition } from '@angular/material/snack-bar';
import { NotifierComponent } from './notifier/notifier.component'; import { NotifierComponent } from './notifier/notifier.component';
@Injectable({ @Injectable({
@ -8,23 +7,18 @@ import { NotifierComponent } from './notifier/notifier.component';
}) })
export class NotifierService { export class NotifierService {
constructor(public snackBar:MatSnackBar, constructor(private snackBar:MatSnackBar) { }
) { }
showNotification(displayMessage:string, showNotification(displayMessage:string, buttonText: string, messageType: 'error' | 'success' | 'warning') {
buttonText: string,
messageType: 'error' | 'success' | 'warning',
messageTypeStr : string = '') {
this.snackBar.openFromComponent(NotifierComponent, { this.snackBar.openFromComponent(NotifierComponent, {
data: { data: {
message: displayMessage, message: displayMessage,
buttonText: buttonText, buttonText: buttonText,
type : messageType, type : messageType
typelbl : messageTypeStr
}, },
duration: 4000, duration: 4000,
verticalPosition: 'top', verticalPosition: 'top',
panelClass: [messageType], panelClass: [messageType]
}); });
this.playSound(); this.playSound();
} }

View file

@ -1,42 +1,37 @@
.notifier { .notifier {
margin-top: 10px; font-family: 'Spartan', sans-serif;
font-family: 'Spartan' sans-serif; color: black;
font-size: 16px;
text-align: center;
}
.notifier-type {
border: 2px solid;
border-color: lightcoral;
background: #ff5722;
font-size: 26px;
font-weight: 700;
height: 30px;
color: white;
justify-content: center; justify-content: center;
text-align: center; text-align: center;
align-items: center; align-items: center;
vertical-align: center; vertical-align: center;
} }
.notifier-type { ::ng-deep .mat-snack-bar-container.error {
font-size: 30px; background: navajowhite;
font-weight: 700;
height: 40px;
color: #ff5722;
}
.notifier-msg {
font-size: 16px;
font-weight: 700;
color: black;
height: 60px;
margin-bottom: 20 !important;
}
::ng-deep .mat-mdc-snack-bar-container.error {
--mdc-snackbar-container-color: navajowhite;
background-color: navajowhite;
color: red; color: red;
} }
::ng-deep .mat-mdc-snack-bar-container.success { ::ng-deep .mat-snack-bar-container.success {
--mdc-snackbar-container-color: whitesmoke; background: whitesmoke;
background-color: whitesmoke;
color: black; color: black;
} }
::ng-deep .mat-mdc-snack-bar-container.warning { ::ng-deep .mat-snack-bar-container.warning {
--mdc-snackbar-container-color: antiquewhite; background: antiquewhite;
background-color: antiquewhite;
color: black; color: black;
} }

View file

@ -1,10 +1,11 @@
<div class="notifier">
<div class="notifier" >
<div class="notifier-type"> <div class="notifier-type">
{{ data.typelbl | titlecase }} {{ data.type | titlecase }}
</div> </div>
<div class="notifier-msg"> <p>
{{ data.message }} {{ data.message }}
</div> </p>
<div > <div >
<button mat-flat-button (click)="sbRef.dismiss()" <button mat-flat-button (click)="sbRef.dismiss()"
style="justify-content: center; style="justify-content: center;

View file

@ -4,7 +4,7 @@ import { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar'
@Component({ @Component({
selector: 'app-notifier', selector: 'app-notifier',
templateUrl: './notifier.component.html', templateUrl: './notifier.component.html',
styleUrls: ['./notifier.component.css'], styleUrls: ['./notifier.component.css']
}) })
export class NotifierComponent implements OnInit { export class NotifierComponent implements OnInit {
@ -15,7 +15,6 @@ export class NotifierComponent implements OnInit {
) {} ) {}
ngOnInit(): void { ngOnInit(): void {
} }
} }

View file

@ -55,8 +55,8 @@ img.icon{
background-color: #ff5722; background-color: #ff5722;
color: white; color: white;
font-weight: 500; font-weight: 500;
height: 30px !important; height: 25px !important;
width: 115px !important; width: 80px !important;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@ -67,8 +67,8 @@ img.icon{
.button-cancel-class { .button-cancel-class {
font-family: 'Spartan', sans-serif; font-family: 'Spartan', sans-serif;
font-weight: 500; font-weight: 500;
height: 30px !important; height: 25px !important;
width: 100px !important; width: 80px !important;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;

View file

@ -1,6 +1,6 @@
<div class="noOrderMsg" <div class="noOrderMsg"
*ngIf="order.address.length == 0"> *ngIf="order.address.length == 0">
{{ vE.orderNoOpenorder }} No open order!
</div> </div>
<mat-card style="margin-top: 10px;" *ngIf="order.address.length" > <mat-card style="margin-top: 10px;" *ngIf="order.address.length" >
@ -9,7 +9,7 @@
<table style="width: 100%;" <table style="width: 100%;"
cellspacing="0"> cellspacing="0">
<tr class="newOrderTitle1"> <tr class="newOrderTitle1">
<td width="50%">{{ vE.orderTotalTitle }}</td> <td width="50%">Order Total:</td>
<td align="right" <td align="right"
width="50%"> width="50%">
<img class="icon" src="/assets/zec_rv.png" <img class="icon" src="/assets/zec_rv.png"
@ -36,15 +36,15 @@
<tr style="background: lightblue;"> <tr style="background: lightblue;">
<th class="newOrdertbheader" <th class="newOrdertbheader"
style="text-align: left;" style="text-align: left;"
width="50%">{{ vE.orderItemLbl }} width="50%">Item
</th> </th>
<th class="newOrdertbheader" <th class="newOrdertbheader"
style="text-align: left;" style="text-align: left;"
width="15%">{{ vE.orderQtyLbl }}. width="15%">Qty.
</th> </th>
<th class="newOrdertbheader" <th class="newOrdertbheader"
style="text-align: right;" style="text-align: right;"
width="30%">{{ vE.orderTotalLbl }} width="30%">Total
</th> </th>
<th></th> <th></th>
</tr> </tr>
@ -75,23 +75,11 @@
</a> </a>
</td> </td>
</tr> </tr>
<tr *ngIf="tax > 0">
<td class="newOrdertbdetail" style="text-align: right;">Sales Tax</td>
<td class="newOrdertbdetail" style="text-align: right;">{{ tax / 100 | percent:'1.2-4'}}</td>
<td class="newOrdertbdetail" style="text-align: right;">{{ order.taxAmount | currency: getCurrency() }}</td>
<td></td>
</tr>
<tr *ngIf="vat > 0">
<td class="newOrdertbdetail" style="text-align: right;">Value-Added Tax</td>
<td class="newOrdertbdetail" style="text-align: right;">{{ vat / 100 | percent:'1.2-4' }}</td>
<td class="newOrdertbdetail" style="text-align: right;">{{ order.vatAmount | currency: getCurrency() }}</td>
<td></td>
</tr>
</tbody> </tbody>
</table> </table>
</div> </div>
<div class="container" style="margin: 2px; <div class="container" style="margin: 2px;
height: 40px; height: 35px;
background: lightblue; background: lightblue;
border-top: 2px solid lightgray; border-top: 2px solid lightgray;
border-bottom: 2px solid lightgray; border-bottom: 2px solid lightgray;
@ -101,26 +89,28 @@
<mat-card-actions> <mat-card-actions>
--> -->
<table style="margin-top: 4px;" cellspacing="0" width="100%"> <table style="margin-top: 4px;" cellspacing="0" width="100%">
<tr style="height: 30px; <tr style="height: 16px;
margin-top: 10px"> margin-top: 10px">
<td> <td>
<button mat-raised-button <button mat-raised-button
class="button-cancel-class" class="button-cancel-class"
(click)="cancelOrder()"> (click)="cancelOrder()">
{{ vE.orderCancelBtn }} Cancel
</button> </button>
</td> </td>
<td> <td>
<button mat-raised-button <button mat-raised-button
class="buttons-class" class="buttons-class"
(click)="invoice()"> (click)="invoice()">
<fa-icon [icon]="faInvoice" ></fa-icon> {{vE.orderInvoiceBtn}}</button> <fa-icon [icon]="faInvoice" ></fa-icon> Invoice
</button>
</td> </td>
<td align="right"> <td align="right">
<button mat-raised-button <button mat-raised-button
class="buttons-class" class="buttons-class"
(click)="checkout()">{{vE.orderCheckoutBtn}} (click)="checkout()">
Checkout
</button> </button>
<!-- <!--
<button mat-raised-button class="text" color="primary" (click)="checkout()">Checkout</button> <button mat-raised-button class="text" color="primary" (click)="checkout()">Checkout</button>

View file

@ -19,10 +19,6 @@ import { faSignOut } from '@fortawesome/free-solid-svg-icons';
import { NotifierService } from '../notifier.service'; import { NotifierService } from '../notifier.service';
import { LanguageService } from '../language.service';
import { LanguageData } from '../language.model';
import {TipsComponent} from '../tips/tips.component';
@Component({ @Component({
selector: 'app-order', selector: 'app-order',
templateUrl: './order.component.html', templateUrl: './order.component.html',
@ -48,10 +44,6 @@ export class OrderComponent implements OnInit{
paid: false, paid: false,
externalInvoice: '', externalInvoice: '',
shortCode: '', shortCode: '',
token: '',
taxAmount: 0,
vatAmount: 0,
tipAmount: 0,
lines: [ lines: [
{ {
qty: 1, qty: 1,
@ -62,15 +54,9 @@ export class OrderComponent implements OnInit{
}; };
public price: number = 1; public price: number = 1;
public total: number = 0; public total: number = 0;
public tax: number = 0;
public vat: number = 0;
public tip: boolean = false;
public orderUpdate: Observable<Order>; public orderUpdate: Observable<Order>;
public priceUpdate: Observable<number>; public priceUpdate: Observable<number>;
public totalUpdate: Observable<number>; public totalUpdate: Observable<number>;
public taxUpdate: Observable<number>;
public vatUpdate: Observable<number>;
public tipUpdate: Observable<boolean>;
// ------------------------------------ // ------------------------------------
// //
@ -79,31 +65,9 @@ export class OrderComponent implements OnInit{
faChevronRight = faChevronRight; faChevronRight = faChevronRight;
faSignOut = faSignOut; faSignOut = faSignOut;
// ------------------------------------- // -------------------------------------
//
// Language Support
//
vE = {
orderNoOpenorder : '',
orderCancelOrder : '',
orderConfirmCancel : '',
orderRemoveItem : '',
orderConfirmRemove : '',
orderConfirmRemove1 : '',
orderCancelOk : '',
orderNotservClose : '',
orderNotservSuccess : '',
orderTotalTitle : '',
orderItemLbl : '',
orderQtyLbl : '',
orderTotalLbl : '',
orderCancelBtn : '',
orderInvoiceBtn : '',
orderCheckoutBtn : ''
}
//
// ------------------------------------------------------------
constructor( constructor(
private languageService : LanguageService,
public fullnodeService: FullnodeService, public fullnodeService: FullnodeService,
public orderService: OrderService, public orderService: OrderService,
private dialog: MatDialog, private dialog: MatDialog,
@ -116,6 +80,9 @@ export class OrderComponent implements OnInit{
this.orderUpdate = orderService.orderUpdate; this.orderUpdate = orderService.orderUpdate;
this.orderUpdate.subscribe((order) => { this.orderUpdate.subscribe((order) => {
this.order = order; this.order = order;
console.log('this.order > ' + JSON.stringify(this.order));
// ------------------------------------------------
this.oLines = []; this.oLines = [];
this.myLines = this.order.lines; this.myLines = this.order.lines;
var nl = {} as newLineItem; var nl = {} as newLineItem;
@ -141,22 +108,9 @@ export class OrderComponent implements OnInit{
this.total = total; this.total = total;
}); });
this.taxUpdate = orderService.taxUpdate;
this.taxUpdate.subscribe((tax) => {
this.tax = tax;
});
this.vatUpdate = orderService.vatUpdate;
this.vatUpdate.subscribe((vat) => {
this.vat = vat;
});
this.tipUpdate = orderService.tipUpdate;
this.tipUpdate.subscribe((tip) => {
this.tip = tip;
});
} }
ngOnInit() { ngOnInit() {
this.chgUILanguage();
} }
cancelOrder() { cancelOrder() {
@ -164,84 +118,61 @@ export class OrderComponent implements OnInit{
dialogConfig.disableClose = true; dialogConfig.disableClose = true;
dialogConfig.autoFocus = true; dialogConfig.autoFocus = true;
dialogConfig.data = {title: this.vE.orderCancelOrder, dialogConfig.data = {title: 'Cancel Order?', msg: 'Are you sure you want to cancel the order?'};
msg: this.vE.orderConfirmCancel };
const dialogRef = this.dialog.open(CancelComponent, dialogConfig); const dialogRef = this.dialog.open(CancelComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => { dialogRef.afterClosed().subscribe((val) => {
if (val) { if (val) {
//console.log('Canceling'); console.log('Canceling');
this.orderService.cancelOrder(this.order._id!).subscribe((response) => { this.orderService.cancelOrder(this.order._id!).subscribe((response) => {
this.orderService.getOrder(); this.orderService.getOrder();
this.notifierService this.notifierService
.showNotification(this.vE.orderCancelOk, .showNotification("Order successfully cancelled!",
this.vE.orderNotservClose, "Close","success");
'success',
this.vE.orderNotservSuccess);
}); });
} else {
console.log('Returning to page');
} }
//else {
//console.log('Returning to page');
//}
this.orderService.getOrder(); this.orderService.getOrder();
this.oLines = []; this.oLines = [];
}); });
} }
checkout() { checkout() {
const dialogConfig3 = new MatDialogConfig(); var zec = this.total/this.price;
this.order.totalZec = parseFloat(zec.toFixed(8));
const dialogConfig = new MatDialogConfig();
dialogConfig3.disableClose = true; dialogConfig.disableClose = true;
dialogConfig3.autoFocus = true; dialogConfig.autoFocus = true;
dialogConfig3.data = { dialogConfig.data = {
amt: this.total, totalZec: this.order.totalZec,
flag: this.tip addr: this.order.address,
orderId: this.order._id
}; };
const dialogRef = this.dialog.open(CheckoutComponent, dialogConfig);
const dialogRef3 = this.dialog.open(TipsComponent, dialogConfig3); dialogRef.afterClosed().subscribe((val) => {
dialogRef3.afterClosed().subscribe((tipVal) => { if (val) {
this.orderService.updateTip(tipVal).then((orderData) => { const dialogConfig2 = new MatDialogConfig();
this.orderService.getOrder().subscribe((oData) => { dialogConfig2.disableClose = true;
var zec = this.total/this.price; dialogConfig2.autoFocus = true;
this.order.totalZec = parseFloat(zec.toFixed(8)); dialogConfig2.data = {
const dialogConfig = new MatDialogConfig(); order: this.order._id
dialogConfig.disableClose = true; };
dialogConfig.autoFocus = true; console.log('Payment confirmed!');
dialogConfig.data = { this.orderService.closeOrder(true);
totalZec: this.order.totalZec, const dialogRef2 = this.dialog.open(ReceiptQRComponent, dialogConfig2);
addr: this.order.address, dialogRef2.afterClosed().subscribe( val => {
orderId: this.order._id if (val) {
}; console.log('Receipt closed.');
const dialogRef = this.dialog.open(CheckoutComponent, dialogConfig); this.oLines = [];
dialogRef.afterClosed().subscribe((val) => { }
if (val) { });
const dialogConfig2 = new MatDialogConfig(); } else {
dialogConfig2.disableClose = true; console.log('Returning to order');
dialogConfig2.autoFocus = true; }
dialogConfig2.data = {
order: this.order._id
};
console.log('Payment confirmed!');
this.orderService.closeOrder(true);
const dialogRef2 = this.dialog.open(ReceiptQRComponent, dialogConfig2);
dialogRef2.afterClosed().subscribe( val => {
if (val) {
console.log('Receipt closed.');
this.oLines = [];
}
});
} else {
console.log('Returning to order');
}
});
})
}).catch((error) => {
console.log('Failed to get promise');
});
}); });
} }
invoice() { invoice() {
@ -252,11 +183,10 @@ export class OrderComponent implements OnInit{
dialogConfig.disableClose = true; dialogConfig.disableClose = true;
dialogConfig.autoFocus = true; dialogConfig.autoFocus = true;
dialogConfig.data = { dialogConfig.data = {
orderId: this.order._id, orderId: this.order._id
orderToken: this.order.token
}; };
//console.log ('order_id : ' + this.order._id); console.log ('order_id : ' + this.order._id);
const dialogRef = this.dialog.open(PromptInvoiceComponent, dialogConfig); const dialogRef = this.dialog.open(PromptInvoiceComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => { dialogRef.afterClosed().subscribe((val) => {
@ -292,10 +222,10 @@ export class OrderComponent implements OnInit{
dialogConfig.disableClose = true; dialogConfig.disableClose = true;
dialogConfig.autoFocus = true; dialogConfig.autoFocus = true;
dialogConfig.data = {title: this.vE.orderRemoveItem, dialogConfig.data = {title: 'Remove Item?',
msg: this.vE.orderConfirmRemove + msg: 'Are you sure you want to remove <<' +
item.name + ' x ' + item.qty + item.name + ' x ' + item.qty +
this.vE.orderConfirmRemove1 }; '>> from this order?'};
const dialogRef = this.dialog.open(CancelComponent, dialogConfig); const dialogRef = this.dialog.open(CancelComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => { dialogRef.afterClosed().subscribe((val) => {
if (val) { if (val) {
@ -310,41 +240,12 @@ export class OrderComponent implements OnInit{
this.orderService.getOrder(); this.orderService.getOrder();
}); });
} }
} else { } else {
console.log('Returning to order'); console.log('Returning to order');
} }
}); });
} }
chgUILanguage(){
//console.log('ORDER.chgUILanguage Called ');
this.languageService.getViewElements('order').subscribe({
next: response => {
//console.log('Received >> ', response );
//console.log('Language Code : ', response.language);
//console.log('Component Name : ',response.component);
//console.log('Language data : ',response.data);
this.vE.orderNoOpenorder = response.data.order_no_openorder;
this.vE.orderCancelOrder = response.data.order_cancel_order;
this.vE.orderConfirmCancel = response.data.order_confirm_cancel;
this.vE.orderRemoveItem = response.data.order_remove_item;
this.vE.orderConfirmRemove = response.data.order_confirm_remove;
this.vE.orderConfirmRemove1 = response.data.order_confirm_remove1;
this.vE.orderCancelOk = response.data.order_cancel_ok;
this.vE.orderNotservClose = response.data.order_notserv_close;
this.vE.orderNotservSuccess = response.data.order_notserv_success;
this.vE.orderTotalTitle = response.data.order_total_title;
this.vE.orderItemLbl = response.data.order_item_lbl;
this.vE.orderQtyLbl = response.data.order_qty_lbl;
this.vE.orderTotalLbl = response.data.order_total_lbl;
this.vE.orderCancelBtn = response.data.order_cancel_btn;
this.vE.orderInvoiceBtn = response.data.order_invoice_btn;
this.vE.orderCheckoutBtn = response.data.order_checkout_btn;
},
error: error => { console.log('Error >> ',error); }
});
}
} }

View file

@ -1,7 +1,7 @@
import { LineItem } from '../items/lineitem.model'; import { LineItem } from '../items/lineitem.model';
export interface Order { export interface Order {
_id?: string|null, _id?: string,
address: string, address: string,
session: string, session: string,
timestamp?: string, timestamp?: string,
@ -13,9 +13,5 @@ export interface Order {
lines: LineItem[], lines: LineItem[],
paid: boolean, paid: boolean,
externalInvoice: string, externalInvoice: string,
shortCode: string, shortCode: string
token: string,
taxAmount: number,
vatAmount: number,
tipAmount: number
} }

View file

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable, lastValueFrom } from 'rxjs'; import { Subject, BehaviorSubject, Observable } from 'rxjs';
import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http'; import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http';
import { Order } from './order.model'; import { Order } from './order.model';
import { UserService } from '../user.service'; import { UserService } from '../user.service';
@ -35,14 +35,23 @@ export class OrderService {
taxValue: 0, taxValue: 0,
vat: false, vat: false,
vatValue: 0, vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false, paid: false,
website: '',
country: '',
zats: false, zats: false,
invoices: false, invoices: false,
expiration: new Date(Date.now()).toISOString(), expiration: new Date(Date.now()).toISOString(),
payconf: false, payconf: false,
crmToken: '',
viewkey: '', viewkey: '',
tips: false crmToken: ''
}, },
order: { order: {
address: '', address: '',
@ -56,10 +65,6 @@ export class OrderService {
paid: false, paid: false,
externalInvoice: '', externalInvoice: '',
shortCode: '', shortCode: '',
token: '',
taxAmount: 0,
vatAmount: 0,
tipAmount: 0,
lines: [ lines: [
{ {
qty: 1, qty: 1,
@ -75,17 +80,9 @@ export class OrderService {
public readonly totalUpdate: Observable<number> = this._totalUpdated.asObservable(); public readonly totalUpdate: Observable<number> = this._totalUpdated.asObservable();
private _allOrdersUpdated: BehaviorSubject<Order[]> = new BehaviorSubject(this.dataStore.allOrders); private _allOrdersUpdated: BehaviorSubject<Order[]> = new BehaviorSubject(this.dataStore.allOrders);
public readonly allOrdersUpdate: Observable<Order[]> = this._allOrdersUpdated.asObservable(); public readonly allOrdersUpdate: Observable<Order[]> = this._allOrdersUpdated.asObservable();
private _taxUpdated: BehaviorSubject<number> = new BehaviorSubject(this.dataStore.owner.taxValue);
public readonly taxUpdate: Observable<number> = this._taxUpdated.asObservable();
private _vatUpdated: BehaviorSubject<number> = new BehaviorSubject(this.dataStore.owner.vatValue);
public readonly vatUpdate: Observable<number> = this._vatUpdated.asObservable();
private _tipUpdated: BehaviorSubject<boolean> = new BehaviorSubject(this.dataStore.owner.tips);
public readonly tipUpdate: Observable<boolean> = this._tipUpdated.asObservable();
public userUpdate: Observable<User>; public userUpdate: Observable<User>;
public ownerUpdate: Observable<Owner>; public ownerUpdate: Observable<Owner>;
private reqHeaders: HttpHeaders; private reqHeaders: HttpHeaders;
private reqParams: HttpParams;
private session: null|string;
constructor( constructor(
private http: HttpClient, private http: HttpClient,
@ -93,38 +90,32 @@ export class OrderService {
public userService: UserService public userService: UserService
) { ) {
var auth = 'Basic ' + Buffer.from(ConfigData.UsrPwd).toString('base64'); var auth = 'Basic ' + Buffer.from(ConfigData.UsrPwd).toString('base64');
this.session = localStorage.getItem('s4z_token');
this.reqHeaders = new HttpHeaders().set('Authorization', auth); this.reqHeaders = new HttpHeaders().set('Authorization', auth);
this.reqParams = new HttpParams().append('session', this.session!);
this.userUpdate = userService.userUpdate; this.userUpdate = userService.userUpdate;
this.ownerUpdate = userService.ownerUpdate; this.ownerUpdate = userService.ownerUpdate;
this.userUpdate.subscribe((user) => { this.userUpdate.subscribe((user) => {
this.dataStore.user = user; this.dataStore.user = user;
//console.log('OS: const', user);
this.getOrder(); this.getOrder();
}); });
this.ownerUpdate.subscribe((owner) => { this.ownerUpdate.subscribe((owner) => {
this.dataStore.owner = owner; this.dataStore.owner = owner;
if (this.dataStore.owner.tax) {
this._taxUpdated.next(Object.assign({}, this.dataStore).owner.taxValue);
} else {
this._taxUpdated.next(0);
}
if (this.dataStore.owner.vat) {
this._vatUpdated.next(Object.assign({}, this.dataStore).owner.vatValue);
} else {
this._vatUpdated.next(0);
}
this._tipUpdated.next(Object.assign({}, this.dataStore).owner.tips);
}); });
} }
getOrder() { getOrder() {
let obs = this.http.get<{message: string, order: any}>(this.beUrl+'api/order', { headers:this.reqHeaders, params: this.reqParams, observe: 'response'}); var session = this.dataStore.user.session;
const params = new HttpParams().append('session', session);
let obs = this.http.get<{message: string, order: any}>(this.beUrl+'api/order', { headers:this.reqHeaders, params:params, observe: 'response'});
obs.subscribe((OrderDataResponse) => { obs.subscribe((OrderDataResponse) => {
if (OrderDataResponse.status == 200) { if (OrderDataResponse.status == 200) {
this.dataStore.order = OrderDataResponse.body!.order; this.dataStore.order = OrderDataResponse.body!.order;
this._orderUpdated.next(Object.assign({}, this.dataStore).order); this._orderUpdated.next(Object.assign({}, this.dataStore).order);
this.dataStore.order.total = 0;
for(var line of this.dataStore.order.lines) {
this.dataStore.order.total += line.qty * line.cost;
}
this._totalUpdated.next(Object.assign({}, this.dataStore).order.total); this._totalUpdated.next(Object.assign({}, this.dataStore).order.total);
} else { } else {
console.log('No order found'); console.log('No order found');
@ -136,7 +127,7 @@ export class OrderService {
getAllOrders(){ getAllOrders(){
var address = this.dataStore.user.address; var address = this.dataStore.user.address;
const params = this.reqParams.append('address', address); const params = new HttpParams().append('address', address);
let obs = this.http.get<{message: string, orders: any}>(this.beUrl+'api/allorders', { headers:this.reqHeaders, params:params, observe: 'response'}); let obs = this.http.get<{message: string, orders: any}>(this.beUrl+'api/allorders', { headers:this.reqHeaders, params:params, observe: 'response'});
obs.subscribe((OrdersData) => { obs.subscribe((OrdersData) => {
if (OrdersData.status == 200 ){ if (OrdersData.status == 200 ){
@ -154,7 +145,7 @@ export class OrderService {
addToOrder(lineItem: LineItem) { addToOrder(lineItem: LineItem) {
if(this.dataStore.order._id != null) { if(this.dataStore.order._id != null) {
this.dataStore.order.lines.push(lineItem); this.dataStore.order.lines.push(lineItem);
let obs = this.http.post(this.beUrl+'api/order', { payload: this.dataStore.order }, { headers: this.reqHeaders, params: this.reqParams }); let obs = this.http.post(this.beUrl+'api/order', { payload: this.dataStore.order }, { headers: this.reqHeaders });
obs.subscribe((orderData) => { obs.subscribe((orderData) => {
this.getOrder(); this.getOrder();
}); });
@ -177,14 +168,11 @@ export class OrderService {
paid: false, paid: false,
externalInvoice: '', externalInvoice: '',
shortCode: '', shortCode: '',
token: '',
taxAmount: 0,
vatAmount: 0,
tipAmount: 0,
lines: [lineItem] lines: [lineItem]
}; };
let obs = this.http.post<{message: string, order: Order}>(this.beUrl+'api/order', {payload: order}, { headers: this.reqHeaders, params: this.reqParams }); let obs = this.http.post<{message: string, order: Order}>(this.beUrl+'api/order', {payload: order}, { headers: this.reqHeaders });
obs.subscribe((orderData) => { obs.subscribe((orderData) => {
console.log('Created order');
this.getOrder() this.getOrder()
}); });
@ -192,7 +180,7 @@ export class OrderService {
} }
cancelOrder(id: string) { cancelOrder(id: string) {
let obs = this.http.delete<{message: string}>(this.beUrl+'api/order/'+id, { headers: this.reqHeaders, params: this.reqParams }); let obs = this.http.delete<{message: string}>(this.beUrl+'api/order/'+id, { headers: this.reqHeaders });
obs.subscribe((OrderResponse) => { obs.subscribe((OrderResponse) => {
console.log('Order deleted'); console.log('Order deleted');
@ -209,10 +197,6 @@ export class OrderService {
paid: false, paid: false,
externalInvoice: '', externalInvoice: '',
shortCode: '', shortCode: '',
token: '',
taxAmount: 0,
vatAmount: 0,
tipAmount: 0,
lines: [ lines: [
{ {
qty: 1, qty: 1,
@ -227,22 +211,15 @@ export class OrderService {
return obs; return obs;
} }
async updateTip(amt: number){
this.dataStore.order.tipAmount = amt;
let obs = this.http.post(this.beUrl+'api/order', {payload: this.dataStore.order}, {headers: this.reqHeaders, params: this.reqParams, observe: 'response'});
const res1 = await lastValueFrom(obs);
return res1;
}
closeOrder(paid: boolean){ closeOrder(paid: boolean){
this.fullnodeService.priceUpdate.subscribe((price) => { this.fullnodeService.priceUpdate.subscribe((price) => {
this.dataStore.order.price = price; this.dataStore.order.price = price;
}); });
this.dataStore.order.closed = true; this.dataStore.order.closed = true;
this.dataStore.order.paid = paid; this.dataStore.order.paid = paid;
let obs = this.http.post(this.beUrl+'api/order', {payload: this.dataStore.order}, { headers: this.reqHeaders, params: this.reqParams }); let obs = this.http.post(this.beUrl+'api/order', {payload: this.dataStore.order}, { headers: this.reqHeaders });
obs.subscribe((orderData) => { obs.subscribe((orderData) => {
//console.log('Closed order', orderData); console.log('Closed order', orderData);
this.dataStore.order = { this.dataStore.order = {
address: '', address: '',
session: '', session: '',
@ -255,10 +232,6 @@ export class OrderService {
paid: false, paid: false,
externalInvoice: '', externalInvoice: '',
shortCode: '', shortCode: '',
token: '',
taxAmount: 0,
vatAmount: 0,
tipAmount: 0,
lines: [ lines: [
{ {
qty: 1, qty: 1,

View file

@ -7,12 +7,21 @@ export interface Owner {
taxValue: number; taxValue: number;
vat: boolean; vat: boolean;
vatValue: number; vatValue: number;
first: string;
last: string;
email: string;
street: string;
city: string;
state: string;
postal: string;
phone: string;
paid: boolean; paid: boolean;
website: string;
country: string;
zats: boolean; zats: boolean;
invoices: boolean; invoices: boolean;
expiration: string; expiration: string;
payconf: boolean; payconf: boolean;
crmToken: string;
viewkey: string; viewkey: string;
tips: boolean; crmToken: string;
} }

View file

@ -12,11 +12,11 @@
<div style="font-weight: 700; <div style="font-weight: 700;
font-size: 25px; font-size: 25px;
text-align: center;"> text-align: center;">
{{ vE.pmtserviceInvalidOwnerid }} Invalid Owner ID!!
</div> </div>
<div style="height: 40px;"> <div style="height: 40px;">
</div> </div>
{{ vE.pmtservicePaymentNotprocessed }} Payment request was not processed!!
<div style="height: 20px;"> <div style="height: 20px;">
</div> </div>
</div> </div>
@ -24,15 +24,15 @@
<div style="height: 50px;"> <div style="height: 50px;">
</div> </div>
<div style="font-weight: 700; <div style="font-weight: 700;
fonT-size: 25px; font-size: 25px;
text-align: center;"> text-align: center;">
{{ vE.pmtservicePmtsrvNot }}<br> Payment service not<br>
{{ vE.pmtserviceEnabledFor }}<br> enabled for<br>
{{ shop }} {{ owner.name}}
</div> </div>
<div style="height: 40px;"> <div style="height: 40px;">
</div> </div>
{{ vE.pmtservicePaymentNotprocessed }} Payment request was not processed!!
<div style="height: 20px;"> <div style="height: 20px;">
</div> </div>
</div> </div>
@ -43,12 +43,11 @@
<div style="font-weight: 700; <div style="font-weight: 700;
font-size: 25px; font-size: 25px;
text-align: center;"> text-align: center;">
{{ vE.pmtserviceConnectoXero }}<br> Connection to Xero<br>server failed!!
{{ vE.pmtserviceServerFailed }}
</div> </div>
<div style="height: 40px;"> <div style="height: 40px;">
</div> </div>
{{ vE.pmtservicePaymentNotprocessed }} Payment request was not processed!!
<div style="height: 20px;"> <div style="height: 20px;">
</div> </div>
</div> </div>
@ -59,11 +58,11 @@
<div style="font-weight: 700; <div style="font-weight: 700;
font-size: 25px; font-size: 25px;
text-align: center;"> text-align: center;">
{{ vE.pmtserviceInvoiceNum }}<br>{{ pmtData.invoice }}<br>{{ vE.pmtserviceInvoiceNotfound }} Invoice<br>{{ pmtData.invoice }}<br>not found!!
</div> </div>
<div style="height: 40px;"> <div style="height: 40px;">
</div> </div>
{{ vE.pmtservicePaymentNotprocessed }} Payment request was not processed!!
<div style="height: 20px;"> <div style="height: 20px;">
</div> </div>
</div> </div>
@ -74,11 +73,11 @@
<div style="font-weight: 700; <div style="font-weight: 700;
font-size: 25px; font-size: 25px;
text-align: center;"> text-align: center;">
{{ vE.pmtserviceInvoiceNum }}<br>{{ pmtData.invoice }}<br>{{ vE.pmtserviceInvoiceInvalid }} Invoice<br>{{ pmtData.invoice }}<br>type invalid!!
</div> </div>
<div style="height: 40px;"> <div style="height: 40px;">
</div> </div>
{{ vE.pmtservicePaymentNotprocessed }} Payment request was not processed!!
<div style="height: 20px;"> <div style="height: 20px;">
</div> </div>
</div> </div>
@ -89,11 +88,11 @@
<div style="font-weight: 700; <div style="font-weight: 700;
font-size: 25px; font-size: 25px;
text-align: center;"> text-align: center;">
{{ vE.pmtserviceInvoiceNum }}<br>{{ pmtData.invoice }}<br>{{ vE.pmtserviceInvoicePaid }} Invoice <br>{{ pmtData.invoice }}<br>already paid!!
</div> </div>
<div style="height: 40px;"> <div style="height: 40px;">
</div> </div>
{{ vE.pmtservicePaymentNotprocessed }} Payment request was not processed!!
<div style="height: 20px;"> <div style="height: 20px;">
</div> </div>
</div> </div>
@ -104,11 +103,11 @@
<div style="font-weight: 700; <div style="font-weight: 700;
font-size: 25px; font-size: 25px;
text-align: center;"> text-align: center;">
{{ vE.pmtserviceInvoiceCurrency }}<br>[ {{ pmtData.currency }} ]<br>{{ vE.pmtserviceCurrencyNotsup }} Currency <br>[ {{ pmtData.currency }} ]<br>not supported!!
</div> </div>
<div style="height: 40px;"> <div style="height: 40px;">
</div> </div>
{{ vE.pmtservicePaymentNotprocessed }} Payment request was not processed!!
<div style="height: 20px;"> <div style="height: 20px;">
</div> </div>
</div> </div>
@ -119,27 +118,27 @@
<div style="font-weight: 700; <div style="font-weight: 700;
font-size: 25px; font-size: 25px;
text-align: center;"> text-align: center;">
{{ vE.pmtserviceAmountDoesnot }}<br> Amount does not<br>
{{ vE.pmtserviceMatchValue }}<br> match value<br>
{{ vE.pmtserviceReportedByxero }} reported by Xero!!
</div> </div>
<div style="height: 40px;"> <div style="height: 40px;">
</div> </div>
{{ vE.pmtservicePaymentNotprocessed }} Payment request was not processed!!
<div style="height: 20px;"> <div style="height: 20px;">
</div> </div>
</div> </div>
<div class="invoiceDetail" <div class="invoiceDetail"
*ngIf="reportType==0" *ngIf="reportType==0"
> id="invoice">
<div class="invoiceHdrTxt1">{{ vE.pmtserviceHdrTxt1 }}</div> <div class="invoiceHdrTxt1">Invoice</div>
<div class="invoiceHdrTxt2">{{ vE.pmtserviceHdrTxt2 }}{{orderId}}</div> <div class="invoiceHdrTxt2">Order ID: {{orderId}}</div>
<div class="invoiceHdrTxt3">{{ vE.pmtserviceHdrTxt3 }}{{order.timestamp | date}} <div class="invoiceHdrTxt3">Date:{{order.timestamp | date}}
</div> </div>
<div style="height: 10px;"></div> <div style="height: 10px;"></div>
<div class="zecData">{{ vE.pmtserviceZecdataPrice }}{{order.price | number: '1.02' | currency: order.currency.toUpperCase()}}</div> <div class="zecData">Zcash Price: {{order.price | number: '1.02' | currency: order.currency.toUpperCase()}}</div>
<div style="height: 2px;"></div> <div style="height: 2px;"></div>
<div class="zecData">{{ vE.pmtserviceZecdataTotal }}<img class="zecSign" src="/assets/zec_rv.png" />{{order.totalZec | number: '1.08'}} <div class="zecData">Total: <img class="zecSign" src="/assets/zec_rv.png" />{{order.totalZec | number: '1.08'}}
</div> </div>
<div> <div>
<div style="height: 10px;"></div> <div style="height: 10px;"></div>
@ -148,15 +147,15 @@
<tr class="invoice-title"> <tr class="invoice-title">
<th width="55%" <th width="55%"
class="detailTitle1"> class="detailTitle1">
{{ vE.pmtserviceInvoiceItem }} Item
</th> </th>
<th width="15%" <th width="15%"
class="detailTitle1"> class="detailTitle1">
{{ vE.pmtserviceInvoiceQty }} Qty.
</th> </th>
<th width="30%" <th width="30%"
class="detailTitle2"> class="detailTitle2">
{{ vE.pmtserviceInvoicePrice }} ({{order.currency.toUpperCase()}}) Price ({{order.currency.toUpperCase()}})
</th> </th>
</tr> </tr>
<tr class="invoice-detail" <tr class="invoice-detail"
@ -177,7 +176,7 @@
<tr class="invoice-title"> <tr class="invoice-title">
<th width="55%" <th width="55%"
class="detailLineRight"> class="detailLineRight">
{{ vE.pmtserviceInvoiceTotal }} Invoice Total:
</th> </th>
<th width="15%" <th width="15%"
class="detailLineLeft"> class="detailLineLeft">
@ -199,14 +198,14 @@
text-align: center;"> text-align: center;">
<p *ngIf="order.paid"> <p *ngIf="order.paid">
<fa-icon [icon]="faCheck" <fa-icon [icon]="faCheck"
color="primary"></fa-icon>&nbsp;{{ vE.pmtservicePaymentConfirmed }}</p> color="primary"></fa-icon>&nbsp;Payment confirmed</p>
<p *ngIf="!order.paid"> <p *ngIf="!order.paid">
<fa-icon [style]="getIconStyle(order)" <fa-icon [style]="getIconStyle(order)"
[icon]="faHourglass"></fa-icon>&nbsp;{{ vE.pmtservicePaymentPending }}</p> [icon]="faHourglass"></fa-icon>&nbsp;Payment pending!!</p>
</td> </td>
<td width="25%"> <td width="25%">
<div style="text-align: right;" <div style="text-align: right;"
id="invoice-qr" id="payment-qr"
*ngIf="!order.paid"></div> *ngIf="!order.paid"></div>
</td> </td>
</tr> </tr>
@ -217,7 +216,7 @@
font-weight: 700; font-weight: 700;
font-style: italic; font-style: italic;
text-align: center;"> text-align: center;">
{{ vE.pmtserviceScanQrcode }} Scan the QR code with your wallet to make payment
</div> </div>
<div style="text-align: center; <div style="text-align: center;
margin-top: 10px; margin-top: 10px;
@ -225,7 +224,7 @@
<div style="font-family: 'Spartan'; <div style="font-family: 'Spartan';
font-size: 14px; font-size: 14px;
line-height: 20px;"> line-height: 20px;">
{{ vE.pmtserviceCantScan }}<br>{{ vE.pmtserviceUseThis }}<a [href]="zcashUrl">{{ vE.pmtserviceWalletLink }}</a>, or Can't scan?<br>Use this <a [href]="zcashUrl">wallet link</a>, or
</div> </div>
<div style="display: flex; <div style="display: flex;
justify-content: space-between;"> justify-content: space-between;">
@ -233,18 +232,18 @@
font-weight: 700; font-weight: 700;
background-color: lightgray;" background-color: lightgray;"
mat-raised-button mat-raised-button
(click)="copyAddress()">{{ vE.pmtserviceCopyAddress }}</button> (click)="copyAddress()">Copy Address</button>
<button style="margin-top: 20px; <button style="margin-top: 20px;
font-weight: 700; font-weight: 700;
background-color: lightgray;" background-color: lightgray;"
mat-raised-button mat-raised-button
(click)="copyAmount()">{{ vE.pmtserviceCopyAmount }}</button> (click)="copyAmount()">Copy Amount</button>
</div> </div>
<button style="margin-top: 20px; <button style="margin-top: 20px;
font-weight: 700; font-weight: 700;
background-color: lightgray;" background-color: lightgray;"
mat-raised-button mat-raised-button
(click)="copyMemo()">{{ vE.pmtserviceCopyMemo }}</button> (click)="copyMemo()">Copy Memo</button>
</div> </div>

View file

@ -1,9 +1,11 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { ActivatedRoute} from "@angular/router"; import { Router, ActivatedRoute, Params } from "@angular/router";
import { HttpClient, HttpParams, HttpHeaders } from "@angular/common/http"; import { HttpClient, HttpParams, HttpHeaders } from "@angular/common/http";
import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; import { DomSanitizer, SafeUrl } from '@angular/platform-browser';
import { PmtData } from "./pmtservice.model"; import { PmtData } from "./pmtservice.model";
import { XeroInvoice } from "./xeroinvoice.model"; import { XeroInvoice } from "./xeroinvoice.model";
import { Owner } from '../owner.model';
// import { Item } from '../items/item.model'
import { Order } from '../order/order.model' import { Order } from '../order/order.model'
import { ConfigData } from '../configdata'; import { ConfigData } from '../configdata';
import { faCheck, faHourglass } from '@fortawesome/free-solid-svg-icons'; import { faCheck, faHourglass } from '@fortawesome/free-solid-svg-icons';
@ -14,308 +16,376 @@ var QRCode = require('easyqrcodejs');
var URLSafeBase64 = require('urlsafe-base64'); var URLSafeBase64 = require('urlsafe-base64');
var Buffer = require('buffer/').Buffer; var Buffer = require('buffer/').Buffer;
import { LanguageService } from '../language.service';
@Component({ @Component({
selector: 'app-pmtservice', selector: 'app-pmtservice',
templateUrl: './pmtservice.component.html', templateUrl: './pmtservice.component.html',
styleUrls: ['./pmtservice.component.css'] styleUrls: ['./pmtservice.component.css']
}) })
export class PmtserviceComponent implements OnInit { export class PmtserviceComponent implements OnInit {
faCheck = faCheck; faCheck = faCheck;
faHourglass = faHourglass; faHourglass = faHourglass;
beUrl = ConfigData.Be_URL; beUrl = ConfigData.Be_URL;
private reqHeaders: HttpHeaders = new HttpHeaders(); private reqHeaders: HttpHeaders = new HttpHeaders();
public shop: string = ''; public pmtData : PmtData = {
public pmtData : PmtData = { ownerId :'',
ownerId :'', invoice: '',
invoice: '', amount: 0,
amount: 0, currency: '',
currency: '', shortcode: ''
shortcode: '' };
};
public invData : XeroInvoice = { public invData : XeroInvoice = {
inv_Type : '', inv_Type : '',
inv_Id : '', inv_Id : '',
inv_No : '', inv_No : '',
inv_Contact : '', inv_Contact : '',
inv_Currency : '', inv_Currency : '',
inv_CurrencyRate : 0, inv_CurrencyRate : 0,
inv_Status : '', inv_Status : '',
inv_Total : 0, inv_Total : 0,
inv_Date : new Date(), inv_Date : new Date(),
inv_shortCode : '', inv_shortCode : '',
inv_ProcDate : new Date() inv_ProcDate : new Date()
}; };
public owner: Owner = {
_id: '',
address: '',
name: '',
currency: 'usd',
tax: false,
taxValue: 0,
vat: false,
vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false,
website: '',
country: '',
zats: false,
invoices: false,
expiration: new Date(Date.now()).toISOString(),
payconf: false,
viewkey: '',
crmToken: ''
};
public order: Order = {
_id : '',
address: '',
session: '',
timestamp: '',
closed: false,
currency: '',
price: 0,
total: 0,
totalZec: 0,
paid: false,
externalInvoice: '',
shortCode: '',
lines: [
{
qty: 1,
name: '',
cost:0
}
]
};
private invData_raw : string = '';
private invData_buff : any = null;
public reportType = 1000;
public Status = 0;
codeString: string = '';
zcashUrl: SafeUrl = '';
zPrice: number = 1.0;
name: string = '';
error: boolean = false;
orderId : string = '';
constructor(private activatedRoute : ActivatedRoute,
private http : HttpClient,
private sanitizer: DomSanitizer,
private notifierService : NotifierService ) {}
ngOnInit() {
var auth = 'Basic ' + Buffer.from(ConfigData.UsrPwd).toString('base64');
this.reqHeaders = new HttpHeaders().set('Authorization', auth);
this.activatedRoute.queryParams.subscribe((params) => {
this.pmtData.ownerId = params["owner"];
this.pmtData.invoice = params["invoiceNo"];
this.pmtData.amount = params["amount"];
this.pmtData.currency = params["currency"];
this.pmtData.shortcode = params["shortCode"];
// console.log(this.pmtData);
this.getInvoiceData( this.pmtData );
});
}
getInvoiceData( reqData : PmtData ) {
//
// Verify owner id ( Status = 1 if not exists )
// ( Status = 2 if service not available for user )
//
// console.log('getOwner -> '+ reqData.ownerId);
// console.log('received amount -> ' + reqData.amount);
const ownParams = new HttpParams().append('id', reqData.ownerId);
let obs = this.http.get<{message:string, owner: any}>
( this.beUrl+'api/ownerid',
{ headers: this.reqHeaders,
params: ownParams,
observe: 'response'});
obs.subscribe((OwnerDataResponse) => {
//console.log('api/getowner', OwnerDataResponse.status);
if (OwnerDataResponse.status == 200) {
this.owner = OwnerDataResponse.body!.owner;
console.log('Owner => ' + this.owner.name );
//
// ==> remove "== false" for production enviroment
//
if ( this.owner.invoices ) {
// process data
console.log("Owner check passed!!!");
this.getXeroInvoiceData( reqData );
} else {
console.log("Owner check failed!!!")
this.reportType = 2;
};
} else {
if ( OwnerDataResponse.status == 204 ) {
console.log('Res.Status = ' + OwnerDataResponse.status)
console.log('Owner id not found!!!');
this.reportType = 1;
}
}});
}
getXeroInvoiceData( reqData : PmtData ) {
/*
// Call test Xero API
let url : string = "http://localhost:3000/xero/" + reqData.invoice;
this.http
.get<any>(url)
*/
console.log('>> find current zcash price');
this.getPrice(this.owner.currency);
console.log('get Invoice -> ' + reqData.invoice);
let invParams = new HttpParams();
invParams = invParams.append('address', this.owner.address);
invParams = invParams.append('inv', reqData.invoice);
let inv = this.http.get<{message:string, invData: any}>
( this.beUrl+'api/invdata',
{ headers: this.reqHeaders,
params: invParams,
observe: 'response'});
inv.subscribe( invDataResponse => {
// console.log('Response from ZGo-Xero');
// console.log(invDataResponse.status);
this.invData_buff = invDataResponse.body;
this.invData.inv_Type = this.invData_buff.invdata.inv_Type;
this.invData.inv_Id = this.invData_buff.invdata.inv_Id;
this.invData.inv_No = this.invData_buff.invdata.inv_No;
this.invData.inv_Contact = this.invData_buff.invdata.inv_Contact;
this.invData.inv_Currency = this.invData_buff.invdata.inv_Currency;
this.invData.inv_CurrencyRate = this.invData_buff.invdata.inv_CurrencyRate;
this.invData.inv_Total = this.invData_buff.invdata.inv_Total;
this.invData.inv_Status = this.invData_buff.invdata.inv_Status;
this.invData.inv_Date = this.invData_buff.invdata.inv_Date;
this.invData.inv_shortCode = reqData.shortcode;
/*
console.log('>>> inv_Type -> ' + this.invData.inv_Type);
console.log('>>> inv_Id -> ' + this.invData.inv_Id);
console.log('>>> inv_No -> ' + this.invData.inv_No);
console.log('>>> inv_Contact -> ' + this.invData.inv_Contact);
console.log('>>> inv_Currency-> ' + this.invData.inv_Currency);
console.log('>>> inv_CurrencyRate -> ' + this.invData.inv_CurrencyRate);
console.log('>>> inv_Total -> ' + this.invData.inv_Total);
console.log('>>> inv_Status-> ' + this.invData.inv_Status);
console.log('>>> inv_Date -> ' + this.invData.inv_Date);
*/
if ( this.invData.inv_Type == 'ACCREC' ) {
console.log('Invoice type is correct!!');
// Test if invoice is not already paid
if ( this.invData.inv_Status == 'AUTHORISED') {
console.log('invoice is payable');
// Test if Invoice's currency is supported
if ( this.invData.inv_Currency == reqData.currency ) {
console.log('Invoice currency supported');
// Test if requested amount is as reported by Xero
if ( this.invData.inv_Total == reqData.amount ) {
console.log('Invoice amount Ok - create Order');
// =====> Create order here
this.createOrder();
//
} else {
console.log('Invoice amount does not match')
this.reportType = 8;
}
} else {
console.log('Invoice currency not supported');
this.reportType = 7;
}
} else {
console.log('Invoice already paid');
this.reportType = 6;
}
} else {
console.log('Invoice type is invalid' );
this.reportType = 5;
}
},
error => {
console.log("Error while getting invData!!!");
console.log(error);
console.log(error.status);
if ( error.status == 500 ) {
// Assume that invoice was not found by haskell server
this.reportType = 4;
}
});
}
public order: Order = { createOrder() {
_id : '', this.reportType = 0;
address: '', // console.log('Starting order generation');
session: '', // console.log('>> find current zcash price');
timestamp: '',
closed: false,
currency: '',
price: 0,
total: 0,
totalZec: 0,
paid: false,
externalInvoice: '',
shortCode: '',
token: '',
taxAmount: 0,
vatAmount: 0,
tipAmount: 0,
lines: [
{
qty: 1,
name: '',
cost:0
}
]
};
private invData_raw : string = ''; this.order = {
private invData_buff : any = null; _id: '',
address: this.owner.address,
session: 'Xero-' + this.owner._id,
currency: this.owner.currency,
timestamp: new Date(Date.now()).toISOString(),
closed: true,
totalZec: this.invData.inv_Total/this.zPrice,
price: this.zPrice,
total: this.invData.inv_Total,
paid: false,
externalInvoice: this.invData.inv_No,
shortCode: this.invData.inv_shortCode,
lines: [{qty: 1,
name: 'Invoice from ' + this.owner.name + '[' + this.invData.inv_No + ']',
cost: this.invData.inv_Total}]
};
public reportType = 0; let obs = this.http.post<{message: string, order: Order}>
public Status = 0; (this.beUrl+'api/orderx',
{payload: this.order},
{ headers: this.reqHeaders }
);
obs.subscribe((orderData) => {
// console.log('Order created');
codeString: string = 'ZGo - The Zcash Register'; // console.log(orderData.order);
zcashUrl: SafeUrl = ''; this.order = orderData.order
zPrice: number = 1.0; console.log('>> order -> ' + JSON.stringify(this.order));
name: string = ''; this.orderId = String(this.order._id);
error: boolean = false;
orderId : string = '';
// -------------------------------------
// Language Support
//
vE = {
pmtserviceInvalidOwnerid : '',
pmtserviceNotservClose : '',
pmtserviceNotservError : '',
pmtserviceCopyNotavail : '',
pmtserviceCopyaddressError : '',
pmtserviceCopyamountError : '',
pmtserviceCopymemoError : '',
pmtservicePaymentNotprocessed : '',
pmtservicePmtsrvNot : '',
pmtserviceEnabledFor : '',
pmtserviceConnectoXero : '',
pmtserviceServerFailed : '',
pmtserviceInvoiceNum : '',
pmtserviceInvoiceNotfound : '',
pmtserviceInvoiceInvalid : '',
pmtserviceInvoicePaid : '',
pmtserviceInvoiceCurrency : '',
pmtserviceCurrencyNotsup : '',
pmtserviceAmountDoesnot : '',
pmtserviceMatchValue : '',
pmtserviceReportedByxero : '',
pmtserviceHdrTxt1 : '',
pmtserviceHdrTxt2 : '',
pmtserviceHdrTxt3 : '',
pmtserviceZecdataPrice : '',
pmtserviceZecdataTotal : '',
pmtserviceInvoiceItem : '',
pmtserviceInvoiceQty : '',
pmtserviceInvoicePrice : '',
pmtserviceInvoiceTotal : '',
pmtservicePaymentConfirmed : '',
pmtservicePaymentPending : '',
pmtserviceScanQrcode : '',
pmtserviceCantScan : '',
pmtserviceUseThis : '',
pmtserviceWalletLink : '',
pmtserviceCopyAddress : '',
pmtserviceCopyAmount : '',
pmtserviceCopyMemo : ''
}
//
constructor(private activatedRoute : ActivatedRoute,
private http : HttpClient,
private sanitizer: DomSanitizer,
private notifierService : NotifierService,
private languageService : LanguageService ){
var auth = 'Basic ' + Buffer.from(ConfigData.UsrPwd).toString('base64');
this.reqHeaders = new HttpHeaders().set('Authorization', auth);
this.activatedRoute.queryParams.subscribe((params) => {
this.pmtData.ownerId = params["owner"];
this.pmtData.invoice = params["invoiceNo"];
this.pmtData.amount = +params["amount"];
this.pmtData.currency = params["currency"];
this.pmtData.shortcode = params["shortCode"];
this.getInvoiceData( this.pmtData );
});
this.chgUILanguage();
}
ngOnInit() { // console.log('Generating QRCode....')
}
getInvoiceData( reqData : PmtData ) { this.codeString = `zcash:${this.order.address}?amount=${this.order.totalZec.toFixed(8)}&memo=${URLSafeBase64.encode(Buffer.from('ZGo Order::'.concat(this.orderId)))}`;
//this.getXeroInvoiceData( reqData );
let obs = this.http.post<{reportType: number, order: Order, shop: string}>
(this.beUrl+'invdata',
{payload: reqData},
{headers: this.reqHeaders, observe: 'response' }
);
obs.subscribe((invoiceData) => {
if(invoiceData.status == 201) {
this.reportType = invoiceData.body!.reportType;
this.order = invoiceData.body!.order;
this.shop = invoiceData.body!.shop;
this.orderId = String(this.order._id);
// console.log('Generating QRCode....') var qrcode = new QRCode(document.getElementById("payment-qr"), {
text: this.codeString,
logo: "/assets/zcash.png",
width: 180,
height: 180,
logoWidth: 50,
logoHeight: 50,
correctLevel: QRCode.CorrectLevel.H
});
this.codeString = `zcash:${this.order.address}?amount=${this.order.totalZec.toFixed(8)}&memo=${URLSafeBase64.encode(Buffer.from('ZGo Order::'.concat(this.orderId).concat(' Invoice: ').concat(this.order.externalInvoice)))}`; this.codeString = `zcash:${this.order.address}?amount=${this.order.totalZec.toFixed(8)}&memo=${URLSafeBase64.encode(Buffer.from('ZGo Order::'.concat(this.orderId)))}`;
this.zcashUrl = this.sanitizer.bypassSecurityTrustUrl(this.codeString);
}, error => {
console.log(error.message);
var qrcode = new QRCode(document.getElementById("invoice-qr"), { });
text: this.codeString, }
logo: "/assets/zcash.png",
width: 180,
height: 180,
logoWidth: 50,
logoHeight: 50,
correctLevel: QRCode.CorrectLevel.H
});
this.zcashUrl = this.sanitizer.bypassSecurityTrustUrl(this.codeString); getIconStyle(order : Order) {
} else { if( order.paid )
this.reportType = invoiceData.body!.reportType; return "font-size: 14px; color: #72cc50; margin-bottom: -2px;";
console.log('reportType ' + invoiceData.body!.reportType + ' code ' + invoiceData.status); return "color: #FB4F14; margin-bottom: -2px; cursor: pointer;";
}
});
}
getIconStyle(order : Order) { }
if( order.paid )
return "font-size: 14px; color: #72cc50; margin-bottom: -2px;";
return "color: #FB4F14; margin-bottom: -2px; cursor: pointer;";
} getPrice(currency: string){
//var currency = 'usd';
const params = new HttpParams().append('currency', currency);
let obs = this.http.get<{message: string, price: any}>(this.beUrl+'api/price', { headers:this.reqHeaders, params: params, observe: 'response'});
obs.subscribe((PriceData) => {
if (PriceData.status == 200) {
this.zPrice = PriceData.body!.price.price;
console.log("price", this.zPrice);
} else {
console.log('No price found for currency', currency);
this.zPrice = 1.0;
}
});
return obs;
}
copyAddress() { copyAddress() {
if (!navigator.clipboard) { if (!navigator.clipboard) {
// alert("Copy functionality not supported"); // alert("Copy functionality not supported");
this.notifierService this.notifierService
.showNotification(this.vE.pmtserviceCopyNotavail, .showNotification("Copy functionality not supported","Close","error");
this.vE.pmtserviceNotservClose, }
"error", try {
this.vE.pmtserviceNotservError); navigator.clipboard.writeText(this.order.address);
} } catch (err) {
try { this.notifierService
navigator.clipboard.writeText(this.order.address); .showNotification("Error copying address","Close","error");
} catch (err) { // console.error("Error", err);
this.notifierService }
.showNotification(this.vE.pmtserviceCopyaddressError, }
this.vE.pmtserviceNotservClose, copyAmount() {
"error", if (!navigator.clipboard) {
this.vE.pmtserviceNotservError); // alert("Copy functionality not supported");
// console.error("Error", err); this.notifierService
} .showNotification("Copy functionality not supported","Close","error");
} }
try {
copyAmount() { navigator.clipboard.writeText(this.order.totalZec.toString());
if (!navigator.clipboard) { } catch (err) {
// alert("Copy functionality not supported"); this.notifierService
this.notifierService .showNotification("Error while copying ammount","Close","error");
.showNotification(this.vE.pmtserviceCopyNotavail, // console.error("Error", err);
this.vE.pmtserviceNotservClose, }
"error", }
this.vE.pmtserviceNotservError);
}
try {
navigator.clipboard.writeText(this.order.totalZec.toString());
} catch (err) {
this.notifierService
.showNotification(this.vE.pmtserviceCopyamountError,
this.vE.pmtserviceNotservClose,
"error",
this.vE.pmtserviceNotservError);
// console.error("Error", err);
}
}
copyMemo() {
if (!navigator.clipboard) {
// alert("Copy functionality not supported");
this.notifierService
.showNotification(this.vE.pmtserviceCopyNotavail,
this.vE.pmtserviceNotservClose,
"error",
this.vE.pmtserviceNotservError);
}
try {
navigator.clipboard.writeText("ZGo Order::" + this.orderId + " Invoice: " + this.order.externalInvoice);
} catch (err) {
this.notifierService
.showNotification(this.vE.pmtserviceCopymemoError,
this.vE.pmtserviceNotservClose,
"error",
this.vE.pmtserviceNotservError);
// console.error("Error", err);
}
}
chgUILanguage(){
console.log('PMTSERVICE.chgUILanguage Called ');
this.languageService.getViewElements('pmtservice').subscribe(
response => {
console.log('Received >> ', response );
console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component);
console.log('Language data : ',response.data);
this.vE.pmtserviceInvalidOwnerid = response.data.pmtservice_invalid_ownerid;
this.vE.pmtserviceNotservClose = response.data.pmtservice_notserv_close;
this.vE.pmtserviceNotservError = response.data.pmtservice_notserv_error;
this.vE.pmtserviceCopyNotavail = response.data.pmtservice_copy_notavail;
this.vE.pmtserviceCopyaddressError = response.data.pmtservice_copyaddress_error;
this.vE.pmtserviceCopyamountError = response.data.pmtservice_copyamount_error;
this.vE.pmtserviceCopymemoError = response.data.pmtservice_copymemo_error;
this.vE.pmtservicePaymentNotprocessed = response.data.pmtservice_payment_notprocessed;
this.vE.pmtservicePmtsrvNot = response.data.pmtservice_pmtsrv_not;
this.vE.pmtserviceEnabledFor = response.data.pmtservice_enabled_for;
this.vE.pmtserviceConnectoXero = response.data.pmtservice_connecto_xero;
this.vE.pmtserviceServerFailed = response.data.pmtservice_server_failed;
this.vE.pmtserviceInvoiceNum = response.data.pmtservice_invoice_num;
this.vE.pmtserviceInvoiceNotfound = response.data.pmtservice_invoice_notfound;
this.vE.pmtserviceInvoiceInvalid = response.data.pmtservice_invoice_invalid;
this.vE.pmtserviceInvoicePaid = response.data.pmtservice_invoice_paid;
this.vE.pmtserviceInvoiceCurrency = response.data.pmtservice_invoice_currency;
this.vE.pmtserviceCurrencyNotsup = response.data.pmtservice_currensy_notsup;
this.vE.pmtserviceAmountDoesnot = response.data.pmtservice_amount_doesnot;
this.vE.pmtserviceMatchValue = response.data.pmtservice_match_value;
this.vE.pmtserviceReportedByxero = response.data.pmtservice_reported_byxero;
this.vE.pmtserviceHdrTxt1 = response.data.pmtservice_hdr_txt1;
this.vE.pmtserviceHdrTxt2 = response.data.pmtservice_hdr_txt2;
this.vE.pmtserviceHdrTxt3 = response.data.pmtservice_hdr_txt3;
this.vE.pmtserviceZecdataPrice = response.data.pmtservice_zecdata_price;
this.vE.pmtserviceZecdataTotal = response.data.pmtservice_zecdata_total;
this.vE.pmtserviceInvoiceItem = response.data.pmtservice_invoice_item;
this.vE.pmtserviceInvoiceQty = response.data.pmtservice_invoice_qty;
this.vE.pmtserviceInvoicePrice = response.data.pmtservice_invoice_price;
this.vE.pmtserviceInvoiceTotal = response.data.pmtservice_invoice_total;
this.vE.pmtservicePaymentConfirmed = response.data.pmtservice_payment_confirmed;
this.vE.pmtservicePaymentPending = response.data.pmtservice_payment_pending;
this.vE.pmtserviceScanQrcode = response.data.pmtservice_scan_qrcode;
this.vE.pmtserviceCantScan = response.data.pmtservice_cant_scan;
this.vE.pmtserviceUseThis = response.data.pmtservice_use_this;
this.vE.pmtserviceWalletLink = response.data.pmtservice_wallet_link;
this.vE.pmtserviceCopyAddress = response.data.pmtservice_copy_address;
this.vE.pmtserviceCopyAmount = response.data.pmtservice_copy_amount;
this.vE.pmtserviceCopyMemo = response.data.pmtservice_copy_memo;
},
error => { console.log('Error >> ',error); }
);
}
copyMemo() {
if (!navigator.clipboard) {
// alert("Copy functionality not supported");
this.notifierService
.showNotification("Copy functionality not supported","Close","error");
}
try {
navigator.clipboard.writeText("ZGo Order::" + this.orderId);
} catch (err) {
this.notifierService
.showNotification("Error while copying Memo","Close","error");
// console.error("Error", err);
}
}
} }

View file

@ -1,8 +1,3 @@
::ng-deep .mdc-button__label {
font-family: "Spartan" sans-serif;
font-size: 14px;
font-weight: 600;
}
::ng-deep .invoice { ::ng-deep .invoice {
font-family: "Spartan"; font-family: "Spartan";

View file

@ -1,8 +1,8 @@
<div class="invoice" > <div class="container" style="margin-top: 10px;">
{{ vE.promptinvoiceSendLink }}
</div>
<div class="container" style="padding: 10px;" > <div class="invoice" >
Send the invoice link to your client:
</div>
<table style="width:100%; <table style="width:100%;
margin-top: 10px;"> margin-top: 10px;">
@ -10,23 +10,23 @@
<tr> <tr>
<th class="urlLabel" <th class="urlLabel"
style="text-align: left;" style="text-align: left;"
width="94%">{{ vE.promptinvoiceInvoiceUrl }} width="94%">Invoice URL:
</th> </th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
<tr> <tbody>
<td class="urlDetail" <td class="urlDetail"
style="text-align: left;" style="text-align: left;"
width="94%"> width="94%">
<div> <div>
<textarea matInput readonly <textarea
style="border: none; style="border: none;
outline: none; outline: none;
width: 95%;" width: 95%;"
cdkTextareaAutosize cdkTextareaAutosize
cdkAutosizeMinRows="1" cdkAutosizeMinRows="1"
cdkAutosizeMaxRows="5">{{ invoiceUrl }} cdkAutosizeMaxRows="4">{{ invoiceUrl }}
</textarea> </textarea>
</div> </div>
@ -39,7 +39,7 @@
</a> </a>
</td> </td>
</tr> </tbody>
</table> </table>
<mat-dialog-actions> <mat-dialog-actions>
@ -49,12 +49,12 @@
<button mat-raised-button <button mat-raised-button
class="text" class="text"
color="primary" (click)="confirm()"> color="primary" (click)="confirm()">
<mat-icon class="icon">verified_user</mat-icon>{{vE.promptinvoiceInvoiceSent}} <mat-icon class="icon">verified_user</mat-icon>Sent!
</button> </button>
</td> </td>
<td align="right"> <td align="right">
<button mat-raised-button class="text" (click)="close()"> <button mat-raised-button class="text" (click)="close()">
<mat-icon class="icon">close</mat-icon>{{vE.promptinvoiceInvoiceCancel}} <mat-icon class="icon">close</mat-icon>Cancel
</button> </button>
</td> </td>
</tr> </tr>

View file

@ -4,9 +4,6 @@ import { MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';
import { NotifierService } from '../notifier.service'; import { NotifierService } from '../notifier.service';
import { faCopy } from '@fortawesome/free-solid-svg-icons'; import { faCopy } from '@fortawesome/free-solid-svg-icons';
import { LanguageService } from '../language.service';
import { LanguageData } from '../language.model';
var URLSafeBase64 = require('urlsafe-base64'); var URLSafeBase64 = require('urlsafe-base64');
var Buffer = require('buffer/').Buffer; var Buffer = require('buffer/').Buffer;
@ -18,39 +15,22 @@ var Buffer = require('buffer/').Buffer;
export class PromptInvoiceComponent implements OnInit { export class PromptInvoiceComponent implements OnInit {
orderId: string; orderId: string;
orderToken: string = '';
invoiceUrl: string; invoiceUrl: string;
// ------------------------------------ // ------------------------------------
// //
faCopy = faCopy; faCopy = faCopy;
// ------------------------------------ // ------------------------------------
// -------------------------------------
// Language Support
//
vE = {
promptinvoiceSendLink : '',
promptinvoiceNotservClose : '',
promptinvoiceNotservError : '',
promptinvoiceNotservSuccess : '',
propmtinvoiceInvoiceClipboard : '',
promptinvoiceFuncNotavail : '',
promptinvoiceInvoiceUrl : '',
promptinvoiceInvoiceSent : '',
promptinvoiceInvoiceCancel : ''
}
//
constructor( constructor(
private languageService : LanguageService,
private dialogRef: MatDialogRef<PromptInvoiceComponent>, private dialogRef: MatDialogRef<PromptInvoiceComponent>,
@Inject(MAT_DIALOG_DATA) public data: {orderId: string, orderToken: string}, @Inject(MAT_DIALOG_DATA) public data: {orderId: string},
private notifierService : NotifierService ) { private notifierService : NotifierService ) {
this.orderId = data.orderId; this.orderId = data.orderId;
this.orderToken = data.orderToken; this.invoiceUrl = 'https://app.zgo.cash/invoice/'+this.orderId;
this.invoiceUrl = 'https://app.zgo.cash/invoice/'+this.orderId + '?token=' + this.orderToken;
} }
ngOnInit(): void { ngOnInit(): void {
this.chgUILanguage();
} }
@ -69,44 +49,12 @@ export class PromptInvoiceComponent implements OnInit {
try { try {
navigator.clipboard.writeText(this.invoiceUrl); navigator.clipboard.writeText(this.invoiceUrl);
this.notifierService this.notifierService
.showNotification(this.vE.propmtinvoiceInvoiceClipboard, .showNotification("Invoice's URL copied to Clipboard!!","Close",'success');
this.vE.promptinvoiceNotservClose,
'success',
this.vE.promptinvoiceNotservSuccess);
} catch (err) { } catch (err) {
// console.error("Error", err); // console.error("Error", err);
this.notifierService this.notifierService
.showNotification(this.vE.promptinvoiceFuncNotavail, .showNotification("Functionality not available for your browser. Use send button instead.","Close",'error');
this.vE.promptinvoiceNotservClose,
'error',
this.vE.promptinvoiceNotservError);
} }
} }
chgUILanguage(){
console.log('PROMPTINVOICE.chgUILanguage Called ');
this.languageService.getViewElements('promptinvoice').subscribe(
response => {
console.log('Received >> ', response );
console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component);
console.log('Language data : ',response.data);
this.vE.promptinvoiceSendLink = response.data.promptinvoice_send_link;
this.vE.promptinvoiceNotservClose = response.data.promptinvoice_notserv_close;
this.vE.promptinvoiceNotservError = response.data.promptinvoice_notserv_error;
this.vE.promptinvoiceNotservSuccess = response.data.promptinvoice_notserv_success;
this.vE.propmtinvoiceInvoiceClipboard = response.data.promptinvoice_invoice_clipboard;
this.vE.promptinvoiceFuncNotavail = response.data.promptinvoice_func_notavail;
this.vE.promptinvoiceInvoiceUrl = response.data.promptinvoice_invoice_url;
this.vE.promptinvoiceInvoiceSent = response.data.promptinvoice_invoice_sent;
this.vE.promptinvoiceInvoiceCancel = response.data.promptinvoice_invoice_cancel;
},
error => { console.log('Error >> ',error); }
);
}
} }

View file

@ -1,8 +1,3 @@
::ng-deep .mdc-button__label {
font-family: "Spartan" sans-serif;
font-size: 14px;
font-weight: 600;
}
::ng-deep .invoice { ::ng-deep .invoice {
font-family: "Spartan"; font-family: "Spartan";

View file

@ -1,17 +1,16 @@
<div class="invoice" > <div class="container" style="margin-top: 10px;">
{{ vE.promptreceiptSendLink }}
</div> <div class="invoice" >
Send the receipt link to your client:
</div>
<div class="container"
style="margin-top: 10px;
padding: 15px;">
<table style="width:100%; <table style="width:100%;
margin-top: 10px;"> margin-top: 10px;">
<thead style="width: 100%;"> <thead style="width: 100%;">
<tr> <tr>
<th class="urlLabel" <th class="urlLabel"
style="text-align: left;" style="text-align: left;"
width="94%">{{ vE.promptreceiptReceiptUrl }} width="94%">Receipt URL:
</th> </th>
<th></th> <th></th>
</tr> </tr>
@ -21,13 +20,13 @@
style="text-align: left;" style="text-align: left;"
width="94%"> width="94%">
<div> <div>
<textarea matInput readonly <textarea
style="border: none; style="border: none;
outline: none; outline: none;
width: 95%;" width: 95%;"
cdkTextareaAutosize cdkTextareaAutosize
cdkAutosizeMinRows="1" cdkAutosizeMinRows="1"
cdkAutosizeMaxRows="5">{{ receiptUrl }} cdkAutosizeMaxRows="4">{{ receiptUrl }}
</textarea> </textarea>
</div> </div>
@ -48,7 +47,7 @@
<tr> <tr>
<td align="right"> <td align="right">
<button mat-raised-button class="text" (click)="close()"> <button mat-raised-button class="text" (click)="close()">
<mat-icon class="icon">close</mat-icon>{{ vE.promptreceiptCloseLbl }} <mat-icon class="icon">close</mat-icon>Close
</button> </button>
</td> </td>
</tr> </tr>

View file

@ -5,9 +5,6 @@ import { NotifierService } from '../notifier.service';
import { faCopy } from '@fortawesome/free-solid-svg-icons'; import { faCopy } from '@fortawesome/free-solid-svg-icons';
import { LanguageService } from '../language.service';
import { LanguageData } from '../language.model';
var URLSafeBase64 = require('urlsafe-base64'); var URLSafeBase64 = require('urlsafe-base64');
var Buffer = require('buffer/').Buffer; var Buffer = require('buffer/').Buffer;
@ -19,41 +16,23 @@ var Buffer = require('buffer/').Buffer;
export class PromptReceiptComponent implements OnInit { export class PromptReceiptComponent implements OnInit {
orderId: string; orderId: string;
orderToken: string;
receiptUrl: string; receiptUrl: string;
// ------------------------------------ // ------------------------------------
// //
faCopy = faCopy; faCopy = faCopy;
// ------------------------------------ // ------------------------------------
// -------------------------------------
//
// Language Support
//
vE = {
promptreceiptNotservClose : '',
promptreceiptNotservError : '',
promptreceiptNotservSuccess : '',
propmtreceiptReceiptClipboard : '',
promptreceiptFuncNotavail : '',
promptreceiptSendLink : '',
promptreceiptReceiptUrl : '',
promptreceiptCloseLbl : ''
}
//
constructor( constructor(
private languageService : LanguageService,
private dialogRef: MatDialogRef<PromptReceiptComponent>, private dialogRef: MatDialogRef<PromptReceiptComponent>,
@Inject(MAT_DIALOG_DATA) public data: {orderId: string, orderToken: string}, @Inject(MAT_DIALOG_DATA) public data: {orderId: string},
private notifierService : NotifierService ) { private notifierService : NotifierService ) {
this.orderId = data.orderId; this.orderId = data.orderId;
this.orderToken = data.orderToken; this.receiptUrl = 'https://app.zgo.cash/receipt/'+this.orderId;
this.receiptUrl = 'https://app.zgo.cash/receipt/' + this.orderId + '?token=' + this.orderToken;
} }
ngOnInit(): void { ngOnInit(): void {
this.chgUILanguage();
} }
@ -72,42 +51,12 @@ export class PromptReceiptComponent implements OnInit {
try { try {
navigator.clipboard.writeText(this.receiptUrl); navigator.clipboard.writeText(this.receiptUrl);
this.notifierService this.notifierService
.showNotification( this.vE.propmtreceiptReceiptClipboard, .showNotification("Receipt's URL copied to Clipboard!!","Close",'success');
this.vE.promptreceiptNotservClose,
'success',
this.vE.promptreceiptNotservSuccess);
} catch (err) { } catch (err) {
// console.error("Error", err); // console.error("Error", err);
this.notifierService this.notifierService
.showNotification( this.vE.promptreceiptFuncNotavail, .showNotification("Functionality not available for your browser. Use send button instead.","Close",'error');
this.vE.promptreceiptNotservClose,
'error',
this.vE.promptreceiptNotservError);
} }
} }
chgUILanguage(){
console.log('PROMPTRECEIPT.chgUILanguage Called ');
this.languageService.getViewElements('promptreceipt').subscribe(
response => {
console.log('Received >> ', response );
console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component);
console.log('Language data : ',response.data);
this.vE.promptreceiptNotservClose = response.data.promptreceipt_notserv_close;
this.vE.promptreceiptNotservError = response.data.promptreceipt_notserv_error;
this.vE.promptreceiptNotservSuccess = response.data.promptreceipt_notserv_success;
this.vE.propmtreceiptReceiptClipboard = response.data.promptreceipt_receipt_clipboard;
this.vE.promptreceiptFuncNotavail = response.data.promptreceipt_func_notavail;
this.vE.promptreceiptSendLink = response.data.promptreceipt_send_link;
this.vE.promptreceiptReceiptUrl = response.data.promptreceipt_receipt_url;
this.vE.promptreceiptCloseLbl = response.data.promptreceipt_close_lbl;
},
error => { console.log('Error >> ',error); }
);
}
} }

View file

@ -1,31 +1,22 @@
.text { .text {
font-family: 'Spartan', sans-serif; font-family: 'Spartan', sans-serif;
} }
::ng-deep .mdc-button__label { .receipt {
font-family: "Spartan" sans-serif; font-family: "Spartan";
font-size: 14px;
font-weight: 600;
}
.cancelTitle {
font-family: 'Spartan', sans-serif;
background: #ff5722; background: #ff5722;
color: white; font-weight: 700;
font-size: 26px; font-size: 18px;
text-align: center; text-align: center;
padding: 5px; color: white;
line-height: 20px;
padding: 10px;
} }
.qrbody { .qrbody {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
margin: 15px; background-color: #e8eaf0;
}
.button-area {
display: flex;
flex-direction: column;
align-items: center;
margin: 15px;
} }

View file

@ -1,17 +1,18 @@
<div class='cancelTitle'>{{ vE.receiptqrScanReceipt }}</div> <div class="container" style="margin-top: 10px;">
<div class="qrbody"> <div class="receipt">
<div id="receipt-qr"> </div> Scan for your Receipt
</div> </div>
<div class="qrbody">
<div id="receipt-qr"> </div>
</div>
<div class="button-area">
<!--
<mat-dialog-actions> <mat-dialog-actions>
-->
<button mat-raised-button class="text" (click)="close()"> <button mat-raised-button class="text" (click)="close()">
<mat-icon class="icon">close</mat-icon>{{ vE.receiptqrCloseBtn }} <mat-icon class="icon">close</mat-icon>Close
</button> </button>
<!-- </mat-dialog-actions>
</mat-dialog-actions>
-->
</div> </div>

View file

@ -2,9 +2,6 @@ import { Inject, Component, OnInit, ViewEncapsulation} from '@angular/core';
import { MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog'; import { MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';
import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; import { DomSanitizer, SafeUrl } from '@angular/platform-browser';
import { LanguageService } from '../language.service';
import { LanguageData } from '../language.model';
var QRCode = require('easyqrcodejs'); var QRCode = require('easyqrcodejs');
@Component({ @Component({
@ -15,17 +12,8 @@ var QRCode = require('easyqrcodejs');
export class ReceiptQRComponent implements OnInit { export class ReceiptQRComponent implements OnInit {
receiptUrl: SafeUrl; receiptUrl: SafeUrl;
codeString: string = ''; codeString: string = '';
// -------------------------------------
//
// Language Support
//
vE = {
receiptqrScanReceipt : '',
receiptqrCloseBtn : ''
}
//
constructor( constructor(
private languageService : LanguageService,
private dialogRef: MatDialogRef<ReceiptQRComponent>, private dialogRef: MatDialogRef<ReceiptQRComponent>,
private sanitizer: DomSanitizer, private sanitizer: DomSanitizer,
@Inject(MAT_DIALOG_DATA) public data: { order: string} @Inject(MAT_DIALOG_DATA) public data: { order: string}
@ -41,28 +29,10 @@ export class ReceiptQRComponent implements OnInit {
logoWidth: 80, logoWidth: 80,
logoHeight: 80 logoHeight: 80
}); });
this.chgUILanguage();
} }
close() { close() {
this.dialogRef.close(true); this.dialogRef.close(true);
} }
chgUILanguage(){
console.log('RECEIPTQR.chgUILanguage Called ');
this.languageService.getViewElements('receiptqr').subscribe(
response => {
console.log('Received >> ', response );
console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component);
console.log('Language data : ',response.data);
this.vE.receiptqrScanReceipt = response.data.receiptqr_scan_receipt;
this.vE.receiptqrCloseBtn = response.data.receiptqr_close_btn;
},
error => { console.log('Error >> ',error); }
);
}
} }

View file

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs'; import { Subject, BehaviorSubject, Observable } from 'rxjs';
import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http'; import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http';
import { Order } from './order/order.model'; import { Order } from './order/order.model';
import { Owner } from './owner.model'; import { Owner } from './owner.model';
@ -14,8 +14,7 @@ var Buffer = require('buffer/').Buffer;
}) })
export class ReceiptService { export class ReceiptService {
beUrl = ConfigData.Be_URL; beUrl = ConfigData.Be_URL;
private dataStore: {order: Order, owner: Owner, name: string } = { private dataStore: {order: Order, owner: Owner } = {
name: '',
owner: { owner: {
_id: '', _id: '',
name: '', name: '',
@ -25,14 +24,23 @@ export class ReceiptService {
taxValue: 0, taxValue: 0,
vat: false, vat: false,
vatValue: 0, vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false, paid: false,
website: '',
country: '',
zats: false, zats: false,
invoices: false, invoices: false,
expiration: new Date(Date.now()).toISOString(), expiration: new Date(Date.now()).toISOString(),
payconf: false, payconf: false,
crmToken: '',
viewkey: '', viewkey: '',
tips: false crmToken: ''
}, },
order: { order: {
address: '', address: '',
@ -46,10 +54,6 @@ export class ReceiptService {
paid: false, paid: false,
externalInvoice: '', externalInvoice: '',
shortCode: '', shortCode: '',
token: '',
taxAmount: 0,
vatAmount: 0,
tipAmount: 0,
lines: [ lines: [
{ {
qty: 1, qty: 1,
@ -63,30 +67,31 @@ export class ReceiptService {
public readonly orderUpdate: Observable<Order> = this._orderUpdated.asObservable(); public readonly orderUpdate: Observable<Order> = this._orderUpdated.asObservable();
public _nameUpdated: BehaviorSubject<string> = new BehaviorSubject(this.dataStore.owner.name); public _nameUpdated: BehaviorSubject<string> = new BehaviorSubject(this.dataStore.owner.name);
public readonly nameUpdate: Observable<string>= this._nameUpdated.asObservable(); public readonly nameUpdate: Observable<string>= this._nameUpdated.asObservable();
//public readonly ownerUpdate; public readonly ownerUpdate;
private reqHeaders: HttpHeaders; private reqHeaders: HttpHeaders;
private params: HttpParams;
constructor( constructor(
private http: HttpClient, private http: HttpClient,
public userService: UserService public userService: UserService
) { ) {
//this.session = localStorage.getItem('s4z_token');
this.params = new HttpParams();
var auth = 'Basic ' + Buffer.from(ConfigData.UsrPwd).toString('base64'); var auth = 'Basic ' + Buffer.from(ConfigData.UsrPwd).toString('base64');
this.reqHeaders = new HttpHeaders().set('Authorization', auth); this.reqHeaders = new HttpHeaders().set('Authorization', auth);
//this.ownerUpdate = userService.ownerUpdate; this.ownerUpdate = userService.ownerUpdate;
} }
getOrderById(id:string, token: string) { getOrderById(id:string) {
let obs = this.http.get<{message: string, order: any, shop: string}>(this.beUrl+'order/'+id, { headers:this.reqHeaders, params: this.params.append("token", token), observe: 'response'}); //const params = new HttpParams().append('id', id);
let obs = this.http.get<{message: string, order: any}>(this.beUrl+'api/order/'+id, { headers:this.reqHeaders, observe: 'response'});
obs.subscribe((OrderDataResponse) => { obs.subscribe((OrderDataResponse) => {
if (OrderDataResponse.status == 200) { if (OrderDataResponse.status == 200) {
this.dataStore.order = OrderDataResponse.body!.order; this.dataStore.order = OrderDataResponse.body!.order;
this.dataStore.name = OrderDataResponse.body!.shop;
this._orderUpdated.next(Object.assign({}, this.dataStore).order); this._orderUpdated.next(Object.assign({}, this.dataStore).order);
this._nameUpdated.next(Object.assign({}, this.dataStore).name); this.userService.getOwner(this.dataStore.order.address);
this.ownerUpdate.subscribe((owner) => {
this.dataStore.owner = owner;
this._nameUpdated.next(Object.assign({}, this.dataStore).owner.name);
});
} else { } else {
this._orderUpdated.next(Object.assign({}, this.dataStore).order); this._orderUpdated.next(Object.assign({}, this.dataStore).order);
console.log('No order found'); console.log('No order found');

View file

@ -9,14 +9,14 @@
<div class="invoiceDetail" <div class="invoiceDetail"
*ngIf="!error" *ngIf="!error"
id="invoice"> id="invoice">
<div class="invoiceHdrTxt1">{{ vE.receiptReceiptLbl }}</div> <div class="invoiceHdrTxt1">Receipt</div>
<div class="invoiceHdrTxt2">{{ vE.receiptOrderId }}{{orderId}}</div> <div class="invoiceHdrTxt2">Order ID: {{orderId}}</div>
<div class="invoiceHdrTxt3">{{ vE.receiptOrderDate }}{{order.timestamp | date}} <div class="invoiceHdrTxt3">Date:{{order.timestamp | date}}
</div> </div>
<div style="height: 10px;"></div> <div style="height: 10px;"></div>
<div class="zecData">{{ vE.receiptZcashPrice }}{{order.price | number: '1.02' | currency: order.currency.toUpperCase()}}</div> <div class="zecData">Zcash Price: {{order.price | number: '1.02' | currency: order.currency.toUpperCase()}}</div>
<div style="height: 2px;"></div> <div style="height: 2px;"></div>
<div class="zecData">{{ vE.receiptOrderTotal }}<img class="zecSign" src="/assets/zec_rv.png" />{{order.totalZec | number: '1.08'}} <div class="zecData">Total: <img class="zecSign" src="/assets/zec_rv.png" />{{order.totalZec | number: '1.08'}}
</div> </div>
<div> <div>
<div style="height: 10px;"></div> <div style="height: 10px;"></div>
@ -29,11 +29,11 @@
</th> </th>
<th width="15%" <th width="15%"
class="detailTitle1"> class="detailTitle1">
{{ vE.receiptQtyLbl }} Qty.
</th> </th>
<th width="30%" <th width="30%"
class="detailTitle2"> class="detailTitle2">
{{ vE.receiptOrderPrice }} ({{order.currency.toUpperCase()}}) Price ({{order.currency.toUpperCase()}})
</th> </th>
</tr> </tr>
<tr class="invoice-detail" <tr class="invoice-detail"
@ -51,24 +51,6 @@
{{( item.qty * item.cost ) | number : '1.02' | currency: order.currency.toUpperCase()}} {{( item.qty * item.cost ) | number : '1.02' | currency: order.currency.toUpperCase()}}
</td> </td>
</tr> </tr>
<tr *ngIf="order.taxAmount > 0">
<td class="newOrdertbdetail" style="text-align: right;">{{ vE.receiptTax }}</td>
<td class="newOrdertbdetail" style="text-align: right;"></td>
<td class="newOrdertbdetail" style="text-align: right;">{{ order.taxAmount | currency: order.currency.toUpperCase() }}</td>
<td></td>
</tr>
<tr *ngIf="order.vatAmount > 0">
<td class="newOrdertbdetail" style="text-align: right;">{{ vE.receiptVAT }}</td>
<td class="newOrdertbdetail" style="text-align: right;"></td>
<td class="newOrdertbdetail" style="text-align: right;">{{ order.vatAmount | currency: order.currency.toUpperCase() }}</td>
<td></td>
</tr>
<tr *ngIf="order.tipAmount > 0">
<td class="newOrdertbdetail" style="text-align: right;">{{ vE.receiptTip }}</td>
<td class="newOrdertbdetail" style="text-align: right;"></td>
<td class="newOrdertbdetail" style="text-align: right;">{{ order.tipAmount | currency: order.currency.toUpperCase() }}</td>
<td></td>
</tr>
<tr class="invoice-title"> <tr class="invoice-title">
<th width="55%" <th width="55%"
class="detailLineRight"> class="detailLineRight">
@ -95,12 +77,12 @@
font-size: 20px; font-size: 20px;
padding: 4px; padding: 4px;
height: 24px;"> height: 24px;">
{{ vE.receiptInvalidId }} Incorrect Receipt ID.
</div> </div>
<div style="font-family: Spartan !important; <div style="font-family: Spartan !important;
font-size: 16px; font-size: 16px;
padding: 4px;"> padding: 4px;">
{{ vE.receiptInfoNotavail }} No information available.
</div> </div>
<div style="height: 10px;"></div> <div style="height: 10px;"></div>
<mat-card-actions> <mat-card-actions>

View file

@ -4,9 +4,6 @@ import { Order} from '../order/order.model';
import { ReceiptService } from '../receipt.service'; import { ReceiptService } from '../receipt.service';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { LanguageService } from '../language.service';
import { LanguageData } from '../language.model';
@Component({ @Component({
selector: 'app-receipt', selector: 'app-receipt',
templateUrl: './receipt.component.html', templateUrl: './receipt.component.html',
@ -14,7 +11,6 @@ import { LanguageData } from '../language.model';
}) })
export class ReceiptComponent implements OnInit { export class ReceiptComponent implements OnInit {
orderId; orderId;
orderToken: string = '';
public orderUpdate: Observable<Order>; public orderUpdate: Observable<Order>;
public nameUpdate: Observable<string>; public nameUpdate: Observable<string>;
name: string = ''; name: string = '';
@ -31,10 +27,6 @@ export class ReceiptComponent implements OnInit {
paid: false, paid: false,
externalInvoice: '', externalInvoice: '',
shortCode: '', shortCode: '',
token: '',
taxAmount: 0,
vatAmount: 0,
tipAmount: 0,
lines: [ lines: [
{ {
qty: 1, qty: 1,
@ -43,74 +35,25 @@ export class ReceiptComponent implements OnInit {
} }
] ]
}; };
// -------------------------------------
//
// Language Support
//
vE = {
receiptReceiptLbl : '',
receiptOrderId : '',
receiptOrderDate : '',
receiptZcashPrice : '',
receiptOrderTotal : '',
receiptQtyLbl : '',
receiptOrderPrice : '',
receiptInvalidId : '',
receiptInfoNotavail : '',
receiptTax : '',
receiptVAT : '',
receiptTip : ''
}
constructor( constructor(
private languageService : LanguageService,
private _ActiveRoute:ActivatedRoute, private _ActiveRoute:ActivatedRoute,
public receiptService: ReceiptService public receiptService: ReceiptService
) { ) {
this.orderId = this._ActiveRoute.snapshot.paramMap.get("orderId"); this.orderId = this._ActiveRoute.snapshot.paramMap.get("orderId");
this._ActiveRoute.queryParams.subscribe((params) => {
this.orderToken = params["token"];
receiptService.getOrderById(this.orderId!, this.orderToken!);
});
this.orderUpdate = receiptService.orderUpdate; this.orderUpdate = receiptService.orderUpdate;
this.nameUpdate = receiptService.nameUpdate;
receiptService.getOrderById(this.orderId!);
this.orderUpdate.subscribe(order => { this.orderUpdate.subscribe(order => {
this.order = order; this.order = order;
}); });
this.nameUpdate = receiptService.nameUpdate;
this.nameUpdate.subscribe(name => { this.nameUpdate.subscribe(name => {
this.name = name; this.name = name;
}); });
} }
ngOnInit(): void { ngOnInit(): void {
this.chgUILanguage();
}
chgUILanguage(){
console.log('RECEIPT.chgUILanguage Called ');
this.languageService.getViewElements('receipt').subscribe(
response => {
console.log('Received >> ', response );
console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component);
console.log('Language data : ',response.data);
this.vE.receiptReceiptLbl = response.data.receipt_receipt_lbl;
this.vE.receiptOrderId = response.data.receipt_order_id;
this.vE.receiptOrderDate = response.data.receipt_order_date;
this.vE.receiptZcashPrice = response.data.receipt_zcash_price;
this.vE.receiptOrderTotal = response.data.receipt_order_total;
this.vE.receiptQtyLbl = response.data.receipt_qty_lbl;
this.vE.receiptOrderPrice = response.data.receipt_order_price;
this.vE.receiptInvalidId = response.data.receipt_invalid_id;
this.vE.receiptInfoNotavail = response.data.receipt_info_notavail;
this.vE.receiptTax = response.data.receipt_tax;
this.vE.receiptVAT = response.data.receipt_vat;
this.vE.receiptTip = response.data.receipt_tip;
},
error => { console.log('Error >> ',error); }
);
} }
} }

View file

@ -1,80 +1,12 @@
.text { .text {
font-family: 'Spartan', sans-serif; font-family: 'Spartan', sans-serif;
} }
.scan_header {
font-family: 'Spartan', sans-serif;
font-size: 24px;
font-weight: 600;
text-align: center;
padding: 10px;
color: white;
background: #ff5722;
}
.scan_qrcode {
}
.scan_message {
font-family: 'Spartan', sans-serif;
font-size: 16px;
font-weight: 600;
text-align: center;
color: black;
padding: 10px;
}
.scan_message2 {
font-family: 'Spartan', sans-serif;
font-size: 16px;
font-weight: 600;
text-align: center;
color: black;
padding-top: 30px;
padding-bottom: 30px;
}
.scan_button_send {
font-family: 'Spartan', sans-serif;
font-size: 12px;
font-weight: 500;
text-align: center;
color: white;
background: #ff5722;
align-items: center;
}
.scan_button_close {
font-family: 'Spartan', sans-serif;
font-size: 12px;
font-weight: 500;
text-align: center;
align-items: center;
}
.scan_button_row1 {
font-family: 'Spartan', sans-serif;
font-size: 12px;
align-items: center;
height: 30px;
}
.scan_button_row2 {
font-family: 'Spartan', sans-serif;
font-size: 20px;
height: 30px;
padding: 20px;
padding-top: 20px;
padding-left: 20px;
padding-right: 20px;
padding-bottom: 20px;
}
.mat-dialog-title{ .mat-dialog-title{
line-height: 20px; line-height: 20px;
} }
h4.text{
margin: 0px;
}
.small { .small {
font-size: small; font-size: small;
} }

View file

@ -1,53 +1,32 @@
<div class="scan_header">{{ vE.scanScanqrCode }} <div align="center" mat-dialog-title>
<h4 class="text">Scan the QR code</h4>
</div> </div>
<mat-dialog-content>
<div align="center">
<p class="text">Ensure to check the "Include Reply-To" box in your wallet before sending your memo.</p>
<div class="qrcode" id="checkout-qr"></div>
</div>
</mat-dialog-content>
<mat-dialog-actions>
<table cellspacing="0" width="100%">
<tr>
<td>
<button mat-raised-button class="text" color="primary" (click)="confirm()">
<mat-icon class="icon">verified_user</mat-icon>Memo Sent!
</button>
</td>
<td align="right">
<button mat-raised-button class="text" (click)="close()">
<mat-icon class="icon">close</mat-icon>Cancel
</button>
</td>
</tr>
</table>
</mat-dialog-actions>
<div align="center"> <div align="center">
<p class="scan_message">{{ vE.scanTextInfo }}</p> <p class="small text">Can't scan? Use this <a [href]="zcashUrl">wallet link</a>, or</p>
<div class="scan_qrcode" id="checkout-qr"></div> <button class="small text" (click)="copyAddress()">Copy Address</button>
<button class="small text" (click)="copyAmount()">Copy Amount</button>
<button class="small text" (click)="copyMemo()">Copy Memo</button>
</div> </div>
<!-- </mat-dialog-content>
-->
<table width="100%">
<tr>
<td align="center">
<button mat-raised-button class="scan_button_send" (click)="confirm()">
<mat-icon class="icon">verified_user</mat-icon>{{ vE.scanMemoSent }}
</button>
</td>
<td align="center">
<button mat-raised-button class="scan_button_close" (click)="close()">
<mat-icon class="icon">close</mat-icon>{{ vE.scanCloseBtn }}
</button>
</td>
</tr>
</table>
<div class='scan_message2'>
{{ vE.scanCantScan }}<br> {{ vE.scanUseThis }}<a [href]="zcashUrl">{{vE.scanWalletLink}}</a>,<br>{{ vE.scanOrButton }}
</div>
<table style="width:100%;
padding-left: 30px;
padding-right: 30px;">
<tr>
<td align="center" style="width: 45%;">
<button style="font-size: 14px;" (click)="copyAddress()">{{ vE.scanCopyAddress }}</button>
</td>
<td style="width: 10%;"></td>
<td align="center" style="width: 45%;">
<button style="font-size: 14px;" (click)="copyAmount()">{{ vE.scanCopyAmount }}</button>
</td>
</tr>
</table>
<table style="width:100%;
padding-top: 10px;
padding-left: 30px;
padding-right: 30px;
padding-bottom: 10px;">
<tr>
<td align="center" >
<button style="font-size: 14px;" (click)="copyMemo()">{{ vE.scanCopyMemo }}</button>
</td>
</tr>
</table>

View file

@ -1,11 +1,9 @@
import { Inject, Component, OnInit, ViewEncapsulation} from '@angular/core'; import { Inject, Component, OnInit, ViewEncapsulation} from '@angular/core';
import { MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog'; import { MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';
import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; import { DomSanitizer, SafeUrl } from '@angular/platform-browser';
import { NotifierService } from '../notifier.service'; import { NotifierService } from '../notifier.service';
import { LanguageService } from '../language.service';
var QRCode = require('easyqrcodejs'); var QRCode = require('easyqrcodejs');
var URLSafeBase64 = require('urlsafe-base64'); var URLSafeBase64 = require('urlsafe-base64');
var Buffer = require('buffer/').Buffer; var Buffer = require('buffer/').Buffer;
@ -23,31 +21,8 @@ export class ScanComponent implements OnInit{
codeString: string = ''; codeString: string = '';
pay: boolean = false; pay: boolean = false;
zcashUrl: SafeUrl; zcashUrl: SafeUrl;
// -------------------------------------
//
// Language Support
//
vE = {
scanScanqrCode : '',
scanTextInfo : '',
scanMemoSent : '',
scanCloseBtn : '',
scanUseThis : '',
scanWalletLink : '',
scanCopyAddress : '',
scanCopyAmount : '',
scanCopyMemo : '',
scanNotservClose : '',
scanNotservError : '',
scanFuncNotavail : '',
scanCopyError : '',
scanFailPayment : '',
scanCantScan : '',
scanOrButton : ''
}
//
constructor( constructor(
private languageService : LanguageService,
private dialogRef: MatDialogRef<ScanComponent>, private dialogRef: MatDialogRef<ScanComponent>,
private sanitizer: DomSanitizer, private sanitizer: DomSanitizer,
@Inject(MAT_DIALOG_DATA) public data: { totalZec: number, addr: string, session: string, pay: boolean}, @Inject(MAT_DIALOG_DATA) public data: { totalZec: number, addr: string, session: string, pay: boolean},
@ -72,7 +47,6 @@ export class ScanComponent implements OnInit{
logoWidth: 80, logoWidth: 80,
logoHeight: 80 logoHeight: 80
}); });
this.chgUILanguage();
} }
confirm() { confirm() {
@ -87,10 +61,7 @@ export class ScanComponent implements OnInit{
if (!navigator.clipboard) { if (!navigator.clipboard) {
alert("Copy functionality not supported"); alert("Copy functionality not supported");
this.notifierService this.notifierService
.showNotification( this.vE.scanFuncNotavail, .showNotification("Copy functionality not supported","Close","error");
this.vE.scanNotservClose,
'error',
this.vE.scanNotservError);
} }
try { try {
navigator.clipboard.writeText(this.address); navigator.clipboard.writeText(this.address);
@ -103,19 +74,13 @@ export class ScanComponent implements OnInit{
if (!navigator.clipboard) { if (!navigator.clipboard) {
// alert("Copy functionality not supported"); // alert("Copy functionality not supported");
this.notifierService this.notifierService
.showNotification( this.vE.scanFuncNotavail , .showNotification("Copy functionality not supported","Close","error");
this.vE.scanNotservClose,
'error',
this.vE.scanNotservError);
} }
try { try {
navigator.clipboard.writeText(this.total.toString()); navigator.clipboard.writeText(this.total.toString());
} catch (err) { } catch (err) {
this.notifierService this.notifierService
.showNotification(this.vE.scanCopyError, .showNotification("Error while copying ammount","Close","error");
this.vE.scanNotservClose,
'error',
this.vE.scanNotservError);
// console.error("Error", err); // console.error("Error", err);
} }
} }
@ -124,10 +89,7 @@ export class ScanComponent implements OnInit{
if (!navigator.clipboard) { if (!navigator.clipboard) {
// alert("Copy functionality not supported"); // alert("Copy functionality not supported");
this.notifierService this.notifierService
.showNotification(this.vE.scanFuncNotavail , .showNotification("Copy functionality not supported","Close","error");
this.vE.scanNotservClose,
'error',
this.vE.scanNotservError);
} }
try { try {
if (this.pay) { if (this.pay) {
@ -138,42 +100,8 @@ export class ScanComponent implements OnInit{
} catch (err) { } catch (err) {
this.notifierService this.notifierService
.showNotification(this.vE.scanFailPayment, .showNotification("Error while verifying payment","Close","error");
this.vE.scanNotservClose,
'error',
this.vE.scanNotservError);
// console.error("Error", err); // console.error("Error", err);
} }
} }
chgUILanguage(){
//console.log('SCAN.chgUILanguage Called ');
this.languageService.getViewElements('scan').subscribe({
next:
response => {
//console.log('Received >> ', response );
//console.log('Language Code : ', response.language);
//console.log('Component Name : ',response.component);
//console.log('Language data : ',response.data);
this.vE.scanScanqrCode = response.data.scan_scanqr_code;
this.vE.scanTextInfo = response.data.scan_text_info;
this.vE.scanMemoSent = response.data.scan_memo_sent;
this.vE.scanCloseBtn = response.data.scan_close_btn;
this.vE.scanUseThis = response.data.scan_use_this;
this.vE.scanWalletLink = response.data.scan_wallet_link;
this.vE.scanCopyAddress = response.data.scan_copy_address;
this.vE.scanCopyAmount = response.data.scan_copy_amount;
this.vE.scanCopyMemo = response.data.scan_copy_memo;
this.vE.scanNotservClose = response.data.scan_notserv_close;
this.vE.scanNotservError = response.data.scan_notserv_error;
this.vE.scanFuncNotavail = response.data.scan_func_notavail;
this.vE.scanCantScan = response.data.scan_cant_scan;
this.vE.scanOrButton = response.data.scan_or_button;
},
error: error => { console.log('Error >> ',error); }
});
}
} }

View file

@ -1,20 +0,0 @@
* {
font-family: 'Spartan', sans-serif;
}
.settings-title {
font-family: 'Spartan', sans-serif;
background: #ff5722;
color: white;
font-size: 30px;
text-align: center;
padding: 5px;
margin-bottom: 10px;
}
.container {
display: flex;
justify-content: space-between;
align-items: center;
}

View file

@ -1,15 +0,0 @@
<div class="settings-title">Purchase Session</div>
<mat-card [formGroup]="payForm">
<mat-form-field appearance="outline">
<mat-label>Select session:</mat-label>
<mat-select formControlName="session">
<mat-option *ngFor="let ticket of tickets" [value]="ticket.value">
{{ticket.viewValue}}
</mat-option>
</mat-select>
</mat-form-field>
<div class="container">
<button mat-raised-button (click)="close()">Cancel</button>
<button mat-raised-button color="primary" [disabled]="payForm.invalid" (click)="pay()">Pay</button>
</div>
</mat-card>

View file

@ -1,23 +0,0 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { SessionpayComponent } from './sessionpay.component';
describe('SessionpayComponent', () => {
let component: SessionpayComponent;
let fixture: ComponentFixture<SessionpayComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ SessionpayComponent ]
})
.compileComponents();
fixture = TestBed.createComponent(SessionpayComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -1,68 +0,0 @@
import { Inject, Component } from '@angular/core';
import { ScanComponent } from '../scan/scan.component';
import { Validators, UntypedFormGroup, FormBuilder } from '@angular/forms';
import { MatDialog, MatDialogConfig, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';
@Component({
selector: 'app-sessionpay',
templateUrl: './sessionpay.component.html',
styleUrls: ['./sessionpay.component.css']
})
export class SessionpayComponent {
nodeAddress: string = '';
zecPrice: number = 1;
tickets = [
{
value: 1,
viewValue: '1 day: USD $1'
},{
value: 6,
viewValue: '1 week: USD $6'
},{
value: 22,
viewValue: '1 month: USD $22'
},{
value: 30,
viewValue: '1 month Pro: USD $30'
}
];
payForm: UntypedFormGroup;
session: string;
constructor(
private dialog: MatDialog,
private dialogRef: MatDialogRef<SessionpayComponent>,
private fb: FormBuilder,
@Inject(MAT_DIALOG_DATA) public data: { addr: string, session: string, zecPrice: number }
) {
this.payForm= fb.group({
session: ['', Validators.required]
});
this.session = data.session;
this.zecPrice = data.zecPrice;
this.nodeAddress = data.addr;
}
pay(){
const dialogConfig = new MatDialogConfig();
dialogConfig.disableClose = true;
dialogConfig.autoFocus = true;
dialogConfig.data = {
totalZec: (this.payForm.get('session')!.value)/this.zecPrice,
addr: this.nodeAddress,
session: this.session,
pay: true
};
const dialogRef1 = this.dialog.open(ScanComponent, dialogConfig);
dialogRef1.afterClosed().subscribe(val => {
this.dialogRef.close();
});
}
close(){
this.dialogRef.close();
}
}

View file

@ -2,11 +2,6 @@
font-family: 'Spartan', sans-serif; font-family: 'Spartan', sans-serif;
} }
::ng-deep .mdc-tab__text-label {
font-family: 'Spartan', sans-serif;
font-size: 14px;
}
.settings-title { .settings-title {
font-family: 'Spartan', sans-serif; font-family: 'Spartan', sans-serif;
background: #ff5722; background: #ff5722;

View file

@ -1,25 +1,24 @@
<div class="settings-title"> {{ vE.settingsViewTitle }}</div> <div class="settings-title">Settings</div>
<div class="container" <div class="container"
style="margin-top: 10px; style="margin-top: 10px;
height: 700px; height: 450px;
margin-left: 10px; margin-left: 10px;
margin-right: 10px;"> margin-right: 10px;">
<mat-tab-group mat-tab-align-tabs="start"> <mat-tab-group mat-tab-align-tabs="start">
<mat-tab label="{{ vE.settingsTabMainlbl }}" <mat-tab label="Main" style="height: 400px;">
style="height: 620px;">
<div class="container" style="margin-bottom: 20px;"> <div class="container" style="margin-bottom: 20px;">
<mat-dialog-content [formGroup]="settingsForm"> <mat-dialog-content [formGroup]="settingsForm">
<mat-form-field class="settings-field" [style.width.%]="100"> <mat-form-field class="settings-field" [style.width.%]="100">
<mat-label>{{ vE.settingsNameLbl }}</mat-label> <mat-label>Name</mat-label>
<input matInput <input matInput
width="100%" width="100%"
placeholder="{{ vE.settingsNamePlaceholder }}" placeholder="Name"
formControlName="name"> formControlName="name">
</mat-form-field> </mat-form-field>
<mat-form-field [style.width.%]="100" > <mat-form-field [style.width.%]="100" >
<mat-label>{{ vE.settingsCurrencyLbl }}</mat-label> <mat-label>Currency</mat-label>
<mat-select formControlName="currency"> <mat-select formControlName="currency">
<mat-option *ngFor="let coin of coins" <mat-option *ngFor="let coin of coins"
[value]="coin.symbol"> [value]="coin.symbol">
@ -30,99 +29,60 @@
<mat-slide-toggle formControlName="useZats" <mat-slide-toggle formControlName="useZats"
class="settings-toggle" class="settings-toggle"
(change)="onChange($event)"> (change)="onChange($event)">
{{ vE.settingsUseSatoshi }} Use zatoshis?
</mat-slide-toggle> </mat-slide-toggle>
<pre></pre> <pre></pre>
<mat-slide-toggle formControlName="useVKey" <mat-slide-toggle formControlName="useVKey"
class="settings-toggle" class="settings-toggle"
(change)="onChangeVKeyOn($event)"> (change)="onChangeVKeyOn($event)">
{{ vE.settingsConfirmPayments }} Confirm payments?
</mat-slide-toggle> </mat-slide-toggle>
<pre></pre> <pre></pre>
<mat-form-field class="full-width" <mat-form-field class="full-width"
appearance="fill"> appearance="fill">
<mat-label>{{ vE.settingsVkeyLbl }}</mat-label> <mat-label>Viewing key</mat-label>
<textarea matInput [readonly]="vKaccess" placeholder="{{ vE.settingsVkeyPlaceholder }}" <textarea matInput placeholder="Your wallet viewing key"
formControlName="vKey"> formControlName="vKey">
</textarea> </textarea>
</mat-form-field> </mat-form-field>
<table cellspacing="0" style="width: 100%">
<!-- <!--
<colgroup> <pre></pre>
<col span="1" style="width: 20%;"> <mat-slide-toggle formControlName="proVersion"
<col span="1" style="width: 40%;"> class="settings-toggle"
<col span="1" style="width: 40%;"> (change)="onChangeProVersion($event)">
</colgroup> Enable Integrations
</mat-slide-toggle>
--> -->
<tr>
<td>
<mat-slide-toggle formControlName="useTips" class="settings-toggle" (change)="onChangeTips($event)">
{{ vE.settingsUseTips }}
</mat-slide-toggle>
</td>
</tr>
<tr>
<td >
<mat-slide-toggle formControlName="useTax" class="settings-toggle" (change)="onChangeTax($event)">
{{ vE.settingsUseTax }}
</mat-slide-toggle>
<br>
<mat-form-field *ngIf="useTax" class="settings-field" [style.width.%]="100">
<mat-label> {{ vE.settingsSalesTaxRateLbl }}</mat-label>
<input matInput
type="number"
placeholder="{{ vE.settingsSalesTaxRateTxt }}"
formControlName="taxRate">
</mat-form-field>
</td>
</tr>
<tr>
<td>
<mat-slide-toggle formControlName="useVat" class="settings-toggle" (change)="onChangeVat($event)">
{{ vE.settingsUseVAT }}
</mat-slide-toggle>
<br>
<mat-form-field *ngIf="useVat" class="settings-field" [style.width.%]="100">
<mat-label>{{ vE.settingsSalesVATRateLbl }} </mat-label>
<input matInput
type="number"
placeholder="{{ vE.settingsSalesVATRateTxt }}"
formControlName="vatRate">
</mat-form-field>
</td>
</tr>
</table>
</mat-dialog-content> </mat-dialog-content>
</div> </div>
<div class="container" <div class="container"
style="display: flex; style="display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;">
margin-top: -20px;">
<button mat-raised-button <button mat-raised-button
(click)="close()"> (click)="close()">
{{ vE.settingsCloseBtn }} Cancel
</button> </button>
<button mat-raised-button <button mat-raised-button
color="primary" color="primary"
(click)="save()"> (click)="save()">
{{ vE.settingsSaveBtn }} Save
</button> </button>
</div> </div>
<!--
<div style="height: 20px; <div style="height: 20px;
margin-top: 10px;"> margin-top: 10px;">
</div> </div>
-->
</mat-tab> </mat-tab>
<mat-tab *ngIf="proVersion" <mat-tab *ngIf="proVersion"
label="{{ vE.settingsTabIntegrations }}" label="Integrations"
style="align-items: center;"> style="align-items: center;">
<mat-tab-group mat-tab-align-tabs="start"> <mat-tab-group mat-tab-align-tabs="start">
<mat-tab label="{{ vE.settingsXeroLbl }}"> <mat-tab label="Xero">
<div class="container" style="margin-bottom: 10px;"> <div class="container" style="margin-bottom: 20px;">
<mat-dialog-content [formGroup]="accCodForm"> <mat-dialog-content [formGroup]="accCodForm">
<div style="height: 5px;"> <div style="height: 10px;
margin-top: 10px;">
</div> </div>
<div class="container" <div class="container"
style="height: 300;"> style="height: 300;">
@ -136,12 +96,12 @@
<table *ngIf="linked2Xero" <table *ngIf="linked2Xero"
[style.width.%]="100" [style.width.%]="100"
style="margin-top: 5px;"> style="margin-top: 10px;">
<thead style="width: 100%;"> <thead style="width: 100%;">
<tr> <tr>
<th class="urlLabel" <th class="urlLabel"
style="text-align: left;" style="text-align: left;"
width="94%">{{ vE.settingsPmtservURL }} width="94%">Payment Service URL:
</th> </th>
<th></th> <th></th>
</tr> </tr>
@ -173,12 +133,13 @@
</td> </td>
</tbody> </tbody>
</table> </table>
<div style="height: 5px;"> <div style="height: 10px;
margin-top: 10px;">
</div> </div>
<mat-form-field *ngIf="linked2Xero" <mat-form-field *ngIf="linked2Xero"
class="settings-field" class="settings-field"
[style.width.%]="100"> [style.width.%]="100">
<mat-label>{{ vE.settingsAcodeLbl }}</mat-label> <mat-label>Account Code</mat-label>
<input matInput <input matInput
width="100%" width="100%"
placeholder="9999999999" placeholder="9999999999"
@ -192,35 +153,33 @@
<div class="container" <div class="container"
style="display: flex; style="display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;">
padding-left: 20px;
padding-right: 20px;">
<button mat-raised-button <button mat-raised-button
(click)="closeIntegration()"> (click)="closeIntegration()">
{{ vE.settingsXeroClosebtn }} Close
</button> </button>
<button *ngIf="saveAccOk" <button *ngIf="saveAccOk"
mat-raised-button mat-raised-button
color="primary" color="primary"
(click)="saveAccCod()"> (click)="saveAccCod()">
{{ vE.settingsXeroSavebtn }} Save Code
</button> </button>
</div> </div>
<div style="height: 20px; <div style="height: 20px;
margin-top: 10px;"> margin-top: 10px;">
</div> </div>
</mat-tab> </mat-tab>
<mat-tab label="{{ vE.settingsWCLbl }}"> <mat-tab label="WooCommerce">
<div > <div >
<div *ngIf="wooOwner == ''" align="center"> <div *ngIf="wooOwner == ''" align="center">
<button mat-raised-button color="primary" (click)="generateWooToken()"> <button mat-raised-button color="primary" (click)="generateWooToken()">
{{ vE.settingsWCGentoken }} Generate Token
</button> </button>
</div> </div>
<table *ngIf="wooOwner != ''"> <table *ngIf="wooOwner != ''">
<tbody> <tbody>
<tr> <tr>
<td class="heading" style="width: 100%;">{{ vE.settingsWCOwnerlbl }}</td> <td class="heading" style="width: 100%;">Owner:</td>
</tr> </tr>
<tr> <tr>
<td> <td>
@ -292,9 +251,10 @@
<div class="toolbar" align="center"> <div class="toolbar" align="center">
<button mat-raised-button <button mat-raised-button
(click)="close()"> (click)="close()">
{{ vE.settingsWCClosebtn }} Close
</button> </button>
</div> </div>
</div> </div>
</mat-tab> </mat-tab>
</mat-tab-group> </mat-tab-group>

View file

@ -1,8 +1,8 @@
import { Inject, Component, OnInit, OnDestroy, ViewEncapsulation } from '@angular/core'; import { Inject, Component, OnInit, OnDestroy, ViewEncapsulation } from '@angular/core';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { MatSlideToggleChange } from '@angular/material/slide-toggle'; import { MatSlideToggleChange } from '@angular/material/slide-toggle';
import { UntypedFormBuilder, Validators, UntypedFormGroup, FormControl } from '@angular/forms'; import { UntypedFormBuilder, Validators, UntypedFormGroup, FormControl } from '@angular/forms';
import { Subject, Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { Owner } from '../owner.model'; import { Owner } from '../owner.model';
import { XeroService } from '../xero.service'; import { XeroService } from '../xero.service';
import { WoocommerceService } from '../woocommerce.service'; import { WoocommerceService } from '../woocommerce.service';
@ -10,7 +10,6 @@ import { WoocommerceService } from '../woocommerce.service';
import { NotifierService } from '../notifier.service'; import { NotifierService } from '../notifier.service';
import { faCopy } from '@fortawesome/free-solid-svg-icons'; import { faCopy } from '@fortawesome/free-solid-svg-icons';
import { LanguageService } from '../language.service';
@Component({ @Component({
selector: 'app-settings', selector: 'app-settings',
@ -28,14 +27,11 @@ export class SettingsComponent implements OnInit {
accCodForm: UntypedFormGroup; accCodForm: UntypedFormGroup;
owner: Owner; owner: Owner;
useZats: boolean; useZats: boolean;
useTax: boolean;
useVat: boolean;
useTips: boolean;
proVersion: boolean = false; proVersion: boolean = false;
linkMsg: string = ''; useVKey: boolean = false;
linkMsg: string = 'Link to Xero';
xeroAccCod: string = ''; xeroAccCod: string = '';
saveAccOk: boolean = false; saveAccOk: boolean = false;
private viewkey: string = '';
coins = [ coins = [
{ {
@ -72,97 +68,32 @@ export class SettingsComponent implements OnInit {
accCodeUpdate: Observable<string>; accCodeUpdate: Observable<string>;
linked2Xero : boolean = false; linked2Xero : boolean = false;
pmtServiceURL : string = ''; pmtServiceURL : string = '';
// -------------------------------------
//
// Language Support
//
vE = {
settingsAcodeInvalid : '',
settingsAcodeLbl : '',
settingsAcodeNotsaved : '',
settingsAcodeSaved : '',
settingsCloseBtn : '',
settingsConfirmPayments : '',
settingsCopyNotavail : '',
settingsCurrencyLbl : '',
settingsLink2Xero : '',
settingsNameLbl : '',
settingsNamePlaceholder : '',
settingsNotservClose : '',
settingsNotservError : '',
settingsNotservSuccess : '',
settingsNotservWarning : '',
settingsOwneridCopied : '',
settingsOwneridNotcopied : '',
settingsPmtservURL : '',
settingsRelink2Xero : '',
settingsSaveBtn : '',
settingsTabIntegrations : '',
settingsTabMainlbl : '',
settingsURLCopied : '',
settingsUseSatoshi : '',
settingsViewTitle : '',
settingsVkeyLbl : '',
settingsVkeyPlaceholder : '',
settingsWCClosebtn : '',
settingsWCGentoken : '',
settingsWCLbl : '',
settingsWCOwnerlbl : '',
settingsWCTokenCopied : '',
settingsWCTokenGenerated : '',
settingsWCTokenGenfail : '',
settingsWCTokenNotcopied : '',
settingsXeroClosebtn : '',
settingsXeroLbl : '',
settingsXeropmtConfirmdis : '',
settingsXeroSavebtn : '',
settingsUseTips : '',
settingsUseTax : '',
settingsUseVAT : '',
settingsSalesTaxRateLbl : '',
settingsSalesTaxRateTxt : '',
settingsSalesVATRateLbl : '',
settingsSalesVATRateTxt : ''
};
//
languageRdy = new Subject<boolean>();
vKaccess = true;
// ------------------------------------------------------------
constructor( constructor(
private languageService : LanguageService,
private notifierService : NotifierService, private notifierService : NotifierService,
private fb: UntypedFormBuilder, private fb: UntypedFormBuilder,
public xeroService: XeroService, public xeroService: XeroService,
public wooService: WoocommerceService, public wooService: WoocommerceService,
private dialogRef: MatDialogRef<SettingsComponent>, private dialogRef: MatDialogRef<SettingsComponent>,
@Inject(MAT_DIALOG_DATA) public data: {o: Owner}) { @Inject(MAT_DIALOG_DATA) public data: Owner) {
this.useZats = data.o.zats; this.useZats = data.zats;
this.useTax = data.o.tax; this.useVKey = data.payconf;
this.useVat = data.o.vat;
this.useTips = data.o.tips;
this.settingsForm = fb.group({ this.settingsForm = fb.group({
name: [data.o.name, Validators.required], name: [data.name, Validators.required],
currency: [data.o.currency, Validators.required], currency: [data.currency, Validators.required],
useZats: [data.o.zats, Validators.required], useZats: [data.zats, Validators.required],
useVKey: [data.o.payconf, Validators.required], useVKey: [data.payconf, Validators.required],
vKey: [data.o.viewkey], // proVersion: [data.invoices, Validators.required],
useTips: [data.o.tips, Validators.required], vKey: [data.viewkey]
useTax: [data.o.tax, Validators.required],
taxRate: [data.o.taxValue],
useVat: [data.o.vat, Validators.required],
vatRate: [data.o.vatValue]
}); });
this.accCodForm = fb.group ({ this.accCodForm = fb.group ({
xAcc: [this.xeroAccCod] xAcc: [this.xeroAccCod]
}); });
if (data.o.payconf) { if (data.payconf) {
this.vKaccess = false; this.settingsForm.get('vKey')!.enable();
//this.settingsForm.get('vKey')!.enable();
} }
this.owner = data.o; this.owner = data;
this.viewkey = data.o.viewkey;
this.proVersion = this.owner.invoices; this.proVersion = this.owner.invoices;
if ( this.owner.crmToken !== '' ) { if ( this.owner.crmToken !== '' ) {
this.linked2Xero = true; this.linked2Xero = true;
@ -174,10 +105,10 @@ export class SettingsComponent implements OnInit {
this.xeroLink = `https://login.xero.com/identity/connect/authorize?response_type=code&client_id=${this.clientId}&redirect_uri=http%3A%2F%2Flocalhost%3A4200%2Fxeroauth&scope=accounting.transactions offline_access&state=${this.owner.address.substring(0, 6)}` this.xeroLink = `https://login.xero.com/identity/connect/authorize?response_type=code&client_id=${this.clientId}&redirect_uri=http%3A%2F%2Flocalhost%3A4200%2Fxeroauth&scope=accounting.transactions offline_access&state=${this.owner.address.substring(0, 6)}`
}); });
this.accCodeUpdate = xeroService.accCodeUpdate; this.accCodeUpdate = xeroService.accCodeUpdate;
xeroService.getXeroAccountCode(); xeroService.getXeroAccountCode(this.owner.address);
this.accCodeUpdate.subscribe(accData => { this.accCodeUpdate.subscribe(accData => {
this.xeroAccCod = accData; this.xeroAccCod = accData;
//console.log("xeroAccCod -> [" + this.xeroAccCod + "]"); console.log("xeroAccCod -> [" + this.xeroAccCod + "]");
this.accCodForm.get('xAcc')!.setValue(this.xeroAccCod); this.accCodForm.get('xAcc')!.setValue(this.xeroAccCod);
}); });
this.wooOwnerUpdate = wooService.ownerUpdate; this.wooOwnerUpdate = wooService.ownerUpdate;
@ -195,27 +126,16 @@ export class SettingsComponent implements OnInit {
}); });
} }
ngOnInit() { ngOnInit() {
this.settingsForm.get('vKey')!.disable();
//this.settingsForm.get('vKey')!.disable(); this.linkMsg = 'Link to Xero';
// this.pmtServiceURL + '';
this.vKaccess = true; if ( this.linked2Xero ) {
this.chgUILanguage(); this.linkMsg = 'Relink to Xero';
//console.log('SETTINGS: Return from chgUILanguage()'); this.pmtServiceURL = 'https://zgo.cash/pmtservice?owner=' +
// this.owner._id +
this.languageRdy.subscribe ( '&invoiceNo=[INVOICENUMBER]&currency=[CURRENCY]&amount=[AMOUNTDUE]&shortCode=[SHORTCODE]';
data => { }
this.linkMsg = this.vE.settingsLink2Xero;
this.pmtServiceURL + '';
if ( this.linked2Xero ) {
this.linkMsg = this.vE.settingsRelink2Xero; //'Relink to Xero';
this.pmtServiceURL =
'https://zgo.cash/pmtservice?owner=' +
this.owner._id +
'&invoiceNo=[INVOICENUMBER]&currency=[CURRENCY]&amount=[AMOUNTDUE]&shortCode=[SHORTCODE]';
}
});
} }
safeURL(s: string){ safeURL(s: string){
@ -224,15 +144,13 @@ export class SettingsComponent implements OnInit {
close() { close() {
this.dialogRef.close(null); this.dialogRef.close();
} }
closeIntegration() { closeIntegration() {
if ( (this.xeroAccCod == '') && (this.linked2Xero) ) if ( (this.xeroAccCod == '') && (this.linked2Xero) )
this.notifierService this.notifierService
.showNotification(this.vE.settingsXeropmtConfirmdis , .showNotification("Xero Payment confirmation disabled!!","Close",'warning');
this.vE.settingsNotservClose,'warning',
this.vE.settingsNotservWarning);
this.dialogRef.close(); this.dialogRef.close();
} }
@ -242,12 +160,7 @@ export class SettingsComponent implements OnInit {
this.owner.zats = this.settingsForm.value.useZats; this.owner.zats = this.settingsForm.value.useZats;
this.owner.payconf = this.settingsForm.value.useVKey; this.owner.payconf = this.settingsForm.value.useVKey;
this.owner.viewkey = this.settingsForm.value.vKey; this.owner.viewkey = this.settingsForm.value.vKey;
this.owner.tax = this.settingsForm.value.useTax; //this.owner.invoices = this.settingsForm.value.proVersion
this.owner.taxValue = this.settingsForm.value.taxRate;
this.owner.vat = this.settingsForm.value.useVat;
this.owner.vatValue = this.settingsForm.value.vatRate;
this.owner.tips = this.settingsForm.value.useTips;
//console.log('Settings component key: ' + this.owner.viewkey);
this.dialogRef.close(this.owner); this.dialogRef.close(this.owner);
} }
@ -255,29 +168,20 @@ export class SettingsComponent implements OnInit {
this.useZats = ob.checked; this.useZats = ob.checked;
} }
onChangeTax(ob: MatSlideToggleChange) { onChangeProVersion(ob: MatSlideToggleChange) {
this.useTax = ob.checked; this.proVersion = ob.checked;
}
onChangeVat(ob: MatSlideToggleChange) {
this.useVat = ob.checked;
}
onChangeTips(ob: MatSlideToggleChange) {
this.useTips = ob.checked;
} }
onChangeVKeyOn(ob: MatSlideToggleChange) { onChangeVKeyOn(ob: MatSlideToggleChange) {
// console.log("Viewing key switch is " + // console.log("Viewing key switch is " +
// ( ob.checked ? "[ON]." : "[OFF]." ) ); // ( ob.checked ? "[ON]." : "[OFF]." ) );
if ( ob.checked ) { this.useVKey = ob.checked;
//this.settingsForm.get('vKey')!.enable();
this.vKaccess = false; if ( ob.checked )
} else { this.settingsForm.get('vKey')!.enable();
//this.settingsForm.get('vKey')!.disable(); else
this.vKaccess = true; this.settingsForm.get('vKey')!.disable();
}
} }
@ -288,59 +192,37 @@ export class SettingsComponent implements OnInit {
try { try {
navigator.clipboard.writeText(this.pmtServiceURL); navigator.clipboard.writeText(this.pmtServiceURL);
this.notifierService this.notifierService
.showNotification(this.vE.settingsURLCopied, .showNotification("ZGo URL copied to Clipboard!!","Close",'success');
this.vE.settingsNotservClose,
'success',
this.vE.settingsNotservSuccess);
} catch (err) { } catch (err) {
// console.error("Error", err); // console.error("Error", err);
this.notifierService this.notifierService
.showNotification(this.vE.settingsCopyNotavail, .showNotification("Functionality not available for your browser. Use send button instead.","Close",'error');
this.vE.settingsNotservClose,
'error',
this.vE.settingsNotservError);
} }
} }
copyWooOwner(){ copyWooOwner(){
try { try {
navigator.clipboard.writeText(this.wooOwner); navigator.clipboard.writeText(this.wooOwner);
this.notifierService.showNotification(this.vE.settingsOwneridCopied, this.notifierService.showNotification("Owner ID copied to clipboard", "Close", "success");
this.vE.settingsNotservClose,
"success",
this.vE.settingsNotservSuccess);
} catch (err) { } catch (err) {
this.notifierService.showNotification(this.vE.settingsOwneridNotcopied, this.notifierService.showNotification("Copying not available in your browser", "Close", "error");
this.vE.settingsNotservClose,
"error",
this.vE.settingsNotservError);
} }
} }
copyWooToken(){ copyWooToken(){
try { try {
navigator.clipboard.writeText(this.wooToken); navigator.clipboard.writeText(this.wooToken);
this.notifierService.showNotification(this.vE.settingsWCTokenCopied, this.notifierService.showNotification("WooCommerce Token copied to clipboard", "Close", "success");
this.vE.settingsNotservClose,
"success",
this.vE.settingsNotservSuccess);
} catch (err) { } catch (err) {
this.notifierService.showNotification(this.vE.settingsWCTokenNotcopied, this.notifierService.showNotification("Copying not available in your browser", "Close", "error");
this.vE.settingsNotservClose,
"error",
this.vE.settingsNotservError);
} }
} }
generateWooToken(){ generateWooToken(){
this.wooService.createWooToken(this.owner._id!).subscribe(responseData => { this.wooService.createWooToken(this.owner._id!).subscribe(responseData => {
if (responseData.status == 202) { if (responseData.status == 202) {
this.notifierService.showNotification( this.notifierService.showNotification("WooCommerce Token generated!", "Close", "success");
this.vE.settingsWCTokenGenerated,
this.vE.settingsNotservClose,
"success",
this.vE.settingsNotservSuccess);
this.wooService.getWooToken(this.owner._id!); this.wooService.getWooToken(this.owner._id!);
this.wooOwnerUpdate.subscribe(owData => { this.wooOwnerUpdate.subscribe(owData => {
this.wooOwner = owData; this.wooOwner = owData;
@ -353,11 +235,7 @@ export class SettingsComponent implements OnInit {
}); });
close(); close();
} else { } else {
this.notifierService.showNotification( this.notifierService.showNotification("WooCommerce Token generation failed.", "Close", "error");
this.vE.settingsWCTokenGenfail,
this.vE.settingsNotservClose,
"error",
this.vE.settingsNotservError);
} }
}); });
} }
@ -365,41 +243,29 @@ export class SettingsComponent implements OnInit {
saveAccCod() { saveAccCod() {
this.xeroAccCod = this.accCodForm.value.xAcc; this.xeroAccCod = this.accCodForm.value.xAcc;
//console.log(">>> " + this.xeroAccCod); console.log(">>> " + this.xeroAccCod);
if ( this.xeroAccCod.length <= 10 ) { if ( this.xeroAccCod.length <= 10 ) {
const obs = this.xeroService const obs = this.xeroService
.setXeroAccountCode(this.owner.address, .setXeroAccountCode(this.owner.address,
this.xeroAccCod); this.xeroAccCod);
obs.subscribe({ next: responseData => { obs.subscribe(responseData => {
if (responseData.status == 202) { if (responseData.status == 202) {
//console.log('Account saved'); console.log('Account saved');
this.notifierService this.notifierService
.showNotification(this.vE.settingsAcodeSaved, .showNotification("Account Code saved!!","Close",'success');
this.vE.settingsNotservClose, } else {
"success", console.log('Account not saved -> status[' + responseData.status + ']');
this.vE.settingsNotservSuccess); this.notifierService
} else { .showNotification("Account Code not saved","Close",'error');
//console.log('Account not saved -> status[' + responseData.status + ']'); }
this.notifierService
.showNotification(
this.vE.settingsAcodeNotsaved,
this.vE.settingsNotservClose,
"error",
this.vE.settingsNotservError);
}
}, }, error => {
error: error => { console.log('Error saving Account Code -> ' + error.msg)
//console.log('Error saving Account Code -> ' + error.msg) });
}});
} else { } else {
this.notifierService this.notifierService
.showNotification( .showNotification("Invalid Account code (10 chars max.)","Close",'error');
this.vE.settingsAcodeInvalid,
this.vE.settingsNotservClose,
"error",
this.vE.settingsNotservError);
}; };
} }
/* /*
@ -410,70 +276,8 @@ export class SettingsComponent implements OnInit {
} }
*/ */
checkStatus( arg : any ) { checkStatus( arg : any ) {
//console.log('onChange - checkStatus'); console.log('onChange - checkStatus');
//console.log(arg.target.value); console.log(arg.target.value);
this.saveAccOk = (arg.target.value != this.xeroAccCod ); this.saveAccOk = (arg.target.value != this.xeroAccCod );
} }
chgUILanguage(){
//console.log('SETTINGS.chgUILanguage Called ');
this.languageService.getViewElements('settings').subscribe({
next: response => {
//console.log('Received >> ', response );
//console.log('Language Code : ', response.language);
//console.log('Component Name : ',response.component);
//console.log('Language data : ',response.data);
this.vE.settingsViewTitle = response.data.settings_view_title;
this.vE.settingsTabMainlbl = response.data.settings_tab_mainlbl;
this.vE.settingsNameLbl = response.data.settings_name_lbl;
this.vE.settingsCurrencyLbl = response.data.settings_currency_lbl;
this.vE.settingsNamePlaceholder = response.data.settings_name_placeholder;
this.vE.settingsUseSatoshi = response.data.settings_use_satoshi;
this.vE.settingsVkeyLbl = response.data.settings_vkey_lbl;
this.vE.settingsVkeyPlaceholder = response.data.settings_vkey_placeholder;
this.vE.settingsConfirmPayments = response.data.settings_confirm_payments;
this.vE.settingsCloseBtn = response.data.settings_close_btn;
this.vE.settingsSaveBtn = response.data.settings_save_btn;
this.vE.settingsTabIntegrations = response.data.settings_tab_integrations;
this.vE.settingsXeroLbl = response.data.settings_xero_lbl;
this.vE.settingsLink2Xero = response.data.settings_link_2xero;
this.vE.settingsRelink2Xero = response.data.settings_relink_2xero;
this.vE.settingsXeropmtConfirmdis = response.data.settings_xeropmt_confirmdis;
this.vE.settingsNotservClose = response.data.settings_notserv_close;
this.vE.settingsNotservWarning = response.data.settings_notserv_warning;
this.vE.settingsPmtservURL = response.data.settings_pmtserv_url;
this.vE.settingsAcodeLbl = response.data.settings_acode_lbl;
this.vE.settingsXeroClosebtn = response.data.settings_xero_closebtn;
this.vE.settingsXeroSavebtn = response.data.settings_xero_savebtn;
this.vE.settingsWCLbl = response.data.settings_wc_lbl;
this.vE.settingsWCGentoken = response.data.settings_wc_gentoken;
this.vE.settingsWCOwnerlbl = response.data.settings_wc_ownerlbl;
this.vE.settingsWCClosebtn = response.data.settings_wc_closebtn;
this.vE.settingsURLCopied = response.data.settings_url_copied;
this.vE.settingsNotservSuccess = response.data.settings_notserv_success;
this.vE.settingsNotservError = response.data.settings_notserv_error;
this.vE.settingsCopyNotavail = response.data.settings_copy_notavail;
this.vE.settingsOwneridCopied = response.data.settings_ownerid_copied;
this.vE.settingsOwneridNotcopied = response.data.settings_ownerid_notcopied;
this.vE.settingsWCTokenCopied = response.data.settings_wctoken_copied;
this.vE.settingsWCTokenNotcopied = response.data.settings_wctoken_notcopied;
this.vE.settingsWCTokenGenerated = response.data.settings_wctoken_generated;
this.vE.settingsWCTokenGenfail = response.data.settings_wctoken_genfail;
this.vE.settingsAcodeSaved = response.data.settings_acode_saved;
this.vE.settingsAcodeNotsaved = response.data.settings_acode_notsaved;
this.vE.settingsAcodeInvalid = response.data.settings_acode_invalid;
this.vE.settingsUseTips = response.data.settings_use_tips;
this.vE.settingsUseTax = response.data.settings_use_tax;
this.vE.settingsUseVAT = response.data.settings_use_vat;
this.vE.settingsSalesTaxRateLbl = response.data.settings_sales_tax_rate_lbl;
this.vE.settingsSalesTaxRateTxt = response.data.settings_sales_tax_rate_txt;
this.vE.settingsSalesVATRateLbl = response.data.settings_sales_vat_rate_lbl;
this.vE.settingsSalesVATRateTxt = response.data.settings_sales_vat_rate_txt;
//
this.languageRdy.next(true);
},
error: error => { console.log('Error >> ',error); }
});
}
} }

View file

@ -1,20 +0,0 @@
.mat-mdc-card-title {
font-family: 'Spartan', sans-serif;
font-size: 20px;
font-weight: 600;
text-align: center;
padding: 10px;
color: white;
background: #ff5722;
}
.card-contents {
font-family: 'Spartan', sans-serif;
}
.card-buttons {
display: flex;
justify-content: space-between;
margin-top: 20px;
padding: 20px;
}

View file

@ -1,40 +0,0 @@
<mat-card>
<mat-card-title class="scan-header">
{{ vE.tipsEnterTip }}
</mat-card-title>
<mat-card-content>
<br>
<div align="center" class="card-contents">
<table cellspacing="0">
<tr>
<th align="center"> {{ vE.tipsSubtotal }}</th>
<th align="center"></th>
<th align="center">{{ vE.tipsTip }}</th>
<th align="center"></th>
<th align="center">{{ vE.tipsTotal }}</th>
</tr>
<tr>
<td align="center">{{orderTotal | currency}}</td>
<td align="center">+</td>
<td align="center">{{orderTotal * value | currency}}</td>
<td align="center">=</td>
<td align="center">{{orderTotal * (1 + value) | currency}}</td>
</tr>
</table>
</div>
<br>
<div align="center" class="card-contents">
{{value | percent}}
<br>
<input type="range" min="0" max="1" step="0.01" [(ngModel)]="value">
</div>
</mat-card-content>
<mat-card-actions class="card-buttons">
<button mat-raised-button (click)="close()">
<mat-icon class="icon">close</mat-icon>{{ vE.tipsNoTipBtn }}
</button>
<button mat-raised-button color="primary" (click)="confirm()">
<mat-icon class="icon">done</mat-icon>{{ vE.tipsDoneBtn }}
</button>
</mat-card-actions>
</mat-card>

View file

@ -1,21 +0,0 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { TipsComponent } from './tips.component';
describe('TipsComponent', () => {
let component: TipsComponent;
let fixture: ComponentFixture<TipsComponent>;
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [TipsComponent]
});
fixture = TestBed.createComponent(TipsComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -1,81 +0,0 @@
import { Inject, Component, OnInit } from '@angular/core';
import { MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';
import { LanguageService } from '../language.service';
import { LanguageData } from '../language.model';
@Component({
selector: 'app-tips',
templateUrl: './tips.component.html',
styleUrls: ['./tips.component.css']
})
export class TipsComponent implements OnInit{
orderTotal:number = 0;
value:number = 0.15;
flag:boolean = true;
// -------------------------------------
//
// Language Support
//
vE = {
tipsEnterTip : '',
tipsSubtotal : '',
tipsTip : '',
tipsTotal : '',
tipsNoTipBtn : '',
tipsDoneBtn : ''
}
constructor(
private languageService : LanguageService,
private dialogRef: MatDialogRef<TipsComponent>,
@Inject(MAT_DIALOG_DATA) public data: {amt: number, flag: boolean}) {
this.orderTotal = data.amt;
this.flag = data.flag;
if(!data.flag){
this.dialogRef.close(0);
}
}
ngOnInit(): void {
if(!this.flag){
this.dialogRef.close(0);
}
this.chgUILanguage();
}
formatPercent(v: number) {
return (v * 100) + '%';
}
close() {
this.dialogRef.close(0);
}
confirm() {
this.dialogRef.close(this.orderTotal * this.value);
}
chgUILanguage(){
console.log('TIPS.chgUILanguage Called ');
this.languageService.getViewElements('tips').subscribe(
response => {
console.log('Received >> ', response );
console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component);
console.log('Language data : ',response.data);
this.vE.tipsEnterTip = response.data.tips_enter_tip;
this.vE.tipsSubtotal = response.data.tips_subtotal;
this.vE.tipsTip = response.data.tips_tip;
this.vE.tipsTotal = response.data.tips_total;
this.vE.tipsNoTipBtn = response.data.tips_notip_btn;
this.vE.tipsDoneBtn = response.data.tips_done_btn;
},
error => { console.log('Error >> ',error); }
);
}
}

View file

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs'; import { Subject, BehaviorSubject, Observable } from 'rxjs';
import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http'; import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http';
@ -8,6 +8,7 @@ import { NotifierService } from './notifier.service';
import { User } from './user.model'; import { User } from './user.model';
import { Owner } from './owner.model'; import { Owner } from './owner.model';
import { Country } from './country.model'; import { Country } from './country.model';
import { Tx } from './tx.model';
import { ConfigData } from './configdata'; import { ConfigData } from './configdata';
@ -17,7 +18,7 @@ var Buffer = require('buffer/').Buffer;
export class UserService{ export class UserService{
beUrl = ConfigData.Be_URL; beUrl = ConfigData.Be_URL;
private dataStore: { user: User, owner: Owner, countries: Country[]} = { private dataStore: { user: User, owner: Owner, txs: Tx[], countries: Country[]} = {
user: { user: {
address: '', address: '',
session: '', session: '',
@ -33,31 +34,45 @@ export class UserService{
taxValue: 0, taxValue: 0,
vat: false, vat: false,
vatValue: 0, vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false, paid: false,
website: '',
country: '',
zats: false, zats: false,
invoices: false, invoices: false,
expiration: new Date(Date.now()).toISOString(), expiration: new Date(Date.now()).toISOString(),
payconf: false, payconf: false,
crmToken: '',
viewkey: '', viewkey: '',
tips: false crmToken: ''
}, },
txs : [],
countries: [] countries: []
}; };
private uZaddr = ''; private uZaddr = '';
private oZaddr = '';
private uName = '';
private session: string | null = ''; private session: string | null = '';
private _uZaddrUpdated: BehaviorSubject<string> = new BehaviorSubject(this.uZaddr); private _uZaddrUpdated: BehaviorSubject<string> = new BehaviorSubject(this.uZaddr);
private _userUpdated: BehaviorSubject<User> = new BehaviorSubject(this.dataStore.user); private _userUpdated: BehaviorSubject<User> = new BehaviorSubject(this.dataStore.user);
private uNameUpdated = new Subject<string>();
private _ownerUpdated: BehaviorSubject<Owner> = new BehaviorSubject(this.dataStore.owner); private _ownerUpdated: BehaviorSubject<Owner> = new BehaviorSubject(this.dataStore.owner);
private _txsUpdated: BehaviorSubject<Tx[]> = new BehaviorSubject(this.dataStore.txs);
private _paidUpdated: BehaviorSubject<boolean> = new BehaviorSubject(this.dataStore.owner.paid); private _paidUpdated: BehaviorSubject<boolean> = new BehaviorSubject(this.dataStore.owner.paid);
private _countriesUpdated: BehaviorSubject<Country[]> = new BehaviorSubject(this.dataStore.countries); private _countriesUpdated: BehaviorSubject<Country[]> = new BehaviorSubject(this.dataStore.countries);
public readonly uZaddrUpdate: Observable<string> = this._uZaddrUpdated.asObservable(); public readonly uZaddrUpdate: Observable<string> = this._uZaddrUpdated.asObservable();
public readonly ownerUpdate: Observable<Owner> = this._ownerUpdated.asObservable(); public readonly ownerUpdate: Observable<Owner> = this._ownerUpdated.asObservable();
public readonly userUpdate: Observable<User> = this._userUpdated.asObservable(); public readonly userUpdate: Observable<User> = this._userUpdated.asObservable();
public readonly txUpdate: Observable<Tx[]> = this._txsUpdated.asObservable();
public readonly paidUpdate: Observable<boolean> = this._paidUpdated.asObservable(); public readonly paidUpdate: Observable<boolean> = this._paidUpdated.asObservable();
public readonly countriesUpdate: Observable<Country[]> = this._countriesUpdated.asObservable(); public readonly countriesUpdate: Observable<Country[]> = this._countriesUpdated.asObservable();
private reqHeaders: HttpHeaders; private reqHeaders: HttpHeaders;
private reqParams: HttpParams;
constructor(private http: HttpClient, constructor(private http: HttpClient,
private notifierService : NotifierService ){ private notifierService : NotifierService ){
@ -65,14 +80,13 @@ export class UserService{
this.reqHeaders = new HttpHeaders().set('Authorization', auth); this.reqHeaders = new HttpHeaders().set('Authorization', auth);
//console.log('US:', this.reqHeaders); //console.log('US:', this.reqHeaders);
this.session = localStorage.getItem('s4z_token'); this.session = localStorage.getItem('s4z_token');
this.reqParams = new HttpParams().append('session', this.session!); if (this.session != null) {
//if (this.session != null) { this.findUser();
//this.findUser(); }
//}
} }
getCountries() { getCountries() {
let obs = this.http.get<{message: string, countries: any}>(this.beUrl+'api/countries', { headers: this.reqHeaders, params: this.reqParams, observe: 'response'}); let obs = this.http.get<{message: string, countries: any}>(this.beUrl+'api/countries', { headers: this.reqHeaders, observe: 'response'});
obs.subscribe((CountryResponse) => { obs.subscribe((CountryResponse) => {
if (CountryResponse.status == 200) { if (CountryResponse.status == 200) {
@ -82,29 +96,20 @@ export class UserService{
}); });
} }
checkUser() {
if (this.session != null) {
console.log('calling checkUser');
let obs = this.http.get<{validated: boolean}>(this.beUrl + 'checkuser', {headers: this.reqHeaders, params: this.reqParams, observe: 'response'});
return obs;
} else {
return null;
}
}
findUser() { findUser() {
this.session = localStorage.getItem('s4z_token');
if (this.session != null) { if (this.session != null) {
let obs = this.http.get<{message: string, user: any}>(this.beUrl+'api/user', { headers: this.reqHeaders, params: this.reqParams, observe: 'response'}); const params = new HttpParams().append('session', this.session!);
let obs = this.http.get<{message: string, user: any}>(this.beUrl+'api/user', { headers: this.reqHeaders, params: params, observe: 'response'});
obs.subscribe((UserDataResponse) => { obs.subscribe((UserDataResponse) => {
//console.log(UserDataResponse.status); console.log(UserDataResponse.status);
if (UserDataResponse.status == 200){ if (UserDataResponse.status == 200){
this.dataStore.user = UserDataResponse.body!.user; this.dataStore.user = UserDataResponse.body!.user;
//console.log(`US: Found user, returning it`); console.log(`US: Found user, returning it`);
this._uZaddrUpdated.next(Object.assign({},this.dataStore).user.address); this._uZaddrUpdated.next(Object.assign({},this.dataStore).user.address);
this._userUpdated.next(Object.assign({}, this.dataStore).user); this._userUpdated.next(Object.assign({}, this.dataStore).user);
this.getOwner(); this.getOwner(Object.assign({},this.dataStore.user).address);
} else { } else {
this.dataStore.user = { this.dataStore.user = {
address: '', address: '',
@ -115,7 +120,7 @@ export class UserService{
}; };
this._uZaddrUpdated.next(Object.assign({},this.dataStore).user.address); this._uZaddrUpdated.next(Object.assign({},this.dataStore).user.address);
this._userUpdated.next(Object.assign({}, this.dataStore).user); this._userUpdated.next(Object.assign({}, this.dataStore).user);
//console.log('US: Did not find user'); console.log('US: Did not find user');
} }
}); });
@ -127,8 +132,8 @@ export class UserService{
} }
validateUser(pinString:string){ validateUser(pinString:string){
const params = this.reqParams.append('pin', pinString); const params = new HttpParams().append('session', this.dataStore.user.session).append('pin', pinString);
let obs = this.http.post(this.beUrl+'validateuser', {}, {headers: this.reqHeaders, params: params, observe: 'response'}); let obs = this.http.post(this.beUrl+'api/validateuser', {}, {headers: this.reqHeaders, params: params, observe: 'response'});
obs.subscribe((responseData) => { obs.subscribe((responseData) => {
if (responseData.status == 202) { if (responseData.status == 202) {
console.log('Pin validated!'); console.log('Pin validated!');
@ -142,81 +147,29 @@ export class UserService{
return obs; return obs;
} }
addOwner(oData: {first: string, last: string, phone: string, name: string, street: string, city: string, state: string, postal: string, country: string, email: string, website: string}) { addOwner(owner: Owner) {
let obs = this.http.post(this.beUrl+'api/owner', {payload: oData}, {headers: this.reqHeaders, params: this.reqParams}); owner.address = this.dataStore.user.address;
let obs = this.http.post(this.beUrl+'api/owner', {payload: owner}, {headers: this.reqHeaders});
obs.subscribe({ obs.subscribe((responseData) => {
next: () => { //console.log("Entra a console log");
//console.log("Entra a console log"); this.getOwner(this.dataStore.user.address);
this.getOwner(); }, (error) => {
}, //console.log("Status is : [" + error.status + "]");
error: (error) => { if ( error.status = 500 ) {
//console.log("Status is : [" + error.status + "]"); this.notifierService
if ( error.status = 500 ) { .showNotification("Invalid Viewing Key, changes not saved!!","Close",'error');
this.notifierService.showNotification("Invalid Viewing Key, changes not saved!!","Close",'error'); };
};
}
}); });
return obs; return obs;
} }
saveOwnerSettings(o: Owner) { getOwner(address: string) {
//console.log('saveOwnerSettings: ' + o.viewkey); console.log('getOwner', address);
if(o.viewkey.length > 20) { const ownParams = new HttpParams().append('address', address);
this.saveOwnerViewingKey(o.viewkey).subscribe({ let obs = this.http.get<{message:string, owner: any}>(this.beUrl+'api/owner', { headers: this.reqHeaders, params: ownParams, observe: 'response'});
next: () => {
let obs = this.http.post(this.beUrl + 'api/ownersettings', {payload: o}, {headers: this.reqHeaders, params: this.reqParams});
obs.subscribe({
next: () => {
this.getOwner();
},
error: (error) => {
if ( error.status == 500 ){
this.notifierService.showNotification("Saving settings failed", "Close", "error")
}
}
});
}
});
} else {
let obs = this.http.post(this.beUrl + 'api/ownersettings', {payload: o}, {headers: this.reqHeaders, params: this.reqParams});
obs.subscribe({
next: () => {
this.getOwner();
},
error: (error) => {
if ( error.status == 500 ){
this.notifierService.showNotification("Saving settings failed", "Close", "error")
}
}
});
}
}
saveOwnerViewingKey(vk: string){
let obs = this.http.post(this.beUrl + 'api/ownervk', {payload: vk}, {headers: this.reqHeaders, params: this.reqParams});
obs.subscribe({
next: () => {
this.getOwner();
},
error: (error) => {
if (error.status == 400) {
this.notifierService.showNotification('Invalid viewing key, changes not saved', 'Close', 'error');
} else if (error.status == 403) {
this.notifierService.showNotification('Viewing key does not match shop, changes not saved', 'Close', 'error');
}
}
});
return obs;
}
getOwner() {
//console.log('getOwner', address);
//const ownParams = this.reqParams.append('address', address)
let obs = this.http.get<{message:string, owner: any}>(this.beUrl+'api/owner', { headers: this.reqHeaders, params: this.reqParams, observe: 'response'});
obs.subscribe((OwnerDataResponse) => { obs.subscribe((OwnerDataResponse) => {
//console.log('api/getowner', OwnerDataResponse.status); //console.log('api/getowner', OwnerDataResponse.status);
@ -234,19 +187,16 @@ export class UserService{
} }
deleteUser() { deleteUser() {
let obs = this.http.delete<{message: string}>(this.beUrl+'api/user/'+this.dataStore.user._id, {headers: this.reqHeaders, params: this.reqParams }); let obs = this.http.delete<{message: string}>(this.beUrl+'api/user/'+this.dataStore.user._id, {headers: this.reqHeaders });
obs.subscribe({next: () => { obs.subscribe(UserResponse => {
//console.log('User delete request sent.'); //console.log('User delete request sent.');
this.findUser(); this.findUser();
}}); });
return obs; return obs;
} }
saveSettings(o: Owner) {
}
currentOwner() : Owner { currentOwner() : Owner {
return this.dataStore.owner; return this.dataStore.owner;
} }

View file

@ -1,3 +0,0 @@
export interface viewElement {
text: string;
}

View file

@ -12,13 +12,13 @@
<div class="main-buttons"> <div class="main-buttons">
<button mat-raised-button color="primary" <button mat-raised-button color="primary"
[routerLink]="['/orders']"> [routerLink]="['/orders']">
{{ vE.viewerViewOrders }} View Orders
</button> </button>
<button mat-icon-button color="primary" <button mat-raised-button color="primary"
(click)="openSettings()"> class="text" (click)="openSettings()">
<mat-icon class="icon">manage_accounts</mat-icon> <mat-icon class="icon">manage_accounts</mat-icon>
</button> </button>
<a mat-icon-button color="primary" <a mat-raised-button color="primary"
href="https://zgo.cash/" href="https://zgo.cash/"
target="_blank" target="_blank"
rel="noopener noreferrer"> rel="noopener noreferrer">

View file

@ -1,15 +1,15 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit, OnDestroy } from '@angular/core';
import { Router } from '@angular/router'; import { CanActivate, Router, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router';
import { MatDialog, MatDialogConfig } from '@angular/material/dialog'; import { MatDialog, MatDialogConfig } from '@angular/material/dialog';
import { UserService } from '../user.service'; import { UserService } from '../user.service';
import { FullnodeService } from '../fullnode.service'; import { FullnodeService } from '../fullnode.service';
import { Observable } from 'rxjs'; import { ItemService } from '../items/items.service';
import { Subscription, Observable } from 'rxjs';
import { SettingsComponent } from '../settings/settings.component'; import { SettingsComponent } from '../settings/settings.component';
import {Owner} from '../owner.model'; import {Owner} from '../owner.model';
import {User} from '../user.model'; import {User} from '../user.model';
import { LanguageService } from '../language.service';
@Component({ @Component({
selector: 'app-viewer', selector: 'app-viewer',
@ -36,14 +36,23 @@ export class ViewerComponent implements OnInit {
taxValue: 0, taxValue: 0,
vat: false, vat: false,
vatValue: 0, vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false, paid: false,
website: '',
country: '',
zats: false, zats: false,
invoices: false, invoices: false,
expiration: new Date(Date.now()).toISOString(), expiration: new Date(Date.now()).toISOString(),
payconf: false, payconf: false,
crmToken: '',
viewkey: '', viewkey: '',
tips: false crmToken: ''
}; };
public price: number = 1; public price: number = 1;
public addrUpdate: Observable<string>; public addrUpdate: Observable<string>;
@ -51,20 +60,12 @@ export class ViewerComponent implements OnInit {
public userUpdate: Observable<User>; public userUpdate: Observable<User>;
public priceUpdate: Observable<number>; public priceUpdate: Observable<number>;
orientation: boolean = false; orientation: boolean = false;
//
// Language Support
//
vE = {
viewerViewOrders : ''
}
//
// ------------------------------------------------------------
constructor( constructor(
public fullnodeService: FullnodeService, public fullnodeService: FullnodeService,
private router: Router, private router: Router,
public userService: UserService, public userService: UserService,
private dialog: MatDialog, private dialog: MatDialog
private languageService: LanguageService
){ ){
this.addrUpdate = fullnodeService.addrUpdate; this.addrUpdate = fullnodeService.addrUpdate;
this.ownerUpdate = userService.ownerUpdate; this.ownerUpdate = userService.ownerUpdate;
@ -85,7 +86,6 @@ export class ViewerComponent implements OnInit {
} }
ngOnInit(){ ngOnInit(){
this.chgUILanguage();
this.orientation = (window.innerWidth <= 500); this.orientation = (window.innerWidth <= 500);
this.ownerUpdate.subscribe((owner) => { this.ownerUpdate.subscribe((owner) => {
this.message = owner.name; this.message = owner.name;
@ -116,13 +116,13 @@ export class ViewerComponent implements OnInit {
dialogConfig.disableClose = true; dialogConfig.disableClose = true;
dialogConfig.autoFocus = true; dialogConfig.autoFocus = true;
dialogConfig.data = {o: this.owner}; dialogConfig.data = this.owner;
const dialogRef = this.dialog.open(SettingsComponent, dialogConfig); const dialogRef = this.dialog.open(SettingsComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => { dialogRef.afterClosed().subscribe((val) => {
if (val != null) { if (val != null) {
//console.log('Saving settings', val); //console.log('Saving settings', val);
this.userService.saveOwnerSettings(val); this.userService.addOwner(val);
this.fullnodeService.getPrice(val.currency); this.fullnodeService.getPrice(val.currency);
this.loginCheck(); this.loginCheck();
} }
@ -137,26 +137,10 @@ export class ViewerComponent implements OnInit {
this.user = user; this.user = user;
//console.log('Viewer loginCheck', this.user); //console.log('Viewer loginCheck', this.user);
if (!this.owner.paid || !this.user.validated) { if (!this.owner.paid || !this.user.validated) {
// console.log('Log in expired!'); console.log('Log in expired!');
this.router.navigate(['/login']); this.router.navigate(['/login']);
} }
}); });
}); });
} }
chgUILanguage(){
//console.log('VIEWER.chgUILanguage Called ');
this.languageService.getViewElements('viewer').subscribe({
next: response => {
//console.log('Received >> ', response );
//console.log('Language Code : ', response.language);
//console.log('Component Name : ',response.component);
//console.log('Language data : ',response.data);
this.vE.viewerViewOrders = response.data.viewer_view_orders;
},
error: error => { console.log('Error >> ',error); }
});
}
} }

View file

@ -12,11 +12,9 @@ var Buffer = require('buffer/').Buffer;
export class WoocommerceService { export class WoocommerceService {
beUrl = ConfigData.Be_URL; beUrl = ConfigData.Be_URL;
private reqHeaders: HttpHeaders; private reqHeaders: HttpHeaders;
private reqParams: HttpParams;
private ownerId: string = ''; private ownerId: string = '';
private token: string = ''; private token: string = '';
private siteurl: string = ''; private siteurl: string = '';
private session: null | string;
private _ownerIdUpdated: BehaviorSubject<string> = new BehaviorSubject(this.ownerId); private _ownerIdUpdated: BehaviorSubject<string> = new BehaviorSubject(this.ownerId);
private _tokenUpdated: BehaviorSubject<string> = new BehaviorSubject(this.token); private _tokenUpdated: BehaviorSubject<string> = new BehaviorSubject(this.token);
private _siteurlUpdated: BehaviorSubject<string> = new BehaviorSubject(this.siteurl); private _siteurlUpdated: BehaviorSubject<string> = new BehaviorSubject(this.siteurl);
@ -29,15 +27,13 @@ export class WoocommerceService {
) { ) {
var auth = 'Basic ' + Buffer.from(ConfigData.UsrPwd).toString('base64'); var auth = 'Basic ' + Buffer.from(ConfigData.UsrPwd).toString('base64');
this.reqHeaders = new HttpHeaders().set('Authorization', auth); this.reqHeaders = new HttpHeaders().set('Authorization', auth);
this.session = localStorage.getItem('s4z_token');
this.reqParams = new HttpParams().append('session', this.session!);
this._ownerIdUpdated.next(Object.assign({}, this).ownerId); this._ownerIdUpdated.next(Object.assign({}, this).ownerId);
this._tokenUpdated.next(Object.assign({}, this).token); this._tokenUpdated.next(Object.assign({}, this).token);
this._siteurlUpdated.next(Object.assign({}, this).siteurl); this._siteurlUpdated.next(Object.assign({}, this).siteurl);
} }
getWooToken(ownerId: string) { getWooToken(ownerId: string) {
const params = this.reqParams.append('ownerid', ownerId); const params = new HttpParams().append('ownerid', ownerId);
let obs = this.http.get<{ownerid: string, token: string, siteurl: string}>(this.beUrl + 'api/wootoken', {headers: this.reqHeaders, params: params, observe: 'response'}); let obs = this.http.get<{ownerid: string, token: string, siteurl: string}>(this.beUrl + 'api/wootoken', {headers: this.reqHeaders, params: params, observe: 'response'});
obs.subscribe(tokenResponse => { obs.subscribe(tokenResponse => {
if (tokenResponse.status == 200) { if (tokenResponse.status == 200) {
@ -55,7 +51,7 @@ export class WoocommerceService {
} }
createWooToken(ownerId: string) { createWooToken(ownerId: string) {
const params = this.reqParams.append('ownerid', ownerId); const params = new HttpParams().append('ownerid', ownerId);
let obs = this.http.post(this.beUrl+'api/wootoken', {}, {headers: this.reqHeaders, params: params, observe: 'response'}); let obs = this.http.post(this.beUrl+'api/wootoken', {}, {headers: this.reqHeaders, params: params, observe: 'response'});
obs.subscribe(responseData => { obs.subscribe(responseData => {
if (responseData.status == 202) { if (responseData.status == 202) {

View file

@ -24,7 +24,7 @@ export class XeroService {
savedAcc : boolean = false; savedAcc : boolean = false;
public savedAccObs = new Observable((observer) => { public savedAccObs = new Observable((observer) => {
//console.log("starting savedAccObs"); console.log("starting savedAccObs");
setTimeout(() => {observer.next(this.savedAcc)},1000); setTimeout(() => {observer.next(this.savedAcc)},1000);
}) })
@ -37,26 +37,24 @@ export class XeroService {
public readonly tokenUpdate: Observable<any> = this._tokenUpdated.asObservable(); public readonly tokenUpdate: Observable<any> = this._tokenUpdated.asObservable();
public readonly accCodeUpdate: Observable<string> = this._accCodeUpdated.asObservable(); public readonly accCodeUpdate: Observable<string> = this._accCodeUpdated.asObservable();
private reqHeaders: HttpHeaders; private reqHeaders: HttpHeaders;
private reqParams: HttpParams;
private session: null | string;
constructor( constructor(
private http: HttpClient private http: HttpClient
) { ) {
var auth = 'Basic ' + Buffer.from(ConfigData.UsrPwd).toString('base64'); var auth = 'Basic ' + Buffer.from(ConfigData.UsrPwd).toString('base64');
this.reqHeaders = new HttpHeaders().set('Authorization', auth); this.reqHeaders = new HttpHeaders().set('Authorization', auth);
this.session = localStorage.getItem('s4z_token');
this.reqParams = new HttpParams().append('session', this.session!);
this.getXeroConfig(); this.getXeroConfig();
} }
getXeroConfig(){ getXeroConfig(){
let obs = this.http.get<{message: string, xeroConfig: any}>(this.beUrl+'api/xero', { headers:this.reqHeaders, observe: 'response', params: this.reqParams}); let obs = this.http.get<{message: string, xeroConfig: any}>(this.beUrl+'api/xero', { headers:this.reqHeaders, observe: 'response'});
obs.subscribe(xeroDataResponse => { obs.subscribe(xeroDataResponse => {
if (xeroDataResponse.status == 200) { if (xeroDataResponse.status == 200) {
this.clientId = xeroDataResponse.body!.xeroConfig.clientId; this.clientId = xeroDataResponse.body!.xeroConfig.clientId;
//this.clientSecret = xeroDataResponse.body!.xeroConfig.clientSecret;
this._clientIdUpdated.next(Object.assign({}, this).clientId); this._clientIdUpdated.next(Object.assign({}, this).clientId);
//this._clientSecretUpdated.next(Object.assign({}, this).clientSecret);
} else { } else {
console.log('No config in DB!'); console.log('No config in DB!');
} }
@ -65,14 +63,15 @@ export class XeroService {
return obs; return obs;
} }
getXeroAccessToken(code: string){ getXeroAccessToken(code: string, address: string){
const params = this.reqParams.append('code', code); const params = new HttpParams().append('code', code).append('address', address);
let obs = this.http.get(this.beUrl + 'api/xerotoken' , {headers: this.reqHeaders, params: params, observe: 'response'}); let obs = this.http.get(this.beUrl + 'api/xerotoken' , {headers: this.reqHeaders, params: params, observe: 'response'});
return obs; return obs;
} }
getXeroAccountCode(){ getXeroAccountCode(address: string){
let obs = this.http.get<{message: string, code: string}>(this.beUrl + 'api/xeroaccount', {headers: this.reqHeaders, params: this.reqParams, observe: 'response'}); const params = new HttpParams().append('address', address);
let obs = this.http.get<{message: string, code: string}>(this.beUrl + 'api/xeroaccount', {headers: this.reqHeaders, params: params, observe: 'response'});
obs.subscribe(accountResponse => { obs.subscribe(accountResponse => {
if (accountResponse.status == 200) { if (accountResponse.status == 200) {
this.xeroAcc = accountResponse.body!.code; this.xeroAcc = accountResponse.body!.code;
@ -86,7 +85,7 @@ export class XeroService {
setXeroAccountCode(address: string, code: string) { setXeroAccountCode(address: string, code: string) {
const params = this.reqParams.append('address', address).append('code', code); const params = new HttpParams().append('address', address).append('code', code);
let obs = this.http.post(this.beUrl + 'api/xeroaccount', {}, {headers: this.reqHeaders, params: params, observe: 'response'}); let obs = this.http.post(this.beUrl + 'api/xeroaccount', {}, {headers: this.reqHeaders, params: params, observe: 'response'});
/* /*
obs.subscribe(responseData => { obs.subscribe(responseData => {

View file

@ -1,6 +1,6 @@
<div *ngIf="!flag" align="center" class="text"> <div *ngIf="!flag" align="center" class="text">
<h1>{{ vE.xeroConnecting2xero }}</h1> <h1>Connecting to Xero...</h1>
</div> </div>
<div *ngIf="flag" align="center" class="text"> <div *ngIf="flag" align="center" class="text">
<h1>{{ vE.xeroConnected2xero }}</h1> <h1>Connected to Xero!</h1>
</div> </div>

View file

@ -5,8 +5,6 @@ import { XeroService } from '../xero.service';
import { Owner } from '../owner.model'; import { Owner } from '../owner.model';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { LanguageService } from '../language.service';
var Buffer = require('buffer/').Buffer; var Buffer = require('buffer/').Buffer;
function sleep(ms:number) { function sleep(ms:number) {
@ -24,9 +22,9 @@ async function redirect(r: Router) {
styleUrls: ['./xeroreg.component.css'] styleUrls: ['./xeroreg.component.css']
}) })
export class XeroRegComponent implements OnInit { export class XeroRegComponent implements OnInit {
public owner:Owner = { public owner:Owner = {
_id: '',
address: '', address: '',
name: '', name: '',
currency: '', currency: '',
@ -34,28 +32,30 @@ export class XeroRegComponent implements OnInit {
taxValue:0, taxValue:0,
vat: false, vat: false,
vatValue: 0, vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false, paid: false,
website: '',
country: '',
zats: false, zats: false,
invoices: false, invoices: false,
expiration: new Date(Date.now()).toISOString(), expiration: new Date(Date.now()).toISOString(),
payconf: false, payconf: false,
crmToken: '',
viewkey: '', viewkey: '',
tips: false crmToken: ''
}; };
public ownerUpdate:Observable<Owner>; public ownerUpdate:Observable<Owner>;
public flag: boolean = false; public flag: boolean = false;
// -------------------------------------
//
// Language Support
//
vE = {
xeroConnecting2xero : '',
xeroConnected2xero : '',
}
//
constructor( constructor(
private languageService : LanguageService,
public xeroService: XeroService, public xeroService: XeroService,
public userService: UserService, public userService: UserService,
private router: Router, private router: Router,
@ -69,22 +69,21 @@ export class XeroRegComponent implements OnInit {
} }
ngOnInit(): void { ngOnInit(): void {
this.chgUILanguage();
} }
ngAfterViewInit(): void { ngAfterViewInit(): void {
this.ownerUpdate.subscribe((owner) => { this.ownerUpdate.subscribe((owner) => {
this.owner = owner; this.owner = owner;
this.activatedRoute.queryParams.subscribe((params) => { this.activatedRoute.queryParams.subscribe((params) => {
//console.log(params); console.log(params);
if (params.state === this.owner.address.substring(0,6)) { if (params.state === this.owner.address.substring(0,6)) {
this.xeroService.getXeroAccessToken(params.code).subscribe(tokenData => { this.xeroService.getXeroAccessToken(params.code, this.owner.address).subscribe(tokenData => {
if (tokenData.status == 200) { if (tokenData.status == 200) {
//console.log(tokenData.body!); console.log(tokenData.body!);
this.flag = true; this.flag = true;
redirect(this.router); redirect(this.router);
} else { } else {
//console.log('Error: '+tokenData.status); console.log('Error: '+tokenData.status);
this.flag = false; this.flag = false;
} }
}); });
@ -96,21 +95,4 @@ export class XeroRegComponent implements OnInit {
}); });
} }
chgUILanguage(){
//console.log('XERO.chgUILanguage Called ');
this.languageService.getViewElements('xero').subscribe({
next: response => {
//console.log('Received >> ', response );
//console.log('Language Code : ', response.language);
//console.log('Component Name : ',response.component);
//console.log('Language data : ',response.data);
this.vE.xeroConnecting2xero = response.data.xero_connecting_2xero;
this.vE.xeroConnected2xero = response.data.xero_connected_2xero;
},
error: error => { console.log('Error >> ',error); }
});
}
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

Some files were not shown because too many files have changed in this diff Show more