#!/usr/bin/perl -w
# This file is based purely on Stephen Langenhoven's original ZA.pm file.
# In order to use this file, rather than using a stock code/number, the user
# must look for the unit trust ID number in the path of the Equinox site that
# profiles the relevant unit trust (or closest unit trust to). For instance,
# http://www.equinox.co.za/unittrusts/funds/funddetails.asp?fundid=16200 is the
# profile of the "Liberty Resources Fund (C)". As a result, the fundid to be used
# to query that fund is 16200.
# Rolf Endres
# 2009.10.09
package Finance::Quote::ZA_UnitTrusts;
require 5.004;
our $VERSION = '1.49'; # VERSION
use strict;
use LWP::UserAgent;
use HTTP::Request::Common;
use HTML::TableExtract;
my $EQUINOX_MAINURL = ("http://www.equinox.co.za/");
my $EQUINOX_URL =
( $EQUINOX_MAINURL . "unittrusts/funds/funddetails.asp?fundid=" );
sub methods {
return ( za_unittrusts => \&za_unittrusts );
}
sub labels {
my @labels =
qw/method source name symbol currency last date isodate high low p_change/;
return ( EQUINOX => \@labels );
}
sub za_unittrusts {
my $quoter = shift;
my @symbols = @_;
my %info;
my ( $te, $ts, $row );
my @rows;
return unless @symbols;
my $ua = $quoter->user_agent;
foreach my $symbol (@symbols) {
my $url = $EQUINOX_URL . $symbol;
#print "[debug]: ", $url, "\n";
my $response = $ua->request( GET $url);
#print "[debug]: ", $response->content, "\n";
if ( !$response->is_success ) {
$info{ $symbol, "success" } = 0;
$info{ $symbol, "errormsg" } = "Error contacting URL";
next;
}
$te = HTML::TableExtract->new();
$te->parse( $response->content );
#print "[debug]: (parsed HTML)",$te, "\n";
unless ( $te->first_table_found() ) {
#print STDERR "no tables on this page\n";
$info{ $symbol, "success" } = 0;
$info{ $symbol, "errormsg" } = "Parse error";
next;
}
# GENERAL FIELDS
$info{ $symbol, "success" } = 1;
$info{ $symbol, "method" } = "Equinox";
$info{ $symbol, "symbol" } = $symbol;
$info{ $symbol, "currency" } = "ZAR";
$info{ $symbol, "source" } = $EQUINOX_MAINURL;
# NAME
$ts = $te->table_state( 0, 0 );
if ($ts) {
(@rows) = $ts->rows;
$info{ $symbol, "name" } = $rows[0][0];
$info{ $symbol, "name" } =~ s/Funds//;
$info{ $symbol, "name" } =~ s/Performances//;
$info{ $symbol, "name" } =~ s/Companies//;
$info{ $symbol, "name" } =~ s/Summary//;
$info{ $symbol, "name" } =~ s/Company//;
$info{ $symbol, "name" } =~ s/Management//;
$info{ $symbol, "name" } =~ s/A//;
$info{ $symbol, "name" } =~ s/Z//;
$info{ $symbol, "name" } =~ s/Risk//;
$info{ $symbol, "name" } =~ s/Funds//;
$info{ $symbol, "name" } =~ s/Sector//;
$info{ $symbol, "name" } =~ s/Funds//;
$info{ $symbol, "name" } =~ s/Domestic(.*)//s;
$info{ $symbol, "name" } =~ s/Foreign(.*)//s;
$info{ $symbol, "name" } =~ s/[^A-Za-z ()]//sg;
$info{ $symbol, "name" } =~ s/ //sg;
$info{ $symbol, "name" } =~ s/ //sg;
$info{ $symbol, "name" } =~ s/ //sg;
$info{ $symbol, "name" } =~ s/ //sg;
}
# LAST
$ts = $te->table_state( 1, 0 );
if ($ts) {
(@rows) = $ts->rows;
$info{ $symbol, "last" } = $rows[0][1];
$info{ $symbol, "last" } =~ tr/R //d;
}
# DATE
if ($ts) {
(@rows) = $ts->rows;
$quoter->store_date( \%info, $symbol, { eurodate => $rows[0][0] } );
}
}
return wantarray() ? %info : \%info;
}
1;
=head1 NAME
Finance::Quote::ZA_UnitTrusts - Obtain South African unit trust prices from
www.equinox.co.za
=head1 SYNOPSIS
use Finance::Quote;
$q = Finance::Quote->new;
# Don't know anything about failover yet...
=head1 DESCRIPTION
This module obtains information about South African Unit Trusts from
www.equinox.co.za.
=head1 LABELS RETURNED
Information available from Equinox may include the following labels:
method source name symbol currency date nav last price
=head1 SEE ALSO
Equinox website - http://www.equinox.co.za/
Finance::Quote
=cut