Compare commits

...

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

165 changed files with 17516 additions and 16194 deletions

View File

@ -1,234 +0,0 @@
# Changelog
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).
## [2.4.1] - 2024-01-31
### 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
- Support for WooComerce:
- New tab in Settings to generate authentication token.
- Display of WooCommerce credentials for configuration.
- New service to interact with WooCommerce-related API endpoints.
- A "Return To Shop" button added to ZGo Invoice component
## [1.3.2] - 2022-10-11
### Added
- New component added to export orders in CSV format. Allows users to download orders.
## [1.3.1] - 2022-10-08
### Fixed
- Bug [#7](https://gitlab.com/pitmutt/zgo/-/issues/7) for saving a viewing key.
## [1.3.0] - 2022-10-01
### Added
- Added new connection for Xero account code
- Added new service for Xero integration
### Changed
- Login updated to price sessions in USD and include the Pro service.
- Settings component updated for compatibility with Android devices
- Settings component updated to use observable when saving Account Code
- xeroService's saveAccountCode function optimized to export observable
- Field for Xero's AccountCode added to Settings component's integration tab
- Listorders component updated to show date in ANSI international format.
- Settings component updated to use owner's invoices field to control
integrations tab (Pro version)
- Orders list updated to show payment confirmation only when service is
activated and a viewing key exists.
- Updated Order and Owner model to include new Xero integration fields
## [1.2.2] - 2022-08-05
### Added
- Convenience buttons on checkout for wallets that are not ZIP-321-compliant
- 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
- Memo for checkout orders
## [1.2.1] - 2022-08-01
### Changed
- Improved formatting of dialogs
## [1.2.0] - 2022-07-27
### Added
- Dialogs created for viewing invoices and receipts URLs
- Notifier service created - replaces snackbar used for reporting invalid viewing key.
- Notifier component created - used to apply custom style to message sent by Notifier service.
- Notification to user when the submitted viewing key is not valid
### Changed
- Item dialog look and feel reviewed and updated
- Order list look and feel reviewed and updated
- Available Items list look and feel reviewed and updated
- Set configuration global parameters in one place
- Receipt look and feel reviewed and updated
- Invoice look and feel reviewed and updated
- Checkout dialog with QR code reviewed and updated
- Invoice dialog completed. Notifications to inform successful/failed URL-copy-to-clipboard added.
- Obsolete function `updateOwner` removed
- Buttons in main shop page have been enclosed to display inside a fixed area.
- Shop page buttons redesigned
- Settings form redesigned
- Order list look and feel reviewed and updated - some unused CSS classes removed.
- Added viewing key field to owner model
- Paid status icons added to order's title
- Order detail redesigned
### Fixed
- Fixed order memo for checkout
- Fixed display of amounts in item list when using *zatoshis*
- Fixed sorting of items in list
- Fixed sorting of orders in list
## [1.1.2] - 2022-05-24
### Added
- Button in QR code prompt to copy ZGo address.
- Button in QR code prompt to copy transaction amount.
- Button in QR code prompt to copy transaction memo.
## [1.1.1] - 2022-05-24
### Added
- Invoice display via URL
- Invoice button for closing order
- Field `paid` for Order type
## [1.1.0] - 2022-05-20
### Changed
- Services interacting with backend API were modified to support the new [ZGo Backend](https://gitlabl.com/pitmutt/zgo-backend).
### Removed
- NodeJS back-end

View File

@ -1,7 +0,0 @@
Copyright (c) 2022 Vergara Technologies LLC
This package ("Original Work") is licensed under the terms of the Bootstrap
Open Source License, version 1.0, or at your option, any later version
("BOSL"). See the file ./LICENSE for the terms of the Bootstrap Open Source
Licence, version 1.0.

192
LICENSE
View File

@ -1,178 +1,20 @@
Copyright (c) 2022 Vergara Technologies
The MIT License (MIT)
Copyright © 2022 Vergara Technologies LLC
=======================================================
Bootstrap Open Source Licence ("BOSL") v. 1.0
=======================================================
This Bootstrap Open Source Licence (the "License") applies to any original work
of authorship (the "Original Work") whose owner (the "Licensor") has placed the
following licensing notice adjacent to the copyright notice for the Original
Work:
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the “Software”), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
*Licensed under the Bootstrap Open Source Licence version 1.0*
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
1. **Grant of Copyright License.** Licensor grants You a worldwide,
royalty-free, non-exclusive, sublicensable license, for the duration of the
copyright in the Original Work, to do the following:
a. to reproduce the Original Work in copies, either alone or as part of
a collective work;
b. to translate, adapt, alter, transform, modify, or arrange the
Original Work, thereby creating derivative works ("Derivative Works")
based upon the Original Work;
c. to distribute or communicate copies of the Original Work and
Derivative Works to the public, provided that prior to any such
distribution or communication You first place a machine-readable copy
of the Source Code of the Original Work and such Derivative Works that
You intend to distribute or communicate in an information repository
reasonably calculated to permit inexpensive and convenient access
thereto by the public (“Information Repository”) for as long as You
continue to distribute or communicate said copies, accompanied by an
irrevocable offer to license said copies to the public free of charge
under this License, said offer valid starting no later than 12 months
after You first distribute or communicate said copies;
d. to perform the Original Work publicly; and
e. to display the Original Work publicly.
2. **Grant of Patent License.** Licensor grants You a worldwide, royalty-free,
non-exclusive, sublicensable license, under patent claims owned or controlled
by the Licensor that are embodied in the Original Work as furnished by the
Licensor, for the duration of the patents, to make, use, sell, offer for sale,
have made, and import the Original Work and Derivative Works.
3. **Grant of Source Code License.** The "Source Code" for a work means the
preferred form of the work for making modifications to it and all available
documentation describing how to modify the work. Licensor agrees to provide a
machine-readable copy of the Source Code of the Original Work along with each
copy of the Original Work that Licensor distributes. Licensor reserves the
right to satisfy this obligation by placing a machine-readable copy of said
Source Code in an Information Repository for as long as Licensor continues to
distribute the Original Work.
4. **Exclusions From License Grant.** Neither the names of Licensor, nor the
names of any contributors to the Original Work, nor any of their trademarks or
service marks, may be used to endorse or promote products derived from this
Original Work without express prior permission of the Licensor. Except as
expressly stated herein, nothing in this License grants any license to
Licensor's trademarks, copyrights, patents, trade secrets or any other
intellectual property. No patent license is granted to make, use, sell, offer
for sale, have made, or import embodiments of any patent claims other than the
licensed claims defined in Section 2. No license is granted to the trademarks
of Licensor even if such marks are included in the Original Work. Nothing in
this License shall be interpreted to prohibit Licensor from licensing under
terms different from this License any Original Work that Licensor otherwise
would have a right to license.
5. **External Deployment.** The term "External Deployment" means the use,
distribution, or communication of the Original Work or Derivative Works in any
way such that the Original Work or Derivative Works may be used by anyone other
than You, whether those works are distributed or communicated to those persons
or made available as an application intended for use over a network. As an
express condition for the grants of license hereunder, You must treat any
External Deployment by You of the Original Work or a Derivative Work as a
distribution under section 1(c).
6. **Attribution Rights.** You must retain, in the Source Code of any
Derivative Works that You create, all copyright, patent, or trademark notices
from the Source Code of the Original Work, as well as any notices of licensing
and any descriptive text identified therein as an "Attribution Notice." You
must cause the Source Code for any Derivative Works that You create to carry a
prominent Attribution Notice reasonably calculated to inform recipients that
You have modified the Original Work.
7. **Warranty of Provenance and Disclaimer of Warranty.** Licensor warrants
that the copyright in and to the Original Work and the patent rights granted
herein by Licensor are owned by the Licensor or are sublicensed to You under
the terms of this License with the permission of the contributor(s) of those
copyrights and patent rights. Except as expressly stated in the immediately
preceding sentence, the Original Work is provided under this License on an "AS
IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without
limitation, the warranties of non-infringement, merchantability or fitness for
a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS
WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this
License. No license to the Original Work is granted by this License except
under this disclaimer.
8. **Limitation of Liability.** Under no circumstances and under no legal
theory, whether in tort (including negligence), contract, or otherwise, shall
the Licensor be liable to anyone for any indirect, special, incidental, or
consequential damages of any character arising as a result of this License or
the use of the Original Work including, without limitation, damages for loss of
goodwill, work stoppage, computer failure or malfunction, or any and all other
commercial damages or losses. This limitation of liability shall not apply to
the extent applicable law prohibits such limitation.
9. **Acceptance and Termination.** If, at any time, You expressly assented to
this License, that assent indicates your clear and irrevocable acceptance of
this License and all of its terms and conditions. If You distribute or
communicate copies of the Original Work or a Derivative Work, You must make a
reasonable effort under the circumstances to obtain the express assent of
recipients to the terms of this License. This License conditions your rights to
undertake the activities listed in Section 1, including your right to create
Derivative Works based upon the Original Work, and doing so without honoring
these terms and conditions is prohibited by copyright law and international
treaty. Nothing in this License is intended to affect copyright exceptions and
limitations (including 'fair use' or 'fair dealing'). This License shall
terminate immediately and You may no longer exercise any of the rights granted
to You by this License upon your failure to honor the conditions in Section
1(c).
10. **Termination for Patent Action.** This License shall terminate
automatically and You may no longer exercise any of the rights granted to You
by this License as of the date You commence an action, including a cross-claim
or counterclaim, against Licensor or any licensee alleging that the Original
Work infringes a patent. This termination provision shall not apply for an
action alleging patent infringement by combinations of the Original Work with
other software or hardware.
11. **Jurisdiction, Venue and Governing Law.** Any action or suit relating to
this License may be brought only in the courts of a jurisdiction wherein the
Licensor resides or in which Licensor conducts its primary business, and under
the laws of that jurisdiction excluding its conflict-of-law provisions. The
application of the United Nations Convention on Contracts for the International
Sale of Goods is expressly excluded. Any use of the Original Work outside the
scope of this License or after its termination shall be subject to the
requirements and penalties of copyright or patent law in the appropriate
jurisdiction. This section shall survive the termination of this License.
12. **Attorneys' Fees.** In any action to enforce the terms of this License or
seeking damages relating thereto, the prevailing party shall be entitled to
recover its costs and expenses, including, without limitation, reasonable
attorneys' fees and costs incurred in connection with such action, including
any appeal of such action. This section shall survive the termination of this
License.
13. **Miscellaneous.** If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent necessary to
make it enforceable.
14. **Definition of "You" in This License.** "You" throughout this License,
whether in upper or lower case, means an individual or a legal entity
exercising rights under, and complying with all of the terms of, this License.
For legal entities, "You" includes any entity that controls, is controlled by,
or is under common control with you. For purposes of this definition, "control"
means (i) the power, direct or indirect, to cause the direction or management
of such entity, whether by contract or otherwise, or (ii) ownership of fifty
percent (50%) or more of the outstanding shares, or (iii) beneficial ownership
of such entity.
15. **Right to Use.** You may use the Original Work in all ways not otherwise
restricted or conditioned by this License or by law, and Licensor promises not
to interfere with or be responsible for such uses by You.
16. **Modification of This License.** This License is Copyright © 2007 Zooko
Wilcox-O'Hearn. Permission is granted to copy, distribute, or communicate this
License without modification. Nothing in this License permits You to modify
this License as applied to the Original Work or to Derivative Works. However,
You may modify the text of this License and copy, distribute or communicate
your modified version (the "Modified License") and apply it to other original
works of authorship subject to the following conditions: (i) You may not
indicate in any way that your Modified License is the "Bootstrap Open Source
Licence" or "BOSL" and you may not use those names in the name of your Modified
License; and (ii) You must replace the notice specified in the first paragraph
above with the notice "Licensed under <insert your license name here>" or with
a notice of your own that is not confusingly similar to the notice in this
License.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -1,7 +1,5 @@
# 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/)
Visit our [ZGo Homepage](https://zgo.cash/) for more details.

View File

@ -39,8 +39,8 @@
"budgets": [
{
"type": "initial",
"maximumWarning": "5mb",
"maximumError": "10mb"
"maximumWarning": "500kb",
"maximumError": "1mb"
},
{
"type": "anyComponentStyle",
@ -71,10 +71,10 @@
"builder": "@angular-devkit/build-angular:dev-server",
"configurations": {
"production": {
"buildTarget": "zgo:build:production"
"browserTarget": "zgo:build:production"
},
"development": {
"buildTarget": "zgo:build:development"
"browserTarget": "zgo:build:development"
}
},
"defaultConfiguration": "development"
@ -82,7 +82,7 @@
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"buildTarget": "zgo:build"
"browserTarget": "zgo:build"
}
},
"test": {
@ -105,5 +105,6 @@
}
}
}
}
},
"defaultProject": "zgo"
}

631
backend/app.js Normal file
View File

@ -0,0 +1,631 @@
const express = require('express');
const app = express();
const bodyparser = require('body-parser');
const cors = require('cors');
const crypto = require('crypto');
const postmodel = require('./models/post');
const usermodel = require('./models/user');
const ownermodel = require('./models/owner');
const itemmodel = require('./models/item');
const ordermodel = require('./models/order');
const pricemodel = require('./models/price');
const txmodel = require('./models/tx');
const paymentmodel = require('./models/payment');
const zecTxModel = require('./models/zectxs.js');
const countryModel = require('./models/country.js');
const mongoose = require('mongoose');
const stdrpc = require('stdrpc');
const CoinGecko = require('coingecko-api');
var URLSafeBase64 = require('urlsafe-base64');
var Buffer = require('buffer/').Buffer;
var db = require('./config/db');
mongoose.connect('mongodb://'+db.user+':'+db.password+'@'+db.server+'/'+db.database).then(() => {
console.log("connecting-- ", db.database);
}).catch(() => {
console.log("connection failed!");
});
var fullnode = require('./config/fullnode');
const rpc = stdrpc({
url: fullnode.url,
username: fullnode.username,
password: fullnode.password
});
var async = require('async');
const CoinGeckoClient = new CoinGecko();
var intervalObject = setInterval( function() {
CoinGeckoClient.simple.price({
ids: ['zcash'],
vs_currencies: ['usd', 'gbp', 'eur', 'cad', 'aud']
}).then((data) => {
pricemodel.findOneAndUpdate({currency: 'usd'}, { price: data.data.zcash.usd, timestamp: Date.now()}, {new:true, upsert:true}, function(err,docs) {
if(err) {
console.log(err);
}
});
pricemodel.findOneAndUpdate({currency: 'gbp'}, { price: data.data.zcash.gbp, timestamp: Date.now()}, {new:true, upsert:true}, function(err,docs) {
if(err) {
console.log(err);
}
});
pricemodel.findOneAndUpdate({currency: 'eur'}, { price: data.data.zcash.eur, timestamp: Date.now()}, {new:true, upsert:true}, function(err,docs) {
if(err) {
console.log(err);
}
});
pricemodel.findOneAndUpdate({currency: 'cad'}, { price: data.data.zcash.cad, timestamp: Date.now()}, {new:true, upsert:true}, function(err,docs) {
if(err) {
console.log(err);
}
});
pricemodel.findOneAndUpdate({currency: 'aud'}, { price: data.data.zcash.aud, timestamp: Date.now()}, {new:true, upsert:true}, function(err,docs) {
if(err) {
console.log(err);
}
});
}).catch((err) => {
console.log(err);
});
}, 90000);
function hexToString(hexString) {
var str = '';
for (var n=0; n < hexString.length; n +=2) {
str += String.fromCharCode(parseInt(hexString.substr(n, 2), 16));
}
return str;
}
function sendPin(pin, address) {
//var memo = URLSafeBase64.encode(Buffer.from('ZGO pin: '.concat(pin)));
var memo = Buffer.from('ZGo PIN: '.concat(pin)).toString('hex');
//console.log(typeof(memo));
var amounts = [
{
address: address,
amount: 0.00000001,
memo: memo
}
];
rpc.z_sendmany(fullnode.addr, amounts).catch((err) => {
console.log('Sendmany', err);
});
}
var blockInterval = setInterval( function() {
console.log('Node periodic Zcash scan');
rpc.z_listreceivedbyaddress(fullnode.addr, 1).then(txs => {
var re = /.*ZGO::(.*)\sReply-To:\s(z\w+)/;
var pay = /.*ZGOp::(.*)/;
async.each (txs, function(txData, callback) {
var memo = hexToString(txData.memo).replace(/\0/g, '');
if (!txData.change) {
zecTxModel.updateOne({txid: txData.txid}, { txid: txData.txid, confirmations: txData.confirmations, amount:txData.amount, memo: memo}, {new:true, upsert:true}, function(err,docs) {
if (err) {
console.log(err);
}
});
}
if (re.test(memo) && txData.confirmations < 100) {
//console.log('Processing tx:', memo);
var match = re.exec(memo);
if (match != null) {
var address = match[2];
var session = match[1];
var blocktime = txData.blocktime;
var amount = txData.amount;
var expiration = blocktime;
//console.log(' ', session, blocktime);
txmodel.updateOne({txid: txData.txid}, { txid: txData.txid, address: address, session: session, confirmations: txData.confirmations, amount:txData.amount, memo: memo}, {new:true, upsert:true}, function(err,docs) {
if (err) {
console.log(err);
}
});
if (txData.confirmations >= 2 ) {
usermodel.findOne({address: address, session: session, blocktime: blocktime}).then(function(doc){
if (doc == null){
console.log('User not found', session, blocktime);
const n = crypto.randomInt(0, 10000000);
const pin = n.toString().padStart(6, '0');
sendPin(pin, address);
var user = new usermodel({
address: address,
session: session,
blocktime: blocktime,
pin: pin,
validated: false
});
user.save(function(error) {
if (error) {
console.log(error);
}
console.log('User saved');
});
}
});
}
}
}
var exptime = 0;
if (pay.test(memo) && txData.confirmations < 100) {
var match2 = pay.exec(memo);
if (match2 != null) {
var session = match2[1];
}
if (txData.amount >= 0.001 && txData.amount < 0.005){
exptime = txData.blocktime + 3600;
} else if (txData.amount >= 0.005 && txData.amount < 0.025){
exptime = txData.blocktime + 24*3600;
} else if (txData.amount >= 0.025 && txData.amount < 0.1) {
exptime = txData.blocktime + 7*24*3600;
} else if (txData.amount >= 0.1) {
exptime = txData.blocktime + 4*7*24*3600;
}
usermodel.findOne({session: session}).then(function(doc){
if(doc != null) {
paymentmodel.findOne({address: doc.address, blocktime: txData.blocktime, amount: txData.amount}).then(function(payments){
if(payments == null){
var payment = new paymentmodel({
address: doc.address,
blocktime: txData.blocktime,
expiration: new Date(exptime * 1000),
amount: txData.amount,
session: doc.session
});
payment.save(function(error) {
if (error) {
console.log(error);
} else {
console.log('Payment saved');
}
});
}
});
}
});
}
}, function (err) {
if (err) {
console.log(err);
}
console.log('Txs synced');
});
});
}, 75000);
var payCheck = setInterval( function() {
ownermodel.find({}).then((documents) => {
if(documents.length > 0){
//console.log(documents);
async.each (documents, function(document, callback) {
paymentmodel.findOne({ address: document.address, expiration: {$gt: Date.now()}}).then(payment => {
if (payment != null){
document.paid = true;
document.save();
} else {
document.paid = false;
document.save();
}
});
}, function (err) {
if (err) {
console.log(err);
} else {
console.log("Owners checked for payment");
}
});
}
});
}, 60000);
app.use(cors());
app.options('*', cors());
app.use(bodyparser.json());
app.use((req, res, next) => {
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.setHeader("Access-Control-Allow-Methods", "GET, POST, PATCH, DELETE, OPTIONS");
next();
});
app.use((req, res, next) => {
if (req.headers.authorization !== 'YourAPIkey' ) {
return res.status(401).send('Authorization required.');
} else {
next();
}
});
app.get('/api/countries', (req, res, next) => {
console.log('Get: /api/countries');
countryModel.find({}).then((documents) => {
if (documents != null) {
res.status(200).json({
message: 'Country data found',
countries: documents
});
} else {
res.status(204).json({
message: 'No country data available'
});
}
});
});
app.get('/api/users', (req, res, next) => {
console.log('Get: /api/users');
usermodel.find({'address': req.query.address, 'session': req.query.session, 'expired': { $ne: true}}).
then((documents) => {
if (documents != null) {
res.status(200).json({
message: 'Users found successfully',
users: documents
});
} else {
res.status(204).json({
message: 'User not found',
users: null
});
}
});
});
app.get('/api/pending', (req, res, next) => {
console.log('Get: /api/pending', req.query.session);
txmodel.find({'session': req.query.session, 'confirmations': {$lt: 10}}).
then((documents) => {
if (documents.length > 0) {
//console.log('pending', documents);
res.status(200).json({
message: 'Found pending txs',
txs: documents
});
} else {
//console.log('pending not found', documents);
res.status(204).json({
message: 'No txs found',
txs: null
});
}
});
});
app.get('/api/getuser', (req, res, next) => {
console.log('Get: /api/getuser/', req.query.session);
usermodel.find({'session': req.query.session, 'expired': { $ne: true }}).
then((documents) => {
if(documents.length > 0){
//console.log(documents);
console.log(' found user');
res.status(200).json({
message: 'User found!',
user: documents
});
} else {
console.log(' did not find user');
res.status(204).json({
message: 'User not found!',
user: null
});
}
});
});
app.get('/api/blockheight', (req, res, next) => {
console.log('Get: /api/blockheight');
rpc.getblock("-1", 1).then(block => {
res.status(200).json({
message: 'Found block',
height: block.height
});
});
});
app.get('/api/txs', (req, res, next) => {
console.log('Get: /api/txs');
rpc.z_listreceivedbyaddress(fullnode.addr, 10).then(txs => {
res.status(200).json({
message: 'Transactions found',
txs: txs
});
});
});
app.get('/api/getaddr', (req, res, next) => {
console.log('Get: /api/getaddr');
res.status(200).json({
message: 'Sending address',
addr: fullnode.addr
});
});
app.get('/api/getowner', (req, res, next) => {
console.log('Get: /api/getowner');
ownermodel.find({'address': req.query.address}).then((documents) => {
if(documents.length > 0){
//console.log(documents);
res.status(200).json({
message: 'Owner found!',
owner: documents
});
} else {
res.status(204).json({
message: 'Owner not found!',
owner: null
});
}
});
});
app.post('/api/addowner', (req, res, next) => {
console.log('Post: /api/addowner');
const owner = new ownermodel(req.body.owner);
owner.save();
res.status(201).json({
message: 'Owner added successfully'
});
});
app.post('/api/validateuser', (req, res, next) => {
console.log('Post: /api/validateuser');
usermodel.findByIdAndUpdate(req.body.user._id, req.body.user,
function(err, docs) {
if (err) {
console.log(err);
} else {
res.status(201).json({
message: 'User Validated',
user: docs
});
}
});
});
app.post('/api/updateowner', (req, res, next) => {
console.log('Post: /api/updateowner');
ownermodel.findByIdAndUpdate(req.body.owner._id, req.body.owner,
function(err, docs) {
if (err) {
console.log(err);
} else {
console.log(docs);
res.status(201).json({
message: 'Owner updated',
owner: docs
});
}
});
});
app.get('/api/getitems', (req, res, next) => {
console.log('Get: /api/getitems');
//console.log('getitems', req.query.address);
if (req.query.address.length > 0 ) {
const items = itemmodel.find({user: req.query.address}).then((documents) => {
if(documents.length > 0){
//console.log(documents);
res.status(200).json({
message: 'items found!',
items: documents
});
} else {
res.status(204).json({
message: 'items not found!',
items: []
});
}
});
} else {
res.status(204).json({
message: 'no address',
items: []
});
}
});
app.post('/api/item', (req, res, next) => {
console.log('Post: /api/item', req.body.item);
if ( req.body.item._id == null ) {
const item = new itemmodel(req.body.item);
item.save();
res.status(201).json({
message: 'Item added'
});
} else {
console.log('Editing', req.body.item._id);
itemmodel.findByIdAndUpdate(req.body.item._id, {'name': req.body.item.name, 'description': req.body.item.description, 'cost': req.body.item.cost},
function(err, docs) {
if (err) {
console.log(err);
} else {
res.status(201).json({
message: 'Item updated'
});
}
});
}
});
app.delete('/api/item/:id', (req, res, next) => {
console.log('delete endpoint', req.params.id);
itemmodel.findByIdAndDelete(req.params.id, function (err, docs) {
if (err) {
console.log(err);
} else {
res.status(200).json({
message: 'Item deleted'
});
}
});
});
app.delete('/api/user/:id', (req, res, next) => {
console.log("Delete user", req.params.id);
usermodel.findByIdAndUpdate(req.params.id, {expired: true}, function(err, docs) {
if (err) {
console.log(err);
} else {
res.status(200).json({
message: 'User session deleted'
});
}
});
});
app.get('/api/price', (req, res, next) => {
console.log('Get /api/price');
const price = pricemodel.findOne({currency: req.query.currency}).then((document) => {
if (document != null) {
res.status(200).json({
message: 'price found!',
price: document
});
} else {
res.status(204).json({
message: 'no price found!',
order: null
});
}
});
});
app.get('/api/allorders', (req, res, next) => {
console.log('Get /api/allorders');
if (req.query.address.length > 0) {
const orders = ordermodel.find({address: req.query.address, closed: true}).then((documents) => {
if (documents != null) {
res.status(200).json({
message: 'orders found!',
orders: documents
});
} else {
res.status(204).json({
message: 'no orders found',
orders: null
});
}
});
}
});
app.get('/api/receipt', (req, res, next) => {
console.log('Get /api/receipt');
if (req.query.id.length > 0) {
const order = ordermodel.findOne({_id: req.query.id}).then((documents) => {
if (documents != null) {
console.log(documents);
res.status(200).json({
message: 'order found!',
order: documents
});
} else {
res.status(204).json({
message: 'no order found!',
order: null
});
}
});
} else {
res.status(204).json({
message: 'no valid ID received',
order: null
});
}
});
app.get('/api/order', (req, res, next) => {
console.log('Get /api/order');
if (req.query.session.length > 0) {
const order = ordermodel.findOne({session: req.query.session, closed: false}).then((documents) => {
if (documents != null) {
console.log(documents);
res.status(200).json({
message: 'order found!',
order: documents
});
} else {
res.status(204).json({
message: 'no order found!',
order: null
});
}
});
} else {
res.status(204).json({
message: 'no session received',
order: null
});
}
});
app.post('/api/order', (req, res, next) => {
console.log('Post /api/order', req.body);
if(req.body.order._id == null) {
const order = new ordermodel(req.body.order);
order.save();
res.status(200).json({
message: 'Order added',
order: order
});
} else {
ordermodel.findByIdAndUpdate(req.body.order._id, {
address: req.body.order.address,
session: req.body.order.session,
price: req.body.order.price,
total: req.body.order.total,
currency: req.body.order.currency,
totalZec: req.body.order.totalZec,
closed: req.body.order.closed
}, function(err, docs) {
if(err) {
console.log(err);
} else {
res.status(200).json({
message: 'Order updated'
});
}
});
}
});
app.post('/api/lineitem', (req, res, next) => {
console.log('Post /api/lineitem');
ordermodel.findByIdAndUpdate(req.body.order_id, { $push: {lines: req.body.line}}, function(err,docs) {
if (err) {
console.log(err);
} else {
res.status(200).json({
message: 'Item added to order'
});
}
});
});
app.delete('/api/order/:id', (req, res, next) => {
console.log('delete order endpoint', req.params.id);
ordermodel.findByIdAndDelete(req.params.id, function (err, docs) {
if (err) {
console.log(err);
} else {
console.log(docs);
res.status(200).json({
message: 'Order deleted'
});
}
});
});
module.exports = app;

