<?php
class Facturacion extends CI_Controller
{
    protected $_fechaActual;
	protected $_iduser;
	protected $_csstyle;
    protected $_tables;
	protected $comprobante;
	protected $idLicencia;
	protected $_role;

	function __construct()
	{
		parent::__construct();

		if( ! $this->redux_auth->logged_in() )
		{//verificar si el el usuario ha iniciado sesion
 			redirect(base_url().'login');
 		}
		
		$this->load->library('MY_Letras');
                
        $datestring   = "%Y-%m-%d %H:%i:%s";
	    $this->_fechaActual = mdate($datestring,now());
		
	    $this->_iduser 		= $this->session->userdata('id');
        $this->config->load('datatables', TRUE);
  	    $this->_tables 		= $this->config->item('datatables');
		$this->_role 			= $this->session->userdata('role');

	    $this->config->load('style', TRUE);
	    $this->_csstyle = $this->config->item('style');

		$this->config->load('js',TRUE);
		$this->_jss=$this->config->item('js');
		
		$this->load->model("modelousuario","modelousuario");
		$this->load->model("modelo_configuracion","configuracion");
		$this->load->model('facturacion_modelo','facturacion');
        $this->load->model("modeloclientes","clientes");
		$this->load->model("global_modelo","globales");
		$this->load->model("nota_modelo","nota");
		$this->load->model("reportes_model","reportes");
		$this->load->model("facturamanual_modelo","manual");
        $this->load->model('facturav_model','modelofacturas');
		$this->load->model('ventas_model','ventas');
		$this->load->model('pagos_modelo','pagos');
		
		$this->idLicencia 		= $this->session->userdata('idLicencia');
		
		
            
	}//construct
	
	public function facturasCliente($idCliente,$limite=0,$idFactura=0)
	{
		$Data['title']			= "Panel de Administración";
		$Data['cassadmin']		=$this->_csstyle["cassadmin"];
		$Data['csmenu']			=$this->_csstyle["csmenu"];
		$Data['csvalidate']		=$this->_csstyle["csvalidate"];
		$Data['csui']			=$this->_csstyle["csui"];
		$Data['nameusuario']	=$this->modelousuario->getUsuarios($this->_iduser);
		$Data['Fecha_actual']	=$this->_fechaActual;
		$Data['Jquical']		=$this->_jss['jquerycal'];
		$Data['Jry']			=$this->_jss['jquery'];
		$Data['Jqui']			=$this->_jss['jqueryui'];
		$Data['jvalidate']		=$this->_jss['jvalidate'];
		$Data['jFicha_cliente']	=$this->_jss['jFicha_cliente'];
		$Data['JFunMensajeria']	=$this->_jss['JFunMensajeria'];
		$Data['permisos']		=$this->configuracion->obtenerRolPermisos($this->session->userdata('rol'));
		$Data['menuActivo']		='clientes'; 
		
		$this->load->view("cabezera",$Data);
		$this->load->view('header',$Data);
		$this->load->view("principal",$Data);

		$Pag["base_url"]		= base_url()."facturacion/facturasCliente/".$idCliente.'/';
		$Pag["total_rows"]		=$this->facturacion->numeroFacturasCliente($idCliente,$idFactura);//Total de Registros
		$Pag["per_page"]		=20;
		$Pag["num_links"]		=5;
		$Pag["uri_segment"]		=4;
		
		$this->pagination->initialize($Pag);
		
		#----------------------------------PERMISOS------------------------------------#

		$data['permiso']=$this->configuracion->obtenerPermisosId('1',$this->session->userdata('rol'));
		
		if($data['permiso']->leer=='0' and $data['permiso']->escribir=='0')
		{
			$this->load->view('accesos/index');
			$this->load->view("pie",$Data);
			
			return;
		}
		#------------------------------------------------------------------------------#
		$data['cliente']		= $this->clientes->obtenerCliente($idCliente);
		$data['facturas'] 		= $this->facturacion->obtenerFacturasCliente($Pag["per_page"],$limite,$idCliente,$idFactura);
		$data['idFactura']		= $idFactura;
		$data['idCliente']		= $idCliente;
		$data['permisoCancelar']= $this->_role!=1?$this->configuracion->comprobarPermisoAsignado($this->_iduser,11):1;

		$this->load->view('facturacion/facturasClientes',$data);
		$this->load->view("pie",$Data);
	}
	
	function descargarXML($idFactura) #Descargar el archivo XML
	{
		$this->load->helper('download');
		
		#$serie=$this->session->userdata('serie');
		$factura		= $this->facturacion->obtenerFacturaRecibo($idFactura);
		$configuracion	= $this->configuracion->obtenerEmisor($factura->idEmisor);
		$folio			= $factura->folio;
		
		
		#$ruta				='media/fel/'.$factura->idLicencia.'_facturacion/cfdi/folio'.$factura->folio.'/';
		$ruta				= carpetaCfdi.$factura->idLicencia.'_facturacion/cfdi/'.$configuracion->rfc.'/folio'.$factura->serie.$factura->folio.'/';
		
		if(!file_exists($ruta))
		{
			$this->load->helper('sat');
			crearDirectorio($ruta);
		}
		
		$nombre	= $configuracion->rfc.'_'.$factura->serie.$factura->folio.'.xml';
		
		if(!file_exists($ruta.$nombre))
		{
			$fichero	=fopen($ruta.$nombre,"w");	
			fwrite($fichero,$factura->xml);
			fclose($fichero);
		}
		

		#$fichero 	= 'cfdi'.$folio.'Timbre.xml';
		#$descarga 	= $factura->serie.$folio.'.xml';
		#$data 		= file_get_contents("media/fel/".$factura->idLicencia."_facturacion/cfdi/folio".$folio."/$fichero"); 
		$data 		= file_get_contents($ruta.$nombre); 
		
		force_download($nombre, $data); 
	}
	
