unit ServerMethodsUnit1;

interface

uses System.SysUtils, System.Classes, Datasnap.DSServer, Datasnap.DSAuth, System.StrUtils, uDataModule, DBXPlatform,
     hasp_unit, Estados, NuevoCliente, Cliente, TimbrarCD, NuevaDireccion, FacturasCli, DirCliente, FacturaEv40, DirsClientes;

type
{$METHODINFO ON}
  Metodo = class(TComponent)
  private
    { Private declarations }
    handle  : hasp_handle_t;    // Para el candado
    status  : hasp_status_t;    // Para el candado
  public
    { Public declarations }
    dm40: TFacturaEFormV40;

    dm: TfrmDataModule;
    CatEstados : IXMLEstadosType;
    NuevoCli : IXMLNuevoClienteType;
    Cliente : IXMLClienteType;
    NuevaDir : IXMLNuevaDireccionType;
    FacturasCliente : IXMLFacturasType;
    DirCliente : IXMLDireccionType;
    DireccionesClientes : IXMLDirsClientesType;

    var gNumSuc,gVersion : Integer;


    procedure updateGET_CONFIG( StrConexion:String; out NuevoCliente, NuevoConsig, SolicitarFactura, ValidaClave, EmailAlterno, AgregarImpuesto, SujetoIEPS, ListaLugares, NoValidarImporte, SistemaOrigen :String; out Error:String);
    function updateVERIFICA_USUARIO(StrConexion:String; RFC,PASSWORD:String; out Error:String):String;
    function updateRECUPERA_PASSWORD(StrConexion:String; RFC:String; Out Error:String):String;
    function updateGET_ESTADOS(StrConexion:String; Out Error:String):String;
    function updateREGISTRA_CLIENTE(StrConexion:String; NuevoCliente:WideString; out Error:String):String;
    function updateGET_CLIENTE(StrConexion:String; ClienteId:Integer; out Error:String):String;
    function updateVERIFICA_TICKET(StrConexion:String; Folio:String; out Error:String; TotalPagar : Double ):String;
    function updateGENERA_FACTURA(StrConexion:String; NumTicket:String;ConsigId:Integer; lComentario, EmailAlterno:String; LugarExp, FormaCobroId:Integer; VUsoCFDI:String; out  Error:String):String;
    function updateREGISTRA_DIRECCION(StrConexion:String; NuevaDireccion:WideString; out Error:String):String;
    function updateGET_FACTURAS_CLI(StrConexion:String; ClienteId:Integer; out Error:String ):String;
    function updateGET_DIRECCION(StrConexion:String; DirCliId:Integer; Var Error:String):String;
    function updateGET_PDF_XML(StrConexion:String; DoctoPvId:Integer; TipoArchivo:String; var Error:String):String;
    function updateFACTURA_POR_MAIL(StrConexion:String; DOCTO_PV_ID:Integer; EmailAlterno:String; Var Error:String ):String;
    function updateGET_PDF_XML_CREDITO(StrConexion:String; DoctoPvId:Integer; TipoArchivo:String; var Error:String):String;
    function updateGET_NOTASCRED_CLI(StrConexion:String; ClienteId:Integer; out Error:String ):String;
    function updateNOTASC_POR_MAIL(StrConexion:String; DOCTO_PV_ID:Integer; EmailAlterno:String; Var Error:String ):String;
    function updateGET_LUGARES_EXP(StrConexion:String; out Error:String):String;
    function updateGET_USOS_CFDI(StrConexion:String; out Error:String):String;
    function updateGET_REGIMEN_FISCAL(StrConexion, TipoPersona:String; out Error:String):String;
    function updateGET_TIPO_PERSONA(StrConexion:String; out Error:String):String;
    function updateGET_PAGOS_FAC_CLI(StrConexion, FolioVenta:String; ClienteId:Integer; out Error:String ):String;
    function updateGET_PDF_XML_PAGOS(StrConexion:String; DoctoCCID:Integer; TipoArchivo:String; var Error:String):String;
    function updatePAGO_POR_MAIL(StrConexion:String; DoctoCCID:Integer; EmailAlterno:String; Var Error:String ):String;
    function updateGET_FAC_SIN_AUT(StrConexion:String; ComentarioCliente, NuevoCliente:WideString; Folio, VUsoCFDI, VTipoReg, vRegFis: String; TotalPagar:Double; LugarExp, RFC_ID, FormaCobroId:Integer; out Error:String):String;
    function updateGET_DIRECCION_SIN_AUT(StrConexion:String; RFC_ID:Integer; Folio:String; Var Error:String):String;
    function updateGET_DIRECCIONES_SIN_AUT(StrConexion:String; RFC, Folio:String; Var Error:String):String;

    function updateVERIFICA_DOCTO(StrConexion:String; NumTicket:String; out  Error:String):String;
    function updateGET_FORMAS_COBRO(StrConexion:String; out Error:String):String;
    function updateGetVersionDLL_Pag():String;

    function updateGetVersionDLL():String;


    function ValidaLicencia(StrConexion:String):String;

    function LeerCandado(var VersionCan,NumSuc:Integer):String;
    function Versiones(Var Error:String) : Integer;
    procedure ReadLicense(Var Error:String);
    function Conecta_Hasp(feature:integer; Var Error:String):integer;
    function ByteToString( var Value: array of byte ): String;
    function Errores_Hasp(estatus:hasp_status_t; Var Error : String):Integer;

  end;
 const
 DEMO_MEMBUFFER_SIZE   = 128;
 gVersionApp = 21;  //18
 vendor_code : AnsiString =
                'XUD2y9qZN7MrT8pWw9zUtf5XvGDC2o8UosgXQPyP3sKV0k4cAmb+Ktsg7DPH7lBhO8kwaB1gTKD7McrE'+
                '++V9I5C9WRRZZIJVglSLmWjk0hLf6vSwGACdK3+7TBXPYfHkoS1jP1SzKwrhdrKjtfClbE6ii0ylY8qP'+
                'ZwHGL9BDToOCu4zH65FG+kcmQvD0voMZ9QY09BJoK82r8XQ4Rkne7XO0qGNNSJhqLQlOgUUFKztmXL5A'+
                '2dTaE+mPx6het0LrQJfW3fhGYnO4ZfwE9mqO10hIkcTQLKrVcN+xe4qqOp2AdcgK4vntf/i5wjFDvwC6'+
                'a4SPteYUfIP8qnt5tInFxNSj4S65onTl4NHK/BIjtLAPsN3T0xzPKpAPK2MWSvxFYYd1bdLZ0qshRifF'+
                'eSOGJkLLu7uYYmpC/t+oA8jBgFx6xRuyUPumJcuednkfYn1JNnjbuG32wQ39j/ANdRxeHNR3BjVdEHix'+
                'lMSzZLuMfQpnCsxkQ54kDHOpO3gtVYmSvIXoXdKlPEy4GVQR8J5pOcm0CR7bJG4TtzYxJCdnww2njYgG'+
                'vdcj6SwVaY1Lwrq5TqwQOL2hBlN5LdhZNS9GMGEjoCSpFslRNfRnLbzo0De7wPTB3RLVmj6vcpL7KU/M'+
                'eU8/2xBoO9KhEwtfv+BIrSKj0dcmH1TJqQ25kLDW2xbHVSFVCiu5PDeJoLPQpomm246gkgsWBXZtnc6N'+
                '0RLiLnAAcjuv2DQzFTgZ2Qn0FSflQ9CskgxP/yrSAqplk640ZLJfQTwAhSmerdb2xTF0qMZEiqMQ3xP1'+
                'HmQ1/NGU5VXLc8Th59Mp/KjS9P4bm/uyliJddKJUIC+wI3LpCIbuwhwdR1LUNLqI7nagfun9R2T2yNmR'+
                '/qvaot0YRINED/mTbybS/KpfhkkQhSv8EJ5oRnkETJULBYi2imqWCnlAHtg=';

 //Constante licencia
 TIPO_LICENCIA = 'LIC';
 CLAVE_PRODUCTO = '04';
 NOMBRE_PRODUCTO = 'Facturador en línea';

 var
 membuffer : array [0..DEMO_MEMBUFFER_SIZE] of byte;  // para el uso de lectura del candado
{$METHODINFO OFF}

implementation

Uses FormUnit1;

function Metodo.updateGetVersionDLL():String;
var ResultadoXML: TDSInvocationMetadata;
begin
 ResultadoXML:= GetInvocationMetadata;
 ResultadoXML.ResponseContent := '2.01.02';//liz incrementa .02
end;

function Metodo.updateGetVersionDLL_Pag():String;
var ResultadoXML: TDSInvocationMetadata;
begin
 ResultadoXML:= GetInvocationMetadata;
 ResultadoXML.ResponseContent := '202'; //liz incrementa 02
end;

procedure Metodo.updateGET_CONFIG( StrConexion:String; out NuevoCliente, NuevoConsig, SolicitarFactura, ValidaClave, EmailAlterno,
                                AgregarImpuesto, SujetoIEPS, ListaLugares, NoValidarImporte, SistemaOrigen:String; out Error:String);
Var Valor:String;
 NuevoCli,ConsigNuevo:Boolean;
 VersionCan,NumSuc:Integer;

 ResultadoXML: TDSInvocationMetadata;
 CadenaResultado, ColorBanner1, ColorBanner2, ColorOptions, ColorContin, NoSolDir :String;
 paso:String;
 ContactoFact, DirFac,LogSistem :String;
 ErrorLic, ErrorCan:String;
 FacturarPorSucursal, MostrarFormasCobro:String;
begin
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';
    paso := '0';
    dm := TfrmDataModule.Create (nil);
    try
    begin
      Error := '';
	  ErrorLic := '';
	  ErrorCan := '';
      CadenaResultado := '';
      paso := '1';
      if ((not dm.Conexion(StrConexion,Error)) or (Error <> '')) then  raise Exception.Create(Error);
      if dm.trTrans.InTransaction then  dm.trTrans.Rollback;
      dm.trTrans.StartTransaction;

     paso := '2';


    {$REGION ' Nuevo cliente '}
      Valor := '';
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''CrearNuevoCli'' ');
      dm.IBQuery.Open;
      Valor := dm.IBQuery.FieldByName('VALOR').AsString;
      if Valor = 'S' then
        NuevoCliente := 'S'
      else
        NuevoCliente := 'N';
    {$ENDREGION}
     paso := '3';
    {$REGION ' Nueva dirección '}
      Valor := '';
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''CrearNuevaDir'' ');
      dm.IBQuery.Open;
      Valor := dm.IBQuery.FieldByName('VALOR').AsString;
      if Valor = 'S' then
        NuevoConsig := 'S'
      else
        NuevoConsig := 'N';
    {$ENDREGION}
     paso := '4';
    {$REGION ' Solicitar factura '}
      Valor := '';
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''SolicitarFactura'' ');
      dm.IBQuery.Open;
      Valor := dm.IBQuery.FieldByName('VALOR').AsString;
      if Valor = 'S' then
        SolicitarFactura := 'S'
      else
        SolicitarFactura := 'N';
    {$ENDREGION}

     {$REGION ' Validar clave de acceso '}
      Valor := '';
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''PassWeb'' ');
      dm.IBQuery.Open;
      Valor := dm.IBQuery.FieldByName('VALOR').AsString;
      if Valor = 'S' then
        ValidaClave := 'S'
      else
        ValidaClave := 'N';
    {$ENDREGION}

    {$REGION ' utilizar email alterno '}
      Valor := '';
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''CorreoAlterno'' ');
      dm.IBQuery.Open;
      Valor := dm.IBQuery.FieldByName('VALOR').AsString;
      if Valor = 'S' then
        EmailAlterno := 'S'
      else
        EmailAlterno := 'N';
    {$ENDREGION}

    {$REGION ' retener impuesto '}
      AgregarImpuesto := '';
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''RetieneImpto'' ');
      dm.IBQuery.Open;
      AgregarImpuesto := dm.IBQuery.FieldByName('VALOR').AsString;

    {$ENDREGION}

     {$REGION ' lugares de expedición  '}
      Valor := '';
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''ListaLugares'' ');
      dm.IBQuery.Open;
      ListaLugares := dm.IBQuery.FieldByName('VALOR').AsString;
    {$ENDREGION}

    //NoValidarImporte
    {$REGION ' lugares de expedición  '}
      Valor := '';
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''NoValidarImporte'' ');
      dm.IBQuery.Open;
      NoValidarImporte := dm.IBQuery.FieldByName('VALOR').AsString;
    {$ENDREGION}
    //SujetoIEPS

    {$REGION ' contacto factura  '}
      Valor := '';
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''ContactoFact'' ');
      dm.IBQuery.Open;
      ContactoFact := dm.IBQuery.FieldByName('VALOR').AsString;
    {$ENDREGION}

    {$REGION ' dirección factura  '}
      Valor := '';
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''DirFac'' ');
      dm.IBQuery.Open;
      DirFac := dm.IBQuery.FieldByName('VALOR').AsString;
    {$ENDREGION}

    {$REGION 'Sujeto IEPS '}
      SujetoIEPS := '';
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''SujetoIEPS'' ');
      dm.IBQuery.Open;
      SujetoIEPS := dm.IBQuery.FieldByName('VALOR').AsString;
    {$ENDREGION}

    {$REGION 'Sistema Origen '}
      SistemaOrigen := '';
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''SistemaOrigen'' ');
      dm.IBQuery.Open;
      SistemaOrigen := dm.IBQuery.FieldByName('VALOR').AsString;
    {$ENDREGION}

    {$REGION 'Colores'}
      {$region 'Color Banner'}
      ColorBanner1 := '';
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''ColorBanner1'' ');
      dm.IBQuery.Open;
      ColorBanner1 := dm.IBQuery.FieldByName('VALOR').AsString;
      ColorBanner2 := '';
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''ColorBanner2'' ');
      dm.IBQuery.Open;
      ColorBanner2 := dm.IBQuery.FieldByName('VALOR').AsString;
      {$endregion}
      {$region 'Color Opciones'}
      ColorOptions := '';
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''ColorBtnOptions'' ');
      dm.IBQuery.Open;
      ColorOptions := dm.IBQuery.FieldByName('VALOR').AsString;
      {$endregion}
      {$region 'Color Continuidad'}
      ColorContin := '';
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''ColorBtnContinu'' ');
      dm.IBQuery.Open;
      ColorContin := dm.IBQuery.FieldByName('VALOR').AsString;
      {$endregion}
    {$ENDREGION}

    {$REGION 'No solicitar Direccion '}
      NoSolDir := '';
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''NoSolicitaDir'' ');
      dm.IBQuery.Open;
      NoSolDir := dm.IBQuery.FieldByName('VALOR').AsString;
    {$ENDREGION}

    {$REGION 'Logo sitio '}
      LogSistem := '';
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''LogoImg'' ');
      dm.IBQuery.Open;
      LogSistem := dm.IBQuery.FieldByName('VALOR').AsString;
    {$ENDREGION}

    {$REGION 'Facturar Por Sucursal '}
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''FacturarPorSucursal'' ');
      dm.IBQuery.Open;
      FacturarPorSucursal := '';
      FacturarPorSucursal := dm.IBQuery.FieldByName('VALOR').AsString;
      if FacturarPorSucursal <> 'S' then
         FacturarPorSucursal := 'N';
    {$ENDREGION}

    {$REGION 'Mostrar Formas Cobro '}
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''MostrarFormasCobro'' ');
      dm.IBQuery.Open;
      MostrarFormasCobro := '';
      MostrarFormasCobro := dm.IBQuery.FieldByName('VALOR').AsString;
      if MostrarFormasCobro = '' then
         MostrarFormasCobro := 'N';
    {$ENDREGION}


    paso := '5';
    Error := '';
    ErrorLic := ValidaLicencia(StrConexion);

    if ErrorLic <> 'Ok' then
    begin
     {if Trim(ErrorLic)='' then
      ErrorLic := 'Licencia vacia.'+ErrorLic;}

            ErrorCan := LeerCandado(VersionCan,NumSuc);
            if ErrorCan <> '' then
            begin
              NuevoCliente := 'N';
              NuevoConsig := 'N';
              SolicitarFactura := 'N';
              if ErrorCan = 'HASP_HASP_NOT_FOUND' then
  	          begin
                 ErrorCan := 'Versión demostrativa. Conecte su candado o agregue su licencia. ' +ErrorLic;
                 ErrorCan := Copy(ErrorCan,0,99);
                 raise Exception.Create(ErrorCan);
	            end
              else
	            begin
                 raise Exception.Create(ErrorCan);
          	  end;
            end;
    end;

    //raise Exception.Create(':'+ErrorLic );

    paso := '6';
    CadenaResultado := '<?xml version="1.0" encoding="UTF-8"?>';
    CadenaResultado := CadenaResultado+'<Empresa>';
        CadenaResultado := CadenaResultado+'<Config>';
            CadenaResultado := CadenaResultado + '<NuevoCliente>'+NuevoCliente+'</NuevoCliente>';
            CadenaResultado := CadenaResultado + '<NuevoConsig>'+NuevoConsig+'</NuevoConsig>';
            CadenaResultado := CadenaResultado + '<SolicitarFactura>'+SolicitarFactura+'</SolicitarFactura>';
            CadenaResultado := CadenaResultado + '<ValidaClave>'+ValidaClave+'</ValidaClave>';
            CadenaResultado := CadenaResultado + '<EmailAlterno>'+EmailAlterno+'</EmailAlterno>';
            CadenaResultado := CadenaResultado + '<AgregarImpuesto>'+AgregarImpuesto+'</AgregarImpuesto>';
            CadenaResultado := CadenaResultado + '<SujetoIEPS>'+SujetoIEPS+'</SujetoIEPS>';
            CadenaResultado := CadenaResultado + '<ListaLugares>'+ListaLugares+'</ListaLugares>';
            CadenaResultado := CadenaResultado + '<NoValidarImporte>'+NoValidarImporte+'</NoValidarImporte>';
            CadenaResultado := CadenaResultado + '<ContactoFact>'+ContactoFact+'</ContactoFact>';
            CadenaResultado := CadenaResultado + '<DirFac>'+DirFac+'</DirFac>';
            CadenaResultado := CadenaResultado + '<FacturarPorSucursal>'+FacturarPorSucursal+'</FacturarPorSucursal>';
            CadenaResultado := CadenaResultado + '<MostrarFormasCobro>'+MostrarFormasCobro+'</MostrarFormasCobro>';
            CadenaResultado := CadenaResultado + '<SistOrigen>'+SistemaOrigen+'</SistOrigen>';
            CadenaResultado := CadenaResultado + '<ColorBanner1>'+ColorBanner1+'</ColorBanner1>';
            CadenaResultado := CadenaResultado + '<ColorBanner2>'+ColorBanner2+'</ColorBanner2>';
            CadenaResultado := CadenaResultado + '<ColorOptions>'+ColorOptions+'</ColorOptions>';
            CadenaResultado := CadenaResultado + '<ColorContinuidad>'+ColorContin+'</ColorContinuidad>';
            CadenaResultado := CadenaResultado + '<SolicitaDir>'+NoSolDir+'</SolicitaDir>';
            CadenaResultado := CadenaResultado + '<LogoWeb>'+LogSistem+'</LogoWeb>';
            CadenaResultado := CadenaResultado + '<Error>'+Error+'</Error>';
        CadenaResultado := CadenaResultado+'</Config>';
    CadenaResultado := CadenaResultado+'</Empresa>';

    ResultadoXML:= GetInvocationMetadata;
    ResultadoXML.ResponseContent := CadenaResultado;

    try
        dm.Free;
    except
    end;

    end
	  except on e : exception do
     begin
       Error := e.Message;
       ResultadoXML:= GetInvocationMetadata;
       if paso = 'HASP_HASP_NOT_FOUND' then
          paso := '';
       ResultadoXML.ResponseContent := Utf8Encode(Error); //Error; //+' '+paso;

       dm.IBQuery.Close;
	     dm.Free;
     end;
	  end;

end;

function Metodo.updateVERIFICA_USUARIO(StrConexion:String; RFC,PASSWORD:String; out Error:String):String;
Var ClienteId:Integer;
Pass,Estatus:String;
NumSuc,VersionCan : Integer;
ValidaClave:String;
EsRFC:String;
ResultadoXML: TDSInvocationMetadata;
CadenaRespuesta:String;
ErrorLic, ErrorCan:String;
begin
    Result := '';
    CadenaRespuesta := '';
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';

    try
    begin
      // Verifica candado exsim

      ErrorLic := ValidaLicencia(StrConexion);
      if ErrorLic <> 'Ok' then
      begin
          ErrorCan := LeerCandado(VersionCan,NumSuc);
          if (VersionCan < gVersionApp) and (VersionCan<> 0) then
          Raise Exception.Create('La versión '+IntToStr(gVersionApp)+' del programa es superior a la versión '+
                IntToStr(VersionCan)+' de su candado.');
     end;

      dm := TfrmDataModule.Create (nil);
      if ((not dm.Conexion(StrConexion,Error)) or (Error <> '')) then
        raise Exception.Create(Error);
      if dm.trTrans.InTransaction then
        dm.trTrans.Rollback;
      dm.trTrans.StartTransaction;

      //Error := LeerCandado(VersionCan,NumSuc);





      if (RFC = 'XEXX010101000') then
          Raise Exception.Create('Si es un cliente extranjero, debe iniciar sesión con su correo electrónico.');

      EsRFC := '';
      if Ansipos(trim('@'),trim(RFC))<>0 then
        EsRFC := 'N'
      else
        EsRFC := 'S';

      //Raise Exception.Create('Valor EsRFC: '+EsRFC);

      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''PassWeb'' ');
      dm.IBQuery.Open;
      ValidaClave  := dm.IBQuery.FieldByName('VALOR').AsString;

      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''ConfigOK'' ');
      dm.IBQuery.Open;

      if dm.IBQuery.FieldByName('VALOR').AsString = 'S' then
      begin
      ClienteId := 0;


      if EsRFC = 'S' then
      begin
        dm.IBQuery.Close;
        dm.IBQuery.SelectSQL.Clear;
        dm.IBQuery.SelectSQL.Add('SELECT B.CLIENTE_ID,A."PASSWORD",A.ESTATUS ');
        dm.IBQuery.SelectSQL.Add('FROM MGFACTURA_USUARIOS A ');
        dm.IBQuery.SelectSQL.Add('INNER JOIN CLIENTES B ON ( A.CLIENTE_ID = B.CLIENTE_ID ) ');
        dm.IBQuery.SelectSQL.Add('INNER JOIN DIRS_CLIENTES C ON ( A.CLIENTE_ID = C.CLIENTE_ID ) ');
        dm.IBQuery.SelectSQL.Add('WHERE C.ES_DIR_PPAL = ''S'' AND B.ESTATUS = ''A'' ');
        dm.IBQuery.SelectSQL.Add('AND REPLACE( REPLACE(UPPER(C.RFC_CURP),'' '',''''),''-'','''') = :RFC  ');
        dm.IBQuery.ParamByName('RFC').AsString := dm.ValidaCadena(AnsiUpperCase(RFC));
        dm.IBQuery.Open;
      end;

      if EsRFC = 'N' then
      begin
        dm.IBQuery.Close;
        dm.IBQuery.SelectSQL.Clear;
        dm.IBQuery.SelectSQL.Add('SELECT B.CLIENTE_ID,A."PASSWORD",A.ESTATUS ');
        dm.IBQuery.SelectSQL.Add('FROM MGFACTURA_USUARIOS A ');
        dm.IBQuery.SelectSQL.Add('INNER JOIN CLIENTES B ON ( A.CLIENTE_ID = B.CLIENTE_ID ) ');
        dm.IBQuery.SelectSQL.Add('INNER JOIN DIRS_CLIENTES C ON ( A.CLIENTE_ID = C.CLIENTE_ID ) ');
        dm.IBQuery.SelectSQL.Add('WHERE C.ES_DIR_PPAL = ''S'' AND B.ESTATUS = ''A'' ');
        dm.IBQuery.SelectSQL.Add('AND UPPER(C.EMAIL) = UPPER(:RFC)  ');
        dm.IBQuery.ParamByName('RFC').AsString := RFC;
        dm.IBQuery.Open;
      end;

      ClienteId := dm.IBQuery.FieldByName('CLIENTE_ID').AsInteger;
      {if dm.IBQuery.FieldByName('PASSWORD').AsString <> '' then
         Pass := dm.descifrarTexto(Trim(dm.IBQuery.FieldByName('PASSWORD').AsString))
      else
         Pass := '';}
      Pass := dm.IBQuery.FieldByName('PASSWORD').AsString;
      Estatus := dm.IBQuery.FieldByName('ESTATUS').AsString;

     if ClienteId = 0 then
      begin
        Error := 'El cliente no existe, verifique su información.';
        Result := '';
        PASSWORD := '';
        RFC := '';

      end else
      begin
        //////
        if Pass = '' then
        begin
           if ValidaClave <> 'S' then
           begin
             Error := 'El cliente no está configurado correctamente.';
             Result := '';
             PASSWORD := '';
             RFC := '';
           end else
           begin
               if Estatus <> 'A' then
               begin
                  Error := 'Esta cuenta está desactivada.';
                  Result := '';
                  PASSWORD := '';
                  RFC := '';
                end else
                begin
                  Error := '';
                  Result := IntToStr(ClienteId);
                  PASSWORD := Pass;
                end;
           end;
        end else
        begin
          if ValidaClave <> 'S' then
          begin
            if (trim(Pass) <> trim(PASSWORD)) or (trim(Pass)='') then
            begin
              Error := 'El password no es correcto, verifique su información.';
              Result := '';
              PASSWORD := '';
              RFC := '';

            end else
            begin
              if Estatus <> 'A' then
              begin
                Error := 'Esta cuenta está desactivada.';
                Result := '';
                PASSWORD := '';
                RFC := '';
              end else
              begin
                Error := '';
                Result := IntToStr(ClienteId);
                PASSWORD := Pass;
              end;
            end;
          end else// if ValidaClave <> 'S' then
          begin
               if Estatus <> 'A' then
                begin
                  Error := 'Esta cuenta está desactivada.';
                  Result := '';
                  PASSWORD := '';
                  RFC := '';
                end else
                begin
                  Error := '';
                  Result := IntToStr(ClienteId);
                  PASSWORD := Pass;
                end;
          end;
        end
        /////////
      end;
      end else
      begin
        Error := 'C001: El módulo no se ha configurado correctamente.';
        Result := '';
      end;

      ResultadoXML:= GetInvocationMetadata;

      if Error <> '' then
        ResultadoXML.ResponseContent := Error
      else
        ResultadoXML.ResponseContent := Result;

      try
        dm.Free;
      except
      end;



    end
	  except on e : exception do
     begin
       Error := e.Message;
       ResultadoXML:= GetInvocationMetadata;
       ResultadoXML.ResponseContent := Utf8Encode(Error);
       dm.IBQuery.Close;
	     dm.Free;
     end;
	  end;
end;

function Metodo.updateRECUPERA_PASSWORD(StrConexion:String; RFC:String; Out Error:String):String;
Var Smtp,Usuario,Pass,EnviadoPor,PuertoMail,Asunto,Mensaje,Email,NombreCli:String;
ErrorEnvio,NombreEmpresa,PDF,XML,SSL,TLS:String;
ClienteId : Integer;
ResultadoXML: TDSInvocationMetadata;
begin
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';
    dm := TfrmDataModule.Create (nil);
	  try
    begin
      if ((not dm.Conexion(StrConexion,Error)) or (Error <> '')) then
        raise Exception.Create(Error);
      if dm.trTrans.InTransaction then
          dm.trTrans.Rollback;

      dm.trTrans.StartTransaction;

      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT NOMBRE FROM DATOS_EMPRESA ');
      dm.IBQuery.Open;
      NombreEmpresa := dm.IBQuery.FieldByName('NOMBRE').AsString;

      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''ConfigOK'' ');
      dm.IBQuery.Open;

      if dm.IBQuery.FieldByName('VALOR').AsString = 'S' then
      begin

        dm.IBQuery.Close;
        dm.IBQuery.SelectSQL.Clear;
        dm.IBQuery.SelectSQL.Add('SELECT A.CLIENTE_ID ');
        dm.IBQuery.SelectSQL.Add('FROM DIRS_CLIENTES A ');
        dm.IBQuery.SelectSQL.Add('INNER JOIN DIRS_CLIENTES C ON ( A.DIR_CLI_ID = C.DIR_CLI_ID ) ');
        dm.IBQuery.SelectSQL.Add('WHERE UPPER(A.RFC_CURP) = :RFC AND C.ES_DIR_PPAL = ''S'' ');
        dm.IBQuery.ParamByName('RFC').AsString := AnsiUpperCase(RFC);
        dm.IBQuery.Open;
        ClienteId := dm.IBQuery.FieldByName('CLIENTE_ID').AsInteger;

        dm.IBQuery4.Close;
        dm.IBQuery4.SelectSQL.Clear;
        dm.IBQuery4.SelectSQL.Add('SELECT A.CLIENTE_ID,B."PASSWORD",A.EMAIL,C.NOMBRE ');
        dm.IBQuery4.SelectSQL.Add('FROM DIRS_CLIENTES A ');
        dm.IBQuery4.SelectSQL.Add('LEFT JOIN MGFACTURA_USUARIOS B ON ( B.CLIENTE_ID = A.CLIENTE_ID ) ');
        dm.IBQuery4.SelectSQL.Add('INNER JOIN CLIENTES C ON ( C.CLIENTE_ID = A.CLIENTE_ID ) ');
        dm.IBQuery4.SelectSQL.Add('WHERE A.CLIENTE_ID = :CLIENTE_ID ');
        dm.IBQuery4.SelectSQL.Add('AND A.ES_DIR_PPAL = ''S'' ');
        //dm.IBQuery4.SelectSQL.Add('AND A.NOMBRE_CONSIG = ''Dirección principal'' ');
        dm.IBQuery4.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
        dm.IBQuery4.Open;

        {$REGION 'Validaciones'}
        if RFC = '' then
              Raise Exception.Create('Debe indicar un R.F.C..');
        if dm.IBQuery4.FieldByName('CLIENTE_ID').AsInteger = 0 then
              Raise Exception.Create('El cliente no está registrado.');
        if dm.IBQuery4.FieldByName('PASSWORD').AsString = '' then
              Raise Exception.Create('El cliente no está configurado correctamente.');
        if dm.IBQuery4.FieldByName('EMAIL').AsString = '' then
              Raise Exception.Create('El cliente no tiene configurado el email para la recuperación de la contraseña.');
        {$ENDREGION}

        {$REGION 'Obtención de datos'}
        NombreCli := dm.IBQuery4.FieldByName('NOMBRE').AsString;
        Pass := dm.IBQuery4.FieldByName('PASSWORD').AsString;
                //dm.descifrarTexto(dm.IBQuery4.FieldByName('PASSWORD').AsString);
        Email := dm.IBQuery4.FieldByName('EMAIL').AsString;
        Asunto := dm.GetPrefer('AsuntoMailPass');
        Mensaje := dm.GetPrefer('MensajeMailPass');

        Asunto := dm.ReemplazaPalabrasReservadas(Asunto,NombreCli,Pass,NombreEmpresa,'');
        Mensaje := dm.ReemplazaPalabrasReservadas(Mensaje,NombreCli,Pass,NombreEmpresa,'');

        Smtp := dm.GetPrefer('SMPT');
        Usuario := dm.GetPrefer('UsuarioMail');
        Pass := dm.GetPrefer('PassMail'); //'Pruebas246';
        EnviadoPor := dm.GetPrefer('EnviadoPorMail');
        PuertoMail := dm.GetPrefer('PuertoMail');
        SSL := dm.GetPrefer('SslMail');
        TLS := dm.GetPrefer('TlsMail');
        {$ENDREGION}

        PDF := '';
        XML := '';

        if not dm.EnvioMail(Smtp,Usuario,Pass,EnviadoPor,PuertoMail,Asunto,Mensaje,Email,PDF,XML,SSL,TLS,ErrorEnvio) then
        begin
           Error := ErrorEnvio;
           Result := '0';
        end else
        begin
           Error := '';
           Result := '1';
        end;


      end else
      begin
        Error := 'No se ha configurado correctamente el módulo.';
        Result := '0';
      end;

      ResultadoXML:= GetInvocationMetadata;

      if Error <> ''  then
        ResultadoXML.ResponseContent := '**'+Pass+'**'+Error
      else
        ResultadoXML.ResponseContent := Result;

      try
        dm.Free;
      except
      end;

    end
    except on e : exception do
      begin
          Error := e.Message;
          ResultadoXML:= GetInvocationMetadata;
          ResultadoXML.ResponseContent := Error;
          dm.IBQuery.Close;
          dm.Free;
      end;
    end;
