<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');

class GeneraFactura
{

	function facturar($infoFactura,$conceptos)
	{
		//obtenemos la fecha de la factura
		$fch = "$infoFactura->facturaFecha";
		$fecha = explode(" ",$fch);
		//variable para detectar error
		$error = false;
		//variable para detectar si solo se maneja impuesto tasa 0.160000 o tambien tasa 0.000000
		$tasa0 = false;
		$tasa16 = false;

		//iniciamos la variable de cadena_original
		$cadena_original = '';

		//creamos la cadena original
		//atributos del comprobante --->
		$cadena_original .= '||3.3|';// ||-> version *
		$cadena_original .= $infoFactura->facturaSerie.'|';// ||-> serie folio fiscal original
		$cadena_original .= $infoFactura->facturaFolio.'|';// ||-> folio fiscal original
		$cadena_original .= $fecha[0].'T'.$fecha[1].'|';// ||-> fecha *
		$cadena_original .= $infoFactura->facturaMetodoPagoClave.'|';// ||-> forma de pago *
		/*
		formas de pago
		01 = EFECTIVO
		02 = CHEQUE NOMINATIVO
		03 = TRANSFERENCIA ELECTRONICA DE FONDOS
		04 = TARJETA DE CREDITO
		05 = MONEDERO ELECTRONICO
		06 = DINERO ELECTRONICO
		08 = VALES DE DESPENSA
		28 = TARJETA DE DEBITO
		29 = TARJETA DE SERVICIOS
		99 = POR DEFINIR
		*/
		$cadena_original .= $infoFactura->empresaCertificadoNumero.'|';// ||-> numero de certificado del emisor
		$cadena_original .= number_format($infoFactura->facturaSubtotal,2,'.','').'|';// ||-> subtotal *
		$cadena_original .= 'MXN|';// ||-> moneda
		$cadena_original .= '1|';// ||-> tipo de cambio
		$cadena_original .= number_format($infoFactura->facturaTotal,2,'.','').'|';// ||-> total *
		$cadena_original .= 'I|';// ||-> tipo de comprobante *
		/*
		tipo de comprobante
		I = INGRESO
		E = EGRESO
		T = TRASLADO
		N = NOMINA
		P = PAGO
		*/
		$cadena_original .= $infoFactura->facturaFormaPagoClave.'|';// ||-> metodo de pago *
		/*
		metodo de pago
		PUE = PAGO EN UNA SOLA EXHIBICION
		PPD = PAGO EN PARCIALIDADES O DIFERIDO
		*/
		$cadena_original .= $infoFactura->sucursalCp.'|';// ||-> lugar de expedicion * ---> SOLO CODIGO POSTAL

		//$cadena_original .= '|';// ||-> condiciones de pago
		//$cadena_original .= number_format(0,2,'.','').'|';// ||-> descuento
		//$cadena_original .= '|';// ||-> numero de cuenta
		//$cadena_original .= '|';// ||-> monto folio fiscal original

		//atributos del emisor --->

		$cadena_original .= $infoFactura->empresaRFC.'|';// ||-> rfc  *
		$cadena_original .= $infoFactura->empresaRazon.'|';// ||-> nombre
		//$cadena_original .= $infoFactura->empresaDireccion.'|';// ||-> calle  *
		//$cadena_original .= $infoFactura->empresaNumExt.'|';// ||-> numero exterior
		//$cadena_original .= '|';// ||-> numero interior
		//$cadena_original .= $infoFactura->empresaColonia.'|';// ||-> colonia
		//$cadena_original .= $infoFactura->empresaCiudad.'|';// ||-> localidad
		//$cadena_original .= '|';// ||-> referencia
		//$cadena_original .= $infoFactura->empresaCiudad.'|';// ||-> municipio  *
		//$cadena_original .= $infoFactura->empresaEstado.'|';// ||-> estado  *
		//$cadena_original .= 'MEXICO|';// ||-> pais  *
		//$cadena_original .= $infoFactura->empresaCp.'|';// ||-> codigo postal  *

		//atributos expedidoEn --->

		//$cadena_original .= $infoFactura->sucursalDireccion.'|';// ||-> calle  *
		//$cadena_original .= $infoFactura->sucursalNumExt.'|';// ||-> numero exterior
		//$cadena_original .= '|';// ||-> numero interior
		//$cadena_original .= $infoFactura->sucursalColonia.'|';// ||-> colonia
		//$cadena_original .= $infoFactura->sucursalCiudad.'|';// ||-> localidad
		//$cadena_original .= '|';// ||-> referencia
		//$cadena_original .= $infoFactura->sucursalCiudad.'|';// ||-> municipio  *
		//$cadena_original .= $infoFactura->sucursalEstado.'|';// ||-> estado  *
		//$cadena_original .= 'MEXICO|';// ||-> pais  *
		//$cadena_original .= $infoFactura->sucursalCp.'|';// ||-> codigo postal  *

		$cadena_original .= $infoFactura->empresaRegimenClave.'|';// ||-> regimen fiscal  *
		/*
		regimen fiscal
		601 = GENERAL DE LEY PERSONAS MORALES
		612 = PERSONAS FISICAS CON ACTIVIDADES EMPRESARIALES Y PROFESIONALES
		621 = INCORPORACION FISCAL
		*/

		//atributos del receptor --->

		$cadena_original .= $infoFactura->clienteRFC.'|';// ||-> rfc  *
		$cadena_original .= $infoFactura->clienteRazon.'|';// ||-> nombre
		//$cadena_original .= $infoFactura->clienteDireccion.'|';// ||-> calle  *

		//$infoFactura->clienteNumExt != NULL ? $cadena_original .= $infoFactura->clienteNumExt.'|' : '';// ||-> numero exterior

		//$infoFactura->clienteNumInt != NULL ? $cadena_original .= $infoFactura->clienteNumInt.'|' : '';// ||-> numero interior

		//$infoFactura->clienteColonia != NULL ? $cadena_original .= $infoFactura->clienteColonia.'|' : '';// ||-> colonia

		//$cadena_original .= $infoFactura->clienteCiudad.'|';// ||-> localidad
		//$cadena_original .= '|';// ||-> referencia
		//$cadena_original .= $infoFactura->clienteCiudad.'|';// ||-> municipio  *
		//$cadena_original .= $infoFactura->clienteEstado.'|';// ||-> estado  *
		//$cadena_original .= 'MEXICO|';// ||-> pais  *

		//$infoFactura->clienteCp != NULL ? $cadena_original .= $infoFactura->clienteCp.'|' : '';// ||-> codigo postal  *
		$cadena_original .= $infoFactura->facturaUsoCFDI.'|'; // |-> uso CFDI
		/*
		USO CFDI
		G01 = ADQUISICION DE MERCANCIAS
		G02 = DEVOLUCIONES, DESCUENTOS O BONIFICACIONES
		G03 = GASTOS EN GENERAL
		IO1 = CONSTRUCCIONES
		I02 = MOBILIARIO Y EQUIPO DE OFICINA POR INVERSIONES
		I03 = EQUIPO DE TRANSPORTE
		I04 = EQUIPO DE COMPUTO Y ACCESORIOS
		I05 = DADOS, TROQUELES, MOLDES, MATRICES Y HERRAMENTAL
		... N USOS --
		PO1 = POR DEFINIR
		*/

		//iteramos los conceptos
		foreach ($conceptos as $key => $concepto) {

			//calculamos precio unitario e importe antes de iva
			//validamos si se mostraras las partidas originales o solo la partida de facturacion
			if ($infoFactura->ventaPartidaFactura == 0) {

				//$preciou = $concepto->precio - calcularDescuento($concepto->precio,$concepto->descuento);
				$preciou = $concepto->precioUnitarioXML;
				//$importe = $preciou * $concepto->cantidad;
				$importe = $concepto->importe;
				$tasaCuota = ($concepto->partidaIVA / 100);
				//$importeImpuesto = $importe * $tasaCuota;
				$importeImpuesto = $concepto->iva;

			}else{

				$preciou = $infoFactura->facturaSubtotal;
				$importe = $preciou;
				$tasaCuota = ($concepto->partidaIVA / 100);
				$importeImpuesto = $infoFactura->facturaIVA;

			}

			$cadena_original .= $concepto->claveProductoServicio.'|'; // |->clave de producto o servicio *
			$cadena_original .= $concepto->codigob.'|';// ||-> numero de identificacion
			$cadena_original .= number_format($concepto->cantidad,3,'.','').'|';// ||-> cantidad*
			$cadena_original .= $concepto->claveUnidad.'|'; // |->clave de unidad
			$cadena_original .= $concepto->descripcion.'|';// ||-> descripcion*
			$cadena_original .= number_format($preciou,2,'.','').'|';// ||-> valor unitario*
			$cadena_original .= number_format($importe,2,'.','').'|';// ||-> importe*

			// ---- informacion de traslado de conceptos Impuestos
			$cadena_original .= number_format($importe,2,'.','').'|'; // |->base*  es el importe del concepto
			$cadena_original .= '002|'; // |->Impuesto
			/*
			impuesto
			001 = ISR
			002 = IVA
			003 = IEPS
			*/
			$cadena_original .= 'Tasa|';// |->tipo factor
			/*
			TIPO FACTOR
			->TASA
			->CUOTA
			->EXCENTO
			*/
			if ($tasaCuota == 0) {

				$tasa0 = true;

			}else{

				$tasa16 = true;

			}

			$cadena_original .= number_format($tasaCuota,6,'.','').'|';// |->tasa cuota
			$cadena_original .= number_format($importeImpuesto,2,'.','').'|';// |->importe del impuesto

		}

		if ($tasa16 === true) {

			// informacion total de impuestos
			$cadena_original .= '002|';// ||-> nombre del impuesto*
			/*
			impuesto
			001 = ISR
			002 = IVA
			003 = IEPS
			*/
			$cadena_original .= 'Tasa|';// |->tipo factor
			/*
			TIPO FACTOR
			->TASA
			->CUOTA
			->EXCENTO
			*/

			$cadena_original .= '0.160000|';// |->tasa cuota
			$cadena_original .= number_format($infoFactura->facturaIVA, 2,'.','').'|';// ||-> importe*

		}

		if ($tasa0 === true) {

			// informacion total de impuestos
			$cadena_original .= '002|';// ||-> nombre del impuesto*
			/*
			impuesto
			001 = ISR
			002 = IVA
			003 = IEPS
			*/
			$cadena_original .= 'Tasa|';// |->tipo factor
			/*
			TIPO FACTOR
			->TASA
			->CUOTA
			->EXCENTO
			*/

			$cadena_original .= '0.000000|';// |->tasa cuota
			$cadena_original .= '0.00|';// ||-> importe*

		}

		$cadena_original .= number_format($infoFactura->facturaIVA, 2,'.','').'||'; // ||-> total de impuestos trasladados

		//limpiamos la cadena original de espacios y codificamos a utf8
		$cadena_original = str_replace("  "," ",$cadena_original);
		$cadena_original = utf8_decode($cadena_original);
		$cadena_original = utf8_encode($cadena_original);

		//CERTIFICADO DIGITAL DEL CONTRIBUYENTE
		$num_certificado = $infoFactura->empresaCertificadoNumero;

		$archivo_cer = 'files/sellos/'.$infoFactura->empresaCertificadoNumero.'.cer';
		$certificado_texto = str_replace(array('\n', '\r'), '', base64_encode(file_get_contents($archivo_cer)));

		$llave = 'files/sellos/llave.key.pem';

		// == GENERACION DE SELLO DIGITAL == //

		$fp = fopen($llave,"r");
		$priv_key = fread($fp,8192);
		fclose($fp);
		$pkeyid = openssl_get_privatekey($priv_key);
		openssl_sign($cadena_original,$cadena_firmada,$pkeyid,OPENSSL_ALGO_SHA256);
		$sello = base64_encode($cadena_firmada);

		// ================================= //

		//creo el xml en memoria
		$cadena_xml = '';

		$cadena_xml .= '<?xml version="1.0" encoding="UTF-8"?>';
		$cadena_xml .= '<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd"
                                  Version="3.3"
		';
		$cadena_xml .= 'Sello="'.$sello.'"';
		$cadena_xml .= '
			 	 	  Serie="'.$infoFactura->facturaSerie.'"
					  Folio="'.$infoFactura->facturaFolio.'"
					  Fecha="'.$fecha[0].'T'.$fecha[1].'"
					  FormaPago="'.$infoFactura->facturaMetodoPagoClave.'"
					  NoCertificado="'.$num_certificado.'"
		';
		$cadena_xml .= 'Certificado="'.$certificado_texto.'"';
		$cadena_xml .= '
					  SubTotal="'.number_format($infoFactura->facturaSubtotal,2,'.','').'"
					  Total="'.number_format($infoFactura->facturaTotal,2,'.','').'"';

		$cadena_xml .= '
					  MetodoPago="'.$infoFactura->facturaFormaPagoClave.'"
					  TipoDeComprobante="I"
					  TipoCambio="1"
					  Moneda="MXN"
					  LugarExpedicion="'.$infoFactura->sucursalCp.'"
					  >
		';
		$cadena_xml .= '
			<cfdi:Emisor
                         Rfc="'.$infoFactura->empresaRFC.'"
                         Nombre="'.$infoFactura->empresaRazon.'"
                         RegimenFiscal="'.$infoFactura->empresaRegimenClave.'" />
		';
		$cadena_xml .= '
			<cfdi:Receptor
                        Rfc="'.$infoFactura->clienteRFC.'"
                        Nombre="'.$this->limpiarCaracteres($infoFactura->clienteRazon).'"
                        UsoCFDI="'.$infoFactura->facturaUsoCFDI.'" />
		';
		$cadena_xml .= '
			<cfdi:Conceptos>
		';

		foreach ($conceptos as $key => $concepto) {

			//calculamos precio unitario e importe antes de iva
			//validamos si se mostraras las partidas originales o solo la partida de facturacion
			if ($infoFactura->ventaPartidaFactura == 0) {

				//$preciou = $concepto->precio - calcularDescuento($concepto->precio,$concepto->descuento);
				$preciou = $concepto->precioUnitarioXML;
				//$importe = $preciou * $concepto->cantidad;
				$importe = $concepto->importe;
				$tasaCuota = ($concepto->partidaIVA / 100);
				//$importeImpuesto = $importe * $tasaCuota;
				$importeImpuesto = $concepto->iva;

			}else{

				$preciou = $infoFactura->facturaSubtotal;
				$importe = $preciou;
				$tasaCuota = ($concepto->partidaIVA / 100);
				$importeImpuesto = $infoFactura->facturaIVA;

			}

			$cadena_xml .= '
				<cfdi:Concepto
					ClaveProdServ="'.$concepto->claveProductoServicio.'"
					ClaveUnidad="'.$concepto->claveUnidad.'"
					Cantidad="'.number_format($concepto->cantidad,3,'.','').'"
					NoIdentificacion="'.$concepto->codigob.'"
					Descripcion="'.$this->limpiarCaracteres($concepto->descripcion).'"
					ValorUnitario="'.number_format($preciou,2,'.','').'"
					Importe="'.number_format($importe,2,'.','').'">
					<cfdi:Impuestos>
						<cfdi:Traslados>
							<cfdi:Traslado Base="'.number_format($importe,2,'.','').'" Impuesto="002" TipoFactor="Tasa" TasaOCuota="'.number_format($tasaCuota,6,'.','').'" Importe="'.number_format($importeImpuesto,2,'.','').'" />
						</cfdi:Traslados>
					</cfdi:Impuestos>
				</cfdi:Concepto>
			';

		}

		$cadena_xml .= '
                  </cfdi:Conceptos>
		';
		$cadena_xml .= '
			<cfdi:Impuestos TotalImpuestosTrasladados="'.number_format($infoFactura->facturaIVA,2,'.','').'">
                    <cfdi:Traslados>
        ';

        if ($tasa16 === true) {

        	$cadena_xml .= '<cfdi:Traslado Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="'.number_format($infoFactura->facturaIVA,2,'.','').'" />';
        }

        if ($tasa0 === true) {

        	$cadena_xml .= '<cfdi:Traslado Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.000000" Importe="0.00" />';

        }

        $cadena_xml .= '
                </cfdi:Traslados>
              </cfdi:Impuestos>
            </cfdi:Comprobante>
		';

		$cadena_xml=str_replace("  "," ",$cadena_xml);

		//Dado que un String convencional no esta adecuado para recibir acentos, se deben interpretar esos caracteres, de la siguiente manera.
		$cadena_xml = utf8_decode($cadena_xml);

		//Una ves que ya tengo la cadena con los acentos debidamente codificados, aplico la codificion UTF-8 al XML.
		$cadena_xml = utf8_encode($cadena_xml);

		// ===== creamos ruta para almacenar el XML/PDF ===== --->

		//descomponemos la fecha, para almacenar los archivos en el directorio correcto, ..\AÑO\MES\ aqui los archivos
		$fc = explode("-",$fecha[0]);//$fc[0]=año, $fc[1]=mes

		//creamos el nombre de la carpeta de la empresa con el rfc
		$folder_factura = $infoFactura->empresaRFC;

		//validamos si existe la carpeta con el rfc de la empresa, sino la cremos
		if(!file_exists('files/facturas/'.$folder_factura.'/')){
			mkdir('files/facturas/'.$folder_factura.'/',0777);
		}

		//crear folder de clientes en caso de no existir
		if(!file_exists('files/facturas/'.$folder_factura.'/clientes/')){
			mkdir('files/facturas/'.$folder_factura.'/clientes/',0777);
		}

		//crear folder del año en caso de no existir
		if(!file_exists('files/facturas/'.$folder_factura.'/clientes/'.$fc[0].'/')){
			mkdir('files/facturas/'.$folder_factura.'/clientes/'.$fc[0].'/',0777);
		}

		//crear folder del mes en caso de no existir
		if(!file_exists('files/facturas/'.$folder_factura.'/clientes/'.$fc[0].'/'.$fc[1].'/')){
			mkdir('files/facturas/'.$folder_factura.'/clientes/'.$fc[0].'/'.$fc[1].'/',0777);
		}

		$ruta_xml = 'files/facturas/'.$folder_factura.'/clientes/'.$fc[0].'/'.$fc[1].'/'.$infoFactura->facturaSerie.$infoFactura->facturaFolio;
		// ==================================================

		//Se guarda el XML con el siguiente nombre.
		$new_xml = fopen ($ruta_xml.".xml", "w");
		fwrite($new_xml,$cadena_xml);
		fclose($new_xml);

		//covertimos a zip
		$zip = new ZipArchive();
		$zip_file = $ruta_xml.".zip";
		$zip->open($zip_file, ZipArchive::CREATE);
		$zip->addFile($ruta_xml.".xml",$infoFactura->facturaSerie.$infoFactura->facturaFolio.".xml");
		$zip->close();

		// == TIMBRADO == //
		$wsdl="https://sat.sifei.com.mx:8443/SIFEI/SIFEI?wsdl";

        $file = base64_encode(file_get_contents($ruta_xml.".zip"));

        $parametros=array("Usuario"=>"$infoFactura->sifeiUsuario","Password"=>"$infoFactura->sifeiPassword","archivoXMLZip"=>$file,"Serie"=>" ","IdEquipo"=>"$infoFactura->sifeiIdEquipo");

        $client= new nusoap_client($wsdl,true);

        $rst=$client->call('getCFDI',$parametros);

		//borramos el archivo ZIP
		unlink($ruta_xml.".zip");

		 //verificar que no causo algun error
        if(isset($rst['detail']['SifeiException']['message'])){

			//unlink($ruta_xml.".xml");//borramos el archivo XML creado

			$error["codigoError"] = $rst['detail']['SifeiException']['codigo'];
			$error["error"] = true;

        }elseif($rst==""){

			unlink($ruta_xml.".xml");//borramos el archivo XML creado

            $error["codigoError"] = 999;
            $error["error"] = true;

        }else{	// |-> si no causo error genera la factura

        	unlink($ruta_xml.".xml");//borramos el archivo XML creado

			$timbre = base64_decode($rst["return"]);//decodificamos respuesta

			//creamos un ZIP con el XML dentro del ZIP
			$new_xml = fopen ($ruta_xml.".zip", "w");
			fwrite($new_xml,$timbre);
			fclose($new_xml);

			$zip = new ZipArchive;
			if ($zip->open($ruta_xml.".zip") === TRUE) {

				$name = $zip->getNameIndex(0);
				$zip->extractTo('files/facturas/'.$folder_factura.'/clientes/'.$fc[0].'/'.$fc[1].'/');
				$zip->close();

				unlink($ruta_xml.".zip");

				rename('files/facturas/'.$folder_factura.'/clientes/'.$fc[0].'/'.$fc[1].'/'.$name,$ruta_xml.".xml");

				//leemos XML para extraer informacion generada por el PAC
				$load_xml = simplexml_load_file($ruta_xml.'.xml');
				$ns = $load_xml->getNamespaces(true);

				$load_xml->registerXPathNamespace('t', $ns['tfd']);

				foreach ($load_xml->xpath('//t:TimbreFiscalDigital') as $tfd) {

					$uuid = "{$tfd['UUID']}";
					$selloSAT = "{$tfd['SelloSAT']}";
					$certificadoSAT = "{$tfd['NoCertificadoSAT']}";
					$sellocfd = "{$tfd['SelloCFD']}";
					$fechaTimbradoS = "{$tfd['FechaTimbrado']}";
					$fechaTimbrado = "{$tfd['FechaTimbrado']}";
					$fechaTimbrado = str_replace("T"," ",$fechaTimbrado);

				}

				//generamos la cadena original del complemento de certificacion del sat
				$cadena_original_sat = '||1.0|';
				$cadena_original_sat .= $uuid.'|';
				$cadena_original_sat .= $fechaTimbradoS.'|';
				$cadena_original_sat .= $sellocfd.'|';
				$cadena_original_sat .= $certificadoSAT.'||';

				//generamos el codigo qr2 y lo guardamos en el servidor al terminar lo borramos
				$texto_qr2 = '?re='.$infoFactura->empresaRFC.'&rr='.$infoFactura->clienteRFC.'&tt='.$infoFactura->facturaTotal.'&id='.$uuid;
				QRcode::png($texto_qr2, 'temp/qr2.png');

			}

        	// ============== GENERAMOS PDF ==================
			$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

			// remove default header/footer
			$pdf->setPrintHeader(false);
			$pdf->setPrintFooter(false);

			// set default monospaced font
			$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

			// set margins
			$pdf->SetMargins("10", "10", "10");

			// set auto page breaks
			$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

			// set image scale factor
			$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

			// set some language-dependent strings (optional)
			if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
				require_once(dirname(__FILE__).'/lang/eng.php');
				$pdf->setLanguageArray($l);
			}

			// set font
			$pdf->SetFont('', '', 7);

			// add a page
			$pdf->AddPage();

			$html = '

					medidas[0].'%" valign="top">medidas[3].'" />
					medidas[1].'%" valign="top">

						'.$infoFactura->empresaRazon.'

						'.$infoFactura->empresaDireccion.' No. Ext. '.$infoFactura->empresaNumExt;

						if ($infoFactura->empresaNumInt != '' && $infoFactura->empresaNumInt != NULL) {

							$html .= ', No. Int '.$infoFactura->empresaNumInt;

						}

						$html .= '
						, '.$infoFactura->empresaColonia.'

						C.P. '.$infoFactura->empresaCp.', '.$infoFactura->empresaCiudad.', '.$infoFactura->empresaEstado.'

						RFC: '.$infoFactura->empresaRFC.'

					  	'.$infoFactura->empresaRegimenClave.' - '.$infoFactura->empresaRegimenNombre.'

					medidas[2].'%" valign="top">

						FACTURA '.$infoFactura->facturaSerie.$infoFactura->facturaFolio.'

						Fecha/Hora

						Certificación

						'.$fechaTimbrado.'

						Fecha de Emisión

						'.$fecha[0].' '.$fecha[1].'

						Tipo de Comprobante

						I - Ingreso

						Lugar de Expedicion

						'.$infoFactura->sucursalCp.'

						Receptor del comprobante fiscal

						'.$infoFactura->clienteRazon.'

						'.$infoFactura->clienteDireccion;

						if($infoFactura->clienteNumExt != '' && $infoFactura->clienteNumExt != NULL && $infoFactura->clienteNumExt != 0){

							$html .= ', No. Ext. '.$infoFactura->clienteNumExt;

						}

						if($infoFactura->clienteNumInt != '' && $infoFactura->clienteNumInt != NULL){

							$html .= ', No. Int. '.$infoFactura->clienteNumInt;

						}

						$html .= '
						, '.$infoFactura->clienteColonia.',

						C.P. '.$infoFactura->clienteCp.', '.$infoFactura->clienteCiudad.', '.$infoFactura->clienteEstado.', México

						RFC: '.$infoFactura->clienteRFC.'

					  	Uso CFDI: '.$infoFactura->facturaUsoCFDI.' - '.$infoFactura->facturaUsoCFDInombre.'

						Folio Fiscal

						'.$uuid.'

						Numero de Serie del Certificado

						'.$num_certificado.'

						Numero de Serie del Certificado del SAT

						'.$certificadoSAT.'

			   ';

			   		// Aqui se incluyen los comentarios de la venta
			  $html .= '

						'.$infoFactura->ventaComentarios.'

				';

			  $html .= '

					Cantidad

						ClaveProdServ

						Clave unidad

						No. Identificacion

					porcentajeDescripcion.'%" align="center">Descripción
					Valor Unitario
				';

				// == campos dinamicos ==
				if ($infoFactura->camposDinamicos !== false){

					foreach ($infoFactura->camposDinamicos as $key => $campo){

						if (in_array($campo->venta_campos_cot_id, $infoFactura->camposVenta)){

							$html .= ''.$campo->venta_campos_cot_nombre.'	';

						}

					}

				}

				$html .= '
					Impuesto
					Importe

';

				  //==== productos

				foreach ($conceptos as $key => $concepto) {

					//calculamos precio unitario e importe antes de iva
					//validamos si se mostraras las partidas originales o solo la partida de facturacion
					if ($infoFactura->ventaPartidaFactura == 0) {
						//$preciou = $concepto->precio - calcularDescuento($concepto->precio,$concepto->descuento);
						$preciou = $concepto->precioUnitario;
						//$importe = $preciou * $concepto->cantidad;
						$importe = $concepto->importe;

					}else{

						$preciou = $infoFactura->facturaSubtotal;
						$importe = $preciou;

					}

					$html .= '

						'.$concepto->cantidad.'
						'.$concepto->claveProductoServicio.'
'.$concepto->claveUnidad.'
'.$concepto->codigob.'
						'.$concepto->descripcion.'
						$ '.number_format($preciou,2).'
					';

					// == campos dinamicos ==
					if ($infoFactura->camposDinamicos !== false){

						foreach ($infoFactura->camposDinamicos as $key => $campo){

							if (in_array($campo->venta_campos_cot_id, $infoFactura->camposVenta)){

								$html .= '';

								//aqui traemos la informacion de los campos adicionales
                                $primerNivel = explode("||", $concepto->camposCotizacion);

                                foreach ($primerNivel as $key => $Pnivel) {

                                    $segundoNivel = explode("@", $Pnivel);

                                    if ($segundoNivel[0] == $campo->venta_campos_cot_id) {

                                        $html .= $segundoNivel[1];

                                    }

                                }

                                $html .= '	';

							}

						}

					}

					if ($infoFactura->ventaPartidaFactura == 0) {

						$html .= '002-IVA | $ '.number_format($concepto->iva,2).'	';

					}else{

						$html .= '002-IVA | $ '.number_format($infoFactura->facturaIVA,2).'	';

					}

					$html .= '
						$ '.number_format($importe,2).'

					';

					if($concepto->comentario !='' && $concepto->comentario != NULL){

						$comentario = nl2br($concepto->comentario);

						$html .= '

								Comentarios:
								'.$comentario.'

						';

					}

				}

				$html .= '

						Moneda: MXN - Peso Mexicano

						Forma de pago: '.$infoFactura->facturaMetodoPago.'

						Metodo de Pago: '.$infoFactura->facturaFormaPagoClave.' - '.$infoFactura->facturaFormaPago.'

						Importe Total con letra: ( '.$infoFactura->facturaTotalLetras.' )

						Subtotal
						$ '.number_format($infoFactura->facturaSubtotal,2).'

						Total Impuestos Trasladados
						$ '.number_format($infoFactura->facturaIVA,2).'

						Total Comprobante
						$ '.number_format($infoFactura->facturaTotal,2).'

					Cadena original del complemento de certificación digital del SAT

					'.$cadena_original_sat.'

					Sello Digital del CFDI

					'.$sellocfd.'

					Sello digital del SAT

					'.$selloSAT.'

				Este documento es una representación impresa de un CFDI

';

			// output the HTML content
			$pdf->writeHTML($html, true, false, true, false, '');

			//Close and output PDF document
			$pdf->Output($ruta_xml.'.pdf', 'F');

			//  ======== fin PDF ========

			//informacion para retornar y actualizar la factura como TImbrada
			$facturaTimbrada = array(
				"uuid"				=>	$uuid,
				"selloSAT"			=>	$selloSAT,
				"certificadoSAT"	=>	$certificadoSAT,
				"sellocfd"			=>	$sellocfd,
				"fechaTimbrado"		=>	$fechaTimbrado,
				"rutaXML"			=>	$ruta_xml.".xml",
				"rutaPDF"			=>	$ruta_xml.".pdf",
				"error"				=>	false
			);

        }
        //si existio algun error en el proceso se retorna el objeto error con el codigo de error
        //de lo contrario se retorna la informacion de la factura timbrada
        if ($error === false) {

        	return $facturaTimbrada;

        }else{

        	return $error;

        }

	}

	function cancelar($infoFactura)
	{
		//ruta del archivo PFX
		$archivo_pfx = "files/sellos/CER_KEY.pfx";

		//timbrar cancelacion de factura
		$wsdl="https://sat.sifei.com.mx:8443/SIFEI/SIFEI?wsdl";

		$file=base64_encode(file_get_contents($archivo_pfx));

		$parametros=array("usuarioSIFEI"=>"$infoFactura->sifeiUsuario", "passUser"=>"$infoFactura->sifeiPassword","rfc"=>"$infoFactura->empresaRFC","pfx"=>"$file","passPFX"=>"$infoFactura->sifeiPassPFX","UUIDS"=>"$infoFactura->facturaFolioFiscal");

		$client= new nusoap_client($wsdl,true);

		$rst=$client->call('cancelaCFDI',$parametros);

		//verificar que no causo algun error
		if(isset($rst['detail']['SifeiException']['message'])){

			return false;

		}elseif($rst==""){

			return false;

		}else{

			return true;

		}
	}

	function complementoDePago($infoPago,$documentosRelacionados)
	{
		$error = false;
		// === CONTRUCCION DE CADENA ORIGINAL === //
		$cadena_original = '';

		//atributos del comprobante --->
		$cadena_original .= '||3.3|';// ||-> version *
		$cadena_original .= $infoPago->pagoSerie.'|';// ||-> serie
		$cadena_original .= $infoPago->pagoFolio.'|';// ||-> folio interno
		$cadena_original .= $infoPago->fechaActualCFDI.'|';// ||-> fecha *

		$cadena_original .= $infoPago->empresaCertificadoNumero.'|';// ||-> numero de certificado del emisor
		$cadena_original .= '0|';// ||-> subtotal *
		$cadena_original .= 'XXX|';// ||-> moneda
		$cadena_original .= '0|';// ||-> total *
		$cadena_original .= 'P|';// ||-> tipo de comprobante *
		/*
		tipo de comprobante
		I = INGRESO
		E = EGRESO
		T = TRASLADO
		N = NOMINA
		P = PAGO
		*/
		$cadena_original .= $infoPago->sucursalCP.'|';// ||-> lugar de expedicion * ---> SOLO CODIGO POSTAL

		//atributos del emisor --->

		$cadena_original .= $infoPago->empresaRFC.'|';// ||-> rfc  *
		$cadena_original .= $infoPago->empresaRazon.'|';// ||-> nombre

		$cadena_original .= $infoPago->empresaRegimenFiscalClave.'|';// ||-> regimen fiscal*
		/*
		regimen fiscal
		601 = GENERAL DE LEY PERSONAS MORALES
		612 = PERSONAS FISICAS CON ACTIVIDADES EMPRESARIALES Y PROFESIONALES
		621 = INCORPORACION FISCAL
		*/

		//atributos del receptor --->

		$cadena_original .= $infoPago->clienteRFC.'|';// ||-> rfc*
		$cadena_original .= $infoPago->clienteRazon.'|';// ||-> nombre

		$cadena_original .= 'P01|'; // |-> uso CFDI
		/*
		USO CFDI
		G01 = ADQUISICION DE MERCANCIAS
		G02 = DEVOLUCIONES, DESCUENTOS O BONIFICACIONES
		G03 = GASTOS EN GENERAL
		IO1 = CONSTRUCCIONES
		I02 = MOBILIARIO Y EQUIPO DE OFICINA POR INVERSIONES
		I03 = EQUIPO DE TRANSPORTE
		I04 = EQUIPO DE COMPUTO Y ACCESORIOS
		I05 = DADOS, TROQUELES, MOLDES, MATRICES Y HERRAMENTAL
		... N USOS --
		PO1 = POR DEFINIR
		*/

		$cadena_original .= '84111506|'; // |->clave de producto o servicio *
		$cadena_original .= '1|';// ||-> cantidad  *
		$cadena_original .= 'ACT|'; // |->clave de unidad
		$cadena_original .= 'Pago|';// ||-> descripcion  *
		$cadena_original .= '0|';// ||-> valor unitario  *
		$cadena_original .= '0|';// ||-> importe  *

		//complemento de pago
		$cadena_original .= '1.0|';//	||->version
		$cadena_original .= $infoPago->pagoFechaPagoCFDI.'|';// 	||->fecha de pago
		$cadena_original .= $infoPago->metodoPagoClave.'|';// 	||->forma de pago
		$cadena_original .= 'MXN|';// 	||->moneda
		$cadena_original .= number_format($infoPago->pagoTotal,2,".","").'|';// 	||->monto
		$cadena_original .= $infoPago->pagoNumeroOperacion.'|';// 	||->referencia

		//documentos relacionados
		foreach ($documentosRelacionados as $key => $documento) {

			$cadena_original .= $documento->facturaUUID.'|';
			$cadena_original .= 'MXN|';
			$cadena_original .= 'PPD|';
			$cadena_original .= '1|';
			$cadena_original .= number_format($documento->cxcTotal,2,'.','').'|';
			$cadena_original .= number_format($documento->cxcTotal,2,'.','').'|';
			$cadena_original .= '0.00|';

		}

		$cadena_original .= '|';

		$cadena_original = str_replace("  "," ",$cadena_original);
		$cadena_original = utf8_decode($cadena_original);
		$cadena_original = utf8_encode($cadena_original);

		// ====================================== // ||-> resultado  ->  CADENA ORIGINAL DEL DOCUMENTO

		//CERTIFICADO DIGITAL DEL CONTRIBUYENTE
		$num_certificado = $infoPago->empresaCertificadoNumero;

		$archivo_cer = 'files/sellos/'.$infoPago->empresaCertificadoNumero.'.cer';
		$certificado_texto = str_replace(array('\n', '\r'), '', base64_encode(file_get_contents($archivo_cer)));

		$llave = 'files/sellos/llave.key.pem';

		// == GENERACION DE SELLO DIGITAL == //

		$fp = fopen($llave,"r");
		$priv_key = fread($fp,8192);
		fclose($fp);
		$pkeyid = openssl_get_privatekey($priv_key);
		openssl_sign($cadena_original,$cadena_firmada,$pkeyid,OPENSSL_ALGO_SHA256);
		$sello = base64_encode($cadena_firmada);

		// ================================= //

		//creo el xml en memoria
		$cadena_xml = '';

		$cadena_xml .= '<?xml version="1.0" encoding="UTF-8"?>';
		$cadena_xml .= '<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd"
                                  Version="3.3"
		';
		$cadena_xml .= 'Sello="'.$sello.'"';
		$cadena_xml .= '
			 	 	  Serie="'.$infoPago->pagoSerie.'"
					  Folio="'.$infoPago->pagoFolio.'"
					  Fecha="'.$infoPago->fechaActualCFDI.'"
					  NoCertificado="'.$num_certificado.'"
		';
		$cadena_xml .= 'Certificado="'.$certificado_texto.'"';
		$cadena_xml .= '
					  SubTotal="0"
					  Total="0"';

		$cadena_xml .= '
					  TipoDeComprobante="P"
					  Moneda="XXX"
					  LugarExpedicion="'.$infoPago->sucursalCP.'"
					  >
		';

		$cadena_xml .= '
			<cfdi:Emisor
                         Rfc="'.$infoPago->empresaRFC.'"
                         Nombre="'.$infoPago->empresaRazon.'"
                         RegimenFiscal="'.$infoPago->empresaRegimenFiscalClave.'" />
		';
		$cadena_xml .= '
			<cfdi:Receptor
                        Rfc="'.$infoPago->clienteRFC.'"
                        Nombre="'.$this->limpiarCaracteres($infoPago->clienteRazon).'"
                        UsoCFDI="P01" />
		';
		$cadena_xml .= '
			<cfdi:Conceptos>
		';

		$cadena_xml .= '
			<cfdi:Concepto
				ClaveProdServ="84111506"
				ClaveUnidad="ACT"
				Cantidad="1"
				Descripcion="Pago"
				ValorUnitario="0"
				Importe="0" />
		';

		$cadena_xml .= '
           </cfdi:Conceptos>
		';

		$cadena_xml .= '<cfdi:Complemento>';

		$cadena_xml .= '
			<pago10:Pagos xmlns:pago10="http://www.sat.gob.mx/Pagos" Version="1.0" xsi:schemaLocation="http://www.sat.gob.mx/Pagos http://www.sat.gob.mx/sitio_internet/cfd/Pagos/Pagos10.xsd">
		';

		$cadena_xml .= '
				<pago10:Pago FechaPago="'.$infoPago->pagoFechaPagoCFDI.'" FormaDePagoP="'.$infoPago->metodoPagoClave.'" MonedaP="MXN" Monto="'.number_format($infoPago->pagoTotal,2,'.','').'" NumOperacion="'.$infoPago->pagoNumeroOperacion.'">
		';

		//documentos relacionados
		foreach ($documentosRelacionados as $key => $documento) {

			$cadena_xml .= '
					<pago10:DoctoRelacionado IdDocumento="'.$documento->facturaUUID.'" MonedaDR="MXN" MetodoDePagoDR="PPD" NumParcialidad="1" ImpSaldoAnt="'.$documento->cxcTotal.'" ImpPagado="'.$documento->cxcTotal.'" ImpSaldoInsoluto="0.00" />
			';

		}

		$cadena_xml .= '
				</pago10:Pago>
		';

		$cadena_xml .= '
			</pago10:Pagos>
		';

		$cadena_xml .= '</cfdi:Complemento>';

		$cadena_xml .= '</cfdi:Comprobante>';

		$cadena_xml=str_replace("  "," ",$cadena_xml);

		//Dado que un String convencional no esta adecuado para recibir acentos, se deben interpretar esos caracteres, de la siguiente manera.
		$cadena_xml = utf8_decode($cadena_xml);

		//Una ves que ya tengo la cadena con los acentos debidamente codificados, aplico la codificion UTF-8 al XML.
		$cadena_xml = utf8_encode($cadena_xml);

		// ==================================================

		// ===== creamos ruta para almacenar el XML/PDF ===== --->

		//descomponemos la fecha, para almacenar los archivos en el directorio correcto, ..\AÑO\MES\ aqui los archivos
		$fc = explode("-",$infoPago->fechaActual);//$fc[0]=año, $fc[1]=mes

		//creamos el nombre de la carpeta de la empresa con el rfc
		$folder_factura = $infoPago->empresaRFC;

		//validamos si existe la carpeta con el rfc de la empresa, sino la cremos
		if(!file_exists('files/facturas/'.$folder_factura.'/')){
			mkdir('files/facturas/'.$folder_factura.'/',0777);
		}

		//crear folder de clientes en caso de no existir
		if(!file_exists('files/facturas/'.$folder_factura.'/clientes/')){
			mkdir('files/facturas/'.$folder_factura.'/clientes/',0777);
		}

		//crear folder del año en caso de no existir
		if(!file_exists('files/facturas/'.$folder_factura.'/clientes/'.$fc[0].'/')){
			mkdir('files/facturas/'.$folder_factura.'/clientes/'.$fc[0].'/',0777);
		}

		//crear folder del mes en caso de no existir
		if(!file_exists('files/facturas/'.$folder_factura.'/clientes/'.$fc[0].'/'.$fc[1].'/')){
			mkdir('files/facturas/'.$folder_factura.'/clientes/'.$fc[0].'/'.$fc[1].'/',0777);
		}

		$ruta_xml = 'files/facturas/'.$folder_factura.'/clientes/'.$fc[0].'/'.$fc[1].'/'.$infoPago->pagoSerie.$infoPago->pagoFolio;
		// ==================================================

		//Se guarda el XML con el siguiente nombre.
		$new_xml = fopen ($ruta_xml.".xml", "w");
		fwrite($new_xml,$cadena_xml);
		fclose($new_xml);

		//covertimos a zip
		$zip = new ZipArchive();
		$zip_file = $ruta_xml.".zip";
		$zip->open($zip_file, ZipArchive::CREATE);
		$zip->addFile($ruta_xml.".xml",$infoPago->pagoSerie.$infoPago->pagoFolio.".xml");
		$zip->close();

		// == TIMBRADO == //
		$wsdl="https://sat.sifei.com.mx:8443/SIFEI/SIFEI?wsdl";

        $file = base64_encode(file_get_contents($ruta_xml.".zip"));

        $parametros=array("Usuario"=>"$infoPago->sifeiUsuario","Password"=>"$infoPago->sifeiPassword","archivoXMLZip"=>$file,"Serie"=>" ","IdEquipo"=>"$infoPago->sifeiIdEquipo");

        $client= new nusoap_client($wsdl,true);

        $rst=$client->call('getCFDI',$parametros);

		//borramos el archivo ZIP
		unlink($ruta_xml.".zip");

		 //verificar que no causo algun error
        if(isset($rst['detail']['SifeiException']['message'])){

			unlink($ruta_xml.".xml");//borramos el archivo XML creado

			$error["codigoError"] = $rst['detail']['SifeiException']['codigo'];
			$error["error"] = true;

        }elseif($rst==""){

			unlink($ruta_xml.".xml");//borramos el archivo XML creado

            $error["codigoError"] = 999;
            $error["error"] = true;

        }else{	// |-> si no causo error genera la factura

        	unlink($ruta_xml.".xml");//borramos el archivo XML creado

			$timbre = base64_decode($rst["return"]);//decodificamos respuesta

			//creamos un ZIP con el XML dentro del ZIP
			$new_xml = fopen ($ruta_xml.".zip", "w");
			fwrite($new_xml,$timbre);
			fclose($new_xml);

			$zip = new ZipArchive;
			if ($zip->open($ruta_xml.".zip") === TRUE) {

				$name = $zip->getNameIndex(0);
				$zip->extractTo('files/facturas/'.$folder_factura.'/clientes/'.$fc[0].'/'.$fc[1].'/');
				$zip->close();

				unlink($ruta_xml.".zip");

				rename('files/facturas/'.$folder_factura.'/clientes/'.$fc[0].'/'.$fc[1].'/'.$name,$ruta_xml.".xml");

				//leemos XML para extraer informacion generada por el PAC
				$load_xml = simplexml_load_file($ruta_xml.'.xml');
				$ns = $load_xml->getNamespaces(true);

				$load_xml->registerXPathNamespace('t', $ns['tfd']);

				foreach ($load_xml->xpath('//t:TimbreFiscalDigital') as $tfd) {

					$uuid = "{$tfd['UUID']}";
					$selloSAT = "{$tfd['SelloSAT']}";
					$certificadoSAT = "{$tfd['NoCertificadoSAT']}";
					$sellocfd = "{$tfd['SelloCFD']}";
					$fechaTimbradoS = "{$tfd['FechaTimbrado']}";
					$fechaTimbrado = "{$tfd['FechaTimbrado']}";
					$fechaTimbrado = str_replace("T"," ",$fechaTimbrado);

				}

				//generamos la cadena original del complemento de certificacion del sat
				$cadena_original_sat = '||1.0|';
				$cadena_original_sat .= $uuid.'|';
				$cadena_original_sat .= $fechaTimbradoS.'|';
				$cadena_original_sat .= $sellocfd.'|';
				$cadena_original_sat .= $certificadoSAT.'||';

			}

		}

		if ($error === false) {

			//informacion para retornar y actualizar la factura como TImbrada
			$pagoTimbrado = array(
				"uuid"				=>	$uuid,
				"selloSAT"			=>	$selloSAT,
				"certificadoSAT"	=>	$certificadoSAT,
				"sellocfd"			=>	$sellocfd,
				"fechaTimbrado"		=>	$fechaTimbrado,
				"rutaXML"			=>	$ruta_xml.".xml",
				"error"				=>	false
			);

			return $pagoTimbrado;

		}else{

			return $error;

		}

	}

	function regenerarCFDI($infoFactura,$conceptos)
	{
		//obtenemos la fecha de la factura
		$fch = "$infoFactura->facturaFecha";
		$fecha = explode(" ",$fch);
		//variable para detectar error
		$error = false;
		//variable para detectar si solo se maneja impuesto tasa 0.160000 o tambien tasa 0.000000
		$tasa0 = false;
		$tasa16 = false;

		//iniciamos la variable de cadena_original
		$cadena_original = '';

		//creamos la cadena original
		//atributos del comprobante --->
		$cadena_original .= '||3.3|';// ||-> version *
		$cadena_original .= $infoFactura->facturaSerie.'|';// ||-> serie folio fiscal original
		$cadena_original .= $infoFactura->facturaFolio.'|';// ||-> folio fiscal original
		$cadena_original .= $fecha[0].'T'.$fecha[1].'|';// ||-> fecha *
		$cadena_original .= $infoFactura->facturaMetodoPagoClave.'|';// ||-> forma de pago *
		/*
		formas de pago
		01 = EFECTIVO
		02 = CHEQUE NOMINATIVO
		03 = TRANSFERENCIA ELECTRONICA DE FONDOS
		04 = TARJETA DE CREDITO
		05 = MONEDERO ELECTRONICO
		06 = DINERO ELECTRONICO
		08 = VALES DE DESPENSA
		28 = TARJETA DE DEBITO
		29 = TARJETA DE SERVICIOS
		99 = POR DEFINIR
		*/
		$cadena_original .= $infoFactura->empresaCertificadoNumero.'|';// ||-> numero de certificado del emisor
		$cadena_original .= number_format($infoFactura->facturaSubtotal,2,'.','').'|';// ||-> subtotal *
		$cadena_original .= 'MXN|';// ||-> moneda
		$cadena_original .= '1|';// ||-> tipo de cambio
		$cadena_original .= number_format($infoFactura->facturaTotal,2,'.','').'|';// ||-> total *
		$cadena_original .= 'I|';// ||-> tipo de comprobante *
		/*
		tipo de comprobante
		I = INGRESO
		E = EGRESO
		T = TRASLADO
		N = NOMINA
		P = PAGO
		*/
		$cadena_original .= $infoFactura->facturaFormaPagoClave.'|';// ||-> metodo de pago *
		/*
		metodo de pago
		PUE = PAGO EN UNA SOLA EXHIBICION
		PPD = PAGO EN PARCIALIDADES O DIFERIDO
		*/
		$cadena_original .= $infoFactura->sucursalCp.'|';// ||-> lugar de expedicion * ---> SOLO CODIGO POSTAL

		//$cadena_original .= '|';// ||-> condiciones de pago
		//$cadena_original .= number_format(0,2,'.','').'|';// ||-> descuento
		//$cadena_original .= '|';// ||-> numero de cuenta
		//$cadena_original .= '|';// ||-> monto folio fiscal original

		//atributos del emisor --->

		$cadena_original .= $infoFactura->empresaRFC.'|';// ||-> rfc  *
		$cadena_original .= $infoFactura->empresaRazon.'|';// ||-> nombre
		//$cadena_original .= $infoFactura->empresaDireccion.'|';// ||-> calle  *
		//$cadena_original .= $infoFactura->empresaNumExt.'|';// ||-> numero exterior
		//$cadena_original .= '|';// ||-> numero interior
		//$cadena_original .= $infoFactura->empresaColonia.'|';// ||-> colonia
		//$cadena_original .= $infoFactura->empresaCiudad.'|';// ||-> localidad
		//$cadena_original .= '|';// ||-> referencia
		//$cadena_original .= $infoFactura->empresaCiudad.'|';// ||-> municipio  *
		//$cadena_original .= $infoFactura->empresaEstado.'|';// ||-> estado  *
		//$cadena_original .= 'MEXICO|';// ||-> pais  *
		//$cadena_original .= $infoFactura->empresaCp.'|';// ||-> codigo postal  *

		//atributos expedidoEn --->

		//$cadena_original .= $infoFactura->sucursalDireccion.'|';// ||-> calle  *
		//$cadena_original .= $infoFactura->sucursalNumExt.'|';// ||-> numero exterior
		//$cadena_original .= '|';// ||-> numero interior
		//$cadena_original .= $infoFactura->sucursalColonia.'|';// ||-> colonia
		//$cadena_original .= $infoFactura->sucursalCiudad.'|';// ||-> localidad
		//$cadena_original .= '|';// ||-> referencia
		//$cadena_original .= $infoFactura->sucursalCiudad.'|';// ||-> municipio  *
		//$cadena_original .= $infoFactura->sucursalEstado.'|';// ||-> estado  *
		//$cadena_original .= 'MEXICO|';// ||-> pais  *
		//$cadena_original .= $infoFactura->sucursalCp.'|';// ||-> codigo postal  *

		$cadena_original .= $infoFactura->empresaRegimenClave.'|';// ||-> regimen fiscal  *
		/*
		regimen fiscal
		601 = GENERAL DE LEY PERSONAS MORALES
		612 = PERSONAS FISICAS CON ACTIVIDADES EMPRESARIALES Y PROFESIONALES
		621 = INCORPORACION FISCAL
		*/

		//atributos del receptor --->

		$cadena_original .= $infoFactura->clienteRFC.'|';// ||-> rfc  *
		$cadena_original .= $infoFactura->clienteRazon.'|';// ||-> nombre
		//$cadena_original .= $infoFactura->clienteDireccion.'|';// ||-> calle  *

		//$infoFactura->clienteNumExt != NULL ? $cadena_original .= $infoFactura->clienteNumExt.'|' : '';// ||-> numero exterior

		//$infoFactura->clienteNumInt != NULL ? $cadena_original .= $infoFactura->clienteNumInt.'|' : '';// ||-> numero interior

		//$infoFactura->clienteColonia != NULL ? $cadena_original .= $infoFactura->clienteColonia.'|' : '';// ||-> colonia

		//$cadena_original .= $infoFactura->clienteCiudad.'|';// ||-> localidad
		//$cadena_original .= '|';// ||-> referencia
		//$cadena_original .= $infoFactura->clienteCiudad.'|';// ||-> municipio  *
		//$cadena_original .= $infoFactura->clienteEstado.'|';// ||-> estado  *
		//$cadena_original .= 'MEXICO|';// ||-> pais  *

		//$infoFactura->clienteCp != NULL ? $cadena_original .= $infoFactura->clienteCp.'|' : '';// ||-> codigo postal  *
		$cadena_original .= $infoFactura->facturaUsoCFDI.'|'; // |-> uso CFDI
		/*
		USO CFDI
		G01 = ADQUISICION DE MERCANCIAS
		G02 = DEVOLUCIONES, DESCUENTOS O BONIFICACIONES
		G03 = GASTOS EN GENERAL
		IO1 = CONSTRUCCIONES
		I02 = MOBILIARIO Y EQUIPO DE OFICINA POR INVERSIONES
		I03 = EQUIPO DE TRANSPORTE
		I04 = EQUIPO DE COMPUTO Y ACCESORIOS
		I05 = DADOS, TROQUELES, MOLDES, MATRICES Y HERRAMENTAL
		... N USOS --
		PO1 = POR DEFINIR
		*/

		//iteramos los conceptos
		foreach ($conceptos as $key => $concepto) {

			//calculamos precio unitario e importe antes de iva
			//validamos si se mostraras las partidas originales o solo la partida de facturacion
			if ($infoFactura->ventaPartidaFactura == 0) {

				//$preciou = $concepto->precio - calcularDescuento($concepto->precio,$concepto->descuento);
				$preciou = $concepto->precioUnitarioXML;
				//$importe = $preciou * $concepto->cantidad;
				$importe = $concepto->importe;
				$tasaCuota = ($concepto->partidaIVA / 100);
				//$importeImpuesto = $importe * $tasaCuota;
				$importeImpuesto = $concepto->iva;

			}else{

				$preciou = $infoFactura->facturaSubtotal;
				$importe = $preciou;
				$tasaCuota = ($concepto->partidaIVA / 100);
				$importeImpuesto = $infoFactura->facturaIVA;

			}

			$cadena_original .= $concepto->claveProductoServicio.'|'; // |->clave de producto o servicio *
			$cadena_original .= $concepto->codigob.'|';// ||-> numero de identificacion
			$cadena_original .= number_format($concepto->cantidad,3,'.','').'|';// ||-> cantidad*
			$cadena_original .= $concepto->claveUnidad.'|'; // |->clave de unidad
			$cadena_original .= $concepto->descripcion.'|';// ||-> descripcion*
			$cadena_original .= number_format($preciou,2,'.','').'|';// ||-> valor unitario*
			$cadena_original .= number_format($importe,2,'.','').'|';// ||-> importe*

			// ---- informacion de traslado de conceptos Impuestos
			$cadena_original .= number_format($importe,2,'.','').'|'; // |->base*  es el importe del concepto
			$cadena_original .= '002|'; // |->Impuesto
			/*
			impuesto
			001 = ISR
			002 = IVA
			003 = IEPS
			*/
			$cadena_original .= 'Tasa|';// |->tipo factor
			/*
			TIPO FACTOR
			->TASA
			->CUOTA
			->EXCENTO
			*/
			if ($tasaCuota == 0) {

				$tasa0 = true;

			}else{

				$tasa16 = true;

			}

			$cadena_original .= number_format($tasaCuota,6,'.','').'|';// |->tasa cuota
			$cadena_original .= number_format($importeImpuesto,2,'.','').'|';// |->importe del impuesto

		}

		// informacion total de impuestos

		$cadena_original .= '002|';// ||-> nombre del impuesto*
		/*
		impuesto
		001 = ISR
		002 = IVA
		003 = IEPS
		*/
		$cadena_original .= 'Tasa|';// |->tipo factor
		/*
		TIPO FACTOR
		->TASA
		->CUOTA
		->EXCENTO
		*/

		if ($tasa16 === true) {

			$cadena_original .= '0.160000|';// |->tasa cuota
			$cadena_original .= number_format($infoFactura->facturaIVA, 2,'.','').'|';// ||-> importe*

		}

		if ($tasa0 === true) {

			$cadena_original .= '0.000000|';// |->tasa cuota
			$cadena_original .= '0.00|';// ||-> importe*

		}

		$cadena_original .= number_format($infoFactura->facturaIVA, 2,'.','').'||'; // ||-> total de impuestos trasladados

		//limpiamos la cadena original de espacios y codificamos a utf8
		$cadena_original = str_replace("  "," ",$cadena_original);
		$cadena_original = utf8_decode($cadena_original);
		$cadena_original = utf8_encode($cadena_original);

		// ===== creamos ruta para almacenar el XML/PDF ===== --->

		//descomponemos la fecha, para almacenar los archivos en el directorio correcto, ..\AÑO\MES\ aqui los archivos
		$fc = explode("-",$fecha[0]);//$fc[0]=año, $fc[1]=mes

		//creamos el nombre de la carpeta de la empresa con el rfc
		$folder_factura = $infoFactura->empresaRFC;

		//validamos si existe la carpeta con el rfc de la empresa, sino la cremos
		if(!file_exists('files/facturas/'.$folder_factura.'/')){
			mkdir('files/facturas/'.$folder_factura.'/',0777);
		}

		//crear folder de clientes en caso de no existir
		if(!file_exists('files/facturas/'.$folder_factura.'/clientes/')){
			mkdir('files/facturas/'.$folder_factura.'/clientes/',0777);
		}

		//crear folder del año en caso de no existir
		if(!file_exists('files/facturas/'.$folder_factura.'/clientes/'.$fc[0].'/')){
			mkdir('files/facturas/'.$folder_factura.'/clientes/'.$fc[0].'/',0777);
		}

		//crear folder del mes en caso de no existir
		if(!file_exists('files/facturas/'.$folder_factura.'/clientes/'.$fc[0].'/'.$fc[1].'/')){
			mkdir('files/facturas/'.$folder_factura.'/clientes/'.$fc[0].'/'.$fc[1].'/',0777);
		}

		$ruta_xml = 'files/facturas/'.$folder_factura.'/clientes/'.$fc[0].'/'.$fc[1].'/'.$infoFactura->facturaSerie.$infoFactura->facturaFolio;
		// ==================================================

		//generamos la cadena original del complemento de certificacion del sat
		$fechaTimbradoS = str_replace("T"," ",$infoFactura->facturaFechaTimbrado);
		$cadena_original_sat = '||1.0|';
		$cadena_original_sat .= $infoFactura->facturaUUID.'|';
		$cadena_original_sat .= $fechaTimbradoS.'|';
		$cadena_original_sat .= $infoFactura->facturaSelloCFD.'|';
		$cadena_original_sat .= $infoFactura->facturaCertificadoSAT.'||';

		// ============== GENERAMOS PDF ==================
		$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

		// remove default header/footer
		$pdf->setPrintHeader(false);
		$pdf->setPrintFooter(false);

		// set default monospaced font
		$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

		// set margins
		$pdf->SetMargins("10", "10", "10");

		// set auto page breaks
		$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

		// set image scale factor
		$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

		// set some language-dependent strings (optional)
		if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
			require_once(dirname(__FILE__).'/lang/eng.php');
			$pdf->setLanguageArray($l);
		}

		// set font
		$pdf->SetFont('', '', 7);

		// add a page
		$pdf->AddPage();

		$html = '

				medidas[0].'%" valign="top">medidas[3].'" />
				medidas[1].'%" valign="top">

					'.$infoFactura->empresaRazon.'

					'.$infoFactura->empresaDireccion.' No. Ext. '.$infoFactura->empresaNumExt;

					if ($infoFactura->empresaNumInt != '' && $infoFactura->empresaNumInt != NULL) {

						$html .= ', No. Int '.$infoFactura->empresaNumInt;

					}

					$html .= '
					, '.$infoFactura->empresaColonia.'

					C.P. '.$infoFactura->empresaCp.', '.$infoFactura->empresaCiudad.', '.$infoFactura->empresaEstado.'

					RFC: '.$infoFactura->empresaRFC.'

				  	'.$infoFactura->empresaRegimenClave.' - '.$infoFactura->empresaRegimenNombre.'

				medidas[2].'%" valign="top">

					FACTURA '.$infoFactura->facturaSerie.$infoFactura->facturaFolio.'

					Fecha/Hora

					Certificación

					'.$infoFactura->facturaFechaTimbrado.'

					Fecha de Emisión

					'.$fecha[0].' '.$fecha[1].'

					Tipo de Comprobante

					I - Ingreso

					Lugar de Expedicion

					'.$infoFactura->sucursalCp.'

					Receptor del comprobante fiscal

					'.$infoFactura->clienteRazon.'

					'.$infoFactura->clienteDireccion;

					if($infoFactura->clienteNumExt != '' && $infoFactura->clienteNumExt != NULL && $infoFactura->clienteNumExt != 0){

						$html .= ', No. Ext. '.$infoFactura->clienteNumExt;

					}

					if($infoFactura->clienteNumInt != '' && $infoFactura->clienteNumInt != NULL){

						$html .= ', No. Int. '.$infoFactura->clienteNumInt;

					}

					$html .= '
					, '.$infoFactura->clienteColonia.',

					C.P. '.$infoFactura->clienteCp.', '.$infoFactura->clienteCiudad.', '.$infoFactura->clienteEstado.', México

					RFC: '.$infoFactura->clienteRFC.'

				  	Uso CFDI: '.$infoFactura->facturaUsoCFDI.' - '.$infoFactura->facturaUsoCFDInombre.'

					Folio Fiscal

					'.$infoFactura->facturaUUID.'

					Numero de Serie del Certificado

					'.$infoFactura->empresaCertificadoNumero.'

					Numero de Serie del Certificado del SAT

					'.$infoFactura->facturaCertificadoSAT.'

		   ';

		   		// Aqui se incluyen los comentarios de la venta
			  $html .= '

						'.$infoFactura->ventaComentarios.'

				';

		  $html .= '

				Cantidad

					ClaveProdServ

					Clave unidad

					No. Identificacion

				porcentajeDescripcion.'%" align="center">Descripción
				Valor Unitario
			';

			// == campos dinamicos ==
			if ($infoFactura->camposDinamicos !== false){

				foreach ($infoFactura->camposDinamicos as $key => $campo){

					if (in_array($campo->venta_campos_cot_id, $infoFactura->camposVenta)){

						$html .= ''.$campo->venta_campos_cot_nombre.'	';

					}

				}

			}

			$html .= '
				Impuesto
				Importe