	public function cancelarFactura()#Cancerlar el CFDI
	{
		if(!empty($_POST))
		{
			$cancelar=$this->modelofacturas->cancelarFactura();
			print($cancelar);
		}
	}
	
	public function facturaGlobal()
	{
		if(!empty($_POST))
		{
			$configuracion=$this->configuracion->obtenerConfiguracion();
			
			$global=$this->modelofacturas->generarFactura($configuracion);
			
			if($global=="1")
			{
				$this->session->set_userdata('notificacion','La factura se ha creado correctamente');
			}
			
			print($global);
		}
	}
	
	public function facturaParcial()
	{
		$idCotizacion		=$this->input->post('idCotizacion');
		$cotizacion			=$this->facturacion->obtenerCotizacion($idCotizacion);
		
		#$productos			=$this->facturacion->obtenerProductosCotizacion($cotizacion->idCotizacion);
		$cliente			=$this->facturacion->obtenerCliente($cotizacion->idCliente);
		$folio				=$this->facturacion->obtenerFolio();
		$divisas			=$this->configuracion->obtenerDivisas();
		
		$subTotal			=$cotizacion->subTotal;
		$iva				=$cotizacion->iva;
		$descuento			=$cotizacion->descuento/100;
		
		$descuento			=$subTotal*$descuento;
		$suma				=$subTotal-$descuento;
		$iva				=$suma*$iva;
		$total=				$suma+$iva;
		
		#PARCIALES
		#---------------------------------------------------------------------------------------------------------#
		$parciales			=$this->facturacion->obtenerFacturasParciales($idCotizacion);
		
		if($parciales!=null)
		{
			$totalParciales		=$this->facturacion->sumarFacturasParciales($idCotizacion);
			
			$total				=$cotizacion->total-$totalParciales;
			$totalIva			=$total/(1+$cotizacion->iva);
			$iva				=$total-$totalIva;
			
			$subTotal			=$cotizacion->descuento>0?$totalIva/(1-($cotizacion->descuento/100)):$totalIva;
			$descuento			=$subTotal-$totalIva;
		}

		echo'
		<table class="admintable" width="100%;">
			<tr>
			  <td class="key">Cliente:</td>
			  <td>'.$cliente->empresa.'</td>
			</tr>	
			<tr>
				<td class="key">Subtotal:</td>
				<td>
					<input onchange="calcularDatosParcial()" type="text" class="cajas" id="txtSubTotalParcial"  value="'.round($subTotal,2).'" />
				</td>
			</tr>
			
			 <tr>
				<td class="key">Descuento ('.$cotizacion->descuento.'%):</td>
				<td>
					<label id="lblDescuento">$'.number_format($descuento,2).'</label>
				</td>
			</tr>
			<tr>
				<td class="key" >IVA ('.($cotizacion->iva*100).'%):</td>
				<td>
					<label id="lblIva">$'.number_format($iva,2).'</label>
				</td>
			</tr>
			
			<tr>
				<td class="key" >Retención:</td>
				<td>
					<label>Nombre</label> 	<input value="" type="text" class="cajas" id="txtNombreRetencionParcial" /><br />
					<label>Tasa %</label>&nbsp;&nbsp;<input  value="0" style="width:100px" type="text" class="cajas" id="txtTasaParcial" /><br />
					<label>Importe</label> <input  onchange="calcularDatosParcial()" value="0" style="width:100px" type="text" class="cajas" id="txtRetencionParcial" />
					
					<input type="hidden" id="porcentajeDescuento" 	value="'.$cotizacion->descuento.'" />
					<input type="hidden" id="porcentajeIva" 		value="'.$cotizacion->iva.'" />
					<input type="hidden" id="txtSubTotalTotal" 		value="'.$subTotal.'" />
					<input type="hidden" id="txtDescuentoParcial" 	value="'.$descuento.'" />
					<input type="hidden" id="txtSumaParcial" 		value="'.($subTotal-$descuento).'" />
					<input type="hidden" id="txtIvaParcial" 		value="'.$iva.'" />
					<input type="hidden" id="txtTotalParcial" 		value="'.$total.'" />
				</td>
			</tr>
			
			<tr>
				<td class="key">Concepto:</td>
				<td>
					<input type="text" class="cajas" id="txtConcepto" style="width:550px"  value="" />
				</td>
			</tr>
			
			<tr>
				<td class="key">Unidad:</td>
				<td>
					<input type="text" class="cajas" id="txtUnidad"  value="PZA" />
				</td>
			</tr>
			
			<tr>
				<td class="key">Total:</td>
				<td> 
					<label id="lblTotalParcial">$'.number_format($total,2).'</label>
				</td>
			</tr>
			
			<tr>
				<td class="key">Folio:</td>
				<td>'.$this->session->userdata('serie').$folio.'</td>
			</tr>
			
			<tr>
				<td class="key">Divisa:</td>
				<td>
					<select class="cajas" id="selectDivisasParcial">';
				
				foreach ($divisas as $row)
				{
					$seleccionado=$row->idDivisa==$cotizacion->idDivisa?'selected="selected"':'';
					
					echo '<option '.$seleccionado.' value="'.$row->idDivisa.'">'.$row->nombre.' ($'.$row->tipoCambio.')</option>';
				}
				
				echo'
					</select>
				</td>
			</tr>

			<tr>
				<td class="key">Metodo de pago:</td>
				<td>
					<input type="text" style="width:400px" class="cajas" id="txtMetodoPagoParcial" name="txtMetodoPagoParcial" value="Efectivo" />
				</td>
			</tr>
			<tr>
				<td class="key">Forma de pago:</td>
				<td>
					<input type="text" style="width:400px" class="cajas" id="txtFormaPagoParcial" name="txtFormaPagoParcial" value="Pago en una sola exhibición" />
				</td>
			</tr>
			 <tr>
				<td class="key">Condiciones de pago:</td>
				<td>
					<input type="text" style="width:400px" class="cajas" id="txtCondicionesParcial" name="txtCondicionesParcial" value="30 días a partir de la fecha de entrega" />
				</td>
			</tr>
		</table>';
	}
	
