Commit 5b96c077809eb2aed62ea310fca135620fc72ee1

Authored by Marcelo Puebla
1 parent 3fe8e18ec7
Exists in develop

Add

Modal de advertencia de producto sin stock
src/app/modules/seleccion-articulos/no-stock/no-stock.component.html
File was created 1 <div class="bg-primary rounded">
2 <div class="modal-body">
3 <img
4 draggable="false"
5 ondragstart="return false;"
6 (contextmenu)="false"
7 (click)="close()"
8 class="btn-effect icon-30 mt-2 mr-2 position-absolute top-0 right-0 z-index"
9 src="assets/img/icono-cancelar-blanco.svg">
10 <div class="row mx-0 my-2">
11 <img
12 draggable="false"
13 ondragstart="return false;"
14 (contextmenu)="false"
15 class="d-block mx-auto icon-60"
16 src="assets/img/sin-stock-2.svg">
17 <div class="col-12 py-3">
18 <p class="text-white text-center h4">
19 Disculpá, este articulo no está disponible por el momento
20 </p>
21 </div>
22 </div>
23 </div>
24 </div>
25
src/app/modules/seleccion-articulos/no-stock/no-stock.component.scss
src/app/modules/seleccion-articulos/no-stock/no-stock.component.spec.ts
File was created 1 import { async, ComponentFixture, TestBed } from '@angular/core/testing';
2
3 import { NoStockComponent } from './no-stock.component';
4
5 describe('NoStockComponent', () => {
6 let component: NoStockComponent;
7 let fixture: ComponentFixture<NoStockComponent>;
8
9 beforeEach(async(() => {
10 TestBed.configureTestingModule({
11 declarations: [ NoStockComponent ]
12 })
13 .compileComponents();
14 }));
15
16 beforeEach(() => {
17 fixture = TestBed.createComponent(NoStockComponent);
18 component = fixture.componentInstance;
19 fixture.detectChanges();
20 });
21
22 it('should create', () => {
23 expect(component).toBeTruthy();
24 });
25 });
26
src/app/modules/seleccion-articulos/no-stock/no-stock.component.ts
File was created 1 import { Component, OnInit } from '@angular/core';
2 import { BsModalRef } from 'ngx-bootstrap/modal';
3 import { Subject } from 'rxjs';
4
5 @Component({
6 selector: 'app-no-stock',
7 templateUrl: './no-stock.component.html',
8 styleUrls: ['./no-stock.component.scss']
9 })
10 export class NoStockComponent implements OnInit {
11 onClose: Subject<any>;
12
13 constructor(
14 private modalRef: BsModalRef,
15 ) {
16 this.onClose = new Subject();
17 }
18
19 ngOnInit() {
20 }
21
22 close() {
23 this.onClose.next();
24 this.modalRef.hide();
25 }
26
27 }
28
src/app/modules/seleccion-articulos/seleccion-articulos.component.ts
1 import { Component, OnInit, OnDestroy, HostListener, ViewChild, AfterViewInit } from '@angular/core'; 1 import { Component, OnInit, OnDestroy, HostListener, ViewChild, AfterViewInit } from '@angular/core';
2 import { BsModalRef, BsModalService } from 'ngx-bootstrap/modal'; 2 import { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';
3 import { ArticuloService } from 'src/app/services/articulo/articulo.service'; 3 import { ArticuloService } from 'src/app/services/articulo/articulo.service';
4 import { IArticulo } from 'src/app/interfaces/IArticulo'; 4 import { IArticulo } from 'src/app/interfaces/IArticulo';
5 import { APP_SETTINGS } from 'src/etc/AppSettings'; 5 import { APP_SETTINGS } from 'src/etc/AppSettings';
6 import { ICategoria } from 'src/app/interfaces/ICategoria'; 6 import { ICategoria } from 'src/app/interfaces/ICategoria';
7 import { ISinonimo } from 'src/app/interfaces/ISinonimo'; 7 import { ISinonimo } from 'src/app/interfaces/ISinonimo';
8 import { PromocionComponent } from 'src/app/shared/promocion/promocion.component'; 8 import { PromocionComponent } from 'src/app/shared/promocion/promocion.component';
9 import { InactiveScreenService } from 'src/app/services/inactive-screen/inactive-screen.service'; 9 import { InactiveScreenService } from 'src/app/services/inactive-screen/inactive-screen.service';
10 import { SinonimoService } from 'src/app/services/sinonimo/sinonimo.service'; 10 import { SinonimoService } from 'src/app/services/sinonimo/sinonimo.service';
11 import { SinonimoComponent } from 'src/app/shared/sinonimo/sinonimo.component'; 11 import { SinonimoComponent } from 'src/app/shared/sinonimo/sinonimo.component';
12 import { FiltroCategoriasComponent } from './filtro-categorias/filtro-categorias.component'; 12 import { FiltroCategoriasComponent } from './filtro-categorias/filtro-categorias.component';
13 import * as _ from 'lodash'; 13 import * as _ from 'lodash';
14 import { ANIMATIONS } from 'src/app/utils/animations'; 14 import { ANIMATIONS } from 'src/app/utils/animations';
15 import { NoStockComponent } from './no-stock/no-stock.component';
15 16
16 @Component({ 17 @Component({
17 selector: 'app-seleccion-articulos', 18 selector: 'app-seleccion-articulos',
18 templateUrl: './seleccion-articulos.component.html', 19 templateUrl: './seleccion-articulos.component.html',
19 styleUrls: ['./seleccion-articulos.component.scss'], 20 styleUrls: ['./seleccion-articulos.component.scss'],
20 animations: [ANIMATIONS.EnterLeaveY] 21 animations: [ANIMATIONS.EnterLeaveY]
21 }) 22 })
22 export class SeleccionArticulosComponent implements OnInit, AfterViewInit, OnDestroy { 23 export class SeleccionArticulosComponent implements OnInit, AfterViewInit, OnDestroy {
23 loading = true; 24 loading = true;
24 timeoutHandler: any; 25 timeoutHandler: any;
25 urlImagenes = `${APP_SETTINGS.apiImagenes}/imagenes/`; 26 urlImagenes = `${APP_SETTINGS.apiImagenes}/imagenes/`;
26 articulos: IArticulo[] = []; 27 articulos: IArticulo[] = [];
27 auxArticulos: IArticulo[] = []; 28 auxArticulos: IArticulo[] = [];
28 showQuantity = 100; 29 showQuantity = 100;
29 searchTerm = ''; 30 searchTerm = '';
30 ordenandoByVendidos = true; 31 ordenandoByVendidos = true;
31 modalRef: BsModalRef; 32 modalRef: BsModalRef;
32 total = 0; 33 total = 0;
33 @ViewChild(FiltroCategoriasComponent, { static: false }) filtroCategorias: FiltroCategoriasComponent; 34 @ViewChild(FiltroCategoriasComponent, { static: false }) filtroCategorias: FiltroCategoriasComponent;
34 35
35 constructor( 36 constructor(
36 public articuloService: ArticuloService, 37 public articuloService: ArticuloService,
37 private sinonimoService: SinonimoService, 38 private sinonimoService: SinonimoService,
38 private modalService: BsModalService, 39 private modalService: BsModalService,
39 private inactiveScreen: InactiveScreenService, 40 private inactiveScreen: InactiveScreenService,
40 ) { } 41 ) { }
41 42
42 ngOnInit() { } 43 ngOnInit() { }
43 44
44 ngAfterViewInit(): void { 45 ngAfterViewInit(): void {
45 this.filtroCategorias.getCategorias(); 46 this.filtroCategorias.getCategorias();
46 this.mediaPantalla(); 47 this.mediaPantalla();
47 } 48 }
48 49
49 ngOnDestroy() { 50 ngOnDestroy() {
50 for (let i = 1; i <= this.modalService.getModalsCount(); i++) { 51 for (let i = 1; i <= this.modalService.getModalsCount(); i++) {
51 this.modalService.hide(i); 52 this.modalService.hide(i);
52 } 53 }
53 } 54 }
54 55
55 getProductos() { 56 getProductos() {
56 this.articuloService.getAll() 57 this.articuloService.getAll()
57 .subscribe((result: IArticulo[]) => { 58 .subscribe((result: IArticulo[]) => {
58 this.articuloService.setArticulosSinImagen(result); 59 this.articuloService.setArticulosSinImagen(result);
59 if (this.filtroCategorias.queMostrar === 'ordenar') { 60 if (this.filtroCategorias.queMostrar === 'ordenar') {
60 this.filtroCategorias.categorias.forEach((categoria: ICategoria) => { 61 this.filtroCategorias.categorias.forEach((categoria: ICategoria) => {
61 const tempArticulos = result.filter((articulo: IArticulo) => { 62 const tempArticulos = result.filter((articulo: IArticulo) => {
62 return articulo.categoria_selfservice === categoria.id; 63 return articulo.categoria_selfservice === categoria.id;
63 }); 64 });
64 result = tempArticulos; 65 result = tempArticulos;
65 }); 66 });
66 } 67 }
67 localStorage.setItem('articulos', JSON.stringify(result)); 68 localStorage.setItem('articulos', JSON.stringify(result));
68 this.setProductos(); 69 this.setProductos();
69 }, (error) => { 70 }, (error) => {
70 console.error(error); 71 console.error(error);
71 }); 72 });
72 } 73 }
73 74
74 setProductos() { 75 setProductos() {
75 this.articulos = JSON.parse(localStorage.getItem('articulos')); 76 this.articulos = JSON.parse(localStorage.getItem('articulos'));
76 this.filterItems(); 77 this.filterItems();
77 this.loading = false; 78 this.loading = false;
78 } 79 }
79 80
80 filterItems() { 81 filterItems() {
81 if (this.filtroCategorias.categoriaActive === 0) { 82 if (this.filtroCategorias.categoriaActive === 0) {
82 this.auxArticulos = this.articulos; 83 this.auxArticulos = this.articulos;
83 return; 84 return;
84 } 85 }
85 this.auxArticulos = this.articulos.filter(x => { 86 this.auxArticulos = this.articulos.filter(x => {
86 return x.categoria_selfservice === this.filtroCategorias.categoriaActive; 87 return x.categoria_selfservice === this.filtroCategorias.categoriaActive;
87 }); 88 });
88 this.ordenar(); 89 this.ordenar();
89 } 90 }
90 91
91 ordenar() { 92 ordenar() {
92 if (this.ordenandoByVendidos) { 93 if (this.ordenandoByVendidos) {
93 this.auxArticulos.sort((a, b) => { 94 this.auxArticulos.sort((a, b) => {
94 return b.cantidadVendida - a.cantidadVendida; 95 return b.cantidadVendida - a.cantidadVendida;
95 }); 96 });
96 } 97 }
97 } 98 }
98 99
99 selectArticulo(articulo: IArticulo) { 100 selectArticulo(articulo: IArticulo) {
101 if (articulo.ExiVta < 1) {
102 if (this.modalRef) return;
103 this.modalRef = this.modalService.show(NoStockComponent, {
104 class: 'modal-dialog-centered',
105 backdrop: false,
106 ignoreBackdropClick: true,
107 });
108 this.modalRef.content.onClose
109 .subscribe(() => this.modalRef = null);
110 }
100 this.getByID(articulo.id); 111 this.getByID(articulo.id);
101 } 112 }
102 113
103 getByID(id: number) { 114 getByID(id: number) {
104 this.articuloService.getById(id) 115 this.articuloService.getById(id)
105 .subscribe((res: IArticulo) => { 116 .subscribe((res: IArticulo) => {
106 if (res.FPP) { 117 if (res.FPP) {
107 this.openModalPromos(res); 118 this.openModalPromos(res);
108 } else { 119 } else {
109 this.getSinonimos(res); 120 this.getSinonimos(res);
110 } 121 }
111 }, err => console.error(err)); 122 }, err => console.error(err));
112 } 123 }
113 124
114 getSinonimos(articulo: IArticulo) { 125 getSinonimos(articulo: IArticulo) {
115 this.sinonimoService.getSinonimos(articulo.CodSec, articulo.CodArt) 126 this.sinonimoService.getSinonimos(articulo.CodSec, articulo.CodArt)
116 .subscribe((res: any[]) => { 127 .subscribe((res: any[]) => {
117 if (res.length) { 128 if (res.length) {
118 const sinonimos = []; 129 const sinonimos = [];
119 const gruposArticulos = _.groupBy(res[0].productos, 'ID_SIN'); 130 const gruposArticulos = _.groupBy(res[0].productos, 'ID_SIN');
120 Object.keys(gruposArticulos).forEach((key, i) => { 131 Object.keys(gruposArticulos).forEach((key, i) => {
121 sinonimos.push({ productos: gruposArticulos[key], }); 132 sinonimos.push({ productos: gruposArticulos[key], });
122 for (const a of articulo.productos) { 133 for (const a of articulo.productos) {
123 if (key === a.idSinonimo.toString()) { 134 if (key === a.idSinonimo.toString()) {
124 sinonimos[i].cantidad = sinonimos[i].cantidadRestante = a.cantidad; 135 sinonimos[i].cantidad = sinonimos[i].cantidadRestante = a.cantidad;
125 continue; 136 continue;
126 } 137 }
127 } 138 }
128 }); 139 });
129 res = sinonimos; 140 res = sinonimos;
130 this.openModalSinonimos(res, articulo); 141 this.openModalSinonimos(res, articulo);
131 } else { 142 } else {
132 this.articuloService.setArticulo(articulo); 143 this.articuloService.setArticulo(articulo);
133 } 144 }
134 }); 145 });
135 } 146 }
136 147
137 openModalPromos(articulo: IArticulo) { 148 openModalPromos(articulo: IArticulo) {
138 if (this.modalRef) return; 149 if (this.modalRef) return;
139 this.articuloService.setArticulosSinImagen([articulo]); 150 this.articuloService.setArticulosSinImagen([articulo]);
140 this.modalRef = this.modalService.show(PromocionComponent, { 151 this.modalRef = this.modalService.show(PromocionComponent, {
141 initialState: { articulosPromo: [articulo] }, 152 initialState: { articulosPromo: [articulo] },
142 class: 'modal-dialog-centered', 153 class: 'modal-dialog-centered',
143 ignoreBackdropClick: true, 154 ignoreBackdropClick: true,
144 }); 155 });
145 this.modalRef.content.onClose 156 this.modalRef.content.onClose
146 .subscribe(() => this.modalRef = null); 157 .subscribe(() => this.modalRef = null);
147 this.mediaPantalla(); 158 this.mediaPantalla();
148 } 159 }
149 160
150 openModalSinonimos(sinonimosData: ISinonimo[], articulo: IArticulo) { 161 openModalSinonimos(sinonimosData: ISinonimo[], articulo: IArticulo) {
151 if (this.modalRef) return; 162 if (this.modalRef) return;
152 this.modalRef = this.modalService.show(SinonimoComponent, { 163 this.modalRef = this.modalService.show(SinonimoComponent, {
153 initialState: { 164 initialState: {
154 sinonimos: sinonimosData, 165 sinonimos: sinonimosData,
155 articulo 166 articulo
156 }, 167 },
157 class: 'modal-dialog-centered', 168 class: 'modal-dialog-centered',
158 ignoreBackdropClick: true, 169 ignoreBackdropClick: true,
159 }); 170 });
160 171
161 this.modalRef.content.onClose 172 this.modalRef.content.onClose
162 .subscribe((res: any) => { 173 .subscribe((res: any) => {
163 this.modalRef = null; 174 this.modalRef = null;
164 if (!res) return; 175 if (!res) return;
165 articulo.productos = res.articulos; 176 articulo.productos = res.articulos;
166 this.articuloService.setArticulo(articulo); 177 this.articuloService.setArticulo(articulo);
167 }); 178 });
168 this.mediaPantalla(); 179 this.mediaPantalla();
169 } 180 }
170 181
171 deleteArticulo(index: number) { 182 deleteArticulo(index: number) {
172 this.articuloService.deleteArticulo(index); 183 this.articuloService.deleteArticulo(index);
173 } 184 }
174 185
175 increaseShow() { 186 increaseShow() {
176 this.showQuantity += 100; 187 this.showQuantity += 100;
177 } 188 }
178 189
179 @HostListener('scroll', ['$event']) 190 @HostListener('scroll', ['$event'])
180 scrollEvent(event: Event) { 191 scrollEvent(event: Event) {
181 clearTimeout(this.inactiveScreen.timerReposo); 192 clearTimeout(this.inactiveScreen.timerReposo);
182 this.inactiveScreen.startTimeOutInactividad(); 193 this.inactiveScreen.startTimeOutInactividad();
183 } 194 }
184 195
185 mouseup() { 196 mouseup() {
186 if (!this.timeoutHandler) return; 197 if (!this.timeoutHandler) return;
187 clearInterval(this.timeoutHandler); 198 clearInterval(this.timeoutHandler);
188 } 199 }
189 200
190 scrollY(el: HTMLElement, value) { 201 scrollY(el: HTMLElement, value) {
191 el.scroll({ behavior: 'smooth', top: value + el.scrollTop }); 202 el.scroll({ behavior: 'smooth', top: value + el.scrollTop });
192 this.timeoutHandler = setInterval(() => { 203 this.timeoutHandler = setInterval(() => {
193 el.scroll({ behavior: 'smooth', top: value + el.scrollTop }); 204 el.scroll({ behavior: 'smooth', top: value + el.scrollTop });
194 }, 500); 205 }, 500);
195 } 206 }
196 207
197 scrollX(el: HTMLElement, value) { 208 scrollX(el: HTMLElement, value) {
198 el.scroll({ behavior: 'smooth', left: value + el.scrollLeft }); 209 el.scroll({ behavior: 'smooth', left: value + el.scrollLeft });
199 this.timeoutHandler = setInterval(() => { 210 this.timeoutHandler = setInterval(() => {
200 el.scroll({ behavior: 'smooth', left: value + el.scrollLeft }); 211 el.scroll({ behavior: 'smooth', left: value + el.scrollLeft });
201 }, 500); 212 }, 500);
202 } 213 }
203 214
204 mediaPantalla() { 215 mediaPantalla() {
205 if ($('body').hasClass('media-pantalla')) { 216 if ($('body').hasClass('media-pantalla')) {
206 $(`.cat-content,#cat-content,#content,.cat-btn,#boxCarrito, 217 $(`.cat-content,#cat-content,#content,.cat-btn,#boxCarrito,
207 .cat-box,.img-categoria, .modal-content`) 218 .cat-box,.img-categoria, .modal-content`)
208 .addClass('media-pantalla') 219 .addClass('media-pantalla')
209 .addBack('media-pantalla'); 220 .addBack('media-pantalla');
210 } 221 }
211 } 222 }
212 } 223 }
213 224
src/app/modules/seleccion-articulos/seleccion-articulos.module.ts
1 import { NgModule } from '@angular/core'; 1 import { NgModule } from '@angular/core';
2 import { CommonModule } from '@angular/common'; 2 import { CommonModule } from '@angular/common';
3 import { SeleccionArticulosRoutingModule } from './seleccion-articulos-routing.module'; 3 import { SeleccionArticulosRoutingModule } from './seleccion-articulos-routing.module';
4 import { SeleccionArticulosComponent } from './seleccion-articulos.component'; 4 import { SeleccionArticulosComponent } from './seleccion-articulos.component';
5 import { HeaderPublicidadComponent } from 'src/app/shared/header-publicidad/header-publicidad.component'; 5 import { HeaderPublicidadComponent } from 'src/app/shared/header-publicidad/header-publicidad.component';
6 import { ModalModule } from 'ngx-bootstrap/modal'; 6 import { ModalModule } from 'ngx-bootstrap/modal';
7 import { CarouselModule } from 'ngx-bootstrap/carousel'; 7 import { CarouselModule } from 'ngx-bootstrap/carousel';
8 import { PromocionComponent } from 'src/app/shared/promocion/promocion.component'; 8 import { PromocionComponent } from 'src/app/shared/promocion/promocion.component';
9 import { SharedModule } from '../shared/shared.module'; 9 import { SharedModule } from '../shared/shared.module';
10 import { SinonimoComponent } from 'src/app/shared/sinonimo/sinonimo.component'; 10 import { SinonimoComponent } from 'src/app/shared/sinonimo/sinonimo.component';
11 import { FormsModule } from '@angular/forms'; 11 import { FormsModule } from '@angular/forms';
12 import { ConfirmacionComponent } from 'src/app/shared/confirmacion/confirmacion.component'; 12 import { ConfirmacionComponent } from 'src/app/shared/confirmacion/confirmacion.component';
13 import { ArticuloCantidadComponent } from 'src/app/shared/articulo-cantidad/articulo-cantidad.component'; 13 import { ArticuloCantidadComponent } from 'src/app/shared/articulo-cantidad/articulo-cantidad.component';
14 import { FiltroCategoriasComponent } from './filtro-categorias/filtro-categorias.component'; 14 import { FiltroCategoriasComponent } from './filtro-categorias/filtro-categorias.component';
15 import { NoStockComponent } from './no-stock/no-stock.component';
15 16
16 @NgModule({ 17 @NgModule({
17 declarations: [ 18 declarations: [
18 SeleccionArticulosComponent, 19 SeleccionArticulosComponent,
19 HeaderPublicidadComponent, 20 HeaderPublicidadComponent,
20 PromocionComponent, 21 PromocionComponent,
21 SinonimoComponent, 22 SinonimoComponent,
22 ConfirmacionComponent, 23 ConfirmacionComponent,
23 ArticuloCantidadComponent, 24 ArticuloCantidadComponent,
24 FiltroCategoriasComponent, 25 FiltroCategoriasComponent,
26 NoStockComponent,
25 ], 27 ],
26 imports: [ 28 imports: [
27 CommonModule, 29 CommonModule,
28 SeleccionArticulosRoutingModule, 30 SeleccionArticulosRoutingModule,
29 FormsModule, 31 FormsModule,
30 ModalModule.forRoot(), 32 ModalModule.forRoot(),
31 CarouselModule.forRoot(), 33 CarouselModule.forRoot(),
32 SharedModule 34 SharedModule
33 ], 35 ],
34 exports: [HeaderPublicidadComponent, ArticuloCantidadComponent], 36 exports: [HeaderPublicidadComponent, ArticuloCantidadComponent],
35 entryComponents: [PromocionComponent, ConfirmacionComponent, SinonimoComponent] 37 entryComponents: [PromocionComponent, ConfirmacionComponent, SinonimoComponent, NoStockComponent]
36 }) 38 })
37 export class SeleccionArticulosModule { } 39 export class SeleccionArticulosModule { }
38 40
src/assets/img/sin-stock-2.svg
File was created 1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3 <!-- Creator: CorelDRAW X7 -->
4 <svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="10.5274mm" height="10.5274mm" version="1.1" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
5 viewBox="0 0 733 733"
6 xmlns:xlink="http://www.w3.org/1999/xlink">
7 <defs>
8 <style type="text/css">
9 <![CDATA[
10 .fil0 {fill:#F4B223}
11 ]]>
12 </style>
13 </defs>
14 <g id="Capa_x0020_1">
15 <metadata id="CorelCorpID_0Corel-Layer"/>
16 <path class="fil0" d="M360 592l7 0 191 -108 0 -237c-11,-6 -182,-99 -191,-107l-6 0 -191 107 -1 237c35,19 64,36 96,53l95 55zm179 -367l76 -76c50,58 81,134 81,217 0,183 -147,330 -330,330 -83,0 -159,-31 -217,-81l83 -83c-11,-6 -21,-12 -32,-18l-76 76c-54,-59 -87,-137 -87,-224 0,-182 147,-329 329,-329 87,0 165,33 224,87l-84 84c12,6 23,12 33,17zm-173 508c-202,0 -366,-164 -366,-367 0,-202 164,-366 366,-366 203,0 367,164 367,366 0,203 -164,367 -367,367zm8 -372l0 203c13,-5 29,-16 41,-22 20,-11 111,-64 123,-68l0 -203c-9,2 -31,17 -41,22 -19,10 -112,64 -123,68zm-184 113c12,4 28,15 40,22l124 68 0 -204c-14,-4 -102,-55 -122,-67 -12,-6 -30,-18 -43,-22l1 203zm11 -221c10,8 43,24 57,32 21,13 20,4 60,-17 16,-9 109,-60 116,-67 -19,-11 -37,-21 -57,-32 -19,-10 -18,-5 -59,19l-117 65zm93 52l58 33c17,9 12,7 29,-3l145 -82 -57 -32c-16,-10 -13,-8 -29,1l-87 49c-7,3 -53,28 -59,34zm159 42c-8,2 -54,30 -57,35 -3,8 -1,36 -1,45 0,14 -4,36 15,30 4,-2 23,-15 29,-18 7,-4 24,-12 26,-19 2,-5 1,-37 1,-45 0,-11 2,-33 -13,-28zm-38 45l0 37c38,-18 31,-16 31,-54 -11,4 -20,11 -31,17z"/>
17 </g>
18 </svg>
19