Compare commits

...

49 commits

Author SHA1 Message Date
299cae0c80 Satoshi display fixed in Items List Display 2023-08-04 20:11:28 -05:00
4f498c4c49
Merge branch 'fix55' 2023-06-26 15:03:21 -05:00
d5a78dd9b6
Release preparation 2023-06-26 15:02:45 -05:00
e671967ba8
Correct wallet link for invoices 2023-06-26 14:54:52 -05:00
e33e0a7f36
Merge branch 'security1' 2023-06-26 12:42:03 -05:00
84c31bc824
Fix QR code generation for Xero invoice 2023-06-22 16:40:36 -05:00
a05b76ebed
New logic for language API call for pmtservice 2023-06-21 16:00:43 -05:00
2cd9ded783
Correct datatype of invoice amount 2023-06-21 15:42:34 -05:00
9a501e9665
Remove order-creation logic from component 2023-06-21 15:21:37 -05:00
cb8df58cfc
Update to next version 2023-06-21 15:19:27 -05:00
9f7a10bcd3
Correct authentication for xero 2023-06-20 14:11:40 -05:00
c9bf50170d
Enhance viewing key saving 2023-06-20 14:11:18 -05:00
92865a6ee3
Correct language in invoice and receipt 2023-06-20 14:10:44 -05:00
2cd0ee76c0
Correct title 2023-06-20 14:10:10 -05:00
b88a8f4a86
Updates due to API version 1.6.0 2023-06-19 10:30:41 -05:00
3535e1b43f
Merge branch 'hotfix-a1' 2023-05-15 09:56:27 -05:00
d284a736f6
Services correction for new owner data structure 2023-05-15 09:48:57 -05:00
2c04145a43
Fix business stepper logic 2023-05-12 10:27:23 -05:00
54eff47d3e
Fix sign-up stepper 2023-05-12 09:27:34 -05:00
28012ee2a9
Modify services to use new API endpoints 2023-05-12 09:02:45 -05:00
8628f79043
Remove logging 2023-05-10 14:49:01 -05:00
45ad8d8e6a
Add session parameter to woocommerce service 2023-05-10 14:46:33 -05:00
313b68b6c6
Remove logging 2023-05-10 11:21:24 -05:00
1f2510f522
Correct calls to xero endpoint 2023-05-10 11:05:15 -05:00
e0e8c60af4
Upgrade dependencies 2023-05-09 13:38:48 -05:00
31cd5b9865
Upgrade Material 2023-05-09 13:14:08 -05:00
dfec2fee3c
Upgrade to Angular 16 2023-05-09 11:53:19 -05:00
1e0286fd74
Update owner structure 2023-05-09 11:16:09 -05:00
d2f963fbfc
Remove logging 2023-05-08 14:10:46 -05:00
c99908807f
Enhance item service for new API 2023-05-08 13:45:14 -05:00
3810900036
Enhance order service for new API 2023-05-08 13:33:49 -05:00
96eb3eb7f6
Enhance node-resolver for new API 2023-05-08 12:10:33 -05:00
624fbf27e8
Enhance receipt service for new API 2023-05-08 12:10:13 -05:00
040fc22e69
Enhance auth-guard service for new API 2023-05-08 12:02:31 -05:00
a0291fb05e
Enhance fullnode service for new API 2023-05-08 12:02:03 -05:00
3479c0c206
Update language API calls 2023-05-08 11:50:11 -05:00
83bc383675
Enhance user API calls 2023-05-08 11:49:30 -05:00
fe6d27d4a6
Merge branch 'sessionpay' 2023-05-02 18:01:16 -05:00
225a4ae881
Release prep 2023-05-02 18:00:18 -05:00
df8244f882
Update changelog 2023-05-02 09:14:37 -05:00
53ba8bdce2
Add dialog to purchase sessions 2023-05-02 09:08:42 -05:00
ae4396f6b4
Starting enhancement for buying sessions early 2023-04-29 09:21:40 -05:00
e3e0b1c48f
Merge branch 'dev' 2023-03-16 11:02:35 -05:00
2070a35301
Version update 2023-03-16 11:01:40 -05:00
5642788681
Merge branch 'zgointl' into dev 2023-03-16 10:54:26 -05:00
cc0a0171ff
Add invoice number to copy memo button 2023-03-15 16:52:57 -05:00
a8bcffa049
Merge branch 'dev' of zgo.cash:zgo into dev 2023-03-15 16:42:09 -05:00
4b4a630304
Fix QR code for Xero invoice payment 2023-03-15 16:40:32 -05:00
67032ec81c
Fix QR code for Xero invoice payment 2023-03-15 16:27:35 -05:00
52 changed files with 4665 additions and 12627 deletions

View file

@ -3,6 +3,65 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [2.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 ## [2.0.0-beta] - 2023-02-23
### Added ### Added
@ -12,7 +71,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
### Changed ### Changed
- Parametrization of text elements - Parametrization of text elements
- Expanded Xero reference message to include ZEC amount
## [1.4.1] - 2023-01-09 ## [1.4.1] - 2023-01-09

View file

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

14857
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
{ {
"name": "zgo", "name": "zgo",
"version": "2.0.0-beta", "version": "2.3.1",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
"start": "ng serve", "start": "ng serve",
@ -10,23 +10,22 @@
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
"@angular-material-components/datetime-picker": "^9.0.0", "@angular/animations": "^16.0.0",
"@angular/animations": "^15.1.2", "@angular/cdk": "^16.0.0",
"@angular/cdk": "^15.1.2", "@angular/common": "^16.0.0",
"@angular/common": "^15.1.2", "@angular/compiler": "^16.0.0",
"@angular/compiler": "^15.1.2", "@angular/core": "^16.0.0",
"@angular/core": "^15.1.2", "@angular/forms": "^16.0.0",
"@angular/forms": "^15.1.2", "@angular/material": "^16.0.0",
"@angular/material": "^15.1.2", "@angular/platform-browser": "^16.0.0",
"@angular/platform-browser": "^15.1.2", "@angular/platform-browser-dynamic": "^16.0.0",
"@angular/platform-browser-dynamic": "^15.1.2", "@angular/router": "^16.0.0",
"@angular/router": "^15.1.2", "@fortawesome/angular-fontawesome": "^0.13.0",
"@fortawesome/angular-fontawesome": "^0.12.1", "@fortawesome/fontawesome-free": "^6.4.0",
"@fortawesome/fontawesome-free": "^6.2.1", "@fortawesome/fontawesome-svg-core": "^6.4.0",
"@fortawesome/fontawesome-svg-core": "^6.2.1", "@fortawesome/free-brands-svg-icons": "^6.4.0",
"@fortawesome/free-brands-svg-icons": "^6.2.1", "@fortawesome/free-regular-svg-icons": "^6.4.0",
"@fortawesome/free-regular-svg-icons": "^6.2.1", "@fortawesome/free-solid-svg-icons": "^6.4.0",
"@fortawesome/free-solid-svg-icons": "^6.2.1",
"@supercharge/request-ip": "^1.2.0", "@supercharge/request-ip": "^1.2.0",
"angular-local-storage": "^0.7.1", "angular-local-storage": "^0.7.1",
"angular-material-datepicker": "^1.0.2", "angular-material-datepicker": "^1.0.2",
@ -39,23 +38,23 @@
"tslib": "^2.5.0", "tslib": "^2.5.0",
"urlsafe-base64": "^1.0.0", "urlsafe-base64": "^1.0.0",
"uuid": "^9.0.0", "uuid": "^9.0.0",
"zone.js": "~0.12.0" "zone.js": "~0.13.0"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/build-angular": "^15.1.3", "@angular-devkit/build-angular": "^16.0.0",
"@angular/cli": "^15.1.3", "@angular/cli": "^16.0.0",
"@angular/compiler-cli": "^15.1.2", "@angular/compiler-cli": "^16.0.0",
"@types/jasmine": "~4.3.1", "@types/jasmine": "~4.3.1",
"@types/node": "^18.11.18", "@types/node": "^18.16.6",
"@types/request": "^2.48.8", "@types/request": "^2.48.8",
"@types/urlsafe-base64": "^1.0.28", "@types/urlsafe-base64": "^1.0.28",
"@types/uuid": "^9.0.0", "@types/uuid": "^9.0.1",
"jasmine-core": "~4.5.0", "jasmine-core": "~4.5.0",
"karma": "~6.4.1", "karma": "~6.4.2",
"karma-chrome-launcher": "~3.1.1", "karma-chrome-launcher": "~3.1.1",
"karma-coverage": "~2.2.0", "karma-coverage": "~2.2.0",
"karma-jasmine": "~5.1.0", "karma-jasmine": "~5.1.0",
"karma-jasmine-html-reporter": "~2.0.0", "karma-jasmine-html-reporter": "~2.0.0",
"typescript": "~4.9.4" "typescript": "~4.9.5"
} }
} }

View file

@ -45,7 +45,7 @@
style="margin-top: 10px; style="margin-top: 10px;
margin-bottom: 20px;"> margin-bottom: 20px;">
<div >&copy; 2023 Vergara Technologies LLC</div> <div >&copy; 2023 Vergara Technologies LLC</div>
<div class="tiny">Version 2.0.0-beta</div> <div class="tiny">Version 2.3.1</div>
<div class="tiny">{{ vE.mainPriceData }}</div> <div class="tiny">{{ vE.mainPriceData }}</div>
</div> </div>
<div></div> <div></div>

View file