	public function obtenerDatosFactura()
	{
		$idCotizacion				= $this->input->post('idCotizacion');
		$data['cotizacion']			= $this->facturacion->obtenerCotizacionFactura($idCotizacion);
		$data['cliente']			= $this->facturacion->obtenerCliente($data['cotizacion']->idCliente);
		$data['facturas']			= $this->facturacion->obtenerFacturasCotizacion($idCotizacion);
		$data['factura']			= $this->facturacion->obtenerFacturaCotizacion($data['cotizacion']->idFactura);
		#$data['folio']				= $this->facturacion->obtenerFolio();
		$data['emisores']			= $this->configuracion->obtenerEmisoresFacturacion();
		$data['divisas']			= $this->configuracion->obtenerDivisas();
		$data['permiso']			= $this->_role!=1?$this->configuracion->comprobarPermisoAsignado($this->_iduser,3):1;

		$data['idCotizacion']		= $idCotizacion;
		
		$data['metodos']			= $this->configuracion->obtenerMetodosPago();
		$data['formas']				= $this->configuracion->obtenerFormasPago();
		$data['usos']				= $this->configuracion->obtenerUsosCfdi();
		$data['relaciones']			= $this->configuracion->obtenerTipoRelaciones();
		
		/*$data['comprados']			= $this->configuracion->obtenerFoliosComprados();
		$data['folios']				= $this->configuracion->obtenerFoliosConsumidosEmpresas();*/
		
		$data['comprados']			= $this->configuracion->obtenerFoliosComprados();
		$data['folios']				= $this->configuracion->obtenerFoliosConsumidos()+$this->configuracion->obtenerFoliosErrores();
		
		$this->load->view('facturacion/obtenerDatosFactura',$data);
	}
	
	//Quitar el limite para la ejecución del script de facturacion con el PAC
	//Esto incluye la conversión de archivos 
	public function crearCFDI()
	{
		if(!empty($_POST))
		{
			set_time_limit(0); 
			
			$factura	=$this->facturacion->crearCFDI();
			
			if($factura=="1")
			{
				$this->session->set_userdata('notificacion','La factura se ha creado correctamente');
			}
			
			echo $factura;
		}
	}
	
	public function vistaPrevia()
	{
		if(!empty($_POST))
		{
			set_time_limit(0); 
			
			$factura	=$this->facturacion->vistaPrevia();

			echo $factura;
		}
	}
	
	public function devolverProductosVenta()
	{
		if(!empty($_POST))
		{
			$devolver	=$this->facturacion->devolverProductosVenta();
			print($devolver);
		}
	}
	
	public function reposicionesVenta()
	{
		if(!empty($_POST))
		{
			$reposicion	=$this->facturacion->reposicionesVenta();
			print($reposicion);
		}
	}
	
