Skip to content

Commit 35f0b08

Browse files
committed
feat: add continue scanner
1 parent d2fd11f commit 35f0b08

6 files changed

Lines changed: 130 additions & 9 deletions

File tree

src/app/afip/afip.component.html

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
<div class="row mb-2">
2-
<div class="col-12">
3-
<button mat-raised-button color="primary" class="w-100" (click)="scanQR()">Escanear QR</button>
2+
<div class="col-12" *ngIf="!globals.scanContinue">
3+
<button mat-raised-button color="primary" class="w-100" (click)="scanQR()">
4+
Escanear QR
5+
</button>
6+
</div>
7+
<div class="col-12" *ngIf="globals.scanContinue">
8+
<button mat-raised-button color="primary" class="w-100" (click)="scanQRContinue()">
9+
Escanear QR ∞
10+
</button>
411
</div>
512
</div>
613
<div class="row mb-2">

src/app/afip/afip.component.ts

Lines changed: 103 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { MatDialog, MAT_DIALOG_DATA } from '@angular/material/dialog';
55
import { BarcodeScanner } from '@awesome-cordova-plugins/barcode-scanner/ngx';
66
import { HttpClient } from '@angular/common/http';
77

8+
import { Globals } from '../app.globals';
9+
810
import { Filesystem, Directory, Encoding } from '@capacitor/filesystem';
911
import { FileOpener } from '@ionic-native/file-opener/ngx';
1012

@@ -42,7 +44,10 @@ export class AfipComponent implements OnInit {
4244
expandedElement: InvoiceElement | null | undefined;
4345
@ViewChild(MatTable) table: MatTable<InvoiceElement> | undefined;
4446

47+
globals = Globals;
4548
loading = false;
49+
qrs: any = [];
50+
qrErrors: any = [];
4651

4752
constructor(private barcodeScanner: BarcodeScanner, public dialog: MatDialog, private http: HttpClient) { }
4853

@@ -55,7 +60,23 @@ export class AfipComponent implements OnInit {
5560
}
5661
}
5762

58-
ngDoCheck(): void {}
63+
ngDoCheck(): void {
64+
if (this.qrs.length > 0) {
65+
console.log(this.qrs);
66+
let res = this.qrs.every((i: any) => {
67+
return i === false
68+
});
69+
if (res) {
70+
this.loading = false;
71+
this.qrs.length = 0;
72+
if (this.qrErrors.length > 0) {
73+
this.openDialog('Algunos QR de facturas tienen errores y no se pudieron importar masivamente.');
74+
this.qrErrors.length = 0;
75+
}
76+
}
77+
}
78+
this.globals = Globals;
79+
}
5980