6
backend/config/db.js Normal file
View File

@ -0,0 +1,6 @@
module.exports = {
server : 'localhost:27017',
user: 'dbuser',
password: 'dbpasswd',
database: 'zgo'
}

View File

@ -0,0 +1,6 @@
module.exports = {
url: 'http://localhost:8232',
username: 'user',
password: 'passwd',
addr: 'zaddress123123123123123123....'
}

View File

@ -0,0 +1,9 @@
const mongoose = require('mongoose');
const countrySchema = mongoose.Schema({
name: {type: String, required: true},
code: {type: Number, required: true}
});
module.exports = mongoose.model('Country', countrySchema);

10
backend/models/item.js Normal file
View File

@ -0,0 +1,10 @@
const mongoose = require('mongoose');
const itemSchema = mongoose.Schema({
name: {type: String, required: true},
description: {type: String, required: true},
user: {type: String, required: true},
cost: {type: Number, required: true}
});
module.exports = mongoose.model('Item', itemSchema);

19
backend/models/order.js Normal file
View File

@ -0,0 +1,19 @@
const mongoose = require('mongoose');
const orderSchema = mongoose.Schema({
address: {type: String, required: true},
session: {type: String, required: true},
timestamp: {type: Date, required: true, default: Date.now},
closed: { type: Boolean, required: true, default:false },
price: { type: Number, required: true},
currency: {type: String, required: true},
total: { type: Number},
totalZec: {type: Number},
lines: [{
qty: {type: Number, required: true, default: 1},
name: { type: String, required: true},
cost: { type: Number, required: true, default: 0}
}]
});
module.exports = mongoose.model('Order', orderSchema);

25
backend/models/owner.js Normal file
View File

@ -0,0 +1,25 @@
const mongoose = require('mongoose');
const ownerSchema = mongoose.Schema({
address: {type: String, required:true, unique:true},
name: {type: String, required:true},
currency: {type: String, required:true, default: 'usd'},
tax: {type: Boolean, required: true, default: false},
taxValue: {type: Number },
vat: {type: Boolean, required:true, default: false},
vatValue: {type: Number },
first: {type: String, required:true},
last: {type: String, required:true},
email: {type: String, required:true},
street: {type: String, required:true},
city: {type: String, required: true},
state: {type: String, required: true},
postal: {type: String, required: true},
phone: {type: String},
website: {type: String},
country: {type: String},
paid: {type: Boolean, required: true, default: false},
zats: {type: Boolean, required: true, default: false}
});
module.exports = mongoose.model('Owner', ownerSchema);

11
backend/models/payment.js Normal file
View File

@ -0,0 +1,11 @@
const mongoose = require('mongoose');
const paymentSchema = mongoose.Schema({
address: {type: String, required: true},
blocktime: {type: Number, required: true},
expiration: {type: Date, required: true},
amount: {type: Number, required: true},
session: {type: String, required: true}
});
module.exports = mongoose.model('Payment', paymentSchema);

8
backend/models/post.js Normal file
View File

@ -0,0 +1,8 @@
const mongoose = require('mongoose');
const postSchema = mongoose.Schema({
title: {type: String, required:true},
content: {type: String, required:true}
});
module.exports = mongoose.model('Post', postSchema);

10
backend/models/price.js Normal file
View File

@ -0,0 +1,10 @@
const mongoose = require('mongoose');
const priceSchema = mongoose.Schema({
currency: {type: String, required: true},
price: {type: Number, required: true},
timestamp: {type: Date, required: true, default: Date.now}
});
module.exports = mongoose.model('Price', priceSchema);

12
backend/models/tx.js Normal file
View File

@ -0,0 +1,12 @@
const mongoose = require('mongoose');
const txSchema = mongoose.Schema({
address: {type: String},
session: {type: String, required:true},
confirmations: {type: Number, required:true},
amount: {type: Number, required:true},
txid: {type:String, required:true, unique: true},
memo: {type:String}
});
module.exports = mongoose.model('Tx', txSchema);

12
backend/models/user.js Normal file
View File

@ -0,0 +1,12 @@
const mongoose = require('mongoose');
const userSchema = mongoose.Schema({
address: {type: String, required:true},
session: {type: String, required:true},
blocktime: {type: Number, required:true},
pin: {type: String, required:true},
validated: {type: Boolean, required:true},
expired: {type: Boolean, required:true, default: false}
});
module.exports = mongoose.model('User', userSchema);

12
backend/models/zectxs.js Normal file
View File

@ -0,0 +1,12 @@
const mongoose = require('mongoose');
const ZecTxSchema = mongoose.Schema({
address: {type: String},
session: {type: String, required:true},
confirmations: {type: Number, required:true},
amount: {type: Number, required:true},
txid: {type:String, required:true, unique: true},
memo: {type:String}
});
module.exports = mongoose.model('ZecTx', ZecTxSchema);

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 */;

22124
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "zgo",
"version": "2.4.0",
"version": "1.0.3",
"scripts": {
"ng": "ng",
"start": "ng serve",
@ -10,52 +10,44 @@
},
"private": true,
"dependencies": {
"@angular/animations": "^17.1.2",
"@angular/cdk": "^17.1.2",
"@angular/common": "^17.1.2",
"@angular/compiler": "^17.1.2",
"@angular/core": "^17.1.2",
"@angular/forms": "^17.1.2",
"@angular/material": "^17.1.2",
"@angular/platform-browser": "^17.1.2",
"@angular/platform-browser-dynamic": "^17.1.2",
"@angular/router": "^17.1.2",
"@fortawesome/angular-fontawesome": "^0.14.1",
"@fortawesome/fontawesome-free": "^6.4.0",
"@fortawesome/fontawesome-svg-core": "^6.4.0",
"@fortawesome/free-brands-svg-icons": "^6.4.0",
"@fortawesome/free-regular-svg-icons": "^6.4.0",
"@fortawesome/free-solid-svg-icons": "^6.4.0",
"@supercharge/request-ip": "^1.2.0",
"@angular/animations": "~13.0.2",
"@angular/cdk": "^12.2.8",
"@angular/common": "~13.0.2",
"@angular/compiler": "~13.0.2",
"@angular/core": "~13.0.2",
"@angular/forms": "~13.0.2",
"@angular/material": "^12.2.8",
"@angular/platform-browser": "~13.0.2",
"@angular/platform-browser-dynamic": "~13.0.2",
"@angular/router": "~13.0.2",
"@supercharge/request-ip": "^1.1.2",
"angular-local-storage": "^0.7.1",
"angular-material-datepicker": "^1.0.2",
"async": "^3.2.4",
"async": "^3.2.2",
"coingecko-api": "^1.0.10",
"easyqrcodejs": "^4.4.13",
"hammerjs": "^2.0.8",
"easyqrcodejs": "^4.4.6",
"material-design-icons": "^3.0.1",
"rxjs": "~7.8.0",
"sha.js": "^2.4.11",
"tslib": "^2.5.0",
"mongoose": "^6.0.13",
"rxjs": "~6.6.0",
"stdrpc": "^1.3.0",
"tslib": "^2.3.0",
"urlsafe-base64": "^1.0.0",
"uuid": "^9.0.0",
"zone.js": "~0.14.3"
"uuid": "^8.3.2",
"zone.js": "~0.11.4"
},
"devDependencies": {
"@angular-devkit/build-angular": "^17.1.1",
"@angular/cli": "^17.1.1",
"@angular/compiler-cli": "^17.1.2",
"@types/jasmine": "~4.3.1",
"@types/node": "^18.16.6",
"@types/request": "^2.48.8",
"@angular-devkit/build-angular": "~13.0.2",
"@angular/cli": "~13.0.2",
"@angular/compiler-cli": "~13.0.2",
"@types/jasmine": "~3.8.0",
"@types/node": "^12.20.33",
"@types/urlsafe-base64": "^1.0.28",
"@types/uuid": "^9.0.1",
"jasmine-core": "~4.5.0",
"karma": "~6.4.2",
"karma-chrome-launcher": "~3.1.1",
"karma-coverage": "~2.2.0",
"karma-jasmine": "~5.1.0",
"karma-jasmine-html-reporter": "~2.0.0",
"typescript": "~5.3.3"
"@types/uuid": "^8.3.1",
"jasmine-core": "~3.8.0",
"karma": "~6.3.0",
"karma-chrome-launcher": "~3.1.0",
"karma-coverage": "~2.0.3",
"karma-jasmine": "~4.0.0",
"karma-jasmine-html-reporter": "~1.7.0",
"typescript": "~4.4.4"
}
}

19
server.js Normal file
View File

@ -0,0 +1,19 @@
var fs = require('fs');
var http = require('http');
//var https = require('https');
//var certificate = fs.readFileSync('/etc/letsencrypt/live/zgo.cash/fullchain.pem');
//var privateKey = fs.readFileSync('/etc/letsencrypt/live/zgo.cash/privkey.pem');
//var credentials = {key: privateKey, cert: certificate};
const app = require('./backend/app');
const port = 3000;
app.set('port', port);
const httpServer = http.createServer(app);
//const httpsServer = https.createServer(credentials, app);
httpServer.listen(port);
//httpsServer.listen(port);

View File

@ -4,12 +4,9 @@ import { ViewerComponent } from './viewer/viewer.component';
import { ReceiptComponent } from './receipt/receipt.component';
import { LoginComponent } from './login/login.component';
import { BusinessComponent } from './business/business.component';
import { InvoiceComponent } from './invoice/invoice.component';
import { ListOrdersComponent } from './listorders/listorders.component';
import { AuthGuardService } from './auth-guard.service';
import { NodeResolverService } from './node-resolver.service';
import { PmtserviceComponent } from './pmtservice/pmtservice.component';
import { XeroRegComponent } from './xeroreg/xeroreg.component';
const routes: Routes = [
{ path: '', component: LoginComponent, resolve: { response: NodeResolverService} },
@ -18,9 +15,6 @@ const routes: Routes = [
{ path: 'orders', component: ListOrdersComponent, canActivate: [AuthGuardService]},
{ path: 'biz', component: BusinessComponent, canActivate: [AuthGuardService]},
{ path: 'receipt/:orderId', component: ReceiptComponent},
{ path: 'invoice/:orderId', component: InvoiceComponent},
{ path: 'pmtservice', component: PmtserviceComponent},
{ path: 'xeroauth', component: XeroRegComponent},
{ path: 'login', component: LoginComponent, resolve: { response: NodeResolverService}}
];

View File

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

View File

@ -1,52 +1,8 @@
<main >
<router-outlet ></router-outlet>
<!--
<app-login (newLanguageEvent) = "chgUILanguage($event)"></app-login>
-->
<main>
<router-outlet></router-outlet>
</main>
<mat-divider></mat-divider>
<div align="center">
<img *ngIf="zgoLanguage == 'en-US'"
src="../assets/zgo-usa-flag-default.png"
(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 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 class="footer" align="center">
<p>&copy; 2022 Vergara Technologies LLC</p>
<p class="tiny">Price data provided by CoinGecko API</p>
</div>
<div></div>

View File

@ -1,64 +1,16 @@
import { Component, OnInit } from '@angular/core';
import { LanguageService } from './language.service';
import { Component } from '@angular/core';
//import { Post} from './posts/post.model';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
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();
}
}
//StoredPosts: Post[] = [];
title = 'sell4zec';
//onPostAdded(post: Post){
//this.StoredPosts.push(post);
//}
}

View File