	public function obtenerDevolucionesVenta()
	{
		if(!empty($_POST))
		{
			$idCotizacion		=$this->input->post('idCotizacion');
			$cotizacion			=$this->facturacion->obtenerCotizacion($idCotizacion);
			$productos			=$this->facturacion->obtenerProductosCotizacion($idCotizacion);
			$nota				=0;
			
			echo'
			<i>Nota: Realizar todas las devoluciones antes de realizar la Nota de Crédito</i>
			<table class="admintable" width="100%" style="border-collapse: collapse">
				<tr>
					<th colspan="7">Devoluciones de la orden de venta '.$cotizacion->ordenCompra.'</th>
				</tr>
				<tr>
					<th>#</th>
					<th>Producto</th>
					<th>Cantidad</th>
					<th>Precio</th>
					<th>Importe</th>
					<th>Devolución</th>
					<th>Acciones</th>
				<tr>';
			
			$i=1;
			
			echo'<input type="hidden" id="txtIdCotizacion" value="'.$idCotizacion.'" />'; #Campos ocultos
			
			foreach($productos as $row)
			{
				$estilo=$i%2>0?"class='sinSombra'":'class="sombreado"';
	
				echo'
				<tr '.$estilo.'>
					<td>'.$i.'</td>
					<td style="border-radius: 0px">'.$row->nombre.'</td>
					<td align="center">'.number_format($row->cantidad,2).'</td>
					<td align="right">$ '.number_format($row->precio,4).'</td>
					<td align="right">$ '.number_format($row->importe,4).'</td>
					<td align="center">';
					
					if($row->devueltos==0)
					{
						echo'
						<input type="text" id="txtCantidadDevolver'.$i.'" class="cajas" />
						<input type="hidden" id="txtCantidadTotal'.$i.'" value="'.$row->cantidad.'" />';
					}
					else
					{
						echo number_format($row->devueltos,2);
					}
						
					echo'</td>
					<td align="center">';
					
					if($row->entregado==0)
					{
						echo'Pendiente de entrega';
					}
					else
					{
						if($row->devueltos==0)
						{
							echo'<input type="checkbox" id="chkDevoluciones'.$i.'" title="Devolver" 
								onchange="devolverProductoVenta('.$i.','.$row->idProducto.')" /><br />
								<a>Devolver</a>'; 
						}
						else
						{
							$nota=1;
							
							if($row->repuesto==0)
							{
								echo'<img title="Reposicion" onclick="reposicionesVenta('.$row->idProducto.')" 
									src="'.base_url().'img/reposicion.png" id="reposiciones'.$i.'" width="22" />
								<br />
								<a>Reponer</a>';
							}
							else
							{
								echo'<img title="Se ha repuesto el producto" src="'.base_url().'img/success.png" width="22" />
								<br />
								<a>Repuesto</a>';
							}
						}
					}
					
					echo'
					</td>
				</tr>';
				
				$i++;
			}
			
			if($cotizacion->idFactura!=0 and $nota==1 and $cotizacion->idNota==0)
			{
				echo'
				<tr>
					<td colspan="7" align="right">
						<img src="'.base_url().'img/similares.png" width="22" style="margin-right:33px" 
							title="Crear Nota de Crédito" id="notaCredito" onclick="obtenerDetallesNota('.$idCotizacion.')" />
						<br />
						<a>Nota de Crédito</a>
					</td>
				</tr>';
			}
				
			echo'</table>
			
			<script>
			$("#notaCredito").click(function(e)
			{
				$("#ventanaNotaCredito").dialog("open");
			});
			</script>';
		}
	}
	
	public function obtenerDetallesNota()
	{
		if(!empty($_POST))
		{
			$idCotizacion	=$this->input->post('idCotizacion');
			$cotizacion		=$this->facturacion->obtenerCotizacion($idCotizacion);
			$productos		=$this->facturacion->obtenerProductosNota($idCotizacion);
			
			echo'
			<table class="admintable" width="99%" style="border-collapse: collapse">
				<tr>
					<th colspan="7">Detalles de la orden de venta '.$cotizacion->ordenCompra.' para crear la Nota de Crédito</th>
				</tr>
				<tr>
					<th>#</th>
					<th>Producto</th>
					<th>Cantidad</th>
					<th>Precio</th>
					<th>Importe</th>
				<tr>';
			
			$i			=1;
			$subTotal	=0;
			$total		=0;
			$iva		=$cotizacion->iva;
			$descuento	=$cotizacion->descuento/100;
			
			foreach($productos as $row)
			{
				$subTotal+=$row->devueltos*$row->precio;
				echo'
				<tr>
					<td>'.$i.'</td>
					<td style="border-radius: 0px">'.$row->nombre.'</td>
					<td align="center">'.number_format($row->devueltos,2).'</td>
					<td align="right">$ '.number_format($row->precio,4).'</td>
					<td align="right">$ '.number_format($row->devueltos*$row->precio,4).'</td>
				</tr>';
				
				$i++;
			}
			
			$descuento	=$subTotal*$descuento;
			$suma		=$subTotal-$descuento;
			$iva		=$suma*$iva;
			$total		=$suma+$iva;
			
			echo'
			<tr>
				<td class="totales" colspan="4" align="right">SUBTOTAL</td>
				<td align="right">$'.number_format($subTotal,4).'</td>
			</tr>
			<tr>
				<td class="totales" colspan="4" align="right">DESCUENTO '.number_format($cotizacion->descuento/100,2).'%</td>
				<td align="right">$'.number_format($descuento,4).'</td>
			</tr>
			<tr>
				<td class="totales" colspan="4" align="right">IVA '.number_format($cotizacion->iva,2).'%</td>
				<td align="right">$'.number_format($iva,4).'</td>
			</tr>
			<tr>
				<td class="totales" colspan="4" align="right">TOTAL</td>
				<td align="right">'.number_format($total,4).'</td>
			</tr>';
			
			echo '</table>';
			
			echo '
			<table class="admintable" width="99%" style="margin-top:4px">
				 <tr>
				<td class="key">Método de pago</td>
				<td>
					<input type="text" style="width:250px" class="cajas" id="txtMetodoPago1" name="txtMetodoPago1" value="Efectivo" />
				</td>
			</tr>
			<tr>
				<td class="key">Forma de pago</td>
				<td>
					<input type="text" style="width:250px" class="cajas" id="txtFormaPago1" name="txtFormaPago1" value="Pago en una sola exhibición" />
				</td>
			</tr>
			 <tr>
				<td class="key">Condiciones de pago</td>
				<td>
					<input type="text" style="width:250px" class="cajas" id="txtCondiciones1" name="txtCondiciones1" value="30 días a partir de la fecha de entrega" />
				</td>
			</tr>
		</table>';
		}
	}
	
	#------------------------------------------------------------------------------------------------------------------#
	#------------------------------------------------CANCELAR      FACTURA---------------------------------------------#
	#------------------------------------------------------------------------------------------------------------------#
	
