Advertisement
filhotecmail

Financeiro.YMOFXReader

Aug 19th, 2020
1,786
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 6.81 KB | None | 0 0
  1. unit Financeiro.YMOFXReader;
  2.  
  3. interface
  4.  
  5. uses classes, SysUtils, Controls, dialogs;
  6.  
  7. type
  8.   TOFXItem = class
  9.     MovType : string;
  10.     MovDate : TDate;
  11.     Value : double;
  12.     ID : string;
  13.     Document : string;
  14.     Refnum: string;
  15.     Desc : string;
  16.   end;
  17.  
  18.   TYMOFXReader = class(TComponent)
  19.   public
  20.     BankID : integer;
  21.     AccountID : string;
  22.     AccountType : string;
  23.     InitialBalance : double;
  24.     FinalBalance : double;
  25.     constructor Create( AOwner: TComponent ); override;
  26.     destructor Destroy; override;
  27.     function Process: boolean;
  28.     function Get(iIndex: integer): TOFXItem;
  29.     function Count: integer;
  30.   private
  31.     FOFXFile : string;
  32.     FListItems : TList;
  33.     procedure Clear;
  34.     procedure Delete( iIndex: integer );
  35.     function Add: TOFXItem;
  36.     function PrepareFloat(const sString : string ) : string;
  37.     function InfLine ( sLine : string ): string;
  38.     function FindString (const sSubString, sString : string ): boolean;
  39.     function ReplaceString(sString: string; const sOld: string; const sNew: string; bInsensitive : boolean = true): string;
  40.   protected
  41.   published
  42.     property OFXFile: string read FOFXFile write FOFXFile;
  43.   end;
  44.  
  45. procedure Register;
  46.  
  47. implementation
  48.  
  49. uses rotina.Rotinas;
  50.  
  51. constructor TYMOFXReader.Create(AOwner: TComponent);
  52. begin
  53.   inherited Create(AOwner);
  54.   FListItems := TList.Create;
  55. end;
  56.  
  57. destructor TYMOFXReader.Destroy;
  58. begin
  59.   FListItems.Free;
  60.   inherited Destroy;
  61. end;
  62.  
  63. procedure TYMOFXReader.Delete( iIndex: integer );
  64. begin
  65.   TOFXItem(FListItems.Items[iIndex]).Free;
  66.   FListItems.Delete( iIndex );
  67. end;
  68.  
  69. procedure TYMOFXReader.Clear;
  70. begin
  71.   while FListItems.Count > 0 do
  72.   begin
  73.     Delete(0);
  74.   end;
  75.   FListItems.Clear;
  76. end;
  77.  
  78. function TYMOFXReader.Count: integer;
  79. begin
  80.   Result := FListItems.Count;
  81. end;
  82.  
  83. function TYMOFXReader.Get(iIndex: integer): TOFXItem;
  84. begin
  85.   Result := TOFXItem(FListItems.Items[iIndex]);
  86. end;
  87.  
  88. function TYMOFXReader.Process: boolean;
  89. var
  90.   oFile : TStringList;
  91.   i : integer;
  92.   bOFX : boolean;
  93.   oItem : TOFXItem;
  94.   data, sLine : string;
  95.   dBalance : double;
  96. begin
  97.   Result := false;
  98.   Clear;
  99.   bOFX := false;
  100.   if not FileExists(FOFXFile) then
  101.   begin
  102.     exit;
  103.   end;
  104.   oFile := TStringList.Create;
  105.   try
  106.     oFile.LoadFromFile(FOFXFile);
  107.     dBalance := 0;
  108.     i        := 0;
  109.     while i < oFile.Count do
  110.     begin
  111.       sLine := oFile.Strings[i];
  112.       if FindString('<OFX>', sLine) then
  113.       begin
  114.         bOFX := true;
  115.       end;
  116.       if bOFX then
  117.       begin
  118.         if FindString('<BANKID>'  , sLine) then BankID       := StrToIntDef(InfLine(sLine), 0); // BankID (banco)
  119.         if FindString('<ACCTID>'  , sLine) then AccountID    := InfLine(sLine); // AccountID (conta)
  120.         if FindString('<ACCTTYPE>', sLine) then AccountType  := InfLine(sLine); // AccountType (tipo de conta)
  121.         if FindString('<LEDGER>'  , sLine) then FinalBalance := StrToFloat(PrepareFloat(InfLine(sLine))); // FinalBalance  (balan�o final)
  122.         if FindString('<STMTTRN>' , sLine) then
  123.         begin
  124.           oItem := Add;
  125.           Inc(i);
  126.           sLine := oFile.Strings[i];
  127.           if FindString('<TRNTYPE>',  sLine) then
  128.           begin
  129.             oItem.MovType := InfLine(sLine);
  130.           end;
  131.           Inc(i);
  132.           sLine := oFile.Strings[i];
  133.           if FindString('<DTPOSTED>', sLine) then
  134.           begin
  135.             data          := copy(InfLine(sLine),1,4) +'/' + copy(InfLine(sLine),5,2) + '/' + copy(InfLine(sLine),7,2);
  136.             oItem.MovDate := EncodeDate(StrToIntDef(copy(InfLine(sLine),1,4), 0), StrToIntDef(copy(InfLine(sLine),5,2), 0), StrToIntDef(copy(InfLine(sLine),7,2), 0));
  137.           end;
  138.           //ELSE
  139.           Inc(i);
  140.           sLine := oFile.Strings[i];
  141.           if FindString('<TRNAMT>',   sLine) then
  142.           begin
  143.             oItem.Value := StrToFloat(PrepareFloat(InfLine(sLine)));
  144.             dBalance    := dBalance - oItem.Value;
  145.           end;
  146.           Inc(i);
  147.           sLine := oFile.Strings[i];
  148.           if FindString('<FITID>',    sLine) then
  149.           begin
  150.             oItem.ID := InfLine(sLine);
  151.           end;
  152.           Inc(i);
  153.           sLine := oFile.Strings[i];
  154.           if (FindString('<CHKNUM>',   sLine)) or  ( FindString('<CHECKNUM>', sLine)) then
  155.           begin
  156.             oItem.Document := InfLine(sLine);
  157.           end;
  158.           Inc(i);
  159.           sLine := oFile.Strings[i];
  160.           if FindString('<REFNUM>',  sLine) then
  161.           begin
  162.             oItem.Refnum := InfLine(sLine);
  163.             inc(i);
  164.           end;
  165.           sLine := oFile.Strings[i];
  166.           if FindString('<PAYEEID>', sLine) then
  167.           begin
  168.             Inc(i);
  169.             sLine := oFile.Strings[i];
  170.           end;
  171.           if FindString('<MEMO>',  sLine) then
  172.           begin
  173.             oItem.Desc := InfLine(sLine);
  174.           end;
  175.         end;
  176.       end;
  177.       Inc(i);
  178.     end;
  179.     InitialBalance := FinalBalance + dBalance;
  180.     Result := bOFX;
  181.   finally
  182.     oFile.Free;
  183.   end;
  184. end;
  185.  
  186. function TYMOFXReader.PrepareFloat(const sString : string ) : string;
  187. begin
  188.   Result := sString;
  189.   Result := ReplaceString(Result, '.', TQRotinas.setDecimalSeparator);
  190.   Result := ReplaceString(Result, ',', TQRotinas.setDecimalSeparator);
  191. end;
  192.  
  193. function TYMOFXReader.ReplaceString(sString: string; const sOld: string; const sNew: string; bInsensitive : boolean = true): string;
  194. var
  195.    iPosition: integer ;
  196.    sTempNew: string ;
  197. begin
  198.    iPosition := 1;
  199.    sTempNew := '';
  200.    while (iPosition > 0) do
  201.    begin
  202.       if bInsensitive then iPosition := AnsiPos(UpperCase(sOld),UpperCase(sString))
  203.                       else iPosition := AnsiPos(sOld,sString);
  204.       if (iPosition > 0) then
  205.       begin
  206.          sTempNew := sTempNew + copy(sString, 1, iPosition - 1) + sNew;
  207.          sString  := copy(sString, iPosition + Length(sOld), Length(sString) );
  208.       end;
  209.    end;
  210.    sTempNew := sTempNew + sString;
  211.    Result   := sTempNew;
  212. end;
  213.  
  214. function TYMOFXReader.InfLine ( sLine : string ): string;
  215. var
  216.   iTemp : integer;
  217.   Fim: integer;
  218. begin
  219.   Result := '';
  220.   sLine := Trim(sLine);
  221.   if FindString('>', sLine) then
  222.   begin
  223.     sLine := Trim(sLine);
  224.     iTemp := Pos('>', sLine);
  225.     //detecta fim do campo na linha
  226.     if pos('</',sline) > 0 then fim := pos('</',sline)
  227.                            else fim := Length(sLine)+1;
  228.      Result := copy(sLine, iTemp+1, fim-(iTemp+1));
  229.   end;
  230. end;
  231.  
  232. function TYMOFXReader.Add: TOFXItem;
  233. var
  234.   oItem : TOFXItem;
  235. begin
  236.   oItem := TOFXItem.Create;
  237.   FListItems.Add(oItem);
  238.   Result := oItem;
  239. end;
  240.  
  241. function TYMOFXReader.FindString (const sSubString, sString : string ): boolean;
  242. begin
  243.   Result := Pos(UpperCase(sSubString), UpperCase(sString)) > 0;
  244. end;
  245.  
  246. procedure Register;
  247. begin
  248.   RegisterComponents('OFXReader', [TYMOFXReader]);
  249. end;
  250.  
  251. end.
  252.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement