#!/usr/bin/perl -w
#
# Copyright (C) 1998, Dj Padzensky <djpadz@padz.net>
# Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org>
# Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com>
# Copyright (C) 2000, Paul Fenwick <pjf@cpan.org>
# Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net>
# Copyright (C) 2000, Volker Stuerzl <volker.stuerzl@gmx.de>
# Copyright (C) 2002, Rainer Dorsch <rainer.dorsch@informatik.uni-stuttgart.de>
#
# 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA
#
#
# This code derived from Padzensky's work on package Finance::YahooQuote,
# but extends its capabilites to encompas a greater number of data sources.
#
# This code was developed as part of GnuCash <http://www.gnucash.org/>
#
# $Id: Union.pm,v 1.3 2005/03/20 01:44:13 hampton Exp $
package Finance::Quote::Union;
require 5.005;
use strict;
use LWP::UserAgent;
use HTTP::Request::Common;
our $VERSION = '1.52'; # VERSION
sub methods { return (unionfunds => \&unionfunds); }
sub labels { return (unionfunds => [qw/exchange name date isodate price method/]); }
# =======================================================================
# The unionfunds routine gets quotes of UNION funds (Union Invest)
# On their website UNION provides a csv file in the format
# label1,label2,...
# name1,symbol1,buy1,bid1,...
# name2,symbol2,buy2,bid2,...
# ...
#
# This subroutine was written by Volker Stuerzl <volker.stuerzl@gmx.de>
sub unionfunds
{
my $quoter = shift;
my @funds = @_;
return unless @funds;
my $ua = $quoter->user_agent;
my (%fundhash, @q, %info, $tempdate);
# create hash of all funds requested
foreach my $fund (@funds)
{
$fundhash{$fund} = 0;
}
# get csv data
my $response = $ua->request(GET &unionurl);
if ($response->is_success)
{
# Retrive date. This comes from the last line of the CSV file.
foreach (split('\015?\012',$response->content))
{
@q = split(/,/) or next;
$tempdate=$q[0];
}
# process csv data
foreach (split('\015?\012',$response->content))
{
# @q = $quoter->parse_csv($_) or next;
@q = split(/,/) or next;
next unless (defined $q[1]);
if (exists $fundhash{$q[1]})
{
$fundhash{$q[1]} = 1;
$info{$q[1], "exchange"} = "UNION";
$info{$q[1], "name"} = $q[1];
$info{$q[1], "symbol"} = $q[1];
$info{$q[1], "price"} = $q[3];
$info{$q[1], "last"} = $q[3];
$quoter->store_date(\%info, $q[1], {eurodate => $tempdate});
$info{$q[1], "method"} = "unionfunds";
$info{$q[1], "currency"} = "EUR";
$info{$q[1], "success"} = 1;
}
}
# check to make sure a value was returned for every fund requested
foreach my $fund (keys %fundhash)
{
if ($fundhash{$fund} == 0)
{
$info{$fund, "success"} = 0;
$info{$fund, "errormsg"} = "No data returned";
}
}
}
else
{
foreach my $fund (@funds)
{
$info{$fund, "success"} = 0;
$info{$fund, "errormsg"} = "HTTP error";
}
}
return wantarray() ? %info : \%info;
}
# UNION provides a csv file named preise.csv containing the prices of all
# their funds for the most recent business day.
sub unionurl
{
return "https://www.union-investment.de/preise.csv";
}
1;
=head1 NAME
Finance::Quote::Union - Obtain quotes from UNION (Zurich Financial Services Group).
=head1 SYNOPSIS
use Finance::Quote;
$q = Finance::Quote->new;
%stockinfo = $q->fetch("unionfunds","975788");
=head1 DESCRIPTION
This module obtains information about UNION managed funds.
Information returned by this module is governed by UNION's terms
and conditions.
=head1 LABELS RETURNED
The following labels may be returned by Finance::Quote::UNION:
exchange, name, date, price, last.
=head1 SEE ALSO
UNION (Union Invest), http://www.union-invest.de/
=cut