	public function obtenerFacturaCancelar()
	{
		if(!empty($_POST))
		{
			$idFactura					= $this->input->post('idFactura');
			$data['factura']			= $this->pagos->obtenerFactura($idFactura);
			$data['cancelaciones']		= $this->configuracion->obtenerMotivosCancelacion();

			if($data['factura']->pago=='1')
			{
				$data['pago'] 			= $this->pagos->obtenerPago($idFactura);
			}
			
			if(($data['factura']->relacionesUuid+$data['factura']->relacionesPagos)>0)
			{
				$data['relaciones']		= $this->facturacion->obtenerRelacionesCfdi($idFactura);
				$data['pagos'] 			= $this->facturacion->obtenerFacturasPagos($idFactura);
			}
			
			$this->load->view('facturacion/cancelar/obtenerFacturaCancelar',$data);
		}
	}
	
	public function cancelarCFDI()
	{
		if(!empty($_POST))
		{
			$factura	= $this->facturacion->cancelarCFDI();
			
			if($factura[0]=="1")
			{
				$this->session->set_userdata('notificacion','La factura se ha cancelado correctamente');	
			}
			
			echo json_encode($factura);
		}
		else
		{
			echo json_encode(array('0','Error'));
		}
	}
	
	public function formularioCorreo()
	{
		if(!empty($_POST))
		{
			$idFactura			= $this->input->post('idFactura');
			$data['factura']	= $this->facturacion->obtenerFacturaRecibo($idFactura);
			
			if($data['factura']->pago=='1')
			{
				$data['pago'] 		= $this->pagos->obtenerPago($idFactura);
			}

			$this->load->view('facturacion/enviar/formularioEnviar',$data);
			
			#$factura->email
		}
	}
	
	public function generarCodigoBidimensional($factura,$configuracion)
	{
		$this->load->helper('qrlib');

		$partes		=explode(".",$factura->total);
		$entero		=$partes[0];
		$decimal	=$partes[1];
		
		$valor		=strlen($entero);
		$ceros		=10-$valor;
		$ceroEntero	="";
		
		for($i=1;$i<=$ceros;$i++)
		{
			$ceroEntero.="0";
		}
		
		$ceroEntero.=$entero;
		
		$valor			=strlen($decimal);
		$ceros			=6-$valor;
		$ceroDecimal	="";
		
		for($i=1;$i<=$ceros;$i++)
		{
			$ceroDecimal.="0";
		}
		
		$ceroDecimal			=$decimal.$ceroDecimal;
		$codigoBidimensional 	= "?re=".$configuracion->rfc."&rr=".$factura->rfc."&tt=".$ceroEntero.".".$ceroDecimal."&id=".$factura->UUID."";
		
		#echo $codigoBidimensional;
		
		#$codigo='media/fel/'.$this->idLicencia.'_facturacion/cfdi/folio'.$factura->folio.'/codigo'.$factura->folio.'.png';
		$codigo	= carpetaCfdi.$factura->idLicencia.'_facturacion/cfdi/'.$configuracion->rfc.'/folio'.$factura->serie.$factura->folio.'/codigo'.$factura->serie.$factura->folio.'.png';
		
		#if(!file_exists($codigo))
		{
			QRcode::png($codigoBidimensional, $codigo, 'L', 3, 2);
		}
	}
	
	public function crearFacturaFisica($idFactura,$valor)
	{
		ini_set("memory_limit","1500M");
		set_time_limit(0);
		
		$this->load->library('ccantidadletras');
		$this->load->library('mpdf/mpdf');
		$this->load->helper('sat');
		$this->load->helper('qrlib');
		
		$data['factura'] 		= $this->facturacion->obtenerFactura($idFactura);
		$data['configuracion'] 	= $this->configuracion->obtenerEmisor($data['factura']->idEmisor);
		
		#$ruta				='media/fel/'.$this->idLicencia.'_facturacion/cfdi/folio'.$data['factura']->folio.'/';
		$ruta					= carpetaCfdi.$data['factura']->idLicencia.'_facturacion/cfdi/'.$data['configuracion']->rfc.'/folio'.$data['factura']->serie.$data['factura']->folio.'/';
		
		if(!file_exists($ruta))
		{
			crearDirectorio($ruta);
		}
		
		$data['cliente'] 		= $this->clientes->obtenerDatosCliente($data['factura']->idCliente);
		$data['retencion'] 		= $this->facturacion->obtenerRetencion($idFactura);
		$data['productos'] 		= $data['factura']->global==0?$this->facturacion->obtenerProductosFacturados($idFactura):$this->facturacion->obtenerProductosGlobal($idFactura);
		
		$data['pago']			= $this->reportes->obtenerPagadoVenta($data['factura']->idCotizacion);	
		#$data['reporte'] 		= 'facturacion/factura';
		$data['cuentas']		= $this->configuracion->obtenerCuentasFactura();	
		$data['valor']			= $valor;	
		$data['cotizacion']		= null;	
		
		if($data['factura']->idCotizacion!=0)
		{
			$data['cotizacion']			= $this->ventas->obtenerRemision($data['factura']->idCotizacion);
		}
		
		if($data['factura']->pago=='1')
		{
			$data['pago'] 		= $this->pagos->obtenerPago($idFactura);
			$data['relacion'] 	= $this->pagos->obtenerFacturaRelacion($idFactura);
		}
		
		if($data['factura']->version=='1')
		{
			$data['reporte'] 		= $data['factura']->pago=='0'?'facturacion/3.3/factura':'facturacion/pagos/pago';	
		}
		else
		{
			$data['reporte'] 		= 'facturacion/factura';	
		}
		
		if($data['factura']->version=='0')
		{
			$this->generarCodigoBidimensional($data['factura'],$data['configuracion']);
		}
		else
		{
			generarCodigoBidimensional33($data['factura'],$data['configuracion']);
		}
		
		$this->ccantidadletras->setIdioma("ES");
        $this->ccantidadletras->setNumero($data['factura']->total);
		$this->ccantidadletras->setMoneda($data['factura']->divisa);//
		
		$CantidadLetras			=$this->ccantidadletras->PrimeraMayuscula();
		$data['cantidadLetra']	=$CantidadLetras;

		$html	=$this->load->view('facturacion/principal',$data,true);
		#$pie 	= $this->load->view('facturacion/pie',$data,true);
		
		if($data['factura']->version=='1')
		{
			$pie 					= $this->load->view('facturacion/3.3/pie',$data,true);
		}
		else
		{
			$pie 					= $this->load->view('facturacion/pie',$data,true);
		}
		
		#$this->mpdf->mPDF('en-x','Letter','','',10,10,10,70,6,0);
		
		if($data['cotizacion']!=null)
		{
			$this->mpdf->mPDF('en-x','Letter','','',5,5,4,117,6,0);	
		}
		else
		{
			$this->mpdf->mPDF('en-x','Letter','','',5,5,4,70,6,0);
		}
		
		$this->mpdf->SetHTMLFooter($pie);
		$this->mpdf->SetHTMLFooter($pie,'E');
		$this->mpdf->mirrorMargins = 1;
		$this->mpdf->WriteHTML($html);

		$pdf				=$ruta.$data['configuracion']->rfc.'_'.$data['factura']->serie.$data['factura']->folio.'.pdf';
		$xml				=$ruta.$data['configuracion']->rfc.'_'.$data['factura']->serie.$data['factura']->folio.'.xml';

		$documentos['pdf']	=$pdf;
		$documentos['xml']	=$xml;
		
		$this->mpdf->Output($pdf,'F');
		
		#CREAR EL XML FISICO
		$fichero	=fopen($xml,"w");	
		fwrite($fichero,$data['factura']->xml);
		fclose($fichero);
		
		#if($data['factura']->global==0 and $data['factura']->documento=='FACTURA')
		if($valor==0)
		{
			#if($data['pago']<$factura->total)
			#{
			$documentos['xml']	='';
			#}
		}
		
		#$this->comprobante=$data['factura']->serie.$data['factura']->folio;
		
		return $documentos;
	}
	