@ -1,5 +1,5 @@
import { NgModule } from '@angular/core';
import { BrowserModule, } from '@angular/platform-browser';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatInputModule } from '@angular/material/input';
import { MatAutocompleteModule } from '@angular/material/autocomplete';
@ -16,10 +16,6 @@ import { MatSelectModule } from '@angular/material/select';
import { MatProgressBarModule } from '@angular/material/progress-bar';
import { MatStepperModule } from '@angular/material/stepper';
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
import { MatSnackBarModule } from '@angular/material/snack-bar';
import { MatTabsModule } from '@angular/material/tabs';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatNativeDateModule } from '@angular/material/core';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
@ -28,7 +24,6 @@ import { ViewerComponent } from './viewer/viewer.component';
import { LoginComponent } from './login/login.component';
import { ItemListComponent } from './items/item-list/item-list.component';
import { ItemCreateComponent } from './items/item-create/item-create.component';
import { ItemEditComponent } from './items/item-edit/item-edit.component';
import { ItemDeleteComponent } from './items/item-delete/item-delete.component';
import { ItemAddComponent} from './items/item-add/item-add.component';
import { OrderComponent } from './order/order.component';
@ -43,81 +38,64 @@ import { SearchOptionsPipe } from './searchoptions.pipe';
import { TermsComponent } from './terms/terms.component';
import { ReceiptComponent } from './receipt/receipt.component';
import { ReceiptQRComponent } from './receipt-qr/receipt-qr.component';
import { InvoiceComponent } from './invoice/invoice.component';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { PromptInvoiceComponent } from './prompt-invoice/prompt-invoice.component';
import { PromptReceiptComponent } from './prompt-receipt/prompt-receipt.component';
import { NotifierComponent } from './notifier/notifier.component';
import { PmtserviceComponent } from './pmtservice/pmtservice.component';
import { XeroRegComponent } from './xeroreg/xeroreg.component';
import { DbExportComponent } from './db-export/db-export.component';
import { SessionpayComponent } from './sessionpay/sessionpay.component';
import { TipsComponent } from './tips/tips.component';
@NgModule({
declarations: [
AppComponent,
HeaderComponent,
ViewerComponent,
ItemListComponent,
LoginComponent,
OrderComponent,
ItemCreateComponent,
ItemEditComponent,
ItemDeleteComponent,
ItemAddComponent,
CancelComponent,
CheckoutComponent,
SettingsComponent,
ScanComponent,
ListOrdersComponent,
BusinessComponent,
SearchOptionsPipe,
TermsComponent,
ReceiptComponent,
ReceiptQRComponent,
InvoiceComponent,
PromptInvoiceComponent,
PromptReceiptComponent,
NotifierComponent,
PmtserviceComponent,
XeroRegComponent,
DbExportComponent,
SessionpayComponent,
TipsComponent,
],
imports: [
BrowserAnimationsModule,
AppRoutingModule,
FormsModule,
ReactiveFormsModule,
MatIconModule,
HttpClientModule,
MatInputModule,
MatCardModule,
MatButtonModule,
MatToolbarModule,
MatExpansionModule,
MatDialogModule,
MatDividerModule,
MatListModule,
MatSelectModule,
MatProgressBarModule,
MatStepperModule,
MatAutocompleteModule,
MatSlideToggleModule,
MatSnackBarModule,
MatTabsModule,
MatDatepickerModule,
MatNativeDateModule,
BrowserModule,
FontAwesomeModule
],
exports: [
MatIconModule
],
providers: [
],
bootstrap: [AppComponent]
declarations: [
AppComponent,
HeaderComponent,
ViewerComponent,
ItemListComponent,
LoginComponent,
OrderComponent,
ItemCreateComponent,
ItemDeleteComponent,
ItemAddComponent,
CancelComponent,
CheckoutComponent,
SettingsComponent,
ScanComponent,
ListOrdersComponent,
BusinessComponent,
SearchOptionsPipe,
TermsComponent,
ReceiptComponent,
ReceiptQRComponent
],
imports: [
BrowserModule,
AppRoutingModule,
FormsModule,
ReactiveFormsModule,
MatIconModule,
HttpClientModule,
MatInputModule,
MatCardModule,
MatButtonModule,
MatToolbarModule,
MatExpansionModule,
MatDialogModule,
MatDividerModule,
MatListModule,
MatSelectModule,
MatProgressBarModule,
MatStepperModule,
MatAutocompleteModule,
MatSlideToggleModule,
BrowserAnimationsModule
],
exports: [
MatIconModule
],
providers: [],
bootstrap: [AppComponent],
entryComponents: [
ItemCreateComponent,
ItemDeleteComponent,
ItemAddComponent,
CancelComponent,
CheckoutComponent,
SettingsComponent,
ScanComponent
]
})
export class AppModule { }

View File

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

View File

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

View File

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

View File