6081
scanQR() {
6182
this.barcodeScanner.scan({
@@ -72,21 +93,45 @@ export class AfipComponent implements OnInit {
7293
});
7394
}
7495

96+
scanQRContinue() {
97+
this.barcodeScanner.scan({
98+
formats: 'QR_CODE',
99+
prompt: 'Coloque un Código QR de AFIP en el Escaner. Puede escanear todas las Facturas AFIP que desee. Al finalizar, oprima en el botón Volver.',
100+
resultDisplayDuration: 0
101+
})
102+
.then(barcodeData => {
103+
if (barcodeData.cancelled === false) {
104+
this.qrs.push(barcodeData.text);
105+
this.scanQRContinue();
106+
} else {
107+
this.processQRMassive();
108+
}
109+
}).catch(err => {
110+
alert(err);
111+
});
112+
}
113+
75114
async test() {
76115
// FA-C
77116
const urlText1 = "https://www.afip.gob.ar/fe/qr/?p=eyJ2ZXIiOjEsImZlY2hhIjoiMjAyMi0wMS0yNSIsImN1aXQiOjIwMzY3MzYyNDczLCJwdG9WdGEiOjIsInRpcG9DbXAiOjExLCJucm9DbXAiOjg4LCJpbXBvcnRlIjoyMDAwLCJtb25lZGEiOiJQRVMiLCJjdHoiOjEsInRpcG9Eb2NSZWMiOjgwLCJucm9Eb2NSZWMiOjMwNzE2NzQzMjk5LCJ0aXBvQ29kQXV0IjoiRSIsImNvZEF1dCI6NzIwNDMzMjQ5NjcwOTl9";
78117
// FA-A
79118
const urlText2 = "https://www.afip.gob.ar/fe/qr/?p=eyJ2ZXIiOiAxLCAiZmVjaGEiOiAiMjAyMi0wMi0wMSIsICJjdWl0IjogMzA3MTY3MTg1MjksICJwdG9WdGEiOiAyLCAidGlwb0NtcCI6IDEsICJucm9DbXAiOiAxNjcsICJpbXBvcnRlIjogMTgxNTAuMCwgIm1vbmVkYSI6ICJQRVMiLCAiY3R6IjogMS4wLCAidGlwb0NvZEF1dCI6ICJFIiwgImNvZEF1dCI6IDcyMDU5MDA0NTQ5NTc1LCAibnJvRG9jUmVjIjogMjAzNzAzODYwNTcsICJ0aXBvRG9jUmVjIjogODB9";
80119
// FA-B
81120
const urlText3 = "https://www.afip.gob.ar/fe/qr/?p=eyJjb2RBdXQiOjcyMDQ2MTkwMDUyNDc3LCJjdHoiOjEsImN1aXQiOjMwNzEwMTE0MTc2LCJmZWNoYSI6IjIwMjItMDEtMjMiLCJpbXBvcnRlIjo2Mzk4LjAwLCJtb25lZGEiOiJQRVMiLCJucm9DbXAiOjEwMDk3OTksIm5yb0RvY1JlYyI6MCwicHRvVnRhIjozMSwidGlwb0NtcCI6NiwidGlwb0NvZEF1dCI6IkUiLCJ0aXBvRG9jUmVjIjo5NiwidmVyIjoxfQ=="
121+
122+
// Massive Import
123+
/*this.qrs.push(urlText1);
124+
this.qrs.push(urlText2);
125+
this.qrs.push(urlText3);
126+
this.processQRMassive();*/
82127
}
83128

84129
removeInvoices(): void {
85130
this.invoices.length = 0;
86131
localStorage.setItem('invoices', JSON.stringify(this.invoices));
87132
}
88133

89-
async processQR(t: string, i: number = 0) {
134+
async processQR(t: string) {
90135
this.loading = true;
91136
const url = new URL(t);
92137
const p: any = url.searchParams.get('p');
@@ -140,6 +185,62 @@ export class AfipComponent implements OnInit {
140185
}
141186
}
142187

188+
async processQRMassive() {
189+
this.loading = true;
190+
for (let i = 0; i < this.qrs.length; i++) {
191+
const t = this.qrs[i];
192+
const url = new URL(t);
193+
const p: any = url.searchParams.get('p');
194+
let encode = p.replace(/b\'(.*)\'/, '$1').replace(/\n/g, '');
195+
const decode = decodeURIComponent(escape(atob( encode ))).replace(/\'/g, '"');
196+
const obj = JSON.parse(decode);
197+
198+
if (url.host === 'www.afip.gob.ar' || url.host === 'afip.gob.ar') {
199+
if (this.invoices.find(x => x.cae === obj.codAut) !== undefined) {
200+
this.qrErrors.push(obj.codAut);
201+
this.qrs[i] = false;
202+
} else {
203+
let newinvoice = await this.processQrFeAr(obj);
204+
this.http.get<any>('https://afip.tangofactura.com/Rest/GetContribuyenteFull?cuit=' + obj.cuit,{}).subscribe(dataE => {
205+
if (dataE.Contribuyente) {
206+
newinvoice.nameEmi = dataE.Contribuyente.nombre;
207+
if (obj.nroDocRec !== 0) {
208+
this.http.get<any>('https://afip.tangofactura.com/Rest/GetContribuyenteFull?cuit=' + obj.nroDocRec,{}).subscribe(dataR => {
209+
if (dataR.Contribuyente) {
210+
newinvoice.nameRec = dataR.Contribuyente.nombre;
211+
this.invoices.push(newinvoice);
212+
localStorage.setItem('invoices', JSON.stringify(this.invoices));
213+
if (this.table) {
214+
this.table!.renderRows();
215+
}
216+
this.qrs[i] = false;
217+
} else {}
218+
}, (err: any) => {
219+
this.qrs[i] = false;
220+
this.qrErrors.push(obj.codAut);
221+
});
222+
} else {
223+
newinvoice.nameRec = 'Consumidor Final';
224+
this.invoices.push(newinvoice);
225+
localStorage.setItem('invoices', JSON.stringify(this.invoices));
226+
if (this.table) {
227+
this.table!.renderRows();
228+
}
229+
this.qrs[i] = false;
230+
}
231+
} else {}
232+
}, (err: any) => {
233+
this.qrs[i] = false;
234+
this.qrErrors.push(obj.codAut);
235+
});
236+
}
237+
} else {
238+
this.qrs[i] = false;
239+
this.qrErrors.push('QR no es de AFIP');
240+
}
241+
}
242+
}
243+
143244
processQrFeAr(obj: any): any {
144245
if (obj.ver === '1' || obj.ver === 1) {
145246
let comp = '';

src/app/app.component.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
<mat-toolbar-row class="ps-2 pe-2">
44
<div class="container ps-0 pe-0">
55
<div class="row">
6-
<div class="col">
7-
<!--button mat-icon-button aria-label="Sidenav Menu">
8-
<mat-icon>menu</mat-icon>
9-
</button-->
6+
<div class="col text-center d-flex flex-wrap align-items-center">
7+
<mat-slide-toggle color="primary" [(ngModel)]="globals.scanContinue">
8+
9+
</mat-slide-toggle>
1010
</div>
1111
<div class="col text-center d-flex flex-wrap align-items-center codize-logo overflow-hidden position-relative">
1212
<img src="./assets/img/codize-logo.webp" class="img-fluid" />

src/app/app.component.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Component } from '@angular/core';
2+
import { Globals } from './app.globals';
23

34
@Component({
45
selector: 'app-root',
@@ -7,4 +8,7 @@ import { Component } from '@angular/core';
78
})
89
export class AppComponent {
910
title = 'codize-afip';
11+
12+
globals = Globals;
13+
1014
}

src/app/app.globals.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export class Globals {
2+
public static scanContinue = false;
3+
}

src/app/app.module.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { NgModule } from '@angular/core';
22
import { BrowserModule } from '@angular/platform-browser';
33
import { Routes, RouterModule } from '@angular/router';
44
import { HttpClientModule } from '@angular/common/http';
5+
import { FormsModule } from '@angular/forms';
56

67
import { registerLocaleData } from '@angular/common';
78
import locale from '@angular/common/locales/es-AR';
@@ -21,6 +22,8 @@ import { MatTableModule } from '@angular/material/table';
2122
import { MatIconModule } from '@angular/material/icon';
2223
import { MatDialogModule } from '@angular/material/dialog';
2324
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
25+
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
26+
import { MatInputModule } from '@angular/material/input';
2427

2528
import { AfipComponent } from './afip/afip.component';
2629
import { DialogContent } from './afip/afip.component';
@@ -43,13 +46,16 @@ const routes: Routes = [
4346
BrowserModule,
4447
BrowserAnimationsModule,
4548
RouterModule.forRoot(routes),
49+
FormsModule,
4650
HttpClientModule,
4751
MatToolbarModule,
4852
MatButtonModule,
4953
MatTableModule,
5054
MatIconModule,
5155
MatDialogModule,
52-
MatProgressSpinnerModule
56+
MatProgressSpinnerModule,
57+
MatSlideToggleModule,
58+
MatInputModule
5359
],
5460
providers: [BarcodeScanner, FileOpener],
5561
bootstrap: [AppComponent]

0 commit comments

Comments
 (0)