Array
(
)

Retorno HSBC - Valor de juros

Bico
   - 09 fev 2006

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
   - 10 fev 2006

Sobe


Weber
   - 10 fev 2006

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.


Bico
   - 10 fev 2006

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


Weber
   - 10 fev 2006

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

#Código

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]), -2))); //6.Santa
cFeriados.Add(FormatDateTime(´dd/mm´,IncDay(StrToDate(cFeriados[0]),-47))); //Carnaval
cFeriados.Add(FormatDateTime(´dd/mm´,IncDay(StrToDate(cFeriados[0]), 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] = FormatDateTime(´dd/mm´,dDtTemp) then
begin
for nY := 0 to cFeriados.Count -1 do
if cFeriados[nY] = 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;