angular.module('focaCrearCobranza').controller('cobranzaController', [ '$scope', '$timeout', '$uibModal', '$location', 'focaCrearCobranzaService', 'focaModalService', '$filter', 'focaSeguimientoService', 'focaBotoneraLateralService', 'APP', 'focaLoginService', '$localStorage', function ($scope, $timeout, $uibModal, $location, focaCrearCobranzaService, focaModalService, $filter, focaSeguimientoService, focaBotoneraLateralService, APP, loginService, $localStorage) { config(); function config() { $scope.datepickerAbierto = false; $scope.cobroDeuda = true; $scope.show = false; $scope.cargando = true; $scope.puntoVenta = $filter('rellenarDigitos')(0, 4); $scope.comprobante = $filter('rellenarDigitos')(0, 8); $scope.botonera = focaCrearCobranzaService.getBotonera(); $scope.dateOptions = { maxDate: new Date(), minDate: new Date(2010, 0, 1) }; //Trabajo con la cotización más reciente, por eso uso siempre la primera '[0]' focaCrearCobranzaService.getCotizacionByIdMoneda(1).then(function (res) { var moneda = res.data[0]; moneda.cotizacion = moneda.cotizaciones[0]; $scope.cobranza.moneda = $scope.inicial.moneda = moneda; $filter('filter')($scope.botonera, { label: 'Moneda' })[0].checked = true; $timeout(function () { getLSCobranza(); }); }); $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; } init(); } function init() { $scope.$broadcast('cleanCabecera'); $scope.cobranza = { FEC: new Date(), moneda: {}, facturas: [], cobros: [], cliente: {}, cobrador: {} }; 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.cobrador = $scope.cobranza.cobrador; } ); } $scope.inicial = angular.copy($scope.cobranza); 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.$watch('cobranza', function (newValue) { focaBotoneraLateralService.setPausarData({ label: 'cobranza', val: newValue }); }, true); $scope.crearCobranza = function () { if (!$scope.cobranza.cliente.COD) { focaModalService.alert('Ingrese Cliente'); return; } if (!$scope.cobranza.cobrador.NUM) { focaModalService.alert('Ingrese Cobrador'); return; } if ($scope.cobranza.facturas.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 = []; var imgs = []; var observacion; //TODO: habilitar edición $scope.editando = false; focaBotoneraLateralService.startGuardar(); $scope.saveLoading = true; for (var i = 0; i < $scope.cobranza.facturas.length; i++) { var cuerpoFactura = { CYV: 'V', TIP: 'C', TCO: 'RC', PVE: $scope.puntoVenta, NCO: $scope.comprobante, LOP: 'L', TIL: $scope.cobranza.facturas[i].TCO, COM: $scope.cobranza.facturas[i].numeroFactura + '-' + $filter('rellenarDigitos')($scope.cobranza.facturas[i].NCU), FEC: new Date($scope.cobranza.FEC) .toISOString().slice(0, 19).replace('T', ' '), IMP: Math.abs($scope.cobranza.facturas[i].IMP || $scope.cobranza.facturas[i].IPA), RES: 0,//caja de tesorería SUBM: 0, NCU: $scope.cobranza.facturas[i].NCU }; cuerpos.push(cuerpoFactura); } for (var j = 0; j < $scope.cobranza.cobros.length; j++) { var efectivo = $scope.cobranza.cobros[j].tipo === 'Efectivo'; var cuerpoCobros = { CYV: 'V', TIP: 'C', TCO: 'RC', PVE: $scope.puntoVenta, NCO: $scope.comprobante, LOP: 'P', TIL: $scope.cobranza.cobros[j].TIL, COM: efectivo ? 'ef(COBRO EN EFECTIVO)' : $scope.cobranza.cobros[j].COM, FEC: !$scope.cobranza.cobros[j].fechaPresentacion ? new Date($scope.cobranza.cobros[j].FEC) .toISOString().slice(0, 19).replace('T', ' ') : new Date($scope.cobranza.cobros[j].fechaPresentacion) .toISOString().slice(0, 19).replace('T', ' '), IMP: Math.abs($scope.cobranza.cobros[j].IMP), RES: 0,//caja de tesorería SUBM: 0 }; cuerpos.push(cuerpoCobros); if ($scope.cobranza.cobros[j].observacion) observacion = $scope.cobranza.cobros[j].observacion; if ($scope.cobranza.cobros[j].banco) { var cheque = { BCO: $scope.cobranza.cobros[j].banco.ID, NUM: $scope.comprobante, FEP: new Date($scope.cobranza.cobros[j].fechaPresentacion) .toISOString().slice(0, 19).replace('T', ' '), FEE: new Date($scope.cobranza.cobros[j].fechaEmision) .toISOString().slice(0, 19).replace('T', ' '), LUG: $scope.cobranza.cobros[j].localidad.NOMBRE, IMP: $scope.cobranza.cobros[j].importe, LIB: $scope.cobranza.cobros[j].librador, EST: 'C',//'D' depositado, 'E' entregado, 'C' en cartera PCI: $scope.cobranza.cobros[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.cobranza.cobros[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: new Date($scope.cobranza.FEC) .toISOString().slice(0, 19).replace('T', ' '), Vendedor_valor: 0, FAMILIA: 0, CUIT_LIB: '', COD_LUG: $scope.cobranza.cobros[j].localidad.ID,//código lugar SEN: '', NRC: 0, COD_LARGO: '', VN: 0, ID_LECTOR: 0, NATHB: '' }; cheques.push(cheque); } if ($scope.cobranza.cobros[j].imgs) imgs = $scope.cobranza.cobros[j].imgs; } cobranza = { recibo: { CYV: 'V', TIP: 'C', TCO: 'RC', PVE: $scope.puntoVenta, //Sucursar, punto de venta NCO: $scope.comprobante, //Numero de comprobante FEC: new Date($scope.cobranza.FEC) .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.moneda.cotizacion.VENDEDOR, idCobrador: $scope.cobranza.cobrador.id }, cuerpo: cuerpos, cheques: cheques, acobypag: { CYV: 'V', COD: $scope.cobranza.cliente.COD, FEP: new Date($scope.cobranza.FEC) .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: new Date($scope.cobranza.FEC) .toISOString().slice(0, 19).replace('T', ' ') }, datosCobrador: { COD: $scope.cobranza.cobrador.NUM, PVE: $scope.puntoVenta, NUM: $scope.comprobante, EST: 'C', OBS: 'RC: ' + $scope.comprobante + '-' + new Date($scope.cobranza.FEC).toLocaleDateString(), DAT1: 'C', CLI: $scope.cobranza.cliente.COD }, cliente: $scope.cobranza.cliente, imgs: imgs, observacion: observacion, facturasACobrar: $scope.cobranza.facturas }; //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) { focaBotoneraLateralService.endGuardar(true); $scope.saveLoading = false; enviarMail(cobranzaMail); focaSeguimientoService.guardarPosicion( 'Cobranza', result.data, '' ); config(); }, 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) { cobranza.moneda.cotizacion = cobranza.moneda.cotizaciones[0]; setearCobranza(cobranza); }); }; $scope.seleccionarResumenDeCuenta = function () { if (!$scope.cobranza.cliente.COD) { focaModalService.alert('Seleccione primero un cliente'); return; } var modalInstance = $uibModal.open( { ariaLabelledBy: 'Resumen de cuentas', templateUrl: 'modal-resumen-cuenta.html', controller: 'focaModalResumenCuentaController', resolve: { cliente: function () { return $scope.cobranza.cliente; }, idMoneda: function () { return $scope.cobranza.moneda.ID; } }, size: 'lg' } ); modalInstance.result.then( function (cliente) { $scope.abrirModalDomicilios(cliente); $scope.cliente = cliente; }, function () { } ); }; $scope.seleccionarCliente = function () { if ($scope.cobranza.id === undefined) { var modalInstance = $uibModal.open( { ariaLabelledBy: 'Busqueda de Cliente', templateUrl: 'foca-busqueda-cliente-modal.html', controller: 'focaBusquedaClienteModalController', resolve: { vendedor: function () { return null; }, cobrador: function () { return null; } }, size: 'lg' } ); modalInstance.result.then( function (cliente) { //ELIMINO CLIENTE $scope.$broadcast('removeCabecera', 'Cliente:'); $scope.cobranza.cliente = {}; var clienteMayus = { COD: cliente.cod, NOM: cliente.nom, CUIT: cliente.cuit, MAIL: cliente.mail, DOM: cliente.DOM, LOC: cliente.LOC, PCI: cliente.PCI, idCobrador: cliente.idCobrador, cobrador: cliente.cobrador }; $scope.$broadcast('addCabecera', { label: 'Cobrador:', valor: $filter('rellenarDigitos')(clienteMayus.cobrador.NUM, 3) + ' - ' + clienteMayus.cobrador.NOM }); $scope.cobranza.cobrador = clienteMayus.cobrador; $scope.$broadcast('addCabecera', { label: 'Cliente:', valor: $filter('rellenarDigitos')(clienteMayus.COD, 5) + ' - ' + clienteMayus.NOM }); $filter('filter')($scope.botonera, { label: 'Cliente' })[0].checked = true; $scope.cobranza.cliente = clienteMayus; $scope.cobranza.facturas = []; focaCrearCobranzaService .getCobradorById($scope.cobranza.cliente.idCobrador); }, function () { } ); } else { focaModalService.alert('Esta cobranza no se puede editar'); return; } }; $scope.seleccionarFactura = function () { if ($scope.cobranza.id === undefined) { if (!$scope.cobranza.cliente.COD) { 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.moneda, moneda: $scope.cobranza.moneda.ID }; } } } ); modalInstance.result.then( function (facturas) { var facturasResult = []; //AGREGO A FACTURASRESULT LAS FACTURAS QUE NO HAN SIDO SELECCIONADAS facturas.forEach(function (factura) { var existe = $scope.cobranza.facturas.filter(function (e) { return angular.equals(factura, e); }); if (!existe.length) facturasResult.push(factura); }); $scope.cobranza.facturas = $scope.cobranza.facturas.concat(facturasResult); }, function () { } ); } else { focaModalService.alert('Esta cobranza no se puede editar'); return; } }; $scope.seleccionarCheque = function (cheque) { if ($scope.cobranza.id === undefined) { var parametros; if (!cheque) { parametros = { importe: getSugerido(), esNuevo: true }; } else { parametros = cheque; parametros.importe = cheque.IMP; } var modalInstance = $uibModal.open( { ariaLabelledBy: 'Carga de cheques', templateUrl: 'modal-cheque.html', controller: 'focaModalChequeController', size: 'lg', resolve: { cheque: function () { return parametros; } } } ); modalInstance.result.then( function (cheque) { var cobro = { COM: 'ch' + '(' + cheque.numero + ')' + ' ' + cheque.banco.desbco, numero: cheque.numero, banco: cheque.banco, FEC: cheque.fechaEmision.toLocaleDateString() + '-' + cheque.fechaPresentacion.toLocaleDateString(), fechaPresentacion: cheque.fechaPresentacion, fechaEmision: cheque.fechaEmision, IMP: cheque.importe, localidad: cheque.localidad, librador: cheque.librador, provincia: cheque.provincia, observaciones: cheque.observaciones, TIL: 'EF' }; pushearCobro(cobro, cheque.$$hashKey); }, function () { } ); } else { focaModalService.alert('Esta cobranza no se puede editar'); return; } }; $scope.seleccionarEfectivo = function () { if ($scope.cobranza.id === undefined) { var importe = 0; $scope.cobranza.cobros.filter(function (a) { if (a.COM === 'Efectivo') { importe = a.IMP; } }); var modalInstance = $uibModal.open( { ariaLabelledBy: 'Carga de cheques', templateUrl: 'modal-efectivo.html', controller: 'focaModalEfectivoController', size: 'sm', resolve: { sugerido: function () { return parseFloat(getSugerido()) + parseFloat(importe); } } } ); modalInstance.result.then( function (efectivo) { var cobro = { COM: 'Efectivo', FEC: new Date(), IMP: efectivo, TIL: 'EF' }; $scope.cobranza.cobros = $scope.cobranza.cobros.filter(function (a) { return a.COM !== 'Efectivo'; }); $scope.cobranza.cobros.push(cobro); }, function () { } ); } else { focaModalService.alert('Esta cobranza no se puede editar'); return; } }; $scope.seleccionarDetalles = function (detalle) { if ($scope.cobranza.id === undefined) { var parametro = {}; if (!detalle) { parametro = { importe: getSugerido(), files: [] }; } else { parametro = detalle; parametro.importe = detalle.IMP; parametro.files = detalle.imgs; } var modalInstance = $uibModal.open( { ariaLabelledBy: 'Carga de detalles', templateUrl: 'modal-detalles.html', controller: 'focaModalDetallesController', size: 'lg', resolve: { parametros: function () { return parametro; } } } ); modalInstance.result.then( function (detalles) { var cobro = { COM: 'de(COBRO POR DETALLES)', FEC: new Date(), IMP: detalles.importe, imgs: detalles.files, TIL: 'DE', observacion: detalles.observacion }; pushearCobro(cobro, detalles.$$hashKey); }, function () { } ); } else { focaModalService.alert('Esta cobranza no se puede editar'); return; } }; $scope.seleccionarMoneda = function () { if ($scope.cobranza.id === undefined) { 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 () { } ); } else { focaModalService.alert('Esta cobranza no se puede editar'); return; } }; $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.moneda.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') }); } $filter('filter')($scope.botonera, { label: 'Moneda' })[0].checked = true; }, function () { } ); }; $scope.getTotalDeuda = function () { var total = 0; for (var i = 0; i < $scope.cobranza.facturas.length; i++) { total += $scope.cobranza.facturas[i].IMP || $scope.cobranza.facturas[i].IPA; } return parseFloat(total.toFixed(2)); }; $scope.getTotalCobrado = function () { var total = 0; for (var i = 0; i < $scope.cobranza.cobros.length; i++) { total += $scope.cobranza.cobros[i].IMP; } 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) { if ($scope.cobranza.id === undefined) { $scope.cobranza.facturas.splice(key, 1); } else { focaModalService.alert('Esta comprobante no se puede eliminar'); return; } }; $scope.quitarCobro = function (key) { if ($scope.cobranza.id === undefined) { $scope.cobranza.cobros.splice(key, 1); } else { focaModalService.alert('Esta comprobante no se puede eliminar'); return; } }; $scope.editarCobro = function (cobro) { if (cobro.COM === 'Efectivo') { $scope.seleccionarEfectivo(); } else if (cobro.COM.substring(0, 2) === 'de') { $scope.seleccionarDetalles(cobro); } else if (cobro.COM.substring(0, 2) === 'ch') { $scope.seleccionarCheque(cobro); } }; $scope.$watch('cobranza.facturas', function () { if ($scope.cobranza.facturas.length) { $filter('filter')($scope.botonera, { label: 'Comprobantes' })[0].checked = true; } else { $filter('filter')($scope.botonera, { label: 'Comprobantes' })[0].checked = false; } }, true); $scope.$watch('cobranza.cobros', function () { if ($scope.cobranza.cobros.length) { $filter('filter')($scope.botonera, { label: 'Cobros' })[0].checked = true; } else { $filter('filter')($scope.botonera, { label: 'Cobros' })[0].checked = false; } }, true); function pushearCobro(cobro, hashKey) { var existe; $scope.cobranza.cobros.forEach(function (c, idx) { if (c.$$hashKey === hashKey) { $scope.cobranza.cobros[idx] = cobro; existe = true; } }); if (!existe) { $scope.cobranza.cobros.push(cobro); } } function salir() { var confirmacion = false; if (!angular.equals($scope.cobranza, $scope.inicial)) { 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('/'); } } function setearCobranza(cobranza) { $scope.editando = true; $scope.$broadcast('cleanCabecera'); if (cobranza.cliente) { $scope.$broadcast('addCabecera', { label: 'Cliente:', valor: $filter('rellenarDigitos')(cobranza.cliente.COD, 5) + ' - ' + cobranza.cliente.NOM }); $filter('filter')($scope.botonera, { label: 'Cliente' })[0].checked = true; } if (cobranza.cobrador && cobranza.cobrador.NUM) { $scope.$broadcast('addCabecera', { label: 'Cobrador:', valor: (cobranza.cobrador.NUM) ? $filter('rellenarDigitos')(cobranza.cobrador.NUM, 5) + ' - ' + cobranza.cobrador.NOM : cobranza.cobrador }); } // TODO: Setear moneda if (cobranza.moneda) { $filter('filter')($scope.botonera, { label: 'Moneda' })[0].checked = true; } $scope.cobranza = cobranza; } function getLSCobranza() { var cobranza = JSON.parse($localStorage.cobranza || null); if (cobranza) { setearCobranza(cobranza); delete $localStorage.cobranza; } } function enviarMail(recibo) { focaModalService.mail( { titulo: 'Enviar recibo', descarga: { nombre: recibo.recibo.PVE + '-' + recibo.recibo.NCO + '.pdf', url: '/mail/recibo/descargar', }, envio: { mailCliente: recibo.cliente.MAIL, url: '/mail/recibo', }, options: { recibo: recibo } } ); } function getSugerido() { var result; var valor = $scope.getTotalDeuda() + $scope.getTotalCobrado(); if (valor < 0) { result = Math.abs(valor).toFixed(4); } return result; } } ]);