@ -1,8 +1,6 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { LanguageService } from './language.service'; import { LanguageService } from './language.service';
import { LanguageData } from './language.model';
//import { Post} from './posts/post.model';
@Component({ @Component({
selector: 'app-root', selector: 'app-root',
@ -24,21 +22,21 @@ export class AppComponent {
} }
ngOnInit(){ ngOnInit(){
console.log('chgUILanguage() called on ngOnInit '); //console.log('chgUILanguage() called on ngOnInit ');
this.chgUILanguage(); this.chgUILanguage();
} }
chgUILanguage() { chgUILanguage() {
console.log('MAIN.chgUILanguage Called '); //console.log('MAIN.chgUILanguage Called ');
this.languageService.getViewElements('main').subscribe( this.languageService.getViewElements('main').subscribe({
response => { next: response => {
console.log('response >> ', response ); //console.log('response >> ', response );
console.log('main_price_data -> ',response.data.main_price_data); //console.log('main_price_data -> ',response.data.main_price_data);
this.vE.mainPriceData = response.data.main_price_data; this.vE.mainPriceData = response.data.main_price_data;
this.zgoLanguage = response.language; this.zgoLanguage = response.language;
}, },
error => { console.log('Error --> ',error); } error: error => { console.log('Error --> ',error); }
); });
} }
usFlagClicked() { usFlagClicked() {

View file

@ -51,6 +51,7 @@ import { NotifierComponent } from './notifier/notifier.component';
import { PmtserviceComponent } from './pmtservice/pmtservice.component'; import { PmtserviceComponent } from './pmtservice/pmtservice.component';
import { XeroRegComponent } from './xeroreg/xeroreg.component'; import { XeroRegComponent } from './xeroreg/xeroreg.component';
import { DbExportComponent } from './db-export/db-export.component'; import { DbExportComponent } from './db-export/db-export.component';
import { SessionpayComponent } from './sessionpay/sessionpay.component';
@NgModule({ @NgModule({
declarations: [ declarations: [
@ -81,6 +82,7 @@ import { DbExportComponent } from './db-export/db-export.component';
PmtserviceComponent, PmtserviceComponent,
XeroRegComponent, XeroRegComponent,
DbExportComponent, DbExportComponent,
SessionpayComponent,
], ],
imports: [ imports: [
BrowserModule, BrowserModule,

View file

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

View file

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

View file

@ -2,7 +2,7 @@
<div align="center"> <div align="center">
<mat-card class="centercard"> <mat-card class="centercard">
<h3>{{ vE.businessSignupTitle }}</h3> <h3>{{ vE.businessSignupTitle }}</h3>
<mat-vertical-stepper #stepper linear> <mat-vertical-stepper #stepper [linear]="true">
<mat-step label="{{ vE.businessBizInfo }}" editable="false"> <mat-step label="{{ vE.businessBizInfo }}" editable="false">
<p>{{ vE.businessAddrsNobiz }}</p> <p>{{ vE.businessAddrsNobiz }}</p>
<mat-card [formGroup]="bizForm"> <mat-card [formGroup]="bizForm">

View file

@ -15,7 +15,6 @@ import { ScanComponent } from '../scan/scan.component';
import { TermsComponent } from '../terms/terms.component'; import { TermsComponent } from '../terms/terms.component';
import { LanguageService } from '../language.service'; import { LanguageService } from '../language.service';
import { LanguageData } from '../language.model';
@Component({ @Component({
selector: 'app-business', selector: 'app-business',
@ -51,29 +50,19 @@ export class BusinessComponent implements OnInit {
countries: Country[] = []; countries: Country[] = [];
owner: Owner = { owner: Owner = {
address: '', address: '',
name: '',
currency: 'usd', currency: 'usd',
tax: false, tax: false,
taxValue: 0, taxValue: 0,
vat: false, vat: false,
vatValue: 0, vatValue: 0,
phone: '',
paid: false, paid: false,
first: '',
last: '',
name: '',
street: '',
city: '',
state: '',
postal: '',
country: '',
email: '',
website: '',
zats: false, zats: false,
invoices: false, invoices: false,
expiration: new Date(Date.now()).toISOString(), expiration: new Date(Date.now()).toISOString(),
payconf: false, payconf: false,
viewkey: '', crmToken: '',
crmToken: '' viewkey: ''
} }
public countriesUpdate: Observable<Country[]>; public countriesUpdate: Observable<Country[]>;
public ownerUpdate: Observable<Owner>; public ownerUpdate: Observable<Owner>;
@ -83,45 +72,59 @@ export class BusinessComponent implements OnInit {
sessionId = ''; sessionId = '';
ownerKnown = false; ownerKnown = false;
termsChecked = false; termsChecked = false;
ownerdata = {
first: '',
last: '',
phone: '',
name: '',
street: '',
city: '',
state: '',
postal: '',
country: '',
email: '',
website: '',
payconf: false
};
// ------------------------------------- // -------------------------------------
// //
// Language Support // Language Support
// //
vE = { vE = {
businessSignupTitle : '', businessSignupTitle : '',
businessBizInfo : '', businessBizInfo : '',
businessAddrsNobiz : '', businessAddrsNobiz : '',
businessBizNamelbl : '', businessBizNamelbl : '',
businessBizNameholder : '', businessBizNameholder : '',
businessContactFnamelbl : '', businessContactFnamelbl : '',
businessContactFnholder : '', businessContactFnholder : '',
businessContactLnamelbl : '', businessContactLnamelbl : '',
businessContactLnholder : '', businessContactLnholder : '',
businessBizAddresslbl : '', businessBizAddresslbl : '',
businessBizAddressholder : '', businessBizAddressholder : '',
businessBizCitylbl : '', businessBizCitylbl : '',
businessBizCityholder : '', businessBizCityholder : '',
businessBizStatelbl : '', businessBizStatelbl : '',
businessBizStateholder : '', businessBizStateholder : '',
businessBizPcodelbl : '', businessBizPcodelbl : '',
businessBizPcodeholder : '', businessBizPcodeholder : '',
businessBizCountrylbl : '', businessBizCountrylbl : '',
businessBizCountryholder : '', businessBizCountryholder : '',
businessBizMaillbl : '', businessBizMaillbl : '',
businessBizMailholder : '', businessBizMailholder : '',
businessBizWebsitelbl : '', businessBizWebsitelbl : '',
businessBizWebsiteholder : '', businessBizWebsiteholder : '',
businessAcceptTerms : '', businessAcceptTerms : '',
businessTermsOfuse : '', businessTermsOfuse : '',
businessSaveBtn : '', businessSaveBtn : '',
businessSessionLengthlbl : '', businessSessionLengthlbl : '',
businessSelectSession : '', businessSelectSession : '',
businessSessionLabel : '', businessSessionLabel : '',
businessSessionPaylbl : '', businessSessionPaylbl : '',
businessZGoConfirmlbl : '' businessZGoConfirmlbl : ''
}; };
// //
// //
constructor( constructor(
private languageService : LanguageService, private languageService : LanguageService,
@ -187,7 +190,7 @@ export class BusinessComponent implements OnInit {
} }
onChange(ob: MatSlideToggleChange){ onChange(ob: MatSlideToggleChange){
console.log(ob.checked); //console.log(ob.checked);
this.termsChecked = ob.checked; this.termsChecked = ob.checked;
} }
@ -196,25 +199,17 @@ export class BusinessComponent implements OnInit {
dialogConfig.disableClose = true; dialogConfig.disableClose = true;
dialogConfig.autoFocus = true; dialogConfig.autoFocus = true;
const dialogRef = this.dialog.open(TermsComponent, dialogConfig); this.dialog.open(TermsComponent, dialogConfig);
dialogRef.afterClosed().subscribe(val => { //dialogRef.afterClosed().subscribe(val => {
console.log('Terms read'); //console.log('Terms read');
}); //});
} }
save() { save() {
this.owner = { this.ownerdata = {
_id: '',
address: '',
currency: 'usd',
tax: false,
taxValue: 0,
vat: false,
vatValue: 0,
first: this.bizForm.get('first')!.value, first: this.bizForm.get('first')!.value,
last: this.bizForm.get('last')!.value, last: this.bizForm.get('last')!.value,
phone: '', phone: '',
paid: false,
name: this.bizForm.get('name')!.value, name: this.bizForm.get('name')!.value,
street: this.bizForm.get('street')!.value, street: this.bizForm.get('street')!.value,
city: this.bizForm.get('city')!.value, city: this.bizForm.get('city')!.value,
@ -223,14 +218,9 @@ export class BusinessComponent implements OnInit {
country: this.bizForm.get('country')!.value, country: this.bizForm.get('country')!.value,
email: this.bizForm.get('email')!.value, email: this.bizForm.get('email')!.value,
website: this.bizForm.get('website')!.value, website: this.bizForm.get('website')!.value,
zats: false, payconf: false
invoices: false,
expiration: new Date(Date.now()).toISOString(),
payconf: false,
viewkey: '',
crmToken: ''
}; };
this.userService.addOwner(this.owner); this.userService.addOwner(this.ownerdata);
this.stepper!.next(); this.stepper!.next();
} }
@ -248,7 +238,7 @@ export class BusinessComponent implements OnInit {
const dialogRef = this.dialog.open(ScanComponent, dialogConfig); const dialogRef = this.dialog.open(ScanComponent, dialogConfig);
dialogRef.afterClosed().subscribe(val => { dialogRef.afterClosed().subscribe(val => {
console.log('Awaiting payment'); //console.log('Awaiting payment');
if(val){ if(val){
this.stepper!.next(); this.stepper!.next();
} }
@ -266,46 +256,46 @@ export class BusinessComponent implements OnInit {
} }
chgUILanguage(){ chgUILanguage(){
console.log('BUSINESS.chgUILanguage Called '); //console.log('BUSINESS.chgUILanguage Called ');
this.languageService.getViewElements('business').subscribe( this.languageService.getViewElements('business').subscribe(
response => { response => {
console.log('Received >> ', response ); //console.log('Received >> ', response );
console.log('Language Code : ', response.language); //console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component); //console.log('Component Name : ',response.component);
console.log('Language data : ',response.data); //console.log('Language data : ',response.data);
this.vE.businessSignupTitle = response.data.business_signup_title; this.vE.businessSignupTitle = response.data.business_signup_title;
this.vE.businessBizInfo = response.data.business_biz_info; this.vE.businessBizInfo = response.data.business_biz_info;
this.vE.businessAddrsNobiz = response.data.business_addrs_nobiz; this.vE.businessAddrsNobiz = response.data.business_addrs_nobiz;
this.vE.businessBizNamelbl = response.data.business_biz_namelbl; this.vE.businessBizNamelbl = response.data.business_biz_namelbl;
this.vE.businessBizNameholder = response.data.business_biz_nameholder; this.vE.businessBizNameholder = response.data.business_biz_nameholder;
this.vE.businessContactFnamelbl = response.data.business_contact_fnamelbl; this.vE.businessContactFnamelbl = response.data.business_contact_fnamelbl;
this.vE.businessContactFnholder = response.data.business_contact_fnholder; this.vE.businessContactFnholder = response.data.business_contact_fnholder;
this.vE.businessContactLnamelbl = response.data.business_contact_lnamelbl; this.vE.businessContactLnamelbl = response.data.business_contact_lnamelbl;
this.vE.businessBizAddresslbl = response.data.business_biz_addresslbl; this.vE.businessBizAddresslbl = response.data.business_biz_addresslbl;
this.vE.businessBizAddressholder = response.data.business_biz_addressholder; this.vE.businessBizAddressholder = response.data.business_biz_addressholder;
this.vE.businessBizCitylbl = response.data.business_biz_citylbl; this.vE.businessBizCitylbl = response.data.business_biz_citylbl;
this.vE.businessBizCityholder = response.data.business_biz_cityholder; this.vE.businessBizCityholder = response.data.business_biz_cityholder;
this.vE.businessBizStatelbl = response.data.business_biz_statelbl; this.vE.businessBizStatelbl = response.data.business_biz_statelbl;
this.vE.businessBizStateholder = response.data.business_biz_stateholder; this.vE.businessBizStateholder = response.data.business_biz_stateholder;
this.vE.businessBizPcodelbl = response.data.business_biz_pcodelbl; this.vE.businessBizPcodelbl = response.data.business_biz_pcodelbl;
this.vE.businessBizPcodeholder = response.data.business_biz_pcodeholder; this.vE.businessBizPcodeholder = response.data.business_biz_pcodeholder;
this.vE.businessBizCitylbl = response.data.business_biz_citylbl; this.vE.businessBizCitylbl = response.data.business_biz_citylbl;
this.vE.businessBizCityholder = response.data.business_biz_cityholder; this.vE.businessBizCityholder = response.data.business_biz_cityholder;
this.vE.businessBizCountrylbl = response.data.business_biz_countrylbl; this.vE.businessBizCountrylbl = response.data.business_biz_countrylbl;
this.vE.businessBizCountryholder = response.data.business_biz_countryholder; this.vE.businessBizCountryholder = response.data.business_biz_countryholder;
this.vE.businessBizMaillbl = response.data.business_biz_maillbl; this.vE.businessBizMaillbl = response.data.business_biz_maillbl;
this.vE.businessBizMailholder = response.data.business_biz_mailholder; this.vE.businessBizMailholder = response.data.business_biz_mailholder;
this.vE.businessBizWebsitelbl = response.data.business_biz_websitelbl; this.vE.businessBizWebsitelbl = response.data.business_biz_websitelbl;
this.vE.businessBizWebsiteholder = response.data.business_biz_websiteholder; this.vE.businessBizWebsiteholder = response.data.business_biz_websiteholder;
this.vE.businessAcceptTerms = response.data.business_accept_terms; this.vE.businessAcceptTerms = response.data.business_accept_terms;
this.vE.businessTermsOfuse = response.data.business_terms_ofuse; this.vE.businessTermsOfuse = response.data.business_terms_ofuse;
this.vE.businessSaveBtn = response.data.business_save_btn; this.vE.businessSaveBtn = response.data.business_save_btn;
this.vE.businessSessionLengthlbl = response.data.business_session_lengthlbl; this.vE.businessSessionLengthlbl = response.data.business_session_lengthlbl;
this.vE.businessSelectSession = response.data.business_select_session; this.vE.businessSelectSession = response.data.business_select_session;
this.vE.businessSessionLabel = response.data.business_session_label; this.vE.businessSessionLabel = response.data.business_session_label;
this.vE.businessSessionPaylbl = response.data.business_session_paylbl; this.vE.businessSessionPaylbl = response.data.business_session_paylbl;
this.vE.businessZGoConfirmlbl = response.data.business_zgo_confirmlbl; this.vE.businessZGoConfirmlbl = response.data.business_zgo_confirmlbl;
}, },
error => { console.log('Error >> ',error); } error => { console.log('Error >> ',error); }

View file

@ -33,23 +33,13 @@ export class DbExportComponent implements OnInit {
taxValue: 0, taxValue: 0,
vat: false, vat: false,
vatValue: 0, vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false, paid: false,
website: '',
country: '',
zats: false, zats: false,
invoices: false, invoices: false,
expiration: new Date(Date.now()).toISOString(), expiration: new Date(Date.now()).toISOString(),
payconf: false, payconf: false,
viewkey: '', crmToken: '',
crmToken: '' viewkey: ''
}; };
_ordersOk = false; _ordersOk = false;

View file

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

View file

@ -4,12 +4,11 @@ import { FullnodeService } from '../fullnode.service';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { UserService } from '../user.service'; import { UserService } from '../user.service';
import { CancelComponent } from '../cancel/cancel.component'; import { CancelComponent } from '../cancel/cancel.component';
import { Subscription, Observable } from 'rxjs'; import { Observable } from 'rxjs';
import {Owner} from '../owner.model'; import {Owner} from '../owner.model';
import { LanguageService } from '../language.service'; import { LanguageService } from '../language.service';
import { LanguageData } from '../language.model';
@Component({ @Component({
selector: 'app-header', selector: 'app-header',
@ -29,25 +28,14 @@ export class HeaderComponent implements OnInit, OnDestroy {
taxValue: 0, taxValue: 0,
vat: false, vat: false,
vatValue: 0, vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false, paid: false,
website: '',
country: '',
zats: false, zats: false,
invoices: false, invoices: false,
expiration: new Date(Date.now()).toISOString(), expiration: new Date(Date.now()).toISOString(),
payconf: false, payconf: false,
viewkey: '', crmToken: '',
crmToken: '' viewkey: ''
}; };
private session: string | null = '';
public heightUpdate: Observable<number>; public heightUpdate: Observable<number>;
public ownerUpdate: Observable<Owner>; public ownerUpdate: Observable<Owner>;
public uZaddrUpdate: Observable<string>; public uZaddrUpdate: Observable<string>;
@ -99,14 +87,14 @@ export class HeaderComponent implements OnInit, OnDestroy {
msg1: this.vE.headerLogoutMsg1, msg1: this.vE.headerLogoutMsg1,
msg2: this.vE.headerLogoutMsg2 }; msg2: this.vE.headerLogoutMsg2 };
console.log(dialogConfig.data); //console.log(dialogConfig.data);
const dialogRef = this.dialog.open(CancelComponent, dialogConfig); const dialogRef = this.dialog.open(CancelComponent, dialogConfig);
dialogRef.afterClosed().subscribe(val => { dialogRef.afterClosed().subscribe(val => {
if(val){ if(val){
// console.log('Logout!'); // console.log('Logout!');
this.userService.deleteUser().subscribe(UserResponse => { this.userService.deleteUser().subscribe(UserResponse => {
console.log('Rerouting'); //console.log('Rerouting');
this.userService.findUser(); this.userService.findUser();
this.router.navigate(['/login']); this.router.navigate(['/login']);
}); });
@ -115,13 +103,13 @@ export class HeaderComponent implements OnInit, OnDestroy {
} }
chgUILanguage(){ chgUILanguage(){
console.log('HEADER.chgUILanguage Called '); //console.log('HEADER.chgUILanguage Called ');
this.languageService.getViewElements('header').subscribe( this.languageService.getViewElements('header').subscribe({
response => { next: response => {
console.log('Received >> ', response ); //console.log('Received >> ', response );
console.log('Language Code : ', response.language); //console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component); //console.log('Component Name : ',response.component);
console.log('Language data : ',response.data); //console.log('Language data : ',response.data);
this.vE.headerLastBlock = response.data.header_last_block; this.vE.headerLastBlock = response.data.header_last_block;
this.vE.headerGetCurrency = response.data.header_get_currency; this.vE.headerGetCurrency = response.data.header_get_currency;
@ -130,8 +118,8 @@ export class HeaderComponent implements OnInit, OnDestroy {
this.vE.headerLogoutMsg2 = response.data.header_logout_msg2; this.vE.headerLogoutMsg2 = response.data.header_logout_msg2;
}, },
error => { console.log('Error >> ',error); } error: error => { console.log('Error >> ',error); }
); });
} }
} }

View file

@ -89,14 +89,14 @@
</tr> </tr>
</table> </table>
<div style="height: 15px;"></div> <div style="height: 15px;"></div>
<div width="100%" <div *ngIf="!order.paid" width="100%"
style="font-size: 14px; style="font-size: 14px;
font-weight: 700; font-weight: 700;
font-style: italic; font-style: italic;
text-align: center;"> text-align: center;">
{{ vE.invoiceScanQrcode }} {{ vE.invoiceScanQrcode }}
</div> </div>
<div style="text-align: center; <div *ngIf="!order.paid" style="text-align: center;
margin-top: 10px; margin-top: 10px;
line-height: 30px;"> line-height: 30px;">
<div style="font-family: 'Spartan'; <div style="font-family: 'Spartan';
@ -172,4 +172,4 @@
</mat-card-actions> </mat-card-actions>
</div> </div>
</div> </div>
</div> </div>

View file

@ -9,7 +9,6 @@ import { faCheck, faHourglass, faArrowUpRightFromSquare } from '@fortawesome/fre
import { NotifierService } from '../notifier.service'; import { NotifierService } from '../notifier.service';
import { LanguageService } from '../language.service'; import { LanguageService } from '../language.service';
import { LanguageData } from '../language.model';
var QRCode = require('easyqrcodejs'); var QRCode = require('easyqrcodejs');
var URLSafeBase64 = require('urlsafe-base64'); var URLSafeBase64 = require('urlsafe-base64');
@ -26,11 +25,12 @@ export class InvoiceComponent implements OnInit {
faHourglass = faHourglass; faHourglass = faHourglass;
faArrowUpRightFromSquare = faArrowUpRightFromSquare; faArrowUpRightFromSquare = faArrowUpRightFromSquare;
orderId; orderId;
orderToken: string = '';
public orderUpdate: Observable<Order>; public orderUpdate: Observable<Order>;
public nameUpdate: Observable<string>; public nameUpdate: Observable<string>;
name: string = ''; name: string = '';
error: boolean = false; error: boolean = false;
codeString: string = 'Test'; codeString: string = '';
invString: string = ''; invString: string = '';
public isWCOrder : boolean = false; public isWCOrder : boolean = false;
zcashUrl: SafeUrl = ''; zcashUrl: SafeUrl = '';
@ -48,6 +48,7 @@ export class InvoiceComponent implements OnInit {
paid: false, paid: false,
externalInvoice: '', externalInvoice: '',
shortCode: '', shortCode: '',
token: '',
lines: [ lines: [
{ {
qty: 1, qty: 1,
@ -98,38 +99,42 @@ export class InvoiceComponent implements OnInit {
private languageService : LanguageService private languageService : LanguageService
) { ) {
this.orderId = this._ActiveRoute.snapshot.paramMap.get("orderId"); this.orderId = this._ActiveRoute.snapshot.paramMap.get("orderId");
console.log('constructor - orderId -> ' + this.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.orderUpdate = receiptService.orderUpdate;
this.nameUpdate = receiptService.nameUpdate; this.nameUpdate = receiptService.nameUpdate;
receiptService.getOrderById(this.orderId!).subscribe(response => {
if (response.status == 200){
this.error = false;
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;
} else {
this.error = true;
this.codeString = 'Test';
}
});
this.orderUpdate.subscribe(order => { this.orderUpdate.subscribe(order => {
this.order = order; this.order = order;
if ( order.session.substring(0,1) == 'W') { if ( order.session.substring(0,1) == 'W') {
this.isWCOrder = true; this.isWCOrder = true;
} }
if( order.session.substring(0,1) == 'X') {
this.invString = 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)))}`;
this.zcashUrl = this.sanitizer.bypassSecurityTrustUrl(this.codeString);
}); });
this.nameUpdate.subscribe(name => { this.nameUpdate.subscribe(name => {
this.name = name; this.name = name;

View file

@ -47,7 +47,7 @@
</div> </div>
<p class="rv_price" <p class="rv_price"
*ngIf="owner.zats"> *ngIf="owner.zats">
&#x24e9;{{(item.cost/zecPrice)*100000000 | number: '1.0-0'}} &#x24e9; {{ ((item.cost/zecPrice)*100000000).toString().substring( 0, ((item.cost/zecPrice)*100000000 ).toString().indexOf('.')) }} [{{item.cost | number: '1.02' | currency: getCurrency() }}]
</p> </p>
</td> </td>
</tr> </tr>

View file

@ -1,4 +1,4 @@
import { Input, Inject, Component, OnInit } from '@angular/core'; import { Input, Component, OnInit } from '@angular/core';
import { MatDialog, MatDialogConfig} from '@angular/material/dialog'; import { MatDialog, MatDialogConfig} from '@angular/material/dialog';
import { faCartShopping } from '@fortawesome/free-solid-svg-icons'; import { faCartShopping } from '@fortawesome/free-solid-svg-icons';
@ -17,7 +17,6 @@ import { ItemAddComponent } from '../item-add/item-add.component';
import { NotifierService } from '../../notifier.service'; import { NotifierService } from '../../notifier.service';
import { LanguageService } from '../../language.service'; import { LanguageService } from '../../language.service';
import { LanguageData } from '../../language.model';
@Component({ @Component({
selector: 'app-item-list', selector: 'app-item-list',
@ -42,23 +41,13 @@ export class ItemListComponent implements OnInit{
taxValue: 0, taxValue: 0,
vat: false, vat: false,
vatValue: 0, vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false, paid: false,
website: '',
country: '',
zats: false, zats: false,
invoices: false, invoices: false,
expiration: new Date(Date.now()).toISOString(), expiration: new Date(Date.now()).toISOString(),
payconf: false, payconf: false,
viewkey: '', crmToken: '',
crmToken: '' viewkey: ''
}; };
public ownerUpdate: Observable<Owner>; public ownerUpdate: Observable<Owner>;
@ -76,6 +65,7 @@ export class ItemListComponent implements OnInit{
itemlistNotifClose : '', itemlistNotifClose : '',
itemlistNotifSuccess : '' itemlistNotifSuccess : ''
} }
// //
// ------------------------------------------------------------ // ------------------------------------------------------------
constructor( constructor(
@ -119,7 +109,7 @@ export class ItemListComponent implements OnInit{
if(val != null) { if(val != null) {
var item:Item = {_id: '', name: val.name, description: val.description, cost: val.cost, owner: this.owner.address}; var item:Item = {_id: '', name: val.name, description: val.description, cost: val.cost, owner: this.owner.address};
this.itemService.addItem(item); this.itemService.addItem(item);
console.log('creando item y llamando a notifier >>>'); //console.log('creando item y llamando a notifier >>>');
this.notifierService this.notifierService
.showNotification(this.vE.itemlistItemAdded , .showNotification(this.vE.itemlistItemAdded ,
this.vE.itemlistNotifClose, this.vE.itemlistNotifClose,
@ -142,7 +132,7 @@ export class ItemListComponent implements OnInit{
dialogConfig.disableClose = true; dialogConfig.disableClose = true;
dialogConfig.autoFocus = true; dialogConfig.autoFocus = true;
dialogConfig.data = item; dialogConfig.data = item;
console.log('Entrando a dialogo de edicion') //console.log('Entrando a dialogo de edicion')
const dialogRef = this.dialog.open(ItemEditComponent, dialogConfig); const dialogRef = this.dialog.open(ItemEditComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => { dialogRef.afterClosed().subscribe((val) => {
if (val != null) { if (val != null) {
@ -153,8 +143,8 @@ export class ItemListComponent implements OnInit{
cost: val.cost, cost: val.cost,
owner: this.owner.address owner: this.owner.address
}; };
console.log('Edit:', editItem); //console.log('Edit:', editItem);
console.log('itemlistItemUpdated = ' + this.vE.itemlistItemUpdated); //console.log('itemlistItemUpdated = ' + this.vE.itemlistItemUpdated);
this.itemService.addItem(editItem).subscribe((response) => { this.itemService.addItem(editItem).subscribe((response) => {
this.itemService.getItems(this.owner.address); this.itemService.getItems(this.owner.address);
}); });
@ -213,7 +203,7 @@ export class ItemListComponent implements OnInit{
const dialogRef = this.dialog.open(ItemAddComponent, dialogConfig); const dialogRef = this.dialog.open(ItemAddComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => { dialogRef.afterClosed().subscribe((val) => {
if (val != null) { if (val != null) {
console.log('Adding to order', val); //console.log('Adding to order', val);
this.orderService.addToOrder(val); this.orderService.addToOrder(val);
} }
this.itemService.getItems(this.owner.address); this.itemService.getItems(this.owner.address);
@ -225,13 +215,13 @@ export class ItemListComponent implements OnInit{
} }
chgUILanguage(){ chgUILanguage(){
console.log('ITEMLIST.chgUILanguage Called '); //console.log('ITEMLIST.chgUILanguage Called ');
this.languageService.getViewElements('itemlist').subscribe( this.languageService.getViewElements('itemlist').subscribe({next:
response => { response => {
console.log('Received >> ', response ); //console.log('Received >> ', response );
console.log('Language Code : ', response.language); //console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component); //console.log('Component Name : ',response.component);
console.log('Language data : ',response.data); //console.log('Language data : ',response.data);
this.vE.itemlistListEmpty = response.data.itemlist_list_empty; this.vE.itemlistListEmpty = response.data.itemlist_list_empty;
this.vE.itemlistAvailItems = response.data.itemlist_avail_items; this.vE.itemlistAvailItems = response.data.itemlist_avail_items;
@ -241,8 +231,9 @@ export class ItemListComponent implements OnInit{
this.vE.itemlistNotifClose = response.data.itemlist_notif_close; this.vE.itemlistNotifClose = response.data.itemlist_notif_close;
this.vE.itemlistNotifSuccess = response.data.itemlist_notif_success; this.vE.itemlistNotifSuccess = response.data.itemlist_notif_success;
}, },
error:
error => { console.log('Error >> ',error); } error => { console.log('Error >> ',error); }
); });
} }
} }

View file

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

View file

@ -19,10 +19,18 @@ export class LanguageService {
// //
// URL for access MongoDB database from remote server // URL for access MongoDB database from remote server
private baseURL = ConfigData.Be_URL + 'api/getlang'; 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 = ''; public zgoLanguage: string = '';
private session: string|null = '';
constructor(private http:HttpClient) { constructor(private http:HttpClient) {
this.session = localStorage.getItem('s4z_token');
} }
getViewElements ( viewName:string ) { getViewElements ( viewName:string ) {
@ -45,10 +53,25 @@ export class LanguageService {
// //
// Get component's text data from language database // Get component's text data from language database
// //
return this.http.get<LanguageData>(this.baseURL + const params = new HttpParams().append('session', this.session!);
'/?lang=' + this.zgoLanguage + if (viewName === 'login') {
'&component=' + viewName return this.http.get<LanguageData>(this.loginURL + '/?lang=' + this.zgoLanguage, {headers: reqHeaders, params: params});
,{ headers : reqHeaders } } 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

@ -129,8 +129,8 @@ img.icon{
.minibutton { .minibutton {
font-family: 'Spartan', sans-serif; font-family: 'Spartan', sans-serif;
font-size: 14px; font-size: 14px;
background: #ff5722; /*background: #ff5722;*/
color: white; /*color: white;*/
height: 24px; height: 24px;
line-height: 20px; line-height: 20px;
padding: 10px; padding: 10px;

View file

@ -8,7 +8,7 @@
{{ vE.listordersEndDate }}{{(ownerUpdate | async)!.expiration | date: 'YYYY-MM-dd'}} {{ vE.listordersEndDate }}{{(ownerUpdate | async)!.expiration | date: 'YYYY-MM-dd'}}
</td> </td>
<td> <td>
<button mat-icon-button color="primary"> <button mat-icon-button color="primary" (click)="paySession()">
<mat-icon class="icon">queue</mat-icon> <mat-icon class="icon">queue</mat-icon>
</button> </button>
</td> </td>
@ -162,10 +162,10 @@
padding-right: 20%; padding-right: 20%;
margin-top: 10px;"> margin-top: 10px;">
<span> <span>
<button mat-stroked-button class="minibutton" color="primary" (click)="invoice(order)">{{ vE.listordersInvoiceBtn }}</button> <button mat-raised-button class="minibutton" color="primary" (click)="invoice(order)">{{ vE.listordersInvoiceBtn }}</button>
</span> </span>
<span> <span>
<button mat-stroked-button class="minibutton" color="primary" (click)="receipt(order)">{{ vE.listordersReceiptBtn }}</button> <button mat-raised-button class="minibutton" color="primary" (click)="receipt(order)">{{ vE.listordersReceiptBtn }}</button>
</span> </span>
</div> </div>
</mat-expansion-panel> </mat-expansion-panel>

View file

@ -4,6 +4,7 @@ import { Order } from '../order/order.model';
import { FullnodeService } from '../fullnode.service'; import { FullnodeService } from '../fullnode.service';
import { UserService } from '../user.service'; import { UserService } from '../user.service';
import { Owner } from '../owner.model'; import { Owner } from '../owner.model';
import { User } from '../user.model';
import { OrderService } from '../order/order.service'; import { OrderService } from '../order/order.service';
import { MatDialog, MatDialogConfig} from '@angular/material/dialog'; import { MatDialog, MatDialogConfig} from '@angular/material/dialog';
@ -19,7 +20,7 @@ import { faHourglass } from '@fortawesome/free-solid-svg-icons';
import { faTrash } from '@fortawesome/free-solid-svg-icons'; import { faTrash } from '@fortawesome/free-solid-svg-icons';
import { LanguageService } from '../language.service'; import { LanguageService } from '../language.service';
import { LanguageData } from '../language.model'; import {SessionpayComponent} from '../sessionpay/sessionpay.component';
@Component({ @Component({
selector: 'app-list-orders', selector: 'app-list-orders',
@ -53,24 +54,20 @@ export class ListOrdersComponent implements OnInit, OnDestroy{
taxValue: 0, taxValue: 0,
vat: false, vat: false,
vatValue: 0, vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false, paid: false,
website: '',
country: '',
zats: false, zats: false,
invoices: false, invoices: false,
expiration: new Date(Date.now()).toISOString(), expiration: new Date(Date.now()).toISOString(),
payconf: false, payconf: false,
viewkey: '', crmToken: '',
crmToken: '' viewkey: ''
}; };
zecPrice: number = 1;
nodeAddress: string = '';
session: string = '';
addrUpdate: Observable<string>;
priceUpdate: Observable<number>;
userUpdate: Observable<User>;
// ------------------------------------- // -------------------------------------
// ------------------------------------- // -------------------------------------
// //
@ -97,11 +94,24 @@ export class ListOrdersComponent implements OnInit, OnDestroy{
private languageService : LanguageService, private languageService : LanguageService,
public orderService: OrderService, public orderService: OrderService,
public userService: UserService, public userService: UserService,
public fullnodeService: FullnodeService,
private dialog: MatDialog) private dialog: MatDialog)
{ {
this.ownerUpdate = userService.ownerUpdate; this.ownerUpdate = userService.ownerUpdate;
this.userUpdate = userService.userUpdate;
this.orderService.getAllOrders(); this.orderService.getAllOrders();
this.ordersUpdate = orderService.allOrdersUpdate; this.ordersUpdate = orderService.allOrdersUpdate;
this.addrUpdate = fullnodeService.addrUpdate;
this.priceUpdate = fullnodeService.priceUpdate;
this.priceUpdate.subscribe(price => {
this.zecPrice = price;
});
this.addrUpdate.subscribe(nAddress => {
this.nodeAddress = nAddress;
});
this.userUpdate.subscribe(user => {
this.session = user.session;
});
} }
ngOnInit(){ ngOnInit(){
@ -119,7 +129,7 @@ export class ListOrdersComponent implements OnInit, OnDestroy{
var today = new Date(); var today = new Date();
this.orders = orders; this.orders = orders;
console.log(this.ownerUpdate); //console.log(this.ownerUpdate);
for (let i=0; i < this.orders.length; i++){ for (let i=0; i < this.orders.length; i++){
this.total += this.orders[i].totalZec; this.total += this.orders[i].totalZec;
// //
@ -163,7 +173,8 @@ export class ListOrdersComponent implements OnInit, OnDestroy{
dialogConfig.disableClose = true; dialogConfig.disableClose = true;
dialogConfig.autoFocus = true; dialogConfig.autoFocus = true;
dialogConfig.data = { dialogConfig.data = {
orderId: order._id orderId: order._id,
orderToken: order.token
}; };
const dialogRef = this.dialog.open(PromptInvoiceComponent, dialogConfig); const dialogRef = this.dialog.open(PromptInvoiceComponent, dialogConfig);
@ -184,7 +195,8 @@ export class ListOrdersComponent implements OnInit, OnDestroy{
dialogConfig.disableClose = true; dialogConfig.disableClose = true;
dialogConfig.autoFocus = true; dialogConfig.autoFocus = true;
dialogConfig.data = { dialogConfig.data = {
orderId: order._id orderId: order._id,
orderToken: order.token
}; };
const dialogRef = this.dialog.open(PromptReceiptComponent, dialogConfig); const dialogRef = this.dialog.open(PromptReceiptComponent, dialogConfig);
@ -196,7 +208,7 @@ export class ListOrdersComponent implements OnInit, OnDestroy{
openDbExport(){ openDbExport(){
const dialogConfig = new MatDialogConfig(); const dialogConfig = new MatDialogConfig();
console.log('openDbExport ---'); //console.log('openDbExport ---');
dialogConfig.disableClose = false; dialogConfig.disableClose = false;
dialogConfig.autoFocus = true; dialogConfig.autoFocus = true;
@ -209,32 +221,45 @@ export class ListOrdersComponent implements OnInit, OnDestroy{
} }
chgUILanguage(){ chgUILanguage(){
console.log('LISTORDERS.chgUILanguage Called '); //console.log('LISTORDERS.chgUILanguage Called ');
this.languageService.getViewElements('listorders').subscribe( this.languageService.getViewElements('listorders').subscribe({
response => { next: response => {
console.log('Received >> ', response ); //console.log('Received >> ', response );
console.log('Language Code : ', response.language); //console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component); //console.log('Component Name : ',response.component);
console.log('Language data : ',response.data); //console.log('Language data : ',response.data);
this.vE.listordersBacktoshopBtn = response.data.listorders_backtoshop_btn; this.vE.listordersBacktoshopBtn = response.data.listorders_backtoshop_btn;
this.vE.listordersExportOrders = response.data.listorders_export_orders; this.vE.listordersExportOrders = response.data.listorders_export_orders;
this.vE.listordersTodaysTotal = response.data.listorders_todays_total; this.vE.listordersTodaysTotal = response.data.listorders_todays_total;
this.vE.listordersOverallTotal = response.data.listorders_overall_total; this.vE.listordersOverallTotal = response.data.listorders_overall_total;
this.vE.listordersOrderId = response.data.listorders_order_id; this.vE.listordersOrderId = response.data.listorders_order_id;
this.vE.listordersOrderTotal = response.data.listorders_order_total; this.vE.listordersOrderTotal = response.data.listorders_order_total;
this.vE.listordersItemLbl = response.data.listorders_item_lbl; this.vE.listordersItemLbl = response.data.listorders_item_lbl;
this.vE.listordersQtyLbl = response.data.listorders_qty_lbl; this.vE.listordersQtyLbl = response.data.listorders_qty_lbl;
this.vE.listordersTotalLbl = response.data.listorders_total_lbl; this.vE.listordersTotalLbl = response.data.listorders_total_lbl;
this.vE.listordersInvoiceBtn = response.data.listorders_invoice_btn; this.vE.listordersInvoiceBtn = response.data.listorders_invoice_btn;
this.vE.listordersReceiptBtn = response.data.listorders_receipt_btn; this.vE.listordersReceiptBtn = response.data.listorders_receipt_btn;
this.vE.listordersNoOrders = response.data.listorders_no_orders; this.vE.listordersNoOrders = response.data.listorders_no_orders;
this.vE.listordersEndDate = response.data.listorders_end_date; this.vE.listordersEndDate = response.data.listorders_end_date;
}, },
error => { console.log('Error >> ',error); } 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

@ -2,7 +2,7 @@
<mat-card class="coolcard"> <mat-card class="coolcard">
<mat-card-content> <mat-card-content>
<img mat-card-image src="/assets/logo-new-white_01.png" height="120px" /> <img mat-card-image src="/assets/logo-new-white_01.png" height="120px" />
<p class="text">{{ vE.loginLastBlock }}<span class="numbers">{{ heightUpdate | async }}</span></p> <p class="text">{{ vE.loginLastBlock }}<span class="numbers"> {{ heightUpdate | async }}</span></p>
</mat-card-content> </mat-card-content>
</mat-card> </mat-card>
</div> </div>

View file

@ -1,7 +1,7 @@
import { Component, OnInit, OnDestroy, Injectable, ChangeDetectorRef, ViewChild, AfterViewInit } from '@angular/core'; import { Component, OnInit, ChangeDetectorRef, ViewChild, AfterViewInit } from '@angular/core';
import { CanActivate, Router, RouterStateSnapshot, ActivatedRouteSnapshot, ActivatedRoute } from '@angular/router'; import { Router, ActivatedRoute } from '@angular/router';
import { MatDialog, MatDialogConfig} from '@angular/material/dialog'; import { MatDialog, MatDialogConfig} from '@angular/material/dialog';
import { UntypedFormBuilder, Validators, UntypedFormGroup, FormControl } from '@angular/forms'; import { UntypedFormBuilder, Validators, UntypedFormGroup } from '@angular/forms';
import { ProgressBarMode } from '@angular/material/progress-bar'; import { ProgressBarMode } from '@angular/material/progress-bar';
import { MatStepper } from '@angular/material/stepper'; import { MatStepper } from '@angular/material/stepper';
import { UserService } from '../user.service'; import { UserService } from '../user.service';
@ -11,15 +11,9 @@ import { Tx } from '../tx.model';
import { User } from '../user.model'; import { User } from '../user.model';
import { Owner } from '../owner.model'; import { Owner } from '../owner.model';
import { Subscription, Observable } from 'rxjs'; import { Subscription, Observable } from 'rxjs';
import { take } from 'rxjs/operators';
import { v4 as uuidv4 } from 'uuid'; import { v4 as uuidv4 } from 'uuid';
import { LanguageService } from '../language.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;
@Component({ @Component({
selector: 'app-login', selector: 'app-login',
@ -49,23 +43,13 @@ export class LoginComponent implements OnInit, AfterViewInit {
taxValue:0, taxValue:0,
vat: false, vat: false,
vatValue: 0, vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false, paid: false,
website: '',
country: '',
zats: false, zats: false,
invoices: false, invoices: false,
expiration: new Date(Date.now()).toISOString(), expiration: new Date(Date.now()).toISOString(),
payconf: false, payconf: false,
viewkey: '', crmToken: '',
crmToken: '' viewkey: ''
}; };
private FullnodeSub: Subscription = new Subscription(); private FullnodeSub: Subscription = new Subscription();
private UserSub: Subscription = new Subscription(); private UserSub: Subscription = new Subscription();
@ -73,7 +57,7 @@ export class LoginComponent implements OnInit, AfterViewInit {
public uZaddrUpdate: Observable<string>; public uZaddrUpdate: Observable<string>;
public userUpdate: Observable<User>; public userUpdate: Observable<User>;
public ownerUpdate: Observable<Owner>; public ownerUpdate: Observable<Owner>;
public txsUpdate: Observable<Tx[]>; //public txsUpdate: Observable<Tx[]>;
prompt: boolean = false; prompt: boolean = false;
confirmedMemo: boolean = false; confirmedMemo: boolean = false;
targetBlock: number = 0; targetBlock: number = 0;
@ -82,7 +66,6 @@ export class LoginComponent implements OnInit, AfterViewInit {
barMessage = 'Scanning blockchain for login memo, please wait.'; barMessage = 'Scanning blockchain for login memo, please wait.';
@ViewChild('stepper') private myStepper?: MatStepper; @ViewChild('stepper') private myStepper?: MatStepper;
entryForm: UntypedFormGroup;
pinForm: UntypedFormGroup; pinForm: UntypedFormGroup;
// //
@ -112,9 +95,6 @@ export class LoginComponent implements OnInit, AfterViewInit {
){ ){
//this.fullnodeService.getAddr(); //this.fullnodeService.getAddr();
this.entryForm = fb.group({
selectedSession: [0.001, Validators.required]
});
this.pinForm = fb.group({ this.pinForm = fb.group({
pinValue: [null, Validators.required] pinValue: [null, Validators.required]
}); });
@ -128,10 +108,10 @@ export class LoginComponent implements OnInit, AfterViewInit {
this.ownerUpdate.subscribe((owner) => { this.ownerUpdate.subscribe((owner) => {
this.owner = owner; this.owner = owner;
}); });
this.txsUpdate = userService.txUpdate; //this.txsUpdate = userService.txUpdate;
this.txsUpdate.subscribe((txs) => { //this.txsUpdate.subscribe((txs) => {
this.txs = txs; //this.txs = txs;
}); //});
} }
ngAfterViewInit(){ ngAfterViewInit(){
@ -158,34 +138,35 @@ export class LoginComponent implements OnInit, AfterViewInit {
this.chgUILanguage(); this.chgUILanguage();
this.intervalHolder = setInterval(() => { this.intervalHolder = setInterval(() => {
this.fullnodeService.getHeight(); this.fullnodeService.getHeight();
//this.userService.findUser();
this.loginCheck(); this.loginCheck();
this._changeDetectorRef.markForCheck(); this._changeDetectorRef.markForCheck();
}, 1000 * 60); }, 1000 * 60);
} }
loginCheck(){ loginCheck(){
this.userService.findUser(); this.userService.checkUser()!.subscribe({
this.userUpdate.subscribe((user) => { next: (checkResponse) => {
if (user.blocktime > 0) { if (checkResponse.status == 200) {
if(this.myStepper!.selectedIndex === 0) { console.log('checkUser true');
this.myStepper!.next(); if(this.myStepper!.selectedIndex === 0) {
this.myStepper!.next(); this.myStepper!.next();
} else {
if(this.myStepper!.selectedIndex === 1){
this.myStepper!.next(); this.myStepper!.next();
}
}
//console.log('Log in found in blockchain!');
if (user.validated) {
clearInterval(this.intervalHolder);
if (this.owner.paid) {
this.router.navigate(['/shop']);
} else { } 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']); this.router.navigate(['/biz']);
clearInterval(this.intervalHolder);
} else {
console.log('validated failed');
} }
} }
} },
error: (error) => {console.log(error);}
}); });
} }
@ -229,13 +210,13 @@ export class LoginComponent implements OnInit, AfterViewInit {
} }
chgUILanguage(){ chgUILanguage(){
console.log('LOGIN.chgUILanguage Called '); //console.log('LOGIN.chgUILanguage Called ');
this.languageService.getViewElements('login').subscribe( this.languageService.getViewElements('login').subscribe(
response => { response => {
console.log('Received >> ', response ); //console.log('Received >> ', response );
console.log('Language Code : ', response.language); //console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component); //console.log('Component Name : ',response.component);
console.log('Language data : ',response.data); //console.log('Language data : ',response.data);
this.vE.loginLastBlock = response.data.login_last_block; this.vE.loginLastBlock = response.data.login_last_block;
this.vE.loginConnectToZGo = response.data.login_connect_to_zgo; this.vE.loginConnectToZGo = response.data.login_connect_to_zgo;

View file

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

View file

@ -47,6 +47,7 @@ export class OrderComponent implements OnInit{
paid: false, paid: false,
externalInvoice: '', externalInvoice: '',
shortCode: '', shortCode: '',
token: '',
lines: [ lines: [
{ {
qty: 1, qty: 1,
@ -106,7 +107,7 @@ export class OrderComponent implements OnInit{
this.orderUpdate.subscribe((order) => { this.orderUpdate.subscribe((order) => {
this.order = order; this.order = order;
console.log('this.order > ' + JSON.stringify(this.order)); //console.log('this.order > ' + JSON.stringify(this.order));
// ------------------------------------------------ // ------------------------------------------------
this.oLines = []; this.oLines = [];
this.myLines = this.order.lines; this.myLines = this.order.lines;
@ -150,7 +151,7 @@ export class OrderComponent implements OnInit{
const dialogRef = this.dialog.open(CancelComponent, dialogConfig); const dialogRef = this.dialog.open(CancelComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => { dialogRef.afterClosed().subscribe((val) => {
if (val) { if (val) {
console.log('Canceling'); //console.log('Canceling');
this.orderService.cancelOrder(this.order._id!).subscribe((response) => { this.orderService.cancelOrder(this.order._id!).subscribe((response) => {
this.orderService.getOrder(); this.orderService.getOrder();
this.notifierService this.notifierService
@ -159,9 +160,10 @@ export class OrderComponent implements OnInit{
'success', 'success',
this.vE.orderNotservSuccess); this.vE.orderNotservSuccess);
}); });
} else {
console.log('Returning to page');
} }
//else {
//console.log('Returning to page');
//}
this.orderService.getOrder(); this.orderService.getOrder();
this.oLines = []; this.oLines = [];
}); });
@ -212,10 +214,11 @@ export class OrderComponent implements OnInit{
dialogConfig.disableClose = true; dialogConfig.disableClose = true;
dialogConfig.autoFocus = true; dialogConfig.autoFocus = true;
dialogConfig.data = { dialogConfig.data = {
orderId: this.order._id orderId: this.order._id,
orderToken: this.order.token
}; };
console.log ('order_id : ' + this.order._id); //console.log ('order_id : ' + this.order._id);
const dialogRef = this.dialog.open(PromptInvoiceComponent, dialogConfig); const dialogRef = this.dialog.open(PromptInvoiceComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => { dialogRef.afterClosed().subscribe((val) => {
@ -276,13 +279,13 @@ export class OrderComponent implements OnInit{
} }
chgUILanguage(){ chgUILanguage(){
console.log('ORDER.chgUILanguage Called '); //console.log('ORDER.chgUILanguage Called ');
this.languageService.getViewElements('order').subscribe( this.languageService.getViewElements('order').subscribe({
response => { next: response => {
console.log('Received >> ', response ); //console.log('Received >> ', response );
console.log('Language Code : ', response.language); //console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component); //console.log('Component Name : ',response.component);
console.log('Language data : ',response.data); //console.log('Language data : ',response.data);
this.vE.orderNoOpenorder = response.data.order_no_openorder; this.vE.orderNoOpenorder = response.data.order_no_openorder;
this.vE.orderCancelOrder = response.data.order_cancel_order; this.vE.orderCancelOrder = response.data.order_cancel_order;
@ -302,8 +305,8 @@ export class OrderComponent implements OnInit{
this.vE.orderCheckoutBtn = response.data.order_checkout_btn; this.vE.orderCheckoutBtn = response.data.order_checkout_btn;
}, },
error => { console.log('Error >> ',error); } error: error => { console.log('Error >> ',error); }
); });
} }
} }

View file

@ -13,5 +13,6 @@ export interface Order {
lines: LineItem[], lines: LineItem[],
paid: boolean, paid: boolean,
externalInvoice: string, externalInvoice: string,
shortCode: string shortCode: string,
token: string
} }

View file

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Subject, BehaviorSubject, Observable } from 'rxjs'; import { BehaviorSubject, Observable } from 'rxjs';
import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http'; import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http';
import { Order } from './order.model'; import { Order } from './order.model';
import { UserService } from '../user.service'; import { UserService } from '../user.service';
@ -35,23 +35,13 @@ export class OrderService {
taxValue: 0, taxValue: 0,
vat: false, vat: false,
vatValue: 0, vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false, paid: false,
website: '',
country: '',
zats: false, zats: false,
invoices: false, invoices: false,
expiration: new Date(Date.now()).toISOString(), expiration: new Date(Date.now()).toISOString(),
payconf: false, payconf: false,
viewkey: '', crmToken: '',
crmToken: '' viewkey: ''
}, },
order: { order: {
address: '', address: '',
@ -65,6 +55,7 @@ export class OrderService {
paid: false, paid: false,
externalInvoice: '', externalInvoice: '',
shortCode: '', shortCode: '',
token: '',
lines: [ lines: [
{ {
qty: 1, qty: 1,
@ -83,6 +74,8 @@ export class OrderService {
public userUpdate: Observable<User>; public userUpdate: Observable<User>;
public ownerUpdate: Observable<Owner>; public ownerUpdate: Observable<Owner>;
private reqHeaders: HttpHeaders; private reqHeaders: HttpHeaders;
private reqParams: HttpParams;
private session: null|string;
constructor( constructor(
private http: HttpClient, private http: HttpClient,
@ -90,12 +83,13 @@ export class OrderService {
public userService: UserService public userService: UserService
) { ) {
var auth = 'Basic ' + Buffer.from(ConfigData.UsrPwd).toString('base64'); var auth = 'Basic ' + Buffer.from(ConfigData.UsrPwd).toString('base64');
this.session = localStorage.getItem('s4z_token');
this.reqHeaders = new HttpHeaders().set('Authorization', auth); this.reqHeaders = new HttpHeaders().set('Authorization', auth);
this.reqParams = new HttpParams().append('session', this.session!);
this.userUpdate = userService.userUpdate; this.userUpdate = userService.userUpdate;
this.ownerUpdate = userService.ownerUpdate; this.ownerUpdate = userService.ownerUpdate;
this.userUpdate.subscribe((user) => { this.userUpdate.subscribe((user) => {
this.dataStore.user = user; this.dataStore.user = user;
//console.log('OS: const', user);
this.getOrder(); this.getOrder();
}); });
this.ownerUpdate.subscribe((owner) => { this.ownerUpdate.subscribe((owner) => {
@ -104,9 +98,7 @@ export class OrderService {
} }
getOrder() { getOrder() {
var session = this.dataStore.user.session; let obs = this.http.get<{message: string, order: any}>(this.beUrl+'api/order', { headers:this.reqHeaders, params: this.reqParams, observe: 'response'});
const params = new HttpParams().append('session', session);
let obs = this.http.get<{message: string, order: any}>(this.beUrl+'api/order', { headers:this.reqHeaders, params:params, observe: 'response'});
obs.subscribe((OrderDataResponse) => { obs.subscribe((OrderDataResponse) => {
if (OrderDataResponse.status == 200) { if (OrderDataResponse.status == 200) {
@ -127,7 +119,7 @@ export class OrderService {
getAllOrders(){ getAllOrders(){
var address = this.dataStore.user.address; var address = this.dataStore.user.address;
const params = new HttpParams().append('address', address); const params = this.reqParams.append('address', address);
let obs = this.http.get<{message: string, orders: any}>(this.beUrl+'api/allorders', { headers:this.reqHeaders, params:params, observe: 'response'}); let obs = this.http.get<{message: string, orders: any}>(this.beUrl+'api/allorders', { headers:this.reqHeaders, params:params, observe: 'response'});
obs.subscribe((OrdersData) => { obs.subscribe((OrdersData) => {
if (OrdersData.status == 200 ){ if (OrdersData.status == 200 ){
@ -145,7 +137,7 @@ export class OrderService {
addToOrder(lineItem: LineItem) { addToOrder(lineItem: LineItem) {
if(this.dataStore.order._id != null) { if(this.dataStore.order._id != null) {
this.dataStore.order.lines.push(lineItem); this.dataStore.order.lines.push(lineItem);
let obs = this.http.post(this.beUrl+'api/order', { payload: this.dataStore.order }, { headers: this.reqHeaders }); let obs = this.http.post(this.beUrl+'api/order', { payload: this.dataStore.order }, { headers: this.reqHeaders, params: this.reqParams });
obs.subscribe((orderData) => { obs.subscribe((orderData) => {
this.getOrder(); this.getOrder();
}); });
@ -168,9 +160,10 @@ export class OrderService {
paid: false, paid: false,
externalInvoice: '', externalInvoice: '',
shortCode: '', shortCode: '',
token: '',
lines: [lineItem] lines: [lineItem]
}; };
let obs = this.http.post<{message: string, order: Order}>(this.beUrl+'api/order', {payload: order}, { headers: this.reqHeaders }); let obs = this.http.post<{message: string, order: Order}>(this.beUrl+'api/order', {payload: order}, { headers: this.reqHeaders, params: this.reqParams });
obs.subscribe((orderData) => { obs.subscribe((orderData) => {
console.log('Created order'); console.log('Created order');
this.getOrder() this.getOrder()
@ -180,7 +173,7 @@ export class OrderService {
} }
cancelOrder(id: string) { cancelOrder(id: string) {
let obs = this.http.delete<{message: string}>(this.beUrl+'api/order/'+id, { headers: this.reqHeaders }); let obs = this.http.delete<{message: string}>(this.beUrl+'api/order/'+id, { headers: this.reqHeaders, params: this.reqParams });
obs.subscribe((OrderResponse) => { obs.subscribe((OrderResponse) => {
console.log('Order deleted'); console.log('Order deleted');
@ -197,6 +190,7 @@ export class OrderService {
paid: false, paid: false,
externalInvoice: '', externalInvoice: '',
shortCode: '', shortCode: '',
token: '',
lines: [ lines: [
{ {
qty: 1, qty: 1,
@ -217,7 +211,7 @@ export class OrderService {
}); });
this.dataStore.order.closed = true; this.dataStore.order.closed = true;
this.dataStore.order.paid = paid; this.dataStore.order.paid = paid;
let obs = this.http.post(this.beUrl+'api/order', {payload: this.dataStore.order}, { headers: this.reqHeaders }); let obs = this.http.post(this.beUrl+'api/order', {payload: this.dataStore.order}, { headers: this.reqHeaders, params: this.reqParams });
obs.subscribe((orderData) => { obs.subscribe((orderData) => {
console.log('Closed order', orderData); console.log('Closed order', orderData);
this.dataStore.order = { this.dataStore.order = {
@ -232,6 +226,7 @@ export class OrderService {
paid: false, paid: false,
externalInvoice: '', externalInvoice: '',
shortCode: '', shortCode: '',
token: '',
lines: [ lines: [
{ {
qty: 1, qty: 1,

View file

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

View file

@ -24,11 +24,11 @@
<div style="height: 50px;"> <div style="height: 50px;">
</div> </div>
<div style="font-weight: 700; <div style="font-weight: 700;
font-size: 25px; fonT-size: 25px;
text-align: center;"> text-align: center;">
{{ vE.pmtservicePmtsrvNot }}<br> {{ vE.pmtservicePmtsrvNot }}<br>
{{ vE.pmtserviceEnabledFor }}<br> {{ vE.pmtserviceEnabledFor }}<br>
{{ owner.name}} {{ shop }}
</div> </div>
<div style="height: 40px;"> <div style="height: 40px;">
</div> </div>
@ -131,7 +131,7 @@
</div> </div>
<div class="invoiceDetail" <div class="invoiceDetail"
*ngIf="reportType==0" *ngIf="reportType==0"
id="invoice"> >
<div class="invoiceHdrTxt1">{{ vE.pmtserviceHdrTxt1 }}</div> <div class="invoiceHdrTxt1">{{ vE.pmtserviceHdrTxt1 }}</div>
<div class="invoiceHdrTxt2">{{ vE.pmtserviceHdrTxt2 }}{{orderId}}</div> <div class="invoiceHdrTxt2">{{ vE.pmtserviceHdrTxt2 }}{{orderId}}</div>
<div class="invoiceHdrTxt3">{{ vE.pmtserviceHdrTxt3 }}{{order.timestamp | date}} <div class="invoiceHdrTxt3">{{ vE.pmtserviceHdrTxt3 }}{{order.timestamp | date}}
@ -206,7 +206,7 @@
</td> </td>
<td width="25%"> <td width="25%">
<div style="text-align: right;" <div style="text-align: right;"
id="payment-qr" id="invoice-qr"
*ngIf="!order.paid"></div> *ngIf="!order.paid"></div>
</td> </td>
</tr> </tr>
@ -253,4 +253,4 @@
</div> </div>
</div> </div>

View file

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

@ -20,13 +20,13 @@
style="text-align: left;" style="text-align: left;"
width="94%"> width="94%">
<div> <div>
<textarea <textarea matInput readonly
style="border: none; style="border: none;
outline: none; outline: none;
width: 95%;" width: 95%;"
cdkTextareaAutosize cdkTextareaAutosize
cdkAutosizeMinRows="1" cdkAutosizeMinRows="1"
cdkAutosizeMaxRows="4">{{ invoiceUrl }} cdkAutosizeMaxRows="5">{{ invoiceUrl }}
</textarea> </textarea>
</div> </div>

View file

@ -18,6 +18,7 @@ var Buffer = require('buffer/').Buffer;
export class PromptInvoiceComponent implements OnInit { export class PromptInvoiceComponent implements OnInit {
orderId: string; orderId: string;
orderToken: string = '';
invoiceUrl: string; invoiceUrl: string;
// ------------------------------------ // ------------------------------------
// //
@ -41,10 +42,11 @@ export class PromptInvoiceComponent implements OnInit {
constructor( constructor(
private languageService : LanguageService, private languageService : LanguageService,
private dialogRef: MatDialogRef<PromptInvoiceComponent>, private dialogRef: MatDialogRef<PromptInvoiceComponent>,
@Inject(MAT_DIALOG_DATA) public data: {orderId: string}, @Inject(MAT_DIALOG_DATA) public data: {orderId: string, orderToken: string},
private notifierService : NotifierService ) { private notifierService : NotifierService ) {
this.orderId = data.orderId; this.orderId = data.orderId;
this.invoiceUrl = 'https://app.zgo.cash/invoice/'+this.orderId; this.orderToken = data.orderToken;
this.invoiceUrl = 'https://app.zgo.cash/invoice/'+this.orderId + '?token=' + this.orderToken;
} }
ngOnInit(): void { ngOnInit(): void {

View file

@ -21,13 +21,13 @@
style="text-align: left;" style="text-align: left;"
width="94%"> width="94%">
<div> <div>
<textarea <textarea matInput readonly
style="border: none; style="border: none;
outline: none; outline: none;
width: 95%;" width: 95%;"
cdkTextareaAutosize cdkTextareaAutosize
cdkAutosizeMinRows="1" cdkAutosizeMinRows="1"
cdkAutosizeMaxRows="4">{{ receiptUrl }} cdkAutosizeMaxRows="5">{{ receiptUrl }}
</textarea> </textarea>
</div> </div>

View file

@ -19,6 +19,7 @@ var Buffer = require('buffer/').Buffer;
export class PromptReceiptComponent implements OnInit { export class PromptReceiptComponent implements OnInit {
orderId: string; orderId: string;
orderToken: string;
receiptUrl: string; receiptUrl: string;
// ------------------------------------ // ------------------------------------
@ -43,10 +44,11 @@ export class PromptReceiptComponent implements OnInit {
constructor( constructor(
private languageService : LanguageService, private languageService : LanguageService,
private dialogRef: MatDialogRef<PromptReceiptComponent>, private dialogRef: MatDialogRef<PromptReceiptComponent>,
@Inject(MAT_DIALOG_DATA) public data: {orderId: string}, @Inject(MAT_DIALOG_DATA) public data: {orderId: string, orderToken: string},
private notifierService : NotifierService ) { private notifierService : NotifierService ) {
this.orderId = data.orderId; this.orderId = data.orderId;
this.receiptUrl = 'https://app.zgo.cash/receipt/'+this.orderId; this.orderToken = data.orderToken;
this.receiptUrl = 'https://app.zgo.cash/receipt/' + this.orderId + '?token=' + this.orderToken;
} }

View file

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

View file

@ -14,6 +14,7 @@ import { LanguageData } from '../language.model';
}) })
export class ReceiptComponent implements OnInit { export class ReceiptComponent implements OnInit {
orderId; orderId;
orderToken: string = '';
public orderUpdate: Observable<Order>; public orderUpdate: Observable<Order>;
public nameUpdate: Observable<string>; public nameUpdate: Observable<string>;
name: string = ''; name: string = '';
@ -30,6 +31,7 @@ export class ReceiptComponent implements OnInit {
paid: false, paid: false,
externalInvoice: '', externalInvoice: '',
shortCode: '', shortCode: '',
token: '',
lines: [ lines: [
{ {
qty: 1, qty: 1,
@ -60,12 +62,15 @@ export class ReceiptComponent implements OnInit {
public receiptService: ReceiptService public receiptService: ReceiptService
) { ) {
this.orderId = this._ActiveRoute.snapshot.paramMap.get("orderId"); this.orderId = this._ActiveRoute.snapshot.paramMap.get("orderId");
this._ActiveRoute.queryParams.subscribe((params) => {
this.orderToken = params["token"];
receiptService.getOrderById(this.orderId!, this.orderToken!);
});
this.orderUpdate = receiptService.orderUpdate; this.orderUpdate = receiptService.orderUpdate;
this.nameUpdate = receiptService.nameUpdate;
receiptService.getOrderById(this.orderId!);
this.orderUpdate.subscribe(order => { this.orderUpdate.subscribe(order => {
this.order = order; this.order = order;
}); });
this.nameUpdate = receiptService.nameUpdate;
this.nameUpdate.subscribe(name => { this.nameUpdate.subscribe(name => {
this.name = name; this.name = name;

View file

@ -5,7 +5,6 @@ import { DomSanitizer, SafeUrl } from '@angular/platform-browser';
import { NotifierService } from '../notifier.service'; import { NotifierService } from '../notifier.service';
import { LanguageService } from '../language.service'; import { LanguageService } from '../language.service';
import { LanguageData } from '../language.model';
var QRCode = require('easyqrcodejs'); var QRCode = require('easyqrcodejs');
var URLSafeBase64 = require('urlsafe-base64'); var URLSafeBase64 = require('urlsafe-base64');
@ -148,13 +147,14 @@ export class ScanComponent implements OnInit{
} }
chgUILanguage(){ chgUILanguage(){
console.log('SCAN.chgUILanguage Called '); //console.log('SCAN.chgUILanguage Called ');
this.languageService.getViewElements('scan').subscribe( this.languageService.getViewElements('scan').subscribe({
next:
response => { response => {
console.log('Received >> ', response ); //console.log('Received >> ', response );
console.log('Language Code : ', response.language); //console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component); //console.log('Component Name : ',response.component);
console.log('Language data : ',response.data); //console.log('Language data : ',response.data);
this.vE.scanScanqrCode = response.data.scan_scanqr_code; this.vE.scanScanqrCode = response.data.scan_scanqr_code;
this.vE.scanTextInfo = response.data.scan_text_info; this.vE.scanTextInfo = response.data.scan_text_info;
@ -172,8 +172,8 @@ export class ScanComponent implements OnInit{
this.vE.scanOrButton = response.data.scan_or_button; this.vE.scanOrButton = response.data.scan_or_button;
}, },
error => { console.log('Error >> ',error); } error: error => { console.log('Error >> ',error); }
); });
} }
} }

View file

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

View file

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

View file

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

View file

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

View file

@ -42,7 +42,7 @@
<mat-form-field class="full-width" <mat-form-field class="full-width"
appearance="fill"> appearance="fill">
<mat-label>{{ vE.settingsVkeyLbl }}</mat-label> <mat-label>{{ vE.settingsVkeyLbl }}</mat-label>
<textarea matInput placeholder="{{ vE.settingsVkeyPlaceholder }}" <textarea matInput [readonly]="vKaccess" placeholder="{{ vE.settingsVkeyPlaceholder }}"
formControlName="vKey"> formControlName="vKey">
</textarea> </textarea>
</mat-form-field> </mat-form-field>

View file

@ -1,5 +1,5 @@
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 { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { MatSlideToggleChange } from '@angular/material/slide-toggle'; import { MatSlideToggleChange } from '@angular/material/slide-toggle';
import { UntypedFormBuilder, Validators, UntypedFormGroup, FormControl } from '@angular/forms'; import { UntypedFormBuilder, Validators, UntypedFormGroup, FormControl } from '@angular/forms';
import { Subject, Observable } from 'rxjs'; import { Subject, Observable } from 'rxjs';
@ -11,7 +11,6 @@ import { NotifierService } from '../notifier.service';
import { faCopy } from '@fortawesome/free-solid-svg-icons'; import { faCopy } from '@fortawesome/free-solid-svg-icons';
import { LanguageService } from '../language.service'; import { LanguageService } from '../language.service';
import { LanguageData } from '../language.model';
@Component({ @Component({
selector: 'app-settings', selector: 'app-settings',
@ -30,10 +29,10 @@ export class SettingsComponent implements OnInit {
owner: Owner; owner: Owner;
useZats: boolean; useZats: boolean;
proVersion: boolean = false; proVersion: boolean = false;
useVKey: boolean = false;
linkMsg: string = ''; linkMsg: string = '';
xeroAccCod: string = ''; xeroAccCod: string = '';
saveAccOk: boolean = false; saveAccOk: boolean = false;
private viewkey: string = '';
coins = [ coins = [
{ {
@ -117,6 +116,7 @@ export class SettingsComponent implements OnInit {
}; };
// //
languageRdy = new Subject<boolean>(); languageRdy = new Subject<boolean>();
vKaccess = true;
// ------------------------------------------------------------ // ------------------------------------------------------------
constructor( constructor(
@ -126,25 +126,25 @@ export class SettingsComponent implements OnInit {
public xeroService: XeroService, public xeroService: XeroService,
public wooService: WoocommerceService, public wooService: WoocommerceService,
private dialogRef: MatDialogRef<SettingsComponent>, private dialogRef: MatDialogRef<SettingsComponent>,
@Inject(MAT_DIALOG_DATA) public data: Owner) { @Inject(MAT_DIALOG_DATA) public data: {o: Owner}) {
this.useZats = data.zats; this.useZats = data.o.zats;
this.useVKey = data.payconf;
this.settingsForm = fb.group({ this.settingsForm = fb.group({
name: [data.name, Validators.required], name: [data.o.name, Validators.required],
currency: [data.currency, Validators.required], currency: [data.o.currency, Validators.required],
useZats: [data.zats, Validators.required], useZats: [data.o.zats, Validators.required],
useVKey: [data.payconf, Validators.required], useVKey: [data.o.payconf, Validators.required],
// proVersion: [data.invoices, Validators.required], vKey: [data.o.viewkey]
vKey: [data.viewkey]
}); });
this.accCodForm = fb.group ({ this.accCodForm = fb.group ({
xAcc: [this.xeroAccCod] xAcc: [this.xeroAccCod]
}); });
if (data.payconf) { if (data.o.payconf) {
this.settingsForm.get('vKey')!.enable(); this.vKaccess = false;
//this.settingsForm.get('vKey')!.enable();
} }
this.owner = data; this.owner = data.o;
this.viewkey = data.o.viewkey;
this.proVersion = this.owner.invoices; this.proVersion = this.owner.invoices;
if ( this.owner.crmToken !== '' ) { if ( this.owner.crmToken !== '' ) {
this.linked2Xero = true; this.linked2Xero = true;
@ -156,10 +156,10 @@ export class SettingsComponent implements OnInit {
this.xeroLink = `https://login.xero.com/identity/connect/authorize?response_type=code&client_id=${this.clientId}&redirect_uri=http%3A%2F%2Flocalhost%3A4200%2Fxeroauth&scope=accounting.transactions offline_access&state=${this.owner.address.substring(0, 6)}` this.xeroLink = `https://login.xero.com/identity/connect/authorize?response_type=code&client_id=${this.clientId}&redirect_uri=http%3A%2F%2Flocalhost%3A4200%2Fxeroauth&scope=accounting.transactions offline_access&state=${this.owner.address.substring(0, 6)}`
}); });
this.accCodeUpdate = xeroService.accCodeUpdate; this.accCodeUpdate = xeroService.accCodeUpdate;
xeroService.getXeroAccountCode(this.owner.address); xeroService.getXeroAccountCode();
this.accCodeUpdate.subscribe(accData => { this.accCodeUpdate.subscribe(accData => {
this.xeroAccCod = accData; this.xeroAccCod = accData;
console.log("xeroAccCod -> [" + this.xeroAccCod + "]"); //console.log("xeroAccCod -> [" + this.xeroAccCod + "]");
this.accCodForm.get('xAcc')!.setValue(this.xeroAccCod); this.accCodForm.get('xAcc')!.setValue(this.xeroAccCod);
}); });
this.wooOwnerUpdate = wooService.ownerUpdate; this.wooOwnerUpdate = wooService.ownerUpdate;
@ -180,23 +180,24 @@ export class SettingsComponent implements OnInit {
ngOnInit() { ngOnInit() {
this.settingsForm.get('vKey')!.disable(); //this.settingsForm.get('vKey')!.disable();
// //
this.chgUILanguage(); this.vKaccess = true;
console.log('SETTINGS: Return from chgUILanguage()'); this.chgUILanguage();
// //console.log('SETTINGS: Return from chgUILanguage()');
this.languageRdy.subscribe ( //
data => { this.languageRdy.subscribe (
this.linkMsg = this.vE.settingsLink2Xero; data => {
this.pmtServiceURL + ''; this.linkMsg = this.vE.settingsLink2Xero;
if ( this.linked2Xero ) { this.pmtServiceURL + '';
this.linkMsg = this.vE.settingsRelink2Xero; //'Relink to Xero'; if ( this.linked2Xero ) {
this.pmtServiceURL = this.linkMsg = this.vE.settingsRelink2Xero; //'Relink to Xero';
'https://zgo.cash/pmtservice?owner=' + this.pmtServiceURL =
this.owner._id + 'https://zgo.cash/pmtservice?owner=' +
'&invoiceNo=[INVOICENUMBER]&currency=[CURRENCY]&amount=[AMOUNTDUE]&shortCode=[SHORTCODE]'; this.owner._id +
} '&invoiceNo=[INVOICENUMBER]&currency=[CURRENCY]&amount=[AMOUNTDUE]&shortCode=[SHORTCODE]';
}); }
});
} }
safeURL(s: string){ safeURL(s: string){
@ -205,7 +206,7 @@ export class SettingsComponent implements OnInit {
close() { close() {
this.dialogRef.close(); this.dialogRef.close(null);
} }
closeIntegration() { closeIntegration() {
@ -223,7 +224,7 @@ export class SettingsComponent implements OnInit {
this.owner.zats = this.settingsForm.value.useZats; this.owner.zats = this.settingsForm.value.useZats;
this.owner.payconf = this.settingsForm.value.useVKey; this.owner.payconf = this.settingsForm.value.useVKey;
this.owner.viewkey = this.settingsForm.value.vKey; this.owner.viewkey = this.settingsForm.value.vKey;
//this.owner.invoices = this.settingsForm.value.proVersion //console.log('Settings component key: ' + this.owner.viewkey);
this.dialogRef.close(this.owner); this.dialogRef.close(this.owner);
} }
@ -236,15 +237,16 @@ export class SettingsComponent implements OnInit {
} }
onChangeVKeyOn(ob: MatSlideToggleChange) { onChangeVKeyOn(ob: MatSlideToggleChange) {
// console.log("Viewing key switch is " + // console.log("Viewing key switch is " +
// ( ob.checked ? "[ON]." : "[OFF]." ) ); // ( ob.checked ? "[ON]." : "[OFF]." ) );
this.useVKey = ob.checked;
if ( ob.checked ) if ( ob.checked ) {
this.settingsForm.get('vKey')!.enable(); //this.settingsForm.get('vKey')!.enable();
else this.vKaccess = false;
this.settingsForm.get('vKey')!.disable(); } else {
//this.settingsForm.get('vKey')!.disable();
this.vKaccess = true;
}
} }
@ -332,32 +334,33 @@ export class SettingsComponent implements OnInit {
saveAccCod() { saveAccCod() {
this.xeroAccCod = this.accCodForm.value.xAcc; this.xeroAccCod = this.accCodForm.value.xAcc;
console.log(">>> " + this.xeroAccCod); //console.log(">>> " + this.xeroAccCod);
if ( this.xeroAccCod.length <= 10 ) { if ( this.xeroAccCod.length <= 10 ) {
const obs = this.xeroService const obs = this.xeroService
.setXeroAccountCode(this.owner.address, .setXeroAccountCode(this.owner.address,
this.xeroAccCod); this.xeroAccCod);
obs.subscribe(responseData => { obs.subscribe({ next: responseData => {
if (responseData.status == 202) { if (responseData.status == 202) {
console.log('Account saved'); //console.log('Account saved');
this.notifierService this.notifierService
.showNotification(this.vE.settingsAcodeSaved, .showNotification(this.vE.settingsAcodeSaved,
this.vE.settingsNotservClose, this.vE.settingsNotservClose,
"success", "success",
this.vE.settingsNotservSuccess); this.vE.settingsNotservSuccess);
} else { } else {
console.log('Account not saved -> status[' + responseData.status + ']'); //console.log('Account not saved -> status[' + responseData.status + ']');
this.notifierService this.notifierService
.showNotification( .showNotification(
this.vE.settingsAcodeNotsaved, this.vE.settingsAcodeNotsaved,
this.vE.settingsNotservClose, this.vE.settingsNotservClose,
"error", "error",
this.vE.settingsNotservError); this.vE.settingsNotservError);
} }
}, error => { },
console.log('Error saving Account Code -> ' + error.msg) error: error => {
}); //console.log('Error saving Account Code -> ' + error.msg)
}});
} else { } else {
this.notifierService this.notifierService
@ -376,63 +379,63 @@ export class SettingsComponent implements OnInit {
} }
*/ */
checkStatus( arg : any ) { checkStatus( arg : any ) {
console.log('onChange - checkStatus'); //console.log('onChange - checkStatus');
console.log(arg.target.value); //console.log(arg.target.value);
this.saveAccOk = (arg.target.value != this.xeroAccCod ); this.saveAccOk = (arg.target.value != this.xeroAccCod );
} }
chgUILanguage(){ chgUILanguage(){
console.log('SETTINGS.chgUILanguage Called '); //console.log('SETTINGS.chgUILanguage Called ');
this.languageService.getViewElements('settings').subscribe( this.languageService.getViewElements('settings').subscribe({
response => { next: response => {
console.log('Received >> ', response ); //console.log('Received >> ', response );
console.log('Language Code : ', response.language); //console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component); //console.log('Component Name : ',response.component);
console.log('Language data : ',response.data); //console.log('Language data : ',response.data);
this.vE.settingsViewTitle = response.data.settings_view_title; this.vE.settingsViewTitle = response.data.settings_view_title;
this.vE.settingsTabMainlbl = response.data.settings_tab_mainlbl; this.vE.settingsTabMainlbl = response.data.settings_tab_mainlbl;
this.vE.settingsNameLbl = response.data.settings_name_lbl; this.vE.settingsNameLbl = response.data.settings_name_lbl;
this.vE.settingsCurrencyLbl = response.data.settings_currency_lbl; this.vE.settingsCurrencyLbl = response.data.settings_currency_lbl;
this.vE.settingsNamePlaceholder = response.data.settings_name_placeholder; this.vE.settingsNamePlaceholder = response.data.settings_name_placeholder;
this.vE.settingsUseSatoshi = response.data.settings_use_satoshi; this.vE.settingsUseSatoshi = response.data.settings_use_satoshi;
this.vE.settingsVkeyLbl = response.data.settings_vkey_lbl; this.vE.settingsVkeyLbl = response.data.settings_vkey_lbl;
this.vE.settingsVkeyPlaceholder = response.data.settings_vkey_placeholder; this.vE.settingsVkeyPlaceholder = response.data.settings_vkey_placeholder;
this.vE.settingsConfirmPayments = response.data.settings_confirm_payments; this.vE.settingsConfirmPayments = response.data.settings_confirm_payments;
this.vE.settingsCloseBtn = response.data.settings_close_btn; this.vE.settingsCloseBtn = response.data.settings_close_btn;
this.vE.settingsSaveBtn = response.data.settings_save_btn; this.vE.settingsSaveBtn = response.data.settings_save_btn;
this.vE.settingsTabIntegrations = response.data.settings_tab_integrations; this.vE.settingsTabIntegrations = response.data.settings_tab_integrations;
this.vE.settingsXeroLbl = response.data.settings_xero_lbl; this.vE.settingsXeroLbl = response.data.settings_xero_lbl;
this.vE.settingsLink2Xero = response.data.settings_link_2xero; this.vE.settingsLink2Xero = response.data.settings_link_2xero;
this.vE.settingsRelink2Xero = response.data.settings_relink_2xero; this.vE.settingsRelink2Xero = response.data.settings_relink_2xero;
this.vE.settingsXeropmtConfirmdis = response.data.settings_xeropmt_confirmdis; this.vE.settingsXeropmtConfirmdis = response.data.settings_xeropmt_confirmdis;
this.vE.settingsNotservClose = response.data.settings_notserv_close; this.vE.settingsNotservClose = response.data.settings_notserv_close;
this.vE.settingsNotservWarning = response.data.settings_notserv_warning; this.vE.settingsNotservWarning = response.data.settings_notserv_warning;
this.vE.settingsPmtservURL = response.data.settings_pmtserv_url; this.vE.settingsPmtservURL = response.data.settings_pmtserv_url;
this.vE.settingsAcodeLbl = response.data.settings_acode_lbl; this.vE.settingsAcodeLbl = response.data.settings_acode_lbl;
this.vE.settingsXeroClosebtn = response.data.settings_xero_closebtn; this.vE.settingsXeroClosebtn = response.data.settings_xero_closebtn;
this.vE.settingsXeroSavebtn = response.data.settings_xero_savebtn; this.vE.settingsXeroSavebtn = response.data.settings_xero_savebtn;
this.vE.settingsWCLbl = response.data.settings_wc_lbl; this.vE.settingsWCLbl = response.data.settings_wc_lbl;
this.vE.settingsWCGentoken = response.data.settings_wc_gentoken; this.vE.settingsWCGentoken = response.data.settings_wc_gentoken;
this.vE.settingsWCOwnerlbl = response.data.settings_wc_ownerlbl; this.vE.settingsWCOwnerlbl = response.data.settings_wc_ownerlbl;
this.vE.settingsWCClosebtn = response.data.settings_wc_closebtn; this.vE.settingsWCClosebtn = response.data.settings_wc_closebtn;
this.vE.settingsURLCopied = response.data.settings_url_copied; this.vE.settingsURLCopied = response.data.settings_url_copied;
this.vE.settingsNotservSuccess = response.data.settings_notserv_success; this.vE.settingsNotservSuccess = response.data.settings_notserv_success;
this.vE.settingsNotservError = response.data.settings_notserv_error; this.vE.settingsNotservError = response.data.settings_notserv_error;
this.vE.settingsCopyNotavail = response.data.settings_copy_notavail; this.vE.settingsCopyNotavail = response.data.settings_copy_notavail;
this.vE.settingsOwneridCopied = response.data.settings_ownerid_copied; this.vE.settingsOwneridCopied = response.data.settings_ownerid_copied;
this.vE.settingsOwneridNotcopied = response.data.settings_ownerid_notcopied; this.vE.settingsOwneridNotcopied = response.data.settings_ownerid_notcopied;
this.vE.settingsWCTokenCopied = response.data.settings_wctoken_copied; this.vE.settingsWCTokenCopied = response.data.settings_wctoken_copied;
this.vE.settingsWCTokenNotcopied = response.data.settings_wctoken_notcopied; this.vE.settingsWCTokenNotcopied = response.data.settings_wctoken_notcopied;
this.vE.settingsWCTokenGenerated = response.data.settings_wctoken_generated; this.vE.settingsWCTokenGenerated = response.data.settings_wctoken_generated;
this.vE.settingsWCTokenGenfail = response.data.settings_wctoken_genfail; this.vE.settingsWCTokenGenfail = response.data.settings_wctoken_genfail;
this.vE.settingsAcodeSaved = response.data.settings_acode_saved; this.vE.settingsAcodeSaved = response.data.settings_acode_saved;
this.vE.settingsAcodeNotsaved = response.data.settings_acode_notsaved; this.vE.settingsAcodeNotsaved = response.data.settings_acode_notsaved;
this.vE.settingsAcodeInvalid = response.data.settings_acode_invalid; this.vE.settingsAcodeInvalid = response.data.settings_acode_invalid;
// //
this.languageRdy.next(true); this.languageRdy.next(true);
}, },
error => { console.log('Error >> ',error); } error: error => { console.log('Error >> ',error); }
); });
} }
} }

View file

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

View file

@ -1,17 +1,15 @@
import { Component, OnInit, OnDestroy } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { CanActivate, Router, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router'; import { Router } from '@angular/router';
import { MatDialog, MatDialogConfig } from '@angular/material/dialog'; import { MatDialog, MatDialogConfig } from '@angular/material/dialog';
import { UserService } from '../user.service'; import { UserService } from '../user.service';
import { FullnodeService } from '../fullnode.service'; import { FullnodeService } from '../fullnode.service';
import { ItemService } from '../items/items.service'; import { Observable } from 'rxjs';
import { Subscription, Observable } from 'rxjs';
import { SettingsComponent } from '../settings/settings.component'; import { SettingsComponent } from '../settings/settings.component';
import {Owner} from '../owner.model'; import {Owner} from '../owner.model';
import {User} from '../user.model'; import {User} from '../user.model';
import { LanguageService } from '../language.service'; import { LanguageService } from '../language.service';
import { LanguageData } from '../language.model';
@Component({ @Component({
selector: 'app-viewer', selector: 'app-viewer',
@ -38,23 +36,13 @@ export class ViewerComponent implements OnInit {
taxValue: 0, taxValue: 0,
vat: false, vat: false,
vatValue: 0, vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false, paid: false,
website: '',
country: '',
zats: false, zats: false,
invoices: false, invoices: false,
expiration: new Date(Date.now()).toISOString(), expiration: new Date(Date.now()).toISOString(),
payconf: false, payconf: false,
viewkey: '', crmToken: '',
crmToken: '' viewkey: ''
}; };
public price: number = 1; public price: number = 1;
public addrUpdate: Observable<string>; public addrUpdate: Observable<string>;
@ -127,13 +115,13 @@ export class ViewerComponent implements OnInit {
dialogConfig.disableClose = true; dialogConfig.disableClose = true;
dialogConfig.autoFocus = true; dialogConfig.autoFocus = true;
dialogConfig.data = this.owner; dialogConfig.data = {o: this.owner};
const dialogRef = this.dialog.open(SettingsComponent, dialogConfig); const dialogRef = this.dialog.open(SettingsComponent, dialogConfig);
dialogRef.afterClosed().subscribe((val) => { dialogRef.afterClosed().subscribe((val) => {
if (val != null) { if (val != null) {
//console.log('Saving settings', val); //console.log('Saving settings', val);
this.userService.addOwner(val); this.userService.saveOwnerSettings(val);
this.fullnodeService.getPrice(val.currency); this.fullnodeService.getPrice(val.currency);
this.loginCheck(); this.loginCheck();
} }
@ -148,7 +136,7 @@ export class ViewerComponent implements OnInit {
this.user = user; this.user = user;
//console.log('Viewer loginCheck', this.user); //console.log('Viewer loginCheck', this.user);
if (!this.owner.paid || !this.user.validated) { if (!this.owner.paid || !this.user.validated) {
console.log('Log in expired!'); //console.log('Log in expired!');
this.router.navigate(['/login']); this.router.navigate(['/login']);
} }
}); });
@ -156,18 +144,18 @@ export class ViewerComponent implements OnInit {
} }
chgUILanguage(){ chgUILanguage(){
console.log('VIEWER.chgUILanguage Called '); //console.log('VIEWER.chgUILanguage Called ');
this.languageService.getViewElements('viewer').subscribe( this.languageService.getViewElements('viewer').subscribe({
response => { next: response => {
console.log('Received >> ', response ); //console.log('Received >> ', response );
console.log('Language Code : ', response.language); //console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component); //console.log('Component Name : ',response.component);
console.log('Language data : ',response.data); //console.log('Language data : ',response.data);
this.vE.viewerViewOrders = response.data.viewer_view_orders; this.vE.viewerViewOrders = response.data.viewer_view_orders;
}, },
error => { console.log('Error >> ',error); } error: error => { console.log('Error >> ',error); }
); });
} }
} }

View file

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

View file

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

View file

@ -6,7 +6,6 @@ import { Owner } from '../owner.model';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { LanguageService } from '../language.service'; import { LanguageService } from '../language.service';
import { LanguageData } from '../language.model';
var Buffer = require('buffer/').Buffer; var Buffer = require('buffer/').Buffer;
@ -27,6 +26,7 @@ async function redirect(r: Router) {
export class XeroRegComponent implements OnInit { export class XeroRegComponent implements OnInit {
public owner:Owner = { public owner:Owner = {
_id: '',
address: '', address: '',
name: '', name: '',
currency: '', currency: '',
@ -34,23 +34,13 @@ export class XeroRegComponent implements OnInit {
taxValue:0, taxValue:0,
vat: false, vat: false,
vatValue: 0, vatValue: 0,
first: '',
last: '',
email: '',
street: '',
city: '',
state: '',
postal: '',
phone: '',
paid: false, paid: false,
website: '',
country: '',
zats: false, zats: false,
invoices: false, invoices: false,
expiration: new Date(Date.now()).toISOString(), expiration: new Date(Date.now()).toISOString(),
payconf: false, payconf: false,
viewkey: '', crmToken: '',
crmToken: '' viewkey: ''
}; };
public ownerUpdate:Observable<Owner>; public ownerUpdate:Observable<Owner>;
public flag: boolean = false; public flag: boolean = false;
@ -85,15 +75,15 @@ export class XeroRegComponent implements OnInit {
this.ownerUpdate.subscribe((owner) => { this.ownerUpdate.subscribe((owner) => {
this.owner = owner; this.owner = owner;
this.activatedRoute.queryParams.subscribe((params) => { this.activatedRoute.queryParams.subscribe((params) => {
console.log(params); //console.log(params);
if (params.state === this.owner.address.substring(0,6)) { if (params.state === this.owner.address.substring(0,6)) {
this.xeroService.getXeroAccessToken(params.code, this.owner.address).subscribe(tokenData => { this.xeroService.getXeroAccessToken(params.code).subscribe(tokenData => {
if (tokenData.status == 200) { if (tokenData.status == 200) {
console.log(tokenData.body!); //console.log(tokenData.body!);
this.flag = true; this.flag = true;
redirect(this.router); redirect(this.router);
} else { } else {
console.log('Error: '+tokenData.status); //console.log('Error: '+tokenData.status);
this.flag = false; this.flag = false;
} }
}); });
@ -106,20 +96,20 @@ export class XeroRegComponent implements OnInit {
} }
chgUILanguage(){ chgUILanguage(){
console.log('XERO.chgUILanguage Called '); //console.log('XERO.chgUILanguage Called ');
this.languageService.getViewElements('xero').subscribe( this.languageService.getViewElements('xero').subscribe({
response => { next: response => {
console.log('Received >> ', response ); //console.log('Received >> ', response );
console.log('Language Code : ', response.language); //console.log('Language Code : ', response.language);
console.log('Component Name : ',response.component); //console.log('Component Name : ',response.component);
console.log('Language data : ',response.data); //console.log('Language data : ',response.data);
this.vE.xeroConnecting2xero = response.data.xero_connecting_2xero; this.vE.xeroConnecting2xero = response.data.xero_connecting_2xero;
this.vE.xeroConnected2xero = response.data.xero_connected_2xero; this.vE.xeroConnected2xero = response.data.xero_connected_2xero;
}, },
error => { console.log('Error >> ',error); } error: error => { console.log('Error >> ',error); }
); });
} }
} }

View file

@ -2,7 +2,7 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>Z-Go!</title> <title>ZGo - The Zcash Register</title>
<base href="/"> <base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico"> <link rel="icon" type="image/x-icon" href="favicon.ico">

View file

@ -6,7 +6,7 @@
"outDir": "./dist/out-tsc", "outDir": "./dist/out-tsc",
"forceConsistentCasingInFileNames": true, "forceConsistentCasingInFileNames": true,
"strict": true, "strict": true,
"noImplicitReturns": true, "noImplicitReturns": false,
"noFallthroughCasesInSwitch": true, "noFallthroughCasesInSwitch": true,
"sourceMap": true, "sourceMap": true,
"declaration": false, "declaration": false,