var Transacciones_ventas_nueva=function(){
	this.baseUrl=null;
	this.windowsId=null;
	this.tools=null;
	this.keys=null;
	this.ventaapp=null;
	this.config={
		transacciones_validar_precio:null,
		transacciones_validar_existencia:null,
		transacciones_validar_cliente:null,
		transacciones_validar_credito_transitorios:null,
		transacciones_validar_contado_facturados:null
	}
	this.initializeEnviroment=function(url,winId){
		var _this=this;
		this.baseUrl=url;
		this.windowsId=winId;
		/*Cargar configuracioenes globales*/
		jQuery.ajaxSetup({async:false});
		$.post(this.baseUrl+"administracion/cargar_configs_obj",{configs:JSON.stringify(this.config)},function(configsVal){
			_this.config=configsVal;
		},'json').fail(function(){
			alert("ERROR: No se pudieron establer valores para las configuraciones de esta aplicación, se utilizarán los valores por defecto. Contatacte a soporte técnico");
		});
		jQuery.ajaxSetup({async:true});
		/*foco*/
		$("#"+this.windowsId+" #nueva-venta-app-producto-sku").focus();
		/*Mascaras*/
		$("#"+this.windowsId+" #nueva-venta-cliente-dui").inputmask({mask:"[99999999-9]"});
		$("#"+this.windowsId+" #nueva-venta-cliente-nit").inputmask({mask:"[9999-999999-999-9]"});
	
		/*Scroll*/
		$("#"+this.windowsId+" #nueva-venta-app-productos-wrapper").slimScroll({
			height: '150px'
		});
	}
	/*Inicializar clase de apoyo*/
	this.initializeTools=function(){
		/*Transaciones*/
		this.tools=new Transaccionestools(this.baseUrl);
		this.tools.setProductFrame($("#"+this.windowsId+" #nueva-venta-app-producto-info"));
		this.tools.setProductTable($("#"+this.windowsId+"  #nueva-venta-app-productos-wrapper > table"));
		this.tools.setTotalTable($("#"+this.windowsId+" #nueva-venta-app-totales-wrapper"));
		this.tools.SetTotalsProfile('grabadas,nosujetas,exentas,total','grabadas|+|nosujetas|+|exentas',true);
		/*Llaves*/
		this.keys=new Keys();
		/*Ventas*/
		this.ventaapp=new Ventasapp();
		this.ventaapp.setUrl(this.baseUrl);
		this.ventaapp.setConfig(this.config);
	}
	/*Eventos*/
	this.initializeListeners=function(){
		var _this=this;
		/*Boton agregar/quitar cliente*/
		$("#"+this.windowsId+" #nueva-venta-app-cliente-buscar-btn").click(function(e){
			e.preventDefault();
			_this.setCliente($(this));
		});
		/*Combobox tipo de decumento*/
		$("#"+this.windowsId+" #nueva-venta-app-documento").change(function(){
			_this.updatePriceProfile(true);
		});
		/*Boton buscar producto*/
		$("#"+this.windowsId+" #ventas-buscar-app-producto-btn").click(function(e){
			Custombox.open({
				target:_this.baseUrl+"productos/buscarproductos?field=nueva-venta-app-producto-sku&enter=true",
				effect: 'fadein'
			});
			e.preventDefault();
		});
		/*Textbox enter para cargar info producto*/
		$("#"+this.windowsId+" #nueva-venta-app-producto-sku").keypress(function(e){
			if(e.which == 13) {
				e.preventDefault();
				_this.tools.getProductInfoBySKU('tipo_venta,descripcion,precios,unidades,existencias',$(this).val(),$("#"+_this.windowsId+" #nueva-venta-app-producto-cant"));
			}
		});
		/*Boton navegar precios*/
		$("#"+this.windowsId+" .price-navigation-btn").click(function(){
			_this.tools.pricesNavigation($(this).attr('data-role'));
		});
		/*Boton agregar producto a la tabla*/
		$("#"+this.windowsId+" #nueva-venta-app-producto-agregar").click(function(e){
			_this.addProductToTable(null,null);
		});
		/*Boton quitar producto de la tabla*/
		$("#"+this.windowsId+" #nueva-venta-app-productos-wrapper").on('click','table tr td.table-del',function(){
			var tr = $(this).closest('tr');
			_this.tools.removeProductToTable($(tr));
		});
		/*Boton guardar venta*/
		$("#"+this.windowsId+" #guardar-venta-app-btn").click(function(){
			if(!$(this).is(':disabled'))
				_this.ventaapp.validarVenta($(this));
		});
		/*Boton guardar documentos*/
		$("#"+this.windowsId+" #nueva-venta-doc-guardar-btn").click(function(){
			if(!$(this).is(':disabled'))
				_this.ventaapp.validarVenta($(this));
		});
		/*Cerrar modal de documentos*/
		$('#nueva-venta-cliente-docs').on('hidden.bs.modal', function (e) {
			_this.ventaapp.cancelarValidarVenta();
		});
		/*Boton Cancelar guardar venta*/
		$("#nueva-venta-cancelar-guardar-btn").click(function(){
			if(!$(this).is(':disabled'))
				_this.ventaapp.cancelarValidarVenta();
		});
		/**/
		$("#nueva-venta-confirmar-salir-btn").click(function(){
			$('#nueva-venta-confirmar').modal("hide");
			$('#nueva-venta-confirmar').on('hidden.bs.modal', function(){
				setTimeout(function(){getAlertsMiracle15();_this.ventaapp.cargarTrans();Custombox.close();}, 100);
			});
		});	
		/**/
		$("#nueva-venta-confirmar-guardar-btn").click(function(){
			if(!$(this).is(':disabled'))
				_this.ventaapp.processVenta();
		});
		/*HOTKEYS*/
		/*cantidad*/
		$("#"+_this.windowsId+" #nueva-venta-app-producto-cant").bind("keydown","return",function(e){
			e.preventDefault();
			$("#nueva-venta-app-producto-costo").focus();
		});
		/*costo*/
		$("#"+_this.windowsId+" #nueva-venta-app-producto-costo").bind("keydown","return",function(e){
			e.preventDefault();
			$("#"+_this.windowsId+" #nueva-venta-app-producto-agregar").trigger('click');
		});
		/*precio anterior*/
		$("#"+_this.windowsId+" #nueva-venta-app-producto-costo").bind("keydown","down",function(e){
			e.preventDefault();
			$("#"+_this.windowsId+" #nueva-venta-precio-previo-btn").trigger('click');
		});
		/*precio siguiente*/
		$("#"+_this.windowsId+" #nueva-venta-app-producto-costo").bind("keydown","up",function(e){
			e.preventDefault();
			$("#"+_this.windowsId+" #nueva-venta-precio-siguente-btn").trigger('click');
		});
		/*Guardar*/
		$(document).bind('keydown', 'f10', function(e){
			e.preventDefault();
			$("#"+_this.windowsId+" #guardar-venta-app-btn").trigger('click');
		});
		$("#"+_this.windowsId+" .form-control").bind('keydown', 'f10', function(e){
			e.preventDefault();
			$("#"+_this.windowsId+" #guardar-venta-app-btn").trigger('click');
		});
		/*dui*/
		$("#"+_this.windowsId+" #nueva-venta-cliente-dui").bind('keydown', 'return', function(e){
			e.preventDefault();
			$("#"+_this.windowsId+" #nueva-venta-cliente-nit").focus();
		});
		/*nit*/
		$("#"+_this.windowsId+" #nueva-venta-cliente-nit").bind('keydown', 'return', function(e){
			e.preventDefault();
			$("#"+_this.windowsId+" #nueva-venta-cliente-nrc").focus();
		});
		/*nrc*/
		$("#"+_this.windowsId+" #nueva-venta-cliente-nrc").bind('keydown', 'return', function(e){
			e.preventDefault();
			$("#"+_this.windowsId+" #nueva-venta-doc-guardar-btn").trigger('click');
		});
	}
	/*Actualizar el formulario de nueva venta*/
	this.updateVentaInfo=function(){
		$cliente=$("#nueva-venta-app-cliente");
		$clienteField=$("#nueva-venta-app-cliente-text");
		$clienteSrchBtn=$("#nueva-venta-app-cliente-buscar-btn");
		$doc=$("#nueva-venta-app-documento")
		if($.trim($cliente.val())!=""){
			$clienteField.prop('readonly','true');
			$clienteSrchBtn.removeClass('btn-info');
			$clienteSrchBtn.find('i').removeClass('fa-search');
			$clienteSrchBtn.addClass('btn-default');
			$clienteSrchBtn.find('i').addClass('fa-times');
			$clienteSrchBtn.attr('data-function','unset');
		}
		this.updatePriceProfile(false);		
	},
	/*Agregar o quitar un cliente*/
	this.setCliente=function($sender){
		var _this=this;
		if($sender.attr('data-function')=='set'){
			Custombox.open({
				target:this.baseUrl+"clientes/listamini?field=nueva-venta-app-cliente-text&idfield=nueva-venta-app-cliente&duifield=nueva-venta-cliente-dui&nitfield=nueva-venta-cliente-nit&nrcfield=nueva-venta-cliente-nrc&sender="+$sender.attr('id'),
				effect: 'fadein',
				close:function(){
					_this.updatePriceProfile(true);
				}
			});
		}else{
			$("#"+this.windowsId+" #nueva-venta-app-cliente-text").val('');
			$("#"+this.windowsId+" #nueva-venta-app-cliente").val('');
			$("#"+this.windowsId+" #nueva-venta-app-cliente-text").removeAttr('readonly');
			$("#"+this.windowsId+" #nueva-venta-app-cliente-buscar-btn").removeClass('btn-default');
			$("#"+this.windowsId+" #nueva-venta-app-cliente-buscar-btn").addClass('btn-info');
			$("#"+this.windowsId+" #nueva-venta-app-cliente-buscar-btn").find('i').removeClass('fa-times');
			$("#"+this.windowsId+" #nueva-venta-app-cliente-buscar-btn").find('i').addClass('fa-search');
			$("#"+this.windowsId+" #nueva-venta-app-cliente-buscar-btn").attr('data-function','set');
			$("#"+this.windowsId+" #nueva-venta-app-cliente-text").attr('data-type','0');
			$("#"+this.windowsId+" #nueva-venta-app-cliente-text").attr('data-credito','0');
			$("#"+this.windowsId+" #nueva-venta-app-cliente-text").focus();
			_this.updatePriceProfile(true);
		}
	}
	/*Actualizar perfil de precios*/
	this.updatePriceProfile=function(updateProductTable){
		var clientType=parseInt($("#"+this.windowsId+" #nueva-venta-app-cliente-text").attr("data-type"));
		var docType=parseInt($("#"+this.windowsId+" #nueva-venta-app-documento").val());
		var strUpdate="";
		if(clientType==4){/*Exento*/
			if(docType==2){/*ccf*/
				this.tools.SetTotalsProfile("grabadas,iva,subtotal,nosujetas,exentas,total","subtotal|+|nosujetas|+|exentas",true);
				$("#"+this.windowsId+" #nueva-venta-app-perfil-precios").val("1");
				if(updateProductTable){
					strUpdate='.table-tipoventa@replacewtrans:3@.table-tipoventa:data-value|=|0';
				}
			}
			else{/*Desconocido, ninguno, factura, ticket, nota remision, nota envio, etc.*/
				this.tools.SetTotalsProfile("grabadas,nosujetas,exentas,total","grabadas|+|nosujetas|+|exentas",true);
				$("#"+this.windowsId+" #nueva-venta-app-perfil-precios").val("0");
				if(updateProductTable){
					strUpdate='.table-precio@operation:.table-precio|/|1.13@.table-tipoventa:data-value|=|0,.table-tipoventa@replacewtrans:3@.table-tipoventa:data-value|=|0,.table-total@operation:.table-precio|*|.table-cant';
				}
			}			
		}
		else if(clientType==3){/*Gran contribuyente*/
			if(docType==2){/*ccf*/
				this.tools.SetTotalsProfile("grabadas,iva,subtotal,retencion,nosujetas,exentas,total","subtotal|-|retencion|+|nosujetas|+|exentas",true);
				if(updateProductTable && $("#"+this.windowsId+" #nueva-venta-app-perfil-precios").val()=="0"){
					strUpdate='.table-precio@operation:.table-precio|/|1.13@.table-tipoventa:data-value|=|0,.table-total@operation:.table-precio|*|.table-cant';
					$("#"+this.windowsId+" #nueva-venta-app-perfil-precios").val("1");
				}
			}
			else{/*Desconocido, ninguno, factura, ticket, nota remision, nota envio, etc.*/
				this.tools.SetTotalsProfile("grabadas,retencionFac,nosujetas,exentas,total","grabadas|-|retencionFac|+|nosujetas|+|exentas",true);
				if(updateProductTable && $("#"+this.windowsId+" #nueva-venta-app-perfil-precios").val()=="1"){
					strUpdate='.table-precio@operation:.table-precio|*|0.13|+|.table-precio@.table-tipoventa:data-value|=|0,.table-total@operation:.table-precio|*|.table-cant';
					$("#"+this.windowsId+" #nueva-venta-app-perfil-precios").val("0");
				}
			}
		}
		else{/*No, otros y mediano contribuyente*/
			if(docType==2){/*ccf*/
				this.tools.SetTotalsProfile("grabadas,iva,subtotal,nosujetas,exentas,total","subtotal|+|nosujetas|+|exentas",true);
				if(updateProductTable){
					if($("#"+this.windowsId+" #nueva-venta-app-perfil-precios").val()=="0"){
						strUpdate='.table-precio@operation:.table-precio|/|1.13@.table-tipoventa:data-value|=|0,.table-total@operation:.table-precio|*|.table-cant';
						$("#"+this.windowsId+" #nueva-venta-app-perfil-precios").val("1");
					}
					else{
						console.log("de exento a nada ccf");
						strUpdate='.table-tipoventa@replacewtrans:0@.table-tipoventa:data-value|=|3';
					}
				}
			}
			else{/*Desconocido, ninguno, factura, ticket, nota remision, nota envio, etc.*/
				this.tools.SetTotalsProfile("grabadas,nosujetas,exentas,total","grabadas|+|nosujetas|+|exentas",true);
				if(updateProductTable){
					if($("#"+this.windowsId+" #nueva-venta-app-perfil-precios").val()=="1"){
						strUpdate='.table-precio@operation:.table-precio|*|0.13|+|.table-precio@.table-tipoventa:data-value|=|0,.table-total@operation:.table-precio|*|.table-cant';
						$("#"+this.windowsId+" #nueva-venta-app-perfil-precios").val("0");
					}else{
						strUpdate='.table-precio@operation:.table-precio|*|0.13|+|.table-precio@.table-tipoventa:data-value|=|3,.table-tipoventa@replacewtrans:0@.table-tipoventa:data-value|=|3,.table-total@operation:.table-precio|*|.table-cant';
					}
				}
			}
		}
		if(updateProductTable && strUpdate!=""){
			this.tools.updateTable(strUpdate,true);
		}
	}
	/**/
	this.addProductToTable=function(validPrecio,validCant){
		var _this=this;
		var valid=true;
		var conf=this.config
		/*Validar precios*/
		if(this.config.transacciones_validar_precio && this.config.transacciones_validar_precio>0){
			if(!validPrecio){
				var precio=parseFloat($("#"+this.windowsId+" #nueva-venta-app-producto-costo").val());
				var preciomin=parseFloat($("#"+this.windowsId+" #nueva-venta-app-producto-precio-bajo").val());
				if(precio<preciomin){
					var precioMsg="El precio ingresado es inferior al m&iacute;nimo autorizado.";
					switch(parseInt(this.config.transacciones_validar_precio)){
						/*Mostrar mensaje de abvertencia*/
						case 1:{
							valid=false;
							swal({
								title: "Precio m&iacute;nimo",
								text: precioMsg+"<br> &iquest;Desea utilizar este precio?",
								type: "warning",
								html: true,
								showCancelButton: true,
								confirmButtonColor: "#DD6B55",
								confirmButtonText: "Si, agregar producto",
								cancelButtonText: "No",
								closeOnConfirm: false,
								closeOnCancel: true
							},
							function(isConfirm){
								if (isConfirm) {
									_this.addProductToTable(true,validCant);
								}
							});
						break;}
						/*Solicitar Llave*/
						case 2:{
							valid=false;
							this.keys.getKey({
								method:'returnToFunction',
								msg:precioMsg+"<br/> Ingrese una llave de autorizaci&oacute;n",
								returnClass:_this,
								returnFunction:"addProductToTable",
								params:[validPrecio,validCant],
								indexParamReplace:0
							});
						break;}
						/*No permitir*/
						case 3:{
							valid=false;
							swal({
								title: "Precio m&iacute;nimo",
								text: precioMsg+"<br> Esta acci&oacute;n no esta permitida",
								type: "error",
								html: true,
								showCancelButton: false,
								confirmButtonColor: "#DD6B55",
								confirmButtonText: "Aceptar",
								cancelButtonText: "No",
								closeOnConfirm: true,
							},function(confirm){
								$("#"+_this.windowsId+" #nueva-venta-app-producto-costo").focus();
							});				
						break;}
					}
				}
			}
		}
		if(valid){
			/*Validar Existencias para productos*/
			if($("#"+this.windowsId+" #nueva-venta-producto-tipo").val()!="1"){
				/*Validar existencias*/
				if(this.config.transacciones_validar_existencia && this.config.transacciones_validar_existencia>0){
					if(!validCant){
						var cant=parseFloat($("#"+this.windowsId+" #nueva-venta-app-producto-cant").val())*parseFloat($("#"+this.windowsId+" #nueva-venta-app-unidades-representativas").val());
						var existencia= parseFloat($("#"+this.windowsId+" #nueva-venta-app-producto-existencias").val());
						var existenciaequival=parseFloat($("#"+this.windowsId+" #nueva-venta-app-producto-existencias").val())/parseFloat($("#"+this.windowsId+" #nueva-venta-app-unidades-representativas").val());
						var descripcion=$("#"+this.windowsId+" #nueva-venta-app-producto-desc").val();
						if(cant > existencia){
							var msg="Las cantidad requerida ("+$("#"+this.windowsId+" #nueva-venta-app-producto-cant").val()+" "+descripcion+") para este producto supera las existencias. (<strong>"+existenciaequival+" "+descripcion+"</strong>).";
							switch(parseInt(this.config.transacciones_validar_existencia)){
								/*Mostrar mensaje de abvertencia*/
								case 1:{
									valid=false;
									swal({
										title: "Existencias insuficientes",
										text: msg+"<br> &iquest;Desea agregar este producto a la lista?",
										type: "warning",
										html: true,
										showCancelButton: true,
										confirmButtonColor: "#DD6B55",
										confirmButtonText: "Si, agregar producto",
										cancelButtonText: "No",
										closeOnConfirm: false,
										closeOnCancel: true
									},
									function(isConfirm){
										if (isConfirm) {
											_this.addProductToTable(validPrecio,true);
										}
									});
								break;}
								/*Solicitar Llave*/
								case 2:{
									valid=false;
									this.keys.getKey({
										method:'returnToFunction',
										msg:msg+"<br/> Ingrese una llave de autorizaci&oacute;n para continuar",
										returnClass:_this,
										returnFunction:"addProductToTable",
										params:[validPrecio,validCant],
										indexParamReplace:1
									});
								break;}
								/*No permitir*/
								case 3:{
									valid=false;
									swal({
										title: "Existencias insuficientes",
										text: msg+"<br> Esta acci&oacute;n no esta permitida",
										type: "error",
										html: true,
										showCancelButton: false,
										confirmButtonColor: "#DD6B55",
										confirmButtonText: "Aceptar",
										cancelButtonText: "No",
										closeOnConfirm: true,
									},function(confirm){
										$("#"+_this.windowsId+" #nueva-venta-app-producto-cant").focus();
									});								
								break;}
							}
						}
					}
				}
			}
		}
		if(valid){
			var desgloseIVA=false;
			if(parseInt($("#"+this.windowsId+" #nueva-venta-app-cliente-text").attr("data-type"))===4){/*Ajuste para clientes exentos*/
				if($("#"+this.windowsId+" #nueva-venta-app-producto-tipoventa").val()=='0'){
					$("#"+this.windowsId+" #nueva-venta-app-producto-tipoventa").val("3");
					desgloseIVA=true;
				}
			}
			if($("#"+this.windowsId+" #nueva-venta-app-documento").val()=='2' && $("#"+this.windowsId+" #nueva-venta-app-producto-tipoventa").val()=='0'){
				desgloseIVA=true;
			}
			if(desgloseIVA){
				this.tools.addProductToTable('data:.frame-producto-id@data-id,data:.frame-presentacion-id@data-pre,data:.frame-unidades-representativas@data-uequiv,field:.frame-producto-sku@table-sku,field:.frame-producto-desc@table-desc,field:.frame-producto-cant@table-cant,operation:.frame-producto-precio|/|1.13@table-precio,operation:.frame-producto-precio|/|1.13|*|.frame-producto-cant@table-total,translation:.frame-producto-tipoventa@table-tipoventa,command:remove@table-del');
			}else{
				this.tools.addProductToTable('data:.frame-producto-id@data-id,data:.frame-presentacion-id@data-pre,data:.frame-unidades-representativas@data-uequiv,field:.frame-producto-sku@table-sku,field:.frame-producto-desc@table-desc,field:.frame-producto-cant@table-cant,field:.frame-producto-precio@table-precio,operation:.frame-producto-cant|*|.frame-producto-precio@table-total,translation:.frame-producto-tipoventa@table-tipoventa,command:remove@table-del');
			}
			swal.close();
		}
	}
}