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 |