	public function enviarFacturaAdjunta()
	{
		$idFactura			= $this->input->post('idFactura');
		$factura			= $this->facturacion->obtenerFacturaEnviar($idFactura);
		$emisor				= $this->configuracion->obtenerEmisor($factura->idEmisor);
		
		if($factura->documento!='Recibo de Nómina')
		{
			$documentos		= $this->reportes->crearFactura($idFactura,1);
		}
		else
		{
			$this->load->library('../controllers/pdf','pdf');
			
			$documentos		= $this->pdf->reciboNomina($idFactura,1);
		}
		
		$configuracion		= $this->facturacion->obtenerConfiguracion();
		$destinatario		= $this->input->post('email');
		
		$this->load->library('email');
		$this->email->from($configuracion->correo,$configuracion->nombre);
		$this->email->to($destinatario);
		
		$imagen				= "";
		
		if(file_exists(carpetaCfdi.$factura->idLicencia.'_facturacion/cfdi/'.$emisor->rfc.'/'.$emisor->logotipo) and strlen($emisor->logotipo)>3)
		{
			$imagen= '<img src="'.base_url().carpetaCfdi.$factura->idLicencia.'_facturacion/cfdi/'.$emisor->rfc.'/'.$emisor->logotipo.'" style="max-width:200px; max-height:90px;" />';
		}
		
		$this->email->attach($documentos['pdf']);
		
		if(strlen($documentos['xml'])>0)
		{
			$this->email->attach($documentos['xml']);
		}
		
		$cuerpo				= $imagen.'<br/><br/><strong>Por favor consulte los adjuntos</strong>';

		$this->email->subject('Factura '.$factura->serie.$factura->folio);
		$this->email->message($cuerpo);
		
		if (!$this->email->send())
		{
			echo '0';
		}
		else
		{
			$this->configuracion->registrarBitacora('Enviar CFDI','Facturación',$factura->serie.$factura->folio.', Email: '.$destinatario); //Registrar bitácora
			
			$this->facturacion->facturaEnviada($idFactura);
			echo "1";
		}
	}
	
