function getFactura($enviar = false, $out = OUT_PDF)
 {
     $ready = null;
     $xml = "";
     $unidad = "NO APLICA";
     $cantidad = 1;
     $mql = new MQL();
     $xLis = new cSQLListas();
     $xLoc = new cLocal();
     $xPais = new cDomiciliosPaises(EACP_CLAVE_DE_PAIS);
     $xLog = new cCoreLog();
     $sql = "SELECT * FROM `operaciones_archivo_de_facturas` WHERE `clave_de_recibo` = " . $this->mCodigoDeRecibo . " LIMIT 0,1";
     $xArch = new cOperaciones_archivo_de_facturas();
     $DFact = $mql->getDataRow($sql);
     if (isset($DFact["clave_de_recibo"])) {
         $xArch->setData($DFact);
         $this->mMessages .= "OK\tEl UUID existe  " . $xArch->uuid()->v(OUT_TXT) . "\r\n";
         if ($enviar == true) {
             if ($this->getOPersona() == null) {
             } else {
                 $xSoc = $this->getOPersona();
                 $email = $xSoc->getCorreoElectronico();
                 $comprobante = PATH_FACTURAS . $xArch->uuid()->v(OUT_TXT);
                 file_put_contents($comprobante . ".xml", base64_decode($xArch->contenido()->v(OUT_TXT)));
                 file_put_contents($comprobante . ".pdf", base64_decode($xArch->impreso()->v(OUT_TXT)));
                 $ready = $out == OUT_PDF ? base64_decode($xArch->impreso()->v(OUT_TXT)) : base64_decode($xArch->contenido()->v(OUT_TXT));
                 $xNotif = new cNotificaciones();
                 //PDF y XML
                 $arrFil = array();
                 $arrFil["archivo1"]["path"] = $comprobante . ".pdf";
                 $arrFil["archivo2"]["path"] = $comprobante . ".xml";
                 $xNotif->sendMail("Factura del Recibo " . $this->mCodigoDeRecibo, "Factura del Recibo " . $this->mCodigoDeRecibo, $email, $arrFil);
                 //Enviar al Archivo mail
                 $xNotif->sendMail("Factura del Recibo " . $this->mCodigoDeRecibo, "Factura del Recibo " . $this->mCodigoDeRecibo, FACTURACION_MAIL_ARCHIVO, $arrFil);
                 $this->mMessages .= $xNotif->getMessages();
             }
         } else {
             $ready = $out == OUT_PDF ? $xArch->impreso()->v(OUT_TXT) : $xArch->contenido()->v(OUT_TXT);
         }
     } else {
         $xLog->add("WARN\tGenerando Nueva Factura\r\n", $xLog->DEVELOPER);
         //cargar Archivo
         $xPais->init();
         if ($this->mReciboIniciado == false) {
             $this->init();
         }
         if ($this->getOPersona() == null) {
             $xLog->add("ERROR\tAl cargar la Persona\r\n");
         } else {
             $xFact = new cFacturaElectronica();
             //datos de la emisora
             //persona iniciada
             $xSoc = $this->getOPersona();
             $email = $xSoc->getCorreoElectronico();
             $xFact->setEmisor(EACP_NAME, EACP_RFC, EACP_DOMICILIO_CALLE, EACP_DOMICILIO_NUM_EXT, EACP_DOMICILIO_NUM_INT, EACP_CODIGO_POSTAL, EACP_COLONIA, EACP_MUNICIPIO, EACP_ESTADO, $xPais->getNombre());
             $xFact->setRegimenFiscal(EACP_REGIMEN_FISCAL);
             $calle = $xLoc->DomicilioCalle();
             $numeroInt = $xLoc->DomicilioNumeroInterior();
             $numeroExt = $xLoc->DomicilioNumeroExterior();
             $codigoPostal = $xLoc->DomicilioCodigoPostal();
             $colonia = $xLoc->DomicilioColonia();
             $xSocDom = $xSoc->getODomicilio();
             $pais = $xLoc->getNombreDePais();
             $estado = $xLoc->DomicilioEstado();
             $municipio = $xLoc->DomicilioMunicipio();
             $tasa_iva = TASA_IVA;
             $xFact->setLugarDeExpedicion($xLoc->DomicilioCalle(), $xLoc->DomicilioNumeroExterior(), $xLoc->DomicilioNumeroInterior(), $xLoc->DomicilioCodigoPostal(), $xLoc->DomicilioColonia(), $xLoc->DomicilioMunicipio(), $xLoc->DomicilioEstado(), $xLoc->getNombreDePais());
             if ($xSocDom == null) {
                 $xLog->add("WARN\tNo hay domicilio Valido\r\n", $xLog->DEVELOPER);
             } else {
                 $calle = $xSocDom->getCalle();
                 $numeroExt = $xSocDom->getNumeroExterior();
                 $numeroInt = $xSocDom->getNumeroInterior();
                 $codigoPostal = $xSocDom->getCodigoPostal();
                 $colonia = $xSocDom->getColonia();
                 $municipio = $xSocDom->getMunicipio();
                 $estado = $xSocDom->getEstado();
                 $pais = $xSocDom->getNombreDePais();
             }
             //Cargar datos del Docto
             //$this->getOrigen();
             $OTipoRec = $this->getOTipoRecibo();
             if ($OTipoRec->getOrigen() == RECIBOS_ORIGEN_MIXTO or $OTipoRec->getOrigen() == RECIBOS_ORIGEN_COLOCACION) {
                 $xCred = new cCredito($this->getCodigoDeDocumento());
                 $xCred->init();
                 $tasa_iva = $xCred->getTasaIVA();
                 $xLog->add("WARN\tLa tasa de IVA es {$tasa_iva}\r\n", $xLog->DEVELOPER);
             }
             $xFact->setReceptor($xSoc->getNombreCompleto(), $xSoc->getRFC(true, true), $calle, $numeroExt, $numeroInt, $codigoPostal, $colonia, $municipio, $estado, $pais);
             //Datos del pagos
             $formaDePago = "Pago en una sola exhibición";
             $cuentaDePago = "No Identificado";
             $arrEquiv = array(TESORERIA_COBRO_DOCTO => "Documentos", TESORERIA_COBRO_EFECTIVO => "Efectivo", TESORERIA_COBRO_INTERNO => "Documentos", TESORERIA_COBRO_MULTIPLE => "Documentos", TESORERIA_COBRO_NINGUNO => "Documentos", TESORERIA_COBRO_TRANSFERENCIA => "Transferencia", TESORERIA_COBRO_CHEQUE => "Cheque");
             $metodoDePago = $arrEquiv[$this->getTipoDePago()];
             //cargar equivalencias
             //TODO: Considerar cambios en otro de tipo de tributacion
             if ($this->getTipoDePago() == TESORERIA_COBRO_TRANSFERENCIA or $this->getTipoDePago() == TESORERIA_COBRO_CHEQUE) {
                 $OCaja = $this->getOCaja();
                 $cuentaDePago = $OCaja->getCuentaBancoActivo();
             }
             //Cheque, Transferencia, Depósito
             $xFact->setDatosDePago($formaDePago, $metodoDePago, $cuentaDePago);
             $sql = "SELECT\n\t\t\t\t\t`eacp_config_bases_de_integracion_miembros`.`codigo_de_base`,\n\t\t\t\t\t`operaciones_mvtos`.`recibo_afectado`,\n\t\t\t\t\t`eacp_config_bases_de_integracion_miembros`.`miembro`,\n\t\t\t\t\t`eacp_config_bases_de_integracion_miembros`.`subclasificacion`,\n\t\t\t\t\t`operaciones_tipos`.`descripcion_operacion` AS `operacion`,\n\t\t\t\t\t`operaciones_mvtos`.`fecha_operacion`,\n\t\t\t\t\t`operaciones_mvtos`.`afectacion_real` AS 'monto'  \n\t\t\t\tFROM\n\t\t\t\t\t`operaciones_mvtos` `operaciones_mvtos` \n\t\t\t\t\t\tINNER JOIN `eacp_config_bases_de_integracion_miembros` \n\t\t\t\t\t\t`eacp_config_bases_de_integracion_miembros` \n\t\t\t\t\t\tON `operaciones_mvtos`.`tipo_operacion` = \n\t\t\t\t\t\t`eacp_config_bases_de_integracion_miembros`.`miembro` \n\t\t\t\t\t\t\tINNER JOIN `operaciones_tipos` `operaciones_tipos` \n\t\t\t\t\t\t\tON `operaciones_mvtos`.`tipo_operacion` = `operaciones_tipos`.\n\t\t\t\t\t\t\t`idoperaciones_tipos` \n\t\t\t\tWHERE\n\t\t\t\t\t(`eacp_config_bases_de_integracion_miembros`.`codigo_de_base` =11000) AND\n\t\t\t\t\t(`operaciones_mvtos`.`recibo_afectado` =" . $this->mCodigoDeRecibo . " )";
             $iva = 0;
             $total = 0;
             $rs = $mql->getDataRecord($sql);
             foreach ($rs as $rows) {
                 $descripcion = $rows["operacion"];
                 $valor = $rows["monto"];
                 $tipo = $rows["subclasificacion"];
                 $total += $valor;
                 if ($tipo == 1000) {
                     $iva += $rows["monto"];
                 } else {
                     $xFact->addConcepto($cantidad, $unidad, $valor, $descripcion);
                 }
             }
             //agregar IVA
             if ($iva > 0) {
                 $xFact->addTrasladado("IVA", $tasa_iva, $iva);
             }
             $xml = $xFact->get();
             $this->mOFactura = $xFact;
             if ($total <= 0) {
                 $enviar = false;
             }
         }
         if ($enviar == true) {
             if ($this->mOFactura != null) {
                 if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
                     if ($this->mOFactura->timbrar() == 1) {
                         //ready = true
                         $xNotif = new cNotificaciones();
                         //PDF y XML
                         $arrFil = array();
                         $arrFil["archivo1"]["path"] = $this->mOFactura->getComprobante() . ".pdf";
                         $arrFil["archivo2"]["path"] = $this->mOFactura->getComprobante() . ".xml";
                         $xNotif->sendMail("Factura del Recibo " . $this->mCodigoDeRecibo, "Factura del Recibo " . $this->mCodigoDeRecibo, $email, $arrFil);
                         //Enviar al Archivo mail
                         $xNotif->sendMail("Factura del Recibo " . $this->mCodigoDeRecibo, "Factura del Recibo " . $this->mCodigoDeRecibo, FACTURACION_MAIL_ARCHIVO, $arrFil);
                         //Guardar en DB
                         $this->mOFactura->setArchivar($this->mCodigoDeRecibo);
                         $xLog->add($xNotif->getMessages(), $xLog->DEVELOPER);
                         $ready = $out == OUT_PDF ? $this->mOFactura->getPDF() : $this->mOFactura->getXML();
                     }
                 } else {
                     $xLog->add("WARN\tNo hay email valido para la Factura ({$email})\r\n", $xLog->DEVELOPER);
                 }
                 $xLog->add($this->mOFactura->getMessages(), $xLog->DEVELOPER);
             }
         }
     }
     $this->mMessages .= $xLog->getMessages();
     return $ready;
 }
 function analizarOperacion($persona, $monto_operado, $moneda, $tipo_de_pago, $fecha = false, $recibo = false, $perfil = false)
 {
     $moneda = strtoupper($moneda);
     $sql = "SELECT * FROM `aml_risk_catalog` \n\t\t\t\t\tWHERE (`aml_risk_catalog`.`tipo_de_riesgo` = 912)\n\t\t\t\t\tAND (`aml_risk_catalog`.`clave_de_control` != " . AML_CLAVE_RIESGO_OPS_INDIVIDUALES . ")\n\t\t\t\t\tORDER BY \n\t\t\t\t\t`aml_risk_catalog`.`unidad_de_medida`,\t`aml_risk_catalog`.`unidades_ponderadas` DESC ";
     $ql = new MQL();
     $risk = new cAml_risk_catalog();
     $raised = false;
     $xAML = new cAML();
     $rs = $ql->getDataRecord($sql);
     //Datos de Operaciones Mensuales
     $xAMLP = new cAMLPersonas($persona);
     $xAMLP->init();
     $OMens = $xAMLP->getOAcumuladoDeOperaciones($fecha, $fecha, $moneda, $tipo_de_pago);
     $monto_original = $OMens->getMonto() + $monto_operado;
     $this->mMessages .= "WARN\tOperaciones acumuladas por " . $OMens->getMonto() . "\r\n";
     if ($perfil == false) {
         $this->mMessages .= "ERROR\tNo existe el perfil tipo de pago {$tipo_de_pago} en Moneda {$moneda} \r\n";
         //agregar perfil a cero
     } else {
         $perfil = setNoMenorQueCero($perfil);
         $sql = "SELECT * FROM `personas_perfil_transaccional_tipos` WHERE `idpersonas_perfil_transaccional_tipos` = {$perfil} LIMIT 0,1";
         $d = $ql->getDataRow($sql);
         if (isset($d["tipo_de_exhibicion"])) {
             $tipo_de_pago = strtolower($d["tipo_de_exhibicion"]);
         }
         $this->mMessages .= "OK\tCarga del perfil {$perfil}  con tipo de pago {$tipo_de_pago}\r\n";
     }
     //verificar operaciones con reglas
     foreach ($rs as $rows) {
         $risk->setData($rows);
         $reporteMoneda = strtoupper($risk->unidad_de_medida()->v());
         if ($reporteMoneda == $moneda) {
             if ($raised == false) {
                 $reporteMoneda = strtoupper($risk->unidad_de_medida()->v());
                 $xMon = new cMonedas($reporteMoneda);
                 $valor_local = $xMon->getValor();
                 $clave = $risk->clave_de_control()->v();
                 if ($xAML->isTransaccionVigilada($tipo_de_pago) != false) {
                     $unidadesReportadas = $risk->unidades_ponderadas()->v();
                     $unidadesOperadas = 0;
                     if ($reporteMoneda == AML_CLAVE_MONEDA_LOCAL) {
                         $unidadesOperadas = $monto_original;
                     } else {
                         $this->mMessages .= "WARN\tUnidades reportadas {$unidadesOperadas} en Moneda {$moneda} con valor local de {$valor_local}\r\n";
                         $unidadesReportadas = $valor_local * $unidadesReportadas / VALOR_ACTUAL_DOLAR;
                         $unidadesOperadas = $monto_original * $valor_local / VALOR_ACTUAL_DOLAR;
                     }
                     if ($unidadesOperadas >= $unidadesReportadas) {
                         $this->mMsgAlert = "ERROR\tUnidades excedidas de {$unidadesReportadas} operados {$unidadesOperadas} en la Moneda {$reporteMoneda}\r\n";
                         $this->mMessages .= $this->mMsgAlert;
                         $raised = true;
                         $this->mTipoDeAlerta = $clave;
                         $this->mTipoDeReporte = $risk->forma_de_reportar()->v();
                     } else {
                         $this->mMessages .= "OK\tOperacion Normal de {$unidadesOperadas} no sobrepasan {$unidadesReportadas}\r\n";
                     }
                     //Validar sivienen de paises con alto riesgo
                     $xP = new cDomiciliosPaises();
                     $xP->getPaisPorMoneda($reporteMoneda);
                     $nombrepais = $xP->getNombre();
                     if ($xP->getRiesgoAMLAsociado() >= SYS_RIESGO_MEDIO) {
                         //Agregar alerta por operaciones en paises de  alto y medio riesgo
                         $this->mMsgAlert .= "ERROR\tFondos provenientes de paises con Riesgo Elevado {$nombrepais}\r\n";
                         $this->mMessages .= "ERROR\tFondos provenientes de paises con Riesgo Elevado {$nombrepais}\r\n";
                     }
                 } else {
                     $this->mMessages .= "OK\tOperacion Omitida por ser tipo de pago {$tipo_de_pago} ({$reporteMoneda} )\r\n";
                 }
             }
         } else {
             $this->mMessages .= "OK\tOperacion Omitida por ser Moneda {$moneda} de {$reporteMoneda}\r\n";
         }
     }
     //setLog($this->mMessages);
     if (MODO_DEBUG == true) {
         setLog($this->getMessages());
     }
     return $raised;
 }
 function getEsRiesgosa()
 {
     $sql = "SELECT * FROM `aml_riesgo_perfiles` WHERE `objeto_de_origen`='personas_actividad_economica_tipos' AND `valor_de_origen`='" . $this->getClaveDeActividad() . "' LIMIT 0,1";
     $xQL = new MQL();
     $res = false;
     $media = 0;
     if (MODULO_AML_ACTIVADO == true) {
         $data = $xQL->getDataRow($sql);
         if (isset($data["nivel_de_riesgo"])) {
             $res = true;
             $this->mAMLNivelRiesgo = $data["nivel_de_riesgo"];
             $this->mMessages .= "WARN\tLa Actividad " . $this->getClaveDeActividad() . " ES " . $this->mAMLNivelRiesgo . " % RIESGOSA\r\n";
             $media++;
         } else {
             $this->mMessages .= "OK\tLa Actividad " . $this->getClaveDeActividad() . " No se encontro en el catalogo\r\n";
         }
         //riesgo geografico
         $pais = $this->getClaveDePais();
         if ($pais != EACP_CLAVE_DE_PAIS) {
             $xPais = new cDomiciliosPaises($pais);
             $xPais->init();
             $nivel = $xPais->getRiesgoAMLAsociado();
             $media++;
             $this->mAMLNivelRiesgo += $this->mAMLNivelRiesgo;
             $this->mMessages .= "WARN\tEl Pais " . $pais . " en tabla es {$nivel}, queda en " . $this->mAMLNivelRiesgo . " % RIESGOSA\r\n";
         }
         //riesgo por tipo
         $otipo = $this->getOTipo();
         if ($otipo != null) {
             $nivel = $otipo->getNivelRiesgoAML();
             $media++;
             $this->mAMLNivelRiesgo += $nivel;
             $this->mMessages .= "WARN\tEl tipo de Actividad " . $this->getClaveDeActividad() . " en tabla es {$nivel}, queda en " . $this->mAMLNivelRiesgo . " % RIESGOSA\r\n";
             if ($otipo->getGeneraPEP() == true) {
                 $media = 1;
                 $this->mAMLNivelRiesgo = SYS_RIESGO_ALTO;
                 $this->mMessages .= "WARN\tEl tipo de Actividad " . $this->getClaveDeActividad() . " es PEP, se lleva a ALTO, queda en " . $this->mAMLNivelRiesgo . " % RIESGOSA\r\n";
                 $this->mAMLGeneraPEP = true;
             }
         }
         $this->mAMLNivelRiesgo = $this->mAMLNivelRiesgo / $media;
     }
     return $res;
 }