end;

function Metodo.updateGET_ESTADOS(StrConexion:String; Out Error:String):String;
Var I : Integer;
ResultadoXML: TDSInvocationMetadata;
begin
    Result := '';
    Error := '';
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';
    dm := TfrmDataModule.Create (nil);
	  try
    begin
      if ((not dm.Conexion(StrConexion,Error)) or (Error <> '')) then
        raise Exception.Create(Error);
      if dm.trTrans.InTransaction then
        dm.trTrans.Rollback;
      dm.trTrans.StartTransaction;

      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.ESTADO_ID,A.NOMBRE ESTADO, B.NOMBRE PAIS ');
      dm.IBQuery.SelectSQL.Add('FROM ESTADOS A ');
      dm.IBQuery.SelectSQL.Add('INNER JOIN PAISES B ON ( B.PAIS_ID = A.PAIS_ID ) ');
      dm.IBQuery.Open;

      dm.xmlWebservice.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><Estados></Estados>';
      dm.xmlWebservice.Active := True;

      CatEstados := GetEstados(dm.xmlWebservice);
      I := 0;
      with CatEstados do
      begin
        while not dm.IBQuery.Eof do
        begin
          with CatEstados.add do
          begin
            Estado[I].Row := I;
            Estado[I].Id := dm.IBQuery.FieldByName('ESTADO_ID').AsInteger;
            Estado[I].Nombre := AnsiLowerCase(dm.IBQuery.FieldByName('ESTADO').AsString);
            Estado[I].Pais := AnsiLowerCase(dm.IBQuery.FieldByName('PAIS').AsString);
            Inc(I);
          end;
          dm.IBQuery.Next;
        end;
      end;

      Result := dm.xmlWebservice.XML.Text;
      Error := '';

      ResultadoXML:= GetInvocationMetadata;

      if Error <> '' then
        ResultadoXML.ResponseContent := Error
      else
        ResultadoXML.ResponseContent := Result;

      try
        dm.Free;
      except
      end;

    end
    except on e : exception do
      begin
          Error := e.Message;
          ResultadoXML:= GetInvocationMetadata;
          ResultadoXML.ResponseContent := Error;
          dm.IBQuery.Close;
          dm.Free;
      end;
    end;
end;

function Metodo.updateREGISTRA_CLIENTE(StrConexion:String; NuevoCliente:WideString; out Error:String):String;
Var ClienteId,MonedaId,TipoClienteId,CondPagoId,DirCliId,CiudadId,PaisId,UserWebId, lEstadoID:Integer;
Res,CalleDirCli,RfcCorrecto,TienePassWeb,CliExis, RETIENE_IMPUESTOS:String;
SujetoIEPS, RetieneImpto, ValidaClave, NombreCli:String;
paso, msgEstatus, NoSolicitaDir, RFC_validCorrect :String;
ResultadoXML: TDSInvocationMetadata;
begin
    msgEstatus := ''; RFC_validCorrect := '';
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';
    dm := TfrmDataModule.Create (nil);
    try
    begin

      if ((not dm.Conexion(StrConexion,Error)) or (Error <> '')) then   raise Exception.Create(Error);
      if dm.trTrans.InTransaction then   dm.trTrans.Rollback;
      dm.trTrans.StartTransaction;

      NoSolicitaDir := '';
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''NoSolicitaDir'' ');
      dm.IBQuery.Open;
      NoSolicitaDir := dm.IBQuery.FieldByName('VALOR').AsString;

      paso := '1';
      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''ConfigOK'' ');
      dm.IBQuery.Open;

      if dm.IBQuery.FieldByName('VALOR').AsString = 'S' then
      begin
        {$REGION 'Valores default'}
        dm.IBQuery.Close;
        dm.IBQuery.SelectSQL.Clear;
        dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''MonedaId'' ');
        dm.IBQuery.Open;

        if dm.IBQuery.FieldByName('VALOR').AsString <> '' then
            MonedaId := StrToInt(dm.IBQuery.FieldByName('VALOR').AsString)
        else MonedaId := 0;

        dm.IBQuery.Close;
        dm.IBQuery.SelectSQL.Clear;
        dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''TipoClienteId'' ');
        dm.IBQuery.Open;

        if dm.IBQuery.FieldByName('VALOR').AsString <> '' then
            TipoClienteId := StrToInt(dm.IBQuery.FieldByName('VALOR').AsString)
        else TipoClienteId := 0;

        dm.IBQuery.Close;
        dm.IBQuery.SelectSQL.Clear;
        dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''CondPagoId'' ');
        dm.IBQuery.Open;

        if dm.IBQuery.FieldByName('VALOR').AsString <> '' then
            CondPagoId := StrToInt(dm.IBQuery.FieldByName('VALOR').AsString)
        else CondPagoId := 0;

        {$REGION 'Sujeto IEPS '}
          SujetoIEPS := '';
          dm.IBQuery.Close;
          dm.IBQuery.SelectSQL.Clear;
          dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''SujetoIEPS'' ');
          dm.IBQuery.Open;
          SujetoIEPS := dm.IBQuery.FieldByName('VALOR').AsString;
        {$ENDREGION}

        {$REGION 'Retiene Impto '}
          RetieneImpto := '';
          dm.IBQuery.Close;
          dm.IBQuery.SelectSQL.Clear;
          dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''RetieneImpto'' ');
          dm.IBQuery.Open;
          RetieneImpto := dm.IBQuery.FieldByName('VALOR').AsString;
        {$ENDREGION}

        {$REGION 'PassWeb'}
          paso := '2';
          dm.IBQuery.Close;
          dm.IBQuery.SelectSQL.Clear;
          dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''PassWeb'' ');
          dm.IBQuery.Open;
          ValidaClave := dm.IBQuery.FieldByName('VALOR').AsString;
          paso := '3';

        {$ENDREGION}

        {$ENDREGION}

        dm.IBQuery.Close;
        dm.IBQuery.SelectSQL.Clear;
        dm.IBQuery.SelectSQL.Add('INSERT INTO CLIENTES (CLIENTE_ID, NOMBRE, CONTACTO1, CONTACTO2, ESTATUS, CAUSA_SUSP, ');
        dm.IBQuery.SelectSQL.Add('FECHA_SUSP, COBRAR_IMPUESTOS, RETIENE_IMPUESTOS, SUJETO_IEPS, GENERAR_INTERESES, EMITIR_EDOCTA, ');
        dm.IBQuery.SelectSQL.Add('LIMITE_CREDITO, MONEDA_ID, COND_PAGO_ID, TIPO_CLIENTE_ID, ZONA_CLIENTE_ID, COBRADOR_ID, ');
        dm.IBQuery.SelectSQL.Add('VENDEDOR_ID, NOTAS, CUENTA_CXC, CUENTA_ANTICIPOS, FORMATOS_EMAIL, RECEPTOR_CFD, ');
        dm.IBQuery.SelectSQL.Add('NUM_PROV_CLIENTE, CAMPOS_ADDENDA, USUARIO_CREADOR, FECHA_HORA_CREACION, USUARIO_AUT_CREACION, ');
        dm.IBQuery.SelectSQL.Add('USUARIO_ULT_MODIF, FECHA_HORA_ULT_MODIF, USUARIO_AUT_MODIF) VALUES ');
        dm.IBQuery.SelectSQL.Add('( :CLIENTE_ID, :NOMBRE, :CONTACTO1, :CONTACTO2, :ESTATUS, :CAUSA_SUSP, ');
        dm.IBQuery.SelectSQL.Add(':FECHA_SUSP, :COBRAR_IMPUESTOS, :RETIENE_IMPUESTOS, :SUJETO_IEPS, :GENERAR_INTERESES, :EMITIR_EDOCTA, ');
        dm.IBQuery.SelectSQL.Add(':LIMITE_CREDITO, :MONEDA_ID, :COND_PAGO_ID, :TIPO_CLIENTE_ID, :ZONA_CLIENTE_ID, :COBRADOR_ID, ');
        dm.IBQuery.SelectSQL.Add(':VENDEDOR_ID, :NOTAS, :CUENTA_CXC, :CUENTA_ANTICIPOS, :FORMATOS_EMAIL, :RECEPTOR_CFD, ');
        dm.IBQuery.SelectSQL.Add(':NUM_PROV_CLIENTE, :CAMPOS_ADDENDA, :USUARIO_CREADOR, :FECHA_HORA_CREACION, :USUARIO_AUT_CREACION, ');
        dm.IBQuery.SelectSQL.Add(':USUARIO_ULT_MODIF, :FECHA_HORA_ULT_MODIF, :USUARIO_AUT_MODIF ) ');

        dm.xmlWebservice.XML.Text := NuevoCliente;
        NuevoCli := GetNuevoCliente(DM.xmlWebservice);

        with NuevoCli do
        begin

          {$REGION 'Validaciones'}
            Res := '';
            RfcCorrecto := dm.ValidaCadena(RFC);

            Res := dm.ValidarRFC(RfcCorrecto);

            if Res <> '' then
                Raise Exception.Create(Res);

            //Cambio noviembre apartir de la configuracion se valida o no la contraseña de usuario
            if ValidaClave <> 'S' then
            begin
              if Trim(Contrasena) = '' then
                  Raise Exception.Create('Debe indicar una contraseña.');
            end;
            paso := '4';

            if Trim(Nombre) = '' then
                Raise Exception.Create('Debe indicar un nombre.');


           { if Trim(Contacto) = '' then
                Raise Exception.Create('Debe indicar un contacto.');  }

           // Cambio noviembre la direcion y cp no son obligatorios
           {
            if Trim(Calle) = '' then
                Raise Exception.Create('Debe indicar la calle.');  }
           { if Trim(NumExt) = '' then
                Raise Exception.Create('Debe indicar el número exterior.'); }
          {  if Trim(Colonia) = '' then
                Raise Exception.Create('Debe indicar la colonia.'); }
           { if Trim(Ciudad) = '' then
                Raise Exception.Create('Debe indicar la ciudad.');  }
           { if IdEstado = 0 then
                Raise Exception.Create('Debe indicar un estado.');  }
           { if Trim(CodigoPostal) = '' then
                Raise Exception.Create('Debe indicar el código postal.'); }
           { if Trim(Telefono) = '' then
                Raise Exception.Create('Debe indicar el teléfono.');  }
            if Trim(Email) = '' then
                Raise Exception.Create('Debe indicar el correo electrónico.');

            if Trim(RFC) = '' then
                Raise Exception.Create('Debe indicar el R.F.C..');

            if Trim(TipoReg) = '' then
              Raise Exception.Create('No se indicó el tipo de persona.');

           if Trim(RegFis) = '' then
              Raise Exception.Create('No se indicó el régimen fiscal.');

           if Trim(CodigoPostal) = '' then
                Raise Exception.Create('Debe indicar el código postal.');


            paso := '5';
            if (NoSolicitaDir = 'N') and ( IdEstado > 0 ) then
            begin
              dm.IBQuery4.Close;
              dm.IBQuery4.SelectSQL.Clear;
              dm.IBQuery4.SelectSQL.Add('SELECT * FROM ESTADOS WHERE ESTADO_ID = :ESTADO_ID ');
              dm.IBQuery4.ParamByName('ESTADO_ID').AsInteger := IdEstado;
              dm.IBQuery4.Open;
              if dm.IBQuery4.IsEmpty then
                Raise Exception.Create('El estado indicado no existe.');
            end;
          {$ENDREGION}

          paso := '6';
          {$REGION 'Validaciones de longitud'}
          if ValidaClave <> 'S' then
          begin
            if length(dm.cifrarTexto(Trim(Contrasena))) > 100  then
                Raise Exception.Create('La contraseña excede el tamaño máximo.');
          end;

            if length(Trim(Nombre)) > 200 then
                Raise Exception.Create('El nombre excede el tamaño máximo.');
            if length(Trim(Contacto)) > 50 then
                Raise Exception.Create('El contacto excede el tamaño máximo.');
            if length(Trim(Calle)) > 100 then
                Raise Exception.Create('La calle excede el tamaño máximo.');
            if length(Trim(NumExt)) > 10 then
                Raise Exception.Create('El número exterior excede el tamaño máximo.');
            if length(Trim(NumInt)) > 10 then
                Raise Exception.Create('El número interior excede el tamaño máximo.');
            if length(Trim(Colonia)) > 100 then
                Raise Exception.Create('La colonia excede el tamaño máximo.');
            if length(Trim(Ciudad)) > 50 then
                Raise Exception.Create('La ciudad excede el tamaño máximo.');
            if length(Trim(CodigoPostal)) > 10 then
                Raise Exception.Create('El código postal excede el tamaño máximo.');
            if length(Trim(Telefono)) > 35 then
                Raise Exception.Create('El teléfono excede el tamaño máximo.');
            if length(Trim(Email)) > 200 then
                Raise Exception.Create('El correo electrónico excede el tamaño máximo');
            if length(Trim(RFC)) > 18 then
                Raise Exception.Create('El R.F.C. excede el tamaño máximo.');
          {$ENDREGION}

          paso := '7';
          ClienteId := 0;
          dm.IBQuery4.Close;
          dm.IBQuery4.SelectSQL.Clear;
          dm.IBQuery4.SelectSQL.Add('SELECT A.CLIENTE_ID ');
          dm.IBQuery4.SelectSQL.Add('FROM DIRS_CLIENTES A ');
          dm.IBQuery4.SelectSQL.Add('WHERE UPPER( REPLACE( (REPLACE(A.RFC_CURP,'' '','''')),''-'','''')) = :RFC_CURP ');
          dm.IBQuery4.SelectSQL.Add('AND A.ES_DIR_PPAL = ''S'' ');
          dm.IBQuery4.SelectSQL.Add('GROUP BY A.CLIENTE_ID ');
          dm.IBQuery4.ParamByName('RFC_CURP').AsString := dm.ValidaCadena(AnsiUpperCase(RfcCorrecto));
          dm.IBQuery4.Open;
          ClienteId := dm.IBQuery4.FieldByName('CLIENTE_ID').AsInteger;

          RFC_validCorrect := dm.ValidaCadena(AnsiUpperCase(RfcCorrecto));
          if RFC_validCorrect = 'XEXX010101000' then  ClienteId := 0;


          paso := '8';
          if ClienteId = 0 then
          begin
              dm.IBQuery4.Close;
              dm.IBQuery4.SelectSQL.Clear;
              dm.IBQuery4.SelectSQL.Add('SELECT A.CLIENTE_ID FROM CLIENTES A WHERE UPPER(A.NOMBRE) = :NOMBRE ');
              dm.IBQuery4.ParamByName('NOMBRE').AsString := AnsiUpperCase(Nombre);
              dm.IBQuery4.Open;
              ClienteId := dm.IBQuery4.FieldByName('CLIENTE_ID').AsInteger;
              if ClienteId > 0 then
                   Raise Exception.Create('Ya existe un cliente con el nombre: '+AnsiUpperCase(Nombre)+' y diferente RFC.');
          end;


          paso := '9';
          TienePassWeb := 'N';
          if ClienteId > 0 then
          begin
              CliExis := 'S';
              //TienePassWeb := 'N';
              dm.IBQuery4.Close;
              dm.IBQuery4.SelectSQL.Clear;
              dm.IBQuery4.SelectSQL.Add('SELECT USUARIO_ID,"PASSWORD", ESTATUS ');
              dm.IBQuery4.SelectSQL.Add('FROM MGFACTURA_USUARIOS ');
              dm.IBQuery4.SelectSQL.Add('WHERE CLIENTE_ID = :CLIENTE_ID ');
              dm.IBQuery4.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
              dm.IBQuery4.Open;
              if (dm.IBQuery4.Fieldbyname('PASSWORD').ASSTRING = '') then  TienePassWeb := 'N'
                else  TienePassWeb := 'S';

              UserWebId := dm.IBQuery4.Fieldbyname('USUARIO_ID').ASinteger;
          end
          else  CliExis := 'N';

          {$region 'TienePassWeb = S'}
          paso := '10';
          if TienePassWeb = 'S' then
          begin
            dm.IBQuery4.Close;
            dm.IBQuery4.SelectSQL.Clear;
            dm.IBQuery4.SelectSQL.Add('SELECT A.CLIENTE_ID FROM CLIENTES A WHERE UPPER(A.NOMBRE) = :NOMBRE ');
            dm.IBQuery4.ParamByName('NOMBRE').AsString := AnsiUpperCase(Nombre);
            dm.IBQuery4.Open;
            if dm.IBQuery4.FieldByName('CLIENTE_ID').AsInteger > 0 then
                 Raise Exception.Create('Ya existe un cliente con el nombre: '+AnsiUpperCase(Nombre)+'.');
          end;
          {$endregion}

          if CliExis = 'N' then
          begin
              {$REGION 'Clientes'}
              ClienteId := 0;
              dm.spGenCatId.execproc;
              ClienteId := dm.spGenCatId.fieldbyname('CATALOGO_ID').asinteger;

              if clienteId = 0 then
              begin
                  dm.spGenCatId.execproc;
                  ClienteId := dm.spGenCatId.fieldbyname('CATALOGO_ID').asinteger;
              end;

              paso := '11';
              dm.IBQuery.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
              NombreCli := AnsiUpperCase(NuevoCli.ChildNodes.Nodes['Nombre'].NodeValue);
              dm.IBQuery.ParamByName('NOMBRE').AsString := AnsiUpperCase(NuevoCli.ChildNodes.Nodes['Nombre'].NodeValue);

              try
                begin
                    if Trim(NuevoCli.ChildNodes.Nodes['Contacto'].NodeValue) <> '' then
                        dm.IBQuery.ParamByName('CONTACTO1').AsString := AnsiUpperCase(NuevoCli.ChildNodes.Nodes['Contacto'].NodeValue)
                    else
                        dm.IBQuery.ParamByName('CONTACTO1').Clear;
                end;
              except
                 begin
                    dm.IBQuery.ParamByName('CONTACTO1').Clear;
                 end;
              end;



              dm.IBQuery.ParamByName('CONTACTO2').Clear;
              dm.IBQuery.ParamByName('ESTATUS').AsString := 'A';
              dm.IBQuery.ParamByName('CAUSA_SUSP').Clear;
              dm.IBQuery.ParamByName('FECHA_SUSP').Clear;
              dm.IBQuery.ParamByName('COBRAR_IMPUESTOS').AsString := 'S';

              if RetieneImpto = 'S' then
                 dm.IBQuery.ParamByName('RETIENE_IMPUESTOS').AsString := 'S';

              if RetieneImpto = 'N' then
                 dm.IBQuery.ParamByName('RETIENE_IMPUESTOS').AsString := 'N';

              if RetieneImpto = 'O' then
                 dm.IBQuery.ParamByName('RETIENE_IMPUESTOS').AsString := NuevoCli.ChildNodes.Nodes['RetImpto'].NodeValue;



              if SujetoIEPS = 'S' then
                 dm.IBQuery.ParamByName('SUJETO_IEPS').AsString := 'S';

              if SujetoIEPS = 'N' then
                 dm.IBQuery.ParamByName('SUJETO_IEPS').AsString := 'N';

              if SujetoIEPS = 'O' then
                 dm.IBQuery.ParamByName('SUJETO_IEPS').AsString := NuevoCli.ChildNodes.Nodes['RetIEPS'].NodeValue;

              dm.IBQuery.ParamByName('GENERAR_INTERESES').AsString := 'S';
              dm.IBQuery.ParamByName('EMITIR_EDOCTA').AsString := 'S';
              dm.IBQuery.ParamByName('LIMITE_CREDITO').AsFloat := 0;
              dm.IBQuery.ParamByName('MONEDA_ID').AsInteger := MonedaId;
              dm.IBQuery.ParamByName('COND_PAGO_ID').AsInteger := CondPagoId;
              dm.IBQuery.ParamByName('TIPO_CLIENTE_ID').AsInteger := TipoClienteId;
              dm.IBQuery.ParamByName('ZONA_CLIENTE_ID').Clear;
              dm.IBQuery.ParamByName('COBRADOR_ID').Clear;
              dm.IBQuery.ParamByName('VENDEDOR_ID').Clear;
              dm.IBQuery.ParamByName('NOTAS').Clear;
              dm.IBQuery.ParamByName('CUENTA_CXC').Clear;
              dm.IBQuery.ParamByName('CUENTA_ANTICIPOS').Clear;
              dm.IBQuery.ParamByName('FORMATOS_EMAIL').Clear;
              dm.IBQuery.ParamByName('RECEPTOR_CFD').AsString := 'GENERICO';
              dm.IBQuery.ParamByName('NUM_PROV_CLIENTE').Clear;
              dm.IBQuery.ParamByName('CAMPOS_ADDENDA').Clear;
              dm.IBQuery.ParamByName('USUARIO_CREADOR').AsString := AnsiUpperCase(dm.IBDatabase1.ConnectParams.UserName);
              dm.IBQuery.ParamByName('FECHA_HORA_CREACION').AsDateTime := dm.IBDatabase1.GetServerTime;
              dm.IBQuery.ParamByName('USUARIO_AUT_CREACION').Clear;
              dm.IBQuery.ParamByName('USUARIO_ULT_MODIF').AsString := AnsiUpperCase(dm.IBDatabase1.ConnectParams.UserName);
              dm.IBQuery.ParamByName('FECHA_HORA_ULT_MODIF').AsDateTime := dm.IBDatabase1.GetServerTime;
              dm.IBQuery.ParamByName('USUARIO_AUT_MODIF').Clear;
              dm.IBQuery.Open;
              {$ENDREGION}

              paso := '12';
              {$REGION 'Dirección principal'}
              dm.IBQuery2.Close;
              dm.IBQuery2.SelectSQL.Clear;
              dm.IBQuery2.SelectSQL.Add('INSERT INTO DIRS_CLIENTES (DIR_CLI_ID, CLIENTE_ID, NOMBRE_CONSIG, ');
              dm.IBQuery2.SelectSQL.Add('CALLE, NOMBRE_CALLE, NUM_EXTERIOR, NUM_INTERIOR, COLONIA, POBLACION, ');
              dm.IBQuery2.SelectSQL.Add('REFERENCIA, CIUDAD_ID, ESTADO_ID, CODIGO_POSTAL, PAIS_ID, TELEFONO1, ');
              dm.IBQuery2.SelectSQL.Add('TELEFONO2, FAX, EMAIL, RFC_CURP, CONTACTO, VIA_EMBARQUE_ID, ES_DIR_PPAL, ');
              dm.IBQuery2.SelectSQL.Add('USAR_PARA_ENVIOS, USAR_PARA_FACTURAR, GLN, TIPO_PERSONA, CLAVE_REGIMEN_FISCAL) VALUES ');
              dm.IBQuery2.SelectSQL.Add('( :DIR_CLI_ID, :CLIENTE_ID, :NOMBRE_CONSIG, ');
              dm.IBQuery2.SelectSQL.Add(':CALLE, :NOMBRE_CALLE, :NUM_EXTERIOR, :NUM_INTERIOR, :COLONIA, :POBLACION, ');
              dm.IBQuery2.SelectSQL.Add(':REFERENCIA, :CIUDAD_ID, :ESTADO_ID, :CODIGO_POSTAL, :PAIS_ID, :TELEFONO1, ');
              dm.IBQuery2.SelectSQL.Add(':TELEFONO2, :FAX, :EMAIL, :RFC_CURP, :CONTACTO, :VIA_EMBARQUE_ID, :ES_DIR_PPAL, ');
              dm.IBQuery2.SelectSQL.Add(':USAR_PARA_ENVIOS, :USAR_PARA_FACTURAR, :GLN, :TIPO_PERSONA, :CLAVE_REGIMEN_FISCAL); ');
              dm.spGenCatId.ExecProc;
              DirCliId := dm.spGenCatId.FieldByName('CATALOGO_ID').AsInteger;

              {$REGION 'Obtener datos importantes'}
              dm.IBQuery4.Close;
              dm.IBQuery4.SelectSQL.Clear;
              dm.IBQuery4.SelectSQL.Add('SELECT CIUDAD_ID FROM CIUDADES WHERE UPPER( NOMBRE ) = :NOMBRE ');
              dm.IBQuery4.ParamByName('NOMBRE').AsString := AnsiUpperCase(Ciudad);
              dm.IBQuery4.Open;
              CiudadId := dm.IBQuery4.FieldByName('CIUDAD_ID').AsInteger;

              try
                begin
                  lEstadoID := 0;
                  lEstadoID := IdEstado;
                end;
              except
                begin
                  lEstadoID := 0;
                end;
              end;

              {$region 'CiudadId = 0'}
              if CiudadId = 0 then
              begin
                if AnsiUpperCase(Ciudad) <> '' then
                begin
                    dm.spGenCatId.ExecProc;
                    CiudadId := dm.spGenCatId.FieldByName('CATALOGO_ID').AsInteger;
                    dm.IBQuery4.Close;
                    dm.IBQuery4.SelectSQL.Clear;
                    dm.IBQuery4.SelectSQL.Add('INSERT INTO CIUDADES (CIUDAD_ID, NOMBRE, ES_PREDET, ESTADO_ID, ');
                    dm.IBQuery4.SelectSQL.Add('USUARIO_CREADOR, FECHA_HORA_CREACION, USUARIO_AUT_CREACION, ');
                    dm.IBQuery4.SelectSQL.Add('USUARIO_ULT_MODIF, FECHA_HORA_ULT_MODIF, USUARIO_AUT_MODIF) VALUES ');
                    dm.IBQuery4.SelectSQL.Add('(:CIUDAD_ID, :NOMBRE, :ES_PREDET, :ESTADO_ID, ');
                    dm.IBQuery4.SelectSQL.Add(':USUARIO_CREADOR, :FECHA_HORA_CREACION, :USUARIO_AUT_CREACION, ');
                    dm.IBQuery4.SelectSQL.Add(':USUARIO_ULT_MODIF, :FECHA_HORA_ULT_MODIF, :USUARIO_AUT_MODIF); ');
                    dm.IBQuery4.ParamByName('CIUDAD_ID').AsInteger := CiudadId;
                    dm.IBQuery4.ParamByName('NOMBRE').AsString := AnsiUpperCase(Ciudad);
                    dm.IBQuery4.ParamByName('ES_PREDET').AsString := 'N';
                    dm.IBQuery4.ParamByName('ESTADO_ID').AsInteger := lEstadoID;
                    dm.IBQuery4.ParamByName('USUARIO_CREADOR').AsString := AnsiUpperCase(dm.IBDatabase1.ConnectParams.UserName);
                    dm.IBQuery4.ParamByName('FECHA_HORA_CREACION').AsDateTime := dm.IBDatabase1.GetServerTime;
                    dm.IBQuery4.ParamByName('USUARIO_AUT_CREACION').Clear;
                    dm.IBQuery4.ParamByName('USUARIO_ULT_MODIF').Clear;
                    dm.IBQuery4.ParamByName('FECHA_HORA_ULT_MODIF').Clear;
                    dm.IBQuery4.ParamByName('USUARIO_AUT_MODIF').Clear;
                    dm.IBQuery4.Open;
                end;
              end;
              {$endregion}

              paso := '13';
              if lEstadoID > 0 then
              begin
                try
                  begin
                      paso := '13-1-1-2';
                      dm.IBQuery4.Close;
                      dm.IBQuery4.SelectSQL.Clear;
                      dm.IBQuery4.SelectSQL.Add('SELECT PAIS_ID FROM ESTADOS WHERE ESTADO_ID = :ESTADO_ID ');
                      dm.IBQuery4.ParamByName('ESTADO_ID').AsInteger := lEstadoID;
                      dm.IBQuery4.Open;
                      paso := '13-1-1-3';
                      PaisId := dm.IBQuery4.FieldByName('PAIS_ID').AsInteger;
                      paso := '13-1-1-4';
                  end;
                except
                  begin
                      paso := '13-1-1-5';
                      PaisId := 0;
                  end;
                end;

              end else
              begin
                  paso := '13-1-1-6';
                  PaisId := 0;
              end;

              {$ENDREGION}

              paso := '14';
              CalleDirCli := '';

              CalleDirCli := Calle+' '+NumExt;

              if NumInt <> '' then
                  CalleDirCli := CalleDirCli+' '+NumInt;

              CalleDirCli := CalleDirCli+#13+Colonia;

              if Poblacion <> '' then
                  CalleDirCli := CalleDirCli+' '+Poblacion;

              if Referencia <> '' then
                  CalleDirCli := CalleDirCli+#13+Referencia;

              dm.IBQuery2.ParamByName('DIR_CLI_ID').AsInteger := DirCliId;
              dm.IBQuery2.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
              dm.IBQuery2.ParamByName('NOMBRE_CONSIG').AsString := 'Dirección principal';
              dm.IBQuery2.ParamByName('CALLE').AsString := AnsiUpperCase(CalleDirCli);
              dm.IBQuery2.ParamByName('NOMBRE_CALLE').AsString := AnsiUpperCase(Calle);
              dm.IBQuery2.ParamByName('NUM_EXTERIOR').AsString := AnsiUpperCase(NumExt);
              dm.IBQuery2.ParamByName('NUM_INTERIOR').AsString := AnsiUpperCase(NumInt);
              dm.IBQuery2.ParamByName('COLONIA').AsString := AnsiUpperCase(Colonia);
              dm.IBQuery2.ParamByName('POBLACION').AsString := AnsiUpperCase(Poblacion);
              dm.IBQuery2.ParamByName('REFERENCIA').AsString := AnsiUpperCase(Referencia);
              if CiudadId > 0 then
                dm.IBQuery2.ParamByName('CIUDAD_ID').AsInteger := CiudadId
              else
                dm.IBQuery2.ParamByName('CIUDAD_ID').Clear;

              if lEstadoID > 0 then
                dm.IBQuery2.ParamByName('ESTADO_ID').AsInteger := IdEstado
              else
                dm.IBQuery2.ParamByName('ESTADO_ID').Clear;

              dm.IBQuery2.ParamByName('CODIGO_POSTAL').AsString := CodigoPostal;

              if PaisId > 0 then
                dm.IBQuery2.ParamByName('PAIS_ID').AsInteger := PaisId
              else
                dm.IBQuery2.ParamByName('PAIS_ID').Clear;

              dm.IBQuery2.ParamByName('TELEFONO1').AsString := Telefono;
              dm.IBQuery2.ParamByName('TELEFONO2').Clear;
              dm.IBQuery2.ParamByName('FAX').Clear;
              dm.IBQuery2.ParamByName('EMAIL').AsString := Email;
              dm.IBQuery2.ParamByName('RFC_CURP').AsString := RfcCorrecto;
              dm.IBQuery2.ParamByName('CONTACTO').AsString := '';;
              dm.IBQuery2.ParamByName('VIA_EMBARQUE_ID').Clear;
              dm.IBQuery2.ParamByName('ES_DIR_PPAL').AsString := 'S';
              dm.IBQuery2.ParamByName('USAR_PARA_ENVIOS').AsString := 'S';
              dm.IBQuery2.ParamByName('USAR_PARA_FACTURAR').AsString := 'S';
              dm.IBQuery2.ParamByName('TIPO_PERSONA').AsString := AnsiUpperCase(TipoReg);
              dm.IBQuery2.ParamByName('CLAVE_REGIMEN_FISCAL').AsString := AnsiUpperCase(RegFis);
              dm.IBQuery2.Open;


              paso := '14-rfc';
              Error := '';
              if dm.InsertRFCS_LCO(RfcCorrecto, NombreCli, CodigoPostal, Error ) then
              begin
                paso := paso + Error;
                //raise Exception.Create(Error);
              end;

              {$ENDREGION}

              paso := '14';
              {$REGION 'Registra usuario web'}
              dm.IBQuery3.Close;
              dm.IBQuery3.SelectSQL.Clear;
              dm.IBQuery3.SelectSQL.Add('SELECT USUARIO_ID FROM MGFACTURA_USUARIOS WHERE CLIENTE_ID = :CLIENTE_ID ');
              dm.IBQuery3.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
              dm.IBQuery3.Open;

              paso := '15';
              if dm.IBQuery3.fIELDBYNAME('USUARIO_ID').ASINTEGER = 0 then
              BEGIN
                  dm.IBQuery4.Close;
                  dm.IBQuery4.SelectSQL.Clear;
                  dm.IBQuery4.SelectSQL.Add('INSERT INTO MGFACTURA_USUARIOS (USUARIO_ID, CLIENTE_ID, "PASSWORD", ESTATUS ) ');
                  dm.IBQuery4.SelectSQL.Add('VALUES (:USUARIO_ID, :CLIENTE_ID, :PASS, :ESTATUS ); ');
                  dm.spGenCatId.execproc;
                  dm.IBQuery4.ParamByName('USUARIO_ID').AsInteger := dm.spGenCatId.fieldbyname('CATALOGO_ID').asinteger;
                  dm.IBQuery4.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
                  dm.IBQuery4.ParamByName('PASS').AsString := Contrasena;//dm.cifrarTexto(Contrasena);
                  dm.IBQuery4.ParamByName('ESTATUS').AsString := 'A';
                  dm.IBQuery4.Open;
              END;

              paso := '16';
              if dm.IBQuery3.fIELDBYNAME('USUARIO_ID').ASINTEGER > 0 then
              BEGIN
                  dm.IBQuery4.Close;
                  dm.IBQuery4.SelectSQL.Clear;
                  dm.IBQuery4.SelectSQL.Add('UPDATE MGFACTURA_USUARIOS SET ');
                  dm.IBQuery4.SelectSQL.Add('"PASSWORD" = :PASSWORD, ESTATUS = :ESTATUS ');
                  dm.IBQuery4.SelectSQL.Add('WHERE ( USUARIO_ID = :USUARIO_ID ); ');
                  dm.spGenCatId.execproc;
                  dm.IBQuery4.ParamByName('USUARIO_ID').AsInteger := dm.IBQuery3.FIELDBYNAME('USUARIO_ID').ASINTEGER;
                  dm.IBQuery4.ParamByName('PASSWORD').AsString := Contrasena;//dm.cifrarTexto(Contrasena);
                  dm.IBQuery4.ParamByName('ESTATUS').AsString := 'A';
                  dm.IBQuery4.Open;
              END;

              paso := '17';

              {$ENDREGION}

              msgEstatus := 'Cliente '+AnsiUpperCase(Nombre)+' creado correctamente';
          end else
          begin

              if UserWebId = 0 then
              begin
                  {$REGION 'Registra usuario web'}
                  paso := '18';
                  dm.IBQuery4.Close;
                  dm.IBQuery4.SelectSQL.Clear;
                  dm.IBQuery4.SelectSQL.Add('INSERT INTO MGFACTURA_USUARIOS (USUARIO_ID, CLIENTE_ID, "PASSWORD", ESTATUS ) ');
                  dm.IBQuery4.SelectSQL.Add('VALUES (:USUARIO_ID, :CLIENTE_ID, :PASS, :ESTATUS ); ');
                  dm.spGenCatId.execproc;
                  dm.IBQuery4.ParamByName('USUARIO_ID').AsInteger := dm.spGenCatId.fieldbyname('CATALOGO_ID').asinteger;
                  dm.IBQuery4.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
                  dm.IBQuery4.ParamByName('PASS').AsString := Contrasena;//dm.cifrarTexto(Contrasena);
                  dm.IBQuery4.ParamByName('ESTATUS').AsString := 'A';
                  dm.IBQuery4.Open;
                  {$ENDREGION}
                  msgEstatus := 'El usuario  '+AnsiUpperCase(Nombre)+' se registró correctamente';
                  paso := '19';
              end
              else
              begin
                 if TienePassWeb = 'N' then
                 begin
                    {$REGION 'Actualiza usuario web'}
                    paso := '20';
                    dm.IBQuery4.Close;
                    dm.IBQuery4.SelectSQL.Clear;
                    dm.IBQuery4.SelectSQL.Add('UPDATE MGFACTURA_USUARIOS SET "PASSWORD" = :PASS, ESTATUS = ''A'' ');
                    dm.IBQuery4.SelectSQL.Add('WHERE (USUARIO_ID = :USUARIO_ID ); ');
                    dm.spGenCatId.execproc;
                    dm.IBQuery4.ParamByName('USUARIO_ID').AsInteger := UserWebId;
                    dm.IBQuery4.ParamByName('PASS').AsString := Contrasena;//dm.cifrarTexto(Contrasena);
                    dm.IBQuery4.Open;
                    paso := '21';
                    {$ENDREGION}
                    msgEstatus := 'El usuario '+AnsiUpperCase(Nombre)+' se actualizado correctamente';
                 end
                 else  raise Exception.Create('Ya existe un cliente registrado con este RFC ('+RFC_validCorrect+') ');
              end;
              //msgEstatus := 'Cliente '+AnsiUpperCase(Nombre)+' ya ha sido registrado ';
          end;


          if dm.trTrans.InTransaction then
             dm.trTrans.Commit;

          Result := msgEstatus; //'ClienteId: '+IntToStr(ClienteId);

        end;  //fin while


      end else
      begin
        Error := 'C001: No se ha configurado correctamente.';
        Result := '0';
      end;

      ResultadoXML:= GetInvocationMetadata;

      if Error <> '' then
        ResultadoXML.ResponseContent := Error
      else
        ResultadoXML.ResponseContent := 'Ok|'+Result;

      try
        dm.Free;
      except
      end;

    end;
    except on e : exception do
      begin
          if dm.trTrans.InTransaction then
          dm.trTrans.Rollback;
          Error := e.Message+' paso:'+paso;
          ResultadoXML:= GetInvocationMetadata;
          ResultadoXML.ResponseContent := Error;
          dm.IBQuery.Close;
          dm.Free;
      end;
    end;