';

			  //==== productos

			foreach ($conceptos as $key => $concepto) {

				//calculamos precio unitario e importe antes de iva
				//validamos si se mostraras las partidas originales o solo la partida de facturacion
				if ($infoFactura->ventaPartidaFactura == 0) {
					//$preciou = $concepto->precio - calcularDescuento($concepto->precio,$concepto->descuento);
					$preciou = $concepto->precioUnitario;
					//$importe = $preciou * $concepto->cantidad;
					$importe = $concepto->importe;

				}else{

					$preciou = $infoFactura->facturaSubtotal;
					$importe = $preciou;

				}

				$html .= '

					'.$concepto->cantidad.'
					'.$concepto->claveProductoServicio.'
'.$concepto->claveUnidad.'
'.$concepto->codigob.'
					'.$concepto->descripcion.'
					$ '.number_format($preciou,2).'
				';

				// == campos dinamicos ==
				if ($infoFactura->camposDinamicos !== false){

					foreach ($infoFactura->camposDinamicos as $key => $campo){

						if (in_array($campo->venta_campos_cot_id, $infoFactura->camposVenta)){

							$html .= '';

							//aqui traemos la informacion de los campos adicionales
                            $primerNivel = explode("||", $concepto->camposCotizacion);

                            foreach ($primerNivel as $key => $Pnivel) {

                                $segundoNivel = explode("@", $Pnivel);

                                if ($segundoNivel[0] == $campo->venta_campos_cot_id) {

                                    $html .= $segundoNivel[1];

                                }

                            }

                            $html .= '	';

						}

					}

				}

				if ($infoFactura->ventaPartidaFactura == 0) {

					$html .= '002-IVA | $ '.number_format($concepto->iva,2).'	';

				}else{

					$html .= '002-IVA | $ '.number_format($infoFactura->facturaIVA,2).'	';

				}

				$html .= '
					$ '.number_format($importe,2).'

				';

				if($concepto->comentario !='' && $concepto->comentario != NULL){

					$comentario = nl2br($concepto->comentario);

					$html .= '

							Comentarios:
							'.$comentario.'

					';

				}

			}

			$html .= '

					Moneda: MXN - Peso Mexicano

					Forma de pago: '.$infoFactura->facturaMetodoPago.'

					Metodo de Pago: '.$infoFactura->facturaFormaPagoClave.' - '.$infoFactura->facturaFormaPago.'

					Importe Total con letra: ( '.$infoFactura->facturaTotalLetras.' )

					Subtotal
					$ '.number_format($infoFactura->facturaSubtotal,2).'

					Total Impuestos Trasladados
					$ '.number_format($infoFactura->facturaIVA,2).'

					Total Comprobante
					$ '.number_format($infoFactura->facturaTotal,2).'

				Cadena original del complemento de certificación digital del SAT

				'.$cadena_original_sat.'

				Sello Digital del CFDI

				'.$infoFactura->facturaSelloCFD.'

				Sello digital del SAT

				'.$infoFactura->facturaSelloSAT.'

			Este documento es una representación impresa de un CFDI

