#!/usr/bin/perl -w # # Copyright (C) 1998, Dj Padzensky # Copyright (C) 1998, 1999 Linas Vepstas # Copyright (C) 2000, Yannick LE NY # Copyright (C) 2000, Paul Fenwick # Copyright (C) 2000, Brent Neal # Copyright (C) 2020, Caleb Begly # # 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 package Finance::Quote::Fidelity; require 5.005; use strict; use vars qw/$FIDELITY_URL /; use LWP::UserAgent; use HTTP::Request::Common; use constant DEBUG => $ENV{DEBUG}; use if DEBUG, 'Smart::Comments'; our $VERSION = '1.51'; # VERSION $FIDELITY_URL = ("https://fundresearch.fidelity.com/mutual-funds/fidelity-funds-daily-pricing-yields/download"); sub methods {return (fidelity => \&fidelity, fidelity_direct => \&fidelity);} { my @labels = qw/exchange name number nav change ask date isodate yield price method/; sub labels { return (fidelity => \@labels, fidelity_direct => \@labels); } } # ======================================================================= # the fidelity routine gets quotes from fidelity investments # sub fidelity { my $quoter = shift; my @symbols = @_; return unless @symbols; my(%aa, @q, $sym, $k, $ua, $reply); # Build a small hash of symbols people want, because it provides a # quick and easy way to only return desired symbols. my %symbolhash; %symbolhash = map{$_, 1} @symbols; # the fidelity pages are comma-separated-values (csv's) # Grab the page with all funds listed $ua = $quoter->user_agent; $reply = $ua->request(GET $FIDELITY_URL); if ($reply->is_success) { foreach (split('\015?\012',$reply->content)) { my @q = $quoter->parse_csv($_) or next; $sym = $q[1] or next; $sym =~ s/^ +//; # Skip symbols we didn't ask for. next unless (defined($symbolhash{$sym})); ### q : @q $aa {$sym, "exchange"} = "Fidelity"; # Fidelity $aa {$sym, "method"} = "fidelity_direct"; ($aa {$sym, "name"} = $q[0]) =~ s/^\s+//; $aa {$sym, "name"} =~ s/\s+$//; $aa {$sym, "symbol"} = $sym; ($aa {$sym, "nav"} = $q[2]) =~ s/^\s+// if defined($q[2]); ($aa {$sym, "div"} = $q[3]) =~ s/^\s+// if defined($q[3]); ($aa {$sym, "p_change"} = $q[5]) =~ s/^\s+// if defined($q[5]); ($aa {$sym, "yield"} = $q[6]) =~ s/^\s+// if defined($q[6]); ($aa {$sym, "yield"} = $q[7]) =~ s/^\s+// if defined($q[7]); ($aa {$sym, "yield"} = $q[8]) =~ s/^\s+// if defined($q[8]); $aa {$sym, "price"} = $aa{$sym, "nav"} if defined($q[2]); $aa {$sym, "success"} = 1; $aa {$sym, "currency"} = "USD"; $quoter->store_date(\%aa, $sym, {usdate => $q[12]}); } } return %aa if wantarray; return \%aa; } 1; =head1 NAME Finance::Quote::Fidelity - Obtain information from Fidelity Investments. =head1 SYNOPSIS use Finance::Quote; $q = Finance::Quote->new; %info = Finance::Quote->fetch("fidelity","FBGRX"); %info = Finance::Quote->fetch("fidelity_direct","FBGRX"); =head1 DESCRIPTION This module obtains information from Fidelity Investments, http://www.fidelity.com/. This module is loaded by default on the Finance::Quote object. It is also possible to load this module explicitly by passing "Fidelity" as one of Finance::Quote->new()'s parameters. The "fidelity" fetch method may make use of failover modules. The "fidelity_direct" method will only obtain information directly from Fidelity. Information returned by this module is governed by Fidelity Investment's terms and conditions. =head1 LABELS RETURNED The following labels may be returned by Finance::Quote::Fidelity: exchange, name, nav, p_change, date, yield, price. =head1 SEE ALSO Fidelity Investments, http://www.fidelity.com/ =cut