	public function enviarCorreoFactura()
	{
		$idFactura		=$this->input->post('idFactura');
		$configuracion	=$this->facturacion->obtenerConfiguracion();
		$factura		=$this->facturacion->obtenerFactura($idFactura);
		
		$destinatario	=$this->input->post('email');
		
		if(strlen($configuracion->correo)>2 and strlen($destinatario)>2)
		{
			#$destinatario	=$factura->empresa."<".$factura->email.">";
			

			$email			=$configuracion->correo;#$configuracion->email;
			$nombre			=$configuracion->nombre;#$configuracion->institucion;
			#$nombre	='CENTRO ';#$configuracion->institucion;
			$encriptacion	=sha1($idFactura);
			
			$datos='';
			
			#if(file_exists('img/logos/'.$this->session->userdata('logotipo')))
			#{
				$datos='<img src="'.base_url().'img/jen.png" width="215" height="99" />';
			#}
			
			$datos.='<br /><br />
			<strong>Por favor descargue los documentos de los siguientes vinculos</strong> <br /><br />';
			#$datos.='<a style="color:#0066CC" href="'.base_url().'descargas/cfdi/'.$configuracion->rfc.'_'.$factura->serie.$factura->folio.'/'.$encriptacion.'">Descargar PDF</a><br />';
			#$datos.='<a style="color:#0066CC" href="'.base_url().'descargas/descargarXML/'.$encriptacion.'">Descargar XML</a>';
			
			#<a style="text-decoration:none; border:none; color:#0066CC" href="'.base_url().'descargas/cfdi/'.$configuracion->rfc.'_'.$factura->serie.$factura->folio.'/'.$encriptacion.'">
			$datos.='
			<a style="text-decoration:none; border:none; color:#0066CC" href="'.base_url().'pdf/crearFactura/'.$idFactura.'">
				<img  src="'.base_url().'img/descargar.png" style="border:none; height:50px; width:50px;" title="Descargar PDF" />
			</a>&nbsp;&nbsp;';
			$datos.='
			<a style="text-decoration:none; border:none; color:#0066CC" href="'.base_url().'descargas/descargarXML/'.$factura->encriptacion.'">
				<img  src="'.base_url().'img/cfdi.png" style="border:none; height:50px; width:50px;" title="Descargar XML" />
			</a><br />
			&nbsp;&nbsp;&nbsp;
			<strong>PDF</strong>
			&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			<strong>XML</strong>';
			
			$asunto = "Factura";
			$cuerpo = '
			<html>
			<head>
			   <title>Factura</title>
			</head>
			<body>
			'.$datos.'
			</body>
			</html>';
			
			//para el envío en formato HTML
			$headers = "MIME-Version: 1.0\r\n";
			$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
			
			//dirección del remitente
			$headers .= 'From: Jenrab de México <'.$email.">\r\n";
			
			//dirección de respuesta, si queremos que sea distinta que la del remitente
			#$headers .= "Reply-To: ".$email."\r\n";
			
			//ruta del mensaje desde origen a destino
			#$headers .= "Return-path: ".$email."\r\n";
			
			//direcciones que recibián copia
			#$headers .= "Cc: ".$email."\r\n";
			
			//direcciones que recibirán copia oculta
			#$headers .= "Bcc: ".$email."\r\n";
			
			if(mail($destinatario,$asunto,$cuerpo,$headers))
			{
				echo "1";
			}
			else
			{
				echo "0";
			}
		}
		else
		{
			echo "2";
		}
	}
	
	public function obtenerFolioEmisor()
	{
		$data['emisor']				= $this->facturacion->obtenerConfiguracionFolio($this->input->post('idEmisor'));
		$data['folio']				= $this->facturacion->obtenerFolio($data['emisor']);
		
		 $this->load->view('facturacion/obtenerFolioEmisor',$data);
	}
	
	public function formularioFacturaGlobal()
	{
		#$data['folio']				= $this->facturacion->obtenerFolio();
		$data['configuracion']		= $this->facturacion->obtenerConfiguracion();
		$data['emisores']			= $this->configuracion->obtenerEmisoresFacturacion();
		$data['folios']				= $this->configuracion->obtenerFoliosConsumidosEmpresas();
		$data['comprados']			= $this->configuracion->obtenerFoliosComprados();
		$data['metodos']			= $this->configuracion->obtenerMetodosPago();
		$data['formas']				= $this->configuracion->obtenerFormasPago();
		$data['usos']				= $this->configuracion->obtenerUsosCfdi();
		
		$data['comprados']			= $this->configuracion->obtenerFoliosComprados();
		$data['folios']				= $this->configuracion->obtenerFoliosConsumidos()+$this->configuracion->obtenerFoliosErrores();

		$data['periodos']			= $this->configuracion->obtenerPeriodicidad();
		$data['meses']				= $this->configuracion->obtenerMeses();
		#$data['folios']				= $this->configuracion->obtenerFoliosConsumidosEmpresas();
		
		 $this->load->view('facturacion/formularioFacturaGlobal',$data);
	}
	
	public function obtenerTotalesFactura()
	{
		$inicio					= $this->input->post('inicio');
		$fin					= $this->input->post('fin');
		
		$data['configuracion']	= $this->facturacion->obtenerConfiguracion();
		$data['ventas']			= $this->facturacion->sumarFacturasPeriodo();
		#$data['productos']		= $this->facturacion->obtenerProductosCotizacionesPeriodo($inicio,$fin);
		
		$this->load->view('facturacion/global/obtenerTotalesFactura',$data);
		
	}
	
	public function registrarFacturaGlobal()
	{
		if(!empty($_POST))
		{
			set_time_limit(0); 
			
			$factura	= $this->globales->registrarFacturaGlobal();
			
			if($factura[0]=="1")
			{
				$this->session->set_userdata('notificacion','La factura global se ha creado correctamente');	
			}
			
			echo json_encode($factura);
		}
	}
	