';

		// output the HTML content
		$pdf->writeHTML($html, true, false, true, false, '');

		//Close and output PDF document
		$pdf->Output($ruta_xml.'.pdf', 'F');

		//  ======== fin PDF ========

		return true;

	}

	function limpiarCaracteres($cadena)
	{
		$search  = array("<", ">", "&", "'",'"');
	    $replace = array("<", ">", "&", "'",""");
	    $final = str_replace($search, $replace, $cadena);
	    return $final;
	}

}

 ?>


2SugarLipsBB . GirlforGame. ALEXISvsADELIN. beautifuamazon66.
alan2016latinoKennyYorkMuscularMasterAsianLee .cum2urMISTRESSEroticSubGirlforGameDyan .SandySweet4uBIGguyVShotBOYAllisonDesirexgirlcockhugexx .DarlingHarryCrystallHotjuanchocoualan2016latino .SmokinBlundsWildeHeartKyleCoxfialllka .BigesmeraldalipsHoXtBrunetteVeryHotSlutToyStoree .beautifuamazon66Leyllo4kaaLovelyLjPLAYwithmyCOCKx .LilyBushKyleCoxIvanLuckyDarlingHarry .ToriDiamondXjordxnEmmaFloresBIGguyVShotBOY .LorenzoPopcornPammelaRushfialllkabeautifuamazon66 .RockWomanNixieBabyDudeReadyToPlayJessicapeaches18 .
LilyBushVeryHotSlutbigtoy4you38BIGmuscleJOE .ToriDiamondXFlirtingLoriLovelyALEX4Y0UNixieBaby .AllisonDesiresmoothSkinXXXSugarsweetXXXkeanucriss07 .EroticSubGirlforGameEvaBeeragraaronman1988 .NixieBabyfialllkaLondonStormSandySweet4u .HoXtBrunettejordxnNiceNarikoALEXISvsADELIN .XXXSugarsweetXXXALEXISvsADELINAssBigForUliianaa .SexonthebeachxxxKennyYorkMissyLisaLilyBush .BrionySweetfoxylatina23ToriDiamondXorhide .LorenzoPopcornAmyHotLipsDyanLilyBush .CrystallHotLilyBushxdirtylobahotJennifer1177 .

{'timestamp': '2019-04-25T04:20:34Z', 'url': 'http://wittyvideos.net/2SugarLipsBB', 'language': 'en', 'source': 'c4'}


Bedřich Smetana (; Litomyšl, 1824. március 2. – Prága, 1884. május 12.) cseh zeneszerző, akinek a nevéhez később a nemzete függetlenedéséhez kapcsolódó zenei motívumvilág megteremtése kapcsolódik. Emiatt hazájában sokan a cseh zene atyjának tekintik. Nemzetközileg Az eladott menyasszony című operája és a zeneszerző otthonának történetét, legendavilágát és tájait bemutató Má vlast (Hazám) ciklus tette, melynek legismertebb tétele a Vltava (Moldva), illetve az Életemből az e-moll vonósnégyes nyitánya.

Smetana a zongorázás terén őstehetségnek számított. Első koncertjét hatéves korában adta. Miután kötelező tanulmányait teljesítette, Josef Proksch kezei alatt tanult Prágában zenélni. Első nemzeti érzelmű szerzeménye a Habsburgok elleni 1848-as felkelés idején született. A harcokban rövid ideig maga is részt vett. Miután Prágában nem sikerült megalapoznia a jövőjét, Svédországba költözött, ahol tanárként és karmesterként dolgozott Göteborgban. Itt fogott hozzá a nagyívű zenekari műveihez. Ezalatt Smetana kétszer megnősült, a két házasságból hat gyermeke született, akik közül hárman csecsemőkorukban meghaltak.

Az 1860-as években érezhető szabadabb politikai légkör hatására Smetana végleg visszaköltözött Prágába. Hamar belevetette magát a cseh zenei életbe, és az új cseh opera egyik első híres egyénisége volt. Első két operáját, melyeknek címe A brandenburgiak Csehországban, illetve Az eladott menyasszony, 1866-ban az újonnan megnyílt Tartományi Színházban mutatták be. Utóbbi hatalmas sikert aratott már az első előadáson. Smetana még abban az évben a színház vezető karmestere lett, de ekkoriban sok kritika érte a munkája miatt. A városban olyan csoportok alakultak, akik szerint rossz hatással van egy könnyen felismerhető cseh opera létrejöttére az, ha Smetana azonosul Liszt Ferenc vagy Richard Wagner túlságosan haladónak ítélt gondolataival. Ez az ellenállás megtörte a kreatív alkotási ritmusát, és egészségének megromlásával is kapcsolatba hozható, melynek következtében 1874-ben ott kellett hagynia a színházat.

Bár ez év végére teljesen elvesztette a hallását, a színházi kötelezettségek okozta stressz elmúltával az egész hátralévő életében aktívan alkotott, zenét szerzett. Már korában is nagyra értékelték a cseh művészetért és kultúráért végbe vitt teljesítményét. Idegileg azonban összeomlott, és emiatt utolsó éveit elmegyógyintézetben töltötte.

Smetanát hazájában halála után is a cseh zene atyjának tartották, és a kritikusok kortársainál s követőinél is többre értékelik az ő munkásságát. Ennek ellenére viszonylag kevés munkája tett szert nemzetközi hírnévre, a legtöbb külföldi forrás Antonín Dvořákot jelentősebbnek tartja.

Élete

Családja és gyermekkora
Bedřich Smetana Friedrich Smetana néven 1824. április 28-án Prágától keletre, a Habsburg Birodalomhoz tartozó Csehország és Morvaország határán, Litomyšlben látta meg a napvilágot. František Smetana és harmadik feleségének, Barbora Lynkova harmadik közös gyermeke, első fia. Františeknek előző két házasságából volt még nyolc gyermeke, akik közül öt lánya élte túl a csecsemőkort. Barborával további tíz gyermekük volt, akik közül csak hét érte meg a felnőttkort. Az ekkor Habsburg-uralom alatt álló Csehországban a német volt a hivatalos nyelv. Bár František tudott csehül, gazdasági és társadalmi okokból kifolyólag ritkán használta. Emiatt gyermekei csak felnőttként tanultak meg szabályosan beszélni csehül.

Smetanáék Csehország Hradec Králové régiójából származtak. František kitanulta a sörfőzést és a vendéglátást, s a napóleoni háborúk idején, mivel ruhát és kvártélyt tudott biztosítani a francia csapatoknak, tisztes jómódra tett szert. Már több sörözője volt azelőtt is, hogy 1823-ban Waldstein báróhoz költözött volna Litomyšlbe. Gazdájának kastélya egyben a város leglátványosabb épülete, ékköve is volt.

Bár az idősebb Smetana sehol nem tanult zenélni, vele született tehetsége volt hozzá, és még egy vonósnégyesben is játszott. Bedřicht édesapja 1830-ban, hatévesen vezette be a hangszerek rejtelmeibe. A későbbi zeneszerző ekkor adta első koncertjét. Litomyšl Filozófiai Akadémiáján Auber A portici némájának nyitányát adta elő zongorára áthangszerelve. Az előadás vegyes fogadtatást kapott. 1831-ben a család Csehország déli részébe, Jindřichův Hradecbe költözött, abba a körzetbe, ahol egy évszázaddal később Gustav Mahler nőtt fel. Smetana itt végezte el általános iskolai és gimnáziumi tanulmányait. Hegedülni és zongorázni tanult itt, megismerkedett Mozart és Beethoven munkáival, és elkezdett egyszerűbb előadásokat komponálni. Ezek közül egy, a (Kvapiček, magyarul Kisgalopp) piszkozatként fennmaradt.

1835-ben František nyugdíjba ment, és elköltözött egy délkelet-csehországi birtokra. Mivel a közelben nem volt megfelelő iskola, fiát egy jihlavai gimnáziumba küldte, ahol azonban a honvágy miatt nem tudott tanulni. Így átjelentkezett a premontreiek Německý Brod-i iskolájába, ahol megjött a kedve, és sokkal jobban haladt a leckével. Barátai között felfedezhető Karel Havlíček, későbbi forradalmár költő, aki azzal, hogy Prágába költözött, befolyásolhatta Smetanát, hogy ő is a fővárosban folytassa az életét. A következő évtől édesapja jóváhagyásával beiratkozott a Prágai Akadémia Gimnáziumának egyik osztályába, melyet az ellentmondásos Josef Jungmann, a cseh nemzeti megújhodás mozgalmának egyik kulcsszereplője vezetett.

Zenei tanulmányai

Első lépések
Smetana 1839 őszén érkezett meg Prágába. Mivel Jungmann iskolája számára túlságosan idegennek számított, Smetana lassan elkezdett kimaradozni az órákról. Koncertekre, operába járt, katonai rézfúvósokat hallgatott, és belépett egy vonósnégyesbe is, amelynek rövidebb darabokat írt. Liszt prágai zongorahangversenyei után úgy érezte, ő csak a zenei pályán találja meg számítását. Saját szavaival élve „Isten kegyelmével és segítségével egy napon a technika terén Liszt, a komponálás terén pedig Mozart leszek”. Az idill azonban véget ért, amint František rájött fia kicsapongó életmódjára. Ekkor elvitte a városból. Apja ekkoriban a zenét szabadidős elfoglaltságnak tartotta, és nem látott benne karrierlehetőséget. Smetanát átköltöztették Nové Městóba nagybátyjához, ahol rövid időre szerelmes lett unokatestvérébe, Louisába. Ennek a románcnak állított emléket a Louisa Polka, Smetana legrégebbi fennmaradt szerzeménye.

Unokabátyja, Josef Smetana, a pilseni Premontrei Iskola tanára ajánlotta fel, hogy figyel majd a fiúra hátralévő tanulmányi ideje alatt. Ezek után Smetana 1840-ben Pilsenbe költözött. Egészen 1843-ig, tanulmányai befejezéséig ott maradt. Sokat lendített a város életén, hogy jól értett a zongorához, ennek köszönhetően változatos társasági életet élt, és többször felbukkant különböző éjszakai mulatókban. Több románcban is része volt. Ezek közül a legfontosabbat Kateřina Kolářovával tartotta fenn. A lányt már kora gyermekkora óta ismerte. Smetana teljesen beleszeretett. Naplójában egyszer ezt írta: „Ha nem vagyok vele, teljesen úgy érzem, mintha tűkön ülnék, egyszerűen nem tudok lenyugodni." Több zenét is neki szerzett, többek között két quadrillet, egy duettet, és egy félbehagyott, bal kézre írt zongoraleckét. Ekkor született első oratórikus műve, egy b-moll menüett.

Diák és tanár
Mire befejezte tanulmányait, édesapja gazdagsága leáldozóban volt. Bár ekkor már beleegyezett abba, hogy fia a zene területén próbáljon meg boldogulni, ehhez már nem tudott anyagi támogatást biztosítani. Smetana 1843. augusztusban 20 forinttal a zsebében elhagyta Prágát. Mivel még semmilyen zenei képzést nem kapott, Kateřina Kolářová édesanyja bemutatta Josef Prokschnak, a Prágai Zenei Intézet vezetőjének. Kateřina ekkoriban az intézet hallgatója volt. Proksch a legmodernebb tanítási módszereket alkalmazta, és olyan zeneszerzők művei alapján tanított, mint Beethoven, Chopin, Berlioz vagy Liszt lipcsei társasága. 1844. januárban Proksch beleegyezett, hogy felvegye Smetanát a tanulói közé. Ugyanekkor megoldódni látszódtak az anyagi gondok is, ugyanis felvették egy cseh nemesi családhoz, a Thun családhoz, mint zongoraoktatót.

A következő három évben Smetana a Thun-gyerekeknek zongoraórákat adott, ugyanakkor ő maga zeneelméletet és komponálást tanult Prokschnál. Többek között tánczenék, dalok, impromptuk, bagatellek és a G-dúr zongoraszonáta kerültek ki a kezei alól. 1846-ban részt vett Berlioz prágai koncertjén, és minden valószínűség szerint Proksch egyik fogadásán személyesen is találkozott a francia mesterrel. Thunéknál találkozott Robert és Clara Schumann-nal, akiknek megmutatta a g-moll szonátáját. Ők azonban nem voltak tőle elragadtatva, túlságosan is érezték rajta Berlioz hatását. Eközben elmélyült a kapcsolata Kateřinával. Mikor 1847-ben otthagyta a Thun családot, Smetana őt javasolta utódjának. Tanulmányai után nekivágott Nyugat-Csehországnak, hogy reményeit beteljesítve megbecsült, koncerteken szereplő zongorista legyen.

Karrierje elején

Forradalmár
Smetana nyugat-csehországi koncertkörútját alig támogatták, így vissza kellett térnie Prágába. Itt magántanulókat fogadott, valamint ritkán egyedül és kamarakórusokkal együtt is fellépett, és az így szerzett pénzből tartotta el magát. Ekkor kezdett el dolgozni első nagyobb lélegzetvételű zenekari művén, a d-moll nyitányon.

1848-ban Smetana belekóstolt a forradalom ízébe. A közéleti változások jegyében Smetana egyik régi barátja − Karel Havlíček − demokráciapárti mozgalmat alapított, mely sürgette a Habsburg abszolutizmus felszámolását és a politikai autonómia minél szélesebb körbe való kiterjesztését. A várost érő eseteges támadások kivédésére megalapították a polgárőrséget () Smetana több hazafias darabot írt, többek között egy-egy indulót a Cseh Nemzeti Gárda, illetve a Prágai Egyetem Hallgatóinak Légiója számára. Egy további művére Kollár János azt mondta, az a „szabadság dala". 1848 júniusában a császári hadak megindultak Prágába, hogy Windisch-Grätz herceg vezetésével visszaszorítsák a felkelést. Smetana, mint a Svornost tagja, segített a Károly híd körüli barikádok megerősítésében. A kísérleteket hamar elfojtották, de Smetana megmenekült attól, hogy a mozgalom vezetőihez – köztük Havlíčekhez – hasonlóan bebörtönözzék vagy száműzzék. Rövid svornosti tagsága alatt ismerkedett meg Karel Sabina vezető radikális íróval, aki megírta a zeneszerző első két operájának a librettóját.

A Zongoraintézetnél
1848 elején Smetana levelet írt Liszt Ferencnek, akivel akkor még nem találkozott, hogy hadd ajánlja neki az új zongorahangversenyét, a Hat prelúdiumot, és Liszt szíveskedjék a művet kiadásra javasolni. Ugyanekkor 400 forintnyi hitelt is kért tőle, melyből zeneiskolát akart nyitni. Liszt gyorsan válaszolt, megköszönte, hogy Smetana hozzá írja a darabot, és megígérte, segít kiadót találni. Pénzügyi segítséget azonban nem tudott nyújtani. Ez a biztatás volt a gyümölcsöző barátság első lépése. Annak ellenére, hogy Liszt nem tudott anyagilag hozzájárulni, Smetana augusztus végén 12 tanulóval megnyitotta a Zongoraintézetet. A kezdeti pénzügyi nehézségek ellenére az Intézet gazdaságilag megalapozta a jövőjét, és hamarosan divatossá vált oda járni. Leginkább a cseh nacionalizmus támogatói jelentek itt meg, akik Smetanát egyre többre tartották. Proksch Smetanának írt ajánlólevelében így fogalmazott: „Ő át tudja ültetni a cseh nyelvvel kapcsolatos elképzeléseimet is." 1849-ben az intézetet átköltöztették Kateřina szüleinek lakhelyére, ahol sokféle vendég megfordult: Liszt gyakori vendégnek számított, de a Prágában székelő Ferdinánd is gyakran részt vett a matiné előadásokon. Smetana szereplése a prágai zenei élet meghatározó eseményei közé tartozott ekkoriban. Ebben a pénzügyileg viszonylag kiszámítható időszakban, 1849. augusztus 27-én vette feleségül Kateřinát. 1851 és 1855 között négy lánya lett a párnak.

Kibontakozó zeneszerző
1850-ben − forradalmár beállítottsága ellenére − Smetana elfogadta Ferdinánd prágai várában a neki felajánlott udvari zongorista tisztet. Emellett továbbra is tanított a Zongoraiskolában, és egyre inkább a komponálásnak szentelte életét. Ekkoriban olyan háromrészes műveket írt zongorára, mint a később az Eladott menyasszonyban is felcsendülő Menyegzői darabok. Ekkor írta az Albumlap cím alatt összegyűjtött, saját tapasztalatait összefoglaló rövid darabokat, és az egyik polkasorozatát. 1853-54-ben a Ferenc József házassága alkalmából írt nagy zenekari művön, a Diadal-szimfónián dolgozott. A császári udvar nem engedélyezte a mű előadását, feltehetően azért, mert egy, az osztrák himnuszból vett rövid idézet nem eléggé feltűnő. Smetana nem csüggedt el, saját költségén bérelt egy zenekart, amely 1855. február 26-án a prágai Konvikt Teremben előadta a darabot. A mű csekély visszhangot kapott, a koncert gazdaságilag sikertelennek bizonyult.

Szomorú magánélet, elutasított tehetség

1854 és 1856 között több szerencsétlen dolog is történt Smetana életében. 1854 júliusában gümőkórban meghalt második lánya, Gabriela. Egy évvel később a már négyévesen is zenei tehetséget mutató elsőszülött lánya, Bedřiška halt meg skarlátban. Smetana az ő emlékére írta a g-moll zongoratriót, melyet 1855. december 3-án mutattak be Prágában. A zeneszerző szerint visszafogott volt a fogadtatása, de Liszt nagyon dicsérte. Röviddel Bedřiška halála után megszületett a pár negyedik lánya, Kateřina, de fiatalon, már 1856. júniusban meghalt. Ekkor már Kateřinánál is diagnosztizálták a tuberkulózist.

1856-ban szerzett Smetana tudomást a forradalom alatt megismert egyik barátja, Karel Havlíček száműzetésben bekövetkezett haláláról. További aggodalmakra adott okot a prágai politikai hangulat változása. Minden remény elveszett, hogy egy felvilágosult kormányt nevezzenek ki és szociális reformokat vezessenek be, mert az 1848-as forradalom leverése után Ferenc József Alexander Bach bárónak teljhatalmat biztosított a megtorlások terén. A Zeneintézet jó híre ellenére Smetana még mindig nem ért el olyan magas beosztást, mint híres kortársai, például Alexander Dreyschock. A kritikusok szerint Smetana kristálytiszta, finom érintései sokkal közelebb állnak Chopin, mint Liszt stílusához. Ekkoriban a legnagyobb színpadi sikere az 1856 januárjában, Mozart születésének évfordulóján előadott d-moll zongoraverseny volt. Egyre inkább elégedetlen volt Prágával kapcsolatban, és mikor meghallotta, hogy Dreyschock milyen sikereket ért el Svédországban, úgy döntött, ő is ott próbál szerencsét. 1856. október 11-én ezt írta szüleinek: „Prága nem ismer el, így itt az ideje, hogy továbblépjek.” Első útja Göteborgba vezetett.

Utazásai

Göteborg
Smetana először Kateřina nélkül ment el Svédországba. Lisztnek azt írta egyik levelében, hogy az embereknek itt zeneileg nem annyira kifinomult az ízlésük, de ebben lehetőséget látott arra, hogy olyan befolyást érjen, amire Prágában már semmi esélye nem lenne. Pár héten belül meg is tartotta első fellépését, és olyan zeneiskolát tudott nyitni, ahol rögtön túljelentkezéssel kellett szembenézni. Ezenkívül a Göteborgi Klasszikus Kóruszenei Szövetség karmestere is lett. Pár hónap elég volt ahhoz, hogy mind társadalmilag, mind szakmailag elismerjék a városlakók, de ezalatt kevés ideje maradt a zeneszerzésre. Felvázolta két jövőbeni zenekari művének, a Frithjofnak és A vikingek útjának a terveit, de mindkettőt félbehagyta.

1857 nyarán Smetana hazament Prágába, és látta, hogy Kateřina állapota tovább romlott. Júniusban édesapja, František meghalt. Ősszel Smetana Kateřinával, és még életben lévő lányukkal, Žofiével visszatért Göteborgba, de előtte még meglátogatta Weimarban Lisztet. Az ok a Karl August Goethe-Schiller jubileumi ünnepség volt, ahol Smetana részt vett Liszt Faust-szimfóniájának és Az ideáloknak a bemutatóján. Ez adott neki lendületet és erőt a folytatáshoz. Liszt volt Smetana legbefolyásosabb tanára, ő ihlette meg a legtöbbször. Ez így volt most is, ennek az útnak köszönhetően éledt fel benne a zeneszerzés iránti vágy, és egy kicsit belekóstolhatott az elzárt göteborgi világon kívül folyó zenei életbe.

Svédországba visszatérve az új tanítványok között feltűnt egy háziasszony, Fröjda Benecke, aki hamarosan Smetana múzsája és szeretője lett. Neki ajánlotta Schubert Die schöne Müllerin dalciklusa két dalának átiratát, és az egyik korai zongoraművét átírta polkára. Ennek a Látomások egy bálban címet adta. Ekkortájt sokkal lendületesebben komponált. 1858-ban befejezte a III. Richard című szimfonikus költeményét, az első nagyobb zenekari művét a Győzelmi szimfónia óta. A következő darab a Friedrich Schiller Wallenstein drámatrilógiájának hatására megírt Wallenstein tábora volt, és nekiállt egy harmadik költeménynek, a Hakon Jarlnak, aminek az alapja Adam Oehlenschläger dán költő drámája volt. Smetana ezen felül két nagyívű zongoradarabot írt: a Macbeth és a boszorkányok-at, valamint egy C-dúr etűdöt Liszt stílusában.

Magány, újabb házasság, visszatérés Prágába

Kateřina egészsége tovább romlott, és 1859 tavaszán egy hazafelé tartó útján, 1859. április 19-én Drezdában meg is halt. Smetana azt írta, észrevétlenül halt meg, és csak akkor vették észre, mikor felfigyeltek a szokatlan csendre. Miután Žofiét Kateřina édesanyja magához vette, a zeneszerző Liszthez ment Weimarba. Itt részt vett Liszt egyik tanítványa, Peter Cornelius A bagdadi borbély című vígoperájának bemutatóján. Ez későbbi, operaszerzői karrierjére is hatással volt. Még ebben az évben meglátogatta öccsét, Karelt, ahol beleszeretett a házigazda nála 16 évvel fiatalabb keresztlányába, Barbora (Bettina) Ferdinandiovába. Az eljegyzés után az 1859-60-as télre visszaköltözött Göteborgba. A házasságkötésre 1860. július 10-én került sor, miután az ifjú pár együtt elutazott az északi országba. Az út tetőpontja a Stockholmban előadott zongorakoncert volt, ahol a svéd királyi család is tiszteletét tette. A pár első lánya, Zdeňka 1861. szeptemberben született.

Ezalatt a solferinói csatában elszenvedett vereség következtében meggyengült Ferenc József Habsburg birodalma, és Bachnak távoznia kellett a hatalomból. Így Prágában egyre nagyobb tér nyílt a szabad gondolkodásnak. Smetana 1861-ben úgy látta, nagyobb tér jut a cseh nacionalizmusnak és kultúrának. Mielőtt döntött volna sorsa felől, Hollandiába és Németországba ment egy koncertkörútra. Megpróbált még egyszer zongoristaként érvényesülni, de ezúttal is kudarcot vallott. Prágába visszatérve 1862. januárban a Žofín-szigeti koncertteremben előadta a III. Richard-ot és a Wallenstein várá-t, de nem kapott különösebb visszhangot. A kritikusok szerint művei túl közel állnak a Liszt által fémjelzett Új Német Iskolához. Smetana erre úgy válaszolt, „a prófétát saját hazájában soha nem értik meg”. 1862 márciusban rövid időre visszatért Göteborgba, de a város már egyáltalán nem érdekelte. Szerinte ez csak egy kis vidéki állóvíz, és akármilyen nehéz lesz is, neki Prágában kell szerencsét próbálnia. „Hazám olyan mélyen gyökeret vert a szívembe, hogy igazán csak ott érzem otthon magam. Ez az, amiért feláldozhatom magam."

Későbbi évei

A siker A brandenburgiak Csehországban és az Eladott menyasszony című operák bemutatásával köszönt rá, melyeket Obříství-beli nyaralójában szerzett. A brandenburgiak Csehországban megkapta a legjobb cseh opera címet, de az első igazi hamisítatlan cseh opera az Eladott menyasszony volt. A mű sikerének köszönhetően 1866-ban a Prozatímní színház dirigense lett. Vett egy szerény kis házat egy Týn nad Bečvou nevű faluban, Olomouctól keletre.

1870 után Bedřich Smetana egészségi állapota rosszabbodni kezdett. Makacs kiütésektől és más problémáktól szenvedett. 1874-ben már jobb fülére nem hallott, majd ősz végére teljesen megsüketült, ami a szifilisz komplikációjaként lépett fel. Ezt a nemi betegséget minden bizonnyal szeretőjétől, Lella Ricci énekesnőtől kapta el (ezt a vélekedést Mirko Očadlík zenetudós tartja). Smetana egészségi állapota egyre romlott, a betegség következtében idegrendszere fokozatosan felmondta a szolgálatot. Életének utolsó évét Smetana lányánál, Zsófiánál és vejénél töltötte jabkenicei vadászházukban, Mladá Boleslav mellett. 1875-től kezdve már itt élt.

Sem a nehézségek, sem a süketség nem törték meg, és megírta a A titok, a Hubička és a Čertovu stěnu című operáit, majd mindkét vonósnégyesét, az Álmok és a Cseh táncok című zongoradarabokat, egy sor kórusművet, befejezte a Má Vlast (Hazám) című szimfonikus ciklust, és Prágai karnevál címmel új szimfonikus táncciklus szerzésébe kezdett.

Egészsége azonban annyira megrendült, hogy 1884. április 20-án a prágai Kateřinky elmegyógyintézetbe kellett szállítani. A zeneszerző életének utolsó, nehéz pillanatait örökíti meg Antonín Sova Z mého života (Életemből) című versében. A Nemzeti Színház építésekor mondta Bedřich Smetana emlékezetes gondolatát: „A zenében benne van a csehek élete.“

Művei

Operák
 A brandenburgiak Csehországban, (1862–1863, premier 1866)
 Az eladott menyasszony, (1864–1866, premier 1866)
 Dalibor, (1866–1867, premier 1868)
 Libuše, (1869–1872, premier 1881)
 Két özvegy, (1873–1874, premier 1874)
 A csók, (1875–1876, premier 1876)
 A titok, (1877–1878, premier 1878)
 Ördögszikla, (1880, premier 1882)
 Viola, töredék (1872–1884)

Dalok
 Esti dalok, 5 ének Vítězslav Hálek verseire
 Első dalok
 Dalok Baron Goertz tragédiájára

Kórusművek
 A cseh dal – kantáta vegyeskarra és zenekarra
 A szabadság dala – vegyeskarra és zongorára
 Cseh ének – férfikarra
 Meditabitur – vegyeskarra, orgonára és zenekarra
 Három vadász – férfikarra
 Odrodilec I., II., – férfikarra
 Paraszti – férfikarra
 A mi énekünk – férfikarra
 Ünneplő kórus – férfikarra
 Dal a tengerről – férfikarra
 Hozomány – férfikarra
 Imádság – férfikarra
 Jelszó I., II. – férfikarra
 Három női kar (Csillagom, Elszálltak a fecskék, Nyugszik a nap a hegyek mögött)

Szimfonikus költemények
 Hazám – Vyšehrad, mácu, Vltava (Moldva), Šárka, A cseh erdőkön és mezőkön, Tábor, Blaník
 Svéd dalok – III. Richárd, Valdsteini tábor, Haakon Jarl
 Prágai karnevál – befejezetlen, első két része: Bemutatás, Polonéz

Kamaradarabok
 Életemből – e-moll vonósnégyes
 d-moll vonósnégyes
 Otthonról – duó hegedűre és zongorára
 g-moll zongoratrió

Zongoraművek
 Szalondarabok – Szalonpolkák (Luisina, Bettyna, Jiřinková,…)
 Koncertdarabok – Koncert etüd: A tengerparton
 Poetikus polkák
 Cseh táncok ciklus (4 polka, 10 Hulán, Mácu, Obkročák, Cibulička, Sousedská, Medvěd, Dupák,…)
 Macbeth és a boszorkányok
 Hat prelúdium
 e-moll szonáta
 e-moll nyitány
 C-dúr rondó

Zenekari művek
 E-dúr Diadal-szimfónia – az osztrák nemzeti himnusz témájára (ma német himnusz, Joseph Haydn műve)
 Induló Shakespeare tiszteletére
 D-dúr előjáték
 C-dúr ünnepi előjáték – a Nemzeti Színház alapkőletételére
 Venkovanka, polka
 Libuša sorsa – zene egy élőképhez
 Halász – zene egy élőképhez
 Fanfárok Shakespeare III. Richárdjához
 Doktor Faust – előjáték bábjátékhoz
 Oldřich és Božena – előjáték bábjátékhoz
 B-dúr menüett
 Bajadérok – galopp

Képgaléria

Irodalom
 Miloslav Mäcu Malý: Bedřich Smetana. Prága, 1956. Orbis. [magyarul]
 Zdeněk Nejedlý: Bedřich Smetana = uő: Válogatott zenei tanulmányok. Ford. Jiřy [sic!] Szántó. Bp., 1963. Zeneműkiadó pp. 46–58
 Alexander Mácu Buchner: Opera v Praze. Praha, 1985. Panton. [ISBN nélkül]

Jegyzetek

Források

További információk
 Herbert von Karajan - Bedřich Smetana: Moldva
 125 éve halt meg Smetana (2009. május 10.)
 Az eladott menyasszony cselekménye

Kapcsolódó szócikkek
 Zenetörténet

Cseh zeneszerzők
Romantikus zeneszerzők
Operaszerzők
1824-ben született személyek
1884-ben elhunyt személyek
Cseh zenészek

{'title': 'Bedřich Smetana', 'url': 'https://hu.wikipedia.org/wiki/Bed%C5%99ich%20Smetana', 'language': 'hu', 'timestamp': '20230320'}


@interface OverlayWindow : NSPanel<NSWindowDelegate>

@end

{'content_hash': 'a191c3055b7fddd4842703dbf635c4b4', 'timestamp': '', 'source': 'github', 'line_count': 3, 'max_line_length': 52, 'avg_line_length': 19.666666666666668, 'alnum_prop': 0.8135593220338984, 'repo_name': 'nthloop/Objektiv', 'id': '9397a4aabfb2965e01a71d97e3c07b57fa43227e', 'size': '223', 'binary': False, 'copies': '1', 'ref': 'refs/heads/master', 'path': 'Objektiv/OverlayWindow.h', 'mode': '33188', 'license': 'mit', 'language': [{'name': 'Objective-C', 'bytes': '79464'}, {'name': 'Ruby', 'bytes': '92'}]}


package org.scalatestexamples

import org.scalatest.WordSpec
import org.scalatest.matchers.ShouldMatchers
import org.scalatestexamples.helpers.Stack

class StackShouldWordSpec extends WordSpec with StackFixtureCreationMethods with WordStackBehaviors with ShouldMatchers {

  def it = afterWord("it")

  "A Stack" when it {

    "is empty" should {

      "be empty" in {
        assert(emptyStack.empty)
      }

      "complain on peek" in {
        intercept[IllegalStateException] {
          emptyStack.peek
        }
      }

      "complain on pop" in {
        intercept[IllegalStateException] {
          emptyStack.pop
        }
      }
    }

    "has one item" should {

      behave like nonEmptyStack(lastValuePushed)(stackWithOneItem)
      behave like nonFullStack(stackWithOneItem)
    }

    "has one item less than capacity" should {

      behave like nonEmptyStack(lastValuePushed)(stackWithOneItemLessThanCapacity)
      behave like nonFullStack(stackWithOneItemLessThanCapacity)
    }

    "is full" should {

      "be full" in {
        assert(fullStack.full)
      }

      "go to sleep soon" in (pending)

      behave like nonEmptyStack(lastValuePushed)(fullStack)

      "complain on a push" in {
        intercept[IllegalStateException] {
          fullStack.push(10)
        }
      }
    }
  }
}

{'content_hash': '3451a37755ca2e7ea9a18ac32df29f11', 'timestamp': '', 'source': 'github', 'line_count': 62, 'max_line_length': 121, 'avg_line_length': 21.548387096774192, 'alnum_prop': 0.6467065868263473, 'repo_name': 'kevinwright/scalatest', 'id': 'b724e358562462078ec152a41733daef14b78a89', 'size': '1936', 'binary': False, 'copies': '6', 'ref': 'refs/heads/master', 'path': 'src/examples/scala/org/scalatestexamples/StackShouldWordSpec.scala', 'mode': '33188', 'license': 'apache-2.0', 'language': [{'name': 'Java', 'bytes': '14653'}, {'name': 'Scala', 'bytes': '4074315'}, {'name': 'Shell', 'bytes': '100'}]}


<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.sampa.tasksreminder.MainActivity" />

{'content_hash': '1d9912dcc0a2f864359e7c2f66d6d576', 'timestamp': '', 'source': 'github', 'line_count': 7, 'max_line_length': 93, 'avg_line_length': 45.0, 'alnum_prop': 0.7333333333333333, 'repo_name': 'spatenotte/TasksReminder', 'id': 'daa56800941c5e115f7ba1738e4ce530710168fc', 'size': '315', 'binary': False, 'copies': '1', 'ref': 'refs/heads/master', 'path': 'TasksReminder/res/layout/activity_main.xml', 'mode': '33188', 'license': 'mit', 'language': [{'name': 'Java', 'bytes': '138198'}]}


Folgende Kardinäle waren Kardinalpriester von Santa Maria in Ara Coeli (lat. Titulus Sanctae Mariae de Aracoeli):

 Cristoforo Numai OFMObs (1517–1527)
 Titel aufgehoben (1527–1544)
 Francisco Mendoza de Bobadilla (1545–1550)
 Giovanni Michele Saraceni Girifalco (1551–1557)
 Clemente d’Olera OFMObs (1557–1568)
 Alessandro Crivelli oder Cribelli (1570–1574)
 Alessandro Riario (1578–1585)
 Giovanni Battista Castrucci (1586–1592)
 Francesco Maria Bourbon del Monte (1592–1611)
 Agostino Galamini OP (1611–1639)
 Ascanio Filomarino (1642–1666)
 Carlo Roberti (1667–1673)
 Giacomo Fransoni (1673–1685)
 Giacomo de Angelis (1686–1695)
 Giovanni Francesco Negroni (1696–1713)
 Giovanni Battista Bussi (1713–1726)
 Lorenzo Cozza OFMObs (1727–1729)
 Alamanno Salviati (1730–1733)
 Marcello Passari (1733–1741)
 Carlo Leopoldo Calcagnini (1743–1746)
 Carlo Rezzonico (1747–1755), später Papst Clemens XIII.
 Luigi Mattei (1756–1758)
 Johann Theodor von Bayern (1759–1761)
 Baldassare Cenci (1762–1763)
 Niccolò Oddi (1766–1767)
 Vitaliano Borromeo (1768–1783)
 Innocenzo Conti (1783–1785)
 Alessandro Mattei (1786–1800)
 Francesco Maria Locatelli (1803–1811)
 vakant (1811–1816)
 Giovanni Battista Quarantotti (1816–1820)
 Fabrizio Turriozzi (1823–1826)
 Giacomo Filippo Fransoni (1828–1855)
 Francesco Gaude OP (1855–1857)
 Giuseppe Milesi Pironi Ferretti (1858–1870)
 vakant (1870–1874)
 Maximilian Joseph von Tarnóczy (1874–1876)
 Mieczyslaw Halka Ledóchowski (1876–1896)
 Francesco Satolli (1896–1903)
 Beniamino Cavicchioni (1903–1911)
 Diomede Falconio OFM (1911–1914)
 Basilio Pompili (1914–1917)
 Filippo Camassei (1919–1921)
 Juan Benlloch y Vivó (1921–1926)
 Jozef-Ernest Van Roey (1927–1961)
 Juan Landázuri Ricketts OFM (1962–1997)
 Salvatore De Giorgi (seit 1998)

Maria in Ara Coeli

{'title': 'Liste der Kardinalpriester von Santa Maria in Ara Coeli', 'url': 'https://de.wikipedia.org/wiki/Liste%20der%20Kardinalpriester%20von%20Santa%20Maria%20in%20Ara%20Coeli', 'language': 'de', 'timestamp': '20230320'}


Максим Едуардович Кавун ( , Дніпропетровськ) — український історик, культуролог, публіцист, краєзнавець. Член Національної спілки краєзнавців України з 1995 року. Автор і співавтор 9 книг і більше 300 статей.

Наукова біографія

Кандидат історичних наук, з 2012 р — завідувач відділом «Музею історії місцевого самоврядування Дніпропетровської області» Дніпропетровського національного історичного музею імені Д. І. Яворницького.

У 2003—2012 роках доцент кафедри російської історії історичного факультету Дніпропетровського національного університету імені Олеся Гончара. Викладав навчальний курс — «Історія Росії (IX—XVIII ст.)», спецкурси — «Модернізація Росії: реформи і революції», «Національна політика в Російській імперії і СРСР», «Російська історична урбаністика».

Громадська діяльність

Член правління Дніпропетровської обласної організації Національної спілки краєзнавців України з 2008 року.

Учасник ряду проектів по збереженню історичної пам'яті Дніпропетровська: Проект «Пам'ять: події та персоналії» — увічнення пам'яті видатних жителів Катеринослава-Дніпропетровська в меморіальних дошках (організатор — Інститут Україніки, реалізується з 2008 р).

Видавничий проект «Пам'ять міста» — підготовка і видання книг, присвячених історії виникнення і становлення Катеринослава-Дніпропетровська, а також пам'яток і історичних пам'ятників міста (видавництво «Герда», реалізується з 2009 р).

Глава Робочої групи Комісії Дніпропетровської міської ради з найменування і перейменування вулиць, провулків, площ, парків, скверів, мостів та інших об'єктів на території міста (з вересня 2007 р)

Стипендіат Міжнародного Благодійного фонду «Смолоскип» (1996—2004).

Стипендіат Кабінету Міністрів України: «Стипендія для молодих вчених» (2006—2008).

Подяки міського голови м. Дніпропетровська (2006, 2009, 2011).

Почесний учасник творчого клубу «Штрих» від молодіжної організації «Експеримент»

Монографії

Автор монографії

Сади і парки в історії Катеринослава-Дніпропетровська. Книга 1. Парк імені Т.Г. Шевченко / М. Е. Кавун. — Д.: Герда, 2009. — 144 с. ISBN 978-966-8856-22-8, ISBN 978-966-8856-20-4

Співавтор монографій

Діячі державної влади та самоврядування Дніпропетровської області: історичні нариси: у 2 т. / Відп. ред. С. І. Світленко. — Д.: АРТ-ПРЕС, 2009. — Т. 1. — 447 с. (Укр.)

Історія міста Дніпропетровська / за наук. ред. А. Г. Болебруха. — Дніпропетровськ: Грані, 2006. — 596 с. — Розділ ІІ. Заснування та становлення Катеринослава як губернського центру (остання чверти XVIII — перша половина XIX ст.). — С. 77-128. ISBN 966-8841-01-8 (укр.)

Дніпропетровськ. Архітектори / Н. П. Андрущенко, М. Е. Кавун, Н. А. Лопатюк та ін .; За заг. ред. М. М. Кондель-Пермінова; Глав. архітект.-планув. упр. Дніпропетровськ. міськ. тов. Дніпропетровськ. обл. орг. Нац. союзу архітект. України. — Київ; Дніпропетровськ: Видавничий дім «А + С», 2006. — 196 с., Іл. — Розділ I. Тривале століття Катеринослава (кінець XVIII — середина XIX століття). — С. 10-50. ISBN 966-8613-18-X

Дніпропетровськ: Віхі історії / редкол .: С. А. Квітка (гол. Ред.) Та ін. — Дніпропетровськ: Грані, 2001. — 256 с. — Гл. ІІІ. Губернське місто (1776—1880). — С. 49-83. ISBN 966-7647-87-0 (укр.)

Старт в третє тисячоліття: Нариси про Придніпров'я / В. Платонов, В. Мороз, М. Кавун, Л. Пашук, В. Клименко, Л. Маркова. — Дніпропетровськ: Проспект, 2002. — 304 с .: іл. — ISBN 966-8345-00-2

Історія Дніпропетровського національного університету імені Олеся Гончара / ред. кол .: М. В. Поляков (гол.) та ін. — 4-те вид., Переробл и доповнено. — Д.: Вид-во ДНУ, 2008. — 308 с. — Розділ 8. У пошуках оптимальної моделі розвитку в умовах пострадянських трансформацій (1991—1998). (Співавтори — В. В. Іваненко, А. Г. Болебрух, Є. І. Бородін). ISBN 978-966-551-259-2 (укр.)

«Секретний» Підрозділ Галузі: Нариси історії фізико-технічного інституту Дніпропетровського національного університету / Редкол .: М. В. Поляков (кер.) Та ін. — Дніпропетровськ: Вид-во ДНУ, 2001. — 376 с., Іл. — Розд. ІІІ. Факультет чи інститут? Пошуки та решение (середина 60-х — 70-і рр.). — С. 93-142. (Укр.)

Археографічні видання

Зуєв В. Ф. Мандрівн запис Васил'я Зуєва від С. Петербурга до Херсона в 1781 и 1782 році / В. Ф. Зуєв / підг. тексту, вступ. стаття, комент. М. Е. Кавуна; Ін-т укр. археографії та джерелознавства ім. М. С. Грушевського НАН України. — Дніпропетровськ: Герда, 2011. — XXVIII, 394 с., Іл., Карт. — (Серія «EDITIO PRINCEPS»). — ISBN 978-966-8856-43-3

Брошури

Літописець міста на трьох Пагорб Михайло Шатров (1908—1985). (До 100-річчя від дня народження): Бібліографічній показчик / Упорядк .: І. Голуб, М. Кавун. — Дніпропетровськ: Дніпропетр. обл. наук. біб-ка, 2008. — 32 с. (Співавтор, автор біограф. Статті та бібліографії). (Укр.)

Євген Вучетич — творець монументальних шедеврів (до 100-річчя від дня народження): Бібліографічній показчик / Укл. М. Кавун, С. Пономаренко, І. Голуб; Дніпропетр. обл. універс. наук. біб-ка. — Дніпропетровськ: ДОУНБ, 2008. — 12 с. (Співавтор, автор біограф. Статті). (Укр.)

Живописець Із Сурсько-Литовської (Федір Павлович Решетников): Бібліографічній посібник / Упор. Т. Зайцева, І. Голуб, М. Кавун. — Дніпропетровськ: Дніпропетр. обл. наук. біб-ка, 2006. — 8 с. (Співавтор, автор біограф. Статті). (Укр.)

Статті

Цикл «Геній місця» — історична і культурна топографія Катеринослава-Дніпропетровська. Історія районів міста від давнини до наших днів
Цикл «Топонімія Дніпропетровська. Життя і смерть міських назв» — історія назв вулиць, провулків, площ, парків, скверів та інших об'єктів Катеринослава-Дніпропетровська

Цикл «Дніпропетровськ: філософія успіху» — статті про видатних особистостей і про роль персонального фактора в розвитку міста і регіону в різні епохи.

Цикл «Ясновельможний князь Потьомкін» — історія видатної особистості XVIII століття і засновника Катеринослава

Цикл «Дніпропетровська хронологія» — суперечки про дати заснування Дніпропетровська і перипетії святкування міських ювілеїв

Цикл «Історія Соборній площі» — етапи розвитку містобудівного центру Катеринослава-Дніпропетровська. Архітектура. Історія. Символи. Таємниці.

Цикл «Загадки Преображенського собору»

Загадки Преображенського собору. Частина I

Загадки Преображенського собору. Частина II

Загадки Преображенського собору. Частина III

Загадки Преображенського собору. Частина IV

Цикл «13 таємниць палацу Потьомкіна» — міфи і реалії в історії катеринославської резиденції світлого князя

Інші вибрані статті

 Архетипи Дніпровського мегаполісу
 Три життя «Золотої Рози»
 Революція. Як це було сто років тому. Частина 1
 Революція. Як це було сто років тому. Частина 2
 Свідок подорожі імператриці — «Катерининська миля»
 Готельний бізнес в Катеринославі. Частина I
 Готельний бізнес в Катеринославі. Частина II
 Йордань на Дніпрі. Як зустрічали Хрещення в старому Катеринославі
 Універсали: охоронні грамоти незалежності, або …?

Вибрані інтерв'ю

 Скільки років Дніпропетровську?
 Де знайти провулок ялицевих (Питання перейменування вулиць Дніпропетровська)
 Потьомкін задумав Катеринослав як «ідеальне місто» масонів?
 Чи є тунелі під Потьомкінським палацом?
 Григорій Петровський перетворився в … Петра Першого!
 «Вечірка» знайшла могилу Поля?
 Ім'я Сталіна залишилося тільки в сталінках
 Творча Зустріч молоді з краєзнавцем М. Є. Кавуном (укр.)
 У Дніпропетровську є підземне царство і «похований» Сталін
 Дніпропетровськ. Парку ім. Т. Г. Шевченко присвятили книгу
 У Рік Тигра з'явився Дніпропетровськ, а також ЦУМ, Оперний театр і парочка музеїв (які доленосні події приносив смугастий хижак рідному місту в минулому)

Примітки

Українські історики
Українські культурологи
Випускники Дніпровського університету
Кандидати історичних наук України


Петро́ Пили́пович Петруше́нко (*21 січня 1915, с. Топильна — † 26 липня 1994, м. Київ) — український архітектор.

Життєпис
Після закінчення Харківського інженерно-будівельного інституту у 1941 році практично впродовж всієї своєї трудової біографії працював в галузі архітектури.

Основні архітектурні творіння:
 Корпуси науково-дослідних інститутів, зокрема; фізичної хімії (1953), гідрології і гідротехніки (1955), напівпровідників (1958) Національної Академії Наук України;
 висотний житловий будинок по Хрещатику, 25 (1954);
 комплекс гуртожитків торговельно-економічного інституту (1960–1970);
 житловий масив Лісовий (1965–1973);
 кінотеатр «Кіото» (м. Київ).

Посилання
 Село Топильна в іменах

Джерела
 Киевский календарь

Українські архітектори
Архітектори Києва
Випускники Харківського національного університету будівництва й архітектури
Уродженці Шполянського району
Померли в Києві


namespace TelerikAcademyLearningSystem.Tests.AdminPanel.StudentsStatisticsByAge
{
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using TALearningSystemTestingFramework.Core.AttributeConstants;
    using TALearningSystemTestingFramework.Core.Base;
    using TelerikAcademyLearningSystem.Core.Facades;

    [TestClass]
    public class TestRadioButtons : BaseTest
    {
        private const string CourseName = "Giant Test Course";
        private const string LiveAndOnline = "Присъствено и Онлайн";
        private const string Live = "Присъствено";
        private const string Online = "Онлайн";

        public override void TestInit()
        {
            base.TestInit();
            StudentsStatisticsByAgeFacade facade = new StudentsStatisticsByAgeFacade();
        }

        [TestMethod,
         Priority(Priority.Medium),
         Owner(Owner.Blagoy),
         TestCategory(Category.StudentsStatisticsByAge)]
        public void VerifyRadioButtonLiveAndOnline()
        {
            StudentsStatisticsByAgeFacade facade = new StudentsStatisticsByAgeFacade();
            ////this.facade.StudentsStatisticsForFixedCourseInSomeForm(CourseName, LiveAndOnline);
            ////
            ////this.facade.VerifyRadioButtonLiveAndOnline(CourseName, LiveAndOnline);
            facade.StudentsStatisticsForFixedCourseInSomeForm(CourseName, LiveAndOnline);

            facade.VerifyRadioButtonLiveAndOnline(CourseName, LiveAndOnline);
        }

        [TestMethod,
         Priority(Priority.Medium),
         Owner(Owner.Blagoy),
         TestCategory(Category.StudentsStatisticsByAge)]
        public void VerifyRadioButtonLive()
        {
            StudentsStatisticsByAgeFacade facade = new StudentsStatisticsByAgeFacade();
            ////this.facade.StudentsStatisticsForFixedCourseInSomeForm(CourseName, Live);
            ////
            ////this.facade.VerifyRadioButtonLive(CourseName, Live);
            facade.StudentsStatisticsForFixedCourseInSomeForm(CourseName, Live);

            facade.VerifyRadioButtonLive(CourseName, Live);
        }

        [TestMethod,
         Priority(Priority.Medium),
         Owner(Owner.Blagoy),
         TestCategory(Category.StudentsStatisticsByAge)]
        public void VerifyRadioButtonOnline()
        {
            StudentsStatisticsByAgeFacade facade = new StudentsStatisticsByAgeFacade();
            ////this.facade.StudentsStatisticsForFixedCourseInSomeForm(CourseName, Online);
            ////
            ////this.facade.VerifyRadioButtonOnline(CourseName, Online);
            facade.StudentsStatisticsForFixedCourseInSomeForm(CourseName, Online);

            facade.VerifyRadioButtonOnline(CourseName, Online);
        }
    }
}

{'content_hash': '9067576287cf4cb78217453ef04a07c3', 'timestamp': '', 'source': 'github', 'line_count': 67, 'max_line_length': 98, 'avg_line_length': 40.59701492537314, 'alnum_prop': 0.6834558823529412, 'repo_name': 'plamenti/Telerik2015', 'id': '30d662f759bdb9adb0fdb9235d6ba729d86bf5f8', 'size': '2757', 'binary': False, 'copies': '1', 'ref': 'refs/heads/master', 'path': 'Automation/TALearningSystemTestingFramework/TelerikAcademyLearningSystem.Tests/AdminPanel/StudentsStatisticsByAge/TestRadioButtons.cs', 'mode': '33188', 'license': 'mit', 'language': [{'name': 'Batchfile', 'bytes': '2467'}, {'name': 'C#', 'bytes': '535857'}, {'name': 'HTML', 'bytes': '39617'}, {'name': 'Python', 'bytes': '48230'}, {'name': 'Smalltalk', 'bytes': '247052'}]}


Třída Pelorus byla třída chráněných křižníků třetí třídy britského královského námořnictva. Celkem bylo postaveno 11 jednotek této třídy. Ve službě byly od roku 1898–1921. Účastnily se první světové války, přičemž HMS Pegasus byl roku 1914 potopen. Křižníky Pioneer a Psyche později získala Austrálie.

Stavba
Křižníky představovaly zmenšenou verzi třídy Pearl se slabší výzbrojí. Celkem bylo v letech 1895–1901 postaveno 11 jednotek této třídy.

Jednotky třídy Pelorus:

Konstrukce

Křižníky nesly osm 102mm kanónů, které doplňovalo osm 47mm kanónů, tři 7,7mm kulomety a dva 450mm torpédomety. Pohonný systém tvořilo 16 kotlů a dva tříválcové parní stroje s trojnásobnou expanzí o výkonu 5000 ihp, pohánějící dva lodní šrouby. Podle použitých kotlů (Pactolus a Pomone kotle Blechynden, Pelorus kotle Normand, Pegasus a Pyramus kotle Reed, ostatní měy kotle Thornycroft) se křižníky dají rozdělit do několika skupin. Nejvyšší rychlost dosahovala 18,5 uzlu. Se svými kotli měly tyto křižníky obecně potíže a po několikaleté službě jejich rychlost poklesla na 16–17 uzlů. Křižníky Pomone a Pactolus byly kvůli problematickým kotlům předčasně převedeny do pomocných rolí. Dosah byl 5500 námořních mil při rychlosti 10 uzlů.

Odkazy

Reference

Související články
 Seznam britských křižníků

Externí odkazy

Pelorus

{'title': 'Třída Pelorus', 'url': 'https://cs.wikipedia.org/wiki/T%C5%99%C3%ADda%20Pelorus', 'language': 'cs', 'timestamp': '20230320'}