end;

function Metodo.updateGET_CLIENTE(StrConexion:String; ClienteId:Integer; out Error:String):String;
Var I : Integer;
ResultadoXML: TDSInvocationMetadata;
begin
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';
    dm := TfrmDataModule.Create (nil);
    try
    begin
      if ((not dm.Conexion(StrConexion,Error)) or (Error <> '')) then   raise Exception.Create(Error);
      if dm.trTrans.InTransaction then   dm.trTrans.Rollback;
      dm.trTrans.StartTransaction;

      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.CLIENTE_ID,A.NOMBRE,A.CONTACTO1,B.RFC_CURP,C."PASSWORD" ');
      dm.IBQuery.SelectSQL.Add('FROM CLIENTES A ');
      dm.IBQuery.SelectSQL.Add('INNER JOIN DIRS_CLIENTES B ON (A.CLIENTE_ID = B.CLIENTE_ID) ');
      dm.IBQuery.SelectSQL.Add('INNER JOIN MGFACTURA_USUARIOS C ON ( A.CLIENTE_ID = C.CLIENTE_ID ) ');
      dm.IBQuery.SelectSQL.Add('WHERE A.CLIENTE_ID = :CLIENTE_ID AND B.ES_DIR_PPAL = ''S'' ');
      dm.IBQuery.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
      dm.IBQuery.Open;

      if not dm.IBQuery.IsEmpty then
      begin

        dm.xmlWebservice.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><Cliente></Cliente>';
        dm.xmlWebservice.Active := True;

        Cliente := GetCliente(dm.xmlWebservice);
        I := 0;
        with Cliente do
        begin
          Cliente.ClienteId := dm.IBQuery.FieldByName('CLIENTE_ID').AsInteger;
          Cliente.Nombre := AnsiLowerCase(dm.IBQuery.FieldByName('NOMBRE').AsString);
          Cliente.Contacto := AnsiLowerCase(dm.IBQuery.FieldByName('CONTACTO1').AsString);
          Cliente.Rfc := AnsiLowerCase(dm.IBQuery.FieldByName('RFC_CURP').AsString);
          Cliente.Contrasena := AnsiLowerCase(dm.IBQuery.FieldByName('PASSWORD').AsString);

          dm.IBQuery3.Close;
          dm.IBQuery3.SelectSQL.Clear;
          dm.IBQuery3.SelectSQL.Add('SELECT A.DIR_CLI_ID,A.NOMBRE_CONSIG ');
          dm.IBQuery3.SelectSQL.Add('FROM DIRS_CLIENTES A ');
          dm.IBQuery3.SelectSQL.Add('WHERE A.CLIENTE_ID = :CLIENTE_ID ');
          dm.IBQuery3.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
          dm.IBQuery3.Open;

          if not dm.IBQuery3.IsEmpty then
          begin
            Cliente.AddChild('Direcciones',5);

            while not dm.IBQuery3.Eof do
            begin
                with Direcciones.add do
                begin
                  DireccionId := dm.IBQuery3.FieldByName('DIR_CLI_ID').AsInteger;
                  NombreDireccion := AnsiLowerCase(dm.IBQuery3.FieldByName('NOMBRE_CONSIG').AsString);
                  Inc(I);
                  dm.IBQuery3.Next;
                end;
            end;
          end;
        end;

        //dm.xmlWebservice.Active := True;

        Result := dm.xmlWebservice.XML.Text;

      end else
      begin
        Error := 'El cliente indicado no existe.';
        Result := '';
      end;

      ResultadoXML:= GetInvocationMetadata;

      if Error <> '' then
        ResultadoXML.ResponseContent := Error
      else
        ResultadoXML.ResponseContent := Result;

      try
        dm.Free;
      except
      end;


    end
    except on e : exception do
      begin
          Error := e.Message;
          ResultadoXML:= GetInvocationMetadata;
          ResultadoXML.ResponseContent := Error;
          dm.IBQuery.Close;
          dm.Free;
      end;
    end;
end;

function Metodo.updateVERIFICA_TICKET(StrConexion:String; Folio:String; out Error:String; TotalPagar : Double ):String;
Var IdTicket, ClientePublicoId:Integer;
NoValidarImporte, SistemaOrigen, SistemaOrigen1 :String;
ResultadoXML: TDSInvocationMetadata;
ImtoTotal :Double;
FolioCompleto, SerieFol:String;
ValidaSucursales, TipoDoc, FolDoc, OCompra, FolioL:String;
SucursalID:Integer;
begin
    SistemaOrigen := '';
    ImtoTotal := 0;
    dm40 := TFacturaEFormV40.Create (nil);
	  try
    begin
     if ((not dm40.Conexion(StrConexion,Error)) or (Error <> '')) then    raise Exception.Create(Error);
     if dm40.trTrans.InTransaction then    dm40.trTrans.Rollback;
     dm40.trTrans.StartTransaction;

     //NoValidarImporte
    {$REGION ' lugares de expedición  '}
      dm40.IBQuery.Close;
      dm40.IBQuery.SelectSQL.Clear;
      dm40.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''NoValidarImporte'' ');
      dm40.IBQuery.Open;
      NoValidarImporte := '';
      NoValidarImporte := dm40.IBQuery.FieldByName('VALOR').AsString;
    {$ENDREGION}

    //Verifica Sistema Origen   -  Moroni 12/08/2020
    {$region 'Sistema Origen'}
      dm40.IBQuery.Close;
      dm40.IBQuery.SelectSQL.Clear;
      dm40.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''SistemaOrigen'' ');
      dm40.IBQuery.Open;
      SistemaOrigen := dm40.IBQuery.FieldByName('VALOR').AsString;
    {$endregion}

     if SistemaOrigen = '' then
         raise Exception.Create('Configure el sistema origen para continuar');

    IdTicket := 0; Error := ''; FolDoc := ''; TipoDoc := ''; OCompra := '';
    IdTicket := dm40.ValidacionesTicket(Folio, SistemaOrigen, Error, FolDoc, TipoDoc, OCompra);

    if (( IdTicket = 0) or ( Error <> '' )) then
    begin
      Raise Exception.Create(Error);
    end
    else
    begin
      if IdTicket > 0 then
      begin
        if NoValidarImporte <> 'S' then
        begin
          if dm40.ValidarImporte(IdTicket,TipoDoc,TotalPagar)<>'' then
          begin
            IdTicket := 0;
            Raise Exception.Create('El importe no coincide con el importe del ticket '+UpperCase(FolDoc)+'.');
          end;
        end;
      end;
      SistemaOrigen1 := ''; SistemaOrigen1 := SistemaOrigen;
      SistemaOrigen := TipoDoc;
      Error := ''; ClientePublicoId := 0;
      FolioL := dm40.ValidarSucursales(SistemaOrigen, SistemaOrigen1, FolDoc, ClientePublicoId, Error);
      if ( Error <> '' ) then
      begin
        Raise Exception.Create(Error);
      end;
    end;

     RESULT := IntToStr(IdTicket);

     ResultadoXML:= GetInvocationMetadata;
     ResultadoXML.ResponseContent := '';

     if Error <> '' then
        ResultadoXML.ResponseContent := Error
     else
        ResultadoXML.ResponseContent := RESULT;

     try
       dm40.Free;
     except
     end;


    end
    except on e : exception do
      begin
          Error := e.Message;
          rESULT := '0';
          ResultadoXML:= GetInvocationMetadata;
          ResultadoXML.ResponseContent := Error;
          dm40.IBQuery.Close;
          dm40.Free;
      end;
    end;
end;

function Metodo.updateGENERA_FACTURA(StrConexion:String; NumTicket:String;ConsigId : Integer; lComentario, EmailAlterno:String; LugarExp, FormaCobroId:Integer; VUsoCFDI:String; out  Error:String):String;
Var ClienteId,FolioN,DoctoPvId,IdTicket,CliTicket:Integer;
    FolioL,NombreCli,ClaveCli:String;
    TipoCambio,DsctoImpte,DsctoPctje : Double;
    CajaId,MonedaId,ClientePublicoId, DoctoID : Integer;
    Fecha : Tdate;
    MGFACTURA_USO_CFDI_ID, DoctoVeFteID :Integer;
    Resultado:String;
    MetodoPagoSAT:String;
    ResultadoXML: TDSInvocationMetadata;
    SistemaOrigen, SistemaOrigen1, ConsultaSQL, ConsultaSQL1, TipoDoc, FolDoc, OCompra :String;
    SerieFolio, ValidaSucursales, lArt:String;
    Paso, CLAVE_ART_SAT, CLAVE_MEDIDA_SAT, ARTICULO:String;
