09/02/2006

Retorno HSBC - Valor de juros

Bom dia.

Estamos desenvolvendo um sistema de ERP que faz integração bancária, enviando remessas e processando retornos.

Estamos com problema no processamento de retornos do HSBC. Mesmo que o cliente pague o título no dia do vencimento, no retorno, na posição 98 até a posição 110 (valor de juros) vem um valor. Sendo que não foi cobrado juros sobre o título...

Já li o manual várias vezes e não encontro o que pode estar causando este erro. Caso alguém já passou por este problema ou envia remessas e processa arquivos de retorno do HSBC e pode me dar uma mão, agradeceria muito...

Atenciosamente,
Fernando.


Bico

Respostas

10/02/2006

Bico

Sobe


Responder Citar

10/02/2006

Weber

Você pode pegar a data de pagamento e verificar se foi pago em dia, se sim não há juros caso contrário ai sim é só pegar o campo juros.

Não li o manual do hsbc mas acredito que essa ´gambiarra´ funcione.


Responder Citar

10/02/2006

Bico

Bom dia Weber.

Também tinha pensado em fazer alguma coisa desse tipo.
Só que me ocorreu a seguinte idéia: O título pode vencer no final de semana e o cara pagar só na segunda. Poderia fazer uma rotina para ver se o dia de vencimento do título é no final de semana e ignorar os juros neste caso. Mas acontece que o dia de vencimento do título também pode cair em um feriado. Neste caso o cliente pagaria o título no dia seguinte e aí o procedimento acima estaria ´furado´.
Acredito que o banco esteja informando outro valor na posição do campo de juros. Sei lá, tipo em algum tipo de operação ou tipo de situação a posição do campo juros serve para informar outro valor que, não tenho nem idéia do que pode ser.

Atenciosamente,
Fernando


Responder Citar

10/02/2006

Weber

Para saber se é feriado, sabado domingo é mole.
Esta função retornar a quantidade de dias em atrazo.

function CalcDiasVencto(DtAtual, DtVencto: ShortString): Integer; 
var 
  dDtTemp: TDateTime; 
  function VerFeriados(DtAtual, DtVencto: ShortString): Boolean; 
  var 
    Ano, Mes, Dia: Currency; 
    c,n,k,i,j,l: Currency; 
    cFeriados: TStringList; 
    dDtTemp: TDateTime; 
    nI, nY: Integer; 
  begin 
    Ano := StrToInt(Trim(Copy(DtAtual,7,4))); 
    c := Trunc(Ano / 100); 
    n := Ano - (19 * Trunc(Ano / 19)); 
    k := Trunc((c - 17) / 25); 
    i := c - Trunc((c/4)) - Trunc((c-k)/3) + (19*n) + 15; 
    i := i - (30*Trunc(i/30)); 
    i := i - (Trunc(i/28)*(1-Trunc(i/28))*Trunc(29/(i+1))*Trunc((21-n)/11)); 
    j := Ano + Trunc(Ano / 4) + i + 2 -c + Trunc(c/4); 
    j := j - (7*Trunc(j/7)); 
    l := i - j; 
    Mes := 3 + Trunc((l+40)/44); 
    Dia := l + 28 - (31*Trunc(Mes/4)); 
    cFeriados := TStringList.Create; 
    cFeriados.Add(FormatDateTime(´dd/mm´,StrToDate(CurrToStr(Dia)+´/´+CurrToStr(Mes)))); //Pascoa 
    cFeriados.Add(FormatDateTime(´dd/mm´,IncDay(StrToDate(cFeriados[0&93;), -2))); //6.Santa 
    cFeriados.Add(FormatDateTime(´dd/mm´,IncDay(StrToDate(cFeriados&91;0&93;),-47))); //Carnaval 
    cFeriados.Add(FormatDateTime(´dd/mm´,IncDay(StrToDate(cFeriados&91;0&93;), 60))); //Corpus Crhist 
    cFeriados.Add(´01/01´); //Ano Novo 
    cFeriados.Add(´21/04´); //Tiradentes 
    cFeriados.Add(´01/05´); //Trabalho 
    cFeriados.Add(´07/09´); //Indenpencia 
    cFeriados.Add(´12/10´); //N.Senhora 
    cFeriados.Add(´02/11´); //Finados 
    cFeriados.Add(´15/11´); //Replublica 
    cFeriados.Add(´25/12´); //Natal 
    cFeriados.Add(´10/05´); //Aniversario de Maringa 
    cFeriados.Add(´15/08´); //Padroeira de Maringa 
    dDtTemp := StrToDate(DtAtual); 
    dDtTemp := IncDay(dDtTemp, -1); 
    while dDtTemp >= StrToDate(DtVencto) do //domingos e sabado 
      if (DayOfWeek(dDtTemp) = 7) or (DayOfWeek(dDtTemp) = 1) then 
      begin 
        cFeriados.Add(FormatDateTime(´dd/mm´,dDtTemp)); 
        dDtTemp := IncDay(dDtTemp, -1); 
      end 
      else 
        Break; 
    Result := False; 
    dDtTemp := StrToDate(DtVencto); 
    for nI := 0 to cFeriados.Count -1 do 
      if cFeriados[nI&93; = FormatDateTime(´dd/mm´,dDtTemp) then 
      begin 
        for nY := 0 to cFeriados.Count -1 do 
          if cFeriados&91;nY&93; = FormatDateTime(´dd/mm´,IncDay(StrToDate(DtAtual), -1)) then 
          begin 
            Result := True; 
            Break; 
          end; 
        if Result then 
          Break; 
      end; 
    cFeriados.Free; 
  end; 
begin 
  Result := DaysBetween(StrToDate(DtAtual), StrToDate(DtVencto)); 
  if StrToDate(DtAtual) <= StrToDate(DtVencto) then 
    Result := 0 
  else 
  begin 
    dDtTemp := StrToDate(DtVencto); 
    while StrToDate(DtAtual) > dDtTemp do 
    begin 
      if VerFeriados(DtAtual,DateToStr(dDtTemp)) then 
      begin 
        Result := Result - 1; 
        dDtTemp := IncDay(dDtTemp, 1); 
      end 
      else 
        Break; 
    end; 
  end; 
end;



Responder Citar