	public function formularioNotaCredito()
	{
		#$data['folio']				= $this->facturacion->obtenerFolio();
		$data['emisores']			= $this->configuracion->obtenerEmisoresFacturacion();
		$data['configuracion']		= $this->facturacion->obtenerConfiguracion();
		$data['folios']				= $this->configuracion->obtenerFoliosConsumidosEmpresas();
		$data['comprados']			= $this->configuracion->obtenerFoliosComprados();
		$data['metodos']			= $this->configuracion->obtenerMetodosPago();
		
		$data['formas']				= $this->configuracion->obtenerFormasPago();
		$data['usos']				= $this->configuracion->obtenerUsosCfdi();
		$data['relaciones']			= $this->configuracion->obtenerTipoRelaciones();
		
		/*$data['comprados']			= $this->configuracion->obtenerFoliosComprados();
		$data['folios']				= $this->configuracion->obtenerFoliosConsumidosEmpresas();*/
		
		$data['comprados']			= $this->configuracion->obtenerFoliosComprados();
		$data['folios']				= $this->configuracion->obtenerFoliosConsumidos()+$this->configuracion->obtenerFoliosErrores();
		
		$this->load->view('facturacion/nota/formularioNotaCredito',$data);
	}
	
	public function registrarNotaCredito()
	{
		if(!empty($_POST))
		{
			set_time_limit(0); 
			
			$nota=$this->nota->registrarNotaCredito();
			
			if($nota=="1")
			{
				$this->session->set_userdata('notificacion','La nota de crédito se ha creado correctamente');	
			}
			
			echo $nota;
		}
	}
	
	public function formularioNotaCreditoVentas()
	{
		$data['emisores']			= $this->configuracion->obtenerEmisoresFacturacion();
		$data['configuracion']		= $this->facturacion->obtenerConfiguracion();
		
		/*$data['folios']				= $this->configuracion->obtenerFoliosConsumidosEmpresas();
		$data['comprados']			= $this->configuracion->obtenerFoliosComprados();*/
		
		$data['comprados']			= $this->configuracion->obtenerFoliosComprados();
		$data['folios']				= $this->configuracion->obtenerFoliosConsumidos()+$this->configuracion->obtenerFoliosErrores();
		
		$data['metodos']			= $this->configuracion->obtenerMetodosPago();
		$data['cotizacion']			= $this->clientes->obtenerCotizacionVenta($this->input->post('idCotizacion'));
		$data['notas']				= $this->nota->obtenerNotasCotizacion($this->input->post('idCotizacion'));
		$data['totalNotas']			= $this->nota->sumarNotasCotizacion($this->input->post('idCotizacion'));
		$data['factura']			= $this->facturacion->obtenerFacturaCotizacionVigente($this->input->post('idCotizacion'));
		$data['formas']				= $this->configuracion->obtenerFormasPago();
		$data['usos']				= $this->configuracion->obtenerUsosCfdi();
		$data['relaciones']			= $this->configuracion->obtenerTipoRelaciones();
		
		$this->load->view('facturacion/nota/formularioNotaCreditoVenta',$data);
	}
	
	public function formularioFacturacion()
	{
		#$data['folio']				= $this->facturacion->obtenerFolio();
		$data['emisores']			= $this->configuracion->obtenerEmisoresFacturacion();
		$data['configuracion']		= $this->facturacion->obtenerConfiguracion();
		$data['folios']				= $this->configuracion->obtenerFoliosConsumidosEmpresas();
		$data['comprados']			= $this->configuracion->obtenerFoliosComprados();
		$data['metodos']			= $this->configuracion->obtenerMetodosPago();
		$data['formas']				= $this->configuracion->obtenerFormasPago();
		$data['usos']				= $this->configuracion->obtenerUsosCfdi();
		$data['relaciones']			= $this->configuracion->obtenerTipoRelaciones();
		/*$data['comprados']			= $this->configuracion->obtenerFoliosComprados();
		$data['folios']				= $this->configuracion->obtenerFoliosConsumidosEmpresas();*/
		
		$data['comprados']			= $this->configuracion->obtenerFoliosComprados();
		$data['folios']				= $this->configuracion->obtenerFoliosConsumidos()+$this->configuracion->obtenerFoliosErrores();
		
		 $this->load->view('facturacion/manual/formularioFacturacion',$data);
	}
	
	public function registrarFacturaManual()#Cancerlar el CFDI
	{
		if(!empty($_POST))
		{
			echo json_encode($this->manual->registrarFacturaManual());
		}
	}
	
	//PAGOS DE FACTURACIÓN
	public function formularioPagos()
	{
		$idFactura				= $this->input->post('idFactura');
		$data['factura']		= $this->pagos->obtenerFactura($idFactura);
		$data['emisores']		= $this->configuracion->obtenerEmisoresFacturacion();
		$data['configuracion']	= $this->facturacion->obtenerConfiguracion();
		$data['formas']			= $this->configuracion->obtenerFormasPago();
		$data['pagos']			= $this->pagos->obtenerFacturasPagos($idFactura);
		$data['metodos']		= $this->configuracion->obtenerMetodosPago();
		
		/*$data['comprados']			= $this->configuracion->obtenerFoliosComprados();
		$data['folios']				= $this->configuracion->obtenerFoliosConsumidosEmpresas();*/
		
		$data['comprados']			= $this->configuracion->obtenerFoliosComprados();
		$data['folios']				= $this->configuracion->obtenerFoliosConsumidos()+$this->configuracion->obtenerFoliosErrores();
		
		$this->load->view('facturacion/pagos/formularioPagos',$data);
	}
	
	public function registrarPago()
	{
		if(!empty($_POST))
		{
			set_time_limit(0);
			
			echo json_encode($this->pagos->registrarPago());
		}
		else
		{
			echo json_encode(array('0','Error al registrar el pago'));
		}
	}
	
	
	//ACUSE DE CANCELACIÓN
	public function obtenerAcuse()
	{
		if(!empty($_POST))
		{
			echo json_encode($this->facturacion->obtenerAcuse());
		}
	}
}

?>
