angular.module('focaCrearCobranza') .controller('cobranzaController', [ '$scope', '$rootScope', '$timeout', '$uibModal', '$location', 'focaCrearCobranzaService', 'focaModalService', '$filter', 'focaSeguimientoService', 'focaBotoneraLateralService', 'APP', 'focaLoginService', function($scope, $rootScope, $timeout, $uibModal, $location, focaCrearCobranzaService, focaModalService, $filter, focaSeguimientoService, focaBotoneraLateralService, APP, loginService) { config(); function config() { $scope.datepickerAbierto = false; $scope.cobroDeuda = true; $scope.show = false; $scope.cargando = true; $scope.fecha = new Date(); $scope.puntoVenta = $filter('rellenarDigitos')(0, 4); $scope.comprobante = $filter('rellenarDigitos')(0, 8); $scope.dateOptions = { maxDate: new Date(), minDate: new Date(2010, 0, 1) }; var monedaPorDefecto; //Trabajo con la cotización más reciente, por eso uso siempre la primera '[0]' focaCrearCobranzaService.getCotizacionByIdMoneda(1).then(function(res) { monedaPorDefecto = res.data[0]; $scope.cobranza.moneda = monedaPorDefecto; $scope.inicial.cobranza.moneda = $scope.cobranza.moneda; $scope.cobranza.cotizacion = monedaPorDefecto.cotizaciones[0]; $scope.inicial.cobranza.cotizacion = $scope.cobranza.cotizacion; }); $timeout(function() { focaBotoneraLateralService.showSalir(false); focaBotoneraLateralService.showPausar(true); focaBotoneraLateralService.showGuardar(true, $scope.crearCobranza); focaBotoneraLateralService.addCustomButton('Salir', salir); }); if (APP === 'cobranza') { $scope.idCobrador = loginService.getLoginData().vendedorCobrador; $scope.botonera = focaCrearCobranzaService.getBotonera($scope.idCobrador); } else { $scope.botonera = focaCrearCobranzaService.getBotonera(); } init(); } function init() { $scope.$broadcast('cleanCabecera'); $scope.cobranza = {}; $scope.facturaTabla = []; $scope.cobrosTabla = []; if (APP === 'cobranza') { focaCrearCobranzaService.getCobradorById($scope.idCobrador).then( function(res) { var cobrador = res.data; $scope.$broadcast('addCabecera', { label: 'Cobrador:', valor: $filter('rellenarDigitos')(cobrador.NUM, 3) + ' - ' + cobrador.NOM }); $scope.cobranza.cobrador = cobrador; $scope.inicial.cobranza.cobrador = $scope.cobranza.cobrador; } ); } $scope.inicial = { cobranza: angular.copy($scope.cobranza), facturaTabla: angular.copy($scope.facturaTabla), cobrosTabla: angular.copy($scope.cobrosTabla) }; focaCrearCobranzaService.getNumeroRecibo().then( function(res) { $scope.puntoVenta = $filter('rellenarDigitos')( res.data.sucursal, 4 ); $scope.comprobante = $filter('rellenarDigitos')( res.data.numeroRecibo, 8 ); }, function(err) { focaModalService.alert( 'La terminal no esta configurada correctamente' ); console.info(err); } ); } $scope.crearCobranza = function() { if(!$scope.cobranza.cliente) { focaModalService.alert('Ingrese Cliente'); return; } if(!$scope.cobranza.cobrador) { focaModalService.alert('Ingrese Cobrador'); return; } if($scope.facturaTabla.length < 1) { focaModalService.alert('Ingrese al menos una factura'); return; } if($scope.getTotalCobrado() + $scope.getTotalDeuda() !== 0) { focaModalService.alert('La diferencia debe ser ' + $scope.cobranza.moneda.SIMBOLO + '0,00'); return; } var cobranza = {}; var cheques = []; var cuerpos = []; //TODO: habilitar edición $scope.editando = false; focaBotoneraLateralService.startGuardar(); $scope.saveLoading = true; for(var i = 0; i < $scope.facturaTabla.length; i++) { var cuerpoFactura = { CYV: 'V', TIP: 'C', TCO: 'RC', PVE: $scope.puntoVenta, NCO: $scope.comprobante, LOP: 'L', TIL: $scope.facturaTabla[i].TCO, COM: $scope.facturaTabla[i].numeroFactura + '-' + $filter('rellenarDigitos')($scope.facturaTabla[i].NCU,2), FEC: $scope.fecha.toISOString().slice(0, 19).replace('T', ' '), IMP: Math.abs($scope.facturaTabla[i].IPA), RES: 0,//caja de tesorería SUBM: 0, NCU: $scope.facturaTabla[i].NCU }; cuerpos.push(cuerpoFactura); } for (var j = 0; j < $scope.cobrosTabla.length; j++) { var efectivo = $scope.cobrosTabla[j].tipo === 'Efectivo' ? true : false; var cuerpoCobros = { CYV: 'V', TIP: 'C', TCO: 'RC', PVE: $scope.puntoVenta, NCO: $scope.comprobante, LOP: 'P', TIL: 'EF', COM: efectivo ? 'ef(COBRO EN EFECTIVO)' : 'ch(' + $scope.cobrosTabla[j].numero + ')' + $scope.cobrosTabla[j].banco.desbco, FEC: efectivo ? $scope.cobrosTabla[j].fecha .toISOString().slice(0, 19).replace('T', ' ') : $scope.cobrosTabla[j].fechaPresentacion .toISOString().slice(0, 19).replace('T', ' '), IMP: Math.abs($scope.cobrosTabla[j].importe), RES: 0,//caja de tesorería SUBM: 0 }; cuerpos.push(cuerpoCobros); if(!efectivo) { var cheque = { BCO: $scope.cobrosTabla[j].banco.ID, NUM: $scope.comprobante, FEP: $scope.cobrosTabla[j].fechaPresentacion .toISOString().slice(0, 19).replace('T', ' '), FEE: $scope.cobrosTabla[j].fechaEmision .toISOString().slice(0, 19).replace('T', ' '), LUG: $scope.cobrosTabla[j].localidad.NOMBRE, IMP: $scope.cobrosTabla[j].importe, LIB: $scope.cobrosTabla[j].librador, EST: 'C',//'D' depositado, 'E' entregado, 'C' en cartera PCI: $scope.cobrosTabla[j].provincia.ID, LPLA: 0, PLA: 0, VEN: $scope.cobranza.cobrador.id,//Id vendedor CCLIE: $scope.cobranza.cliente.COD,//Id cliente REN: 0, PVEC: $scope.puntoVenta, NCOC: $scope.comprobante, OBSE: $scope.cobrosTabla[j].observaciones, LUV: 0, ORI: 've', FER: '', BIMP: 0, COMP: 'C ' +'RC ' + $scope.puntoVenta + '-' + $scope.comprobante, VAL_E: '',//Cuando egresa por ingresos y egresos en el numero de egreso VAL_I: '',//Cuando Ingresa por ingresos y egresos en el numero ingreso REC_CAJ: 'D', TIPO_C: 0,//?? SALDO_CAJ: 'S', FECHA_INGRESO: $scope.fecha .toISOString().slice(0, 19).replace('T', ' '), Vendedor_valor: 0, FAMILIA: 0, CUIT_LIB: '', COD_LUG: $scope.cobrosTabla[j].localidad.ID,//código lugar SEN: '', NRC: 0, COD_LARGO: '', VN: 0, ID_LECTOR: 0, NATHB: '' }; cheques.push(cheque); } } cobranza = { recibo: { CYV: 'V', TIP: 'C', TCO: 'RC', PVE: $scope.puntoVenta, //Sucursar, punto de venta NCO: $scope.comprobante, //Numero de comprobante FEC: $scope.fecha.toISOString().slice(0, 19).replace('T', ' '), CLI: $scope.cobranza.cliente.COD, ATO: 0, //número de asiento CFE: $scope.cobranza.cobrador.NOM, PLA: '',//Numero de planilla, sin uso ID_MONEDA: $scope.cobranza.moneda.ID, COTIZACION: $scope.cobranza.cotizacion.VENDEDOR, idCobrador: $scope.cobranza.cobrador.id }, cuerpo: cuerpos, cheques: cheques, acobypag: { CYV: 'V', COD: $scope.cobranza.cliente.COD, FEP: $scope.fecha.toISOString().slice(0, 19).replace('T', ' '), TIP: 'C', TCO: 'RC', SUC: $scope.puntoVenta, NCO: $scope.comprobante, IPA: $scope.getTotalCobrado(), SAL: '',//?? TCA: 1, ZONA: 1, FPA: 2,//Forma de pago REC: 0, REP: 0, FER: null, REM: 0, FRE: null,//?? PRO: 'N', FEV: $scope.fecha.toISOString().slice(0, 19).replace('T', ' ') }, datosCobrador: { COD: $scope.cobranza.cobrador.NUM, PVE: $scope.puntoVenta, NUM: $scope.comprobante, EST: 'C', OBS: 'RC: ' + $scope.comprobante + '-' + $scope.fecha.toLocaleDateString(), DAT1: 'C', CLI: $scope.cobranza.cliente.COD }, cliente: $scope.cobranza.cliente }; //COPIO cobranzaMail Y A cobranza LE ELIMINO EL VALOR NCU DE LOS CUERPOS var cobranzaMail = angular.copy(cobranza); cobranza.cuerpo = cobranza.cuerpo.map(function(c) { if (c.NCU) delete c.NCU; return c; }); focaCrearCobranzaService .guardarCobranza(cobranza) .then( function(result) { var cliente = angular.copy($scope.cobranza.cliente); focaBotoneraLateralService.endGuardar(true); $scope.saveLoading = false; focaModalService .prompt('Ingrese los emails separados por coma para enviar comprobante', cliente.MAIL) .then(function(res) { return Promise.all([ focaCrearCobranzaService .enviarComprobantePorMail(res, cobranzaMail), focaCrearCobranzaService .actualizarEmail(res, cliente.COD) ]); }) .then(function() { focaModalService.alert('Mensaje enviado correctamente'); }); focaSeguimientoService.guardarPosicion( 'Cobranza', result.data, '' ); init(); }, function(error) { focaModalService.alert('Hubo un problema al cargar la cobranza'); focaBotoneraLateralService.endGuardar(); $scope.saveLoading = false; console.info(error); } ); }; $scope.seleccionarCobros = function() { $scope.cobroDeuda = false; }; $scope.seleccionarComprobantes = function() { $scope.cobroDeuda = true; }; $scope.seleccionarCobranza = function() { var modalInstance = $uibModal.open( { ariaLabelledBy: 'Busqueda de Cobranzas', templateUrl: 'foca-modal-cobranza.html', controller: 'focaModalCobranzaController', size: 'lg' } ); modalInstance.result.then(function(cobranza) { $scope.editando = true; $scope.facturaTabla = []; $scope.cobrosTabla = []; $scope.$broadcast('cleanCabecera'); $scope.fecha = new Date(cobranza.fecha); $scope.$broadcast('addCabecera', { label: 'Cliente:', valor: $filter('rellenarDigitos')(cobranza.cliente.COD, 5) + ' - ' + cobranza.cliente.NOM }); $scope.$broadcast('addCabecera', { label: 'Cobrador:', valor: cobranza.cobrador //TODO: hacer la relación y traer el cobrador para poner su código // valor: $filter('rellenarDigitos')(cobranza.cobrador.CodVen, 5) + ' - ' + // cobranza.cobrador }); $scope.facturaTabla = cobranza.facturas; $scope.cobrosTabla = cobranza.cobros; }); }; $scope.seleccionarCliente = function() { if(!$scope.cobranza.cobrador) { focaModalService.alert('Ingrese primero cobrador'); return; } var modalInstance = $uibModal.open( { ariaLabelledBy: 'Busqueda de Cliente', templateUrl: 'foca-busqueda-cliente-modal.html', controller: 'focaBusquedaClienteModalController', resolve: { vendedor: function() { return $scope.cobranza.cobrador; } }, size: 'lg' } ); modalInstance.result.then( function(cliente) { $scope.$broadcast('addCabecera', { label: 'Cliente:', valor: $filter('rellenarDigitos')(cliente.COD, 5) + ' - ' + cliente.NOM }); $scope.cobranza.cliente = cliente; } ); }; $scope.seleccionarFactura = function() { if(!$scope.cobranza.cliente) { focaModalService.alert('Seleccione primero un cliente'); return; } var modalInstance = $uibModal.open( { ariaLabelledBy: 'Busqueda de Facturas', templateUrl: 'foca-modal-factura.html', controller: 'focaModalFacturaController', size: 'lg', resolve: { parametrosFactura: function() { return { cliente: $scope.cobranza.cliente, simbolo: $scope.cobranza.moneda.SIMBOLO, cotizacion: $scope.cobranza.cotizacion.VENDEDOR, moneda: $scope.cobranza.moneda.ID }; } } } ); modalInstance.result.then( function(facturas) { $scope.facturaTabla = $scope.facturaTabla.concat(facturas); }, function() { } ); }; $scope.seleccionarCheque = function() { var modalInstance = $uibModal.open( { ariaLabelledBy: 'Carga de cheques', templateUrl: 'modal-cheque.html', controller: 'focaModalChequeController', size: 'lg', resolve: { sugerido: function() { var sugerido = $scope.getTotalDeuda() + $scope.getTotalCobrado(); return sugerido < 0 ? sugerido : null; } } } ); modalInstance.result.then( function(cheque) { var cobro = { tipo: 'Ch' + '(' + cheque.numero + ')' + ' ' + cheque.banco.desbco, numero: cheque.numero, banco: cheque.banco, fecha: cheque.fechaEmision.toLocaleDateString() + '-' + cheque.fechaPresentacion.toLocaleDateString(), fechaPresentacion: cheque.fechaPresentacion, fechaEmision: cheque.fechaEmision, importe: cheque.importe * $scope.cobranza.cotizacion.VENDEDOR, localidad: cheque.localidad, librador: cheque.librador, provincia: cheque.provincia, observaciones: cheque.observaciones }; $scope.cobrosTabla.push(cobro); }, function() { } ); }; $scope.seleccionarEfectivo = function() { var modalInstance = $uibModal.open( { ariaLabelledBy: 'Carga de cheques', templateUrl: 'modal-efectivo.html', controller: 'focaModalEfectivoController', size: 'sm', resolve: { sugerido: function() { var sugerido = $scope.getTotalDeuda() + $scope.getTotalCobrado(); return sugerido < 0 ? sugerido : null; } } } ); modalInstance.result.then( function(efectivo) { var cobro = { tipo: 'Efectivo', fecha: new Date(), importe: efectivo * $scope.cobranza.cotizacion.VENDEDOR }; $scope.cobrosTabla = $scope.cobrosTabla.filter(function(a) { return a.tipo !== 'Efectivo'; }); $scope.cobrosTabla.push(cobro); }, function() { } ); }; $scope.seleccionarMoneda = function() { var parametrosModal = { titulo: 'Búsqueda de monedas', query: '/moneda', columnas: [ { propiedad: 'DETALLE', nombre: 'Nombre' }, { propiedad: 'SIMBOLO', nombre: 'Símbolo' } ], size: 'md' }; focaModalService.modal(parametrosModal).then( function(moneda) { $scope.seleccionarCotizacion(moneda); }, function() { } ); }; $scope.seleccionarCotizacion = function(moneda) { var modalInstance = $uibModal.open( { ariaLabelledBy: 'Busqueda de Cotización', templateUrl: 'modal-cotizacion.html', controller: 'focaModalCotizacionController', size: 'lg', resolve: {idMoneda: function() {return moneda.ID;}} } ); modalInstance.result.then( function(cotizacion) { $scope.cobranza.moneda = moneda; $scope.cobranza.cotizacion = cotizacion; if(moneda.DETALLE === 'PESOS ARGENTINOS') { $scope.$broadcast('removeCabecera', 'Moneda:'); $scope.$broadcast('removeCabecera', 'Fecha cotizacion:'); $scope.$broadcast('removeCabecera', 'Cotizacion:'); }else { $scope.$broadcast('addCabecera', { label: 'Moneda:', valor: moneda.DETALLE }); $scope.$broadcast('addCabecera', { label: 'Fecha cotizacion:', valor: $filter('date')(cotizacion.FECHA, 'dd/MM/yyyy') }); $scope.$broadcast('addCabecera', { label: 'Cotizacion:', valor: $filter('number')(cotizacion.VENDEDOR, '2') }); } }, function() { } ); }; $scope.seleccionarCobrador = function() { var parametrosModal = { query: '/cobrador', columnas: [ { propiedad: 'NUM', nombre: 'Codigo', filtro: { nombre: 'rellenarDigitos', parametro: 3} }, { propiedad: 'NOM', nombre: 'Nombre' } ], titulo:'Búsqueda de cobradores' }; focaModalService.modal(parametrosModal).then( function(cobrador) { $scope.$broadcast('addCabecera', { label: 'Cobrador:', valor: $filter('rellenarDigitos')(cobrador.NUM, 3) + ' - ' + cobrador.NOM }); $scope.cobranza.cobrador = cobrador; }, function() { } ); }; $scope.getTotalDeuda = function() { var total = 0; for (var i = 0; i < $scope.facturaTabla.length; i++) { total += $scope.facturaTabla[i].IPA; } return parseFloat(total.toFixed(2)); }; $scope.getTotalCobrado = function() { var total = 0; for (var i = 0; i < $scope.cobrosTabla.length; i++) { total += $scope.cobrosTabla[i].importe; } return parseFloat(total.toFixed(2)); }; $scope.getSubTotal = function() { if($scope.articuloACargar) { return $scope.articuloACargar.precio * $scope.articuloACargar.cantidad; } }; //Recibe aviso si el teclado está en uso // $rootScope.$on('usarTeclado', function(event, data) { // if(data) { // $scope.mostrarTeclado = true; // return; // } // $scope.mostrarTeclado = false; // }) $scope.selectFocus = function($event) { //Si el teclado esta en uso no selecciona el valor // if($scope.mostrarTeclado) { // return; // } $event.target.select(); }; $scope.salir = function() { $location.path('/'); }; $scope.parsearATexto = function(articulo) { articulo.cantidad = parseFloat(articulo.cantidad); articulo.precio = parseFloat(articulo.precio); }; $scope.quitarFactura = function(key) { $scope.facturaTabla.splice(key, 1); }; $scope.quitarCobro = function(key) { $scope.cobrosTabla.splice(key, 1); }; function salir() { var confirmacion = false; angular.forEach($scope.inicial, function(valor, key) { if (!angular.equals($scope[key], $scope.inicial[key])) { confirmacion = true; } }); if (confirmacion) { focaModalService.confirm( '¿Está seguro de que desea salir? Se perderán todos los datos cargados.' ).then(function(data) { if (data) { $location.path('/'); } }); } else { $location.path('/'); } } } ]);