Commit be6c6ca48f15cd44d5f9a0a5ab54dc46bddd3df8
1 parent
8b16db8d67
Exists in
master
primera versión estable
Showing
9 changed files
with
874 additions
and
2 deletions
Show diff stats
.gitignore
1 | /node_modules | 1 | /node_modules |
2 | /package-lock.json | ||
2 | /package-lock.json | ||
3 | /dist | ||
4 | /tmp |
package.json
1 | { | 1 | { |
2 | "name": "foca-crear-factura", | 2 | "name": "foca-crear-factura", |
3 | "version": "0.0.1", | 3 | "version": "0.0.1", |
4 | "description": "", | 4 | "description": "", |
5 | "main": "index.js", | 5 | "main": "index.js", |
6 | "scripts": { | 6 | "scripts": { |
7 | "test": "echo \"Error: no test specified\" && exit 1", | 7 | "test": "echo \"Error: no test specified\" && exit 1", |
8 | "install-dev": "npm install -D jasmine-core pre-commit angular angular-ladda ladda@1.0.6 angular-route angular-cookies bootstrap ui-bootstrap4 font-awesome gulp gulp-angular-templatecache gulp-connect gulp-clean gulp-htmlmin gulp-jshint gulp-rename gulp-replace gulp-sequence gulp-uglify-es gulp-uglify jquery jshint pump" | 8 | "install-dev": "npm install -D jasmine-core pre-commit angular angular-ladda ladda@1.0.6 angular-route angular-cookies bootstrap ui-bootstrap4 font-awesome gulp gulp-angular-templatecache gulp-connect gulp-clean gulp-htmlmin gulp-jshint gulp-rename gulp-replace gulp-sequence gulp-uglify-es gulp-uglify jquery jshint pump" |
9 | }, | 9 | }, |
10 | "repository": { | 10 | "repository": { |
11 | "type": "git", | 11 | "type": "git", |
12 | "url": "http://git.focasoftware.com/npm/foca-crear-factura.git" | 12 | "url": "http://git.focasoftware.com/npm/foca-crear-factura.git" |
13 | }, | 13 | }, |
14 | "author": "Foca Software", | 14 | "author": "Foca Software", |
15 | "license": "ISC", | 15 | "license": "ISC", |
16 | "devDependencies": { | 16 | "devDependencies": { |
17 | "angular": "^1.7.8", | 17 | "angular": "^1.7.8", |
18 | "angular-cookies": "^1.7.8", | 18 | "angular-cookies": "^1.7.8", |
19 | "angular-ladda": "^0.4.3", | 19 | "angular-ladda": "^0.4.3", |
20 | "angular-route": "^1.7.8", | 20 | "angular-route": "^1.7.8", |
21 | "bootstrap": "^4.3.1", | 21 | "bootstrap": "^4.3.1", |
22 | "font-awesome": "^4.7.0", | 22 | "font-awesome": "^4.7.0", |
23 | "gulp": "^4.0.2", | 23 | "gulp": "^3.9.1", |
24 | "gulp-angular-templatecache": "^3.0.0", | 24 | "gulp-angular-templatecache": "^3.0.0", |
25 | "gulp-clean": "^0.4.0", | 25 | "gulp-clean": "^0.4.0", |
26 | "gulp-connect": "^5.7.0", | 26 | "gulp-connect": "^5.7.0", |
27 | "gulp-htmlmin": "^5.0.1", | 27 | "gulp-htmlmin": "^5.0.1", |
28 | "gulp-jshint": "^2.1.0", | 28 | "gulp-jshint": "^2.1.0", |
29 | "gulp-rename": "^1.4.0", | 29 | "gulp-rename": "^1.4.0", |
30 | "gulp-replace": "^1.0.0", | 30 | "gulp-replace": "^1.0.0", |
31 | "gulp-sequence": "^1.0.0", | 31 | "gulp-sequence": "^1.0.0", |
32 | "gulp-uglify": "^3.0.2", | 32 | "gulp-uglify": "^3.0.2", |
33 | "gulp-uglify-es": "^1.0.4", | 33 | "gulp-uglify-es": "^1.0.4", |
34 | "jasmine-core": "^3.4.0", | 34 | "jasmine-core": "^3.4.0", |
35 | "jquery": "^3.4.1", | 35 | "jquery": "^3.4.1", |
36 | "jshint": "^2.10.2", | 36 | "jshint": "^2.10.2", |
37 | "ladda": "^1.0.6", | 37 | "ladda": "^1.0.6", |
38 | "pre-commit": "^1.2.2", | 38 | "pre-commit": "^1.2.2", |
39 | "pump": "^3.0.0", | 39 | "pump": "^3.0.0", |
40 | "ui-bootstrap4": "^3.0.6" | 40 | "ui-bootstrap4": "^3.0.6" |
41 | } | 41 | } |
42 | } | 42 | } |
43 | 43 |
src/etc/develop.js
File was created | 1 | angular.module('focaCrearRemito') | |
2 | .constant("API_ENDPOINT", { | ||
3 | 'URL': '//localhost:9900' | ||
4 | }); | ||
5 |
src/etc/develop.js.ejemplo
File was created | 1 | angular.module('focaCrearRemito') | |
2 | .constant("API_ENDPOINT", { | ||
3 | 'URL': '//127.0.0.1:9000' | ||
4 | }); | ||
5 |
src/js/app.js
File was created | 1 | angular.module('focaCrearFactura', ['ngRoute']); | |
2 |
src/js/controller.js
File was created | 1 | angular.module('focaCrearFactura').controller('facturaController', [ | |
2 | '$scope', '$uibModal', '$location', '$filter', 'crearFacturaService', '$timeout', | ||
3 | 'focaModalService', 'crearRemitoService', '$rootScope', 'focaBotoneraLateralService', | ||
4 | '$localStorage', | ||
5 | function ( | ||
6 | $scope, $uibModal, $location, $filter, crearFacturaService, $timeout, focaModalService, | ||
7 | crearRemitoService, $rootScope, focaBotoneraLateralService, $localStorage) { | ||
8 | |||
9 | config(); | ||
10 | |||
11 | function config() { | ||
12 | $scope.tmpCantidad = Number; | ||
13 | $scope.tmpPrecio = Number; | ||
14 | $scope.botonera = crearFacturaService.getBotonera(); | ||
15 | $scope.isNumber = angular.isNumber; | ||
16 | $scope.datepickerAbierto = false; | ||
17 | $scope.show = false; | ||
18 | $scope.cargando = true; | ||
19 | $scope.now = new Date(); | ||
20 | $scope.puntoVenta = rellenar(0, 4); | ||
21 | $scope.comprobante = rellenar(0, 8); | ||
22 | $scope.dateOptions = { | ||
23 | maxDate: new Date(), | ||
24 | minDate: new Date(2010, 0, 1) | ||
25 | }; | ||
26 | $scope.cabeceras = []; | ||
27 | crearFacturaService.getParametros().then(function (res) { | ||
28 | |||
29 | var parametros = JSON.parse(res.data[0].jsonText); | ||
30 | |||
31 | if ($localStorage.factura) { | ||
32 | |||
33 | $timeout(function () { getLSFactura(); }); | ||
34 | } else { | ||
35 | |||
36 | for (var property in parametros) { | ||
37 | $scope.factura[property] = parametros[property]; | ||
38 | $scope.inicial[property] = parametros[property]; | ||
39 | } | ||
40 | |||
41 | setearFactura($scope.factura); | ||
42 | } | ||
43 | |||
44 | }); | ||
45 | |||
46 | //SETEO BOTONERA LATERAL | ||
47 | $timeout(function () { | ||
48 | focaBotoneraLateralService.showSalir(false); | ||
49 | focaBotoneraLateralService.showPausar(true); | ||
50 | focaBotoneraLateralService.showGuardar(true, $scope.crearFactura); | ||
51 | focaBotoneraLateralService.addCustomButton('Salir', salir); | ||
52 | }); | ||
53 | |||
54 | init(); | ||
55 | |||
56 | } | ||
57 | |||
58 | function init() { | ||
59 | |||
60 | $scope.$broadcast('cleanCabecera'); | ||
61 | |||
62 | $scope.factura = { | ||
63 | id: 0, | ||
64 | estado: 0, | ||
65 | vendedor: {}, | ||
66 | cliente: {}, | ||
67 | proveedor: {}, | ||
68 | domicilio: { dom: '' }, | ||
69 | moneda: {}, | ||
70 | cotizacion: $scope.cotizacionPorDefecto || {}, | ||
71 | articulosFactura: [] | ||
72 | }; | ||
73 | |||
74 | $scope.factura.articulosFactura = []; | ||
75 | $scope.idLista = undefined; | ||
76 | |||
77 | crearRemitoService.getNumeroRemito().then( | ||
78 | function (res) { | ||
79 | $scope.puntoVenta = rellenar(res.data.sucursal, 4); | ||
80 | $scope.comprobante = rellenar(res.data.numeroRemito, 8); | ||
81 | }, | ||
82 | function (err) { | ||
83 | focaModalService.alert('La terminal no esta configurada correctamente'); | ||
84 | console.info(err); | ||
85 | } | ||
86 | ); | ||
87 | |||
88 | $scope.inicial = angular.copy($scope.factura); | ||
89 | } | ||
90 | |||
91 | $scope.$watch('factura', function (newValue) { | ||
92 | focaBotoneraLateralService.setPausarData({ | ||
93 | label: 'factura', | ||
94 | val: newValue | ||
95 | }); | ||
96 | }, true); | ||
97 | |||
98 | $scope.crearFactura = function () { | ||
99 | |||
100 | if (!validarGuardar()) return; | ||
101 | |||
102 | var save = { | ||
103 | factura: { | ||
104 | |||
105 | BONIF: 0, | ||
106 | CLI: $scope.factura.cliente.cod, | ||
107 | CUI: $scope.factura.cliente.cuit, | ||
108 | CTA: $scope.factura.cliente.cod, | ||
109 | DC1: '', | ||
110 | DC2: '', | ||
111 | DE1: '', | ||
112 | DOM: $scope.factura.cliente.DOM, | ||
113 | FACAUT: 0, | ||
114 | DTO: 0, | ||
115 | FEC: $filter('date')($scope.now, 'yyyy-MM-dd HH:mm:ss'), | ||
116 | FEC_ANT: '19000101', | ||
117 | FPA: 2, | ||
118 | IDEXCEPCION: 0, | ||
119 | IDLP: $scope.factura.cliente.mod.trim() || 0, | ||
120 | IDPERSONERIA: 0, | ||
121 | IMI: 0, // TODO | ||
122 | IMI2: 0, // TODO | ||
123 | IMI3: 0, // TODO | ||
124 | IMP_LEY: 0, | ||
125 | IRI: 0, // TODO | ||
126 | IRS: 0, | ||
127 | LEG: '', | ||
128 | LUG: $scope.factura.vendedor.LugVen, | ||
129 | MK_M: 0, | ||
130 | NEE: 0, // TODO | ||
131 | NET: 0, // TODO | ||
132 | NFI: '', | ||
133 | NNP: 0, | ||
134 | NOM: $scope.factura.cliente.nom, | ||
135 | OPE: $scope.factura.vendedor.CodVen, | ||
136 | PAG: $scope.getTotal(), | ||
137 | PER: 0, | ||
138 | PER_IVA: 0, | ||
139 | PLA: $scope.factura.vendedor.NplVen, | ||
140 | PRO: '', | ||
141 | REC_ANT: 0, | ||
142 | SUC: parseInt($scope.puntoVenta), | ||
143 | TCA: 1, | ||
144 | TCO: 'FT', | ||
145 | TFI: '', | ||
146 | TIP: $scope.factura.cliente.tipoFactura, | ||
147 | TIV: 0, // TODO | ||
148 | TOT: $scope.getTotal(), | ||
149 | TUR: 0, // TODO | ||
150 | VEN: $scope.factura.vendedor.CodVen, | ||
151 | VTO_CLI: '', | ||
152 | ZON: 1, // TODO | ||
153 | OBSERVACIONES: $scope.factura.observaciones | ||
154 | }, | ||
155 | cuerpo: $scope.articulosFiltro() | ||
156 | }; | ||
157 | |||
158 | crearFacturaService.guardarFactura(save).then(function(res) { | ||
159 | |||
160 | focaBotoneraLateralService.endGuardar(true); | ||
161 | |||
162 | focaModalService.alert('Comprobante guardado con éxito'); | ||
163 | |||
164 | config(); | ||
165 | |||
166 | }).catch(function(err) { | ||
167 | focaModalService.alert('Hubo un error al guardar la factura'); | ||
168 | console.log(err); | ||
169 | }); | ||
170 | |||
171 | }; | ||
172 | |||
173 | $scope.seleccionarCliente = function () { | ||
174 | |||
175 | var modalInstance = $uibModal.open( | ||
176 | { | ||
177 | ariaLabelledBy: 'Busqueda de Cliente', | ||
178 | templateUrl: 'foca-busqueda-cliente-modal.html', | ||
179 | controller: 'focaBusquedaClienteModalController', | ||
180 | resolve: { | ||
181 | vendedor: function () { return null; }, | ||
182 | cobrador: function () { return null; } | ||
183 | }, | ||
184 | size: 'lg' | ||
185 | } | ||
186 | ); | ||
187 | modalInstance.result.then( | ||
188 | function (cliente) { | ||
189 | $scope.factura.cliente = cliente; | ||
190 | |||
191 | $scope.$broadcast('addCabecera', { | ||
192 | label: 'Cliente:', | ||
193 | valor: $filter('rellenarDigitos')(cliente.cod, 3) + ' - ' + cliente.nom | ||
194 | }); | ||
195 | |||
196 | $filter('filter')($scope.botonera, { label: 'Cliente' })[0].checked = true; | ||
197 | |||
198 | }, function () { | ||
199 | } | ||
200 | ); | ||
201 | |||
202 | }; | ||
203 | |||
204 | $scope.seleccionarVendedor = function() { | ||
205 | var parametrosModal = { | ||
206 | titulo: 'Búsqueda vendedores', | ||
207 | query: '/vendedor-playa', | ||
208 | columnas: [ | ||
209 | { | ||
210 | propiedad: 'CodVen', | ||
211 | nombre: 'Código', | ||
212 | filtro: { | ||
213 | nombre: 'rellenarDigitos', | ||
214 | parametro: 3 | ||
215 | } | ||
216 | }, | ||
217 | { | ||
218 | propiedad: 'NomVen', | ||
219 | nombre: 'Nombre' | ||
220 | } | ||
221 | ], | ||
222 | size: 'md' | ||
223 | }; | ||
224 | focaModalService.modal(parametrosModal).then( | ||
225 | function (vendedor) { | ||
226 | |||
227 | indicarPassword(vendedor) | ||
228 | .then(function() { | ||
229 | validarPlanillaVendedor(vendedor) | ||
230 | .then(function() { | ||
231 | |||
232 | $filter('filter')($scope.botonera, { | ||
233 | label: 'Vendedor' | ||
234 | })[0].checked = true; | ||
235 | |||
236 | $scope.$broadcast('addCabecera', { | ||
237 | label: 'Vendedor:', | ||
238 | valor: $filter('rellenarDigitos')(vendedor.CodVen, 3) + | ||
239 | ' - ' + | ||
240 | vendedor.NomVen | ||
241 | }); | ||
242 | |||
243 | $scope.factura.vendedor = vendedor; | ||
244 | |||
245 | getProductosByPlanilla(vendedor.NplVen); | ||
246 | }) | ||
247 | .catch($scope.seleccionarVendedor); | ||
248 | }) | ||
249 | .catch(function(err) { | ||
250 | console.log(err) | ||
251 | }); | ||
252 | |||
253 | }, function () { } | ||
254 | ); | ||
255 | }; | ||
256 | |||
257 | $scope.seleccionarMoneda = function () { | ||
258 | |||
259 | var parametrosModal = { | ||
260 | titulo: 'Búsqueda de monedas', | ||
261 | query: '/moneda', | ||
262 | columnas: [ | ||
263 | { | ||
264 | propiedad: 'DETALLE', | ||
265 | nombre: 'Nombre' | ||
266 | }, | ||
267 | { | ||
268 | propiedad: 'SIMBOLO', | ||
269 | nombre: 'Símbolo' | ||
270 | } | ||
271 | ], | ||
272 | size: 'md' | ||
273 | }; | ||
274 | focaModalService.modal(parametrosModal).then( | ||
275 | function (moneda) { | ||
276 | |||
277 | if (moneda.ID !== 1) { | ||
278 | $scope.abrirModalCotizacion(moneda); | ||
279 | return; | ||
280 | } | ||
281 | |||
282 | crearRemitoService.getCotizacionByIdMoneda(1) | ||
283 | .then(function (res) { | ||
284 | |||
285 | cotizacionPArgentino = res.data[0].cotizaciones[0]; | ||
286 | cotizacionPArgentino.moneda = moneda; | ||
287 | |||
288 | actualizarCabeceraMoneda(cotizacionPArgentino); | ||
289 | |||
290 | $scope.remito.cotizacion = cotizacionPArgentino; | ||
291 | }); | ||
292 | }, function () { | ||
293 | |||
294 | } | ||
295 | ); | ||
296 | }; | ||
297 | |||
298 | $scope.abrirModalCotizacion = function (moneda) { | ||
299 | var modalInstance = $uibModal.open( | ||
300 | { | ||
301 | ariaLabelledBy: 'Busqueda de Cotización', | ||
302 | templateUrl: 'modal-cotizacion.html', | ||
303 | controller: 'focaModalCotizacionController', | ||
304 | size: 'lg', | ||
305 | resolve: { idMoneda: function () { return moneda.ID; } } | ||
306 | } | ||
307 | ); | ||
308 | modalInstance.result.then( | ||
309 | function (cotizacion) { | ||
310 | |||
311 | cotizacion.moneda = moneda; | ||
312 | actualizarCabeceraMoneda(cotizacion); | ||
313 | $scope.factura.cotizacion = cotizacion; | ||
314 | |||
315 | }, function () { | ||
316 | |||
317 | } | ||
318 | ); | ||
319 | }; | ||
320 | |||
321 | $scope.seleccionarObservaciones = function () { | ||
322 | var observacion = { | ||
323 | titulo: 'Ingrese Observaciones', | ||
324 | value: $scope.factura.observaciones, | ||
325 | maxlength: 155, | ||
326 | textarea: true | ||
327 | }; | ||
328 | |||
329 | focaModalService | ||
330 | .prompt(observacion) | ||
331 | .then(function (observaciones) { | ||
332 | $scope.factura.observaciones = observaciones; | ||
333 | }); | ||
334 | }; | ||
335 | |||
336 | |||
337 | $scope.articulosFiltro = function () { | ||
338 | return $scope.factura.articulosFactura; | ||
339 | }; | ||
340 | |||
341 | $scope.getTotal = function () { | ||
342 | |||
343 | var total = 0; | ||
344 | |||
345 | $scope.articulosFiltro().forEach(function (articulo) { | ||
346 | total += articulo.PUN * articulo.CAN; | ||
347 | }); | ||
348 | |||
349 | return parseFloat(total.toFixed(2)); | ||
350 | }; | ||
351 | |||
352 | function getProductosByPlanilla(numeroPlanilla) { | ||
353 | |||
354 | crearFacturaService.getProductosByPlanilla(numeroPlanilla).then(function(res) { | ||
355 | |||
356 | res.data.forEach(function (producto) { | ||
357 | |||
358 | $scope.botonera.push({ | ||
359 | label: producto.DetArt, | ||
360 | image: 'productos.png' | ||
361 | }); | ||
362 | |||
363 | |||
364 | crearFuncionesProductos(producto); | ||
365 | |||
366 | }); | ||
367 | }); | ||
368 | } | ||
369 | |||
370 | function crearFuncionesProductos(producto) { | ||
371 | |||
372 | $scope[nombreFuncion(producto.DetArt)] = function() { | ||
373 | |||
374 | if (angular.equals($scope.factura.cliente, {})) { | ||
375 | focaModalService.alert('Seleccione cliente'); | ||
376 | return; | ||
377 | } | ||
378 | |||
379 | var parametrosModal = { | ||
380 | titulo: 'Despachos ' + producto.DetArt, | ||
381 | data: producto.despachos, | ||
382 | columnas: [ | ||
383 | { | ||
384 | propiedad: 'FEC', | ||
385 | nombre: 'Fecha', | ||
386 | filtro: { | ||
387 | nombre: 'date', | ||
388 | parametro: 'dd/MM/yyyy HH:mm' | ||
389 | } | ||
390 | }, | ||
391 | { | ||
392 | propiedad: 'IMP', | ||
393 | nombre: 'Importe' | ||
394 | }, | ||
395 | { | ||
396 | propiedad: 'LTS', | ||
397 | nombre: 'Litros' | ||
398 | } | ||
399 | ], | ||
400 | size: 'md' | ||
401 | }; | ||
402 | |||
403 | focaModalService.modal(parametrosModal).then(function(despacho) { | ||
404 | |||
405 | var articulo = { | ||
406 | TIP: $scope.factura.cliente.tipoFactura, | ||
407 | TCO: 'FT', | ||
408 | SUC: parseInt($scope.puntoVenta), | ||
409 | ORD: $scope.articulosFiltro().length + 1, | ||
410 | SEC: despacho.SEC, | ||
411 | ART: despacho.PRO, | ||
412 | RUB: producto.CodRub, | ||
413 | DES: producto.DetArt, | ||
414 | CAN: despacho.LTS, | ||
415 | PUN: producto.PreVen, // TODO | ||
416 | IVA: producto.IMPIVA, // TODO | ||
417 | NET: 0, // TODO | ||
418 | NEX: 0, // TODO | ||
419 | IMI: producto.ImpInt, // TODO | ||
420 | IMI2: producto.ImpInt2, // TODO | ||
421 | IMI3: producto.ImpInt3, // TODO | ||
422 | PUT: producto.PreNet, // TODO | ||
423 | SUR: despacho.SUR, | ||
424 | PLA: despacho.PLA, | ||
425 | LUG: despacho.LUG, | ||
426 | LEG: $scope.factura.vendedor.CodVen, | ||
427 | TUR: $scope.factura.vendedor.TurVen, | ||
428 | ORDEN_PRECOMPRA: '', | ||
429 | ESC: producto.tipoFactura == 'L' ? 1 : 0, | ||
430 | CMF: 0, | ||
431 | PTA: 0, | ||
432 | IVS: 0, | ||
433 | TIVA: 0, | ||
434 | CON: 0, | ||
435 | SINO: '', | ||
436 | ORD_TRA: 0, | ||
437 | IMP_DESP: 0, | ||
438 | PCD: 0, | ||
439 | RTO: '' | ||
440 | }; | ||
441 | |||
442 | $scope.factura.articulosFactura.push(articulo); | ||
443 | }) | ||
444 | .catch(function (err) { | ||
445 | console.log(err) | ||
446 | }); | ||
447 | |||
448 | }; | ||
449 | } | ||
450 | |||
451 | function nombreFuncion(string) { | ||
452 | var texto = 'seleccionar'; | ||
453 | var arr = string.split(' '); | ||
454 | arr.forEach(function(palabra) { | ||
455 | palabra = palabra.charAt(0).toUpperCase() + palabra.slice(1); | ||
456 | texto += palabra; | ||
457 | }); | ||
458 | return texto; | ||
459 | } | ||
460 | |||
461 | function indicarPassword(vendedor) { | ||
462 | |||
463 | return new Promise(function(resolve, reject) { | ||
464 | |||
465 | focaModalService | ||
466 | .prompt({ | ||
467 | titulo: 'Indique Contraseña', | ||
468 | value: '' | ||
469 | }) | ||
470 | .then(function (contraseña) { | ||
471 | |||
472 | if (contraseña != vendedor.ClaVen.trim()) { | ||
473 | |||
474 | focaModalService.alert('Clave incorrecta').then(function() { | ||
475 | indicarPassword(vendedor); | ||
476 | }); | ||
477 | } else { | ||
478 | resolve(); | ||
479 | } | ||
480 | }) | ||
481 | .catch(reject); | ||
482 | }); | ||
483 | } | ||
484 | |||
485 | function validarPlanillaVendedor(vendedor) { | ||
486 | |||
487 | return new Promise(function(resolve, reject) { | ||
488 | |||
489 | crearFacturaService | ||
490 | .validarPlanillaVendedor(vendedor.CodVen.trim()) | ||
491 | .then(function (res) { | ||
492 | |||
493 | if (!res.data.length) { | ||
494 | |||
495 | focaModalService | ||
496 | .alert('No se encontró planilla abierta para el vendedor') | ||
497 | .then(reject); | ||
498 | |||
499 | } else { | ||
500 | resolve(); | ||
501 | } | ||
502 | |||
503 | }) | ||
504 | .catch(reject); | ||
505 | }); | ||
506 | } | ||
507 | |||
508 | function rellenar(relleno, longitud) { | ||
509 | relleno = '' + relleno; | ||
510 | while (relleno.length < longitud) { | ||
511 | relleno = '0' + relleno; | ||
512 | } | ||
513 | return relleno; | ||
514 | } | ||
515 | |||
516 | function salir() { | ||
517 | var confirmacion = false; | ||
518 | |||
519 | if (!angular.equals($scope.factura, $scope.inicial)) { | ||
520 | confirmacion = true; | ||
521 | } | ||
522 | |||
523 | if (confirmacion) { | ||
524 | focaModalService.confirm( | ||
525 | '¿Está seguro de que desea salir? Se perderán todos los datos cargados.' | ||
526 | ).then(function (data) { | ||
527 | if (data) { | ||
528 | $location.path('/'); | ||
529 | } | ||
530 | }); | ||
531 | } else { | ||
532 | $location.path('/'); | ||
533 | } | ||
534 | } | ||
535 | |||
536 | function setearFactura(factura) { | ||
537 | |||
538 | $scope.$broadcast('cleanCabecera'); | ||
539 | |||
540 | $scope.cabeceras = []; | ||
541 | |||
542 | if (factura.cotizacion && factura.cotizacion.moneda.CODIGO_AFIP !== 'PES') { | ||
543 | $scope.cabeceras.push({ | ||
544 | label: 'Moneda:', | ||
545 | valor: factura.cotizacion.moneda.DETALLE | ||
546 | }); | ||
547 | $scope.cabeceras.push({ | ||
548 | label: 'Fecha cotizacion:', | ||
549 | valor: $filter('date')(factura.cotizacion.FECHA, | ||
550 | 'dd/MM/yyyy') | ||
551 | }); | ||
552 | $scope.cabeceras.push({ | ||
553 | label: 'Cotizacion:', | ||
554 | valor: $filter('number')(factura.cotizacion.VENDEDOR, | ||
555 | '2') | ||
556 | }); | ||
557 | } | ||
558 | |||
559 | if (factura.cotizacion && factura.cotizacion.moneda) { | ||
560 | $filter('filter')($scope.botonera, { label: 'Moneda' })[0].checked = true; | ||
561 | } | ||
562 | |||
563 | if (factura.cliente && factura.cliente.cod) { | ||
564 | $scope.cabeceras.push({ | ||
565 | label: 'Cliente:', | ||
566 | valor: $filter('rellenarDigitos')(factura.cliente.cod, 3) + ' - ' + | ||
567 | factura.cliente.nom | ||
568 | }); | ||
569 | |||
570 | $filter('filter')($scope.botonera, { label: 'Cliente' })[0].checked = true; | ||
571 | } | ||
572 | |||
573 | $scope.puntoVenta = rellenar(factura.sucursal, 4); | ||
574 | $scope.comprobante = rellenar(factura.numerofactura, 8); | ||
575 | $scope.factura = factura; | ||
576 | |||
577 | addArrayCabecera($scope.cabeceras); | ||
578 | } | ||
579 | |||
580 | function getLSFactura() { | ||
581 | var factura = JSON.parse($localStorage.factura || null); | ||
582 | if (factura) { | ||
583 | setearFactura(factura); | ||
584 | delete $localStorage.factura; | ||
585 | } | ||
586 | } | ||
587 | |||
588 | function addArrayCabecera(array) { | ||
589 | for (var i = 0; i < array.length; i++) { | ||
590 | $scope.$broadcast('addCabecera', { | ||
591 | label: array[i].label, | ||
592 | valor: array[i].valor | ||
593 | }); | ||
594 | } | ||
595 | } | ||
596 | |||
597 | function actualizarCabeceraMoneda(cotizacion) { | ||
598 | |||
599 | $scope.factura.articulosFactura.forEach(function (art) { | ||
600 | art.PUN = (art.PUN * $scope.factura.cotizacion.VENDEDOR).toFixed(4); | ||
601 | art.PUN = (art.PUN / cotizacion.VENDEDOR).toFixed(4); | ||
602 | }); | ||
603 | |||
604 | if (cotizacion.moneda.DETALLE === 'PESOS ARGENTINOS') { | ||
605 | $scope.$broadcast('removeCabecera', 'Moneda:'); | ||
606 | $scope.$broadcast('removeCabecera', 'Fecha cotizacion:'); | ||
607 | $scope.$broadcast('removeCabecera', 'Cotizacion:'); | ||
608 | } else { | ||
609 | $scope.$broadcast('addCabecera', { | ||
610 | label: 'Moneda:', | ||
611 | valor: cotizacion.moneda.DETALLE | ||
612 | }); | ||
613 | $scope.$broadcast('addCabecera', { | ||
614 | label: 'Fecha cotizacion:', | ||
615 | valor: $filter('date')(cotizacion.FECHA, 'dd/MM/yyyy') | ||
616 | }); | ||
617 | $scope.$broadcast('addCabecera', { | ||
618 | label: 'Cotizacion:', | ||
619 | valor: $filter('number')(cotizacion.VENDEDOR, '2') | ||
620 | }); | ||
621 | } | ||
622 | } | ||
623 | |||
624 | function validarGuardar() { | ||
625 | |||
626 | if (angular.equals({}, $scope.factura.vendedor)) { | ||
627 | |||
628 | focaModalService.alert('Seleccione Vendedor'); | ||
629 | return false; | ||
630 | } else if (angular.equals({}, $scope.factura.cliente)) { | ||
631 | |||
632 | focaModalService.alert('Seleccione Cliente') | ||
633 | return false; | ||
634 | } else if (!$scope.articulosFiltro().length) { | ||
635 | |||
636 | focaModalService.alert('Seleccione al menos un Articulo'); | ||
637 | return false; | ||
638 | } | ||
639 | |||
640 | return true; | ||
641 | } | ||
642 | } | ||
643 | ]); | ||
644 |
src/js/route.js
File was created | 1 | angular.module('focaCrearFactura') | |
2 | .config(['$routeProvider', function($routeProvider) { | ||
3 | $routeProvider.when('/venta-factura/crear', { | ||
4 | controller: 'facturaController', | ||
5 | templateUrl: 'src/views/factura.html' | ||
6 | }); | ||
7 | }]); | ||
8 |
src/js/service.js
File was created | 1 | angular.module('focaCrearFactura') | |
2 | .service('crearFacturaService', ['$http', 'API_ENDPOINT', | ||
3 | function($http, API_ENDPOINT) { | ||
4 | var route = API_ENDPOINT.URL; | ||
5 | return { | ||
6 | guardarFactura: function (factura) { | ||
7 | return $http.post(route + '/factura/guardar', factura) | ||
8 | }, | ||
9 | getParametros: function() { | ||
10 | return $http.get(API_ENDPOINT.URL + '/parametros/factura'); | ||
11 | }, | ||
12 | validarPlanillaVendedor: function(idVendedor) { | ||
13 | return $http.get(route + '/turnos/validar-planilla/' + idVendedor); | ||
14 | }, | ||
15 | getProductosByPlanilla: function (numeroPlanilla) { | ||
16 | return $http.get(route + '/turnos/productos/' + numeroPlanilla); | ||
17 | }, | ||
18 | getBotonera: function() { | ||
19 | return [ | ||
20 | { | ||
21 | label: 'Vendedor', | ||
22 | image: 'vendedor.png' | ||
23 | }, | ||
24 | { | ||
25 | label: 'Cliente', | ||
26 | image: 'cliente.png' | ||
27 | }, | ||
28 | { | ||
29 | label: 'Moneda', | ||
30 | image: 'moneda.png' | ||
31 | }, | ||
32 | { | ||
33 | label: 'Observaciones', | ||
34 | image: 'botonObservaciones.png' | ||
35 | } | ||
36 | ]; | ||
37 | } | ||
38 | }; | ||
39 | }]); | ||
40 |
src/views/factura.html
File was created | 1 | <div class="crear-nota-remito foca-crear row"> | |
2 | <foca-cabecera-facturador | ||
3 | titulo="'Factura'" | ||
4 | numero="puntoVenta + '-' + comprobante" | ||
5 | fecha="now" | ||
6 | class="mb-0 col-lg-12" | ||
7 | busqueda="seleccionarRemito" | ||
8 | ></foca-cabecera-facturador> | ||
9 | <marquee | ||
10 | bgcolor="#FF9900" | ||
11 | behavior="scroll" | ||
12 | direction="left" | ||
13 | ng-bind="factura.observaciones" | ||
14 | ></marquee> | ||
15 | <div class="col-lg-12"> | ||
16 | <div class="row mt-4"> | ||
17 | <div class="col-12 col-md-10 col-lg-10 border border-light rounded"> | ||
18 | <div class="row p-1 botonera-secundaria px-5 py-2"> | ||
19 | <div class="col-12"> | ||
20 | <foca-botonera-facturador botones="botonera" extra="4" class="row"></foca-botonera-facturador> | ||
21 | </div> | ||
22 | </div> | ||
23 | <!-- PC --> | ||
24 | <div class="row grilla-articulo align-items-end d-none d-sm-flex"> | ||
25 | <table class="table tabla-articulo table-striped table-sm mb-0 rounded-bottom"> | ||
26 | <thead> | ||
27 | <tr class="d-flex"> | ||
28 | <th class="">#</th> | ||
29 | <th class="col">Código</th> | ||
30 | <th class="col-4">Descripción</th> | ||
31 | <th class="col text-right">Cantidad</th> | ||
32 | <th class="col text-right">Precio Unitario</th> | ||
33 | <th class="col text-right">SubTotal</th> | ||
34 | <th class="text-right"> | ||
35 | <button | ||
36 | class="btn btn-outline-light selectable" | ||
37 | ng-click="show = !show; masMenos()" | ||
38 | > | ||
39 | <i | ||
40 | class="fa fa-chevron-down" | ||
41 | ng-show="show" | ||
42 | aria-hidden="true" | ||
43 | > | ||
44 | </i> | ||
45 | <i | ||
46 | class="fa fa-chevron-up" | ||
47 | ng-hide="show" | ||
48 | aria-hidden="true"> | ||
49 | </i> | ||
50 | </button> | ||
51 | </th> | ||
52 | </tr> | ||
53 | </thead> | ||
54 | <tbody class="tabla-articulo-body"> | ||
55 | <tr | ||
56 | ng-repeat="(key, articulo) in articulosFiltro()" | ||
57 | ng-show="show || key == (articulosFiltro().length - 1)" | ||
58 | class="d-flex" | ||
59 | > | ||
60 | <td ng-bind="key + 1"></td> | ||
61 | <td | ||
62 | class="col" | ||
63 | ng-bind="articulo.SEC + '-' + articulo.ART" | ||
64 | ></td> | ||
65 | <td | ||
66 | class="col-4" | ||
67 | ng-bind="articulo.DES" | ||
68 | ></td> | ||
69 | <td class="col text-right"> | ||
70 | <input | ||
71 | ng-show="articulo.editCantidad" | ||
72 | ng-model="tmpCantidad" | ||
73 | class="form-control" | ||
74 | foca-tipo-input | ||
75 | min="1" | ||
76 | foca-focus="articulo.editCantidad" | ||
77 | ng-keypress="editarArticulo($event.keyCode, articulo, tmpCantidad, tmpPrecio);" | ||
78 | esc-key="cancelarEditar(articulo)" | ||
79 | ng-focus="selectFocus($event); tmpCantidad = articulo.CAN; tmpPrecio = articulo.PUN" | ||
80 | teclado-virtual | ||
81 | > | ||
82 | <i | ||
83 | class="selectable" | ||
84 | ng-click="cambioEdit(articulo, 'cantidad')" | ||
85 | ng-hide="articulo.editCantidad" | ||
86 | ng-bind="articulo.CAN"> | ||
87 | </i> | ||
88 | </td> | ||
89 | <td class="col text-right"> | ||
90 | <input | ||
91 | ng-show="articulo.editPrecio" | ||
92 | ng-model="tmpPrecio" | ||
93 | class="form-control" | ||
94 | foca-tipo-input | ||
95 | min="1" | ||
96 | step="0.0001" | ||
97 | foca-focus="articulo.editPrecio" | ||
98 | ng-keypress="editarArticulo($event.keyCode, articulo, tmpCantidad, tmpPrecio);" | ||
99 | esc-key="cancelarEditar(articulo)" | ||
100 | ng-focus="selectFocus($event); | ||
101 | tmpCantidad = articulo.CAN; | ||
102 | tmpPrecio = articulo.PUN" | ||
103 | teclado-virtual | ||
104 | > | ||
105 | <i | ||
106 | class="selectable" | ||
107 | ng-click="cambioEdit(articulo, 'precio')" | ||
108 | ng-hide="articulo.editPrecio" | ||
109 | ng-bind="articulo.PUN | number: 4"> | ||
110 | </i> | ||
111 | </td> | ||
112 | <td | ||
113 | class="col text-right" | ||
114 | ng-bind="(articulo.PUN * articulo.CAN) | number: 2"> | ||
115 | </td> | ||
116 | <td class="text-center"> | ||
117 | <button | ||
118 | class="btn btn-outline-light" | ||
119 | ng-click="quitarArticulo(articulo)" | ||
120 | > | ||
121 | <i class="fa fa-trash"></i> | ||
122 | </button> | ||
123 | <button | ||
124 | class="btn btn-outline-light" | ||
125 | ng-click="editarArticulo(13, articulo, tmpCantidad, tmpPrecio);" | ||
126 | ng-show="articulo.editCantidad || articulo.editPrecio" | ||
127 | > | ||
128 | <i class="fa fa-save"></i> | ||
129 | </button> | ||
130 | </td> | ||
131 | </tr> | ||
132 | </tbody> | ||
133 | <tfoot> | ||
134 | <tr class="d-flex"> | ||
135 | <td colspan="4" class="no-border-top"> | ||
136 | <strong>Items:</strong> | ||
137 | <a ng-bind="articulosFiltro().length"></a> | ||
138 | </td> | ||
139 | <td class="text-right ml-auto table-celda-total no-border-top"> | ||
140 | <h3>Total:</h3> | ||
141 | </td> | ||
142 | <td class="table-celda-total text-right no-border-top" colspan="1"> | ||
143 | <h3>{{getTotal() | currency: factura.cotizacion.moneda.SIMBOLO}}</h3> | ||
144 | </td> | ||
145 | <td class="text-right no-border-top"> | ||
146 | <button | ||
147 | type="button" | ||
148 | class="btn btn-sm" | ||
149 | > | ||
150 | Totales | ||
151 | </button> | ||
152 | </td> | ||
153 | </tr> | ||
154 | </tfoot> | ||
155 | </table> | ||
156 | </div> | ||
157 | </div> | ||
158 | </div> | ||
159 | </div> | ||
160 | <div class="row d-md-none fixed-bottom"> | ||
161 | <div class="w-100 bg-dark d-flex px-3 acciones-mobile"> | ||
162 | <span class="ml-3 text-muted" ng-click="salir()">Salir</span> | ||
163 | <span | ||
164 | class="mr-3 ml-auto" | ||
165 | ng-class="saveLoading ? 'text-muted' : ''" | ||
166 | ng-click="crearRemito()" | ||
167 | ladda="saveLoading" | ||
168 | data-style="expand-left" | ||
169 | >Guardar</span> | ||
170 | </div> | ||
171 | </div> | ||
172 | </div> | ||
173 |