@ -1,9 +1,10 @@
import { Component, OnInit, ViewChild } from '@angular/core';
import { UntypedFormBuilder, Validators, UntypedFormGroup } from '@angular/forms';
import { Component, OnInit, ViewChild, AfterViewInit } from '@angular/core';
import { FormBuilder, Validators, FormGroup, FormControl } from '@angular/forms';
import { MatDialog, MatDialogConfig} from '@angular/material/dialog';
import { ProgressBarMode } from '@angular/material/progress-bar';
import { Router } from '@angular/router';
import { Observable } from 'rxjs';
import { filter, startWith, map, switchMap } from 'rxjs/operators';
import { MatStepper } from '@angular/material/stepper';
import { MatSlideToggleChange } from '@angular/material/slide-toggle';
import { Country } from '../country.model';
@ -11,11 +12,10 @@ import { Owner } from '../owner.model';
import { User } from '../user.model';
import { UserService } from '../user.service';
import { FullnodeService } from '../fullnode.service';
import { SearchOptionsPipe } from '../searchoptions.pipe';
import { ScanComponent } from '../scan/scan.component';
import { TermsComponent } from '../terms/terms.component';
import { LanguageService } from '../language.service';
@Component({
selector: 'app-business',
templateUrl: './business.component.html',
@ -26,57 +26,35 @@ export class BusinessComponent implements OnInit {
@ViewChild('stepper', { static: false}) stepper: MatStepper|undefined;
intervalHolder: any;
nodeAddress: string = '';
zecPrice: number = 1;
tickets = [
{
value: 1,
viewValue: '1 day: USD $1'
value: 0.005,
viewValue: '1 day: 0.005 ZEC'
},{
value: 6,
viewValue: '1 week: USD $6'
value: 0.025,
viewValue: '1 week: 0.025 ZEC'
},{
value: 22,
viewValue: '1 month: USD $22'
},{
value: 30,
viewValue: '1 month Pro: USD $30'
value: 0.1,
viewValue: '1 month: 0.1 ZEC'
}
];
bizForm: UntypedFormGroup;
payForm: UntypedFormGroup;
bizForm: FormGroup;
payForm: FormGroup;
barMessage = 'Awaiting for transaction';
barMode: ProgressBarMode = 'indeterminate';
barValue = 0;
countries: Country[] = [];
owner: Owner = {
address: '',
name: '',
currency: 'usd',
tax: false,
taxValue: 0,
vat: false,
vatValue: 0,
phone: '',
paid: false,
zats: false,
invoices: false,
expiration: new Date(Date.now()).toISOString(),
payconf: false,
crmToken: '',
viewkey: '',
tips: false
}
public countriesUpdate: Observable<Country[]>;
public ownerUpdate: Observable<Owner>;
public addrUpdate: Observable<string>;
public userUpdate: Observable<User>;
public priceUpdate: Observable<number>;
sessionId = '';
ownerKnown = false;
termsChecked = false;
ownerdata = {
first: '',
last: '',
phone: '',
name: '',
street: '',
city: '',
@ -85,60 +63,23 @@ export class BusinessComponent implements OnInit {
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 : ''
zats: false
}
public countriesUpdate: Observable<Country[]>;
public ownerUpdate: Observable<Owner>;
public addrUpdate: Observable<string>;
public userUpdate: Observable<User>;
sessionId = '';
ownerKnown = false;
termsChecked = false;
};
//
//
constructor(
private languageService : LanguageService,
private fb: UntypedFormBuilder,
private fb: FormBuilder,
private userService: UserService,
private fullnodeService: FullnodeService,
private dialog: MatDialog,
private router: Router
) {
this.priceUpdate = fullnodeService.priceUpdate;
this.priceUpdate.subscribe(priceInfo => {
this.zecPrice = priceInfo;
});
this.countriesUpdate = userService.countriesUpdate;
this.ownerUpdate = userService.ownerUpdate;
this.userUpdate = userService.userUpdate;
@ -175,7 +116,6 @@ export class BusinessComponent implements OnInit {
}
ngOnInit(): void {
this.chgUILanguage();
this.intervalHolder = setInterval(() => {
this.loginCheck();
}, 1000 * 60);
@ -185,13 +125,12 @@ export class BusinessComponent implements OnInit {
this.ownerUpdate.subscribe(ownerData => {
if(ownerData.name.length > 0 && this.stepper!.selectedIndex == 0){
this.stepper!.next();
this.loginCheck();
}
});
}
onChange(ob: MatSlideToggleChange){
//console.log(ob.checked);
console.log(ob.checked);
this.termsChecked = ob.checked;
}
@ -200,17 +139,24 @@ export class BusinessComponent implements OnInit {
dialogConfig.disableClose = true;
dialogConfig.autoFocus = true;
this.dialog.open(TermsComponent, dialogConfig);
//dialogRef.afterClosed().subscribe(val => {
//console.log('Terms read');
//});
const dialogRef = this.dialog.open(TermsComponent, dialogConfig);
dialogRef.afterClosed().subscribe(val => {
console.log('Terms read');
});
}
save() {
this.ownerdata = {
this.owner = {
address: '',
currency: 'usd',
tax: false,
taxValue: 0,
vat: false,
vatValue: 0,
first: this.bizForm.get('first')!.value,
last: this.bizForm.get('last')!.value,
phone: '',
paid: false,
name: this.bizForm.get('name')!.value,
street: this.bizForm.get('street')!.value,
city: this.bizForm.get('city')!.value,
@ -219,9 +165,9 @@ export class BusinessComponent implements OnInit {
country: this.bizForm.get('country')!.value,
email: this.bizForm.get('email')!.value,
website: this.bizForm.get('website')!.value,
payconf: false
zats: false
};
this.userService.addOwner(this.ownerdata);
this.userService.addOwner(this.owner);
this.stepper!.next();
}
@ -231,7 +177,7 @@ export class BusinessComponent implements OnInit {
dialogConfig.disableClose = true;
dialogConfig.autoFocus = true;
dialogConfig.data = {
totalZec: (this.payForm.get('session')!.value)/this.zecPrice,
totalZec: this.payForm.get('session')!.value,
addr: this.nodeAddress,
session: this.sessionId,
pay: true
@ -239,7 +185,7 @@ export class BusinessComponent implements OnInit {
const dialogRef = this.dialog.open(ScanComponent, dialogConfig);
dialogRef.afterClosed().subscribe(val => {
//console.log('Awaiting payment');
console.log('Awaiting payment');
if(val){
this.stepper!.next();
}
@ -250,57 +196,9 @@ export class BusinessComponent implements OnInit {
this.userService.findUser();
this.ownerUpdate.subscribe((owner) => {
if(owner.paid) {
clearInterval(this.intervalHolder);
this.router.navigate(['/shop']);
}
});
}
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

@ -5,12 +5,3 @@
mat-dialog-content {
max-width: 400px;
}
.cancelTitle {
font-family: 'Spartan', sans-serif;
background: #ff5722;
color: white;
font-size: 26px;
text-align: center;
padding: 5px;
}

View File

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

View File

@ -1,9 +1,6 @@
import { Inject, Component, OnInit, ViewEncapsulation} from '@angular/core';
import { MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';
import { LanguageService } from '../language.service';
import { LanguageData } from '../language.model';
@Component({
selector: 'app-cancel',
templateUrl: './cancel.component.html',
@ -12,31 +9,14 @@ import { LanguageData } from '../language.model';
export class CancelComponent {
title: string;
msg1: string;
msg2: string;
// -------------------------------------
//
// Language Support
//
vE = {
cancelTitle : '',
cancelConfirmBtn : '',
cancelDismissBtn : ''
}
//
// ------------------------------------------------------------
msg: string;
constructor(
private languageService : LanguageService,
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.msg1 = data.msg1;
this.msg2 = data.msg2;
}
ngOnInit() {
this.chgUILanguage();
this.msg = data.msg;
}
confirm() {
@ -46,22 +26,4 @@ export class CancelComponent {
close() {
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,14 +1,3 @@
.text {
font-family: 'Spartan', sans-serif;
}
.askPayment {
font-family: "Spartan";
background: #ff5722;
font-weight: 700;
font-size: 18px;
text-align: center;
color: white;
line-height: 20px;
padding: 10px;
}

View File

@ -1,64 +1,25 @@
<div class="askPayment">
{{ vE.checkoutScanPayment }}
<div align="center" mat-dialog-title>
<h4 class="text">Scan to make payment</h4>
</div>
<div class="container" style="font-family: 'Spartan', sans-serif;
padding: 15px;">
<pre></pre>
<table style="align-content: center;">
<mat-dialog-content>
<div align="center" id="checkout-qr"></div>
</mat-dialog-content>
<mat-dialog-actions>
<table cellspacing="0" width="100%">
<tr>
<td width="10%"></td>
<td width="80%">
<div id="checkout-qr"></div>
<td>
<button mat-raised-button color="primary" (click)="confirm()">
<mat-icon>verified_user</mat-icon>
</button>
</td>
<td align="right">
<button mat-raised-button (click)="close()">
<mat-icon>close</mat-icon>
</button>
</td>
<td width="10%"></td>
</tr>
</table>
<div style="margin-top: 10px;">
<table cellspacing="0"
width="100%">
<tr>
<td>
<button mat-raised-button color="primary" (click)="confirm()"><mat-icon>verified_user</mat-icon>
{{ vE.checkoutAcceptBtn }}
</button>
</td>
<td align="right">
<button mat-raised-button (click)="close()">
<mat-icon>close_btn</mat-icon>{{ vE.checkoutCloseBtn }}
</button>
</td>
</tr>
</table>
</div>
<div style="text-align: center;
margin-top: 10px;
line-height: 30px;">{{ vE.checkoutCantScan }}<br>
{{ vE.checkoutUseThis }}<a [href]="zcashUrl">{{ vE.checkoutWalletLink }}</a>{{ vE.checkoutWalletOr }}
<div style="display: flex;
justify-content: space-between;">
<button style="margin-top: 20px;
font-weight: 700;
background-color: lightgray;"
mat-raised-button
(click)="copyAddress()">{{ vE.checkoutCopyAddress }}</button>
<button style="margin-top: 20px;
font-weight: 700;
background-color: lightgray;"
mat-raised-button
(click)="copyAmount()">{{ vE.checkoutCopyAmount }}</button>
</div>
<button style="margin-top: 20px;
font-weight: 700;
background-color: lightgray;"
mat-raised-button
(click)="copyMemo()">{{ vE.checkoutCopyMemo }}</button>
</div>
</div>
</table>
</mat-dialog-actions>

View File

@ -2,11 +2,6 @@ import { Inject, Component, OnInit, ViewEncapsulation} from '@angular/core';
import { MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';
import { DomSanitizer, SafeUrl } from '@angular/platform-browser';
import { NotifierService } from '../notifier.service';
import { LanguageService } from '../language.service';
import { LanguageData } from '../language.model';
var QRCode = require('easyqrcodejs');
var URLSafeBase64 = require('urlsafe-base64');
var Buffer = require('buffer/').Buffer;
@ -17,64 +12,32 @@ var Buffer = require('buffer/').Buffer;
styleUrls: ['./checkout.component.css']
})
export class CheckoutComponent implements OnInit {
export class CheckoutComponent implements OnInit{
address: string;
total: number;
orderId: string;
codeString: string = '';
zcashUrl: SafeUrl;
// -------------------------------------
//
// Language Support
//
vE = {
checkoutScanPayment : '',
checkoutAcceptBtn : '',
checkoutCloseBtn : '',
checkoutCantScan : '',
checkoutUseThis : '',
checkoutWalletLink : '',
checkoutWalletOr : '',
checkoutCopyAddress : '',
checkoutCopyAmount : '',
checkoutCopyMemo : '',
checkoutCopyNotavail : '',
checkoutNotservClose : '',
checkoutNotservError : '',
checkoutCopyaddressError : '',
checkoutCopyamountError : '',
checkoutCopymemoError : ''
};
//
constructor(
private languageService : LanguageService,
private dialogRef: MatDialogRef<CheckoutComponent>,
private sanitizer: DomSanitizer,
@Inject(MAT_DIALOG_DATA) public data: { totalZec: number, addr: string, orderId: string},
private notifierService : NotifierService ) {
console.log("Entra a Constructor")
@Inject(MAT_DIALOG_DATA) public data: { totalZec: number, addr: string, orderId: string}
) {
this.address = data.addr;
this.total = data.totalZec;
this.orderId = data.orderId;
this.codeString = `zcash:${this.address}?amount=${this.total.toFixed(8)}&memo=${URLSafeBase64.encode(Buffer.from('ZGo Order::'.concat(this.orderId)))}`;
this.codeString = `zcash:${this.address}?amount=${this.total.toFixed(6)}&memo=${URLSafeBase64.encode(Buffer.from('Z-Go Order '.concat(this.orderId)))}`;
this.zcashUrl = this.sanitizer.bypassSecurityTrustUrl(this.codeString);
}
ngOnInit() {
var qrcode = new QRCode(document.getElementById("checkout-qr"),
{
text: this.codeString,
logo: "/assets/zcash.png",
width: 230,
height: 230,
logoWidth: 60,
logoHeight: 60,
correctLevel: QRCode.CorrectLevel.H
});
console.log("mgOnInit - pasa");
this.chgUILanguage();
var qrcode = new QRCode(document.getElementById("checkout-qr"), {
text: this.codeString,
logo: "/assets/zcash.png",
logoWidth: 80,
logoHeight: 80
});
}
confirm() {
@ -84,98 +47,4 @@ export class CheckoutComponent implements OnInit {
close() {
this.dialogRef.close(false);
}
copyAddress() {
if (!navigator.clipboard) {
// alert("Copy functionality not supported");
this.notifierService
.showNotification(this.vE.checkoutCopyNotavail,
this.vE.checkoutNotservClose,
"error",
this.vE.checkoutNotservError);
}
try {
navigator.clipboard.writeText(this.address);
} catch (err) {
this.notifierService
.showNotification(this.vE.checkoutCopyaddressError,
this.vE.checkoutNotservClose,
"error",
this.vE.checkoutNotservError);
// console.error("Error", err);
}
}
copyAmount() {
if (!navigator.clipboard) {
// alert("Copy functionality not supported");
this.notifierService
.showNotification(this.vE.checkoutCopyNotavail,
this.vE.checkoutNotservClose,
"error",
this.vE.checkoutNotservError);
}
try {
navigator.clipboard.writeText(this.total.toString());
} catch (err) {
this.notifierService
.showNotification(this.vE.checkoutCopyamountError,
this.vE.checkoutNotservClose,
"error",
this.vE.checkoutNotservError);
// console.error("Error", err);
}
}
copyMemo() {
if (!navigator.clipboard) {
// alert("Copy functionality not supported");
this.notifierService
.showNotification(this.vE.checkoutCopyNotavail,
this.vE.checkoutNotservClose,
"error",
this.vE.checkoutNotservError);
}
try {
navigator.clipboard.writeText("ZGo Order::" + this.orderId);
} catch (err) {
this.notifierService
.showNotification(this.vE.checkoutCopymemoError,
this.vE.checkoutNotservClose,
"error",
this.vE.checkoutNotservError);
// 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

@ -1,4 +0,0 @@
export class ConfigData {
public static Be_URL : string = 'https://test.zgo.cash/';
public static UsrPwd : string = 'user:superSecret2';
}

View File

@ -1,72 +0,0 @@
* {
font-family: 'Spartan', sans-serif;
font-size: 11px;
}
.daterangecard {
padding: 30px;
}
.description {
margin-bottom: 20px;
font-size: 14px;
font-weight: 700;
text-align: center;
}
.datepicker {
border-color: dimgray;
border-width: 3px;
border-radius: 8px;
background-color: white;
}
.noorders {
font-size: 14px;
font-weight: 700;
text-align: center;
padding-top: 20px;
padding-bottom: 20px;
border-color: dimgray;
border-width: 3px;
border-radius: 8px;
background-color: #f9e79f;
}
.settings-title {
font-family: 'Spartan', sans-serif;
background: #ff5722;
color: white;
font-size: 30px;
text-align: center;
vertical-align: middle;
padding: 10px;
}
.daterange {
font-size: 13px;
font-weight: 700;
padding-bottom: 15px;
}
.downloadbtn {
min-width: 120px;
max-width: 150px;
height: 25px;
border-color: dimgray;
border-width: 3px;
border-radius: 8px;
box-shadow: lightgray;
font-family: 'Spartan', sans-serif;
background: #ff5722;
color: white;
font-size: 16px;
text-align: center;
padding: 6px;
}
::ng-deep .downloadbtntxt {
color: white;
font-size: 14px;
font-weight: 600;
}

View File

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

View File

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

View File

@ -1,194 +0,0 @@
import { Component, OnInit } from '@angular/core';
import { FormGroup, FormControl } from '@angular/forms';
import { DomSanitizer } from '@angular/platform-browser';
import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { Observable } from 'rxjs';
import { Order } from '../order/order.model';
import { FullnodeService } from '../fullnode.service';
import { UserService } from '../user.service';
import { Owner } from '../owner.model';
import { OrderService } from '../order/order.service';
import { LanguageService } from '../language.service';
import { LanguageData } from '../language.model';
@Component({
selector: 'app-db-export',
templateUrl: './db-export.component.html',
styleUrls: ['./db-export.component.css']
})
export class DbExportComponent implements OnInit {
public orders: Order[] = [];
public ownerUpdate: Observable<Owner>;
public ordersUpdate: Observable<Order[]>;
fileUrl : any;
owner : Owner = {
address: '',
name: '',
currency: 'usd',
tax: false,
taxValue: 0,
vat: false,
vatValue: 0,
paid: false,
zats: false,
invoices: false,
expiration: new Date(Date.now()).toISOString(),
payconf: false,
crmToken: '',
viewkey: '',
tips: false
};
_ordersOk = false;
range = new FormGroup({
start: 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,
private dialogRef: MatDialogRef<DbExportComponent>,
private sanitizer: DomSanitizer,
public orderService: OrderService,
public userService: UserService) {
this.ownerUpdate = userService.ownerUpdate;
this.orderService.getAllOrders();
this.ordersUpdate = orderService.allOrdersUpdate;
}
ngOnInit(): void {
console.log('db-export Init -->');
this.chgUILanguage();
this.owner = this.userService.currentOwner();
console.log(this.owner.name);
console.log(this.range);
this.ordersUpdate.subscribe((orders) => {
this.orders = orders;
// console.log('Order -> ' + this.orders[0].timestamp);
if( this.orders.length != 0 ) {
this._ordersOk = true
}
});
}
ordersOk() : boolean {
return this._ordersOk;
}
checkReady() : boolean {
var data : string = '';
var chkRdy : boolean = false;
if ( (this.range.value.start != null ) &&
(this.range.value.end != null) ) {
// process order list
const formatter = new Intl.NumberFormat('en-US', {
minimumFractionDigits: 8,
maximumFractionDigits: 8,
});
// create header
data = this.vE.dbexportFileHeader + "\n";
var iniDate = new Date(this.range.value.start);
var endDate = new Date(this.range.value.end);
for (let i=0; i < this.orders.length; i++){
var date = new Date(this.orders[i]!.timestamp!);
var orderid = String(this.orders[i]._id);
var closed = this.orders[i].closed ? this.vE.dbexportClosedYes : this.vE.dbexportClosedNo ;
/*
console.log('Order No. ' +
this.orders[i]._id! + ' - totalZec = ' +
this.orders[i].totalZec);
*/
var paid = this.orders[i].paid ? this.vE.dbexportPaidYes : this.vE.dbexportPaidNo ;
if ( (date >= iniDate) && (date <= endDate) ) {
data = data +
date.getFullYear() + '-' +
(date.getMonth()+1).toString().padStart(2,'0') + '-' +
date.getDate().toString().padStart(2,'0')
+ ',' +
orderid + ',' +
this.orders[i].currency + ',' +
closed + ',' +
this.orders[i].total + ',' +
this.orders[i].price! + ',' +
this.orders[i].totalZec + ',' +
this.orders[i].taxAmount + ',' +
this.orders[i].vatAmount + ',' +
this.orders[i].tipAmount + ',' +
paid + ',"' +
this.orders[i].externalInvoice + '"' +
'\n';
}
}
const blob = new Blob([data], { type: 'application/octet-stream' });
this.fileUrl = this.sanitizer.bypassSecurityTrustResourceUrl(window.URL.createObjectURL(blob));
chkRdy = true;
}
return chkRdy;
}
closedbExport() {
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,18 +1,14 @@
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 {UserService} from './user.service';
import { Owner } from './owner.model';
import { ConfigData } from './configdata';
var Buffer = require('buffer/').Buffer;
//import {User} from './user.model';
@Injectable({providedIn: 'root'})
export class FullnodeService{
beUrl = ConfigData.Be_URL;
private session: null|string = '';
beUrl = 'http://localhost:3000/';
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 _memoUpdated: BehaviorSubject<string[]> = new BehaviorSubject(this.dataStore.memoList);
@ -23,8 +19,9 @@ export class FullnodeService{
public readonly memoUpdate: Observable<string[]> = this._memoUpdated.asObservable();
public readonly priceUpdate: Observable<number> = this._priceUpdated.asObservable();
public readonly ownerUpdate: Observable<Owner>;
private UserSub: Subscription = new Subscription();
private apiKey = 'YourApiKey';
private reqHeaders: HttpHeaders;
private params : HttpParams;
private owner: Owner = {
_id: '',
name: '',
@ -34,21 +31,22 @@ export class FullnodeService{
taxValue: 0,
vat: false,
vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false,
zats: false,
invoices: false,
expiration: new Date(Date.now()).toISOString(),
payconf: false,
crmToken: '',
viewkey: '',
tips: false
website: '',
country: '',
zats: false
};
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');
this.reqHeaders = new HttpHeaders().set('Authorization', auth);
this.reqHeaders = new HttpHeaders().set('Authorization', this.apiKey);
this.ownerUpdate = userService.ownerUpdate;
this.getAddr();
this.getHeight();
@ -59,7 +57,7 @@ export class FullnodeService{
}
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) => {
this.dataStore.height = BlockData.height;
this._heightUpdated.next(Object.assign({}, this.dataStore).height);
@ -70,8 +68,8 @@ export class FullnodeService{
getPrice(currency: string){
//var currency = 'usd';
const params = this.params.append('currency', currency);
let obs = this.http.get<{message: string, price: any}>(this.beUrl+'price', { headers:this.reqHeaders, params: params, observe: 'response'});
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.dataStore.price = PriceData.body!.price.price;
@ -86,7 +84,7 @@ export class FullnodeService{
}
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) => {
this.dataStore.addr = AddrData.addr;

View File

@ -1,14 +1,14 @@
<mat-toolbar color="primary">
<span align="center">
<img class="logo" src="/assets/logo-new-white_01.png" height="40px" />
<img class="logo" src="/assets/logo-new-white.png" height="40px" />
</span>
<span class="spacer"></span>
<span align="center">
<p class="mini text"> {{ vE.headerGetCurrency }} {{ getCurrency() }}</p>
<p class="mini text">{{ vE.headerLastBlock }} </p>
<p class="mini text">Currency: {{ getCurrency() }}</p>
<p class="mini text">Last block:</p>
<p class="mini text">{{heightUpdate | async}}</p>
</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>
</mat-toolbar>

View File

@ -1,15 +1,13 @@
import {Component, OnInit, OnDestroy} from '@angular/core';
import { MatDialog, MatDialogConfig} from '@angular/material/dialog';
import { FullnodeService } from '../fullnode.service';
import {FullnodeService} from '../fullnode.service';
import { Router } from '@angular/router';
import { UserService } from '../user.service';
import { CancelComponent } from '../cancel/cancel.component';
import { Observable } from 'rxjs';
import {Subscription, Observable} from 'rxjs';
import {Owner} from '../owner.model';
import { LanguageService } from '../language.service';
@Component({
selector: 'app-header',
templateUrl: './header.component.html',
@ -28,37 +26,29 @@ export class HeaderComponent implements OnInit, OnDestroy {
taxValue: 0,
vat: false,
vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false,
zats: false,
invoices: false,
expiration: new Date(Date.now()).toISOString(),
payconf: false,
crmToken: '',
viewkey: '',
tips: false
website: '',
country: '',
zats: false
};
private session: string | null = '';
public heightUpdate: Observable<number>;
public ownerUpdate: Observable<Owner>;
public uZaddrUpdate: Observable<string>;
//
// Language Support
//
vE = {
headerGetCurrency : '',
headerLastBlock : '',
headerLogoutLbl : '',
headerLogoutMsg1 : '',
headerLogoutMsg2 : ''
}
//
// ------------------------------------------------------------
constructor(
public fullnodeService: FullnodeService,
public userService: UserService,
private dialog: MatDialog,
private router: Router,
private languageService: LanguageService
private router: Router
){
this.heightUpdate = fullnodeService.heightUpdate;
this.uZaddrUpdate = userService.uZaddrUpdate;
@ -68,8 +58,8 @@ export class HeaderComponent implements OnInit, OnDestroy {
});
}
ngOnInit(){
this.chgUILanguage();
}
ngOnDestroy(){
@ -84,43 +74,18 @@ export class HeaderComponent implements OnInit, OnDestroy {
dialogConfig.disableClose = true;
dialogConfig.autoFocus = true;
dialogConfig.data = { title: this.vE.headerLogoutLbl,
msg1: this.vE.headerLogoutMsg1,
msg2: this.vE.headerLogoutMsg2 };
//console.log(dialogConfig.data);
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.'};
const dialogRef = this.dialog.open(CancelComponent, dialogConfig);
dialogRef.afterClosed().subscribe(val => {
if(val){
// console.log('Logout!');
console.log('Logout!');
this.userService.deleteUser().subscribe(UserResponse => {
//console.log('Rerouting');
console.log('Rerouting');
this.userService.findUser();
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

@ -1,112 +0,0 @@
.invoice {
font-family: Roboto Mono !important;
}
.zecSign {
margin-bottom: -4px;
font-size: 18px;
height: 18px;
}
.invoiceHeader {
display: flex;
font-family: Spartan;
font-weight: 700;
font-size: 26px;
color: white;
justify-content: space-between;
line-height: 40px;
padding: 10px;
vertical-align: center;
max-width: 600px;
background: #ff5722;
}
.invoiceDetail {
font-family: Roboto Mono !important;
padding: 10px;
max-width: 600px;
}
.invoiceHdrTxt1 {
font-family: Spartan !important;
text-align: center;
font-size: 30px;
font-weight: 700;
}
.invoiceHdrTxt2 {
font-family: Spartan !important;
text-align: center;
font-size: 16px;
font-weight: 400;
}
.invoiceHdrTxt3 {
font-family: Spartan !important;
text-align: center;
font-size: 12px;
font-weight: 300;
}
.detailTitle1 {
border-top: solid 2px;
border-bottom: solid 2px;
border-color: navy;
text-align: left;
}
.detailTitle2 {
border-top: solid 2px;
border-bottom: solid 2px;
border-color: navy;
text-align: right;
}
.detailLineRight {
border-top: solid 2px;
border-bottom: solid 2px;
border-color: navy;
text-align: right;
}
.detailLineLeft {
border-top: solid 2px;
border-bottom: solid 2px;
border-color: navy;
text-align: right;
}
.invoice-title {
font-size: 16px;
font-weight: 700;
background: lightcyan;
line-height: 30px;
padding: 5px;
}
.invoice-detail {
line-height: 20px;
font-size: 16px;
font-weight: 400;
padding-top: 4px;
padding-bottom: 4px;
}
.invoice-total {
margin-top: 40px;
}
.qrcode {
display: flex;
float: right;
}
.zecData {
width: auto;
font-family: Spartan !important;
font-size: 16px;
font-weight: 700;
text-align: right;
}

View File

@ -1,193 +0,0 @@
<div style="display: flex;
justify-content: center;
align-items: center;">
<div class="container">
<div class="invoiceHeader">
<img class="logo" src="/assets/logo-new-white.png" height="40px" />
{{name}}
</div>
<div class="invoiceDetail"
*ngIf="!error"
id="invoice">
<div class="invoiceHdrTxt1">{{ vE.invoiceInvoiceLbl }}</div>
<div class="invoiceHdrTxt2">{{ vE.invoiceOrderId }} {{orderId}}</div>
<div class="invoiceHdrTxt3"> {{ vE.invoiceOrderDate }} {{order.timestamp | date}}
</div>
<div style="height: 10px;"></div>
<div class="zecData">{{ vE.invoiceZcashPrice }} {{order.price | number: '1.02' | currency: order.currency.toUpperCase()}}</div>
<div style="height: 2px;"></div>
<div class="zecData">Total: <img class="zecSign" src="/assets/zec_rv.png" />{{order.totalZec | number: '1.08'}}
</div>
<div>
<div style="height: 10px;"></div>
<table style="width: 100%;"
cellspacing="0">
<tr class="invoice-title">
<th width="55%"
class="detailTitle1">
Item
</th>
<th width="15%"
class="detailTitle1">
{{ vE.invoiceQtyLbl }}
</th>
<th width="30%"
class="detailTitle2">
{{ vE.invoiceOrderPrice }}({{order.currency.toUpperCase()}})
</th>
</tr>
<tr class="invoice-detail"
*ngFor="let item of order.lines">
<td width="55%"
align="left">
{{item.name}}
</td>
<td width="15%"
align="center">
{{item.qty}}
</td>
<td width="30%"
align="right">
{{( item.qty * item.cost ) | number : '1.02' | currency: order.currency.toUpperCase()}}
</td>
</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">
<th width="55%"
class="detailLineRight">
{{ vE.invoiceInvoiceTotal }}
</th>
<th width="15%"
class="detailLineLeft">
</th>
<th width="30%"
class="detailLineRight">
{{ order.total | currency: order.currency.toUpperCase()}}
</th>
</tr>
</table>
<div style="height: 15px;"></div>
<table>
<tr>
<td width="75%"
style="font-size: 20px;
font-weight: 700;
font-style: italic;
text-align: center;">
<p *ngIf="order.paid">
<fa-icon [icon]="faCheck"
color="primary"></fa-icon>&nbsp;{{ vE.invoicePaymentConfirmed }}</p>
<p *ngIf="!order.paid">
<fa-icon [style]="getIconStyle(order)"
[icon]="faHourglass"></fa-icon>&nbsp;{{ vE.invoicePaymentPending }}</p>
</td>
<td width="25%">
<div style="text-align: right;"
id="payment-qr"
*ngIf="!order.paid"></div>
</td>
</tr>
</table>
<div style="height: 15px;"></div>
<div *ngIf="!order.paid" width="100%"
style="font-size: 14px;
font-weight: 700;
font-style: italic;
text-align: center;">
{{ vE.invoiceScanQrcode }}
</div>
<div *ngIf="!order.paid" style="text-align: center;
margin-top: 10px;
line-height: 30px;">
<div style="font-family: 'Spartan';
font-size: 14px;
line-height: 20px;">
{{ vE.invoiceCantScan }}<br>
{{ vE.invoiceUseThis }} <a [href]="zcashUrl">{{ vE.invoiceWalletLink }}</a>{{ vE.invoiceDotOr }}
<div style="display: flex;
justify-content: space-between;">
<button style="margin-top: 20px;
font-weight: 700;
background-color: lightgray;"
mat-raised-button
(click)="copyAddress()">{{ vE.invoiceCopyAddress }}</button>
<button style="margin-top: 20px;
font-weight: 700;
background-color: lightgray;"
mat-raised-button
(click)="copyAmount()">{{ vE.invoiceCopyAmount }}</button>
</div>
<button style="margin-top: 20px;
font-weight: 700;
background-color: lightgray;"
mat-raised-button
(click)="copyMemo()" *ngIf="!isWCOrder">{{ vE.invoiceCopyMemo }}</button>
<div style="display: flex;
justify-content: space-between;"
*ngIf="isWCOrder">
<button style="margin-top: 20px;
font-weight: 700;
background-color: lightgray;"
mat-raised-button
(click)="copyMemo()">{{ vE.invoiceCopyMemo }}</button>
<button style="margin-top: 20px;
font-weight: 700;
background-color: lightcyan;"
mat-raised-button
(click)="backToShop()" >
<fa-icon style="color: #FB4F14;
margin-bottom: -2px;
margin-right: 5px;
font-size: 20px;
cursor: pointer;"
[icon]="faArrowUpRightFromSquare"> </fa-icon>
{{ vE.invoiceReturnToshop }}</button>
</div>
</div>
</div>
</div>
<div align="center" *ngIf="error">
<div style="height: 10px;"></div>
<div style="font-family: Spartan !important;
font-size: 20px;
padding: 4px;
height: 24px;">
{{ vE.invoiceInvalidId }}
</div>
<div style="font-family: Spartan !important;
font-size: 16px;
padding: 4px;">
{{ vE.invoiceInfoNotavail }}
</div>
<div style="height: 10px;"></div>
<mat-card-actions>
<div align="center">
<button mat-raised-button [routerLink]="['/']" color="primary">OK</button>
</div>
</mat-card-actions>
</div>
</div>
</div>

View File

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

View File

@ -1,293 +0,0 @@
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { DomSanitizer, SafeUrl } from '@angular/platform-browser';
import { ReceiptService } from '../receipt.service';
import { Order} from '../order/order.model';
import { Observable } from 'rxjs';
import { faCheck, faHourglass, faArrowUpRightFromSquare } from '@fortawesome/free-solid-svg-icons';
import { NotifierService } from '../notifier.service';
import { LanguageService } from '../language.service';
var QRCode = require('easyqrcodejs');
var URLSafeBase64 = require('urlsafe-base64');
var Buffer = require('buffer/').Buffer;
@Component({
selector: 'app-invoice',
templateUrl: './invoice.component.html',
styleUrls: ['./invoice.component.css']
})
export class InvoiceComponent implements OnInit {
faCheck = faCheck;
faHourglass = faHourglass;
faArrowUpRightFromSquare = faArrowUpRightFromSquare;
orderId;
orderToken: string = '';
public orderUpdate: Observable<Order>;
public nameUpdate: Observable<string>;
name: string = '';
error: boolean = false;
codeString: string = '';
invString: string = '';
public isWCOrder : boolean = false;
zcashUrl: SafeUrl = '';
externalURL: string = '';
order:Order = {
_id: '',
address: '',
session: '',
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
}
]
};
// -------------------------------------
//
// 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(
private _ActiveRoute:ActivatedRoute,
private router: Router,
private sanitizer: DomSanitizer,
public receiptService: ReceiptService,
private notifierService : NotifierService,
private languageService : LanguageService
) {
this.orderId = this._ActiveRoute.snapshot.paramMap.get("orderId");
this._ActiveRoute.queryParams.subscribe((params) => {
this.orderToken = params["token"];
receiptService.getOrderById(this.orderId!, this.orderToken!).subscribe(response => {
if (response.status == 200){
this.error = false;
if( response.body!.order.session.substring(0,1) == 'X') {
this.invString = response.body!.order.externalInvoice;
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)))}`;
} else {
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",
width: 180,
height: 180,
logoWidth: 50,
logoHeight: 50,
correctLevel: QRCode.CorrectLevel.H
});
this.error = false;
this.zcashUrl = this.sanitizer.bypassSecurityTrustUrl(this.codeString);
} else {
this.error = true;
this.codeString = 'Test';
}
});
});
//console.log('constructor - orderId -> ' + this.orderId);
this.orderUpdate = receiptService.orderUpdate;
this.nameUpdate = receiptService.nameUpdate;
this.orderUpdate.subscribe(order => {
this.order = order;
if ( order.session.substring(0,1) == 'W') {
this.isWCOrder = true;
}
});
this.nameUpdate.subscribe(name => {
this.name = name;
});
}
ngOnInit(): void {
this.chgUILanguage();
}
backToShop() {
if ( this.isWCOrder ) {
// console.log('External Invoice -> ' + this.order.externalInvoice );
const b64URL:string = this.order.externalInvoice.substring(0,this.order.externalInvoice.indexOf("-"));
// console.log('encodedURL -> ' + b64URL );
const shopURL: string = Buffer.from(b64URL, 'base64').toString();
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_orderid = tmp_orderid.substring(0,tmp_orderid.indexOf('-'));
// console.log('wc_order_id -> ' + wc_orderid);
// console.log('wc_order_key -> ' + wc_order_key);
// console.log('new URL -> ' + shopURL + '/checkout/order-received/' + wc_orderid + '/?key=' + wc_order_key);
if ( shopURL ) {
// console.log('Opening URL....' + shopURL);
window.open( shopURL + '/checkout/order-received/' + wc_orderid + '/?key=' + wc_order_key,"_blank");
}
}
}
getIconStyle(order : Order) {
if( order.paid )
return "font-size: 14px; color: #72cc50; margin-bottom: -2px;";
return "color: #FB4F14; margin-bottom: -2px; cursor: pointer;";
}
copyAddress() {
if (!navigator.clipboard) {
// alert("Copy functionality not supported");
this.notifierService
.showNotification(
this.vE.invoiceCopyNotavail,
this.vE.invoiceNotservClose,
'error',
this.vE.invoiceNotservError);
}
try {
navigator.clipboard.writeText(this.order.address);
} catch (err) {
this.notifierService
.showNotification(
this.vE.invoiceCopyaddressError,
this.vE.invoiceNotservClose,
'error',
this.vE.invoiceNotservError);
// console.error("Error", err);
}
}
copyAmount() {
if (!navigator.clipboard) {
// alert("Copy functionality not supported");
this.notifierService
.showNotification(
this.vE.invoiceCopyNotavail,
this.vE.invoiceNotservClose,
'error',
this.vE.invoiceNotservError);
}
try {
navigator.clipboard.writeText(this.order.totalZec.toString());
} catch (err) {
this.notifierService
.showNotification(
this.vE.invoiceCopyamountError,
this.vE.invoiceNotservClose,
'error',
this.vE.invoiceNotservError);
// console.error("Error", err);
}
}
copyMemo() {
if (!navigator.clipboard) {
// alert("Copy functionality not supported");
this.notifierService
.showNotification(
this.vE.invoiceCopyNotavail,
this.vE.invoiceNotservClose,
'error',
this.vE.invoiceNotservError);
}
try {
navigator.clipboard.writeText("ZGo Order::" + this.order._id);
} 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

@ -2,6 +2,6 @@ export interface Item {
_id?: any;
name: string;
description: string;
owner: string;
user: string;
cost: number;
}

View File

@ -5,12 +5,3 @@
input[type=number]{
text-align: right;
}
.itemDataTitle {
font-family: 'Spartan', sans-serif;
background: #ff5722;
color: white;
font-size: 26px;
text-align: center;
padding: 10px;
}

View File

@ -1,23 +1,13 @@
<div class='itemDataTitle'>{{ vE.itemaddAdd2Order }}</div>
<h2 mat-dialog-title class="text">Add to Order</h2>
<div class='container'>
<mat-dialog-content [formGroup]="orderForm">
<p class="text">{{lineItem.name}}</p>
<mat-form-field [style.width.%]="100">
<input matInput type="number" placeholder="Quantity" formControlName="qty">
</mat-form-field>
</mat-dialog-content>
<mat-dialog-content [formGroup]="orderForm">
<p class="text">{{lineItem.name}}</p>
<mat-form-field>
<input matInput type="number" placeholder="Quantity" formControlName="qty">
</mat-form-field>
</mat-dialog-content>
<div style="display: flex;
justify-content: space-between;
margin-top: 20px;
padding: 20px;">
<button mat-raised-button
class="text"
(click)="close()">{{ vE.itemaddCancelBtn }}</button>
<button mat-raised-button
class="text"
color="primary"
(click)="save()">{{ vE.itemaddSaveBtn }}</button>
</div>
</div>
<mat-dialog-actions>
<button mat-raised-button class="text" (click)="close()">Cancel</button>
<button mat-raised-button class="text" color="primary" (click)="save()">Add</button>
</mat-dialog-actions>

View File

@ -1,12 +1,9 @@
import { Inject, Component, OnInit, OnDestroy, ViewEncapsulation} from '@angular/core';
import { Inject, Component, OnInit, OnDestroy, ViewEncapsulation } from '@angular/core';
import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { UntypedFormBuilder, Validators, UntypedFormGroup, FormControl } from '@angular/forms';
import { FormBuilder, Validators, FormGroup, FormControl } from '@angular/forms';
import { LineItem } from '../lineitem.model';
import { Order } from '../../order/order.model';
import { LanguageService } from '../../language.service';
import { LanguageData } from '../../language.model';
@Component({
selector: 'app-item-add',
templateUrl: './item-add.component.html',
@ -15,22 +12,12 @@ import { LanguageData } from '../../language.model';
export class ItemAddComponent implements OnInit {
orderForm: UntypedFormGroup;
orderForm: FormGroup;
lineItem: LineItem;
//order: Order;
//
// Language Support
//
vE = {
itemaddAdd2Order : '',
itemaddCancelBtn : '',
itemaddSaveBtn : ''
}
//
// ------------------------------------------------------------
constructor(
private languageService : LanguageService,
private fb: UntypedFormBuilder,
private fb: FormBuilder,
private dialogRef: MatDialogRef<ItemAddComponent>,
@Inject(MAT_DIALOG_DATA) public data: LineItem
) {
@ -45,7 +32,6 @@ export class ItemAddComponent implements OnInit {
}
ngOnInit() {
this.chgUILanguage();
}
close() {
@ -56,22 +42,4 @@ export class ItemAddComponent implements OnInit {
this.lineItem.qty = this.orderForm.value.qty;
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

@ -5,12 +5,3 @@
input[type=number]{
text-align: right;
}
.itemDataTitle {
font-family: 'Spartan', sans-serif;
background: #ff5722;
color: white;
font-size: 26px;
text-align: center;
padding: 5px;
}

View File

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

View File

@ -1,10 +1,8 @@
import { Inject, Component, OnInit, OnDestroy, ViewEncapsulation } from '@angular/core';
import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { UntypedFormBuilder, Validators, UntypedFormGroup, UntypedFormControl } from '@angular/forms';
import { FormBuilder, Validators, FormGroup, FormControl } from '@angular/forms';
import { Item } from '../item.model';
import { LanguageService } from '../../language.service';
import { LanguageData } from '../../language.model';
@Component({
selector: 'app-item-create',
@ -14,35 +12,21 @@ import { LanguageData } from '../../language.model';
export class ItemCreateComponent implements OnInit {
form: UntypedFormGroup;
form: FormGroup;
id: string | undefined = '';
numberRegEx = /\d*\.?\d{1,2}/;
//
// Language Support
//
vE = {
itemcreateAddItem : '',
itemcreateItemLbl : '',
itemcreateItemDescr : '',
itemcreateItemPrice : '',
itemcreateUseNums : '',
itemcreateCloseBtn : '',
itemcreateSaveBtn : ''
}
//
// ------------------------------------------------------------
constructor(
private languageService : LanguageService,
private fb: UntypedFormBuilder,
private fb: FormBuilder,
private dialogRef: MatDialogRef<ItemCreateComponent>,
@Inject(MAT_DIALOG_DATA) public data: Item
){
if (data._id === '') {
this.form = fb.group({
id: [''],
id: [null],
name: [null, Validators.required],
description: [null, Validators.required],
cost: new UntypedFormControl('', {
cost: new FormControl('', {
validators: [Validators.required, Validators.pattern(this.numberRegEx)],
updateOn: "blur"
})
@ -53,7 +37,7 @@ export class ItemCreateComponent implements OnInit {
id: [data._id],
name: [data.name, Validators.required],
description: [data.description, Validators.required],
cost: new UntypedFormControl(data.cost, {
cost: new FormControl(data.cost, {
validators: [Validators.required, Validators.pattern(this.numberRegEx)],
updateOn: "blur"
})
@ -62,36 +46,13 @@ export class ItemCreateComponent implements OnInit {
}
ngOnInit () {
this.chgUILanguage();
}
save() {
// console.log(this.form.value);
this.dialogRef.close(this.form.value);
}
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,13 +1,3 @@
.text {
font-family: 'Spartan', sans-serif;
}
.itemDataTitle {
font-family: 'Spartan', sans-serif;
background: #ff5722;
color: white;
font-size: 26px;
text-align: center;
padding: 5px;
}

View File

@ -1,22 +1,10 @@
<div class='itemDataTitle'>{{ vE.itemdelDelItem }}</div>
<h2 mat-dialog-title class="text">Delete item</h2>
<div class='container' style="margin-top: 20px;">
<mat-dialog-content >
<mat-dialog-content>
<p class="text">Are you sure you want to delete "{{item.name}}"?</p>
</mat-dialog-content>
<span style="line-height: 10px;"></span>
<mat-dialog-content>
<p class="text">{{ vE.itemdelConfirmDel }}"{{item.name}}"?</p>
</mat-dialog-content>
</mat-dialog-content>
<div style="display: flex;
justify-content: space-between;
margin-top: 20px;
padding: 20px;">
<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>
<mat-dialog-actions>
<button mat-raised-button (click)="close()" class="text">Cancel</button>
<button mat-raised-button color="primary" class="text" (click)="save()">Delete</button>
</mat-dialog-actions>

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 { Item } from '../item.model';
import { LanguageService } from '../../language.service';
import { LanguageData } from '../../language.model';
@Component({
selector: 'app-item-delete',
@ -13,19 +11,8 @@ import { LanguageData } from '../../language.model';
export class ItemDeleteComponent implements OnInit{
item: Item;
//
// Language Support
//
vE = {
itemdelDelItem : '',
itemdelConfirmDel : '',
itemdelCloseBtn : '',
itemdelDeleteBtn : ''
}
//
// ------------------------------------------------------------
constructor(
private languageService : LanguageService,
private dialogRef: MatDialogRef<ItemDeleteComponent>,
@Inject(MAT_DIALOG_DATA) public data: Item
) {
@ -33,7 +20,6 @@ export class ItemDeleteComponent implements OnInit{
}
ngOnInit() {
this.chgUILanguage();
}
save() {
@ -43,23 +29,4 @@ export class ItemDeleteComponent implements OnInit{
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,16 +0,0 @@
.text {
font-family: 'Spartan', sans-serif;
}
input[type=number]{
text-align: right;
}
.itemDataTitle {
font-family: 'Spartan', sans-serif;
background: #ff5722;
color: white;
font-size: 26px;
text-align: center;
padding: 5px;
}

View File

@ -1,41 +0,0 @@
<div class='itemDataTitle'>{{ vE.itemeditEditItem }}</div>
<div class='container' style="margin-top: 20px;">
<mat-dialog-content [formGroup]="form">
<span style="line-height: 10px;"></span>
<mat-form-field class="text" [style.width.%]="100">
<mat-label>{{ vE.itemeditItemLabel}}</mat-label>
<input type="hidden" formControlName="id">
<input matInput
placeholder="Item"
formControlName="name"
maxlength="16">
</mat-form-field >
<mat-form-field class="text" [style.width.%]="100">
<mat-label>{{ vE.itemeditItemDescr }}</mat-label>
<textarea matInput
placeholder="Description"
formControlName="description"
maxlength="30"
style="line-height:20px;
overflow:auto;"></textarea>
</mat-form-field>
<mat-form-field class="text" [style.width.%]="100">
<mat-label>{{ vE.itemeditItemPrice }}</mat-label>
<input matInput type="number" placeholder="Price" formControlName="cost">
<div *ngIf="!form.controls['cost'].valid && form.controls['cost'].touched">
<div *ngIf="form.controls['cost'].errors?.pattern">Use only numbers</div>
</div>
</mat-form-field>
</mat-dialog-content>
<div style="display: flex;
justify-content: space-between;
margin-top: 20px;
padding: 20px;">
<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>

View File

@ -1,96 +0,0 @@
import { Inject, Component, OnInit, OnDestroy, ViewEncapsulation } from '@angular/core';
import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { UntypedFormBuilder, Validators, UntypedFormGroup, UntypedFormControl } from '@angular/forms';
import { Item } from '../item.model';
import { LanguageService } from '../../language.service';
import { LanguageData } from '../../language.model';
@Component({
selector: 'app-item-edit',
templateUrl: './item-edit.component.html',
styleUrls: ['./item-edit.component.css']
})
export class ItemEditComponent implements OnInit {
form: UntypedFormGroup;
id: string | undefined = '';
numberRegEx = /\d*\.?\d{1,2}/;
//
// Language Support
//
vE = {
itemeditCloseBtn : '',
itemeditEditItem : '',
itemeditItemDescr : '',
itemeditItemLabel : '',
itemeditItemPrice : '',
itemeditSaveBtn : ''
}
//
// ------------------------------------------------------------
constructor(
private languageService : LanguageService,
private fb: UntypedFormBuilder,
private dialogRef: MatDialogRef<ItemEditComponent>,
@Inject(MAT_DIALOG_DATA) public data: Item
){
if (data._id === '') {
this.form = fb.group({
id: [''],
name: [null, Validators.required],
description: [null, Validators.required],
cost: new UntypedFormControl('', {
validators: [Validators.required, Validators.pattern(this.numberRegEx)],
updateOn: "blur"
})
});
} else {
this.id = data._id;
this.form = fb.group({
id: [data._id],
name: [data.name, Validators.required],
description: [data.description, Validators.required],
cost: new UntypedFormControl(data.cost, {
validators: [Validators.required, Validators.pattern(this.numberRegEx)],
updateOn: "blur"
})
});
}
}
ngOnInit () {
this.chgUILanguage();
}
save() {
// console.log(this.form.value);
this.dialogRef.close(this.form.value);
}
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,5 +1,5 @@
.card {
font-family: 'Spartan', sans-serif;
font-family: 'Spartan', sans-serif;
}
.text {
@ -25,52 +25,6 @@ div.card{
}
p.price{
font-family: 'Roboto Mono', monospace;
font-family: 'Roboto-Mono', monospace;
margin: 0px;
}
.rv_price {
font-family: Roboto Mono;
font-size: 16px;
text-align: right;
}
.buttons-class {
background-color: #ff5722;
color: white;
font-family: 'Spartan', sans-serif;
font-size: 12px !important;
font-weight: 700;
height: 25px !important;
width: 100px !important;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
.buttons-class-cart{
background-color: #ff5722;
color: white;
font-size: 18px;
font-weight: 700;
height:30px !important;
width: 50px !important;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
.availableItems{
display: flex;
justify-content: space-between;
background: lightblue;
font-family: 'Spartan', sans-serif !important;
font-size: 18px;
font-weight: 700;
text-align: left;
margin: 5px;
height: 25px;
padding: 12px;
}

View File

@ -1,96 +1,42 @@
<div *ngIf="items.length > 0">
<mat-toolbar color="accent">
<span align="center" class="text">
{{ vE.itemlistAvailItems }}
</span>
<span class="spacer"></span>
<span align="center">
<button mat-icon-button
color="primary"
(click)="openDialog()">
<mat-icon aria-button-label="Add Item">
add
</mat-icon>
</button>
</span>
</mat-toolbar>
<div style="display: block;
overflow-y: auto;
height: 500px;">
<div class="card" *ngFor="let item of itemsUpdate | async">
<mat-card>
<table cellspacing="0" width="100%" >
<div class="card" *ngFor="let item of itemsUpdate | async">
<mat-card>
<table cellspacing="0" width="100%" class="text">
<tr>
<td style="font-family: Roboto Mono;
font-size: 16px;
font-weight: 700;
height: 20px;">
{{item.name}}
</td>
<td></td>
</tr>
<tr>
<td style="font-family: Roboto Mono;
font-size: 16px;
font-weight: 400;
height: 20px;">
{{item.description}}
</td>
<td>
<div class="rv_price"
*ngIf="!owner.zats">
<img class="icon"
src="/assets/zec_rv.png"
height="16px">
{{(item.cost/zecPrice) | number: '1.08'}}
[{{item.cost | number: '1.02' | currency: getCurrency() }}]
</div>
<p class="rv_price"
*ngIf="owner.zats">
&#x24e9; {{ ((item.cost/zecPrice)*100000000).toString().substring( 0, ((item.cost/zecPrice)*100000000 ).toString().indexOf('.')) }} [{{item.cost | number: '1.02' | currency: getCurrency() }}]
</p>
<td>{{item.name}}</td>
<td align="right">
<p class="price">{{item.cost | currency: getCurrency() }}</p>
<p class="price" *ngIf="!owner.zats"><img class="icon" src="/assets/spartan-zec.png" width="12px" />{{(item.cost/price) | number: '1.0-6'}}</p>
<p class="price" *ngIf="owner.zats">&#x24e9; {{(item.cost/price)*100000000 | number: '1.0-0'}}</p>
</td>
</tr>
</table>
<mat-card-actions>
<table cellspacing="0" width="100%">
<tr>
<td>
<button mat-icon-button class="icons" (click)="edit(item._id!)">
<mat-icon>edit</mat-icon>
</button>
<button mat-icon-button class="icons" (click)="delete(item._id!)">
<mat-icon>delete</mat-icon>
</button>
</td>
<td align="right">
<button mat-icon-button
color="primary"
class="buttons-class-cart"
(click)="addToOrder(item._id!)">
<mat-icon>
shopping_cart
</mat-icon>
</button>
</td>
</tr>
</table>
</mat-card-actions>
</mat-card>
</div>
</div>
</div>
<div *ngIf = "items.length <= 0">
<div class="availableItems" >
{{ vE.itemlistListEmpty }}
<button mat-raised-button
class="buttons-class"
(click)="openDialog()">
<mat-icon class="icon">
add
</mat-icon>
Add item
</button>
<div align="center">
<p class="text small">{{item.description}}</p>
</div>
<mat-card-actions>
<table cellspacing="0" width="100%">
<tr>
<td>
<button mat-icon-button class="icons" (click)="edit(item._id!)">
<mat-icon inline=true>edit</mat-icon>
</button>
<button mat-icon-button class="icons" (click)="delete(item._id!)">
<mat-icon inline=true>delete</mat-icon>
</button>
</td>
<td align="right">
<button mat-raised-button color="primary" class="icons" (click)="addToOrder(item._id!)">
<mat-icon>shopping_cart</mat-icon>
</button>
</td>
</tr>
</table>
</mat-card-actions>
</mat-card>
</div>
</div>
</div>
<p *ngIf = "items.length <= 0">No items yet!</p>
<br>
<button class="text" mat-raised-button (click)="openDialog()">
<mat-icon class="icon">add</mat-icon>Add item</button>

View File

@ -1,8 +1,5 @@
import { Input, Component, OnInit } from '@angular/core';
import { Component, OnInit } from '@angular/core';
import { MatDialog, MatDialogConfig} from '@angular/material/dialog';
import { faCartShopping } from '@fortawesome/free-solid-svg-icons';
import { Observable } from 'rxjs';
import { Item } from '../item.model';
import { Owner } from '../../owner.model';
@ -11,27 +8,18 @@ import { UserService } from '../../user.service';
import { ItemService } from '../items.service';
import { OrderService} from '../../order/order.service';
import { ItemCreateComponent } from '../item-create/item-create.component';
import { ItemEditComponent } from '../item-edit/item-edit.component';
import { ItemDeleteComponent } from '../item-delete/item-delete.component';
import { ItemAddComponent } from '../item-add/item-add.component';
import { NotifierService } from '../../notifier.service';
import { LanguageService } from '../../language.service';
@Component({
selector: 'app-item-list',
templateUrl: './item-list.component.html',
styleUrls: ['./item-list.component.css']
})
export class ItemListComponent implements OnInit{
@Input() zecPrice: number;
public items: Item[] = [];
faCartShopping = faCartShopping;
owner: Owner = {
_id: '',
name: '',
@ -41,57 +29,48 @@ export class ItemListComponent implements OnInit{
taxValue: 0,
vat: false,
vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false,
zats: false,
invoices: false,
expiration: new Date(Date.now()).toISOString(),
payconf: false,
crmToken: '',
viewkey: '',
tips: false
website: '',
country: '',
zats: false
};
public price: number = 1;
public ownerUpdate: Observable<Owner>;
public itemsUpdate: Observable<Item[]>;
public priceUpdate: Observable<number>;
//
// Language Support
//
vE = {
itemlistAvailItems : '',
itemlistListEmpty : '',
itemlistItemAdded : '',
itemlistItemUpdated : '',
itemlistItemDeleted : '',
itemlistNotifClose : '',
itemlistNotifSuccess : ''
}
//
// ------------------------------------------------------------
constructor(
public itemService: ItemService,
userService: UserService,
public orderService: OrderService,
public fullnodeService: FullnodeService,
private dialog: MatDialog,
private notifierService: NotifierService,
private languageService: LanguageService )
{
this.ownerUpdate = userService.ownerUpdate;
this.itemsUpdate = itemService.itemsUpdated;
this.ownerUpdate.subscribe((owner) => {
this.owner = owner;
itemService.getItems(this.owner.address);
this.itemsUpdate.subscribe((items) => {
this.items = items;
});
private dialog: MatDialog
) {
this.ownerUpdate = userService.ownerUpdate;
this.itemsUpdate = itemService.itemsUpdated;
this.priceUpdate = fullnodeService.priceUpdate;
this.ownerUpdate.subscribe((owner) => {
this.owner = owner;
fullnodeService.getPrice(this.owner.currency);
itemService.getItems(this.owner.address);
this.itemsUpdate.subscribe((items) => {
this.items = items;
});
this.zecPrice = 1;
});
this.priceUpdate.subscribe((price) => {
this.price = price;
});
}
ngOnInit(){
this.chgUILanguage();
this.itemsUpdate.subscribe((items) => {
this.items = items;
});
@ -108,14 +87,8 @@ export class ItemListComponent implements OnInit{
dialogRef.afterClosed().subscribe((val) => {
if(val != null) {
var item:Item = {_id: '', name: val.name, description: val.description, cost: val.cost, owner: this.owner.address};
var item:Item = {name: val.name, description: val.description, cost: val.cost, user: this.owner.address};
this.itemService.addItem(item);
//console.log('creando item y llamando a notifier >>>');
this.notifierService
.showNotification(this.vE.itemlistItemAdded ,
this.vE.itemlistNotifClose,
"success",
this.vE.itemlistNotifSuccess);
}
this.itemService.getItems(this.owner.address);
this.itemsUpdate.subscribe((items) => {
@ -125,16 +98,16 @@ export class ItemListComponent implements OnInit{
}
edit(id: string) {
// console.log('Edit:', id);
//console.log('Edit:', id);
const item = this.items.find(element => element._id == id);
// console.log(item);
//console.log(item);
const dialogConfig = new MatDialogConfig();
dialogConfig.disableClose = true;
dialogConfig.autoFocus = true;
dialogConfig.data = item;
//console.log('Entrando a dialogo de edicion')
const dialogRef = this.dialog.open(ItemEditComponent, dialogConfig);
const dialogRef = this.dialog.open(ItemCreateComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => {
if (val != null) {
var editItem: Item = {
@ -142,18 +115,12 @@ export class ItemListComponent implements OnInit{
name: val.name,
description: val.description,
cost: val.cost,
owner: this.owner.address
user: this.owner.address
};
//console.log('Edit:', editItem);
//console.log('itemlistItemUpdated = ' + this.vE.itemlistItemUpdated);
this.itemService.addItem(editItem).subscribe((response) => {
this.itemService.getItems(this.owner.address);
});
this.notifierService
.showNotification(this.vE.itemlistItemUpdated,
this.vE.itemlistNotifClose,
"success",
this.vE.itemlistNotifSuccess);
});;
}
this.itemService.getItems(this.owner.address);
});
@ -172,14 +139,9 @@ export class ItemListComponent implements OnInit{
const dialogRef = this.dialog.open(ItemDeleteComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => {
if (val != null) {
// console.log('Deleting', val);
console.log('Deleting', val);
this.itemService.deleteItem(val);
this.items = [];
this.notifierService
.showNotification(this.vE.itemlistItemDeleted,
this.vE.itemlistNotifClose,
"success",
this.vE.itemlistNotifSuccess);
}
this.itemService.getItems(this.owner.address);
this.itemsUpdate.subscribe((items) => {
@ -204,7 +166,7 @@ export class ItemListComponent implements OnInit{
const dialogRef = this.dialog.open(ItemAddComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => {
if (val != null) {
//console.log('Adding to order', val);
console.log('Adding to order', val);
this.orderService.addToOrder(val);
}
this.itemService.getItems(this.owner.address);
@ -214,28 +176,5 @@ export class ItemListComponent implements OnInit{
getCurrency(){
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

@ -3,5 +3,5 @@ export interface Item {
name: string;
description: string;
cost: number;
owner: string;
user: string;
}

View File

@ -1,38 +1,27 @@
import { Item } from './item.model';
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 { ConfigData } from '../configdata';
var Buffer = require('buffer/').Buffer;
@Injectable({providedIn: 'root'})
export class ItemService{
beUrl = ConfigData.Be_URL;
beUrl = 'http://localhost:3000/';
private dataStore: { items: Item[] } = { items: [] } ;
private _itemsUpdated: BehaviorSubject<Item[]> = new BehaviorSubject(this.dataStore.items);
public readonly itemsUpdated: Observable<Item[]> = this._itemsUpdated.asObservable();
private address:string = '';
private apiKey = 'YourApiKey';
private reqHeaders: HttpHeaders;
private session: null|string;
private params: HttpParams;
constructor(private http: HttpClient){
var auth = 'Basic ' + Buffer.from(ConfigData.UsrPwd).toString('base64');
this.reqHeaders = new HttpHeaders().set('Authorization', auth);
this.session = localStorage.getItem('s4z_token');
this.params = new HttpParams().append('session', this.session!);
this.reqHeaders = new HttpHeaders().set('Authorization', this.apiKey);
}
getItems(addr: string){
this.address = addr;
const newParams = this.params.append('address', addr);
let obs = this.http.get<{message: string, items: any}>(this.beUrl+'api/items', { headers:this.reqHeaders, params: newParams, observe: 'response'});
const params = new HttpParams().append('address', addr);
let obs = this.http.get<{message: string, items: any}>(this.beUrl+'api/getitems', { headers:this.reqHeaders, params: params, observe: 'response'});
obs.subscribe((ItemDataResponse) => {
if (ItemDataResponse.status == 200 ) {
@ -41,6 +30,7 @@ export class ItemService{
} else {
this.dataStore.items = [];
this._itemsUpdated.next(Object.assign({},this.dataStore).items);
console.log('No items found');
}
});
@ -48,9 +38,11 @@ export class ItemService{
}
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', { item: item }, { headers: this.reqHeaders });
obs.subscribe(() => {
obs.subscribe((ItemResponse) => {
console.log('Item added');
this.getItems(this.address);
});
@ -58,9 +50,10 @@ export class ItemService{
}
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);
});

View File

@ -1,6 +0,0 @@
export interface newLineItem {
line_id: number;
qty: number;
name: string;
cost: number;
}

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

@ -1,141 +1,32 @@
.text{
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 {
font-family: 'Roboto Mono';
font-size: 14px;
color: #000000;
text-align: left;
margin-left: 5px;
background: lightgray;
}
.icon{
font-family: 'Material Icons';
}
.orderheader {
background-color: lightgrey !important;
}
.orderdetail {
font-family: 'Roboto Mono';
font-size: 12px;
color: #000000;
text-align: left;
margin-left: 5px;
background: lightcyan;
}
.number{
font-family: 'Roboto Mono', monospace;
}
img.icon{
margin-bottom: -2px;
height: 18px;
}
.price{
display: flex;
align-items: center;
}
.mini{
font-size: x-small;
align-items: center;
display: flex;
padding: 3px;
}
.small{
font-size: small;
}
.total{
font-family:'Roboto Mono';
margin: auto;
font-size: large;
font-family: 'Roboto Mono', monospace;
}
.tbheader {
font-family: 'Roboto Mono';
font-size: 14px;
font-weight: 700;
img.total{
margin-bottom:-2px;
}
.tbdetail {
font-family: 'Roboto Mono';
font-size: 14px;
font-weight: 400;
}
.totalsTbl {
margin-top: 15px;
border-bottom: solid;
border-color: lightgray;
border-width: 2px;
background: lightcyan;
}
.totalsHdr {
font-family: 'Roboto Mono' !important;
text-align: center;
margin-bottom: 50px;
}
.totalsHdrTitle {
font-size: 18px;
font-weight: 700;
}
.totalsHdrDetail {
font-size: 16px;
font-weight: 600;
margin-bottom: 5px;
}
.orderList {
font-family: 'Roboto Mono' !important;
}
.orderListTitle {
font-family: 'Roboto Mono' !important;
font-size: 14px;
font-weight: 600;
}
.orderListTitleDescr {
font-size: 16px;
font-weight: 600;
text-align: justify;
}
.minibutton {
font-family: 'Spartan', sans-serif;
font-size: 14px;
/*background: #ff5722;*/
/*color: white;*/
height: 24px;
line-height: 20px;
padding: 10px;
}
.spacer {
flex: 1 1 auto;
.central{
max-width: 450px;
}

View File

@ -1,192 +1,47 @@
<app-header></app-header>
<div align="center">
<div class="text1">{{(ownerUpdate | async)!.name}}</div>
<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 >
<tr>
<td width="45%">
<button class="text" mat-raised-button [routerLink]="['/shop']" color="primary">
<mat-icon class="icon">home</mat-icon>
{{ vE.listordersBacktoshopBtn }}
</button>
</td>
<td width="10%">
</td>
<td width="45%">
<button mat-raised-button color="primary"
class="text" (click)="openDbExport()">
<mat-icon class="icon">get_app</mat-icon>
{{ vE.listordersExportOrders }}
</button>
</td>
</tr>
</table>
<h3 class="text">{{(ownerUpdate | async)!.name}}</h3>
<button class="text" mat-raised-button [routerLink]="['/shop']" color="primary">
Back to Shop
</button>
</div>
<mat-divider></mat-divider>
<div align="center">
<div class="central">
<table class="text" width="75%">
<tr>
<td width="50%" align="center">
<h3>Today's Total:</h3>
<p class="total"><img class="total" src="/assets/spartan-zec.png" height="18px" />{{todayTotal | number: '1.0-6'}}</p>
</td>
<td width="50%" align="center">
<h3>Overall Total:</h3>
<p class="total"><img class="total" src="/assets/spartan-zec.png" height="18px" />{{total | number: '1.0-6'}}</p>
</td>
</tr>
</table>
</div>
</div>
<mat-divider></mat-divider>
<div align="center">
<div class="central">
<mat-accordion *ngIf = "orders.length > 0">
<mat-expansion-panel class="text" *ngFor = "let order of orders">
<mat-expansion-panel-header class="text" >
<mat-panel-title>
<span class="price number"><img src="/assets/spartan-zec.png" height="50%" />{{order.totalZec}}</span>
</mat-panel-title>
<mat-panel-description>
{{order.timestamp | date: 'short'}}
</mat-panel-description>
</mat-expansion-panel-header>
<p class="text">Order: {{order._id}}</p>
<p class="text">Zcash price: {{order.price | currency: order.currency.toUpperCase()}}</p>
<mat-list>
<mat-list-item class="text small" *ngFor="let item of order.lines">{{item.qty}} x {{item.name}}</mat-list-item>
</mat-list>
</mat-expansion-panel>
</mat-accordion>
<p class="text" *ngIf = "orders.length <= 0">No orders</p>
</div>
</div>
<table class="totalsTbl" width="100%">
<tr class="totalsHdr">
<td width="10%"></td>
<td width="40%" >
<div class="totalsHdrTitle">{{ vE.listordersTodaysTotal }}</div>
<div class="totalsHdrDetail">
<img src="/assets/zec_rv.png"
style="height: 16px !important;
margin-bottom: -2px;">{{todayTotal | number: '1.08'}}
</div>
</td>
<td width="40%" >
<div class="totalsHdrTitle">{{ vE.listordersOverallTotal }}</div>
<div class="totalsHdrDetail">
<img src="/assets/zec_rv.png"
style="height: 16px !important;
margin-bottom: -2px;">{{total | number: '1.08'}}
</div>
</td>
<td width="10%"></td>
</tr>
</table>
<div class="orderList">
<mat-accordion *ngIf = "orders.length > 0">
<mat-expansion-panel *ngFor = "let order of orders">
<mat-expansion-panel-header [collapsedHeight]="'35px'" [expandedHeight]="'30px'" >
<mat-panel-title>
<div class="orderListTitle">
<img src="/assets/zec_rv.png"
style="height: 14px;
margin-bottom: -2px;
padding-right: 3px;"
>{{order.totalZec | number: '1.08'}}
</div>
</mat-panel-title>
<mat-panel-description>
<table width="100%">
<tr>
<td>
<fa-icon *ngIf="payConf"
[icon]="getIcon(order)" [style]="getIconStyle(order)" ></fa-icon>
</td>
<td align="center"
style="font-family: 'Roboto Mono' !important;
font-weight: 700 ;
font-size: 14px;">
{{order.timestamp | date: 'YYYY-MM-dd, HH:mm'}}
</td>
</tr>
</table>
</mat-panel-description>
</mat-expansion-panel-header>
<div class='orderheader'>
<div class="text2"> <b>{{ vE.listordersOrderId }}</b>: {{order._id}}</div>
</div>
<table style="width: 100%;"
cellspacing="0">
<tr style="font-family: 'Roboto Mono';
font-weight: 700;
font-size: 16px;
height: 20px;">
<td width="50%">{{ vE.listordersOrderTotal }}</td>
<td align="right"
width="50%">
<img class="icon" src="/assets/zec_rv.png"
>{{ order.totalZec | number: '1.08'}}
</td>
</tr>
<tr style="font-family: 'Roboto Mono';
font-size: 15px;
font-weight: 400;
height: 18px;">
<td width="50%">
<img class="icon"
style="color: lightgray;
margin-bottom: -3px;"
src="/assets/zec_rv.png"
>1.0 = {{ order.price | currency: order.currency.toUpperCase()}}
</td>
<td width="50%" align="right">
{{ order.total | currency: order.currency.toUpperCase()}}
</td>
</tr>
</table>
<table style="width: 100%;">
<thead style="width: 100%;">
<tr style="background: lightblue;">
<th class="tbheader"
style="text-align: left;"
width="55%">{{ vE.listordersItemLbl }}
</th>
<th class="tbheader"
style="text-align: left;"
width="15%">{{ vE.listordersQtyLbl }}
</th>
<th class="tbheader"
style="text-align: right;"
width="30%">{{ vE.listordersTotalLbl }}
</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let item of order.lines">
<td class="tbdetail"
style="text-align: left;"
width="55%">{{item.name}}
</td>
<td class="tbdetail"
style="text-align: left;"
width="15%">{{item.qty}}
</td>
<td class="tbdetail"
style="text-align: right;"
width="30%">{{item.qty * item.cost | number:'1.02' | currency: order.currency.toUpperCase() }}
</td>
</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>
</table>
<div style="display: flex;
justify-content: space-between;
padding-left: 20%;
padding-right: 20%;
margin-top: 10px;">
<span>
<button mat-raised-button class="minibutton" color="primary" (click)="invoice(order)">{{ vE.listordersInvoiceBtn }}</button>
</span>
<span>
<button mat-raised-button class="minibutton" color="primary" (click)="receipt(order)">{{ vE.listordersReceiptBtn }}</button>
</span>
</div>
</mat-expansion-panel>
</mat-accordion>
<p class="text" *ngIf = "orders.length <= 0">{{ vE.listordersNoOrders }}</p>
</div>

View File

@ -3,25 +3,9 @@ import { Observable } from 'rxjs';
import { Order } from '../order/order.model';
import { FullnodeService } from '../fullnode.service';
import { UserService } from '../user.service';
import { Owner } from '../owner.model';
import { User } from '../user.model';
import {Owner} from '../owner.model';
import { OrderService } from '../order/order.service';
import { MatDialog, MatDialogConfig} from '@angular/material/dialog';
import { PromptInvoiceComponent } from '../prompt-invoice/prompt-invoice.component';
import { PromptReceiptComponent } from '../prompt-receipt/prompt-receipt.component';
import { DbExportComponent } from '../db-export/db-export.component';
import { faTimes } from '@fortawesome/free-solid-svg-icons';
import { faTimesCircle } from '@fortawesome/free-solid-svg-icons';
import { faCheck } from '@fortawesome/free-solid-svg-icons';
import { faCheckCircle } from '@fortawesome/free-solid-svg-icons';
import { faHourglass } 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({
selector: 'app-list-orders',
templateUrl: './listorders.component.html',
@ -29,115 +13,30 @@ import {SessionpayComponent} from '../sessionpay/sessionpay.component';
})
export class ListOrdersComponent implements OnInit, OnDestroy{
// orderId;
public todayTotal: number = 0;
public total: number = 0;
public orders: Order[] = [];
public ownerUpdate: Observable<Owner>;
public ordersUpdate: Observable<Order[]>;
// ------------------------------------
//
faTimes = faTimes;
faTimesCircle = faTimesCircle;
faCheck = faCheck;
faCheckCircle = faCheckCircle;
faHourglass = faHourglass;
faTrash = faTrash;
payConf : boolean = false;
owner : Owner = {
address: '',
name: '',
currency: 'usd',
tax: false,
taxValue: 0,
vat: false,
vatValue: 0,
paid: false,
zats: false,
invoices: false,
expiration: new Date(Date.now()).toISOString(),
payconf: false,
crmToken: '',
viewkey: '',
tips: false
};
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(
private languageService : LanguageService,
public orderService: OrderService,
public userService: UserService,
public fullnodeService: FullnodeService,
private dialog: MatDialog)
{
public userService: UserService
){
this.ownerUpdate = userService.ownerUpdate;
this.userUpdate = userService.userUpdate;
this.orderService.getAllOrders();
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(){
// console.log('listOrders Init -->');
this.chgUILanguage();
this.owner = this.userService.currentOwner();
// console.log(this.owner.name);
this.payConf = this.owner.payconf;
// this.payConf = true;
// console.log('payConf = ', this.payConf);
this.ordersUpdate.subscribe((orders) => {
this.total = 0;
this.todayTotal = 0;
var today = new Date();
this.orders = orders;
//console.log(this.ownerUpdate);
console.log('lisord', this.orders.length);
for (let i=0; i < this.orders.length; i++){
this.total += this.orders[i].totalZec;
//
var date = new Date(this.orders[i]!.timestamp!);
var diff = (today.getTime() / 1000) - (date.getTime()/1000);
if (diff < (24*3600)){
@ -151,122 +50,4 @@ export class ListOrdersComponent implements OnInit, OnDestroy{
this.total = 0;
this.todayTotal = 0;
}
getIcon(order : Order) {
if( order.paid )
return faCheckCircle;
return faHourglass;
}
getIconStyle(order : Order) {
if( order.paid )
return "font-size: 14px; color: #72cc50; margin-bottom: -2px;";
return "color: #FB4F14; margin-bottom: -2px; cursor: pointer;";
}
invoice(order : Order) {
// var zec = this.total/this.price;
// this.order.totalZec = parseFloat(zec.toFixed(8));
const dialogConfig = new MatDialogConfig();
// console.log("Order data:");
// console.log(order);
// console.log("order.total = " + order.total);
dialogConfig.disableClose = true;
dialogConfig.autoFocus = true;
dialogConfig.data = {
orderId: order._id,
orderToken: order.token
};
const dialogRef = this.dialog.open(PromptInvoiceComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => {
console.log('Returning to order list');
});
}
receipt(order : Order) {
// var zec = this.total/this.price;
// this.order.totalZec = parseFloat(zec.toFixed(8));
const dialogConfig = new MatDialogConfig();
// console.log("Order data:");
// console.log(order);
// console.log("order.total = " + order.total);
dialogConfig.disableClose = true;
dialogConfig.autoFocus = true;
dialogConfig.data = {
orderId: order._id,
orderToken: order.token
};
const dialogRef = this.dialog.open(PromptReceiptComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => {
console.log('Returning to order list');
});
}
openDbExport(){
const dialogConfig = new MatDialogConfig();
//console.log('openDbExport ---');
dialogConfig.disableClose = false;
dialogConfig.autoFocus = true;
dialogConfig.data = this.owner;
const dialogRef = this.dialog.open(DbExportComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => {
console.log('Returning to order list');
});
}
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;
color: #FFFFFF;
margin: 5px;
width: 90%;
justify-content: center;
}
mat-card.centercard{
max-width: 450px;
border: 1px solid #CCCCCC;
justify-content: center;
}
.icon{
font-family: 'Material Icons';

View File

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

View File

@ -1,19 +1,22 @@
import { Component, OnInit, ChangeDetectorRef, ViewChild, AfterViewInit } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { Component, OnInit, OnDestroy, Injectable, ChangeDetectorRef, ViewChild, AfterViewInit } from '@angular/core';
import { CanActivate, Router, RouterStateSnapshot, ActivatedRouteSnapshot, ActivatedRoute } from '@angular/router';
import { MatDialog, MatDialogConfig} from '@angular/material/dialog';
import { UntypedFormBuilder, Validators, UntypedFormGroup } from '@angular/forms';
import { FormBuilder, Validators, FormGroup, FormControl } from '@angular/forms';
import { ProgressBarMode } from '@angular/material/progress-bar';
import { MatStepper } from '@angular/material/stepper';
import { UserService } from '../user.service';
import { FullnodeService } from '../fullnode.service';
import { ScanComponent} from '../scan/scan.component';
import { Tx } from '../tx.model';
import { User } from '../user.model';
import {User} from '../user.model';
import { Owner } from '../owner.model';
import { Subscription, Observable } from 'rxjs';
import { take } from 'rxjs/operators';
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({
selector: 'app-login',
@ -32,6 +35,7 @@ export class LoginComponent implements OnInit, AfterViewInit {
address: '',
session: '',
blocktime: 0,
expired: false,
pin: '',
validated: false
};
@ -43,22 +47,38 @@ export class LoginComponent implements OnInit, AfterViewInit {
taxValue:0,
vat: false,
vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false,
zats: false,
invoices: false,
expiration: new Date(Date.now()).toISOString(),
payconf: false,
crmToken: '',
viewkey: '',
tips: false
website: '',
country: '',
zats: false
};
private FullnodeSub: Subscription = new Subscription();
private UserSub: Subscription = new Subscription();
public heightUpdate: Observable<number>;
public uZaddrUpdate: Observable<string>;
public userUpdate: Observable<User>;
public ownerUpdate: Observable<Owner>;
//public txsUpdate: Observable<Tx[]>;
public userUpdate:Observable<User>;
public ownerUpdate:Observable<Owner>;
public txsUpdate: Observable<Tx[]>;
tickets = [
{
value: 0.001,
viewValue: '1 hour: 0.001 ZEC'
},{
value: 0.005,
viewValue: '1 day: 0.005 ZEC'
},{
value: 0.025,
viewValue: '1 week: 0.025 ZEC'
}
];
prompt: boolean = false;
confirmedMemo: boolean = false;
targetBlock: number = 0;
@ -67,35 +87,23 @@ export class LoginComponent implements OnInit, AfterViewInit {
barMessage = 'Scanning blockchain for login memo, please wait.';
@ViewChild('stepper') private myStepper?: MatStepper;
pinForm: UntypedFormGroup;
entryForm: FormGroup;
pinForm: FormGroup;
//
// Language Support
//
vE = {
loginConfirmLogin : '',
loginConnectToZGo : '',
loginEnterPin : '',
loginLastBlock : '',
loginLinkWallet : '',
loginCheckWallet : '',
loginWrongPin : '',
loginConfirmPin : ''
}
//
// ------------------------------------------------------------
constructor(
private fb: UntypedFormBuilder,
private fb: FormBuilder,
private activatedRoute: ActivatedRoute,
public fullnodeService: FullnodeService,
private router: Router,
public userService: UserService,
private dialog: MatDialog,
private _changeDetectorRef: ChangeDetectorRef,
private languageService: LanguageService
private _changeDetectorRef: ChangeDetectorRef
){
//this.fullnodeService.getAddr();
this.entryForm = fb.group({
selectedSession: [0.001, Validators.required]
});
this.pinForm = fb.group({
pinValue: [null, Validators.required]
});
@ -109,14 +117,13 @@ export class LoginComponent implements OnInit, AfterViewInit {
this.ownerUpdate.subscribe((owner) => {
this.owner = owner;
});
//this.txsUpdate = userService.txUpdate;
//this.txsUpdate.subscribe((txs) => {
//this.txs = txs;
//});
this.txsUpdate = userService.txUpdate;
this.txsUpdate.subscribe((txs) => {
this.txs = txs;
});
}
ngAfterViewInit(){
//console.log('Step', this.myStepper);
this.pinError = false;
//console.log('Activated route data in Component:::', this.activatedRoute.data);
@ -136,39 +143,42 @@ export class LoginComponent implements OnInit, AfterViewInit {
}
ngOnInit(){
this.chgUILanguage();
this.intervalHolder = setInterval(() => {
this.fullnodeService.getHeight();
//this.userService.findUser();
this.loginCheck();
this._changeDetectorRef.markForCheck();
}, 1000 * 60);
}
loginCheck(){
this.userService.checkUser()!.subscribe({
next: (checkResponse) => {
if (checkResponse.status == 200) {
console.log('checkUser true');
if(this.myStepper!.selectedIndex === 0) {
this.myStepper!.next();
this.myStepper!.next();
var today = new Date().getTime() / 1000;
this.userService.findUser();
this.userService.findPending();
this.txsUpdate.subscribe((txs) => {
this.txs = txs;
});
this.userUpdate.subscribe((user) => {
if (user.blocktime > 0) {
if(this.myStepper!.selectedIndex === 1){
this.myStepper!.next();
}
//console.log('Log in found in blockchain!');
if (user.validated) {
if (this.owner.paid) {
this.router.navigate(['/shop']);
} 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');
}
}
},
error: (error) => {console.log(error);}
}
});
if (this.txs.length > 0) {
this.barMode = 'determinate';
this.barValue = (this.txs[0].confirmations / 2) * 100;
this.confirmedMemo = true;
this.barMessage = 'Login memo found, awaiting confirmations';
}
}
login(stepper: MatStepper) {
@ -186,7 +196,7 @@ export class LoginComponent implements OnInit, AfterViewInit {
const dialogRef = this.dialog.open(ScanComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => {
// console.log('Awaiting confirmation');
console.log('Awaiting confirmation');
if(val){
stepper.next();
}
@ -194,14 +204,12 @@ export class LoginComponent implements OnInit, AfterViewInit {
}
confirmPin(){
this.userService.validateUser(this.pinForm.value.pinValue).subscribe((val) => {
if (val) {
this.router.navigate(['/biz']);
clearInterval(this.intervalHolder);
} else {
this.pinError = true;
}
});
if (this.user.pin === this.pinForm.value.pinValue) {
this.userService.validateUser();
this.router.navigate(['/shop']);
} else {
this.pinError = true;
}
}
ngOnDestroy(){
@ -209,26 +217,4 @@ export class LoginComponent implements OnInit, AfterViewInit {
this.UserSub.unsubscribe();
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 { ActivatedRouteSnapshot } from '@angular/router';
import { ActivatedRouteSnapshot, Resolve } from '@angular/router';
import { Observable, of } from 'rxjs';
import { catchError } from 'rxjs/operators';
@ -9,13 +9,13 @@ import { FullnodeService} from './fullnode.service';
providedIn: 'root'
})
export class NodeResolverService {
export class NodeResolverService implements Resolve<any> {
constructor(private fullnode: FullnodeService) {}
resolve(route: ActivatedRouteSnapshot): Observable<any> {
//console.log('Called getAddr in resolver...', route);
console.log('Called getAddr in resolver...', route);
return this.fullnode.getAddr().pipe(
catchError(() => {
catchError(error => {
return of('No data');
})
);

View File

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

View File

@ -1,40 +0,0 @@
import { Injectable } from '@angular/core';
import { MatSnackBar, MatSnackBarHorizontalPosition,
MatSnackBarVerticalPosition } from '@angular/material/snack-bar';
import { NotifierComponent } from './notifier/notifier.component';
@Injectable({
providedIn: 'root'
})
export class NotifierService {
constructor(public snackBar:MatSnackBar,
) { }
showNotification(displayMessage:string,
buttonText: string,
messageType: 'error' | 'success' | 'warning',
messageTypeStr : string = '') {
this.snackBar.openFromComponent(NotifierComponent, {
data: {
message: displayMessage,
buttonText: buttonText,
type : messageType,
typelbl : messageTypeStr
},
duration: 4000,
verticalPosition: 'top',
panelClass: [messageType],
});
this.playSound();
}
playSound() {
// console.log('Play sound called...');
let audio = new Audio();
audio.src = '../assets/notifier_1.mp3';
audio.load();
audio.play();
}
}

Binary file not shown.

View File

@ -1,42 +0,0 @@
.notifier {
margin-top: 10px;
font-family: 'Spartan' sans-serif;
justify-content: center;
text-align: center;
align-items: center;
vertical-align: center;
}
.notifier-type {
font-size: 30px;
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;
}
::ng-deep .mat-mdc-snack-bar-container.success {
--mdc-snackbar-container-color: whitesmoke;
background-color: whitesmoke;
color: black;
}
::ng-deep .mat-mdc-snack-bar-container.warning {
--mdc-snackbar-container-color: antiquewhite;
background-color: antiquewhite;
color: black;
}

View File

@ -1,16 +0,0 @@
<div class="notifier">
<div class="notifier-type">
{{ data.typelbl | titlecase }}
</div>
<div class="notifier-msg">
{{ data.message }}
</div>
<div >
<button mat-flat-button (click)="sbRef.dismiss()"
style="justify-content: center;
align-items: center;"
color="primary">
{{ data.buttonText }}
</button>
</div>
</div>

View File

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

View File

@ -1,21 +0,0 @@
import { Component, OnInit, Inject} from '@angular/core';
import { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';
@Component({
selector: 'app-notifier',
templateUrl: './notifier.component.html',
styleUrls: ['./notifier.component.css'],
})
export class NotifierComponent implements OnInit {
constructor(
public sbRef: MatSnackBarRef<NotifierComponent>,
@Inject(MAT_SNACK_BAR_DATA) public data: any
) {}
ngOnInit(): void {
}
}

View File

@ -5,82 +5,6 @@
.number{
font-family: 'Roboto Mono', monospace;
}
img.icon{
margin-bottom: -2px;
height: 18px;
}
.noOrderMsg {
font-family: 'Roboto Mono';
font-size: 20px;
font-weight: 700;
margin: 10px;
align-items: center;
text-align: center;
}
.newOrder {
font-family: 'Roboto Mono' !important;
}
.newOrderTitle1 {
font-size: 19px;
font-weight: 700;
height: 20px;
}
.newOrderTitle2 {
font-size: 16px;
font-weight: 400;
height: 18px;
}
.newOrdertbheader {
font-size: 14px;
font-weight: 700;
}
.newOrdertbdetail {
font-size: 14px;
font-weight: 400;
}
.lineTrashCan {
cursor: pointer;
}
.buttons-class {
font-family: 'Spartan', sans-serif;
background-color: #ff5722;
color: white;
font-weight: 500;
height: 30px !important;
width: 115px !important;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
margin: auto;
}
.button-cancel-class {
font-family: 'Spartan', sans-serif;
font-weight: 500;
height: 30px !important;
width: 100px !important;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
margin: auto;
}
.availableItems{
background: lightblue;
font-family: 'Roboto Mono';
font-size: 18px;
font-weight: 700;
text-align: left;
margin: 5px;
margin-bottom: -3px;
}

View File

@ -1,135 +1,41 @@
<div class="noOrderMsg"
*ngIf="order.address.length == 0">
{{ vE.orderNoOpenorder }}
<div align="center">
<p *ngIf="order.address.length == 0">No open order!</p>
</div>
<mat-card style="margin-top: 10px;" *ngIf="order.address.length" >
<div class="newOrder">
<mat-card class="text" *ngIf="order.address.length > 0">
<div align="center">
<mat-card-title>
<table style="width: 100%;"
cellspacing="0">
<tr class="newOrderTitle1">
<td width="50%">{{ vE.orderTotalTitle }}</td>
<td align="right"
width="50%">
<img class="icon" src="/assets/zec_rv.png"
>{{(total/price) | number: '1.08'}}
</td>
</tr>
<tr class="newOrderTitle2">
<td width="50%">
<img class="icon"
style="color: lightgray;
margin-bottom: -3px;"
src="/assets/zec_rv.png"
>1.0 &cong; {{ price | currency: getCurrency()}}
</td>
<td width="50%" align="right">
{{total | currency: getCurrency()}}
<table cellspacing="0" width="100%">
<tr>
<td>Order Total:</td>
<td align="right">
<p class="number">{{total | currency: getCurrency()}}</p>
<p class="number"><img class="icon" src="/assets/spartan-zec.png" width="15px" />{{(total/price) | number: '1.0-6'}}</p>
</td>
</tr>
</table>
</mat-card-title>
<table style="width: 100%;">
<thead style="width: 100%;">
<tr style="background: lightblue;">
<th class="newOrdertbheader"
style="text-align: left;"
width="50%">{{ vE.orderItemLbl }}
</th>
<th class="newOrdertbheader"
style="text-align: left;"
width="15%">{{ vE.orderQtyLbl }}.
</th>
<th class="newOrdertbheader"
style="text-align: right;"
width="30%">{{ vE.orderTotalLbl }}
</th>
<th></th>
</tr>
</thead>
<tbody>
<tr style="height: 30px;"
*ngFor="let item of oLines">
<td class="newOrdertbdetail"
style="text-align: left;"
width="50%">{{item.name}}
</td>
<td class="newOrdertbdetail"
style="text-align: left;"
width="15%">{{item.qty}}
</td>
<td class="newOrdertbdetail"
style="text-align: right;"
width="30%">{{item.qty * item.cost | number:'1.02' | currency: getCurrency() }}
</td>
<td class="lineTrashCan">
<a (click)='trashCanClicked(item,oLines)' >
<fa-icon [icon]="faTrashAlt"
style="color: lightslategrey;
font-size: 14px;
margin: auto;">
</fa-icon>
</a>
</td>
</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>
<table>
<tr>
<th>Qty.</th>
<th>Items</th>
</tr>
<tr *ngFor="let item of order.lines">
<td align="right">{{item.qty}}</td>
<td>{{item.name}}</td>
</tr>
</table>
</div>
<div class="container" style="margin: 2px;
height: 40px;
background: lightblue;
border-top: 2px solid lightgray;
border-bottom: 2px solid lightgray;
align-content: center;
justify-content: center;">
<!--
<mat-card-actions>
-->
<table style="margin-top: 4px;" cellspacing="0" width="100%">
<tr style="height: 30px;
margin-top: 10px">
<table cellspacing="0" width="100%">
<tr>
<td>
<button mat-raised-button
class="button-cancel-class"
(click)="cancelOrder()">
{{ vE.orderCancelBtn }}
</button>
<button mat-raised-button class="text" (click)="cancelOrder()">Cancel</button>
</td>
<td>
<button mat-raised-button
class="buttons-class"
(click)="invoice()">
<fa-icon [icon]="faInvoice" ></fa-icon> {{vE.orderInvoiceBtn}}</button>
</td>
<td align="right">
<button mat-raised-button
class="buttons-class"
(click)="checkout()">{{vE.orderCheckoutBtn}}
</button>
<!--
<td align="right">
<button mat-raised-button class="text" color="primary" (click)="checkout()">Checkout</button>
-->
</td>
</tr>
</table>
<!--
</mat-card-actions>
-->
</div>
</mat-card>

View File

@ -1,27 +1,13 @@
import { Component, OnInit } from '@angular/core';
import { MatDialog, MatDialogConfig} from '@angular/material/dialog';
import { Observable } from 'rxjs';
import { LineItem } from '../items/lineitem.model';
import { newLineItem } from '../items/newlineitem.model';
import { Order } from './order.model';
import { FullnodeService } from '../fullnode.service';
import { UserService } from '../user.service';
import { OrderService } from './order.service';
import { CancelComponent } from '../cancel/cancel.component';
import { CheckoutComponent} from '../checkout/checkout.component';
import { PromptInvoiceComponent } from '../prompt-invoice/prompt-invoice.component';
import { ReceiptQRComponent} from '../receipt-qr/receipt-qr.component';
import { faFileInvoiceDollar } from '@fortawesome/free-solid-svg-icons';
import { faTrash } from '@fortawesome/free-solid-svg-icons';
import { faTrashAlt } from '@fortawesome/free-solid-svg-icons';
import { faChevronRight } from '@fortawesome/free-solid-svg-icons';
import { faSignOut } from '@fortawesome/free-solid-svg-icons';
import { NotifierService } from '../notifier.service';
import { LanguageService } from '../language.service';
import { LanguageData } from '../language.model';
import {TipsComponent} from '../tips/tips.component';
@Component({
selector: 'app-order',
@ -30,13 +16,7 @@ import {TipsComponent} from '../tips/tips.component';
})
export class OrderComponent implements OnInit{
public oLines : newLineItem[] = [];
public myLines : LineItem[] = [];
faInvoice = faFileInvoiceDollar;
public order: Order = {
_id: '',
address: '',
session: '',
timestamp: '',
@ -45,13 +25,6 @@ export class OrderComponent implements OnInit{
price:0,
total:0,
totalZec: 0,
paid: false,
externalInvoice: '',
shortCode: '',
token: '',
taxAmount: 0,
vatAmount: 0,
tipAmount: 0,
lines: [
{
qty: 1,
@ -62,53 +35,15 @@ export class OrderComponent implements OnInit{
};
public price: number = 1;
public total: number = 0;
public tax: number = 0;
public vat: number = 0;
public tip: boolean = false;
public orderUpdate: Observable<Order>;
public priceUpdate: Observable<number>;
public totalUpdate: Observable<number>;
public taxUpdate: Observable<number>;
public vatUpdate: Observable<number>;
public tipUpdate: Observable<boolean>;
// ------------------------------------
//
faTrash = faTrash;
faTrashAlt = faTrashAlt;
faChevronRight = faChevronRight;
faSignOut = faSignOut;
// -------------------------------------
//
// Language Support
//
vE = {
orderNoOpenorder : '',
orderCancelOrder : '',
orderConfirmCancel : '',
orderRemoveItem : '',
orderConfirmRemove : '',
orderConfirmRemove1 : '',
orderCancelOk : '',
orderNotservClose : '',
orderNotservSuccess : '',
orderTotalTitle : '',
orderItemLbl : '',
orderQtyLbl : '',
orderTotalLbl : '',
orderCancelBtn : '',
orderInvoiceBtn : '',
orderCheckoutBtn : ''
}
//
// ------------------------------------------------------------
constructor(
private languageService : LanguageService,
public fullnodeService: FullnodeService,
public orderService: OrderService,
private dialog: MatDialog,
private notifierService: NotifierService )
{
private dialog: MatDialog
) {
this.priceUpdate = fullnodeService.priceUpdate;
this.priceUpdate.subscribe((price) => {
this.price = price;
@ -116,47 +51,14 @@ export class OrderComponent implements OnInit{
this.orderUpdate = orderService.orderUpdate;
this.orderUpdate.subscribe((order) => {
this.order = order;
this.oLines = [];
this.myLines = this.order.lines;
var nl = {} as newLineItem;
for ( let i = 0; i < this.myLines.length; i++ )
{
// console.log("Loop : " + i + " - name : " + this.myLines[i].name);
nl = this.fillLineData(i,this.myLines[i].name,
this.myLines[i].qty,
this.myLines[i].cost) ;
// console.log(">> line_id: " + nl.line_id +
// " name: " + nl.name +
// " qty: " + nl.qty +
// " cost: " + nl.cost + " <<"
// )
this.oLines.push(nl);
// this.oLines[i].cost = this.myLines[i].cost;
}
// ------------------------------------------------
});
this.totalUpdate = orderService.totalUpdate;
this.totalUpdate.subscribe((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() {
this.chgUILanguage();
}
cancelOrder() {
@ -164,105 +66,52 @@ export class OrderComponent implements OnInit{
dialogConfig.disableClose = true;
dialogConfig.autoFocus = true;
dialogConfig.data = {title: this.vE.orderCancelOrder,
msg: this.vE.orderConfirmCancel };
dialogConfig.data = {title: 'Cancel Order?', msg: 'Are you sure you want to cancel the order?'};
const dialogRef = this.dialog.open(CancelComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => {
if (val) {
//console.log('Canceling');
console.log('Canceling');
this.orderService.cancelOrder(this.order._id!).subscribe((response) => {
this.orderService.getOrder();
this.notifierService
.showNotification(this.vE.orderCancelOk,
this.vE.orderNotservClose,
'success',
this.vE.orderNotservSuccess);
});
});;
} else {
console.log('Returning to page');
}
//else {
//console.log('Returning to page');
//}
this.orderService.getOrder();
this.oLines = [];
});
}
checkout() {
const dialogConfig3 = new MatDialogConfig();
dialogConfig3.disableClose = true;
dialogConfig3.autoFocus = true;
dialogConfig3.data = {
amt: this.total,
flag: this.tip
};
const dialogRef3 = this.dialog.open(TipsComponent, dialogConfig3);
dialogRef3.afterClosed().subscribe((tipVal) => {
this.orderService.updateTip(tipVal).then((orderData) => {
this.orderService.getOrder().subscribe((oData) => {
var zec = this.total/this.price;
this.order.totalZec = parseFloat(zec.toFixed(8));
const dialogConfig = new MatDialogConfig();
dialogConfig.disableClose = true;
dialogConfig.autoFocus = true;
dialogConfig.data = {
totalZec: this.order.totalZec,
addr: this.order.address,
orderId: this.order._id
};
const dialogRef = this.dialog.open(CheckoutComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => {
if (val) {
const dialogConfig2 = new MatDialogConfig();
dialogConfig2.disableClose = true;
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() {
var zec = this.total/this.price;
this.order.totalZec = parseFloat(zec.toFixed(8));
this.order.totalZec = parseFloat(zec.toFixed(6));
const dialogConfig = new MatDialogConfig();
dialogConfig.disableClose = true;
dialogConfig.autoFocus = true;
dialogConfig.data = {
orderId: this.order._id,
orderToken: this.order.token
totalZec: this.order.totalZec,
addr: this.order.address,
orderId: this.order._id
};
//console.log ('order_id : ' + this.order._id);
const dialogRef = this.dialog.open(PromptInvoiceComponent, dialogConfig);
const dialogRef = this.dialog.open(CheckoutComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => {
if (val) {
this.orderService.closeOrder(false);
this.oLines = [];
const dialogConfig2 = new MatDialogConfig();
dialogConfig2.disableClose = true;
dialogConfig2.autoFocus = true;
dialogConfig2.data = {
order: this.order._id
};
console.log('Payment confirmed!');
this.orderService.closeOrder();
const dialogRef2 = this.dialog.open(ReceiptQRComponent, dialogConfig2);
dialogRef2.afterClosed().subscribe( val => {
if (val) {
console.log('Receipt closed.');
}
});
} else {
console.log('Returning to order');
}
@ -272,79 +121,4 @@ export class OrderComponent implements OnInit{
getCurrency(){
return this.order.currency.toUpperCase();
}
fillLineData(i: number,
iname: string,
iqty: number,
icost: number) : newLineItem {
const a = { line_id: i,
name: iname,
qty: iqty,
cost: icost } as newLineItem;
return a;
}
trashCanClicked(item : newLineItem, lines: newLineItem[]) {
const dialogConfig = new MatDialogConfig();
dialogConfig.disableClose = true;
dialogConfig.autoFocus = true;
dialogConfig.data = {title: this.vE.orderRemoveItem,
msg: this.vE.orderConfirmRemove +
item.name + ' x ' + item.qty +
this.vE.orderConfirmRemove1 };
const dialogRef = this.dialog.open(CancelComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => {
if (val) {
// console.log('Deleting item at line: '
// + (item.line_id +1)
// + " => (" + item.name +")");
this.orderService.updateOrder(item.line_id,lines);
this.orderService.getOrder();
if ( this.order.lines.length == 0 ) {
this.orderService.cancelOrder(this.order._id!)
.subscribe((response) => {
this.orderService.getOrder();
});
}
} else {
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';
export interface Order {
_id?: string|null,
_id?: string,
address: string,
session: string,
timestamp?: string,
@ -10,12 +10,5 @@ export interface Order {
price?: number,
total: number,
totalZec: number,
lines: LineItem[],
paid: boolean,
externalInvoice: string,
shortCode: string,
token: string,
taxAmount: number,
vatAmount: number,
tipAmount: number
lines: LineItem[]
}

View File

@ -1,28 +1,24 @@
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 { Order } from './order.model';
import { UserService } from '../user.service';
import { FullnodeService } from '../fullnode.service';
import { User } from '../user.model';
import { Owner } from '../owner.model';
import { LineItem } from '../items/lineitem.model';
import { newLineItem } from '../items/newlineitem.model';
import { ConfigData } from '../configdata';
var Buffer = require('buffer/').Buffer;
import { LineItem} from '../items/lineitem.model';
@Injectable({providedIn: 'root'})
export class OrderService {
beUrl = ConfigData.Be_URL;
beUrl = 'http://localhost:3000/';
private dataStore: {allOrders: Order[], user: User, order: Order, owner: Owner } = {
allOrders: [],
user:{
address: '',
session: '',
blocktime: 0,
expired: false,
pin: '',
validated: false
},
@ -35,14 +31,18 @@ export class OrderService {
taxValue: 0,
vat: false,
vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false,
zats: false,
invoices: false,
expiration: new Date(Date.now()).toISOString(),
payconf: false,
crmToken: '',
viewkey: '',
tips: false
website: '',
country: '',
zats: false
},
order: {
address: '',
@ -53,13 +53,6 @@ export class OrderService {
price: 0,
total: 0,
totalZec: 0,
paid: false,
externalInvoice: '',
shortCode: '',
token: '',
taxAmount: 0,
vatAmount: 0,
tipAmount: 0,
lines: [
{
qty: 1,
@ -75,56 +68,42 @@ export class OrderService {
public readonly totalUpdate: Observable<number> = this._totalUpdated.asObservable();
private _allOrdersUpdated: BehaviorSubject<Order[]> = new BehaviorSubject(this.dataStore.allOrders);
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 ownerUpdate: Observable<Owner>;
private apiKey = 'YourApiKey';
private reqHeaders: HttpHeaders;
private reqParams: HttpParams;
private session: null|string;
constructor(
private http: HttpClient,
public fullnodeService: FullnodeService,
public userService: UserService
) {
var auth = 'Basic ' + Buffer.from(ConfigData.UsrPwd).toString('base64');
this.session = localStorage.getItem('s4z_token');
this.reqHeaders = new HttpHeaders().set('Authorization', auth);
this.reqParams = new HttpParams().append('session', this.session!);
this.reqHeaders = new HttpHeaders().set('Authorization', this.apiKey);
this.userUpdate = userService.userUpdate;
this.ownerUpdate = userService.ownerUpdate;
this.userUpdate.subscribe((user) => {
this.dataStore.user = user;
//console.log('OS: const', user);
this.getOrder();
});
this.ownerUpdate.subscribe((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() {
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) => {
if (OrderDataResponse.status == 200) {
this.dataStore.order = OrderDataResponse.body!.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);
} else {
console.log('No order found');
@ -136,7 +115,7 @@ export class OrderService {
getAllOrders(){
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'});
obs.subscribe((OrdersData) => {
if (OrdersData.status == 200 ){
@ -153,8 +132,7 @@ export class OrderService {
addToOrder(lineItem: LineItem) {
if(this.dataStore.order._id != null) {
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<{message: string}>(this.beUrl+'api/lineitem', { order_id: this.dataStore.order._id, line: lineItem }, { headers: this.reqHeaders });
obs.subscribe((orderData) => {
this.getOrder();
});
@ -165,34 +143,28 @@ export class OrderService {
createOrder(lineItem: LineItem) {
var order:Order = {
_id: '',
address: this.dataStore.user.address,
session: this.dataStore.user.session,
currency: this.dataStore.owner.currency,
timestamp: new Date(Date.now()).toISOString(),
closed: false,
totalZec: 0,
price: 0,
total: 0,
paid: false,
externalInvoice: '',
shortCode: '',
token: '',
taxAmount: 0,
vatAmount: 0,
tipAmount: 0,
lines: [lineItem]
lines: []
};
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', {order: order}, { headers: this.reqHeaders });
obs.subscribe((orderData) => {
this.getOrder()
console.log('Create order', orderData);
this.dataStore.order = orderData.order;
this._orderUpdated.next(Object.assign({}, this.dataStore).order);
this.addToOrder(lineItem);
});
return obs;
}
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) => {
console.log('Order deleted');
@ -206,13 +178,6 @@ export class OrderService {
total: 0,
totalZec: 0,
price: 0,
paid: false,
externalInvoice: '',
shortCode: '',
token: '',
taxAmount: 0,
vatAmount: 0,
tipAmount: 0,
lines: [
{
qty: 1,
@ -227,22 +192,14 @@ export class OrderService {
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(){
this.fullnodeService.priceUpdate.subscribe((price) => {
this.dataStore.order.price = price;
});
this.dataStore.order.closed = true;
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<{message: string, order: Order}>(this.beUrl+'api/order', {order: this.dataStore.order}, { headers: this.reqHeaders });
obs.subscribe((orderData) => {
//console.log('Closed order', orderData);
console.log('Closed order', orderData);
this.dataStore.order = {
address: '',
session: '',
@ -252,13 +209,6 @@ export class OrderService {
price: 0,
total: 0,
totalZec: 0,
paid: false,
externalInvoice: '',
shortCode: '',
token: '',
taxAmount: 0,
vatAmount: 0,
tipAmount: 0,
lines: [
{
qty: 1,
@ -272,34 +222,4 @@ export class OrderService {
return obs;
}
updateOrder(itemid: number, iLines : newLineItem[]) {
if(this.dataStore.order._id != null) {
var item = {} as LineItem;
this.dataStore.order.lines = [];
for ( let i = 0; i < iLines.length; i++)
{
if ( i !== itemid )
{
item = this.fillItemData(iLines[i].name, iLines[i].qty, iLines[i].cost);
// console.log("Push => ", item);
this.dataStore.order.lines.push(item);
}
}
let obs = this.http.post(this.beUrl+'api/order', { payload: this.dataStore.order }, { headers: this.reqHeaders });
obs.subscribe((orderData) => {
this.getOrder();
});
}
}
fillItemData(iname:string, iqty: number, icost: number) : LineItem {
const a = { name: iname,
qty: iqty,
cost: icost } as LineItem;
return a;
}
}

View File

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

View File

@ -1,111 +0,0 @@
.invoice {
font-family: Roboto Mono !important;
}
.zecSign {
margin-bottom: -4px;
font-size: 18px;
height: 18px;
}
.invoiceHeader {
display: flex;
font-family: Spartan;
font-weight: 700;
font-size: 26px;
color: white;
justify-content: space-between;
line-height: 40px;
padding: 10px;
vertical-align: center;
max-width: 600px;
background: #ff5722;
}
.invoiceDetail {
font-family: Roboto Mono !important;
padding: 10px;
max-width: 600px;
}
.invoiceHdrTxt1 {
font-family: Spartan !important;
text-align: center;
font-size: 30px;
font-weight: 700;
}
.invoiceHdrTxt2 {
font-family: Spartan !important;
text-align: center;
font-size: 16px;
font-weight: 400;
}
.invoiceHdrTxt3 {
font-family: Spartan !important;
text-align: center;
font-size: 12px;
font-weight: 300;
}
.detailTitle1 {
border-top: solid 2px;
border-bottom: solid 2px;
border-color: navy;
text-align: left;
}
.detailTitle2 {
border-top: solid 2px;
border-bottom: solid 2px;
border-color: navy;
text-align: right;
}
.detailLineRight {
border-top: solid 2px;
border-bottom: solid 2px;
border-color: navy;
text-align: right;
}
.detailLineLeft {
border-top: solid 2px;
border-bottom: solid 2px;
border-color: navy;
text-align: right;
}
.invoice-title {
font-size: 16px;
font-weight: 700;
background: lightcyan;
line-height: 30px;
padding: 5px;
}
.invoice-detail {
line-height: 20px;
font-size: 16px;
font-weight: 400;
padding-top: 4px;
padding-bottom: 4px;
}
.invoice-total {
margin-top: 40px;
}
.qrcode {
display: flex;
float: right;
}
.zecData {
width: auto;
font-family: Spartan !important;
font-size: 16px;
font-weight: 700;
text-align: right;
}

View File

@ -1,256 +0,0 @@
<div style="font-family: 'Spartan';
display: flex;
justify-content: center;
align-items: center;">
<div class="container">
<div class="invoiceHeader">
<img class="logo" src="/assets/logo-new-white.png" height="40px" />
</div>
<div *ngIf="reportType==1">
<div style="height: 50px;">
</div>
<div style="font-weight: 700;
font-size: 25px;
text-align: center;">
{{ vE.pmtserviceInvalidOwnerid }}
</div>
<div style="height: 40px;">
</div>
{{ vE.pmtservicePaymentNotprocessed }}
<div style="height: 20px;">
</div>
</div>
<div *ngIf="reportType==2">
<div style="height: 50px;">
</div>
<div style="font-weight: 700;
fonT-size: 25px;
text-align: center;">
{{ vE.pmtservicePmtsrvNot }}<br>
{{ vE.pmtserviceEnabledFor }}<br>
{{ shop }}
</div>
<div style="height: 40px;">
</div>
{{ vE.pmtservicePaymentNotprocessed }}
<div style="height: 20px;">
</div>
</div>
<div *ngIf="reportType==3">
<div style="height: 50px;">
</div>
<div style="font-weight: 700;
font-size: 25px;
text-align: center;">
{{ vE.pmtserviceConnectoXero }}<br>
{{ vE.pmtserviceServerFailed }}
</div>
<div style="height: 40px;">
</div>
{{ vE.pmtservicePaymentNotprocessed }}
<div style="height: 20px;">
</div>
</div>
<div *ngIf="reportType==4">
<div style="height: 50px;">
</div>
<div style="font-weight: 700;
font-size: 25px;
text-align: center;">
{{ vE.pmtserviceInvoiceNum }}<br>{{ pmtData.invoice }}<br>{{ vE.pmtserviceInvoiceNotfound }}
</div>
<div style="height: 40px;">
</div>
{{ vE.pmtservicePaymentNotprocessed }}
<div style="height: 20px;">
</div>
</div>
<div *ngIf="reportType==5">
<div style="height: 50px;">
</div>
<div style="font-weight: 700;
font-size: 25px;
text-align: center;">
{{ vE.pmtserviceInvoiceNum }}<br>{{ pmtData.invoice }}<br>{{ vE.pmtserviceInvoiceInvalid }}
</div>
<div style="height: 40px;">
</div>
{{ vE.pmtservicePaymentNotprocessed }}
<div style="height: 20px;">
</div>
</div>
<div *ngIf="reportType==6">
<div style="height: 50px;">
</div>
<div style="font-weight: 700;
font-size: 25px;
text-align: center;">
{{ vE.pmtserviceInvoiceNum }}<br>{{ pmtData.invoice }}<br>{{ vE.pmtserviceInvoicePaid }}
</div>
<div style="height: 40px;">
</div>
{{ vE.pmtservicePaymentNotprocessed }}
<div style="height: 20px;">
</div>
</div>
<div *ngIf="reportType==7">
<div style="height: 50px;">
</div>
<div style="font-weight: 700;
font-size: 25px;
text-align: center;">
{{ vE.pmtserviceInvoiceCurrency }}<br>[ {{ pmtData.currency }} ]<br>{{ vE.pmtserviceCurrencyNotsup }}
</div>
<div style="height: 40px;">
</div>
{{ vE.pmtservicePaymentNotprocessed }}
<div style="height: 20px;">
</div>
</div>
<div *ngIf="reportType==8">
<div style="height: 50px;">
</div>
<div style="font-weight: 700;
font-size: 25px;
text-align: center;">
{{ vE.pmtserviceAmountDoesnot }}<br>
{{ vE.pmtserviceMatchValue }}<br>
{{ vE.pmtserviceReportedByxero }}
</div>
<div style="height: 40px;">
</div>
{{ vE.pmtservicePaymentNotprocessed }}
<div style="height: 20px;">
</div>
</div>
<div class="invoiceDetail"
*ngIf="reportType==0"
>
<div class="invoiceHdrTxt1">{{ vE.pmtserviceHdrTxt1 }}</div>
<div class="invoiceHdrTxt2">{{ vE.pmtserviceHdrTxt2 }}{{orderId}}</div>
<div class="invoiceHdrTxt3">{{ vE.pmtserviceHdrTxt3 }}{{order.timestamp | date}}
</div>
<div style="height: 10px;"></div>
<div class="zecData">{{ vE.pmtserviceZecdataPrice }}{{order.price | number: '1.02' | currency: order.currency.toUpperCase()}}</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>
<div>
<div style="height: 10px;"></div>
<table style="width: 100%;"
cellspacing="0">
<tr class="invoice-title">
<th width="55%"
class="detailTitle1">
{{ vE.pmtserviceInvoiceItem }}
</th>
<th width="15%"
class="detailTitle1">
{{ vE.pmtserviceInvoiceQty }}
</th>
<th width="30%"
class="detailTitle2">
{{ vE.pmtserviceInvoicePrice }} ({{order.currency.toUpperCase()}})
</th>
</tr>
<tr class="invoice-detail"
*ngFor="let item of order.lines">
<td width="55%"
align="left">
{{item.name}}
</td>
<td width="15%"
align="center">
{{item.qty}}
</td>
<td width="30%"
align="right">
{{( item.qty * item.cost ) | number : '1.02' | currency: order.currency.toUpperCase()}}
</td>
</tr>
<tr class="invoice-title">
<th width="55%"
class="detailLineRight">
{{ vE.pmtserviceInvoiceTotal }}
</th>
<th width="15%"
class="detailLineLeft">
</th>
<th width="30%"
class="detailLineRight">
{{ order.total | currency: order.currency.toUpperCase()}}
</th>
</tr>
</table>
<div style="height: 15px;"></div>
<table>
<tr>
<td width="75%"
style="font-size: 20px;
font-weight: 700;
font-style: italic;
text-align: center;">
<p *ngIf="order.paid">
<fa-icon [icon]="faCheck"
color="primary"></fa-icon>&nbsp;{{ vE.pmtservicePaymentConfirmed }}</p>
<p *ngIf="!order.paid">
<fa-icon [style]="getIconStyle(order)"
[icon]="faHourglass"></fa-icon>&nbsp;{{ vE.pmtservicePaymentPending }}</p>
</td>
<td width="25%">
<div style="text-align: right;"
id="invoice-qr"
*ngIf="!order.paid"></div>
</td>
</tr>
</table>
<div style="height: 15px;"></div>
<div width="100%"
style="font-size: 14px;
font-weight: 700;
font-style: italic;
text-align: center;">
{{ vE.pmtserviceScanQrcode }}
</div>
<div style="text-align: center;
margin-top: 10px;
line-height: 30px;">
<div style="font-family: 'Spartan';
font-size: 14px;
line-height: 20px;">
{{ vE.pmtserviceCantScan }}<br>{{ vE.pmtserviceUseThis }}<a [href]="zcashUrl">{{ vE.pmtserviceWalletLink }}</a>, or
</div>
<div style="display: flex;
justify-content: space-between;">
<button style="margin-top: 20px;
font-weight: 700;
background-color: lightgray;"
mat-raised-button
(click)="copyAddress()">{{ vE.pmtserviceCopyAddress }}</button>
<button style="margin-top: 20px;
font-weight: 700;
background-color: lightgray;"
mat-raised-button
(click)="copyAmount()">{{ vE.pmtserviceCopyAmount }}</button>
</div>
<button style="margin-top: 20px;
font-weight: 700;
background-color: lightgray;"
mat-raised-button
(click)="copyMemo()">{{ vE.pmtserviceCopyMemo }}</button>
</div>
</div>
</div>
</div>
</div>

View File

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

View File

@ -1,321 +0,0 @@
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute} from "@angular/router";
import { HttpClient, HttpParams, HttpHeaders } from "@angular/common/http";
import { DomSanitizer, SafeUrl } from '@angular/platform-browser';
import { PmtData } from "./pmtservice.model";
import { XeroInvoice } from "./xeroinvoice.model";
import { Order } from '../order/order.model'
import { ConfigData } from '../configdata';
import { faCheck, faHourglass } from '@fortawesome/free-solid-svg-icons';
import { NotifierService } from '../notifier.service';
var QRCode = require('easyqrcodejs');
var URLSafeBase64 = require('urlsafe-base64');
var Buffer = require('buffer/').Buffer;
import { LanguageService } from '../language.service';
@Component({
selector: 'app-pmtservice',
templateUrl: './pmtservice.component.html',
styleUrls: ['./pmtservice.component.css']
})
export class PmtserviceComponent implements OnInit {
faCheck = faCheck;
faHourglass = faHourglass;
beUrl = ConfigData.Be_URL;
private reqHeaders: HttpHeaders = new HttpHeaders();
public shop: string = '';
public pmtData : PmtData = {
ownerId :'',
invoice: '',
amount: 0,
currency: '',
shortcode: ''
};
public invData : XeroInvoice = {
inv_Type : '',
inv_Id : '',
inv_No : '',
inv_Contact : '',
inv_Currency : '',
inv_CurrencyRate : 0,
inv_Status : '',
inv_Total : 0,
inv_Date : new Date(),
inv_shortCode : '',
inv_ProcDate : new Date()
};
public order: Order = {
_id : '',
address: '',
session: '',
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 = '';
private invData_buff : any = null;
public reportType = 0;
public Status = 0;
codeString: string = 'ZGo - The Zcash Register';
zcashUrl: SafeUrl = '';
zPrice: number = 1.0;
name: string = '';
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() {
}
getInvoiceData( reqData : PmtData ) {
//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....')
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)))}`;
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);
} else {
this.reportType = invoiceData.body!.reportType;
console.log('reportType ' + invoiceData.body!.reportType + ' code ' + invoiceData.status);
}
});
}
getIconStyle(order : Order) {
if( order.paid )
return "font-size: 14px; color: #72cc50; margin-bottom: -2px;";
return "color: #FB4F14; margin-bottom: -2px; cursor: pointer;";
}
copyAddress() {
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(this.order.address);
} catch (err) {
this.notifierService
.showNotification(this.vE.pmtserviceCopyaddressError,
this.vE.pmtserviceNotservClose,
"error",
this.vE.pmtserviceNotservError);
// console.error("Error", err);
}
}
copyAmount() {
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(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); }
);
}
}

View File

@ -1,7 +0,0 @@
export interface PmtData {
ownerId: string;
invoice: string;
amount: number;
currency: string;
shortcode: string;
}

View File

@ -1,7 +0,0 @@
http://localhost:4200/pmtservice?ownerid=62cca13f5530331e2a97c78e&invoiceNo=INV-0034&currency=USD&amount=753.95&shortCode=!w8T62
https://test.zgo.cash/api/invdata?address=zs17faa6l5ma55s55exq9rnr32tu0wl8nmqg7xp3e6tz0m5ajn2a6yxlc09t03mqdmvyphavvf3sl8&inv=INV-0034
https://www.paymentservice.com/?invoiceNo=[INVOICENUMBER]&currency=[CURRENCY]&amount=[AMOUNTDUE]&shortCode=[SHORTCODE]
https://app.zgo.cash/invoice/

View File

@ -1,13 +0,0 @@
export interface XeroInvoice {
inv_Type : string;
inv_Id : string;
inv_No : string;
inv_Contact : string;
inv_Currency : string;
inv_CurrencyRate : number;
inv_Total : number;
inv_Status : string;
inv_Date : Date;
inv_shortCode : string;
inv_ProcDate : Date;
}

View File

@ -1,54 +0,0 @@
::ng-deep .mdc-button__label {
font-family: "Spartan" sans-serif;
font-size: 14px;
font-weight: 600;
}
::ng-deep .invoice {
font-family: "Spartan";
background: #ff5722;
font-weight: 700;
font-size: 18px;
text-align: center;
color: white;
line-height: 20px;
padding: 10px;
}
::ng-deep .invoice-content {
font-family: Roboto mono;
display: flex;
justify-content: center;
font-size: 16px;
}
.copy-button {
color: dodgerblue;
font-size: 20px;
margin: auto;
}
.urlLabel {
font-family: "Spartan";
font-size: 14px;
color: dimgray;
}
.urlDetail {
font-family: "Spartan";
font-size: 14px;
color: black;
}
.urlCopyBtn {
cursor: pointer;
}
.qr-code{
border-radius: 0.5rem;
border-bottom-left-radius: 0.5rem;
border-bottom-right-radius: 0.5rem;
}

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