begin
    Result := '';
    ClienteId := 0; DoctoID := 0;
    DoctoPvId := 0;
    FolioN := 0;
    IdTicket := 0; DoctoVeFteID := 0;
    FolioL := '';
    MetodoPagoSAT := '';
    SistemaOrigen := '';  ConsultaSQL := ''; ConsultaSQL1 := '';  Error := '';

    Paso := '1';
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';
    dm40 := TFacturaEFormV40.Create (nil);
    try
    begin
       if ((not dm40.Conexion(StrConexion,Error)) or (Error <> '')) then
           raise Exception.Create(Error);

       if dm40.trTrans.InTransaction then
          dm40.trTrans.Rollback;
       dm40.trTrans.StartTransaction;
       Paso := '2';
      //Verifica Sistema Origen   -  Moroni 13/08/2020
      {$region 'Sistema Origen'}
        dm40.IBQuery.Close;
        dm40.IBQuery.SelectSQL.Clear;
        dm40.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''SistemaOrigen'' ');
        dm40.IBQuery.Open;
        SistemaOrigen := dm40.IBQuery.FieldByName('VALOR').AsString;
        if SistemaOrigen = '' then
           raise Exception.Create('Configure el sistema origen para continuar');
      {$endregion}
      Paso := '3';
      {$REGION '  Validaciones del documento'}
      IdTicket := 0; Error := ''; FolDoc := ''; TipoDoc := ''; OCompra := '';
      IdTicket := dm40.ValidacionesTicket(NumTicket, SistemaOrigen, Error, FolDoc, TipoDoc, OCompra);
      if (( IdTicket = 0) or ( Error <> '' )) then
      begin
        Raise Exception.Create(Error);
      end;
      SistemaOrigen1 := ''; SistemaOrigen1 := SistemaOrigen;
      SistemaOrigen := TipoDoc;

      Paso := '4';

      //VUsoCFDI
      dm40.IBQuery.Close;
      dm40.IBQuery.SelectSql.Clear;
      dm40.IBQuery.selectSql.Add('SELECT MGFACTURA_USO_CFDI_ID ');
      dm40.IBQuery.selectSql.Add('FROM MGFACTURA_USO_CFDI ');
      dm40.IBQuery.selectSql.Add('WHERE UPPER(USO_CFDI) = UPPER(:USO_CFDI) ');
      dm40.IBQuery.ParamByName('USO_CFDI').AsString := VUsoCFDI;
      dm40.IBQuery.Open;
      MGFACTURA_USO_CFDI_ID := 0;
      MGFACTURA_USO_CFDI_ID := dm40.IBQuery.FieldByName('MGFACTURA_USO_CFDI_ID').asinteger;

      if MGFACTURA_USO_CFDI_ID = 0 then
      begin
          Raise Exception.Create('El uso CFDI seleccionado no es un valido, verifique su información.');
      end;
      Paso := '5';
      {$ENDREGION}

      {$REGION 'Validaciones'}
      if SistemaOrigen = 'VM' then
      begin
          ConsultaSQL := 'SELECT A.VALOR FROM REGISTRY A WHERE A.NOMBRE = ''CLIENTE_EVENTUAL_PV_ID''  ';
          ConsultaSQL1 := 'SELECT DOCTO_PV_ID,CLIENTE_ID,ESTATUS FROM DOCTOS_PV WHERE DOCTO_PV_ID = :DOCTO_ID  ';
      end;

      if SistemaOrigen = 'RE' then
      begin
          ConsultaSQL := 'SELECT A.VALOR FROM REGISTRY A WHERE A.NOMBRE = ''CLIENTE_EVENTUAL_ID''  ';
          ConsultaSQL1 := 'SELECT A.DOCTO_VE_ID, A.ESTATUS, A.CLIENTE_ID, B.DOCTO_VE_DEST_ID FROM DOCTOS_VE A LEFT JOIN DOCTOS_VE_LIGAS B ON (B.DOCTO_VE_FTE_ID = A.DOCTO_VE_ID) WHERE A.DOCTO_VE_ID = :DOCTO_ID  ';
      end;

      if SistemaOrigen = 'PE' then
      begin
          ConsultaSQL := 'SELECT A.VALOR FROM REGISTRY A WHERE A.NOMBRE = ''CLIENTE_EVENTUAL_ID''  ';
          ConsultaSQL1 := 'SELECT A.DOCTO_VE_ID, A.ESTATUS, A.CLIENTE_ID, B.DOCTO_VE_DEST_ID FROM DOCTOS_VE A LEFT JOIN DOCTOS_VE_LIGAS B ON (B.DOCTO_VE_FTE_ID = A.DOCTO_VE_ID) WHERE A.DOCTO_VE_ID = :DOCTO_ID  ';
      end;

      Error := ''; ClientePublicoId := 0;
      FolioL := dm40.ValidarSucursales(SistemaOrigen, SistemaOrigen1, FolDoc, ClientePublicoId, Error);

      if ( Error <> '' ) then
      begin
        Raise Exception.Create(Error);
      end;


       //VERCFDI
       dm40.gVERCFDI := '';
       Paso := '8';
       dm40.gVERCFDI := dm40.GetPrefer('VERCFDI');
       Paso := '8.1';
      if dm40.gVERCFDI = '' then
          Raise Exception.Create('No se ha configurado la Versión de CFDI.');


      if  dm40.GetPrefer('ConfigOK') = 'S' then
      begin

        gUrlTimbrado := dm40.GetPrefer('DirTimbre');
        if gurltimbrado = '' then
            Raise Exception.Create('C001: No se ha configurado correctamente.');

        if NumTicket = '' then
            Raise Exception.Create('Debe indicar un ticket.');
        if ConsigId = 0 then
            Raise Exception.Create('Debe indicar una dirección válida.');
        Paso := '9';
        dm40.IBQuery.Close;
        dm40.IBQuery.SelectSQL.Clear;
        dm40.IBQuery.SelectSQL.Add(ConsultaSQL1);
        dm40.IBQuery.ParamByName('DOCTO_ID').AsInteger := IdTicket;
        dm40.IBQuery.Open;
        if SistemaOrigen = 'VM' then
        begin
            IdTicket := dm40.IBQuery.FieldByName('DOCTO_PV_ID').AsInteger;
            CliTicket := dm40.IBQuery.FieldByName('CLIENTE_ID').AsInteger;
        end;

        if SistemaOrigen = 'RE' then
        begin
            IdTicket := dm40.IBQuery.FieldByName('DOCTO_VE_ID').AsInteger;
            CliTicket := dm40.IBQuery.FieldByName('CLIENTE_ID').AsInteger;
            DoctoID := dm40.IBQuery.FieldByName('DOCTO_VE_DEST_ID').AsInteger;
            //DoctoID := DoctoVeFteID;
        end;

        if SistemaOrigen = 'PE' then
        begin
            IdTicket := dm40.IBQuery.FieldByName('DOCTO_VE_ID').AsInteger;
            CliTicket := dm40.IBQuery.FieldByName('CLIENTE_ID').AsInteger;
            DoctoID := dm40.IBQuery.FieldByName('DOCTO_VE_DEST_ID').AsInteger;
            //DoctoID := DoctoVeFteID;
        end;
        Paso := '10';

        if IdTicket = 0 then
           Raise Exception.Create('El ticket indicado no es válido');

        dm40.IBQuery.Close;
        dm40.IBQuery.SelectSQL.Clear;
        dm40.IBQuery.SelectSQL.Add('SELECT B.ESTATUS,B.CLIENTE_ID,B.NOMBRE FROM DIRS_CLIENTES A ');
        dm40.IBQuery.SelectSQL.Add('INNER JOIN CLIENTES B ON ( A.CLIENTE_ID = B.CLIENTE_ID ) ');
        dm40.IBQuery.SelectSQL.Add('WHERE A.DIR_CLI_ID = :DIR_CLI_ID ');
        dm40.IBQuery.ParamByName('DIR_CLI_ID').AsInteger := ConsigId;
        dm40.IBQuery.Open;
        NombreCli := dm40.IBQuery.FieldByName('NOMBRE').AsString;
        if dm40.IBQuery.FieldByName('ESTATUS').AsString = 'B' then
          Raise Exception.Create('El cliente está dado de baja.');
        if dm40.IBQuery.FieldByName('ESTATUS').AsString = 'V' then
          Raise Exception.Create('El cliente está suspendido de ventas.');
        if dm40.IBQuery.FieldByName('ESTATUS').AsString = 'C' then
          Raise Exception.Create('El cliente está suspendido de créditos.');

        ClienteId := dm40.IBQuery.FieldByName('CLIENTE_ID').AsInteger;
        Paso := '11';
        Error := '';
        if ClientePublicoId = CliTicket then
        begin
             ConsigId := dm40.AgregaConsig(ConsigId,ClientePublicoId,Error);
             ClienteId := ClientePublicoId;
        end;
        if (Error <> '') or (ConsigId = 0) then
          Raise Exception.Create('Error al crear al consignatario.'+'Error: '+Error);


        if CliTicket <> ClienteId then
          Raise Exception.Create('El ticket no pertenece al cliente '+NombreCli+'.');

        Error := '';
        Error := dm40.ValidarDatosCliente(ConsigId);
        if Error <> '' then
          Raise Exception.Create(Error);
        Paso := '12';
      {$ENDREGION}

        ///  Este procedimiento obtiene las rutas de los certificados y contraseña
        ///  También obtiene el link, usuario y contraseña para el servicio de timbrado
        dm40.GetDatosFac();
        Paso := '13';
      //  Raise Exception.Create('Antes de abrir sellos.');

        Error:='';
        if not dm40.AbrirSellos(dm40.gPathCertificado,dm40.gPathLlave,dm40.gContrasena,Error) then
          Raise Exception.Create(Error);

        Paso := '14';

        Error := '';
        Fecha := dm40.IBDatabase1.GETSERVERTIME;

        {$region 'Genera Docto PV'}
        if SistemaOrigen = 'VM' then
        begin
            {$REGION 'Obtiene datos encabezado'}
            dm40.dsdoctofte.Close;
            dm40.dsdoctofte.parambyname('DOCTO_PV_ID').asinteger := IdTicket;
            dm40.dsdoctofte.CloseOpen(False);
            ClaveCli := dm40.dsdoctoFte.fieldbyname('CLAVE_CLIENTE').ASSTRING;
            TipoCambio := dm40.dsdoctofte.fieldbyname('TIPO_CAMBIO').ASfloat;
            DsctoImpte := dm40.dsdoctofte.fieldbyname('DSCTO_IMPORTE').ASfloat;
            DsctoPctje := dm40.dsdoctofte.fieldbyname('DSCTO_PCTJE').ASfloat;
            CajaId := dm40.dsdoctofte.fieldbyname('CAJA_ID').AsInteger;
            MonedaId := dm40.dsdoctofte.fieldbyname('MONEDA_ID').AsInteger;
            Fecha := dm40.IBDatabase1.getservertime;
            {$ENDREGION}

            //Cambio Josue Octubre se agrego el metodo de pago SAT MetodoPagoSAT
            dm40.IBQuery.Close;
            dm40.IBQuery.SelectSQL.Clear;
            dm40.IBQuery.SelectSQL.Add('SELECT COUNT(*) CONT_FORMAS ');
            dm40.IBQuery.SelectSQL.Add('FROM DOCTOS_PV_COBROS A ');
            dm40.IBQuery.SelectSQL.Add('LEFT JOIN FORMAS_COBRO B ON ( A.FORMA_COBRO_ID = B.FORMA_COBRO_ID ) ');
            dm40.IBQuery.SelectSQL.Add('WHERE A.DOCTO_PV_ID = :DOCTO_PV_ID ');
            dm40.IBQuery.SelectSQL.Add('AND B.TIPO = ''R'' ');
            dm40.IBQuery.ParamByName('DOCTO_PV_ID').AsInteger := IdTicket;
            dm40.IBQuery.Open;

            if dm40.IBQuery.FieldByName('CONT_FORMAS').AsInteger > 0 then
              MetodoPagoSAT :='PPD'
            else
              MetodoPagoSAT :='PUE';

            //DoctoPvId := dm40.NuevaFacturaPv(FolioL,'',ClaveCli,'P','N',VUsoCFDI,TipoCambio,DsctoImpte,DsctoPctje,ClienteId,ConsigId,CajaId,MonedaId,LugarExp,Fecha,Error);
            //Cambio Josue Octubre se agrego el metodo de pago SAT MetodoPagoSAT
            DoctoPvId := dm40.NuevaFacturaPv(MetodoPagoSAT,FolioL,'',ClaveCli,'P','N',VUsoCFDI,TipoCambio,DsctoImpte,DsctoPctje,ClienteId,ConsigId,CajaId,MonedaId,LugarExp,Fecha,Error);
            if (DoctoPvId = 0) or (Error <> '') then
              Raise Exception.Create('Ocurrió un error al momento de generar la factura. '+#13+
                                    ' Error: '+Error);

            DoctoID := DoctoPvId;
            Error := '';
            ///   Copia el detalle de un documento a otro en punto de venta
            if not dm40.CopiarDetallePv(IdTicket,DoctoPvId,'S',Error) then
              Raise Exception.Create(' DetallePV Error: '+Error);

            Error := '';

            dm40.IBQuery.Close;
            dm40.IBQuery.SelectSQL.Clear;
            dm40.IBQuery.SelectSQL.Add('UPDATE DOCTOS_PV ');
            dm40.IBQuery.SelectSQL.Add('SET CLIENTE_FAC_ID = :CLIENTE_FAC_ID, ');
            dm40.IBQuery.SelectSQL.Add('    DIR_CLI_ID = :DIR_CLI_ID ');
            dm40.IBQuery.SelectSQL.Add('WHERE (DOCTO_PV_ID = :DOCTO_PV_ID); ');
            dm40.IBQuery.ParamByName('DOCTO_PV_ID').AsInteger := DoctoPvId;
            dm40.IBQuery.ParamByName('CLIENTE_FAC_ID').AsInteger := ClienteId;
            dm40.IBQuery.ParamByName('DIR_CLI_ID').AsInteger := ConsigId;
            dm40.IBQuery.Open;

            //Formas de cobro   IdTicket    DoctoPvId
            if not dm40.FormasCobroPV(IdTicket,DoctoPvId,Error) then
              Raise exception.create('FCPV_Error: '+Error);


            ///   esta función calcula los totales del documento y lo aplica
            if not dm40.AplicaDoctoPv(DoctoPvId,'N','N',Error) then
              Raise exception.create('Aplica_Error: '+Error);

            Error := '';

            dm40.dsDoctoPvDet.Close;
            dm40.dsDoctoPvDet.ParamByName('DOCTO_PV_ID').AsInteger := DoctoPvId;
            dm40.dsDoctoPvDet.Open;
            while not dm40.dsDoctoPvDet.Eof do
            begin
              CLAVE_ART_SAT:=dm40.dsDoctoPvDet.FieldByName('CLAVE_ART_SAT').AsString;
              CLAVE_MEDIDA_SAT:=dm40.dsDoctoPvDet.FieldByName('CLAVE_ART_SAT').AsString;
              ARTICULO:=dm40.dsDoctoPvDet.FieldByName('ARTICULO').AsString;
              if (CLAVE_ART_SAT='') then
              begin
                Error:='CLAVE_ART_SAT';
                Raise Exception.Create('La clave SAT del artículo '+ARTICULO+' es incorrecta.');
              end;

              if (CLAVE_MEDIDA_SAT='') then
              begin
                Error:='CLAVE_MEDIDA_SAT';
                Raise Exception.Create('La clave SAT de la unidad de medida del artículo '+ARTICULO+' es incorrecta.');
              end;

              dm40.dsDoctoPvDet.Next;
            end;

            if (dm40.GeneraXmlPv40(DoctoPvId,'F',Error) = '') or (Error <> '') then
                    Raise Exception.Create('Ocurrió un error al momento de generar Xml de la factura electrónica. '+#13+' Error: '+Error);

            ConsultaSQL := 'SELECT A.FOLIO FROM USOS_FOLIOS_FISCALES A WHERE A.DOCTO_ID = :DOCTO_ID AND A.SISTEMA = ''PV''  ';
        end;
        {$endregion}

        {$region 'Genera XML Ventas [PE] '}
        Paso := '16';
        if (SistemaOrigen = 'RE') or (SistemaOrigen = 'PE') then
        begin
            DoctoID := 0;

            DoctoID :=  dm40.CreaDoctoVe(IdTicket, LugarExp, ConsigId, FormaCobroId, FolioL, VUsoCFDI, lComentario, Error);
            if DoctoID = 0 then
              raise Exception.Create('EncVE_'+Error);

            ConsultaSQL := 'SELECT A.FOLIO FROM USOS_FOLIOS_FISCALES A WHERE A.DOCTO_ID = :DOCTO_ID AND A.SISTEMA = ''VE''  ';

        end;
        Paso := '17';
        {$endregion}

        {$REGION 'Obtener Folio'}
        dm40.IBQuery.close;
        dm40.IBQuery.selectsql.clear;
        dm40.IBQuery.selectsql.add(ConsultaSQL);
        dm40.IBQuery.ParamByName('DOCTO_ID').ASINTEGER := DoctoID;
        dm40.IBQuery.open;
        FolioN := dm40.IBQuery.FieldByName('FOLIO').ASINTEGER;
        {$ENDREGION}
        Paso := '18';
        if dm40.trTrans.InTransaction then
          dm40.trTrans.Commit;

        dm40.trTrans.StartTransaction;

        Error := '';
        dm40.CertificateValidator.InitializeWinStorages;
        Paso := '19';
       if (not dm40.TimbrarFac40(DoctoID, SistemaOrigen, dm40.gUrlTimbre,dm40.gUsuarioTimbre,dm40.gPassTimbre,FolioL+IntToStr(FolioN),Error) ) or (Error <> '') then
             Raise Exception.Create('Error: La factura se generó correctamente, pero no se timbró mas tarde se le enviará. '+Error);


        if dm40.trTrans.InTransaction then   dm40.trTrans.Commit;
        dm40.trTrans.StartTransaction;

        //Raise Exception.Create('Ok|'+dm40.FolioFacVENuew+'|'+dm40.gEmailEnvio);
        Paso := '20';
        //Función para el envío de facturas
        if (SistemaOrigen = 'RE') or (SistemaOrigen = 'PE') then
        begin
            if (not dm40.EnviaFacturas(DoctoID,FolioL+IntToStr(FolioN),'VE',EmailAlterno,Error)) or (Error <> '') then
               Raise Exception.Create('Ocurrió un error al momento enviar la factura: '+Error);
        end;
        if SistemaOrigen = 'VM' then
        begin
            if (not dm40.EnviaFacturas(DoctoID,FolioL+IntToStr(FolioN),'PV',EmailAlterno,Error)) or (Error <> '') then
                Raise Exception.Create('Ocurrió un error al momento enviar la factura: '+Error);
        end;
        Paso := '21';
        Result := 'Ok|'+dm40.FolioFacVENuew+'|'+dm40.gEmailEnvio;
        Error := '';

      end else
      begin
        Result := '';
        Raise Exception.Create('C001: No se ha configurado correctamente.');
      end;

      ResultadoXML:= GetInvocationMetadata;
      ResultadoXML.ResponseContent := '';

      if Error <> '' then
        ResultadoXML.ResponseContent := Error
      else
        ResultadoXML.ResponseContent := 'Ok|'+dm40.FolioFacVENuew+'|'+dm40.gEmailEnvio;

      try
        dm40.Free;
      except
      end;

    end
    except on e : exception do
      begin
          Error := e.Message;
          Result := '';
          try
            begin
              dm40.ExportPDF.Free;
            end;
          except
            begin
            end;
          end;

          ResultadoXML:= GetInvocationMetadata;
          ResultadoXML.ResponseContent := '';
          ResultadoXML.ResponseContent := Error+' - '+Paso;
          try
            begin
               if dm40.trTrans.InTransaction then
                  dm40.trTrans.Rollback;
            end;
          except
            begin
            end;
          end;


          try
            begin
              dm40.Free;
            end;
          except
            begin
            end;
          end;

      end;
    end;
end;

function Metodo.updateREGISTRA_DIRECCION(StrConexion:String; NuevaDireccion:WideString; out Error:String):String;
Var DirCliId, CiudadId, PaisId : Integer;
CalleDirCli,RfcCorrecto,Res:String;
ResultadoXML: TDSInvocationMetadata;
CadenaRespuesta:String;
begin
    Result := '';
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';
    dm := TfrmDataModule.Create (nil);
    try
    begin
      if ((not dm.Conexion(StrConexion,Error)) or (Error <> '')) then   raise Exception.Create(Error);
      if dm.trTrans.InTransaction then   dm.trTrans.Rollback;
      dm.trTrans.StartTransaction;

      dm.xmlWebservice.XML.Text := NuevaDireccion;
      NuevaDir := GetNuevaDireccion(dm.xmlWebservice);

      with NuevaDir do
      begin

         {$REGION 'Validaciones'}
           dm.IBQuery.Close;
           dm.IBQuery.SelectSQL.Clear;
           dm.IBQuery.SelectSQL.Add('SELECT A.DIR_CLI_ID FROM DIRS_CLIENTES A ');
           dm.IBQuery.SelectSQL.Add('WHERE UPPER(A.NOMBRE_CONSIG) = UPPER(:NOMBRE_CONSIG) AND A.CLIENTE_ID = :CLIENTE_ID ');
           dm.IBQuery.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
           dm.IBQuery.ParamByName('NOMBRE_CONSIG').AsString := Nombre;
           dm.IBQuery.Open;

           if dm.IBQuery.FieldByName('DIR_CLI_ID').AsInteger <> 0 then
             Raise Exception.Create('Este consignatario ya se encuentra registrado.');

           dm.IBQuery.Close;
           dm.IBQuery.SelectSQL.Clear;
           dm.IBQuery.SelectSQL.Add('SELECT CLIENTE_ID FROM CLIENTES WHERE CLIENTE_ID = :CLIENTE_ID ');
           dm.IBQuery.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
           dm.IBQuery.Open;

           if dm.IBQuery.FieldByName('CLIENTE_ID').AsInteger = 0 then
              Raise Exception.Create('El cliente indicado no existe.');

           if Nombre = '' then
              Raise Exception.Create('No se indicó el nombre.');

          RfcCorrecto := dm.ValidaCadena(RFC);

          Res := dm.ValidarRFC(RfcCorrecto);
          if Res <> '' then
              Raise Exception.Create(Res);

           if Trim(RfcCorrecto) = '' then
              Raise Exception.Create('No se indicó el RFC.');
           {// Cambio Noviembre: No son campos requeridos para la creacion de factura
           if Trim(Calle) = '' then
              Raise Exception.Create('No se indicó la calle.');

           if Trim(NumExt) = '' then
              Raise Exception.Create('No se indicó el número exterior.');

           if Trim(Colonia) = '' then
              Raise Exception.Create('No se indicó la colonia.');

           if Trim(Ciudad) = '' then
              Raise Exception.Create('No se indicó la ciudad.');
           }
           dm.IBQuery.Close;
           dm.IBQuery.SelectSQL.Clear;
           dm.IBQuery.SelectSQL.Add('SELECT ESTADO_ID FROM ESTADOS WHERE ESTADO_ID = :ESTADO_ID ');
           dm.IBQuery.ParamByName('ESTADO_ID').AsInteger := IdEstado;
           dm.IBQuery.Open;

           {// Cambio Noviembre: No son campos requeridos para la creacion de factura
           if dm.IBQuery.FieldByName('ESTADO_ID').AsInteger = 0 then
              Raise Exception.Create('No existe el estado indicado.');

           if Trim(Telefono) = '' then
              Raise Exception.Create('No se indicó el teléfono.');
            }

           if Trim(TipoReg) = '' then
              Raise Exception.Create('No se indicó el tipo de persona.');

           if Trim(RegFis) = '' then
              Raise Exception.Create('No se indicó el régimen fiscal.');

           if Trim(Email) = '' then
              Raise Exception.Create('No se indicó el correo electrónico.');

           if Trim(CodigoPostal) = '' then
              Raise Exception.Create('No se indicó el código postal.');


         {$ENDREGION}

         {$REGION 'Validacion longitud'}
           if (length(trim(Nombre)) > 200)  then
               Raise Exception.Create('El nombre excede el tamaño máximo.');
           if (length(Trim(Contacto))>50) then
               Raise Exception.Create('El contacto excede el tamaño máximo.');
           if (length(Trim(RFC))>18) then
               Raise Exception.Create('El R.F.C. excede el tamaño máximo.');
           if (length(Trim(Calle)) > 100) then
               Raise Exception.Create('La calle excede el tamaño máximo.');
           if (length(Trim(NumExt))>10) then
               Raise Exception.Create('El número exterior excede el tamaño máximo.');
           if (length(Trim(NumInt))>10) then
               Raise Exception.Create('El número interior excede el tamaño máximo.');
           if (length(Trim(Colonia))>100) then
               Raise Exception.Create('La colonia excede el tamaño máximo.');
           if (length(Trim(Poblacion))>100) then
               Raise Exception.Create('La población excede el tamaño máximo.');
           if (length(Trim(Referencia))>100) then
               Raise Exception.Create('La referencia excede el tamaño máximo.');
           if (length(Trim(Ciudad))>50) then
               Raise Exception.Create('La ciudad excede el tamaño máximo.');
           if (length(Trim(CodigoPostal))>10) then
               Raise Exception.Create('El código postal excede el tamaño máximo.');
           if (length(Trim(Telefono))>35) then
               Raise Exception.Create('El teléfono excede el tamaño máximo.');
           if (length(Trim(Email))>200) then
               Raise Exception.Create('El correo electrónico excede el tamaño máximo.');
         {$ENDREGION}

          {$REGION 'Obtener datos importantes'}
          dm.IBQuery4.Close;
          dm.IBQuery4.SelectSQL.Clear;
          dm.IBQuery4.SelectSQL.Add('SELECT CIUDAD_ID FROM CIUDADES WHERE UPPER( NOMBRE ) = :NOMBRE ');
          dm.IBQuery4.ParamByName('NOMBRE').AsString := AnsiUpperCase(Ciudad);
          dm.IBQuery4.Open;
          CiudadId := dm.IBQuery4.FieldByName('CIUDAD_ID').AsInteger;
          if CiudadId = 0 then
          begin
            if AnsiUpperCase(Ciudad) <> '' then
            begin
              dm.spGenCatId.ExecProc;
              CiudadId := dm.spGenCatId.FieldByName('CATALOGO_ID').AsInteger;

              dm.IBQuery4.Close;
              dm.IBQuery4.SelectSQL.Clear;
              dm.IBQuery4.SelectSQL.Add('INSERT INTO CIUDADES (CIUDAD_ID, NOMBRE, ES_PREDET, ESTADO_ID, ');
              dm.IBQuery4.SelectSQL.Add('USUARIO_CREADOR, FECHA_HORA_CREACION, USUARIO_AUT_CREACION, ');
              dm.IBQuery4.SelectSQL.Add('USUARIO_ULT_MODIF, FECHA_HORA_ULT_MODIF, USUARIO_AUT_MODIF) VALUES ');
              dm.IBQuery4.SelectSQL.Add('(:CIUDAD_ID, :NOMBRE, :ES_PREDET, :ESTADO_ID, ');
              dm.IBQuery4.SelectSQL.Add(':USUARIO_CREADOR, :FECHA_HORA_CREACION, :USUARIO_AUT_CREACION, ');
              dm.IBQuery4.SelectSQL.Add(':USUARIO_ULT_MODIF, :FECHA_HORA_ULT_MODIF, :USUARIO_AUT_MODIF); ');
              dm.IBQuery4.ParamByName('CIUDAD_ID').AsInteger := CiudadId;
              dm.IBQuery4.ParamByName('NOMBRE').AsString := AnsiUpperCase(Ciudad);
              dm.IBQuery4.ParamByName('ES_PREDET').AsString := 'N';
              dm.IBQuery4.ParamByName('ESTADO_ID').AsInteger := IdEstado;
              dm.IBQuery4.ParamByName('USUARIO_CREADOR').AsString := AnsiUpperCase(dm.IBDatabase1.ConnectParams.UserName);
              dm.IBQuery4.ParamByName('FECHA_HORA_CREACION').AsDateTime := dm.IBDatabase1.GetServerTime;
              dm.IBQuery4.ParamByName('USUARIO_AUT_CREACION').Clear;
              dm.IBQuery4.ParamByName('USUARIO_ULT_MODIF').Clear;
              dm.IBQuery4.ParamByName('FECHA_HORA_ULT_MODIF').Clear;
              dm.IBQuery4.ParamByName('USUARIO_AUT_MODIF').Clear;
              dm.IBQuery4.Open;
            end;
          end;

          if IdEstado > 0 then
          begin
          dm.IBQuery4.Close;
          dm.IBQuery4.SelectSQL.Clear;
          dm.IBQuery4.SelectSQL.Add('SELECT PAIS_ID FROM ESTADOS WHERE UPPER( ESTADO_ID ) = :ESTADO_ID ');
          dm.IBQuery4.ParamByName('ESTADO_ID').AsInteger := IdEstado;
          dm.IBQuery4.Open;
          PaisId := dm.IBQuery4.FieldByName('PAIS_ID').AsInteger;
          end else
             PaisId := 0;
          {$ENDREGION}

          {$REGION 'Dirección'}
          dm.IBQuery2.Close;
          dm.IBQuery2.SelectSQL.Clear;
          dm.IBQuery2.SelectSQL.Add('INSERT INTO DIRS_CLIENTES (DIR_CLI_ID, CLIENTE_ID, NOMBRE_CONSIG, ');
          dm.IBQuery2.SelectSQL.Add('CALLE, NOMBRE_CALLE, NUM_EXTERIOR, NUM_INTERIOR, COLONIA, POBLACION, ');
          dm.IBQuery2.SelectSQL.Add('REFERENCIA, CIUDAD_ID, ESTADO_ID, CODIGO_POSTAL, PAIS_ID, TELEFONO1, ');
          dm.IBQuery2.SelectSQL.Add('TELEFONO2, FAX, EMAIL, RFC_CURP, CONTACTO, VIA_EMBARQUE_ID, ES_DIR_PPAL, ');
          dm.IBQuery2.SelectSQL.Add('USAR_PARA_ENVIOS, USAR_PARA_FACTURAR, GLN, TIPO_PERSONA, CLAVE_REGIMEN_FISCAL) VALUES ');
          dm.IBQuery2.SelectSQL.Add('( :DIR_CLI_ID, :CLIENTE_ID, :NOMBRE_CONSIG, ');
          dm.IBQuery2.SelectSQL.Add(':CALLE, :NOMBRE_CALLE, :NUM_EXTERIOR, :NUM_INTERIOR, :COLONIA, :POBLACION, ');
          dm.IBQuery2.SelectSQL.Add(':REFERENCIA, :CIUDAD_ID, :ESTADO_ID, :CODIGO_POSTAL, :PAIS_ID, :TELEFONO1, ');
          dm.IBQuery2.SelectSQL.Add(':TELEFONO2, :FAX, :EMAIL, :RFC_CURP, :CONTACTO, :VIA_EMBARQUE_ID, :ES_DIR_PPAL, ');
          dm.IBQuery2.SelectSQL.Add(':USAR_PARA_ENVIOS, :USAR_PARA_FACTURAR, :GLN, :TIPO_PERSONA, :CLAVE_REGIMEN_FISCAL); ');
          dm.spGenCatId.ExecProc;
          DirCliId := dm.spGenCatId.FieldByName('CATALOGO_ID').AsInteger;

          CalleDirCli := '';

          CalleDirCli := Calle+' '+NumExt;

          if NumInt <> '' then
              CalleDirCli := CalleDirCli+' '+NumInt;

          CalleDirCli := CalleDirCli+#13+Colonia;

          if Poblacion <> '' then
              CalleDirCli := CalleDirCli+' '+Poblacion;

          if Referencia <> '' then
              CalleDirCli := CalleDirCli+#13+Referencia;

          dm.IBQuery2.ParamByName('DIR_CLI_ID').AsInteger := DirCliId;
          dm.IBQuery2.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
          dm.IBQuery2.ParamByName('NOMBRE_CONSIG').AsString := AnsiUpperCase(Nombre);
          dm.IBQuery2.ParamByName('CALLE').AsString := AnsiUpperCase(CalleDirCli);
          dm.IBQuery2.ParamByName('NOMBRE_CALLE').AsString := AnsiUpperCase(Calle);
          dm.IBQuery2.ParamByName('NUM_EXTERIOR').AsString := AnsiUpperCase(NumExt);
          dm.IBQuery2.ParamByName('NUM_INTERIOR').AsString := AnsiUpperCase(NumInt);
          dm.IBQuery2.ParamByName('COLONIA').AsString := AnsiUpperCase(Colonia);
          dm.IBQuery2.ParamByName('POBLACION').AsString := AnsiUpperCase(Poblacion);
          dm.IBQuery2.ParamByName('REFERENCIA').AsString := AnsiUpperCase(Referencia);
          if CiudadId > 0 then
              dm.IBQuery2.ParamByName('CIUDAD_ID').AsInteger := CiudadId
          else
              dm.IBQuery2.ParamByName('CIUDAD_ID').Clear;

          if IdEstado > 0 then
              dm.IBQuery2.ParamByName('ESTADO_ID').AsInteger := IdEstado
          else
              dm.IBQuery2.ParamByName('ESTADO_ID').Clear;

          dm.IBQuery2.ParamByName('CODIGO_POSTAL').AsString := AnsiUpperCase(CodigoPostal);

          if PaisId > 0 then
              dm.IBQuery2.ParamByName('PAIS_ID').AsInteger := PaisId
          else
              dm.IBQuery2.ParamByName('PAIS_ID').Clear;

          dm.IBQuery2.ParamByName('TELEFONO1').AsString := AnsiUpperCase(Telefono);
          dm.IBQuery2.ParamByName('TELEFONO2').Clear;
          dm.IBQuery2.ParamByName('FAX').Clear;
          dm.IBQuery2.ParamByName('EMAIL').AsString := Email;
          dm.IBQuery2.ParamByName('RFC_CURP').AsString := AnsiUpperCase(RfcCorrecto);

          if Contacto <> '' then
            dm.IBQuery2.ParamByName('CONTACTO').AsString := AnsiUpperCase(Contacto)
          else
            dm.IBQuery2.ParamByName('CONTACTO').Clear;

          dm.IBQuery2.ParamByName('VIA_EMBARQUE_ID').Clear;
          dm.IBQuery2.ParamByName('ES_DIR_PPAL').AsString := 'N';
          dm.IBQuery2.ParamByName('USAR_PARA_ENVIOS').AsString := 'S';
          dm.IBQuery2.ParamByName('USAR_PARA_FACTURAR').AsString := 'S';
          dm.IBQuery2.ParamByName('TIPO_PERSONA').AsString := AnsiUpperCase(TipoReg);
          dm.IBQuery2.ParamByName('CLAVE_REGIMEN_FISCAL').AsString := AnsiUpperCase(RegFis);
          dm.IBQuery2.Open;

          Error := '';
          if dm.InsertRFCS_LCO(RfcCorrecto, Nombre, CodigoPostal, Error ) then
          begin
            //raise Exception.Create(Error);
          end;

          {$ENDREGION}

          Result := IntToStr(DirCliId);

          if dm.trTrans.InTransaction then
             dm.trTrans.Commit;




          CadenaRespuesta := '';
          CadenaRespuesta := '<?xml version="1.0" encoding="UTF-8"?>';
          CadenaRespuesta := CadenaRespuesta+'<Respuesta>';
          CadenaRespuesta := CadenaRespuesta+'<CreaDireccion>';
          CadenaRespuesta := CadenaRespuesta+'<DireccionID>'+Result+'</DireccionID>';
          CadenaRespuesta := CadenaRespuesta+'<Error>'+Error+'</Error>';
          CadenaRespuesta := CadenaRespuesta+'</CreaDireccion></Respuesta>';

          ResultadoXML:= GetInvocationMetadata;
          ResultadoXML.ResponseContent := '';
          ResultadoXML.ResponseContent := CadenaRespuesta;

        // end;
      end;

      try
        dm.Free;
      except
      end;

    end
    except on e : exception do
      begin
          Error := e.Message;
          if dm.trTrans.InTransaction then  dm.trTrans.Rollback;
          Result := '';

          CadenaRespuesta := '';
          CadenaRespuesta := '<?xml version="1.0" encoding="UTF-8"?>';
          CadenaRespuesta := CadenaRespuesta+'<Respuesta>';
          CadenaRespuesta := CadenaRespuesta+'<CreaDireccion>';
          CadenaRespuesta := CadenaRespuesta+'<DireccionID>'+Result+'</DireccionID>';
          CadenaRespuesta := CadenaRespuesta+'<Error>'+Error+'</Error>';
          CadenaRespuesta := CadenaRespuesta+'</CreaDireccion></Respuesta>';

          ResultadoXML:= GetInvocationMetadata;
          ResultadoXML.ResponseContent := '';
          ResultadoXML.ResponseContent := CadenaRespuesta;

          dm.IBQuery.Close;
          dm.Free;
      end;
    end;
end;

function Metodo.updateGET_FACTURAS_CLI(StrConexion:String; ClienteId:Integer; out Error:String ):String;
Var
Integ_Ve_CC,Integ_Pv_Pv,SoloLiq:String;
VersionCan,NumSuc : Integer;
ResultadoXML: TDSInvocationMetadata;
ErrorLic, ErrorCan:String;
begin
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';

    try
    begin
      ErrorLic := '';
      ErrorCan := '';
      ErrorLic := ValidaLicencia(StrConexion);

      dm := TfrmDataModule.Create (nil);

      if ((not dm.Conexion(StrConexion,Error)) or (Error <> '')) then   raise Exception.Create(Error);
      if dm.trTrans.InTransaction then   dm.trTrans.Rollback;
      dm.trTrans.StartTransaction;

      Error := '';
      Result := '';
      dm.xmlWebservice.XML.Text := '';

      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT VALOR FROM REGISTRY WHERE NOMBRE = ''INTEG_CC_PV'' ');
      dm.IBQuery.Open;
      Integ_Pv_Pv := dm.IBQuery.FieldByName('VALOR').AsString;

      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT VALOR FROM REGISTRY WHERE NOMBRE = ''INTEG_CC'' ');
      dm.IBQuery.Open;
      Integ_Ve_CC := dm.IBQuery.FieldByName('VALOR').AsString;

      SoloLiq := dm.GetPrefer('SoloFactLiquidadas');
      if (SoloLiq = '') then
        SoloLiq := 'N';


      if ErrorLic <> 'Ok' then
      begin
          ErrorCan := LeerCandado(VersionCan,NumSuc);
      end else
        VersionCan := 1;

      if VersionCan = 0 then
      begin
        dm.IBQuery.Close;
        dm.IBQuery.SelectSQL.Clear;
        dm.IBQuery.SelectSQL.Add('SELECT FIRST 1 A.DOCTO_ID,A.ESTATUS,A.FOLIO,A.FECHA,A.IMPORTE_NETO, ');
        dm.IBQuery.SelectSQL.Add('A.IMPORTE_DONATIVO,A.TOTAL_IMPUESTOS,A.TOTAL_DSCTO_PPAG, ');
        dm.IBQuery.SelectSQL.Add('A.NOMBRE_CLIENTE,A.ALMACEN_ID ');
        dm.IBQuery.SelectSQL.Add('FROM MGFACTURAS_GET_FACTURAS_CLI( :CLIENTE_ID , :SOLO_LIQUIDADAS ) A ');
        dm.IBQuery.SelectSQL.Add('ORDER BY A.FECHA DESC,A.FOLIO DESC ');
        dm.IBQuery.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
        dm.IBQuery.ParamByName('SOLO_LIQUIDADAS').AsString := SoloLiq;
        dm.IBQuery.open;

        if not dm.IBQuery.IsEmpty then
        begin
          dm.xmlWebservice.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><Facturas></Facturas>';
          dm.xmlWebservice.Active := True;
          FacturasCliente := GetFacturas(dm.xmlWebservice);
          with FacturasCliente do
          begin
           while not dm.IBQuery.Eof do
           begin
            with FacturasCliente.Add do
            begin
              DoctoPvId := dm.IBQuery.FieldByName('DOCTO_ID').AsInteger;
              Cliente := AnsiLowerCase(dm.IBQuery.FieldByName('NOMBRE_CLIENTE').AsString);
              Folio := dm.IBQuery.FieldByName('FOLIO').AsString;
              Fecha := FormatDateTime('DD/MM/YYYY',dm.IBQuery.FieldByName('FECHA').AsDateTime);
            end;
            dm.IBQuery.Next;
           end;
          end;
          Result := dm.xmlWebservice.XML.Text;
        end;

        Error := '';
      end else
      begin
        dm.IBQuery.Close;
        dm.IBQuery.SelectSQL.Clear;
        dm.IBQuery.SelectSQL.Add('SELECT A.DOCTO_ID,A.ESTATUS,A.FOLIO,A.FECHA,A.IMPORTE_NETO, ');
        dm.IBQuery.SelectSQL.Add('A.IMPORTE_DONATIVO,A.TOTAL_IMPUESTOS,A.TOTAL_DSCTO_PPAG, ');
        dm.IBQuery.SelectSQL.Add('A.NOMBRE_CLIENTE,A.ALMACEN_ID ');
        dm.IBQuery.SelectSQL.Add('FROM MGFACTURAS_GET_FACTURAS_CLI( :CLIENTE_ID , :SOLO_LIQUIDADAS ) A ');
        dm.IBQuery.SelectSQL.Add('ORDER BY A.FECHA DESC,A.FOLIO DESC ');
        dm.IBQuery.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
        dm.IBQuery.ParamByName('SOLO_LIQUIDADAS').AsString := SoloLiq;
        dm.IBQuery.open;

        if not dm.IBQuery.IsEmpty then
        begin
          dm.xmlWebservice.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><Facturas></Facturas>';
          dm.xmlWebservice.Active := True;
          FacturasCliente := GetFacturas(dm.xmlWebservice);
          with FacturasCliente do
          begin
           while not dm.IBQuery.Eof do
           begin
            with FacturasCliente.Add do
            begin
              DoctoPvId := dm.IBQuery.FieldByName('DOCTO_ID').AsInteger;
              Cliente := AnsiLowerCase(dm.IBQuery.FieldByName('NOMBRE_CLIENTE').AsString);
              Folio := dm.IBQuery.FieldByName('FOLIO').AsString;
              Fecha := FormatDateTime('DD/MM/YYYY',dm.IBQuery.FieldByName('FECHA').AsDateTime);
            end;
            dm.IBQuery.Next;
           end;
          end;
          Result := dm.xmlWebservice.XML.Text;
        end;

        Error := '';
      end;

      if dm.xmlWebservice.XML.Text = '' then
      begin
        Error := 'El cliente no tiene facturas.';
        Result := '';
      end else
      begin

      end;

      Error := '';
      Result := '';
      Result := dm.xmlWebservice.XML.Text;

      ResultadoXML:= GetInvocationMetadata;
      ResultadoXML.ResponseContent := '';
      ResultadoXML.ResponseContent := Result;

      try
        dm.Free;
      except
      end;

    end
    except on e : exception do
      begin
          Error := e.Message;
          ResultadoXML:= GetInvocationMetadata;
          ResultadoXML.ResponseContent := '';
          ResultadoXML.ResponseContent := '<Error>'+Error+'</Error>';
          dm.IBQuery.Close;
          dm.Free;
      end;
    end;
end;

function Metodo.updateGET_DIRECCION(StrConexion:String; DirCliId:Integer; Var Error:String):String;
Var I : Integer;
ResultadoXML: TDSInvocationMetadata;
begin
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';
    dm := TfrmDataModule.Create (nil);

	  try
    begin
      if ((not dm.Conexion(StrConexion,Error)) or (Error <> '')) then   raise Exception.Create(Error);
      if dm.trTrans.InTransaction then   dm.trTrans.Rollback;
      dm.trTrans.StartTransaction;

      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.DIR_CLI_ID,A.NOMBRE_CONSIG,A.NOMBRE_CALLE,A.NUM_EXTERIOR,A.NUM_INTERIOR, ');
      dm.IBQuery.SelectSQL.Add('A.COLONIA,A.POBLACION,A.CODIGO_POSTAL,A.EMAIL,B.NOMBRE CIUDAD,C.NOMBRE ESTADO, ');
      dm.IBQuery.SelectSQL.Add('D.NOMBRE PAIS,A.TELEFONO1,A.REFERENCIA ');
      dm.IBQuery.SelectSQL.Add('FROM DIRS_CLIENTES A ');
      dm.IBQuery.SelectSQL.Add('LEFT JOIN CIUDADES B ON ( A.CIUDAD_ID = B.CIUDAD_ID ) ');
      dm.IBQuery.SelectSQL.Add('LEFT JOIN ESTADOS C ON ( C.ESTADO_ID = B.ESTADO_ID ) ');
      dm.IBQuery.SelectSQL.Add('LEFT JOIN PAISES D ON ( D.PAIS_ID = C.PAIS_ID ) ');
      dm.IBQuery.SelectSQL.Add('WHERE A.DIR_CLI_ID = :DIR_CLI_ID ');
      dm.IBQuery.ParamByName('DIR_CLI_ID').AsInteger := DirCliId;
      dm.IBQuery.Open;

      if not dm.IBQuery.IsEmpty then
      begin

        dm.xmlWebservice.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><Direccion></Direccion>';
        dm.xmlWebservice.Active := True;

        DirCliente := GetDireccion(dm.xmlWebservice);
        I := 0;
        with DirCliente do
        begin
          DireccionId := dm.IBQuery.FieldByName('DIR_CLI_ID').AsInteger;
          NombreDireccion := AnsiLowerCase(dm.IBQuery.FieldByName('NOMBRE_CONSIG').AsString);
          Calle := AnsiLowerCase(dm.IBQuery.FieldByName('NOMBRE_CALLE').AsString);
          NumExterior := AnsiLowerCase(dm.IBQuery.FieldByName('NUM_EXTERIOR').AsString);
          NumInterior := AnsiLowerCase(dm.IBQuery.FieldByName('NUM_INTERIOR').AsString);
          Colonia := AnsiLowerCase(dm.IBQuery.FieldByName('COLONIA').AsString);
          Poblacion := AnsiLowerCase(dm.IBQuery.FieldByName('POBLACION').AsString);
          Ciudad := AnsiLowerCase(dm.IBQuery.FieldByName('CIUDAD').AsString);
          Estado := AnsiLowerCase(dm.IBQuery.FieldByName('ESTADO').AsString);
          Pais := AnsiLowerCase(dm.IBQuery.FieldByName('PAIS').AsString);
          CodigoPostal := AnsiLowerCase(dm.IBQuery.FieldByName('CODIGO_POSTAL').AsString);
          Telefono := AnsiLowerCase(dm.IBQuery.FieldByName('TELEFONO1').AsString);
          Referencia := AnsiLowerCase(dm.IBQuery.FieldByName('REFERENCIA').AsString);
          Email := AnsiLowerCase(dm.IBQuery.FieldByName('EMAIL').AsString);
        end;

        dm.xmlWebservice.Active := True;
        Result := dm.xmlWebservice.XML.Text;

      end else
      begin
        Error := 'El cliente indicado no existe.';
        Result := '';
      end;

      ResultadoXML:= GetInvocationMetadata;
      ResultadoXML.ResponseContent := '';

      if Error <> '' then
         ResultadoXML.ResponseContent := '<Error>'+Error+'</Error>'
      else
        ResultadoXML.ResponseContent := Result;

      try
        dm.Free;
      except
      end;


    end
    except on e : exception do
      begin
          Error := e.Message;
          ResultadoXML:= GetInvocationMetadata;
          ResultadoXML.ResponseContent := '';
          ResultadoXML.ResponseContent := '<Error>'+Error+'</Error>';
          dm.IBQuery.Close;
          dm.Free;
      end;
    end;
end;

function Metodo.updateGET_PDF_XML(StrConexion:String; DoctoPvId:Integer; TipoArchivo:String; var Error:String):String;
Var TOTAL_LETRA,Folio,PdfPath,XmlPath,Modulo,ModalidadFact : String;
TotalPagar : Double;
VerSML, RutaReportes:String;
ResultadoXML: TDSInvocationMetadata;
begin
Error := '';
Result := '';
try
 begin
  System.sysutils.decimalseparator:='.';
  System.sysutils.ThousandSeparator:=',';
  dm40 := TFacturaEFormV40.Create (nil);

  if ((not dm40.Conexion(StrConexion,Error)) or (Error <> '')) then   raise Exception.Create(Error);
  if dm40.trTrans.InTransaction then   dm40.trTrans.Rollback;
  dm40.trTrans.StartTransaction;

  Error := '';
  Result := '';
  TOTAL_LETRA := '';                  Folio := '';
  PdfPath := '';                      XmlPath := '';
  Modulo := '';                       ModalidadFact := '';
  TotalPagar := 0;
  dm40.gVERCFDI := '';
  dm40.gVERCFDI := dm40.GetPrefer('VERCFDI');

  dm40.IBQuery.Close;
  dm40.IBQuery.SelectSQL.Clear;
  dm40.IBQuery.SelectSQL.Add('SELECT A.SISTEMA,A.XML ');
  dm40.IBQuery.SelectSQL.Add('FROM USOS_FOLIOS_FISCALES A ');
  dm40.IBQuery.SelectSQL.Add('WHERE A.DOCTO_ID = :DOCTO_ID ');
  dm40.IBQuery.ParamByName('DOCTO_ID').ASINTEGER := DoctoPvId;
  dm40.IBQuery.Open;
  Modulo := dm40.IBQuery.FieldByName('SISTEMA').AsString;

  if (dm40.IBQuery.FieldByName('XML').AsString = '') then
     raise exception.create('No existe el XML del documento indicado.');

  if (Modulo = 'VE') then
  begin
    dm40.IBQuery.Close;
    dm40.IBQuery.SelectSQL.Clear;
    dm40.IBQuery.SelectSQL.Add('SELECT TOTAL_A_PAGAR FROM CALC_TOTALES_DOCTO_VE (:DOCTO_VE_ID, ''S'' ) ');
    dm40.IBQuery.ParamByName('DOCTO_VE_ID').ASINTEGER := DoctoPvId;
    dm40.IBQuery.Open;
    TotalPagar := dm40.IBQuery.FieldByName('TOTAL_A_PAGAR').asfloat;
    TOTAL_LETRA := dm40.NUMLET(dm40.IBQuery.FieldByName('TOTAL_A_PAGAR').asfloat,1,1);

    dm40.IBQuery.Close;
    dm40.IBQuery.SelectSQL.Clear;
    dm40.IBQuery.SelectSQL.Add('SELECT A.DOCTO_VE_ID,B.XML,A.FOLIO,A.MODALIDAD_FACTURACION ');
    dm40.IBQuery.SelectSQL.Add('FROM DOCTOS_VE A ');
    dm40.IBQuery.SelectSQL.Add('INNER JOIN USOS_FOLIOS_FISCALES B ON ( A.DOCTO_VE_ID = B.DOCTO_ID ) ');
    dm40.IBQuery.SelectSQL.Add('WHERE A.TIPO_DOCTO = ''F'' AND A.DOCTO_VE_ID = :DOCTO_VE_ID ');
    dm40.IBQuery.ParamByName('DOCTO_VE_ID').AsInteger := DoctoPvId;
    dm40.IBQuery.Open;
    Folio :=  dm40.IBQuery.FieldByName('FOLIO').AsString;
    ModalidadFact := dm40.IBQuery.FieldByName('MODALIDAD_FACTURACION').AsString;
    dm40.xmlTimbre.XML.Text := dm40.IBQuery.FieldByName('XML').AsString;
    dm40.xmlTimbre.Active := True;
  end;

  if (Modulo = 'PV') then
  begin
    dm40.IBQuery.Close;
    dm40.IBQuery.SelectSQL.Clear;
    dm40.IBQuery.SelectSQL.Add('SELECT TOTAL_A_PAGAR FROM CALC_TOTALES_DOCTO_PV(:DOCTO_PV_ID, ''S'',''N'',0 ) ');
    dm40.IBQuery.ParamByName('DOCTO_PV_ID').ASINTEGER := DoctoPvId;
    dm40.IBQuery.Open;
    TotalPagar := dm40.IBQuery.FieldByName('TOTAL_A_PAGAR').asfloat;
    TOTAL_LETRA := dm40.NUMLET(dm40.IBQuery.FieldByName('TOTAL_A_PAGAR').asfloat,1,1);

    dm40.IBQuery.Close;
    dm40.IBQuery.SelectSQL.Clear;
    dm40.IBQuery.SelectSQL.Add('SELECT A.DOCTO_PV_ID,B.XML,A.FOLIO,A.MODALIDAD_FACTURACION ');
    dm40.IBQuery.SelectSQL.Add('FROM DOCTOS_PV A ');
    dm40.IBQuery.SelectSQL.Add('INNER JOIN USOS_FOLIOS_FISCALES B ON ( A.DOCTO_PV_ID = B.DOCTO_ID ) ');
    dm40.IBQuery.SelectSQL.Add('WHERE A.TIPO_DOCTO = ''F'' AND A.DOCTO_PV_ID = :DOCTO_PV_ID ');
    dm40.IBQuery.ParamByName('DOCTO_PV_ID').AsInteger := DoctoPvId;
    dm40.IBQuery.Open;
    Folio :=  dm40.IBQuery.FieldByName('FOLIO').AsString;
    dm40.xmlTimbre.XML.Text := dm40.IBQuery.FieldByName('XML').AsString;
    dm40.xmlTimbre.Active := True;
    ModalidadFact := dm40.IBQuery.FieldByName('MODALIDAD_FACTURACION').AsString;
  end;

  VerSML := dm40.VensionXML(dm40.IBQuery.FieldByName('XML').AsString);

  RutaReportes :=  dm40.GetPrefer('CarpetaArchivos');

  if (AnsiUpperCase(TipoArchivo) = 'PDF') then
  begin



      if VerSML = '4.0' then
      begin
          dm40.ObtenerDatosFact40();
      end;



     //Result := dm40.GeneraPDF(Folio,TOTAL_LETRA,Modulo,ModalidadFact,TotalPagar,DoctoPvId);//dm40.GeneraPDF('AA48','mucho dinero', 'PV', 'CFDI', 382.80, 52071);

     //Result := dm40.GeneraPDF('AA0000148','TotoalLetra','PV','CFDI',100.00,56157);

      Result := dm40.GeneraPDF(Folio,TOTAL_LETRA,Modulo,ModalidadFact,TotalPagar,DoctoPvId);


      //Error := 'pasa_pdf_:_'+PdfPath;
      {
       if FileExists(PdfPath) then
           Result := dm40.CodificaPDF(PdfPath);
       if not FileExists(PdfPath) then
        Result := '';}
     // DeleteFile(PAnsiChar(pdfpath));


  end;

  if (AnsiUpperCase(TipoArchivo) = 'XML') then
  begin
      XmlPath := dm40.GetPrefer('CarpetaArchivos')+'\'+Folio+'.xml';
      dm40.xmlTimbre.xml.savetofile(XmlPath);
      Result := dm40.CodificaPDF(XmlPath);
      DeleteFile(PAnsiChar(XmlPath));
  end;

  ResultadoXML:= GetInvocationMetadata;
  ResultadoXML.ResponseContent := Result;

  try
    dm40.Free;
  except
  end;

 end
except on e : exception do
 begin
    dm40.ExportPDF.Free;
    Result := '1';
    Error := 'Mensaje: '+e.Message;
    ResultadoXML:= GetInvocationMetadata;
    ResultadoXML.ResponseContent := Error;
    if dm40.trTrans.InTransaction then
    dm40.trTrans.Rollback;
    dm40.Free;
 end;
end;

end;

function Metodo.updateFACTURA_POR_MAIL(StrConexion:String; DOCTO_PV_ID:Integer; EmailAlterno:String; Var Error:String ):String;
Var Folio,Modulo :String;
ResultadoXML: TDSInvocationMetadata;
begin
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';
    dm40 := TFacturaEFormV40.Create (nil);
	  try
    begin
     if ((not dm40.Conexion(StrConexion,Error)) or (Error <> '')) then   raise Exception.Create(Error);
     if dm40.trTrans.InTransaction then   dm40.trTrans.Rollback;
     dm40.trTrans.StartTransaction;

     folio := '';
     Error := '';

     dm40.IBQuery.Close;
     dm40.IBQuery.SelectSQL.Clear;
     dm40.IBQuery.SelectSQL.Add('SELECT IIF( B.SERIE = ''@'','''',B.SERIE)||A.FOLIO FOLIO, A.SISTEMA ');
     dm40.IBQuery.SelectSQL.Add('FROM USOS_FOLIOS_FISCALES A ');
     dm40.IBQuery.SelectSQL.Add('INNER JOIN FOLIOS_FISCALES B ON ( A.FOLIOS_FISCALES_ID = B.FOLIOS_FISCALES_ID ) ');
     dm40.IBQuery.SelectSQL.Add('WHERE A.DOCTO_ID = :DOCTO_VE_ID ');
     dm40.IBQuery.ParamByName('DOCTO_VE_ID').AsInteger := DOCTO_PV_ID;
     dm40.IBQuery.Open;

     folio := dm40.IBQuery.FieldByName('FOLIO').AsString;

     if folio = '' then
         raise exception.Create('No existe el documento indicado.');

     Modulo := dm40.IBQuery.FieldByName('SISTEMA').AsString;

     dm40.EnviaFacturas(DOCTO_PV_ID,Folio,Modulo,EmailAlterno,Error);

     if Error <> '' then
        raise exception.Create(Error);


      ResultadoXML:= GetInvocationMetadata;

      if Error <> ''  then
        ResultadoXML.ResponseContent := Error
      else
        ResultadoXML.ResponseContent := 'Ok|'+dm40.gEmailEnvio;

      try
        dm40.Free;
      except
      end;

    end
    except on e : exception do
      begin
          Error := e.Message;
          Result := '';
          ResultadoXML:= GetInvocationMetadata;
          ResultadoXML.ResponseContent := Error;
          dm40.IBQuery.Close;
          dm40.Free;
      end;
    end;
end;

function Metodo.updateGET_PDF_XML_CREDITO(StrConexion:String; DoctoPvId:Integer; TipoArchivo:String; var Error:String):String;
Var TOTAL_LETRA,Folio,PdfPath,XmlPath,Modulo,ModalidadFact : String;
TotalPagar : Double;
VerSML:String;
ResultadoXML: TDSInvocationMetadata;
begin
Error := '';
Result := '';
try
 begin
  System.sysutils.decimalseparator:='.';
  System.sysutils.ThousandSeparator:=',';
  dm40 := TFacturaEFormV40.Create (nil);

  if ((not dm40.Conexion(StrConexion,Error)) or (Error <> '')) then   raise Exception.Create(Error);
  if dm40.trTrans.InTransaction then   dm40.trTrans.Rollback;
  dm40.trTrans.StartTransaction;

  Error := '';
  Result := '';
  TOTAL_LETRA := '';                  Folio := '';
  PdfPath := '';                      XmlPath := '';
  Modulo := '';                       ModalidadFact := '';
  TotalPagar := 0;
  dm40.gVERCFDI := '';
  dm40.gVERCFDI := dm40.GetPrefer('VERCFDI');

  dm40.IBQuery.Close;
  dm40.IBQuery.SelectSQL.Clear;
  dm40.IBQuery.SelectSQL.Add('SELECT A.SISTEMA,A.XML ');
  dm40.IBQuery.SelectSQL.Add('FROM USOS_FOLIOS_FISCALES A ');
  dm40.IBQuery.SelectSQL.Add('WHERE A.DOCTO_ID = :DOCTO_ID ');
  dm40.IBQuery.ParamByName('DOCTO_ID').ASINTEGER := DoctoPvId;
  dm40.IBQuery.Open;
  Modulo := dm40.IBQuery.FieldByName('SISTEMA').AsString;

  if (dm40.IBQuery.FieldByName('XML').AsString = '') then
     raise exception.create('No existe el XML del documento indicado.');

  if (Modulo = 'VE') then
  begin
      dm40.IBQuery.Close;
      dm40.IBQuery.SelectSQL.Clear;
      dm40.IBQuery.SelectSQL.Add('SELECT TOTAL_A_PAGAR FROM CALC_TOTALES_DOCTO_VE (:DOCTO_VE_ID, ''S'' ) ');
      dm40.IBQuery.ParamByName('DOCTO_VE_ID').ASINTEGER := DoctoPvId;
      dm40.IBQuery.Open;
      TotalPagar := dm40.IBQuery.FieldByName('TOTAL_A_PAGAR').asfloat;
      TOTAL_LETRA := dm40.NUMLET(dm40.IBQuery.FieldByName('TOTAL_A_PAGAR').asfloat,1,1);

      dm40.IBQuery.Close;
      dm40.IBQuery.SelectSQL.Clear;
      dm40.IBQuery.SelectSQL.Add('SELECT A.DOCTO_VE_ID,B.XML,A.FOLIO,A.MODALIDAD_FACTURACION ');
      dm40.IBQuery.SelectSQL.Add('FROM DOCTOS_VE A ');
      dm40.IBQuery.SelectSQL.Add('INNER JOIN USOS_FOLIOS_FISCALES B ON ( A.DOCTO_VE_ID = B.DOCTO_ID ) ');
      dm40.IBQuery.SelectSQL.Add('WHERE A.TIPO_DOCTO = ''D'' AND A.DOCTO_VE_ID = :DOCTO_VE_ID ');
      dm40.IBQuery.ParamByName('DOCTO_VE_ID').AsInteger := DoctoPvId;
      dm40.IBQuery.Open;
      Folio :=  dm40.IBQuery.FieldByName('FOLIO').AsString;
      ModalidadFact := dm40.IBQuery.FieldByName('MODALIDAD_FACTURACION').AsString;
      dm40.xmlTimbre.XML.Text := dm40.IBQuery.FieldByName('XML').AsString;
      dm40.xmlTimbre.Active := True;
  end;

  if (Modulo = 'PV') then
  begin
      dm40.IBQuery.Close;
      dm40.IBQuery.SelectSQL.Clear;
      dm40.IBQuery.SelectSQL.Add('SELECT TOTAL_A_PAGAR FROM CALC_TOTALES_DOCTO_PV(:DOCTO_PV_ID, ''S'',''N'',0 ) ');
      dm40.IBQuery.ParamByName('DOCTO_PV_ID').ASINTEGER := DoctoPvId;
      dm40.IBQuery.Open;
      TotalPagar := dm40.IBQuery.FieldByName('TOTAL_A_PAGAR').asfloat;
      TOTAL_LETRA := dm40.NUMLET(dm40.IBQuery.FieldByName('TOTAL_A_PAGAR').asfloat,1,1);

      dm40.IBQuery.Close;
      dm40.IBQuery.SelectSQL.Clear;
      dm40.IBQuery.SelectSQL.Add('SELECT A.DOCTO_PV_ID,B.XML,A.FOLIO,A.MODALIDAD_FACTURACION ');
      dm40.IBQuery.SelectSQL.Add('FROM DOCTOS_PV A ');
      dm40.IBQuery.SelectSQL.Add('INNER JOIN USOS_FOLIOS_FISCALES B ON ( A.DOCTO_PV_ID = B.DOCTO_ID ) ');
      dm40.IBQuery.SelectSQL.Add('WHERE A.TIPO_DOCTO = ''C'' AND A.DOCTO_PV_ID = :DOCTO_PV_ID ');
      dm40.IBQuery.ParamByName('DOCTO_PV_ID').AsInteger := DoctoPvId;
      dm40.IBQuery.Open;
      Folio :=  dm40.IBQuery.FieldByName('FOLIO').AsString;
      dm40.xmlTimbre.XML.Text := dm40.IBQuery.FieldByName('XML').AsString;
      dm40.xmlTimbre.Active := True;
      ModalidadFact := dm40.IBQuery.FieldByName('MODALIDAD_FACTURACION').AsString;
  end;

  VerSML := dm40.VensionXML(dm40.IBQuery.FieldByName('XML').AsString);

  if (AnsiUpperCase(TipoArchivo) = 'PDF') then
  begin

  //raise exception.create('Antes de PDF1.'+' ID:'+IntToStr(DoctoPvId)+' Sistema:'+Modulo);

    if VerSML = '4.0' then
    begin
        dm40.ObtenerDatosFact40();
    end;



    Result := dm40.GeneraPDF(Folio,TOTAL_LETRA,Modulo,ModalidadFact,TotalPagar,DoctoPvId);//dm40.GeneraPDF('AA48','mucho dinero', 'PV', 'CFDI', 382.80, 52071);

    //Error := 'pasa_pdf_:_'+PdfPath;


    { if FileExists(PdfPath) then
         Result := dm40.CodificaPDF(PdfPath);
     if not FileExists(PdfPath) then
      Result := ''; }

   // DeleteFile(PAnsiChar(pdfpath));
  end;

  if (AnsiUpperCase(TipoArchivo) = 'XML') then
  begin
      XmlPath := dm40.GetPrefer('CarpetaArchivos')+'\'+Folio+'.xml';
      dm40.xmlTimbre.xml.savetofile(XmlPath);
      Result := dm40.CodificaPDF(XmlPath);
      DeleteFile(PAnsiChar(XmlPath));
  end;

  ResultadoXML:= GetInvocationMetadata;

  if Error <> '' then
    ResultadoXML.ResponseContent := Error
  else
    ResultadoXML.ResponseContent := Result;

  try
    dm40.Free;
  except
  end;

 end
  except on e : exception do
    begin
        Result := '1';
        Error := 'Mensaje: '+e.Message;
        ResultadoXML:= GetInvocationMetadata;
        ResultadoXML.ResponseContent := Error;
        if dm40.trTrans.InTransaction then
        dm40.trTrans.Rollback;
        dm40.Free;
    end;
  end;
end;

function Metodo.updateGET_NOTASCRED_CLI(StrConexion:String; ClienteId:Integer; out Error:String ):String;
Var
Integ_Ve_CC,Integ_Pv_Pv,SoloLiq:String;
VersionCan,NumSuc : Integer;
ResultadoXML: TDSInvocationMetadata;
ErrorLic, ErrorCan:String;
begin
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';

    try
    begin
      ErrorCan := '';
      ErrorLic := '';
      ErrorLic := ValidaLicencia(StrConexion);

      dm := TfrmDataModule.Create (nil);
      if ((not dm.Conexion(StrConexion,Error)) or (Error <> '')) then  raise Exception.Create(Error);
      if dm.trTrans.InTransaction then  dm.trTrans.Rollback;
      dm.trTrans.StartTransaction;

      Error := '';
      Result := '';
      dm.xmlWebservice.XML.Text := '';

      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT VALOR FROM REGISTRY WHERE NOMBRE = ''INTEG_CC_PV'' ');
      dm.IBQuery.Open;
      Integ_Pv_Pv := dm.IBQuery.FieldByName('VALOR').AsString;

      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT VALOR FROM REGISTRY WHERE NOMBRE = ''INTEG_CC'' ');
      dm.IBQuery.Open;
      Integ_Ve_CC := dm.IBQuery.FieldByName('VALOR').AsString;

      SoloLiq := dm.GetPrefer('SoloFactLiquidadas');
      if (SoloLiq = '') then
        SoloLiq := 'N';

      //Error := LeerCandado(VersionCan,NumSuc);

      if ErrorLic <> 'Ok' then
      begin
          ErrorCan := LeerCandado(VersionCan,NumSuc);
      end else
        VersionCan := 1;

      if VersionCan = 0 then
      begin
        dm.IBQuery.Close;
        dm.IBQuery.SelectSQL.Clear;
        dm.IBQuery.SelectSQL.Add('SELECT FIRST 1 A.DOCTO_ID,A.ESTATUS,A.FOLIO,A.FECHA,A.IMPORTE_NETO, ');
        dm.IBQuery.SelectSQL.Add('A.IMPORTE_DONATIVO,A.TOTAL_IMPUESTOS,A.TOTAL_DSCTO_PPAG, ');
        dm.IBQuery.SelectSQL.Add('A.NOMBRE_CLIENTE,A.ALMACEN_ID ');
        dm.IBQuery.SelectSQL.Add('FROM MGFACTURAS_GET_NOTASCRED_CLI( :CLIENTE_ID , :SOLO_LIQUIDADAS ) A ');
        dm.IBQuery.SelectSQL.Add('ORDER BY A.FECHA DESC,A.FOLIO DESC ');
        dm.IBQuery.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
        dm.IBQuery.ParamByName('SOLO_LIQUIDADAS').AsString := SoloLiq;
        dm.IBQuery.open;

        if not dm.IBQuery.IsEmpty then
        begin
          dm.xmlWebservice.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><Facturas></Facturas>';
          dm.xmlWebservice.Active := True;
          FacturasCliente := GetFacturas(dm.xmlWebservice);
          with FacturasCliente do
          begin
           while not dm.IBQuery.Eof do
           begin
            with FacturasCliente.Add do
            begin
              DoctoPvId := dm.IBQuery.FieldByName('DOCTO_ID').AsInteger;
              Cliente := AnsiLowerCase(dm.IBQuery.FieldByName('NOMBRE_CLIENTE').AsString);
              Folio := dm.IBQuery.FieldByName('FOLIO').AsString;
              Fecha := FormatDateTime('DD/MM/YYYY',dm.IBQuery.FieldByName('FECHA').AsDateTime);
            end;
            dm.IBQuery.Next;
           end;
          end;
         // Result := dm.xmlWebservice.XML.Text;
        end;

        Error := '';
      end else
      begin
        dm.IBQuery.Close;
        dm.IBQuery.SelectSQL.Clear;
        dm.IBQuery.SelectSQL.Add('SELECT A.DOCTO_ID,A.ESTATUS,A.FOLIO,A.FECHA,A.IMPORTE_NETO, ');
        dm.IBQuery.SelectSQL.Add('A.IMPORTE_DONATIVO,A.TOTAL_IMPUESTOS,A.TOTAL_DSCTO_PPAG, ');
        dm.IBQuery.SelectSQL.Add('A.NOMBRE_CLIENTE,A.ALMACEN_ID ');
        dm.IBQuery.SelectSQL.Add('FROM MGFACTURAS_GET_NOTASCRED_CLI( :CLIENTE_ID , :SOLO_LIQUIDADAS ) A ');
        dm.IBQuery.SelectSQL.Add('ORDER BY A.FECHA DESC,A.FOLIO DESC ');
        dm.IBQuery.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
        dm.IBQuery.ParamByName('SOLO_LIQUIDADAS').AsString := SoloLiq;
        dm.IBQuery.open;

        if not dm.IBQuery.IsEmpty then
        begin
          dm.xmlWebservice.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><Facturas></Facturas>';
          dm.xmlWebservice.Active := True;
          FacturasCliente := GetFacturas(dm.xmlWebservice);
          with FacturasCliente do
          begin
           while not dm.IBQuery.Eof do
           begin
            with FacturasCliente.Add do
            begin
              DoctoPvId := dm.IBQuery.FieldByName('DOCTO_ID').AsInteger;
              Cliente := AnsiLowerCase(dm.IBQuery.FieldByName('NOMBRE_CLIENTE').AsString);
              Folio := dm.IBQuery.FieldByName('FOLIO').AsString;
              Fecha := FormatDateTime('DD/MM/YYYY',dm.IBQuery.FieldByName('FECHA').AsDateTime);
            end;
            dm.IBQuery.Next;
           end;
          end;
        //  Result := dm.xmlWebservice.XML.Text;
        end;

        Error := '';
      end;

      if dm.xmlWebservice.XML.Text = '' then
      begin
        Error := 'El cliente no tiene facturas.';
        Result := '';
      end;
        {
      Error := '';
      Result := '';
      Result := dm.xmlWebservice.XML.Text;
         }
      ResultadoXML:= GetInvocationMetadata;

      if Error <> '' then
        ResultadoXML.ResponseContent := '<Error>'+Error+'</Error>'
      else
        ResultadoXML.ResponseContent := dm.xmlWebservice.XML.Text;

      try
        dm.Free;
      except
      end;

    end
    except on e : exception do
      begin
          Error := e.Message;
          ResultadoXML:= GetInvocationMetadata;
          ResultadoXML.ResponseContent := '<Error>'+Error+'</Error>';
          dm.IBQuery.Close;
          dm.Free;
      end;
    end;
end;

function Metodo.updateNOTASC_POR_MAIL(StrConexion:String; DOCTO_PV_ID:Integer; EmailAlterno:String; Var Error:String ):String;
Var Folio,Modulo :String;
ResultadoXML: TDSInvocationMetadata;
begin
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';
    dm40 := TFacturaEFormV40.Create (nil);
	  try
    begin
     if ((not dm40.Conexion(StrConexion,Error)) or (Error <> '')) then   raise Exception.Create(Error);

     if dm40.trTrans.InTransaction then   dm40.trTrans.Rollback;
     dm40.trTrans.StartTransaction;

     folio := '';
     Error := '';

     dm40.IBQuery.Close;
     dm40.IBQuery.SelectSQL.Clear;
     dm40.IBQuery.SelectSQL.Add('SELECT IIF( B.SERIE = ''@'','''',B.SERIE)||A.FOLIO FOLIO, A.SISTEMA ');
     dm40.IBQuery.SelectSQL.Add('FROM USOS_FOLIOS_FISCALES A ');
     dm40.IBQuery.SelectSQL.Add('INNER JOIN FOLIOS_FISCALES B ON ( A.FOLIOS_FISCALES_ID = B.FOLIOS_FISCALES_ID ) ');
     dm40.IBQuery.SelectSQL.Add('WHERE A.DOCTO_ID = :DOCTO_VE_ID ');
     dm40.IBQuery.ParamByName('DOCTO_VE_ID').AsInteger := DOCTO_PV_ID;
     dm40.IBQuery.Open;

     folio := dm40.IBQuery.FieldByName('FOLIO').AsString;

     if folio = '' then
         raise exception.Create('No existe el documento indicado.');

     Modulo := dm40.IBQuery.FieldByName('SISTEMA').AsString;

     dm40.EnviaNotasCredito(DOCTO_PV_ID,Folio,Modulo,EmailAlterno,Error);

     if Error <> '' then
            raise exception.Create(Error);

     ResultadoXML:= GetInvocationMetadata;
     ResultadoXML.ResponseContent := 'OK|'+dm40.gEmailEnvio;

     try
        dm40.Free;
     except
     end;

    end
    except on e : exception do
      begin
          Error := e.Message;
          ResultadoXML:= GetInvocationMetadata;
          ResultadoXML.ResponseContent := 'Err|'+Error;

          Result := '';
          dm40.IBQuery.Close;
          dm40.Free;
      end;
    end;
end;

function Metodo.updateGET_LUGARES_EXP(StrConexion:String; out Error:String):String;
Var I, Conteo : Integer;
ResultadoXML: TDSInvocationMetadata;
begin
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';
    dm := TfrmDataModule.Create (nil);
    try
    begin
      if ((not dm.Conexion(StrConexion,Error)) or (Error <> '')) then  raise Exception.Create(Error);
      if dm.trTrans.InTransaction then  dm.trTrans.Rollback;
      dm.trTrans.StartTransaction;

      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT COUNT(B.LUGAR_EXPEDICION_ID) CONTEO ');
      dm.IBQuery.SelectSQL.Add('FROM MGFACTURA_LUGARES_EXPEDICION A ');
      dm.IBQuery.SelectSQL.Add('INNER JOIN LUGARES_EXPEDICION B ON (A.LUGAR_EXPEDICION_ID = B.LUGAR_EXPEDICION_ID) ');
      dm.IBQuery.Open;
      Conteo := 0;
      Conteo := dm.IBQuery.FieldByName('CONTEO').AsInteger;

      if Conteo > 0 then
      begin
        dm.IBQuery.Close;
        dm.IBQuery.SelectSQL.Clear;
        dm.IBQuery.SelectSQL.Add('SELECT B.LUGAR_EXPEDICION_ID, B.NOMBRE ');
        dm.IBQuery.SelectSQL.Add('FROM MGFACTURA_LUGARES_EXPEDICION A ');
        dm.IBQuery.SelectSQL.Add('INNER JOIN LUGARES_EXPEDICION B ON (A.LUGAR_EXPEDICION_ID = B.LUGAR_EXPEDICION_ID) ');
        dm.IBQuery.SelectSQL.Add('WHERE A.ESTATUS = ''A'' ');
        dm.IBQuery.SelectSQL.Add('ORDER BY B.NOMBRE ');
        dm.IBQuery.Open;
      end else
      begin
        dm.IBQuery.Close;
        dm.IBQuery.SelectSQL.Clear;
        dm.IBQuery.SelectSQL.Add('SELECT B.LUGAR_EXPEDICION_ID, B.NOMBRE ');
        dm.IBQuery.SelectSQL.Add('FROM LUGARES_EXPEDICION B ON (A.LUGAR_EXPEDICION_ID = B.LUGAR_EXPEDICION_ID) ');
        dm.IBQuery.SelectSQL.Add('ORDER BY B.NOMBRE ');
        dm.IBQuery.Open;
      end;


        if not dm.IBQuery.IsEmpty then
        begin
          dm.xmlWebservice.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><Facturas></Facturas>';
          dm.xmlWebservice.Active := True;
          FacturasCliente := GetFacturas(dm.xmlWebservice);
          with FacturasCliente do
          begin
           while not dm.IBQuery.Eof do
           begin
            with FacturasCliente.Add do
            begin
              DoctoPvId := dm.IBQuery.FieldByName('LUGAR_EXPEDICION_ID').AsInteger;
              Cliente := AnsiLowerCase(dm.IBQuery.FieldByName('NOMBRE').AsString);
              Folio := '';
              Fecha := '';
            end;
            dm.IBQuery.Next;
           end;
          end;
          Result := dm.xmlWebservice.XML.Text;
        end;

      ResultadoXML:= GetInvocationMetadata;
      ResultadoXML.ResponseContent := Result;

      try
        dm.Free;
      except
      end;

    end
    except on e : exception do
      begin
          Error := e.Message;
          ResultadoXML:= GetInvocationMetadata;
          ResultadoXML.ResponseContent := '<Error>'+Error+'</Error>';
          dm.IBQuery.Close;
          dm.Free;
      end;
    end;
end;

function Metodo.updateGET_FORMAS_COBRO(StrConexion:String; out Error:String):String;
Var I, Conteo : Integer;
ResultadoXML: TDSInvocationMetadata;
begin
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';
    dm := TfrmDataModule.Create (nil);
    try
    begin
      if ((not dm.Conexion(StrConexion,Error)) or (Error <> '')) then  raise Exception.Create(Error);
      if dm.trTrans.InTransaction then  dm.trTrans.Rollback;
      dm.trTrans.StartTransaction;

      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT COUNT(A.FORMA_COBRO_CC_ID) CONTEO ');
      dm.IBQuery.SelectSQL.Add('FROM FORMAS_COBRO_CC A ');
      dm.IBQuery.Open;
      Conteo := 0;
      Conteo := dm.IBQuery.FieldByName('CONTEO').AsInteger;

      if Conteo > 0 then
      begin
        dm.IBQuery.Close;
        dm.IBQuery.SelectSQL.Clear;
        dm.IBQuery.SelectSQL.Add('SELECT A.FORMA_COBRO_CC_ID, A.NOMBRE ');
        dm.IBQuery.SelectSQL.Add('FROM FORMAS_COBRO_CC A ');
        dm.IBQuery.SelectSQL.Add('ORDER BY A.NOMBRE ');
        dm.IBQuery.Open;
      end;

        if not dm.IBQuery.IsEmpty then
        begin
          dm.xmlWebservice.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><Facturas></Facturas>';
          dm.xmlWebservice.Active := True;
          FacturasCliente := GetFacturas(dm.xmlWebservice);
          with FacturasCliente do
          begin
           while not dm.IBQuery.Eof do
           begin
            with FacturasCliente.Add do
            begin
              DoctoPvId := dm.IBQuery.FieldByName('FORMA_COBRO_CC_ID').AsInteger;
              Cliente := AnsiLowerCase(dm.IBQuery.FieldByName('NOMBRE').AsString);
              Folio := '';
              Fecha := '';
            end;
            dm.IBQuery.Next;
           end;
          end;
          Result := dm.xmlWebservice.XML.Text;
        end;

      ResultadoXML:= GetInvocationMetadata;
      ResultadoXML.ResponseContent := Result;

      try
        dm.Free;
      except
      end;

    end
    except on e : exception do
      begin
          Error := e.Message;
          ResultadoXML:= GetInvocationMetadata;
          ResultadoXML.ResponseContent := '<Error>'+Error+'</Error>';
          dm.IBQuery.Close;
          dm.Free;
      end;
    end;
end;

function Metodo.updateGET_TIPO_PERSONA(StrConexion:String; out Error:String):String;
Var I : Integer;
ResultadoXML: TDSInvocationMetadata;
begin
    I := 1;
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';
    dm := TfrmDataModule.Create (nil);
    try
    begin
      if ((not dm.Conexion(StrConexion,Error)) or (Error <> '')) then  raise Exception.Create(Error);
      if dm.trTrans.InTransaction then  dm.trTrans.Rollback;
      dm.trTrans.StartTransaction;

          dm.xmlWebservice.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><Facturas></Facturas>';
          dm.xmlWebservice.Active := True;
          FacturasCliente := GetFacturas(dm.xmlWebservice);
          with FacturasCliente do
          begin
            while I<3 do
            begin
              with FacturasCliente.Add do
              begin
                DoctoPvId := I;
                if I=1 then
                begin
                  Cliente := 'Moral';
                  Folio := 'M';
                  Fecha := '';
                end;
                if I=2 then
                begin
                  Cliente := 'Física';
                  Folio := 'F';
                  Fecha := '';
                end;
                I := I + 1;
              end;
            end;
           end;

          Result := dm.xmlWebservice.XML.Text;

        ResultadoXML:= GetInvocationMetadata;
        ResultadoXML.ResponseContent := Result;

        try
          dm.Free;
        except
        end;

    end
    except on e : exception do
      begin
          Error := e.Message;
          ResultadoXML:= GetInvocationMetadata;
          ResultadoXML.ResponseContent := '<Error>'+Error+'</Error>';
          dm.IBQuery.Close;
          dm.Free;
      end;
    end;
end;

function Metodo.updateGET_REGIMEN_FISCAL(StrConexion, TipoPersona:String; out Error:String):String;
Var I, Conteo, lNum : Integer;
ResultadoXML: TDSInvocationMetadata;
Pos4:String;
begin
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';
    dm := TfrmDataModule.Create (nil);
    try
    begin
      if ((not dm.Conexion(StrConexion,Error)) or (Error <> '')) then  raise Exception.Create(Error);
      if dm.trTrans.InTransaction then  dm.trTrans.Rollback;
      dm.trTrans.StartTransaction;

      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT COUNT(*) CONTEO');
      dm.IBQuery.SelectSQL.Add('FROM MGFACTURA_REGIMEN_FISCAL ');
      if TipoPersona='M' then
        dm.IBQuery.SelectSQL.Add('WHERE MORAL = ''Si'' ')
      else if TipoPersona='F' then
        dm.IBQuery.SelectSQL.Add('WHERE FISICA = ''Si'' ');
      dm.IBQuery.Open;
      Conteo := 0;
      Conteo := dm.IBQuery.FieldByName('CONTEO').AsInteger;

      if Conteo > 0 then
      begin
        dm.IBQuery.Close;
        dm.IBQuery.SelectSQL.Clear;
        dm.IBQuery.SelectSQL.Add('SELECT MGFACTURA_REGIMEN_FISCAL_ID, CLAVE, NOMBRE ');
        dm.IBQuery.SelectSQL.Add('FROM MGFACTURA_REGIMEN_FISCAL ');
        if TipoPersona='M' then
          dm.IBQuery.SelectSQL.Add('WHERE MORAL = ''Si'' ')
        else if TipoPersona='F' then
          dm.IBQuery.SelectSQL.Add('WHERE FISICA = ''Si'' ');
        dm.IBQuery.Open;

        if not dm.IBQuery.IsEmpty then
        begin
          dm.xmlWebservice.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><Facturas></Facturas>';
          dm.xmlWebservice.Active := True;
          FacturasCliente := GetFacturas(dm.xmlWebservice);
          with FacturasCliente do
          begin
           while not dm.IBQuery.Eof do
           begin
            with FacturasCliente.Add do
            begin
              DoctoPvId := dm.IBQuery.FieldByName('MGFACTURA_REGIMEN_FISCAL_ID').AsInteger;
              Cliente := dm.IBQuery.FieldByName('NOMBRE').AsString;
              Folio := dm.IBQuery.FieldByName('CLAVE').AsString;
              Fecha := '';
            end;
            dm.IBQuery.Next;
           end;
          end;
          Result := dm.xmlWebservice.XML.Text;
        end;

        ResultadoXML:= GetInvocationMetadata;
        ResultadoXML.ResponseContent := Result;

        try
          dm.Free;
        except
        end;

      end else
      begin
        Error := 'No se encontró regimen fiscal.';
        ResultadoXML:= GetInvocationMetadata;
        ResultadoXML.ResponseContent := '<Error>'+Error+'</Error>';
        dm.IBQuery.Close;
        dm.Free;
      end;

    end
    except on e : exception do
      begin
          Error := e.Message;
          ResultadoXML:= GetInvocationMetadata;
          ResultadoXML.ResponseContent := '<Error>'+Error+'</Error>';
          dm.IBQuery.Close;
          dm.Free;
      end;
    end;
end;

function Metodo.updateGET_USOS_CFDI(StrConexion:String; out Error:String):String;
Var I, Conteo : Integer;
ResultadoXML: TDSInvocationMetadata;
begin
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';
    dm := TfrmDataModule.Create (nil);
    try
    begin
      if ((not dm.Conexion(StrConexion,Error)) or (Error <> '')) then  raise Exception.Create(Error);
      if dm.trTrans.InTransaction then  dm.trTrans.Rollback;
      dm.trTrans.StartTransaction;

      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT COUNT(*) CONTEO');
      dm.IBQuery.SelectSQL.Add('FROM MGFACTURA_USO_CFDI ');
      dm.IBQuery.SelectSQL.Add('WHERE ESTATUS = ''A'' ');
      dm.IBQuery.Open;
      Conteo := 0;
      Conteo := dm.IBQuery.FieldByName('CONTEO').AsInteger;

      if Conteo > 0 then
      begin
        dm.IBQuery.Close;
        dm.IBQuery.SelectSQL.Clear;
        dm.IBQuery.SelectSQL.Add('SELECT MGFACTURA_USO_CFDI_ID, USO_CFDI, ESTATUS, NOMBRE ');
        dm.IBQuery.SelectSQL.Add('FROM MGFACTURA_USO_CFDI ');
        dm.IBQuery.SelectSQL.Add('WHERE ESTATUS = ''A'' ');
        dm.IBQuery.Open;

        if not dm.IBQuery.IsEmpty then
        begin
          dm.xmlWebservice.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><Facturas></Facturas>';
          dm.xmlWebservice.Active := True;
          FacturasCliente := GetFacturas(dm.xmlWebservice);
          with FacturasCliente do
          begin
           while not dm.IBQuery.Eof do
           begin
            with FacturasCliente.Add do
            begin
              DoctoPvId := dm.IBQuery.FieldByName('MGFACTURA_USO_CFDI_ID').AsInteger;
              Cliente := dm.IBQuery.FieldByName('NOMBRE').AsString;
              Folio := dm.IBQuery.FieldByName('USO_CFDI').AsString;
              Fecha := '';
            end;
            dm.IBQuery.Next;
           end;
          end;
          Result := dm.xmlWebservice.XML.Text;
        end;

      end else
      begin
          dm.xmlWebservice.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><Facturas></Facturas>';
          dm.xmlWebservice.Active := True;
          FacturasCliente := GetFacturas(dm.xmlWebservice);
          with FacturasCliente do
          begin

            with FacturasCliente.Add do
            begin
              DoctoPvId := 2;
              Cliente := 'Gastos en general';
              Folio := 'G03';
              Fecha := '';
            end;

          end;
          Result := dm.xmlWebservice.XML.Text;

      end;



     ResultadoXML:= GetInvocationMetadata;
     ResultadoXML.ResponseContent := Result;

     try
        dm.Free;
     except
     end;

    end
    except on e : exception do
      begin
          Error := e.Message;
          ResultadoXML:= GetInvocationMetadata;
          ResultadoXML.ResponseContent := '<Error>'+Error+'</Error>';
          dm.IBQuery.Close;
          dm.Free;
      end;
    end;
end;

function Metodo.updateGET_PAGOS_FAC_CLI(StrConexion, FolioVenta:String; ClienteId:Integer; out Error:String ):String;
Var
VersionCan,NumSuc : Integer;
DOCTO_CC_ID:Integer;
FolioVentaPV, SistemOrg:String;
ResultadoXML: TDSInvocationMetadata;
ErrorLic, ErrorCan, SerieFol:String;
begin
    System.sysutils.decimalseparator:='.';   SistemOrg := '';
    System.sysutils.ThousandSeparator:=',';

    try
    begin
      ErrorCan := '';
      ErrorLic := '';
      ErrorLic := ValidaLicencia(StrConexion);

      dm := TfrmDataModule.Create (nil);
      if ((not dm.Conexion(StrConexion,Error)) or (Error <> '')) then  raise Exception.Create(Error);
      if dm.trTrans.InTransaction then  dm.trTrans.Rollback;
      dm.trTrans.StartTransaction;

      Error := '';
      Result := '';
      dm.xmlWebservice.XML.Text := '';
      DOCTO_CC_ID := 0;

      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT VALOR FROM MGFACTURA_CONFIG WHERE NOMBRE = ''SistemaOrigen'' ');
      dm.IBQuery.Open;
      SistemOrg := dm.IBQuery.FieldByName('VALOR').AsString;

      if FolioVenta <> 'T' then
      begin
        FolioVenta := dm.Rellena(FolioVenta, SerieFol);


          dm.IBQuery.Close;
          dm.IBQuery.SelectSQL.Clear;
          dm.IBQuery.SelectSQL.Add('SELECT DOCTO_CC_ID ');
          dm.IBQuery.SelectSQL.Add('FROM DOCTOS_CC ');
          dm.IBQuery.SelectSQL.Add('WHERE FACTURA_MOSTRADOR = :FACTURA_MOSTRADOR ');
          dm.IBQuery.ParamByName('FACTURA_MOSTRADOR').AsString := FolioVenta;
          dm.IBQuery.Open;
          DOCTO_CC_ID := dm.IBQuery.FieldByName('DOCTO_CC_ID').AsInteger;

          if DOCTO_CC_ID = 0 then
          begin
             dm.IBQuery.Close;
             dm.IBQuery.SelectSQL.Clear;
             dm.IBQuery.SelectSQL.Add('SELECT DOCTO_DEST_ID ');
             dm.IBQuery.SelectSQL.Add('FROM DOCTOS_VE A ');
             dm.IBQuery.SelectSQL.Add('INNER JOIN DOCTOS_ENTRE_SIS B ON (A.DOCTO_VE_ID = B.DOCTO_FTE_ID) ');
             dm.IBQuery.SelectSQL.Add('WHERE A.FOLIO = :FOLIO ');
             dm.IBQuery.SelectSQL.Add('AND CLAVE_SIS_DEST = ''CC'' ');
             dm.IBQuery.ParamByName('FOLIO').AsString := FolioVenta;
             dm.IBQuery.Open;
             DOCTO_CC_ID := dm.IBQuery.FieldByName('DOCTO_DEST_ID').AsInteger;

             if DOCTO_CC_ID = 0 then raise Exception.Create('El folio del documento ingresada no existe en microsip');
          end;

      end;

     { Error := LeerCandado(VersionCan,NumSuc);
      if Error <> '' then
         raise Exception.Create(Error);}


      if ErrorLic <> 'Ok' then
      begin
          ErrorCan := LeerCandado(VersionCan,NumSuc);
          if (VersionCan < gVersionApp) and (VersionCan<> 0) then
          Raise Exception.Create('La versión '+IntToStr(gVersionApp)+' del programa es superior a la versión '+
                IntToStr(VersionCan)+' de su candado.');
      end else
        VersionCan := 1;

      if VersionCan = 0 then
      begin
        {$region  'FolioVenta = T'}
        if FolioVenta = 'T' then
        begin
          dm.IBQuery.Close;
          dm.IBQuery.SelectSQL.Clear;
          dm.IBQuery.SelectSQL.Add('SELECT FIRST 1 A.DOCTO_CC_ID, B.FECHA, B.FOLIO, D.UUID, D.USO_FOLIO_ID, D.FOLIOS_FISCALES_ID ');
          dm.IBQuery.SelectSQL.Add('FROM IMPORTES_DOCTOS_CC A ');
          dm.IBQuery.SelectSQL.Add('JOIN DOCTOS_CC B ON (A.DOCTO_CC_ID = B.DOCTO_CC_ID) ');
          dm.IBQuery.SelectSQL.Add('JOIN CONCEPTOS_CC C ON (B.CONCEPTO_CC_ID = C.CONCEPTO_CC_ID) ');
          dm.IBQuery.SelectSQL.Add('JOIN USOS_FOLIOS_FISCALES D ON (B.DOCTO_CC_ID = D.DOCTO_ID) ');
          dm.IBQuery.SelectSQL.Add('WHERE B.CLIENTE_ID = :CLIENTE_ID ');
          dm.IBQuery.SelectSQL.Add('AND C.TIPO = ''P'' ');
          dm.IBQuery.SelectSQL.Add('AND A.CANCELADO = ''N'' ');
          dm.IBQuery.SelectSQL.Add('AND A.APLICADO = ''S'' ');
          dm.IBQuery.SelectSQL.Add('AND D.UUID IS NOT NULL ');
          dm.IBQuery.SelectSQL.Add('ORDER BY B.FECHA DESC, B.FOLIO DESC ');
          dm.IBQuery.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
          dm.IBQuery.open;
        end else
        begin
          dm.IBQuery.Close;
          dm.IBQuery.SelectSQL.Clear;
          dm.IBQuery.SelectSQL.Add('SELECT FIRST 1  A.DOCTO_CC_ID, B.FECHA, B.FOLIO, D.UUID, D.USO_FOLIO_ID, D.FOLIOS_FISCALES_ID ');
          dm.IBQuery.SelectSQL.Add('FROM IMPORTES_DOCTOS_CC A ');
          dm.IBQuery.SelectSQL.Add('JOIN DOCTOS_CC B ON (A.DOCTO_CC_ID = B.DOCTO_CC_ID) ');
          dm.IBQuery.SelectSQL.Add('JOIN CONCEPTOS_CC C ON (B.CONCEPTO_CC_ID = C.CONCEPTO_CC_ID) ');
          dm.IBQuery.SelectSQL.Add('JOIN USOS_FOLIOS_FISCALES D ON (B.DOCTO_CC_ID = D.DOCTO_ID) ');
          dm.IBQuery.SelectSQL.Add('WHERE A.DOCTO_CC_ACR_ID = :V_CARGO_ID ');
          dm.IBQuery.SelectSQL.Add('AND B.CLIENTE_ID = :CLIENTE_ID ');
          dm.IBQuery.SelectSQL.Add('AND C.TIPO = ''P'' ');
          dm.IBQuery.SelectSQL.Add('AND A.CANCELADO = ''N'' ');
          dm.IBQuery.SelectSQL.Add('AND A.APLICADO = ''S'' ');
          dm.IBQuery.SelectSQL.Add('AND D.UUID IS NOT NULL ');
          dm.IBQuery.SelectSQL.Add('ORDER BY B.FECHA DESC, B.FOLIO DESC ');
          dm.IBQuery.ParamByName('V_CARGO_ID').AsInteger := DOCTO_CC_ID;
          dm.IBQuery.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
          dm.IBQuery.open;
        end;
        {$endregion}
        if not dm.IBQuery.IsEmpty then
        begin
          dm.xmlWebservice.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><Facturas></Facturas>';
          dm.xmlWebservice.Active := True;
          FacturasCliente := GetFacturas(dm.xmlWebservice);
          with FacturasCliente do
          begin
           while not dm.IBQuery.Eof do
           begin
            with FacturasCliente.Add do
            begin
              DoctoPvId := dm.IBQuery.FieldByName('DOCTO_ID').AsInteger;
              Cliente := AnsiLowerCase(dm.IBQuery.FieldByName('NOMBRE_CLIENTE').AsString);
              Folio := dm.IBQuery.FieldByName('FOLIO').AsString;
              Fecha := FormatDateTime('DD/MM/YYYY',dm.IBQuery.FieldByName('FECHA').AsDateTime);
            end;
            dm.IBQuery.Next;
           end;
          end;
          Result := dm.xmlWebservice.XML.Text;
        end;

      end else
      begin

        if FolioVenta = 'T' then
        begin
          dm.IBQuery.Close;
          dm.IBQuery.SelectSQL.Clear;
          dm.IBQuery.SelectSQL.Add('SELECT A.DOCTO_CC_ID, B.FECHA, B.FOLIO, D.UUID, D.USO_FOLIO_ID, D.FOLIOS_FISCALES_ID, A.DOCTO_CC_ACR_ID ');
          dm.IBQuery.SelectSQL.Add('FROM IMPORTES_DOCTOS_CC A ');
          dm.IBQuery.SelectSQL.Add('JOIN DOCTOS_CC B ON (A.DOCTO_CC_ID = B.DOCTO_CC_ID) ');
          dm.IBQuery.SelectSQL.Add('JOIN CONCEPTOS_CC C ON (B.CONCEPTO_CC_ID = C.CONCEPTO_CC_ID) ');
          dm.IBQuery.SelectSQL.Add('JOIN USOS_FOLIOS_FISCALES D ON (B.DOCTO_CC_ID = D.DOCTO_ID) ');
          dm.IBQuery.SelectSQL.Add('WHERE B.CLIENTE_ID = :CLIENTE_ID ');
          dm.IBQuery.SelectSQL.Add('AND C.TIPO = ''P'' ');
          dm.IBQuery.SelectSQL.Add('AND A.CANCELADO = ''N'' ');
          dm.IBQuery.SelectSQL.Add('AND A.APLICADO = ''S'' ');
          dm.IBQuery.SelectSQL.Add('AND D.UUID IS NOT NULL ');
          dm.IBQuery.SelectSQL.Add('ORDER BY B.FECHA DESC, B.FOLIO DESC ');
          dm.IBQuery.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
          dm.IBQuery.open;
        end else
        begin
          dm.IBQuery.Close;
          dm.IBQuery.SelectSQL.Clear;
          dm.IBQuery.SelectSQL.Add('SELECT A.DOCTO_CC_ID, B.FECHA, B.FOLIO, D.UUID, D.USO_FOLIO_ID, D.FOLIOS_FISCALES_ID, A.DOCTO_CC_ACR_ID ');
          dm.IBQuery.SelectSQL.Add('FROM IMPORTES_DOCTOS_CC A ');
          dm.IBQuery.SelectSQL.Add('JOIN DOCTOS_CC B ON (A.DOCTO_CC_ID = B.DOCTO_CC_ID) ');
          dm.IBQuery.SelectSQL.Add('JOIN CONCEPTOS_CC C ON (B.CONCEPTO_CC_ID = C.CONCEPTO_CC_ID) ');
          dm.IBQuery.SelectSQL.Add('JOIN USOS_FOLIOS_FISCALES D ON (B.DOCTO_CC_ID = D.DOCTO_ID) ');
          dm.IBQuery.SelectSQL.Add('WHERE A.DOCTO_CC_ACR_ID = :V_CARGO_ID ');
          dm.IBQuery.SelectSQL.Add('AND B.CLIENTE_ID = :CLIENTE_ID ');
          dm.IBQuery.SelectSQL.Add('AND C.TIPO = ''P'' ');
          dm.IBQuery.SelectSQL.Add('AND A.CANCELADO = ''N'' ');
          dm.IBQuery.SelectSQL.Add('AND A.APLICADO = ''S'' ');
          dm.IBQuery.SelectSQL.Add('AND D.UUID IS NOT NULL ');
          dm.IBQuery.SelectSQL.Add('ORDER BY B.FECHA DESC, B.FOLIO DESC ');
          dm.IBQuery.ParamByName('V_CARGO_ID').AsInteger := DOCTO_CC_ID;
          dm.IBQuery.ParamByName('CLIENTE_ID').AsInteger := ClienteId;
          dm.IBQuery.open;
        end;



        if not dm.IBQuery.IsEmpty then
        begin
          dm.xmlWebservice.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><Facturas></Facturas>';
          dm.xmlWebservice.Active := True;
          FacturasCliente := GetFacturas(dm.xmlWebservice);
          with FacturasCliente do
          begin
           while not dm.IBQuery.Eof do
           begin
            with FacturasCliente.Add do
            begin
              DoctoPvId := dm.IBQuery.FieldByName('DOCTO_CC_ID').AsInteger;
              if FolioVenta <> 'T' then
              begin
                  Cliente := FolioVenta;
              end else
              begin
                FolioVentaPV := '';
                dm.IBQuery2.Close;
                dm.IBQuery2.SelectSQL.Clear;
                dm.IBQuery2.SelectSQL.Add('SELECT FACTURA_MOSTRADOR ');
                dm.IBQuery2.SelectSQL.Add('FROM DOCTOS_CC ');
                dm.IBQuery2.SelectSQL.Add('WHERE DOCTO_CC_ID = :DOCTO_CC_ID ');
                dm.IBQuery2.ParamByName('DOCTO_CC_ID').AsInteger := dm.IBQuery.FieldByName('DOCTO_CC_ACR_ID').AsInteger;
                dm.IBQuery2.Open;
                FolioVentaPV := dm.IBQuery2.FieldByName('FACTURA_MOSTRADOR').AsString;

                if FolioVentaPV = '' then
                begin
                   dm.IBQuery2.Close;
                   dm.IBQuery2.SelectSQL.Clear;
                   dm.IBQuery2.SelectSQL.Add('SELECT A.FOLIO ');
                   dm.IBQuery2.SelectSQL.Add('FROM DOCTOS_VE A ');
                   dm.IBQuery2.SelectSQL.Add('INNER JOIN DOCTOS_ENTRE_SIS B ON (A.DOCTO_VE_ID = B.DOCTO_FTE_ID) ');
                   dm.IBQuery2.SelectSQL.Add('WHERE B.DOCTO_DEST_ID = :DOCTO_CC_ID ');
                   dm.IBQuery2.SelectSQL.Add('AND CLAVE_SIS_DEST = ''CC'' ');
                   dm.IBQuery2.ParamByName('DOCTO_CC_ID').AsInteger := dm.IBQuery.FieldByName('DOCTO_CC_ACR_ID').AsInteger;
                   dm.IBQuery2.Open;
                   FolioVentaPV := dm.IBQuery2.FieldByName('FOLIO').AsString;
                end;
                Cliente := FolioVentaPV;
              end;
              Folio := dm.IBQuery.FieldByName('FOLIO').AsString;
              Fecha := FormatDateTime('DD/MM/YYYY',dm.IBQuery.FieldByName('FECHA').AsDateTime);
            end;
            dm.IBQuery.Next;
           end;
          end;
          Result := dm.xmlWebservice.XML.Text;
        end;

      end;


      ResultadoXML:= GetInvocationMetadata;
      if dm.xmlWebservice.XML.Text = '' then
      begin
        Error := 'El cliente no tiene pagos.';
        ResultadoXML.ResponseContent := 'Err|'+Error;
        Result := '';
      end
      else
      begin
          Result := '';
          Result := dm.xmlWebservice.XML.Text;

          ResultadoXML.ResponseContent := Result;
      end;
      try
        dm.Free;
      except
      end;

    end
	  except on e : exception do
     begin
       Error := e.Message;
       ResultadoXML:= GetInvocationMetadata;
       ResultadoXML.ResponseContent := 'Err|'+Error;
       dm.IBQuery.Close;
	     dm.Free;
     end;
	  end;
end;

function Metodo.updateGET_PDF_XML_PAGOS(StrConexion:String; DoctoCCID:Integer; TipoArchivo:String; var Error:String):String;
Var TOTAL_LETRA,Folio,PdfPath,XmlPath,Modulo,ModalidadFact : String;
TotalPagar : Double;
VerSML:String;
ResultadoXML: TDSInvocationMetadata;
begin
Error := '';
Result := '';
try
 begin
  System.sysutils.decimalseparator:='.';
  System.sysutils.ThousandSeparator:=',';
  dm40 := TFacturaEFormV40.Create (nil);

  if ((not dm40.Conexion(StrConexion,Error)) or (Error <> '')) then  raise Exception.Create(Error);
  if dm40.trTrans.InTransaction then  dm40.trTrans.Rollback;
  dm40.trTrans.StartTransaction;

  Error := '';
  Result := '';
  TOTAL_LETRA := '';                  Folio := '';
  PdfPath := '';                      XmlPath := '';
  Modulo := '';                       ModalidadFact := '';
  TotalPagar := 0;
  dm40.gVERCFDI := '';
  dm40.gVERCFDI := dm40.GetPrefer('VERCFDI');

  dm40.IBQuery.Close;
  dm40.IBQuery.SelectSQL.Clear;
  dm40.IBQuery.SelectSQL.Add('SELECT A.SISTEMA,A.XML ');
  dm40.IBQuery.SelectSQL.Add('FROM USOS_FOLIOS_FISCALES A ');
  dm40.IBQuery.SelectSQL.Add('WHERE A.DOCTO_ID = :DOCTO_ID ');
  dm40.IBQuery.ParamByName('DOCTO_ID').ASINTEGER := DoctoCCID;
  dm40.IBQuery.Open;
  Modulo := dm40.IBQuery.FieldByName('SISTEMA').AsString;

  if (dm40.IBQuery.FieldByName('XML').AsString = '') then
     raise exception.create('No existe el XML del documento indicado.');



  dm40.IBQuery.Close;
  dm40.IBQuery.SelectSQL.Clear;
  dm40.IBQuery.SelectSQL.Add('SELECT A.FOLIO, B.IMPORTE, C.SISTEMA, C.XML ');
  dm40.IBQuery.SelectSQL.Add('FROM DOCTOS_CC A ');
  dm40.IBQuery.SelectSQL.Add('INNER JOIN IMPORTES_DOCTOS_CC B ON (A.DOCTO_CC_ID = B.DOCTO_CC_ID) ');
  dm40.IBQuery.SelectSQL.Add('INNER JOIN USOS_FOLIOS_FISCALES C ON (A.DOCTO_CC_ID = C.DOCTO_ID) ');
  dm40.IBQuery.SelectSQL.Add('WHERE A.DOCTO_CC_ID = :DOCTO_ID ');
  dm40.IBQuery.ParamByName('DOCTO_ID').AsInteger := DoctoCCID;
  dm40.IBQuery.Open;
  TotalPagar := dm40.IBQuery.FieldByName('IMPORTE').asfloat;

  Folio :=  dm40.IBQuery.FieldByName('FOLIO').AsString;
  ModalidadFact := 'CFDI';
  dm40.xmlTimbre.XML.Text := dm40.IBQuery.FieldByName('XML').AsString;
  dm40.xmlTimbre.Active := True;
  VerSML := dm40.VensionXML(dm40.IBQuery.FieldByName('XML').AsString);

  dm40.IBQuery.Close;
  dm40.IBQuery.SelectSQL.Clear;
  dm40.IBQuery.SelectSQL.Add('SELECT A.FOLIO, B.NOMBRE AS CONCEPTO, D.NOMBRE AS CLIENTE, CALLE, F.NOMBRE AS CIUDAD, ');
  dm40.IBQuery.SelectSQL.Add(' G.NOMBRE AS ESTADO, G.NOMBRE_ABREV AS ESTADO_ABREV, E.CODIGO_POSTAL, E.NUM_EXTERIOR, ');
  dm40.IBQuery.SelectSQL.Add(' E.NUM_INTERIOR, E.COLONIA, E.POBLACION, E.RFC_CURP, SUM(C.IMPORTE) IMPORTE ');
  dm40.IBQuery.SelectSQL.Add('FROM DOCTOS_CC A ');
  dm40.IBQuery.SelectSQL.Add('INNER JOIN CONCEPTOS_CC B ON (A.CONCEPTO_CC_ID = B.CONCEPTO_CC_ID) ');
  dm40.IBQuery.SelectSQL.Add('INNER JOIN IMPORTES_DOCTOS_CC C ON (A.DOCTO_CC_ID = C.DOCTO_CC_ID) ');
  dm40.IBQuery.SelectSQL.Add('INNER JOIN CLIENTES D ON (A.CLIENTE_ID = D.CLIENTE_ID) ');
  dm40.IBQuery.SelectSQL.Add('INNER JOIN DIRS_CLIENTES E ON (D.CLIENTE_ID = E.CLIENTE_ID) ');
  dm40.IBQuery.SelectSQL.Add('LEFT JOIN CIUDADES F ON (F.CIUDAD_ID = E.CIUDAD_ID) ');
  dm40.IBQuery.SelectSQL.Add('LEFT JOIN ESTADOS G ON (G.ESTADO_ID = E.ESTADO_ID) ');
  dm40.IBQuery.SelectSQL.Add('WHERE A.DOCTO_CC_ID = :DOCTO_ID ');
  dm40.IBQuery.SelectSQL.Add('AND E.NOMBRE_CONSIG = ''Dirección principal'' ');
  dm40.IBQuery.SelectSQL.Add('GROUP BY A.FOLIO, B.NOMBRE , D.NOMBRE , CALLE, F.NOMBRE, ');
  dm40.IBQuery.SelectSQL.Add(' G.NOMBRE, G.NOMBRE_ABREV , E.CODIGO_POSTAL, E.NUM_EXTERIOR, ');
  dm40.IBQuery.SelectSQL.Add(' E.NUM_INTERIOR, E.COLONIA, E.POBLACION, E.RFC_CURP ');
  dm40.IBQuery.SelectSQL.Add('ORDER BY A.FOLIO, B.NOMBRE , D.NOMBRE , CALLE, F.NOMBRE , ');
  dm40.IBQuery.SelectSQL.Add(' G.NOMBRE , G.NOMBRE_ABREV , E.CODIGO_POSTAL, E.NUM_EXTERIOR, ');
  dm40.IBQuery.SelectSQL.Add(' E.NUM_INTERIOR, E.COLONIA, E.POBLACION, E.RFC_CURP ');
  dm40.IBQuery.ParamByName('DOCTO_ID').AsInteger := DoctoCCID;
  dm40.IBQuery.Open;
  TOTAL_LETRA := dm40.NUMLET(dm40.IBQuery.FieldByName('IMPORTE').asfloat,1,1);




  if (AnsiUpperCase(TipoArchivo) = 'PDF') then
  begin


    if VerSML = '4.0' then
    begin
        dm40.ObtenerDatosFact40Pago();
    end;

   // raise exception.create('antes de gen pdf.');

    Result := dm40.GeneraPDF(Folio,TOTAL_LETRA,'PA',ModalidadFact,TotalPagar,DoctoCCID);//dm40.GeneraPDF('AA48','mucho dinero', 'PV', 'CFDI', 382.80, 52071);

    //Error := 'pasa_pdf_:_'+PdfPath;


    { if FileExists(PdfPath) then
         Result := dm40.CodificaPDF(PdfPath);
     if not FileExists(PdfPath) then
      Result := ''; }

   // DeleteFile(PAnsiChar(pdfpath));
  end;

  if (AnsiUpperCase(TipoArchivo) = 'XML') then
  begin
    XmlPath := dm40.GetPrefer('CarpetaArchivos')+'\'+Folio+'.xml';
    dm40.xmlTimbre.xml.savetofile(XmlPath);
    Result := dm40.CodificaPDF(XmlPath);
    DeleteFile(PAnsiChar(XmlPath));
  end;

  ResultadoXML:= GetInvocationMetadata;
  ResultadoXML.ResponseContent := Result;

  try
    dm40.Free;
  except
  end;

 end
except on e : exception do
 begin
  Result := '1';
  Error := 'Mensaje: '+e.Message+' ->'+VerSML;

  ResultadoXML:= GetInvocationMetadata;
  ResultadoXML.ResponseContent := Error;

  if dm40.trTrans.InTransaction then
    dm40.trTrans.Rollback;
  dm40.Free;
 end;
end;

end;

function Metodo.updatePAGO_POR_MAIL(StrConexion:String; DoctoCCID:Integer; EmailAlterno:String; Var Error:String ):String;
Var Folio,Modulo :String;
ResultadoXML: TDSInvocationMetadata;
begin
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';
    dm40 := TFacturaEFormV40.Create (nil);
	  try
    begin
     if ((not dm40.Conexion(StrConexion,Error)) or (Error <> '')) then
        raise Exception.Create(Error);

     if dm40.trTrans.InTransaction then
        dm40.trTrans.Rollback;
     dm40.trTrans.StartTransaction;

     folio := '';
     Error := '';

     dm40.IBQuery.Close;
     dm40.IBQuery.SelectSQL.Clear;
     dm40.IBQuery.SelectSQL.Add('SELECT IIF( B.SERIE = ''@'','''',B.SERIE)||A.FOLIO FOLIO, A.SISTEMA ');
     dm40.IBQuery.SelectSQL.Add('FROM USOS_FOLIOS_FISCALES A ');
     dm40.IBQuery.SelectSQL.Add('INNER JOIN FOLIOS_FISCALES B ON ( A.FOLIOS_FISCALES_ID = B.FOLIOS_FISCALES_ID ) ');
     dm40.IBQuery.SelectSQL.Add('WHERE A.DOCTO_ID = :DoctoCCID ');
     dm40.IBQuery.ParamByName('DoctoCCID').AsInteger := DoctoCCID;
     dm40.IBQuery.Open;

     folio := dm40.IBQuery.FieldByName('FOLIO').AsString;

     if folio = '' then
         raise exception.Create('No existe el documento indicado.');

     Modulo := 'PA'; //dm40.IBQuery.FieldByName('SISTEMA').AsString;

     dm40.EnviaPago(DoctoCCID,Folio,Modulo,EmailAlterno,Error);

     if Error <> '' then
            raise exception.Create(Error);


      ResultadoXML:= GetInvocationMetadata;
      ResultadoXML.ResponseContent := '';

      if Error <> '' then
        ResultadoXML.ResponseContent := Error
      else
        ResultadoXML.ResponseContent := 'Enviado';

      try
        dm40.Free;
      except
      end;

    end
	  except on e : exception do
     begin
       Error := e.Message;
       Result := '';
       ResultadoXML:= GetInvocationMetadata;
       ResultadoXML.ResponseContent := Error;
       dm40.IBQuery.Close;
	     dm40.Free;
     end;
	  end;
end;

function Metodo.updateGET_FAC_SIN_AUT(StrConexion:String; ComentarioCliente, NuevoCliente:WideString; Folio, VUsoCFDI, VTipoReg, vRegFis: String; TotalPagar:Double; LugarExp, RFC_ID, FormaCobroId:Integer; out Error:String):String;
Var ClienteId,MonedaId,TipoClienteId,CondPagoId,DirCliId,CiudadId,PaisId,UserWebId:Integer;
Res,CalleDirCli,RfcCorrecto,TienePassWeb,CliExis, RETIENE_IMPUESTOS:String;
SujetoIEPS, RetieneImpto, ValidaClave:String;
paso, SistemaOrigen, SistemaOrigen1, ConsultaSQL :String;
ResultadoXML: TDSInvocationMetadata;
DoctoID :Integer;
//Valida ticket
NoValidarImporte:String;
IdTicket, MGFACTURA_USO_CFDI_ID:Integer;
//CrearConsignatario
ConsigID, ClientePublicoId, CliTicket:Integer;
//Datos Timbrado
ClaveCli, FolioL, MetodoPagoSAT:String;
TipoCambio, DsctoImpte, DsctoPctje:Double;
DoctoPvId,CajaId, FolioN:Integer;
FechaFac:TDateTime;
QueryCliEventual :String;
SerieFolio, ValidaSucursales, NombreConsig:String;
ImtoTotal:Double;
CorreoCliente,SerieInicial, TipoDoc, FolDoc, OCompra, TIPO_PERSONA, CLAVE_REGIMEN_FISCAL:String;
begin
    SistemaOrigen := '';
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';
    dm40 := TFacturaEFormV40.Create (nil);
	  try
    begin

      if ((not dm40.Conexion(StrConexion,Error)) or (Error <> '')) then
        raise Exception.Create(Error);
      if dm40.trTrans.InTransaction then
        dm40.trTrans.Rollback;
      dm40.trTrans.StartTransaction;

      paso := '1';
      //Verifica Sistema Origen   -  Moroni 13/08/2020
      {$region 'Sistema Origen'}
        dm40.IBQuery.Close;
        dm40.IBQuery.SelectSQL.Clear;
        dm40.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''SistemaOrigen'' ');
        dm40.IBQuery.Open;
        SistemaOrigen := dm40.IBQuery.FieldByName('VALOR').AsString;
        if SistemaOrigen = '' then
           raise Exception.Create('Configure el sistema origen para continuar');
      {$endregion}

      dm40.IBQuery.Close;
      dm40.IBQuery.SelectSQL.Clear;
      dm40.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''ConfigOK'' ');
      dm40.IBQuery.Open;

      if dm40.IBQuery.FieldByName('VALOR').AsString = 'S' then
      begin
        {$REGION 'Valida Ticket'}
         //NoValidarImporte

        dm40.IBQuery.Close;
        dm40.IBQuery.SelectSQL.Clear;
        dm40.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''NoValidarImporte'' ');
        dm40.IBQuery.Open;
        NoValidarImporte := '';
        NoValidarImporte := dm40.IBQuery.FieldByName('VALOR').AsString;

        ImtoTotal := 0;
        SerieInicial:= '';

        IdTicket := 0; Error := ''; FolDoc := ''; TipoDoc := ''; OCompra := '';
        IdTicket := dm40.ValidacionesTicket(Folio, SistemaOrigen, Error, FolDoc, TipoDoc, OCompra);

        if (( IdTicket = 0) or ( Error <> '' )) then
        begin
          Raise Exception.Create(Error);
        end
        else
        begin
          if IdTicket > 0 then
          begin
            if NoValidarImporte <> 'S' then
            begin
              if dm40.ValidarImporte(IdTicket,TipoDoc,TotalPagar)<>'' then
              begin
                IdTicket := 0;
                Raise Exception.Create('El importe no coincide con el importe del ticket '+UpperCase(FolDoc)+'.');
              end;
            end;
          end;
        end;
        SistemaOrigen1 := ''; SistemaOrigen1 := SistemaOrigen;
        SistemaOrigen := TipoDoc;  //liz 25/11/2021

        //RESULT := IntToStr(IdTicket);
        {$ENDREGION}

        {$REGION 'Crear consignatario'}

        Error := ''; ClientePublicoId := 0;
        FolioL := dm40.ValidarSucursales(SistemaOrigen, SistemaOrigen1, FolDoc, ClientePublicoId, Error);
        if ( Error <> '' ) then
        begin
          Raise Exception.Create(Error);
        end;

           {$REGION 'Validaciones'}
             //VERCFDI
             dm40.gVERCFDI := '';
             dm40.gVERCFDI := dm40.GetPrefer('VERCFDI');

            if dm40.gVERCFDI = '' then
                Raise Exception.Create('No se ha configurado la Versión de CFDI.');


            if  dm40.GetPrefer('ConfigOK') = 'S' then
            begin

                gUrlTimbrado := dm40.GetPrefer('DirTimbre');
                if gurltimbrado = '' then   Raise Exception.Create('C001: No se ha configurado correctamente.');

                if Folio = '' then
                   Raise Exception.Create('Debe indicar un ticket.');

                if SistemaOrigen = 'VM' then
                begin
                    dm40.IBQuery.Close;
                    dm40.IBQuery.SelectSQL.Clear;
                    dm40.IBQuery.SelectSQL.Add('SELECT DOCTO_PV_ID,CLIENTE_ID,ESTATUS FROM DOCTOS_PV WHERE FOLIO = :FOLIO AND TIPO_DOCTO = ''V'' ');
                    dm40.IBQuery.ParamByName('FOLIO').AsString := FolDoc;//LIZ 04/12/2021 dm40.Rellena(Folio,SerieFolio);
                    dm40.IBQuery.Open;
                    IdTicket := dm40.IBQuery.FieldByName('DOCTO_PV_ID').AsInteger;
                end;
                if SistemaOrigen = 'RE' then
                begin
                    dm40.IBQuery.Close;
                    dm40.IBQuery.SelectSQL.Clear;
                    dm40.IBQuery.SelectSQL.Add('SELECT DOCTO_VE_ID,CLIENTE_ID,ESTATUS FROM DOCTOS_VE WHERE FOLIO = :FOLIO AND TIPO_DOCTO = ''R'' ');
                    dm40.IBQuery.ParamByName('FOLIO').AsString := FolDoc;//LIZ 04/12/2021 dm40.Rellena(Folio,SerieFolio);
                    dm40.IBQuery.Open;
                    IdTicket := dm40.IBQuery.FieldByName('DOCTO_VE_ID').AsInteger;
                end;

                if SistemaOrigen = 'PE' then
                begin
                    dm40.IBQuery.Close;
                    dm40.IBQuery.SelectSQL.Clear;
                    dm40.IBQuery.SelectSQL.Add('SELECT DOCTO_VE_ID,CLIENTE_ID,ESTATUS FROM DOCTOS_VE WHERE FOLIO = :FOLIO AND TIPO_DOCTO = ''P'' ');
                    dm40.IBQuery.ParamByName('FOLIO').AsString := FolDoc;//LIZ 04/12/2021 dm40.Rellena(Folio,SerieFolio);
                    dm40.IBQuery.Open;
                    IdTicket := dm40.IBQuery.FieldByName('DOCTO_VE_ID').AsInteger;
                end;

                if IdTicket = 0 then  Raise Exception.Create('El ticket indicado no es válido');
                CliTicket := dm40.IBQuery.FieldByName('CLIENTE_ID').AsInteger;
                if CliTicket <> ClientePublicoId then  Raise Exception.Create('El ticket no pertenece al cliente eventual.');

                Error := '';
                {$REGION 'Inserta consignatario'}
                if ClientePublicoId = CliTicket then
                begin
//                     ConsigId := dm40.AgregaConsig(ConsigId,ClientePublicoId,Error);
                     //ClienteId := ClientePublicoId;
                     dm40.xmlWebservice.XML.Text := NuevoCliente;
                     NuevoCli := GetNuevoCliente(dm40.xmlWebservice);

                     with NuevoCli do
                     begin

                         {$REGION 'Validaciones de longitud'}
                          if length(Trim(Nombre)) > 200 then
                              Raise Exception.Create('El nombre excede el tamaño máximo.');
                          if length(Trim(Contacto)) > 50 then
                              Raise Exception.Create('El contacto excede el tamaño máximo.');
                          if length(Trim(Calle)) > 100 then
                              Raise Exception.Create('La calle excede el tamaño máximo.');
                          if length(Trim(NumExt)) > 10 then
                              Raise Exception.Create('El número exterior excede el tamaño máximo.');
                          if length(Trim(NumInt)) > 10 then
                              Raise Exception.Create('El número interior excede el tamaño máximo.');
                          if length(Trim(Colonia)) > 100 then
                              Raise Exception.Create('La colonia excede el tamaño máximo.');
                          if length(Trim(Ciudad)) > 50 then
                              Raise Exception.Create('La ciudad excede el tamaño máximo.');
                          if length(Trim(CodigoPostal)) > 10 then
                              Raise Exception.Create('El código postal excede el tamaño máximo.');
                          if length(Trim(Telefono)) > 35 then
                              Raise Exception.Create('El teléfono excede el tamaño máximo.');
                          if length(Trim(Email)) > 200 then
                              Raise Exception.Create('El correo electrónico excede el tamaño máximo');
                          if length(Trim(RFC)) > 18 then
                              Raise Exception.Create('El R.F.C. excede el tamaño máximo.');

                         CorreoCliente := '';
                         CorreoCliente := Trim(Email);

                        {$ENDREGION}


                        RfcCorrecto := dm40.ValidaCadena(RFC);
                        Res := dm40.ValidarRFC(RfcCorrecto);

                        if Res <> '' then  Raise Exception.Create(Res);

                        {$REGION 'Obtener datos importantes'}
                          dm40.IBQuery4.Close;
                          dm40.IBQuery4.SelectSQL.Clear;
                          dm40.IBQuery4.SelectSQL.Add('SELECT CIUDAD_ID FROM CIUDADES WHERE UPPER( NOMBRE ) = :NOMBRE ');
                          dm40.IBQuery4.ParamByName('NOMBRE').AsString := AnsiUpperCase(Ciudad);
                          dm40.IBQuery4.Open;
                          CiudadId := dm40.IBQuery4.FieldByName('CIUDAD_ID').AsInteger;
                          if CiudadId = 0 then
                          begin
                              if AnsiUpperCase(Ciudad) <> '' then
                              begin
                                  dm40.spGenCatId.ExecProc;
                                  CiudadId := dm40.spGenCatId.FieldByName('CATALOGO_ID').AsInteger;

                                  dm40.IBQuery4.Close;
                                  dm40.IBQuery4.SelectSQL.Clear;
                                  dm40.IBQuery4.SelectSQL.Add('INSERT INTO CIUDADES (CIUDAD_ID, NOMBRE, ES_PREDET, ESTADO_ID, ');
                                  dm40.IBQuery4.SelectSQL.Add('USUARIO_CREADOR, FECHA_HORA_CREACION, USUARIO_AUT_CREACION, ');
                                  dm40.IBQuery4.SelectSQL.Add('USUARIO_ULT_MODIF, FECHA_HORA_ULT_MODIF, USUARIO_AUT_MODIF) VALUES ');
                                  dm40.IBQuery4.SelectSQL.Add('(:CIUDAD_ID, :NOMBRE, :ES_PREDET, :ESTADO_ID, ');
                                  dm40.IBQuery4.SelectSQL.Add(':USUARIO_CREADOR, :FECHA_HORA_CREACION, :USUARIO_AUT_CREACION, ');
                                  dm40.IBQuery4.SelectSQL.Add(':USUARIO_ULT_MODIF, :FECHA_HORA_ULT_MODIF, :USUARIO_AUT_MODIF); ');
                                  dm40.IBQuery4.ParamByName('CIUDAD_ID').AsInteger := CiudadId;
                                  dm40.IBQuery4.ParamByName('NOMBRE').AsString := AnsiUpperCase(Ciudad);
                                  dm40.IBQuery4.ParamByName('ES_PREDET').AsString := 'N';
                                  dm40.IBQuery4.ParamByName('ESTADO_ID').AsInteger := IdEstado;
                                  dm40.IBQuery4.ParamByName('USUARIO_CREADOR').AsString := AnsiUpperCase(dm40.IBDatabase1.ConnectParams.UserName);
                                  dm40.IBQuery4.ParamByName('FECHA_HORA_CREACION').AsDateTime := dm40.IBDatabase1.GetServerTime;
                                  dm40.IBQuery4.ParamByName('USUARIO_AUT_CREACION').Clear;
                                  dm40.IBQuery4.ParamByName('USUARIO_ULT_MODIF').Clear;
                                  dm40.IBQuery4.ParamByName('FECHA_HORA_ULT_MODIF').Clear;
                                  dm40.IBQuery4.ParamByName('USUARIO_AUT_MODIF').Clear;
                                  dm40.IBQuery4.Open;
                              end;
                          end;
                          if IdEstado > 0 then
                          begin
                              dm40.IBQuery4.Close;
                              dm40.IBQuery4.SelectSQL.Clear;
                              dm40.IBQuery4.SelectSQL.Add('SELECT PAIS_ID FROM ESTADOS WHERE UPPER( ESTADO_ID ) = :ESTADO_ID ');
                              dm40.IBQuery4.ParamByName('ESTADO_ID').AsInteger := IdEstado;
                              dm40.IBQuery4.Open;
                              PaisId := dm40.IBQuery4.FieldByName('PAIS_ID').AsInteger;
                          end else
                              PaisId := 0;
                        {$ENDREGION}
                        {
                        if RFC_ID = 0 then
                        begin
                            dm40.IBQuery2.Close;
                            dm40.IBQuery2.SelectSQL.Clear;
                            dm40.IBQuery2.SelectSQL.Add('SELECT A.DIR_CLI_ID FROM DIRS_CLIENTES A ');
                            dm40.IBQuery2.SelectSQL.Add('WHERE UPPER(A.NOMBRE_CONSIG) = UPPER(:NOMBRE_CONSIG) AND UPPER(A.RFC_CURP) = UPPER(:RFC) ');
                            dm40.IBQuery2.SelectSQL.Add('AND A.CLIENTE_ID = :CLIENTE_ID ');
                            dm40.IBQuery2.ParamByName('NOMBRE_CONSIG').AsString := Trim(Nombre);
                            dm40.IBQuery2.ParamByName('RFC').AsString := Trim(RfcCorrecto);
                            dm40.IBQuery2.ParamByName('CLIENTE_ID').AsInteger := ClientePublicoId;
                            dm40.IBQuery2.Open;

                            if dm40.IBQuery2.FieldByName('DIR_CLI_ID').AsInteger > 0 then
                                  Raise Exception.Create('La dirección para el cliente '+AnsiUpperCase(Trim(Nombre))+' con RFC '+AnsiUpperCase(Trim(RfcCorrecto))+' ya se encuentra registrada.');
                        end;
                       }

                        dm40.IBQuery2.Close;
                        dm40.IBQuery2.SelectSQL.Clear;
                        dm40.IBQuery2.SelectSQL.Add('SELECT A.DIR_CLI_ID ');
                        dm40.IBQuery2.SelectSQL.Add('FROM DIRS_CLIENTES A ');
                        dm40.IBQuery2.SelectSQL.Add('WHERE UPPER(A.NOMBRE_CONSIG) = UPPER(:NOMBRE_CONSIG) AND UPPER(A.RFC_CURP) = UPPER(:RFC) ');
                        dm40.IBQuery2.SelectSQL.Add('AND A.CLIENTE_ID = :CLIENTE_ID ');
                        dm40.IBQuery2.ParamByName('NOMBRE_CONSIG').AsString := Trim(Nombre);
                        dm40.IBQuery2.ParamByName('RFC').AsString := RfcCorrecto;
                        dm40.IBQuery2.ParamByName('CLIENTE_ID').AsInteger := ClientePublicoId;
                        dm40.IBQuery2.Open;

                        TIPO_PERSONA := Trim(VTipoReg);
                        CLAVE_REGIMEN_FISCAL := Trim(vRegFis);

                        //RFC_ID
                        //Raise Exception.Create(dm40.IBQuery2.FieldByName('DIR_CLI_ID').AsString);
                        if dm40.IBQuery2.FieldByName('DIR_CLI_ID').AsInteger = 0 then
                        begin
                          //Raise Exception.Create(TIPO_PERSONA+CLAVE_REGIMEN_FISCAL);

                            dm40.IBQuery2.Close;
                            dm40.IBQuery2.SelectSQL.Clear;
                            dm40.IBQuery2.SelectSQL.Add('INSERT INTO DIRS_CLIENTES (DIR_CLI_ID, CLIENTE_ID, NOMBRE_CONSIG, CALLE, NOMBRE_CALLE, ');
                            dm40.IBQuery2.SelectSQL.Add('NUM_EXTERIOR, NUM_INTERIOR, COLONIA, POBLACION, REFERENCIA, CIUDAD_ID, ESTADO_ID, CODIGO_POSTAL, ');
                            dm40.IBQuery2.SelectSQL.Add('PAIS_ID, TELEFONO1, TELEFONO2, FAX, EMAIL, RFC_CURP, CONTACTO, VIA_EMBARQUE_ID, ES_DIR_PPAL, ');
                            dm40.IBQuery2.SelectSQL.Add('USAR_PARA_ENVIOS, USAR_PARA_FACTURAR, GLN, TIPO_PERSONA, CLAVE_REGIMEN_FISCAL) VALUES ( ');
                            dm40.IBQuery2.SelectSQL.Add(':DIR_CLI_ID, :CLIENTE_ID, :NOMBRE_CONSIG, :CALLE, :NOMBRE_CALLE, ');
                            dm40.IBQuery2.SelectSQL.Add(':NUM_EXTERIOR, :NUM_INTERIOR, :COLONIA, :POBLACION, :REFERENCIA, :CIUDAD_ID, :ESTADO_ID, :CODIGO_POSTAL, ');
                            dm40.IBQuery2.SelectSQL.Add(':PAIS_ID, :TELEFONO1, :TELEFONO2, :FAX, :EMAIL, :RFC_CURP, :CONTACTO, :VIA_EMBARQUE_ID, :ES_DIR_PPAL, ');
                            dm40.IBQuery2.SelectSQL.Add(':USAR_PARA_ENVIOS, :USAR_PARA_FACTURAR, :GLN, :TIPO_PERSONA, :CLAVE_REGIMEN_FISCAL ); ');
                            DirCliId := dm40.GetCatalogoId();//dm40.GetDoctoId();
                            dm40.IBQuery2.ParamByName('DIR_CLI_ID').AsInteger := DirCliId;
                            dm40.IBQuery2.ParamByName('CLIENTE_ID').AsInteger := ClientePublicoId;
                            dm40.IBQuery2.ParamByName('NOMBRE_CONSIG').AsString := AnsiUpperCase(Trim(Nombre));
                            dm40.IBQuery2.ParamByName('CALLE').AsString := AnsiUpperCase(Calle);
                            dm40.IBQuery2.ParamByName('NOMBRE_CALLE').AsString := AnsiUpperCase(Trim(Calle));
                            dm40.IBQuery2.ParamByName('NUM_EXTERIOR').AsString := AnsiUpperCase(Trim(NumExt));
                            dm40.IBQuery2.ParamByName('NUM_INTERIOR').AsString := AnsiUpperCase(Trim(NumInt));
                            dm40.IBQuery2.ParamByName('COLONIA').AsString := AnsiUpperCase(Trim(Colonia));
                            dm40.IBQuery2.ParamByName('POBLACION').AsString := AnsiUpperCase(Trim(Poblacion));
                            dm40.IBQuery2.ParamByName('REFERENCIA').AsString := AnsiUpperCase(Trim(Referencia));
                            if CiudadId <> 0 then
                              dm40.IBQuery2.ParamByName('CIUDAD_ID').AsInteger := CiudadId
                            else
                              dm40.IBQuery2.ParamByName('CIUDAD_ID').Clear;

                            if IdEstado <> 0 then
                              dm40.IBQuery2.ParamByName('ESTADO_ID').AsInteger := IdEstado
                            else
                              dm40.IBQuery2.ParamByName('ESTADO_ID').Clear;

                            dm40.IBQuery2.ParamByName('CODIGO_POSTAL').AsString := Trim(CodigoPostal);

                            if PaisId <>  0 then
                              dm40.IBQuery2.ParamByName('PAIS_ID').AsInteger := PaisId
                            else
                              dm40.IBQuery2.ParamByName('PAIS_ID').Clear;

                            dm40.IBQuery2.ParamByName('TELEFONO1').AsString := Trim(Telefono);
                            dm40.IBQuery2.ParamByName('TELEFONO2').Clear;
                            dm40.IBQuery2.ParamByName('FAX').Clear;
                            dm40.IBQuery2.ParamByName('EMAIL').AsString := Trim(Email);
                            dm40.IBQuery2.ParamByName('RFC_CURP').AsString := AnsiUpperCase(Trim(RfcCorrecto));
                            dm40.IBQuery2.ParamByName('CONTACTO').AsString := AnsiUpperCase(Trim(Contacto));
                            dm40.IBQuery2.ParamByName('VIA_EMBARQUE_ID').Clear;
                            dm40.IBQuery2.ParamByName('ES_DIR_PPAL').AsString := 'N';
                            dm40.IBQuery2.ParamByName('USAR_PARA_ENVIOS').AsString := 'S';
                            dm40.IBQuery2.ParamByName('USAR_PARA_FACTURAR').AsString := 'S';
                            dm40.IBQuery2.ParamByName('GLN').Clear;
                            dm40.IBQuery2.ParamByName('TIPO_PERSONA').AsString := TIPO_PERSONA;
                            dm40.IBQuery2.ParamByName('CLAVE_REGIMEN_FISCAL').AsString := CLAVE_REGIMEN_FISCAL;
                            dm40.IBQuery2.Open;
                            //Result := DirCliId;

                            NombreConsig := AnsiUpperCase(Trim(Nombre));
                            if dm40.InsertRFCS_LCO(Rfc, NombreConsig, CodigoPostal, Error ) then
                            begin

                            end;

                            Error := '';
                        end else
                        begin
                            //'El consignatario ya existe.'
                            paso := 'l1';
                            DirCliId := dm40.IBQuery2.FieldByName('DIR_CLI_ID').AsInteger;

                            if dm40.InsertRFCS_LCO(Rfc, NombreConsig, CodigoPostal, Error ) then
                            begin

                            end;
                            paso := 'l2';
                            if dm40.UpdateDIRS_CLIENTES(DirCliId, TIPO_PERSONA, CLAVE_REGIMEN_FISCAL, Error ) then
                            begin

                            end;

                            paso := 'l3';
                            dm40.xmlWebservice.XML.Text := NuevoCliente;
                            NuevoCli := GetNuevoCliente(dm40.xmlWebservice);
                            with NuevoCli do
                            begin
                                 CorreoCliente := '';
                                 CorreoCliente := Trim(Email);
                            end;

                        end;
                     end; //with NuevoCli do

                end; //if ClientePublicoId = CliTicket then
                {$ENDREGION}

                ConsigId :=  DirCliId;
                Error := '';
                Error := dm40.ValidarDatosCliente(DirCliId);
                if Error <> '' then  Raise Exception.Create(Error+paso);
//raise Exception.Create('ConsigId: '+IntTostr(ConsigId)+ '  DirCliId: '+IntTostr(DirCliId));
                {$REGION 'Proceso de timbrado'}

                   ///  Este procedimiento obtiene las rutas de los certificados y contraseña
                  ///  También obtiene el link, usuario y contraseña para el servicio de timbrado
                  dm40.GetDatosFac();

                  Error:='';
                  if not dm40.AbrirSellos(dm40.gPathCertificado,dm40.gPathLlave,dm40.gContrasena,Error) then
                    Raise Exception.Create(Error);

                  Error := '';
                  ///   función para generar el encabezado de una factura de punto de venta
                  FechaFac := dm40.IBDatabase1.GETSERVERTIME;




                  {$region 'Crea docto VM'}
                  if SistemaOrigen = 'VM' then
                  begin
                      {$REGION 'Obtiene datos encabezado'}
                      dm40.dsdoctofte.Close;
                      dm40.dsdoctofte.parambyname('DOCTO_PV_ID').asinteger := IdTicket;
                      dm40.dsdoctofte.CloseOpen(False);
                      ClaveCli := dm40.dsdoctoFte.fieldbyname('CLAVE_CLIENTE').ASSTRING;
                      TipoCambio := dm40.dsdoctofte.fieldbyname('TIPO_CAMBIO').ASfloat;
                      DsctoImpte := dm40.dsdoctofte.fieldbyname('DSCTO_IMPORTE').ASfloat;
                      DsctoPctje := dm40.dsdoctofte.fieldbyname('DSCTO_PCTJE').ASfloat;
                      CajaId := dm40.dsdoctofte.fieldbyname('CAJA_ID').AsInteger;
                      MonedaId := dm40.dsdoctofte.fieldbyname('MONEDA_ID').AsInteger;
                      {$ENDREGION}
                      //IdTicket

                      //Cambio Josue Octubre se agrego el metodo de pago SAT MetodoPagoSAT
                      dm40.IBQuery.Close;
                      dm40.IBQuery.SelectSQL.Clear;
                      dm40.IBQuery.SelectSQL.Add('SELECT COUNT(*) CONT_FORMAS ');
                      dm40.IBQuery.SelectSQL.Add('FROM DOCTOS_PV_COBROS A ');
                      dm40.IBQuery.SelectSQL.Add('LEFT JOIN FORMAS_COBRO B ON ( A.FORMA_COBRO_ID = B.FORMA_COBRO_ID ) ');
                      dm40.IBQuery.SelectSQL.Add('WHERE A.DOCTO_PV_ID = :DOCTO_PV_ID ');
                      dm40.IBQuery.SelectSQL.Add('AND B.TIPO = ''R'' ');
                      dm40.IBQuery.ParamByName('DOCTO_PV_ID').AsInteger := IdTicket;
                      dm40.IBQuery.Open;

                      if dm40.IBQuery.FieldByName('CONT_FORMAS').AsInteger > 0 then
                        MetodoPagoSAT :='PPD'
                      else
                        MetodoPagoSAT :='PUE';


                      DoctoPvId := dm40.NuevaFacturaPv(MetodoPagoSAT,FolioL,ComentarioCliente,ClaveCli,'P','N',VUsoCFDI,TipoCambio,DsctoImpte,DsctoPctje,ClientePublicoId,DirCliId,CajaId,MonedaId,LugarExp,FechaFac,Error);
                      if (DoctoPvId = 0) or (Error <> '') then
                        Raise Exception.Create('Ocurrió un error al momento de generar la factura etapa 2. '+#13+
                                              ' Error: '+Error);

                      DoctoID := DoctoPvId;

                      Error := '';
                      ///   Copia el detalle de un documento a otro en punto de venta
                      if not dm40.CopiarDetallePv(IdTicket,DoctoPvId,'S',Error) then
                        Raise Exception.Create(' Error: '+Error);

                      Error := '';

                      dm40.IBQuery.Close;
                      dm40.IBQuery.SelectSQL.Clear;
                      dm40.IBQuery.SelectSQL.Add('UPDATE DOCTOS_PV ');
                      dm40.IBQuery.SelectSQL.Add('SET CLIENTE_FAC_ID = :CLIENTE_FAC_ID, ');
                      dm40.IBQuery.SelectSQL.Add('    DIR_CLI_ID = :DIR_CLI_ID ');
                      dm40.IBQuery.SelectSQL.Add('WHERE (DOCTO_PV_ID = :DOCTO_PV_ID); ');
                      dm40.IBQuery.ParamByName('DOCTO_PV_ID').AsInteger := DoctoPvId;
                      dm40.IBQuery.ParamByName('CLIENTE_FAC_ID').AsInteger := ClientePublicoId;
                      dm40.IBQuery.ParamByName('DIR_CLI_ID').AsInteger := DirCliId;
                      dm40.IBQuery.Open;

                      //Formas de cobro   IdTicket    DoctoPvId
                      if not dm40.FormasCobroPV(IdTicket,DoctoPvId,Error) then
                        Raise exception.create('Error: '+Error);


                      ///   esta función calcula los totales del documento y lo aplica
                      if not dm40.AplicaDoctoPv(DoctoPvId,'N','N',Error) then
                        Raise exception.create('Error: '+Error);

                      Error := '';
                      if dm40.gVERCFDI = 'CFDI 4.0' then
                      begin
                        if (dm40.GeneraXmlPv40(DoctoPvId,'F',Error) = '') or (Error <> '') then
                              Raise Exception.Create('Ocurrió un error al momento de generar Xml 4.0 de la factura electrónica. '+#13+' Error: '+Error);
                      end;


                      ConsultaSQL := 'SELECT A.FOLIO FROM USOS_FOLIOS_FISCALES A WHERE A.DOCTO_ID = :DOCTO_ID AND A.SISTEMA = ''PV''  ';
                  end;
                  {$endregion}

                  {$region 'Genera XML Ventas [PE] '}
                  if (SistemaOrigen = 'RE') or (SistemaOrigen = 'PE') then
                  begin
                      DoctoID := 0;

                      DoctoID :=  dm40.CreaDoctoVe(IdTicket, LugarExp, ConsigId, FormaCobroId, FolioL, VUsoCFDI, ComentarioCliente, Error);
                      if DoctoID = 0 then  raise Exception.Create(Error);

                      ConsultaSQL := 'SELECT A.FOLIO FROM USOS_FOLIOS_FISCALES A WHERE A.DOCTO_ID = :DOCTO_ID AND A.SISTEMA = ''VE''  ';

                  end;
                  {$endregion}


                  {$REGION 'Obtener Folio'}
                  dm40.IBQuery.close;
                  dm40.IBQuery.selectsql.clear;
                  dm40.IBQuery.selectsql.add(ConsultaSQL);
                  dm40.IBQuery.ParamByName('DOCTO_ID').ASINTEGER := DoctoID;
                  dm40.IBQuery.open;
                  FolioN := dm40.IBQuery.FieldByName('FOLIO').ASINTEGER;
                  {$ENDREGION}

                  if dm40.trTrans.InTransaction then  dm40.trTrans.Commit;
                  dm40.trTrans.StartTransaction;

                  Error := '';
                  //Función para timbrar la factura.     TimbrarFac33

                  dm40.CertificateValidator.InitializeWinStorages;

                  if dm40.gVERCFDI = 'CFDI 4.0' then
                  begin
                      if (not dm40.TimbrarFac40(DoctoID, SistemaOrigen, dm40.gUrlTimbre,dm40.gUsuarioTimbre,dm40.gPassTimbre,FolioL+IntToStr(FolioN),Error) ) or (Error <> '') then
                         Raise Exception.Create('Error: La factura se generó correctamente, pero no se timbró mas tarde se le enviará. '+Error);
                  end;

                  if dm40.trTrans.InTransaction then  dm40.trTrans.Commit;

                  dm40.trTrans.StartTransaction;
                  dm40.gEmailEnvio := '';
                  //Función para el envío de facturas
                  //if SistemaOrigen = 'RE' then
                  if (SistemaOrigen = 'RE') or (SistemaOrigen = 'PE') then
                  begin
                      if (not dm40.EnviaFacturas(DoctoID,FolioL+IntToStr(FolioN),'VE',CorreoCliente,Error)) or (Error <> '') then
                         Raise Exception.Create('Ocurrió un error al momento enviar la factura: '+Error);
                  end;
                  if SistemaOrigen = 'VM' then
                  begin
                      if (not dm40.EnviaFacturas(DoctoID,FolioL+IntToStr(FolioN),'PV',CorreoCliente,Error)) or (Error <> '') then
                          Raise Exception.Create('Ocurrió un error al momento enviar la factura: '+Error);
                  end;

                   Result := 'Ok|'+dm40.FolioFacVENuew+'|'+dm40.gEmailEnvio;
                   Error := '';

                {$ENDREGION}

            end; //if  dm40.GetPrefer('ConfigOK') = 'S' then

            {$ENDREGION}

        {$ENDREGION}


          if dm40.trTrans.InTransaction then
             dm40.trTrans.Commit;

      end else
      begin
        Error := 'Err|C001: El servidor no se encuentra disponible, favor de intentarlo más tarde.<br>Si el problema persite, favor de comunicarse con el administrador del sitio';
        Result := '0';
      end;

      ResultadoXML:= GetInvocationMetadata;

      if Error <> '' then
        ResultadoXML.ResponseContent := Error
      else
        ResultadoXML.ResponseContent := Result;

      try
        dm40.Free;
      except
      end;

    end;
    except on e : exception do
      begin
          if dm40.trTrans.InTransaction then
          dm40.trTrans.Rollback;
          Error := 'Err|'+e.Message; //+' paso:'+paso;
          ResultadoXML:= GetInvocationMetadata;
          ResultadoXML.ResponseContent := Error;
          dm40.IBQuery.Close;
          dm40.Free;
      end;
    end;
end;

function Metodo.updateGET_DIRECCION_SIN_AUT(StrConexion:String; RFC_ID:Integer; Folio:String; Var Error:String):String;
Var I : Integer;
ResultadoXML: TDSInvocationMetadata;
ClienteEventualID, IdTicket:Integer;
SistemaOrigen, ConsultaSQL, FolioR, tipoDoc, SerFol :String;
begin
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';
    dm := TfrmDataModule.Create (nil);

    try
    begin
      if ((not dm.Conexion(StrConexion,Error)) or (Error <> '')) then  raise Exception.Create(Error);
      if dm.trTrans.InTransaction then  dm.trTrans.Rollback;
      dm.trTrans.StartTransaction;

      {$region 'Sistema Origen'}
        dm.IBQuery.Close;
        dm.IBQuery.SelectSQL.Clear;
        dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''SistemaOrigen'' ');
        dm.IBQuery.Open;
        SistemaOrigen := dm.IBQuery.FieldByName('VALOR').AsString;
        if SistemaOrigen = '' then
           raise Exception.Create('Configure el sistema origen para continuar');
      {$endregion}
      SerFol := '';
      FolioR := dm.Rellena(Folio, SerFol);

      tipoDoc := '';
      IdTicket := 0;
     {$region 'Ventas mostrador'}
     if ((SistemaOrigen = 'VM') or (SistemaOrigen = 'VMRE') or (SistemaOrigen = 'VMPE')) then
     begin
         dm.IBQuery.Close;
         dm.IBQuery.SelectSQL.Clear;
         dm.IBQuery.SelectSQL.Add('SELECT A.DOCTO_PV_ID ');
         dm.IBQuery.SelectSQL.Add('FROM DOCTOS_PV A ');
         dm.IBQuery.SelectSQL.Add('WHERE A.TIPO_DOCTO = ''V'' AND A.FOLIO = :FOLIO ');
         dm.IBQuery.ParamByName('FOLIO').AsString := FolioR;
         dm.IBQuery.Open;
         IdTicket := dm.IBQuery.FieldByName('DOCTO_PV_ID').AsInteger;
         if IdTicket>0 then
          tipoDoc := 'VM';
     end;
     {$endregion}

     {$region 'Remisiones'}
     if ((SistemaOrigen = 'RE') or (SistemaOrigen = 'VMRE'))  then
     begin
      if IdTicket=0 then
      begin
         dm.IBQuery2.Close;
         dm.IBQuery2.SelectSQL.Clear;
         dm.IBQuery2.SelectSQL.Add('SELECT A.DOCTO_VE_ID FROM DOCTOS_VE A  ');
         dm.IBQuery2.SelectSQL.Add('WHERE A.FOLIO = :FOLIO AND A.TIPO_DOCTO = ''R''   ');
         dm.IBQuery2.SelectSQL.Add('AND A.ESTATUS = ''P''  ');
         dm.IBQuery2.ParamByName('FOLIO').AsString := FolioR;
         dm.IBQuery2.Open;
         IdTicket := dm.IBQuery2.FieldByName('DOCTO_VE_ID').AsInteger;

         if IdTicket>0 then
          tipoDoc := 'RE';
      end;
     end;
     {$endregion}

     {$region 'Pedidos'}
     if ((SistemaOrigen = 'PE') or (SistemaOrigen = 'VMPE')) then
     begin
      if IdTicket=0 then
      begin
         dm.IBQuery2.Close;
         dm.IBQuery2.SelectSQL.Clear;
         dm.IBQuery2.SelectSQL.Add('SELECT A.DOCTO_VE_ID FROM DOCTOS_VE A  ');
         dm.IBQuery2.SelectSQL.Add('WHERE A.FOLIO = :FOLIO AND A.TIPO_DOCTO = ''P''   ');
         dm.IBQuery2.SelectSQL.Add('AND A.ESTATUS = ''P''  ');
         dm.IBQuery2.ParamByName('FOLIO').AsString := FolioR;
         dm.IBQuery2.Open;
         IdTicket := dm.IBQuery2.FieldByName('DOCTO_VE_ID').AsInteger;

         if IdTicket>0 then
          tipoDoc := 'PE';
      end;
     end;
     {$endregion}

     SistemaOrigen := tipoDoc;

     if SistemaOrigen<>'' then
     begin

      if SistemaOrigen = 'VM' then
      begin
          ConsultaSQL := 'SELECT A.VALOR FROM REGISTRY A WHERE A.NOMBRE = ''CLIENTE_EVENTUAL_PV_ID''  ';
      end;

      if SistemaOrigen = 'RE' then
      begin
          ConsultaSQL := 'SELECT A.VALOR FROM REGISTRY A WHERE A.NOMBRE = ''CLIENTE_EVENTUAL_ID''  ';
      end;

      if SistemaOrigen = 'PE' then
      begin
          ConsultaSQL := 'SELECT A.VALOR FROM REGISTRY A WHERE A.NOMBRE = ''CLIENTE_EVENTUAL_ID''  ';
      end;

      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add(ConsultaSQL);
      //dm.IBQuery.SelectSQL.Add('SELECT VALOR FROM REGISTRY WHERE NOMBRE = ''CLIENTE_EVENTUAL_PV_ID'' ');
      dm.IBQuery.Open;
      ClienteEventualID := 0;
      ClienteEventualID := StrToInt(dm.IBQuery.FieldByName('VALOR').AsString);

      dm.IBQuery.Close;
      dm.IBQuery.SelectSQL.Clear;
      dm.IBQuery.SelectSQL.Add('SELECT A.DIR_CLI_ID,A.NOMBRE_CONSIG,A.NOMBRE_CALLE,A.NUM_EXTERIOR,A.NUM_INTERIOR, ');
      dm.IBQuery.SelectSQL.Add('A.COLONIA,A.POBLACION,A.CODIGO_POSTAL,A.EMAIL,B.NOMBRE CIUDAD,C.NOMBRE ESTADO, ');
      dm.IBQuery.SelectSQL.Add('D.NOMBRE PAIS,A.TELEFONO1,A.REFERENCIA, C.ESTADO_ID ');
      dm.IBQuery.SelectSQL.Add('FROM DIRS_CLIENTES A ');
      dm.IBQuery.SelectSQL.Add('LEFT JOIN CIUDADES B ON ( A.CIUDAD_ID = B.CIUDAD_ID ) ');
      dm.IBQuery.SelectSQL.Add('LEFT JOIN ESTADOS C ON ( C.ESTADO_ID = B.ESTADO_ID ) ');
      dm.IBQuery.SelectSQL.Add('LEFT JOIN PAISES D ON ( D.PAIS_ID = C.PAIS_ID ) ');
      dm.IBQuery.SelectSQL.Add('WHERE A.DIR_CLI_ID = :RFC_ID ');
      //dm.IBQuery.SelectSQL.Add('AND A.CLIENTE_ID = :CLIENTE_ID ');
      dm.IBQuery.ParamByName('RFC_ID').AsInteger := RFC_ID;
      //dm.IBQuery.ParamByName('CLIENTE_ID').AsInteger := ClienteEventualID;
      dm.IBQuery.Open;

      if not dm.IBQuery.IsEmpty then
      begin

          dm.xmlWebservice.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><Direccion></Direccion>';
          dm.xmlWebservice.Active := True;

          DirCliente := GetDireccion(dm.xmlWebservice);
          I := 0;
          with DirCliente do
          begin
              DireccionId := dm.IBQuery.FieldByName('DIR_CLI_ID').AsInteger;
              NombreDireccion := AnsiLowerCase(dm.IBQuery.FieldByName('NOMBRE_CONSIG').AsString);
              Calle := AnsiLowerCase(dm.IBQuery.FieldByName('NOMBRE_CALLE').AsString);
              NumExterior := AnsiLowerCase(dm.IBQuery.FieldByName('NUM_EXTERIOR').AsString);
              NumInterior := AnsiLowerCase(dm.IBQuery.FieldByName('NUM_INTERIOR').AsString);
              Colonia := AnsiLowerCase(dm.IBQuery.FieldByName('COLONIA').AsString);
              Poblacion := AnsiLowerCase(dm.IBQuery.FieldByName('POBLACION').AsString);
              Ciudad := AnsiLowerCase(dm.IBQuery.FieldByName('CIUDAD').AsString);
              Estado := AnsiLowerCase(dm.IBQuery.FieldByName('ESTADO_ID').AsString);
              Pais := AnsiLowerCase(dm.IBQuery.FieldByName('PAIS').AsString);
              CodigoPostal := AnsiLowerCase(dm.IBQuery.FieldByName('CODIGO_POSTAL').AsString);
              Telefono := AnsiLowerCase(dm.IBQuery.FieldByName('TELEFONO1').AsString);
              Referencia := AnsiLowerCase(dm.IBQuery.FieldByName('REFERENCIA').AsString);
              Email := AnsiLowerCase(dm.IBQuery.FieldByName('EMAIL').AsString);
          end;

          dm.xmlWebservice.Active := True;
          Result := dm.xmlWebservice.XML.Text;

      end else
      begin
        Error := 'El cliente indicado no existe.';
        Result := '';
      end;
     end
     else
     begin
        Error := 'El documento folio '+UpperCase(FolioR)+' no existe o ya esta procesado.';
        Result := '';
     end;

      ResultadoXML:= GetInvocationMetadata;
      ResultadoXML.ResponseContent := '';

      if Error <> '' then
         ResultadoXML.ResponseContent := '<Error>'+Error+'</Error>'
      else
        ResultadoXML.ResponseContent := Result;

      try
        dm.Free;
      except
      end;


    end
    except on e : exception do
      begin
          Error := e.Message;
          ResultadoXML:= GetInvocationMetadata;
          ResultadoXML.ResponseContent := '';
          ResultadoXML.ResponseContent := '<Error>'+Error+'</Error>';
          dm.IBQuery.Close;
          dm.Free;
      end;
    end;
end;

function Metodo.updateGET_DIRECCIONES_SIN_AUT(StrConexion:String; RFC, Folio:String; Var Error:String):String;
Var I : Integer;
ResultadoXML: TDSInvocationMetadata;
ClienteEventualID,IdTicket:Integer;
ValidaSucursales,SistemaOrigen,SistemaOrigen1:String;
SerieFol,FolioR,tipoDoc,FolioL:String;
begin
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';
    dm := TfrmDataModule.Create (nil);

    try
    begin
        if ((not dm.Conexion(StrConexion,Error)) or (Error <> '')) then  raise Exception.Create(Error);
        if dm.trTrans.InTransaction then  dm.trTrans.Rollback;
        dm.trTrans.StartTransaction;

        {$region 'Sistema Origen'}
         dm.IBQuery.Close;
         dm.IBQuery.SelectSQL.Clear;
         dm.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''SistemaOrigen'' ');
         dm.IBQuery.Open;
         SistemaOrigen := dm.IBQuery.FieldByName('VALOR').AsString;
        {$endregion}

        FolioR := dm.Rellena(Folio, SerieFol);

        tipoDoc := '';
        IdTicket := 0;
     {$region 'Ventas mostrador'}
     if ((SistemaOrigen = 'VM') or (SistemaOrigen = 'VMRE') or (SistemaOrigen = 'VMPE')) then
     begin
         dm.IBQuery.Close;
         dm.IBQuery.SelectSQL.Clear;
         dm.IBQuery.SelectSQL.Add('SELECT A.DOCTO_PV_ID ');
         dm.IBQuery.SelectSQL.Add('FROM DOCTOS_PV A ');
         dm.IBQuery.SelectSQL.Add('WHERE A.TIPO_DOCTO = ''V'' AND A.FOLIO = :FOLIO ');
         dm.IBQuery.ParamByName('FOLIO').AsString := FolioR;
         dm.IBQuery.Open;
         IdTicket := dm.IBQuery.FieldByName('DOCTO_PV_ID').AsInteger;
         if IdTicket>0 then
          tipoDoc := 'VM';
     end;
     {$endregion}

     {$region 'Remisiones'}
     if ((SistemaOrigen = 'RE') or (SistemaOrigen = 'VMRE'))  then
     begin
      if IdTicket=0 then
      begin
         dm.IBQuery2.Close;
         dm.IBQuery2.SelectSQL.Clear;
         dm.IBQuery2.SelectSQL.Add('SELECT A.DOCTO_VE_ID FROM DOCTOS_VE A  ');
         dm.IBQuery2.SelectSQL.Add('WHERE A.FOLIO = :FOLIO AND A.TIPO_DOCTO = ''R''   ');
         dm.IBQuery2.SelectSQL.Add('AND A.ESTATUS = ''P''  ');
         dm.IBQuery2.ParamByName('FOLIO').AsString := FolioR;
         dm.IBQuery2.Open;
         IdTicket := dm.IBQuery2.FieldByName('DOCTO_VE_ID').AsInteger;

         if IdTicket>0 then
          tipoDoc := 'RE';
      end;
     end;
     {$endregion}

     {$region 'Pedidos'}
     if ((SistemaOrigen = 'PE') or (SistemaOrigen = 'VMPE')) then
     begin
      if IdTicket=0 then
      begin
         dm.IBQuery2.Close;
         dm.IBQuery2.SelectSQL.Clear;
         dm.IBQuery2.SelectSQL.Add('SELECT A.DOCTO_VE_ID FROM DOCTOS_VE A  ');
         dm.IBQuery2.SelectSQL.Add('WHERE A.FOLIO = :FOLIO AND A.TIPO_DOCTO = ''P''   ');
         dm.IBQuery2.SelectSQL.Add('AND A.ESTATUS = ''P''  ');
         dm.IBQuery2.ParamByName('FOLIO').AsString := FolioR;
         dm.IBQuery2.Open;
         IdTicket := dm.IBQuery2.FieldByName('DOCTO_VE_ID').AsInteger;

         if IdTicket>0 then
          tipoDoc := 'PE';
      end;
     end;
     {$endregion}
    SistemaOrigen1 := ''; SistemaOrigen1 := SistemaOrigen;
    SistemaOrigen := tipoDoc;

    if SistemaOrigen<>'' then
    begin
        Error := ''; ClienteEventualID := 0;
        FolioL := dm.ValidarSucursales(SistemaOrigen, SistemaOrigen1, FolioR, ClienteEventualID, Error);
        if ( Error <> '' ) then
        begin
          Raise Exception.Create(Error);
        end;

        dm.IBQuery.Close;
        dm.IBQuery.SelectSQL.Clear;
        dm.IBQuery.SelectSQL.Add('SELECT A.DIR_CLI_ID,A.NOMBRE_CONSIG,A.CALLE,A.NUM_EXTERIOR,A.NUM_INTERIOR, ');
        dm.IBQuery.SelectSQL.Add('A.COLONIA,A.POBLACION,A.CODIGO_POSTAL,A.EMAIL,B.NOMBRE CIUDAD,C.NOMBRE ESTADO, ');
        dm.IBQuery.SelectSQL.Add('D.NOMBRE PAIS,A.TELEFONO1,A.REFERENCIA, C.ESTADO_ID ');
        dm.IBQuery.SelectSQL.Add('FROM DIRS_CLIENTES A ');
        dm.IBQuery.SelectSQL.Add('LEFT JOIN CIUDADES B ON ( A.CIUDAD_ID = B.CIUDAD_ID ) ');
        dm.IBQuery.SelectSQL.Add('LEFT JOIN ESTADOS C ON ( C.ESTADO_ID = B.ESTADO_ID ) ');
        dm.IBQuery.SelectSQL.Add('LEFT JOIN PAISES D ON ( D.PAIS_ID = C.PAIS_ID ) ');
        dm.IBQuery.SelectSQL.Add('WHERE A.RFC_CURP = :RFC_CURP ');
        if ValidaSucursales <> 'S' then
            dm.IBQuery.SelectSQL.Add('AND A.CLIENTE_ID = :CLIENTE_ID ');

        dm.IBQuery.SelectSQL.Add('AND A.ES_DIR_PPAL <> ''S'' ');
        dm.IBQuery.ParamByName('RFC_CURP').AsString := RFC;
        if ValidaSucursales <> 'S' then
            dm.IBQuery.ParamByName('CLIENTE_ID').AsInteger := ClienteEventualID;

        dm.IBQuery.Open;



        if not dm.IBQuery.IsEmpty then
        begin

          dm.xmlWebservice.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><DirsClientes></DirsClientes>';
          dm.xmlWebservice.Active := True;

          while not dm.IBQuery.Eof do
          begin
              DireccionesClientes := GetDirsClientes(dm.xmlWebservice);
              I := 0;
              with DireccionesClientes.add do
              begin
                  DireccionId := dm.IBQuery.FieldByName('DIR_CLI_ID').AsInteger;
                  NombreDireccion := AnsiLowerCase(dm.IBQuery.FieldByName('NOMBRE_CONSIG').AsString);
                  Calle := AnsiLowerCase(dm.IBQuery.FieldByName('CALLE').AsString);
                  NumExterior := AnsiLowerCase(dm.IBQuery.FieldByName('NUM_EXTERIOR').AsString);
                  NumInterior := AnsiLowerCase(dm.IBQuery.FieldByName('NUM_INTERIOR').AsString);
                  Colonia := AnsiLowerCase(dm.IBQuery.FieldByName('COLONIA').AsString);
                  Poblacion := AnsiLowerCase(dm.IBQuery.FieldByName('POBLACION').AsString);
                  Ciudad := AnsiLowerCase(dm.IBQuery.FieldByName('CIUDAD').AsString);
                  Estado := AnsiLowerCase(dm.IBQuery.FieldByName('ESTADO_ID').AsString);
                  Pais := AnsiLowerCase(dm.IBQuery.FieldByName('PAIS').AsString);
                  CodigoPostal := AnsiLowerCase(dm.IBQuery.FieldByName('CODIGO_POSTAL').AsString);
                  Telefono := AnsiLowerCase(dm.IBQuery.FieldByName('TELEFONO1').AsString);
                  Referencia := AnsiLowerCase(dm.IBQuery.FieldByName('REFERENCIA').AsString);
                  Email := AnsiLowerCase(dm.IBQuery.FieldByName('EMAIL').AsString);
              end;
              dm.IBQuery.Next;
          end;

          dm.xmlWebservice.Active := True;
          Result := dm.xmlWebservice.XML.Text;

        end else
        begin
          Error := 'El cliente indicado no existe.';
          Result := '';
        end;
     end
     else
     begin
       Error := 'El documento folio '+UpperCase(FolioR)+' no existe o ya esta procesado.';
       Result := '';
     end;

        ResultadoXML:= GetInvocationMetadata;
        ResultadoXML.ResponseContent := '';

        if Error <> '' then
           ResultadoXML.ResponseContent := '<Error>'+Error+'</Error>'
        else
          ResultadoXML.ResponseContent := Result;

        try
          dm.Free;

        except
        end;
    end
    except on e : exception do
      begin
          Error := e.Message;
          ResultadoXML:= GetInvocationMetadata;
          ResultadoXML.ResponseContent := '';
          ResultadoXML.ResponseContent := '<Error>'+Error+'</Error>';
          dm.IBQuery.Close;
          dm.Free;
      end;
    end;
end;

function Metodo.updateVERIFICA_DOCTO(StrConexion:String; NumTicket:String; out  Error:String):String;
var SistemaOrigen,TipoDoc,FolDoc,OCompra :String;
    Resultado: TDSInvocationMetadata;
    IdTicket :Integer;
begin
    SistemaOrigen := '';
    IdTicket := 0;
    System.sysutils.decimalseparator:='.';
    System.sysutils.ThousandSeparator:=',';
    dm40 := TFacturaEFormV40.Create (nil);
	  try
    begin
       if ((not dm40.Conexion(StrConexion,Error)) or (Error <> '')) then  raise Exception.Create(Error);
       if dm40.trTrans.InTransaction then  dm40.trTrans.Rollback;
       dm40.trTrans.StartTransaction;

       {$region 'Sistema Origen'}
       dm40.IBQuery.Close;
       dm40.IBQuery.SelectSQL.Clear;
       dm40.IBQuery.SelectSQL.Add('SELECT A.VALOR FROM MGFACTURA_CONFIG A WHERE A.NOMBRE = ''SistemaOrigen'' ');
       dm40.IBQuery.Open;
       SistemaOrigen := dm40.IBQuery.FieldByName('VALOR').AsString;
       if SistemaOrigen = '' then
           raise Exception.Create('Configure el sistema origen para continuar');
       {$endregion}

      IdTicket := 0; Error := ''; FolDoc := ''; TipoDoc := ''; OCompra := '';
      IdTicket := dm40.ValidacionesTicket(NumTicket, SistemaOrigen, Error, FolDoc, TipoDoc, OCompra);
      if Error <> '' then    Raise Exception.Create(Error);

      Resultado:= GetInvocationMetadata;
      Resultado.ResponseContent := '';

      if Error <> '' then
        Resultado.ResponseContent := Error
      else
        Resultado.ResponseContent := 'Ok';

      try
        dm40.Free;
      except
      end;

    end
    except on e : exception do
      begin
          Error := e.Message;
          Result := '';
          Resultado:= GetInvocationMetadata;
          Resultado.ResponseContent := Error;

          if dm40.trTrans.InTransaction then
          dm40.trTrans.Rollback;
          dm40.Free;
      end;
    end;
end;

{lectura licencia}
function Metodo.ValidaLicencia(StrConexion:String):String;
var //ResultadoXML: TDSInvocationMetadata;
Resultado :Integer;
lError:String;
Licencia,CliLicencia:String;
Respuesta:String;
begin
  try
    begin

         if TIPO_LICENCIA = 'LIC' then
         begin
            Respuesta := '';
            lError := '';
            dm := TfrmDataModule.Create (nil);
            if ((not dm.Conexion(StrConexion,lError)) or (lError <> '')) then
                 raise Exception.Create('Conectando a la base de datos'+': '+lError);



            if dm.trTrans.InTransaction then
               dm.trTrans.Rollback;
            dm.trTrans.StartTransaction;

            try
              begin
                  dm.IBQuery.Close();
                  dm.IBQuery.SelectSQL.Clear;
                  dm.IBQuery.SelectSQL.Add('SELECT LICENCIA, CLIENTE ');
                  dm.IBQuery.SelectSQL.Add('FROM MG_EXSIM_LICENCIAS ');
                  dm.IBQuery.SelectSQL.Add('WHERE APLICACION = ''04'' ');
                  dm.IBQuery.Open;
                  Licencia := '';
                  Licencia := dm.IBQuery.FieldByName('LICENCIA').AsString;
                  CliLicencia := '';
                  CliLicencia := dm.IBQuery.FieldByName('CLIENTE').AsString;
              end;
            except
              begin
                  lError := 'Es necesario actualizar sus metadatos, ejecute el sistema Configurador.exe como SYSDBA.'+
                            ' Si el problema persiste comuníquese con su distribuidor Microsip';
              end;
            end;

            if Trim(lError) = '' then
            begin
                 if (Trim(Licencia) <> '') and (Trim(CliLicencia) <> '') then
                 begin
                    dm.ValidacionesGenerales(Licencia,CliLicencia,lError);
                 end else
                 begin
                   lError := 'Es necesario actualizar sus metadatos, ejecute el sistema Configurador.exe como SYSDBA.'+
                            ' Si el problema persiste comuníquese con su distribuidor Microsip';
                 end;
            end;

            if Trim(lError) <> '' then
              Respuesta := lError
            else
              Respuesta := 'Ok';




            Result := Respuesta;

            try
              dm.Free;
            except
            end;
         end else //if TIPO_LICENCIA = 'LIC' then
         begin
                Result := 'Ok';
         end;

    end;
  except on e : exception do
    begin
      lError := e.message;
      Result := 'Error general: '+lError;
      if dm.trTrans.InTransaction then
          dm.trTrans.Rollback;

      try
       dm.Free;
      except
      end;
    end;
  end;
end;

{lectura de candado}
{$REGION 'lectura de candado'}
function Metodo.LeerCandado(var VersionCan,NumSuc:Integer):String;
Var Error : String;
begin
  gVersion := 0;
  gNumSuc := 0;
  Result := '';

  Versiones(Error);

  VersionCan := gVersion;
  NumSuc := gNumSuc;
  Result := Error;

end;

function Metodo.Versiones(Var Error:String) : Integer;
begin
Result := 1;
  try
    ReadLicense(Error);
    Result := 0;
  except on e : exception do
  begin
   Error := e.Message;
   Result := 1;
  end;
end;
end;

procedure Metodo.ReadLicense(Var Error:String);
var EstatusHasp:Integer;
Memoria, Version, NoAdendas: String;
begin

try
begin
  if Conecta_Hasp(0,Error) = 0 then
  begin

     EstatusHasp := hasp_read(handle, HASP_FILEID_RO, 0, 96, membuffer);
     EstatusHasp := hasp_logout(handle);
     MEMORIA := ByteToString(membuffer);
     VERSION := Copy(MEMORIA,33,2);
     NoAdendas := Copy(MEMORIA,35,2); //Solo para Adendas

     if trim( NoAdendas ) = '' then
     begin
         gNumSuc := 0;
     end else
         gNumSuc := StrToInt(NoAdendas);

     if trim(VERSION) = '' then begin Version := '2011'; gVersion := 2011; end;

       if MEMORIA = '' then
       BEGIN
        if Conecta_Hasp(32,Error) = 0 then
        begin
           EstatusHasp := hasp_read(handle, HASP_FILEID_RO, 0, 96, membuffer);
           EstatusHasp := hasp_logout(handle);
           MEMORIA := ByteToString(membuffer);
           VERSION := Copy(MEMORIA,33,2);//9,4);
           NoAdendas := Copy(MEMORIA,35,2);//,13,2); //Solo para Adendas
           if trim(VERSION) = '' then begin  Version := '2011'; gVersion := 2011; end;
           if trim( NoAdendas ) = '' then
              gNumSuc := 0
           else
             gNumSuc := StrToInt(NoAdendas);
        end
       END;
  end
  else
  begin
      raise exception.Create(Error);
  end;

     if trim(VERSION) = '' then
     begin
        Version := '0';
        gVersion := 0;
     end;

     if trim( NoAdendas ) = '' then
              gNumSuc := 0
           else
              gNumSuc := StrToInt(NoAdendas);
     //lblVersion Se tiene que agregar a cada proyecto
     //fmConfigConexion.lblVersion.Caption := 'Versión: '+ VERSION + ' NoAdendas: '+ NoAdendas; //Solo para Adendas

     try
       gVersion := StrToInt(VERSION);
     finally
     end;
     if gVersion = 0 then
     begin
       Error := 'Necesita activar en su candado el módulo.';
     end else
     begin
     {
     if gVersion < gVersionApp then
     begin
       Error := 'La versión '+ IntToStr(gVersionApp)+' del programa es superior a la versión '+Version+' de su candado. ';
       //Application.Terminate;
     end;
     }
     end;

     //gVersion := VersionNumero;
     gNumSuc := StrToInt(NoAdendas);

 end
except on e :exception do
 begin
   Error := e.Message;
   gVersion := 0;
   gNumSuc := 0;
 end;
end;

end;

function Metodo.Conecta_Hasp(feature:integer; Var Error:String):integer;
begin
Result := 1;
status := hasp_login(feature, @vendor_code[1], handle);
  case status of
    HASP_STATUS_OK:Result := 0;
  else
  begin
    if Errores_Hasp(status,Error) = 1 then
       Error := 'Ha sucedido un error. No es posible continuar. '+Error;
  end;
  end;
end;

function Metodo.ByteToString( var Value: array of byte ): String;
var  I: integer;
    S : String;
    Letra: char;
begin
    S := '';
    for I := Length(Value)-1 Downto 0 do
    begin
        letra := Char(Value[I]);
        S := letra + S;
    end;
    Result := S;
end;

function Metodo.Errores_Hasp(estatus:hasp_status_t; Var Error : String):Integer;
begin
Result := -1;
  case estatus of
    HASP_STATUS_OK:Result := 0;
    HASP_HASP_NOT_FOUND : Error := 'HASP_HASP_NOT_FOUND';
    HASP_MEM_RANGE : Error := 'Request exceeds memory range of a HASP file';
    HASP_INV_PROGNUM_OPT : Error := 'Legacy HASP HL Run-time API: Unknown/Invalid Feature ID option';
    HASP_INSUF_MEM : Error := 'System is out of memory';
    HASP_TMOF : Error := 'Too many open Features/login sessions';
    HASP_ACCESS_DENIED : Error := 'Access to Feature, HASP protection key or functionality denied';
    HASP_INCOMPAT_FEATURE : Error := 'Legacy decryption function cannot work on Feature';
    HASP_TOO_SHORT : Error := 'Encrypted/decrypted data length too short to execute function call';
    HASP_INV_HND : Error := 'Invalid login handle passed to function';
    HASP_INV_FILEID : Error := 'Specified File ID not recognized by API';
    HASP_OLD_DRIVER : Error := 'Installed driver or daemon too old to execute function';
    HASP_NO_TIME : Error := 'Real-time clock (rtc) not available';
    HASP_SYS_ERR : Error := 'SYSTEM ERROR';
    HASP_NO_DRIVER : Error := 'Required driver not installed';
    HASP_INV_FORMAT : Error := 'Unrecognized file format for update';
    HASP_REQ_NOT_SUPP : Error := 'Unable to execute function in this context';
    HASP_INV_UPDATE_OBJ : Error := 'Binary data passed to function does not contain valid update';
    HASP_KEYID_NOT_FOUND : Error := 'HASP protection key not found';
    HASP_INV_UPDATE_DATA : Error := 'Required XML tags not found; Contents in binary data are missing';
    HASP_INV_UPDATE_NOTSUPP : Error := 'UPDATE NOT SUPPORT';
    HASP_INV_UPDATE_CNTR : Error := 'Update counter set incorrectly';
    HASP_INV_VCODE : Error := 'Invalid Vendor Code passed';
    HASP_ENC_NOT_SUPP : Error := 'HASP SRM protection key does not support encryption type';
    HASP_INV_TIME : Error := 'Passed time value outside supported value range';
    HASP_NO_BATTERY_POWER : Error := 'Real-time clock battery out of power';
    HASP_NO_ACK_SPACE : Error := 'Acknowledge data requested by update, but ack_data parameter is null';
    HASP_TS_DETECTED : Error := 'Program running on a terminal server';
    HASP_FEATURE_TYPE_NOT_IMPL : Error := 'Requested Feature type not implemented';
    HASP_UNKNOWN_ALG : Error := 'Unknown algorithm used in H2R/V2C file';
    HASP_INV_SIG : Error := 'Signature verification operation failed';
    HASP_FEATURE_NOT_FOUND:Result := 0;//MessageDlg('Requested Feature not available';
    HASP_NO_LOG : Error := 'Access log not enabled';
    HASP_LOCAL_COMM_ERR : Error := 'Communication error between API and local HASP License Manager';
    HASP_UNKNOWN_VCODE : Error := 'Vendor Code not recognized by API';
    HASP_INV_SPEC : Error := 'Invalid XML specification';
    HASP_INV_SCOPE : Error := 'Invalid XML scope';
    HASP_TOO_MANY_KEYS : Error := 'Too many HASP SRM protection keys currently connected';
    HASP_TOO_MANY_USERS : Error := 'Too many concurrent user sessions currently connected';
    HASP_BROKEN_SESSION : Error := 'Session been interrupted';
    HASP_REMOTE_COMM_ERR : Error := 'Communication error between local and remote HASP License Managers';
    HASP_FEATURE_EXPIRED : Error := 'Feature expired';
    HASP_OLD_LM : Error := 'HASP License Manager version too old';
    HASP_DEVICE_ERR : Error := 'Input/Output error occured';
    HASP_UPDATE_BLOCKED : Error := 'Update installation not permitted; This update was already applied';
    HASP_TIME_ERR : Error := 'System time has been tampered with';
    HASP_SCHAN_ERR : Error := 'Communication error occurred in secure channel';
    HASP_STORAGE_CORRUPT : Error := 'Corrupt data exists in secure storage area of HASP SL protection key';
    HASP_NO_VLIB : Error := 'Unable to find Vendor library';
    HASP_INV_VLIB : Error := 'Unable to load Vendor library';
    HASP_SCOPE_RESULTS_EMPTY : Error := 'Unable to locate any Feature matching scope';
    HASP_VM_DETECTED : Error := 'Program running on a virtual machine';
    HASP_HARDWARE_MODIFIED : Error := 'HASP SL key incompatible';
    HASP_USER_DENIED : Error := 'USER DINI';
    HASP_UPDATE_TOO_OLD : Error := 'Ya se aplico esta actualización.';
    HASP_UPDATE_TOO_NEW : Error := 'Update to old';
    HASP_OLD_VLIB : Error := 'Old vlib';
    HASP_UPLOAD_ERROR : Error := 'Upload via ACC failed, e.g. because of illegal format';
    HASP_INV_RECIPIENT : Error := 'Invalid XML "recipient" parameter';
    HASP_INV_DETACH_ACTION : Error := 'Invalid XML "action" parameter';
    HASP_TOO_MANY_PRODUCTS : Error := 'scope does not specify a unique Product';
    HASP_INV_PRODUCT : Error := 'Invalid Product information';
    HASP_UNKNOWN_RECIPIENT : Error := 'Unknown Recipient';
    HASP_INV_DURATION : Error := 'Invalid Duration ';
    HASP_NO_API_DYLIB : Error := 'API dispatcher: API for this Vendor Code was not found ';
    HASP_INV_API_DYLIB : Error := 'API dispatcher: Unable to load API; DLL possibly corrupt? ';
    HASP_INVALID_OBJECT : Error := 'C++ API: Object incorrectly initialized ';
    HASP_INVALID_PARAMETER : Error := 'C++ API: Invalid function parameter ';
    HASP_ALREADY_LOGGED_IN : Error := 'C++ API: Logging in twice to the same object ';
    HASP_ALREADY_LOGGED_OUT : Error := 'C++ API: Logging out twice of the same object ';
    else result := 1;
  end;
end;
{$ENDREGION}

end.
