summaryrefslogtreecommitdiffstats
path: root/kmymoney2/misc/financequote.pl
diff options
context:
space:
mode:
Diffstat (limited to 'kmymoney2/misc/financequote.pl')
-rw-r--r--kmymoney2/misc/financequote.pl117
1 files changed, 117 insertions, 0 deletions
diff --git a/kmymoney2/misc/financequote.pl b/kmymoney2/misc/financequote.pl
new file mode 100644
index 0000000..201c342
--- /dev/null
+++ b/kmymoney2/misc/financequote.pl
@@ -0,0 +1,117 @@
+######################################################################
+### financequote.pl - KMyMoney interface to Finance::Quote
+###
+### derived from GnuCash finance-quote-helper script which is
+### Copyright 2001 Rob Browning <[email protected]>
+###
+### This program is free software; you can redistribute it and/or
+### modify it under the terms of the GNU General Public License as
+### published by the Free Software Foundation; either version 2 of
+### the License, or (at your option) any later version.
+###
+### This program is distributed in the hope that it will be useful,
+### but WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with this program# if not, contact:
+###
+### Free Software Foundation Voice: +1-617-542-5942
+### 59 Temple Place - Suite 330 Fax: +1-617-542-2652
+### Boston, MA 02111-1307, USA [email protected]
+######################################################################
+
+use diagnostics; # while testing
+use strict;
+use Data::Dumper;
+
+my $prgnam = "kmymoneyfq.pl";
+my $version = "1.00";
+# perl modules required by this routine and Finance::Quote
+my @modules = qw(Date::Manip Finance::Quote LWP XML::Parser XML::Writer);
+
+# main - check command line arguments
+
+my $testonly;
+my $listonly;
+# analyze the arguments
+foreach my $arg (@ARGV) {
+ my $listopt = "-l"; # I had a much slicker way of doing this but it stopped working...
+ my $testopt = "-t";
+ $testonly = 1 if $arg =~ $testopt;
+ $listonly = 1 if $arg =~ $listopt;
+}
+
+# test call; check that all required modules are present
+if ($testonly) {
+ my @absent_modules; # to build list of missing modules
+
+ foreach my $module (@modules) {
+ if (!eval "require $module") {
+ push (@absent_modules, $module);
+ }
+ }
+ if (@absent_modules) {
+ foreach my $module (@absent_modules) {
+ print STDERR " ".$module."\n";
+ }
+ exit 254; # missing modules exit code for kmymoney
+ }
+ exit 0;
+}
+
+# load the required modules
+foreach my $module (@modules) {
+ eval "require $module";
+ $module->import();
+}
+
+# create a finance quote object and set required parameters
+my $q = Finance::Quote->new();
+$q->set_currency(); # disable any currency conversion
+$q->timeout(60); # timeout 60 seconds
+$q->failover(0); # disable failover
+
+# process call for exchange list only
+if ($listonly) {
+ my @sources = $q->sources();
+ foreach my $source (@sources) {
+ print "$source\n";
+ }
+ exit 0;
+}
+
+my $source = $ARGV[0];
+my $symbol = $ARGV[1];
+
+#print "\tfinding price for <$symbol> from <$source>\n";
+my %qhash = $q->fetch($source, $symbol); # get price data from F::Q
+#my %qhash = ("RHATsuccess" => 1, "RHATdate" => "4/4/2004", "RHATcurrency" => "USD",
+ #"RHATbid" => "25.55", "RHATask" => "26.04");
+#print Dumper(%qhash);
+my $errcode;
+$errcode = 0;
+
+if (!%qhash) { $errcode = 1;} # no data from fq (?bad exchange?)
+ elsif ($qhash {$symbol, "success"} != 1) {$errcode = 2;} # got data but quote failed (?bad symbol?)
+ elsif (!$qhash{$symbol, "last"}) {$errcode = 3;} # can't find a price (?hmmm?)
+if ($errcode != 0) {
+ print "Error " => "$errcode";
+} else {
+ # extract the date and convert from m/d/yyyy to yyyy-mm-dd
+ my ($usdate, $month, $day, $year, $yyyymmdd);
+ $usdate = $qhash{$symbol, "date"};
+ ($month,$day,$year) = ($usdate =~ /([0-9]+)\/([0-9]+)\/([0-9]+)/);
+ # i'm sure I can do the folowing with a regex but I'm just too idle...
+ $month = "0$month" if ($month < 9);
+ $day = "0$day" if ($day < 9);
+ $yyyymmdd = "$year-$month-$day";
+ # and the price
+ # (tried having bid and ask here, but could be undef for some stocks (IBM)
+ # and looked pretty unrealistic for others (e.g. RHAT on 15/5/04 was 12.09-38.32!))
+ my $price = $qhash {$symbol, "last"};
+
+ print "\"$symbol\",\"$yyyymmdd\",\"$price\"";
+}
+