aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xbin/send-reports294
m---------commonlib0
-rw-r--r--conf/crontab.ugly6
-rw-r--r--conf/general.yml-example2
-rw-r--r--conf/httpd.conf-example1
-rw-r--r--db/schema.sql10
-rw-r--r--db/schema_0013-add_send_method_column_to_open311conf.sql7
-rw-r--r--db/schema_0014-add_send_fail_columns_to_problem.sql10
-rw-r--r--perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATE.pm248
-rw-r--r--perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATE/Exception.pm64
-rw-r--r--perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATEResponse.pm183
-rw-r--r--perllib/BarnetInterfaces/service/ZLBB_SERVICE_ORDER.pm166
-rw-r--r--perllib/BarnetTypemaps/service.pm103
-rw-r--r--perllib/BarnetTypes/BAPIRET2.pm219
-rw-r--r--perllib/BarnetTypes/BAPI_TTET_ADDRESS_COM.pm165
-rw-r--r--perllib/BarnetTypes/CRMT_SERVICE_REQUEST_TEXT.pm102
-rw-r--r--perllib/BarnetTypes/RfcException/Message.pm111
-rw-r--r--perllib/BarnetTypes/RfcException/Message/Number.pm65
-rw-r--r--perllib/BarnetTypes/TABLE_OF_BAPIRET2.pm117
-rw-r--r--perllib/BarnetTypes/TABLE_OF_CRMT_SERVICE_REQUEST_TEXT.pm104
-rw-r--r--perllib/BarnetTypes/Z_CRM_SERVICE_ORDER_CREATE/RfcException.pm123
-rw-r--r--perllib/BarnetTypes/Z_CRM_SERVICE_ORDER_CREATE/RfcExceptions.pm65
-rw-r--r--perllib/BarnetTypes/char1.pm65
-rw-r--r--perllib/BarnetTypes/char10.pm65
-rw-r--r--perllib/BarnetTypes/char132.pm65
-rw-r--r--perllib/BarnetTypes/char2.pm65
-rw-r--r--perllib/BarnetTypes/char20.pm65
-rw-r--r--perllib/BarnetTypes/char220.pm65
-rw-r--r--perllib/BarnetTypes/char241.pm65
-rw-r--r--perllib/BarnetTypes/char3.pm65
-rw-r--r--perllib/BarnetTypes/char30.pm65
-rw-r--r--perllib/BarnetTypes/char32.pm65
-rw-r--r--perllib/BarnetTypes/char35.pm65
-rw-r--r--perllib/BarnetTypes/char40.pm65
-rw-r--r--perllib/BarnetTypes/char5.pm65
-rw-r--r--perllib/BarnetTypes/char50.pm65
-rw-r--r--perllib/BarnetTypes/numeric3.pm65
-rw-r--r--perllib/BarnetTypes/numeric6.pm65
-rw-r--r--perllib/FixMyStreet/App/Controller/Admin.pm63
-rw-r--r--perllib/FixMyStreet/App/Controller/Report/New.pm19
-rwxr-xr-xperllib/FixMyStreet/App/Controller/Static.pm4
-rw-r--r--perllib/FixMyStreet/DB.pm6
-rw-r--r--perllib/FixMyStreet/DB/Result/Abuse.pm6
-rw-r--r--perllib/FixMyStreet/DB/Result/AdminLog.pm6
-rw-r--r--perllib/FixMyStreet/DB/Result/Alert.pm22
-rw-r--r--perllib/FixMyStreet/DB/Result/AlertSent.pm6
-rw-r--r--perllib/FixMyStreet/DB/Result/AlertType.pm6
-rw-r--r--perllib/FixMyStreet/DB/Result/Comment.pm26
-rw-r--r--perllib/FixMyStreet/DB/Result/Contact.pm7
-rw-r--r--perllib/FixMyStreet/DB/Result/ContactsHistory.pm6
-rw-r--r--perllib/FixMyStreet/DB/Result/Open311conf.pm8
-rw-r--r--perllib/FixMyStreet/DB/Result/Problem.pm53
-rw-r--r--perllib/FixMyStreet/DB/Result/Questionnaire.pm6
-rw-r--r--perllib/FixMyStreet/DB/Result/Secret.pm6
-rw-r--r--perllib/FixMyStreet/DB/Result/Session.pm6
-rw-r--r--perllib/FixMyStreet/DB/Result/Token.pm6
-rw-r--r--perllib/FixMyStreet/DB/Result/User.pm6
-rw-r--r--perllib/SOAP/WSDL/Serializer/XSD.pm148
-rw-r--r--perllib/Utils.pm41
-rw-r--r--templates/web/default/admin/search_users.html2
-rw-r--r--templates/web/default/common_header_tags.html2
-rw-r--r--templates/web/default/report/_main.html7
-rwxr-xr-xtemplates/web/fixmystreet/faq/faq-en-gb.html18
-rw-r--r--templates/web/fixmystreet/footer.html1
-rw-r--r--templates/web/fixmystreet/report/new/councils_text_all.html4
-rwxr-xr-xtemplates/web/fixmystreet/static/privacy.html80
-rw-r--r--templates/web/fixmystreet/tracking_code.html1
67 files changed, 3642 insertions, 135 deletions
diff --git a/bin/send-reports b/bin/send-reports
index 22bd12732..a0c084c1c 100755
--- a/bin/send-reports
+++ b/bin/send-reports
@@ -22,6 +22,7 @@ use CronFns;
use FixMyStreet::App;
use EastHantsWSDL;
+use BarnetInterfaces::service::ZLBB_SERVICE_ORDER;
use Utils;
use mySociety::Config;
use mySociety::EmailUtil;
@@ -30,6 +31,22 @@ use mySociety::Web qw(ent);
use Open311;
+# maximum number of webservice attempts to send before not trying any more (XXX may be better in config?)
+use constant SEND_FAIL_RETRIES_CUTOFF => 3;
+
+# specific council numbers
+use constant COUNCIL_ID_BARNET => 2489;
+use constant COUNCIL_ID_EAST_HANTS => 2330;
+
+use constant MAX_LINE_LENGTH => 132;
+
+# send_method config values found in by-area config data, for selecting to appropriate method
+use constant SEND_METHOD_EMAIL => 'email';
+use constant SEND_METHOD_OPEN311 => 'open311';
+use constant SEND_METHOD_BARNET => 'barnet';
+use constant SEND_METHOD_EAST_HANTS => 'easthants';
+use constant SEND_METHOD_LONDON => 'london';
+
# Set up site, language etc.
my ($verbose, $nomail) = CronFns::options();
my $base_url = mySociety::Config::get('BASE_URL');
@@ -40,6 +57,9 @@ my $unsent = FixMyStreet::App->model("DB::Problem")->search( {
whensent => undef,
council => { '!=', undef },
} );
+
+my %sending_skipped_by_method = ();
+
my (%notgot, %note);
while (my $row = $unsent->next) {
@@ -56,8 +76,10 @@ while (my $row = $unsent->next) {
next;
}
- my $send_email = 0;
- my $send_web = 0;
+ # Due to multiple councils, it's possible to want to send both by email *and* another method
+ # NB: might need to revist this if multiple councils have custom send methods
+ my $send_email = 0;
+ my $send_method = 0;
# Template variables for the email
my $email_base_url = $cobrand->base_url_for_emails($row->cobrand_data);
@@ -118,6 +140,7 @@ while (my $row = $unsent->next) {
push @to, [ $council_email, $name ];
@recips = ($council_email);
+ $send_method = 0;
$send_email = 1;
$template = Utils::read_file("$FindBin::Bin/../templates/email/emptyhomes/" . $row->lang . "/submit.txt");
@@ -133,15 +156,37 @@ while (my $row = $unsent->next) {
foreach my $council (@councils) {
my $name = $areas_info->{$council}->{name};
push @dear, $name;
- if ($council == 2330) { # E. Hants have a web service
- $send_web = 'easthants';
+
+ # look in the DB to determine if there is a special handler for this council (e.g., open311, or custom)
+ my $council_config = FixMyStreet::App->model("DB::Open311conf")->search( { area_id => $council} )->first;
+ $send_method = $council_config->send_method if $council_config;
+ if ($council == COUNCIL_ID_EAST_HANTS) { # E. Hants have a web service
+ $send_method = SEND_METHOD_EAST_HANTS; # TODO: delete? should be in the db
$h{category} = 'Customer Services' if $h{category} eq 'Other';
- } elsif ($areas_info->{$council}->{type} eq 'LBO') { # London
- $send_web = 'london';
- } elsif ( my $endpoint = FixMyStreet::App->model("DB::Open311conf")->search( { area_id => $council, endpoint => { '!=', '' } } )->first ) {
- push @open311_councils, $endpoint;
- $send_web = 'open311';
- } else {
+ }
+
+ # if council lookup provided no explicit send_method, maybe there's some other criterion for setting it:
+ if (! $send_method) {
+ if ($areas_info->{$council}->{type} eq 'LBO') { # London
+ $send_method = SEND_METHOD_LONDON;
+ }
+ }
+ $send_email = 1 unless $send_method; # default to email if nothing explicit was provided
+
+ # currently: open311 or Barnet without an endpoint is useless, so check the endpoint is set
+ if ($send_method eq SEND_METHOD_OPEN311 or $send_method eq SEND_METHOD_BARNET) {
+ if ($council_config->endpoint) {
+ if ($send_method eq SEND_METHOD_OPEN311) {
+ push @open311_councils, $council_config;
+ }
+ } else {
+ print "Warning: no endpoint specified in config data for council=$council (will try email instead)\n";
+ $send_method = 0;
+ $send_email = 1;
+ }
+ }
+
+ if ($send_email) {
my $contact = FixMyStreet::App->model("DB::Contact")->find( {
deleted => 0,
area_id => $council,
@@ -160,7 +205,6 @@ while (my $row = $unsent->next) {
}
push @to, [ $council_email, $name ];
$recips{$council_email} = 1;
- $send_email = 1;
}
}
@recips = keys %recips;
@@ -199,15 +243,19 @@ while (my $row = $unsent->next) {
}
- unless ($send_email || $send_web) {
+ unless ($send_method) {
die 'Report not going anywhere for ID ' . $row->id . '!';
}
if (mySociety::Config::get('STAGING_SITE')) {
# on a staging server send emails to ourselves rather than the councils
- @recips = ( mySociety::Config::get('CONTACT_EMAIL') );
- $send_web = 0;
- $send_email = 1;
+ # ...webservice calls will only go through if explictly allowed here:
+ my @testing_councils = (COUNCIL_ID_BARNET);
+ unless (grep {$row->council eq $_} @testing_councils) {
+ @recips = ( mySociety::Config::get('CONTACT_EMAIL') );
+ $send_method = 0;
+ $send_email = 1;
+ }
} elsif ($site eq 'emptyhomes') {
my $council = $row->council;
my $country = $areas_info->{$council}->{country};
@@ -243,17 +291,28 @@ while (my $row = $unsent->next) {
);
}
- if ($send_web eq 'easthants') {
+ if ($send_method eq SEND_METHOD_EAST_HANTS) {
$h{message} = construct_easthants_message(%h);
if (!$nomail) {
$result *= post_easthants_message(%h);
}
- } elsif ($send_web eq 'london') {
+ } elsif ($send_method eq SEND_METHOD_BARNET) {
+ $h{message} = construct_barnet_message(%h);
+ if (!$nomail) {
+ if (my $cutoff_msg = does_exceed_cutoff_limit($row, "barnet")) {
+ print "$cutoff_msg\n" if $verbose;
+ } else {
+ my ($barnet_result, $err_msg) = post_barnet_message( $row, %h );
+ update_send_fail_data($row, $err_msg) if $barnet_result;
+ $result *= $barnet_result;
+ }
+ }
+ } elsif ($send_method eq SEND_METHOD_LONDON) {
$h{message} = construct_london_message(%h);
if (!$nomail) {
$result *= post_london_report( $row, %h );
}
- } elsif ($send_web eq 'open311') {
+ } elsif ($send_method eq SEND_METHOD_OPEN311) {
foreach my $conf ( @open311_councils ) {
print 'posting to end point for ' . $conf->area_id . "\n" if $verbose;
@@ -316,6 +375,17 @@ if ($verbose) {
}
}
+# not conditional on verbose because these can be considered failures (more relevant than one-off error messages?)
+if (keys %sending_skipped_by_method) {
+ my $c = 0;
+ print "\nProblem reports that send-reports did not attempt to send because retries >= " . SEND_FAIL_RETRIES_CUTOFF . ":\n";
+ foreach my $send_method (sort keys %sending_skipped_by_method) {
+ printf " %-24s %4d\n", "$send_method:", $sending_skipped_by_method{$send_method};
+ $c+=$sending_skipped_by_method{$send_method};
+ }
+ printf " %-24s %4d\n", "Total:", $c;
+}
+
sub _get_district_for_contact {
my ( $lat, $lon ) = @_;
my $district =
@@ -358,6 +428,8 @@ sub construct_easthants_message {
$message .= <<EOF;
Subject: $h{title}
+Category: $h{category}
+
Details: $h{detail}
$h{fuzzy}, or to provide an update on the problem, please visit the following link:
@@ -390,6 +462,115 @@ sub post_easthants_message {
return $return;
}
+# currently just blind copy of construct_easthants_message
+sub construct_barnet_message {
+ my %h = @_;
+ my $message = <<EOF;
+Subject: $h{title}
+
+Details: $h{detail}
+
+$h{fuzzy}, or to provide an update on the problem, please visit the following link:
+
+$h{url}
+
+$h{closest_address}
+EOF
+}
+
+sub post_barnet_message {
+ my ( $problem, %h ) = @_;
+ my $return = 1;
+ my $err_msg = "";
+
+ my $default_kbid = 14; # This is the default, "Street Scene"
+ my $kbid = sprintf( "%050d", Utils::barnet_categories()->{$h{category}} || $default_kbid);
+
+ my $geo_code = "$h{easting} $h{northing}";
+
+ my $interface = BarnetInterfaces::service::ZLBB_SERVICE_ORDER->new();
+
+ my ($nearest_postcode, $nearest_street);
+ for ($h{closest_address}) {
+ $nearest_postcode = sprintf("%-10s", $1) if /Nearest postcode [^:]+: ((\w{1,4}\s?\w+|\w+))/;
+ # use partial postcode or comma as delimiter, strip leading number (possible letter 221B) off too
+ # "99 Foo Street, London N11 1XX" becomes Foo Street
+ # "99 Foo Street N11 1XX" becomes Foo Street
+ $nearest_street = sprintf("%-30s", $1) if /Nearest road [^:]+: (?:\d+\w? )?(.*?)(\b[A-Z]+\d|,|$)/m;
+ }
+ my $postcode = $h{postcode} || $nearest_postcode; # use given postcode if available
+
+ # note: endpoint can be of form 'https://username:password@:url'
+ my $council_config = FixMyStreet::App->model("DB::Open311conf")->search( { area_id => COUNCIL_ID_BARNET} )->first;
+ if ($council_config and $council_config->endpoint) {
+ $interface->set_proxy($council_config->endpoint);
+ # Barnet web service doesn't like namespaces in the elements so use a prefix
+ $interface->set_prefix('urn');
+ } else {
+ die "Barnet webservice FAIL: looks like you're missing some config data: no endpoint (URL) found for area_id=" . COUNCIL_ID_BARNET;
+ }
+
+ eval {
+ my $result = $interface->Z_CRM_SERVICE_ORDER_CREATE( {
+ ET_RETURN => { # ignored by server
+ item => {
+ TYPE => "", ID => "", NUMBER => "", MESSAGE => "", LOG_NO => "", LOG_MSG_NO => "",
+ MESSAGE_V1 => "", MESSAGE_V2 => "", MESSAGE_V3 => "", MESSAGE_V4 => "", PARAMETER => "",
+ ROW => "", FIELD => "", SYSTEM => "",
+ },
+ },
+ IT_PROBLEM_DESC => { # MyTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT
+ item => [ # MyTypes::CRMT_SERVICE_REQUEST_TEXT
+ map { { TEXT_LINE => $_ } } split_text_with_entities(ent(encode_utf8($h{message})), 132) # char132
+ ],
+ },
+ IV_CUST_EMAIL => truncate_string_with_entities(ent(encode_utf8($h{email})), 241), # char241
+ IV_CUST_NAME => truncate_string_with_entities(ent(encode_utf8($h{name})), 50), # char50
+ IV_KBID => $kbid, # char50
+ IV_PROBLEM_ID => $h{id}, # char35
+ IV_PROBLEM_LOC => { # MyTypes::BAPI_TTET_ADDRESS_COM
+ COUNTRY2 => 'GB', # char2
+ REGION => "", # char3
+ COUNTY => "", # char30
+ CITY => "", # char30
+ POSTALCODE => $postcode, # char10
+ STREET => $nearest_street, # char30
+ STREETNUMBER => "", # char5
+ GEOCODE => $geo_code, # char32
+ },
+ IV_PROBLEM_SUB => truncate_string_with_entities(ent(encode_utf8($h{title})), 40), # char40
+ },
+ );
+ if ($result) {
+ # currently not using this: get_EV_ORDER_GUID (maybe that's the customer number in the CRM)
+ if (my $barnet_id = $result->get_EV_ORDER_NO()) {
+ $problem->external_id( $barnet_id );
+ $problem->external_body( 'Barnet Borough Council' ); # better to use $problem->body()?
+ $return = 0;
+ } else {
+ $err_msg = "Failed (problem id $h{id}): service returned no external id";
+ }
+ } else {
+ my %fault = (
+ 'code' => $result->get_faultcode(),
+ 'actor' => $result->get_faultactor(),
+ 'string' => $result->get_faultstring(),
+ # 'detail' => $result->get_detail(), # possibly only contains debug info
+ );
+ $fault{$_}=~s/^\s*|\s*$//g foreach keys %fault;
+ $fault{actor}&&=" (actor: $fault{actor})";
+ $err_msg = "Failed (problem id $h{id}): Fault $fault{code}$fault{actor}\n$fault{string}";
+ }
+
+ };
+ print "$err_msg\n" if $err_msg;
+ if ($@) {
+ my $e = shift;
+ print "Caught an error: $@\n";
+ }
+ return ($return, $err_msg);
+}
+
# London
sub construct_london_message {
@@ -489,3 +670,80 @@ sub london_lookup {
return $str;
}
+# for barnet webservice: max-length fields require truncate and split
+
+# truncate_string_with_entities
+# args: text to truncate
+# max number of chars
+# returns: string truncated
+# Note: must not partially truncate an entity (e.g., &amp;)
+sub truncate_string_with_entities {
+ my ($str, $max_len) = @_;
+ my $retVal = "";
+ foreach my $chunk (split /(\&(?:\#\d+|\w+);)/, $str) {
+ if ($chunk=~/^\&(\#\d+|\w+);$/){
+ my $next = $retVal.$chunk;
+ last if length $next > $max_len;
+ $retVal=$next
+ } else {
+ $retVal.=$chunk;
+ if (length $retVal > $max_len) {
+ $retVal = substr($retVal, 0, $max_len);
+ last
+ }
+ }
+ }
+ return $retVal
+}
+
+# split_text_with_entities into lines
+# args: text to be broken into lines
+# max length (option: uses constant MAX_LINE_LENGTH)
+# returns: array of lines
+# Must not to split an entity (e.g., &amp;)
+# Not worrying about hyphenating here, since a word is only ever split if
+# it's longer than the whole line, which is uncommon in genuine problem reports
+sub split_text_with_entities {
+ my ($text, $max_line_length) = @_;
+ $max_line_length ||= MAX_LINE_LENGTH;
+ my @lines;
+ foreach my $line (split "\n", $text) {
+ while (length $line > $max_line_length) {
+ if (! ($line =~ s/^(.{1,$max_line_length})\s// # break on a space
+ or $line =~ s/^(.{1,$max_line_length})(\&(\#\d+|\w+);)/$2/ # break before an entity
+ or $line =~ s/(.{$max_line_length})//)) { # break the word ruthlessly
+ $line =~ s/(.*)//; # otherwise gobble whole line (which is now shorter than max length)
+ }
+ push @lines, $1;
+ }
+ push @lines, $line;
+ }
+ return @lines;
+}
+
+# tests send_fail_count agains cutoff limit
+# args: problem (row from problem db)
+# returns false if there is no cutoff, otherwise error message
+sub does_exceed_cutoff_limit {
+ my ($problem, $council_name) = @_;
+ my $err_msg = "";
+ if ($problem->send_fail_count >= SEND_FAIL_RETRIES_CUTOFF) {
+ $sending_skipped_by_method{$council_name || '?'}++;
+ $council_name &&= " to $council_name";
+ $err_msg = "skipped: problem id=" . $problem->id . " send$council_name has failed "
+ . $problem->send_fail_count . " times, cutoff is " . SEND_FAIL_RETRIES_CUTOFF;
+ }
+ return $err_msg;
+}
+
+# update_send_fail_data records the failure (of a webservice send)
+# args: problem (row from problem db)
+# returns: no return value (updates record)
+sub update_send_fail_data {
+ my ($problem, $err_msg) = @_;
+ $problem->update( {
+ send_fail_count => $problem->send_fail_count + 1,
+ send_fail_timestamp => \'ms_current_timestamp()',
+ send_fail_reason => $err_msg
+ } );
+} \ No newline at end of file
diff --git a/commonlib b/commonlib
-Subproject 4c2e8e4d8b27aa043d5aa120622a659b56f494d
+Subproject f81ec03692fac90792fc102f88f0afbf3d2f73b
diff --git a/conf/crontab.ugly b/conf/crontab.ugly
index 2d4467aab..4052275ee 100644
--- a/conf/crontab.ugly
+++ b/conf/crontab.ugly
@@ -7,7 +7,11 @@
# $Id: crontab.ugly,v 1.23 2010-01-07 10:32:24 louise Exp $
PATH=/usr/local/bin:/usr/bin:/bin
+!!(* if ($vhost eq 'integration-staging.fixmystreet.com') { *)!!
+MAILTO=dave@mysociety.org
+!!(* } else { *)!!
MAILTO=cron-!!(*= $site *)!!@mysociety.org
+!!(* } *)!!
# On only one server
!!(* if ($vhost eq 'reportemptyhomes.com') { *)!!
@@ -18,7 +22,7 @@ MAILTO=cron-!!(*= $site *)!!@mysociety.org
#2 * * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-alerts.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-alerts" || echo "stalled?"
0,30 * * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-questionnaires.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-questionnaires" || echo "stalled?"
-!!(* } elsif (($vhost eq 'www.fixmystreet.com') || ($vhost eq 'matthew.fixmystreet.com')) { *)!!
+!!(* } elsif (($vhost eq 'www.fixmystreet.com') || ($vhost eq 'matthew.fixmystreet.com') || ($vhost eq 'integration-staging.fixmystreet.com')) { *)!!
5,10,15,20,25,30,35,40,45,50,55 * * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-reports.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-reports" || echo "stalled?"
0 0-8,10,11,13,14,16,17,19-23 * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-reports.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-reports" || echo "stalled?"
0 9,12,15,18 * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-reports.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-reports --verbose" || echo "stalled?"
diff --git a/conf/general.yml-example b/conf/general.yml-example
index 06af11a55..ec77e6ba8 100644
--- a/conf/general.yml-example
+++ b/conf/general.yml-example
@@ -61,3 +61,5 @@ RSS_LIMIT: '20'
# Should problem reports link to the council summary pages?
AREA_LINKS_FROM_PROBLEMS: '0'
+
+
diff --git a/conf/httpd.conf-example b/conf/httpd.conf-example
index c1b6d96c2..e7900161e 100644
--- a/conf/httpd.conf-example
+++ b/conf/httpd.conf-example
@@ -67,6 +67,7 @@ ExpiresByType text/css "access plus 10 years"
ExpiresByType application/javascript "access plus 10 years"
<Location /js/>
AddOutputFilter DEFLATE js
+ Header append Cache-Control "no-transform"
</Location>
# Don't want jslib being passed to Catalyst
diff --git a/db/schema.sql b/db/schema.sql
index 395d1c07b..5824b2d6d 100644
--- a/db/schema.sql
+++ b/db/schema.sql
@@ -189,7 +189,12 @@ create table problem (
send_questionnaire boolean not null default 't',
extra text, -- extra fields required for open311
flagged boolean not null default 'f',
- geocode bytea
+ geocode bytea,
+
+ -- logging sending failures (used by webservices)
+ send_fail_count integer not null default 0,
+ send_fail_reason text,
+ send_fail_timestamp timestamp
);
create index problem_state_latitude_longitude_idx on problem(state, latitude, longitude);
create index problem_user_id_idx on problem ( user_id );
@@ -419,5 +424,6 @@ create table open311conf (
area_id integer not null unique,
endpoint text not null,
jurisdiction text,
- api_key text
+ api_key text,
+ send_method text
);
diff --git a/db/schema_0013-add_send_method_column_to_open311conf.sql b/db/schema_0013-add_send_method_column_to_open311conf.sql
new file mode 100644
index 000000000..516fdd698
--- /dev/null
+++ b/db/schema_0013-add_send_method_column_to_open311conf.sql
@@ -0,0 +1,7 @@
+
+begin;
+
+ALTER table open311conf
+ ADD column send_method TEXT;
+
+commit;
diff --git a/db/schema_0014-add_send_fail_columns_to_problem.sql b/db/schema_0014-add_send_fail_columns_to_problem.sql
new file mode 100644
index 000000000..369c4118d
--- /dev/null
+++ b/db/schema_0014-add_send_fail_columns_to_problem.sql
@@ -0,0 +1,10 @@
+begin;
+
+ALTER table problem
+ ADD column send_fail_count integer not null default 0;
+ALTER table problem
+ ADD column send_fail_reason text;
+ALTER table problem
+ ADD column send_fail_timestamp timestamp;
+
+commit;
diff --git a/perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATE.pm b/perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATE.pm
new file mode 100644
index 000000000..2c398ab1b
--- /dev/null
+++ b/perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATE.pm
@@ -0,0 +1,248 @@
+
+package BarnetElements::Z_CRM_SERVICE_ORDER_CREATE;
+use strict;
+use warnings;
+
+{ # BLOCK to scope variables
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions' }
+
+__PACKAGE__->__set_name('Z_CRM_SERVICE_ORDER_CREATE');
+__PACKAGE__->__set_nillable();
+__PACKAGE__->__set_minOccurs();
+__PACKAGE__->__set_maxOccurs();
+__PACKAGE__->__set_ref();
+
+use base qw(
+ SOAP::WSDL::XSD::Typelib::Element
+ SOAP::WSDL::XSD::Typelib::ComplexType
+);
+
+our $XML_ATTRIBUTE_CLASS;
+undef $XML_ATTRIBUTE_CLASS;
+
+sub __get_attr_class {
+ return $XML_ATTRIBUTE_CLASS;
+}
+
+use Class::Std::Fast::Storable constructor => 'none';
+use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
+
+Class::Std::initialize();
+
+{ # BLOCK to scope variables
+
+my %ET_RETURN_of :ATTR(:get<ET_RETURN>);
+my %IT_PROBLEM_DESC_of :ATTR(:get<IT_PROBLEM_DESC>);
+my %IV_CUST_EMAIL_of :ATTR(:get<IV_CUST_EMAIL>);
+my %IV_CUST_NAME_of :ATTR(:get<IV_CUST_NAME>);
+my %IV_KBID_of :ATTR(:get<IV_KBID>);
+my %IV_PROBLEM_ID_of :ATTR(:get<IV_PROBLEM_ID>);
+my %IV_PROBLEM_LOC_of :ATTR(:get<IV_PROBLEM_LOC>);
+my %IV_PROBLEM_SUB_of :ATTR(:get<IV_PROBLEM_SUB>);
+
+__PACKAGE__->_factory(
+ [ qw( ET_RETURN
+ IT_PROBLEM_DESC
+ IV_CUST_EMAIL
+ IV_CUST_NAME
+ IV_KBID
+ IV_PROBLEM_ID
+ IV_PROBLEM_LOC
+ IV_PROBLEM_SUB
+
+ ) ],
+ {
+ 'ET_RETURN' => \%ET_RETURN_of,
+ 'IT_PROBLEM_DESC' => \%IT_PROBLEM_DESC_of,
+ 'IV_CUST_EMAIL' => \%IV_CUST_EMAIL_of,
+ 'IV_CUST_NAME' => \%IV_CUST_NAME_of,
+ 'IV_KBID' => \%IV_KBID_of,
+ 'IV_PROBLEM_ID' => \%IV_PROBLEM_ID_of,
+ 'IV_PROBLEM_LOC' => \%IV_PROBLEM_LOC_of,
+ 'IV_PROBLEM_SUB' => \%IV_PROBLEM_SUB_of,
+ },
+ {
+ 'ET_RETURN' => 'BarnetTypes::TABLE_OF_BAPIRET2',
+ 'IT_PROBLEM_DESC' => 'BarnetTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT',
+ 'IV_CUST_EMAIL' => 'BarnetTypes::char241',
+ 'IV_CUST_NAME' => 'BarnetTypes::char50',
+ 'IV_KBID' => 'BarnetTypes::char50',
+ 'IV_PROBLEM_ID' => 'BarnetTypes::char35',
+ 'IV_PROBLEM_LOC' => 'BarnetTypes::BAPI_TTET_ADDRESS_COM',
+ 'IV_PROBLEM_SUB' => 'BarnetTypes::char40',
+ },
+ {
+
+ 'ET_RETURN' => 'ET_RETURN',
+ 'IT_PROBLEM_DESC' => 'IT_PROBLEM_DESC',
+ 'IV_CUST_EMAIL' => 'IV_CUST_EMAIL',
+ 'IV_CUST_NAME' => 'IV_CUST_NAME',
+ 'IV_KBID' => 'IV_KBID',
+ 'IV_PROBLEM_ID' => 'IV_PROBLEM_ID',
+ 'IV_PROBLEM_LOC' => 'IV_PROBLEM_LOC',
+ 'IV_PROBLEM_SUB' => 'IV_PROBLEM_SUB',
+ }
+);
+
+} # end BLOCK
+
+
+
+
+
+
+} # end of BLOCK
+
+
+
+1;
+
+
+=pod
+
+=head1 NAME
+
+BarnetElements::Z_CRM_SERVICE_ORDER_CREATE
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined element
+Z_CRM_SERVICE_ORDER_CREATE from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+
+
+=head1 PROPERTIES
+
+The following properties may be accessed using get_PROPERTY / set_PROPERTY
+methods:
+
+=over
+
+=item * ET_RETURN
+
+ $element->set_ET_RETURN($data);
+ $element->get_ET_RETURN();
+
+
+
+
+=item * IT_PROBLEM_DESC
+
+ $element->set_IT_PROBLEM_DESC($data);
+ $element->get_IT_PROBLEM_DESC();
+
+
+
+
+=item * IV_CUST_EMAIL
+
+ $element->set_IV_CUST_EMAIL($data);
+ $element->get_IV_CUST_EMAIL();
+
+
+
+
+=item * IV_CUST_NAME
+
+ $element->set_IV_CUST_NAME($data);
+ $element->get_IV_CUST_NAME();
+
+
+
+
+=item * IV_KBID
+
+ $element->set_IV_KBID($data);
+ $element->get_IV_KBID();
+
+
+
+
+=item * IV_PROBLEM_ID
+
+ $element->set_IV_PROBLEM_ID($data);
+ $element->get_IV_PROBLEM_ID();
+
+
+
+
+=item * IV_PROBLEM_LOC
+
+ $element->set_IV_PROBLEM_LOC($data);
+ $element->get_IV_PROBLEM_LOC();
+
+
+
+
+=item * IV_PROBLEM_SUB
+
+ $element->set_IV_PROBLEM_SUB($data);
+ $element->get_IV_PROBLEM_SUB();
+
+
+
+
+
+=back
+
+
+=head1 METHODS
+
+=head2 new
+
+ my $element = BarnetElements::Z_CRM_SERVICE_ORDER_CREATE->new($data);
+
+Constructor. The following data structure may be passed to new():
+
+ {
+ ET_RETURN => { # BarnetTypes::TABLE_OF_BAPIRET2
+ item => { # BarnetTypes::BAPIRET2
+ TYPE => $some_value, # char1
+ ID => $some_value, # char20
+ NUMBER => $some_value, # numeric3
+ MESSAGE => $some_value, # char220
+ LOG_NO => $some_value, # char20
+ LOG_MSG_NO => $some_value, # numeric6
+ MESSAGE_V1 => $some_value, # char50
+ MESSAGE_V2 => $some_value, # char50
+ MESSAGE_V3 => $some_value, # char50
+ MESSAGE_V4 => $some_value, # char50
+ PARAMETER => $some_value, # char32
+ ROW => $some_value, # int
+ FIELD => $some_value, # char30
+ SYSTEM => $some_value, # char10
+ },
+ },
+ IT_PROBLEM_DESC => { # BarnetTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT
+ item => { # BarnetTypes::CRMT_SERVICE_REQUEST_TEXT
+ TEXT_LINE => $some_value, # char132
+ },
+ },
+ IV_CUST_EMAIL => $some_value, # char241
+ IV_CUST_NAME => $some_value, # char50
+ IV_KBID => $some_value, # char50
+ IV_PROBLEM_ID => $some_value, # char35
+ IV_PROBLEM_LOC => { # BarnetTypes::BAPI_TTET_ADDRESS_COM
+ COUNTRY2 => $some_value, # char2
+ REGION => $some_value, # char3
+ COUNTY => $some_value, # char30
+ CITY => $some_value, # char30
+ POSTALCODE => $some_value, # char10
+ STREET => $some_value, # char30
+ STREETNUMBER => $some_value, # char5
+ GEOCODE => $some_value, # char32
+ },
+ IV_PROBLEM_SUB => $some_value, # char40
+ },
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATE/Exception.pm b/perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATE/Exception.pm
new file mode 100644
index 000000000..ae95d3234
--- /dev/null
+++ b/perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATE/Exception.pm
@@ -0,0 +1,64 @@
+
+package BarnetElements::Z_CRM_SERVICE_ORDER_CREATE::Exception;
+use strict;
+use warnings;
+
+{ # BLOCK to scope variables
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions' }
+
+__PACKAGE__->__set_name('Z_CRM_SERVICE_ORDER_CREATE.Exception');
+__PACKAGE__->__set_nillable();
+__PACKAGE__->__set_minOccurs();
+__PACKAGE__->__set_maxOccurs();
+__PACKAGE__->__set_ref();
+use base qw(
+ SOAP::WSDL::XSD::Typelib::Element
+ BarnetTypes::Z_CRM_SERVICE_ORDER_CREATE::RfcException
+);
+
+}
+
+1;
+
+
+=pod
+
+=head1 NAME
+
+BarnetElements::Z_CRM_SERVICE_ORDER_CREATE::Exception
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined element
+Z_CRM_SERVICE_ORDER_CREATE.Exception from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+
+
+=head1 METHODS
+
+=head2 new
+
+ my $element = BarnetElements::Z_CRM_SERVICE_ORDER_CREATE::Exception->new($data);
+
+Constructor. The following data structure may be passed to new():
+
+ { # BarnetTypes::Z_CRM_SERVICE_ORDER_CREATE::RfcException
+ Name => $some_value, # Z_CRM_SERVICE_ORDER_CREATE.RfcExceptions
+ Text => $some_value, # string
+ Message => { # BarnetTypes::RfcException::Message
+ ID => $some_value, # string
+ Number => $some_value, # RfcException.Message.Number
+ },
+ },
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATEResponse.pm b/perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATEResponse.pm
new file mode 100644
index 000000000..5755d0b49
--- /dev/null
+++ b/perllib/BarnetElements/Z_CRM_SERVICE_ORDER_CREATEResponse.pm
@@ -0,0 +1,183 @@
+
+package BarnetElements::Z_CRM_SERVICE_ORDER_CREATEResponse;
+use strict;
+use warnings;
+
+{ # BLOCK to scope variables
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions' }
+
+__PACKAGE__->__set_name('Z_CRM_SERVICE_ORDER_CREATEResponse');
+__PACKAGE__->__set_nillable();
+__PACKAGE__->__set_minOccurs();
+__PACKAGE__->__set_maxOccurs();
+__PACKAGE__->__set_ref();
+
+use base qw(
+ SOAP::WSDL::XSD::Typelib::Element
+ SOAP::WSDL::XSD::Typelib::ComplexType
+);
+
+our $XML_ATTRIBUTE_CLASS;
+undef $XML_ATTRIBUTE_CLASS;
+
+sub __get_attr_class {
+ return $XML_ATTRIBUTE_CLASS;
+}
+
+use Class::Std::Fast::Storable constructor => 'none';
+use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
+
+Class::Std::initialize();
+
+{ # BLOCK to scope variables
+
+my %ET_RETURN_of :ATTR(:get<ET_RETURN>);
+my %EV_ORDER_GUID_of :ATTR(:get<EV_ORDER_GUID>);
+my %EV_ORDER_NO_of :ATTR(:get<EV_ORDER_NO>);
+my %IT_PROBLEM_DESC_of :ATTR(:get<IT_PROBLEM_DESC>);
+
+__PACKAGE__->_factory(
+ [ qw( ET_RETURN
+ EV_ORDER_GUID
+ EV_ORDER_NO
+ IT_PROBLEM_DESC
+
+ ) ],
+ {
+ 'ET_RETURN' => \%ET_RETURN_of,
+ 'EV_ORDER_GUID' => \%EV_ORDER_GUID_of,
+ 'EV_ORDER_NO' => \%EV_ORDER_NO_of,
+ 'IT_PROBLEM_DESC' => \%IT_PROBLEM_DESC_of,
+ },
+ {
+ 'ET_RETURN' => 'BarnetTypes::TABLE_OF_BAPIRET2',
+ 'EV_ORDER_GUID' => 'BarnetTypes::char32',
+ 'EV_ORDER_NO' => 'BarnetTypes::char10',
+ 'IT_PROBLEM_DESC' => 'BarnetTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT',
+ },
+ {
+
+ 'ET_RETURN' => 'ET_RETURN',
+ 'EV_ORDER_GUID' => 'EV_ORDER_GUID',
+ 'EV_ORDER_NO' => 'EV_ORDER_NO',
+ 'IT_PROBLEM_DESC' => 'IT_PROBLEM_DESC',
+ }
+);
+
+} # end BLOCK
+
+
+
+
+
+
+} # end of BLOCK
+
+
+
+1;
+
+
+=pod
+
+=head1 NAME
+
+BarnetElements::Z_CRM_SERVICE_ORDER_CREATEResponse
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined element
+Z_CRM_SERVICE_ORDER_CREATEResponse from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+
+
+=head1 PROPERTIES
+
+The following properties may be accessed using get_PROPERTY / set_PROPERTY
+methods:
+
+=over
+
+=item * ET_RETURN
+
+ $element->set_ET_RETURN($data);
+ $element->get_ET_RETURN();
+
+
+
+
+=item * EV_ORDER_GUID
+
+ $element->set_EV_ORDER_GUID($data);
+ $element->get_EV_ORDER_GUID();
+
+
+
+
+=item * EV_ORDER_NO
+
+ $element->set_EV_ORDER_NO($data);
+ $element->get_EV_ORDER_NO();
+
+
+
+
+=item * IT_PROBLEM_DESC
+
+ $element->set_IT_PROBLEM_DESC($data);
+ $element->get_IT_PROBLEM_DESC();
+
+
+
+
+
+=back
+
+
+=head1 METHODS
+
+=head2 new
+
+ my $element = BarnetElements::Z_CRM_SERVICE_ORDER_CREATEResponse->new($data);
+
+Constructor. The following data structure may be passed to new():
+
+ {
+ ET_RETURN => { # BarnetTypes::TABLE_OF_BAPIRET2
+ item => { # BarnetTypes::BAPIRET2
+ TYPE => $some_value, # char1
+ ID => $some_value, # char20
+ NUMBER => $some_value, # numeric3
+ MESSAGE => $some_value, # char220
+ LOG_NO => $some_value, # char20
+ LOG_MSG_NO => $some_value, # numeric6
+ MESSAGE_V1 => $some_value, # char50
+ MESSAGE_V2 => $some_value, # char50
+ MESSAGE_V3 => $some_value, # char50
+ MESSAGE_V4 => $some_value, # char50
+ PARAMETER => $some_value, # char32
+ ROW => $some_value, # int
+ FIELD => $some_value, # char30
+ SYSTEM => $some_value, # char10
+ },
+ },
+ EV_ORDER_GUID => $some_value, # char32
+ EV_ORDER_NO => $some_value, # char10
+ IT_PROBLEM_DESC => { # BarnetTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT
+ item => { # BarnetTypes::CRMT_SERVICE_REQUEST_TEXT
+ TEXT_LINE => $some_value, # char132
+ },
+ },
+ },
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetInterfaces/service/ZLBB_SERVICE_ORDER.pm b/perllib/BarnetInterfaces/service/ZLBB_SERVICE_ORDER.pm
new file mode 100644
index 000000000..94e0cd4db
--- /dev/null
+++ b/perllib/BarnetInterfaces/service/ZLBB_SERVICE_ORDER.pm
@@ -0,0 +1,166 @@
+package BarnetInterfaces::service::ZLBB_SERVICE_ORDER;
+use strict;
+use warnings;
+use Class::Std::Fast::Storable;
+use Scalar::Util qw(blessed);
+use base qw(SOAP::WSDL::Client::Base);
+
+# only load if it hasn't been loaded before
+require BarnetTypemaps::service
+ if not BarnetTypemaps::service->can('get_class');
+
+sub START {
+ $_[0]->set_proxy('http://lbbcrmdev.barnet.gov.uk:8000/sap/bc/srt/rfc/sap/zlbb_service_order/200/zlbb_service_order/zlbb_service_order') if not $_[2]->{proxy};
+ $_[0]->set_class_resolver('BarnetTypemaps::service')
+ if not $_[2]->{class_resolver};
+
+ $_[0]->set_prefix($_[2]->{use_prefix}) if exists $_[2]->{use_prefix};
+}
+
+sub Z_CRM_SERVICE_ORDER_CREATE {
+ my ($self, $body, $header) = @_;
+ die "Z_CRM_SERVICE_ORDER_CREATE must be called as object method (\$self is <$self>)" if not blessed($self);
+ return $self->SUPER::call({
+ operation => 'Z_CRM_SERVICE_ORDER_CREATE',
+ soap_action => '',
+ style => 'document',
+ body => {
+
+
+ 'use' => 'literal',
+ namespace => 'http://schemas.xmlsoap.org/wsdl/soap/',
+ encodingStyle => '',
+ parts => [qw( BarnetElements::Z_CRM_SERVICE_ORDER_CREATE )],
+ },
+ header => {
+
+ },
+ headerfault => {
+
+ }
+ }, $body, $header);
+}
+
+
+
+
+1;
+
+
+
+__END__
+
+=pod
+
+=head1 NAME
+
+BarnetInterfaces::service::ZLBB_SERVICE_ORDER - SOAP Interface for the service Web Service
+
+=head1 SYNOPSIS
+
+ use BarnetInterfaces::service::ZLBB_SERVICE_ORDER;
+ my $interface = BarnetInterfaces::service::ZLBB_SERVICE_ORDER->new();
+
+ my $response;
+ $response = $interface->Z_CRM_SERVICE_ORDER_CREATE();
+
+
+
+=head1 DESCRIPTION
+
+SOAP Interface for the service web service
+located at http://lbbcrmdev.barnet.gov.uk:8000/sap/bc/srt/rfc/sap/zlbb_service_order/200/zlbb_service_order/zlbb_service_order.
+
+=head1 SERVICE service
+
+
+
+=head2 Port ZLBB_SERVICE_ORDER
+
+
+
+=head1 METHODS
+
+=head2 General methods
+
+=head3 new
+
+Constructor.
+
+All arguments are forwarded to L<SOAP::WSDL::Client|SOAP::WSDL::Client>.
+
+=head2 SOAP Service methods
+
+Method synopsis is displayed with hash refs as parameters.
+
+The commented class names in the method's parameters denote that objects
+of the corresponding class can be passed instead of the marked hash ref.
+
+You may pass any combination of objects, hash and list refs to these
+methods, as long as you meet the structure.
+
+List items (i.e. multiple occurences) are not displayed in the synopsis.
+You may generally pass a list ref of hash refs (or objects) instead of a hash
+ref - this may result in invalid XML if used improperly, though. Note that
+SOAP::WSDL always expects list references at maximum depth position.
+
+XML attributes are not displayed in this synopsis and cannot be set using
+hash refs. See the respective class' documentation for additional information.
+
+
+
+=head3 Z_CRM_SERVICE_ORDER_CREATE
+
+
+
+Returns a L<BarnetElements::Z_CRM_SERVICE_ORDER_CREATEResponse|BarnetElements::Z_CRM_SERVICE_ORDER_CREATEResponse> object.
+
+ $response = $interface->Z_CRM_SERVICE_ORDER_CREATE( {
+ ET_RETURN => { # BarnetTypes::TABLE_OF_BAPIRET2
+ item => { # BarnetTypes::BAPIRET2
+ TYPE => $some_value, # char1
+ ID => $some_value, # char20
+ NUMBER => $some_value, # numeric3
+ MESSAGE => $some_value, # char220
+ LOG_NO => $some_value, # char20
+ LOG_MSG_NO => $some_value, # numeric6
+ MESSAGE_V1 => $some_value, # char50
+ MESSAGE_V2 => $some_value, # char50
+ MESSAGE_V3 => $some_value, # char50
+ MESSAGE_V4 => $some_value, # char50
+ PARAMETER => $some_value, # char32
+ ROW => $some_value, # int
+ FIELD => $some_value, # char30
+ SYSTEM => $some_value, # char10
+ },
+ },
+ IT_PROBLEM_DESC => { # BarnetTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT
+ item => { # BarnetTypes::CRMT_SERVICE_REQUEST_TEXT
+ TEXT_LINE => $some_value, # char132
+ },
+ },
+ IV_CUST_EMAIL => $some_value, # char241
+ IV_CUST_NAME => $some_value, # char50
+ IV_KBID => $some_value, # char50
+ IV_PROBLEM_ID => $some_value, # char35
+ IV_PROBLEM_LOC => { # BarnetTypes::BAPI_TTET_ADDRESS_COM
+ COUNTRY2 => $some_value, # char2
+ REGION => $some_value, # char3
+ COUNTY => $some_value, # char30
+ CITY => $some_value, # char30
+ POSTALCODE => $some_value, # char10
+ STREET => $some_value, # char30
+ STREETNUMBER => $some_value, # char5
+ GEOCODE => $some_value, # char32
+ },
+ IV_PROBLEM_SUB => $some_value, # char40
+ },,
+ );
+
+
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL on Fri Apr 8 10:23:03 2011
+
+=cut
diff --git a/perllib/BarnetTypemaps/service.pm b/perllib/BarnetTypemaps/service.pm
new file mode 100644
index 000000000..dd9f98162
--- /dev/null
+++ b/perllib/BarnetTypemaps/service.pm
@@ -0,0 +1,103 @@
+
+package BarnetTypemaps::service;
+use strict;
+use warnings;
+
+our $typemap_1 = {
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse/EV_ORDER_NO' => 'BarnetTypes::char10',
+ 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_LOC/GEOCODE' => 'BarnetTypes::char32',
+ 'Fault/faultcode' => 'SOAP::WSDL::XSD::Typelib::Builtin::anyURI',
+ 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_LOC/COUNTRY2' => 'BarnetTypes::char2',
+ 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/NUMBER' => 'BarnetTypes::numeric3',
+ 'Z_CRM_SERVICE_ORDER_CREATE/IT_PROBLEM_DESC/item' => 'BarnetTypes::CRMT_SERVICE_REQUEST_TEXT',
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/MESSAGE_V1' => 'BarnetTypes::char50',
+ 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_LOC/POSTALCODE' => 'BarnetTypes::char10',
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/LOG_NO' => 'BarnetTypes::char20',
+ 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/MESSAGE_V2' => 'BarnetTypes::char50',
+ 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/MESSAGE_V3' => 'BarnetTypes::char50',
+ 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_SUB' => 'BarnetTypes::char40',
+ 'Z_CRM_SERVICE_ORDER_CREATE/IT_PROBLEM_DESC/item/TEXT_LINE' => 'BarnetTypes::char132',
+ 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/LOG_NO' => 'BarnetTypes::char20',
+ 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN' => 'BarnetTypes::TABLE_OF_BAPIRET2',
+ 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/ROW' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse/IT_PROBLEM_DESC/item' => 'BarnetTypes::CRMT_SERVICE_REQUEST_TEXT',
+ 'Fault/faultstring' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
+ 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/PARAMETER' => 'BarnetTypes::char32',
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item' => 'BarnetTypes::BAPIRET2',
+ 'Z_CRM_SERVICE_ORDER_CREATE/IV_CUST_NAME' => 'BarnetTypes::char50',
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/MESSAGE_V2' => 'BarnetTypes::char50',
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/ROW' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
+ 'Fault/detail' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
+ 'Z_CRM_SERVICE_ORDER_CREATE.Exception/Message/ID' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse/IT_PROBLEM_DESC' => 'BarnetTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT',
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/NUMBER' => 'BarnetTypes::numeric3',
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse' => 'BarnetElements::Z_CRM_SERVICE_ORDER_CREATEResponse',
+ 'Z_CRM_SERVICE_ORDER_CREATE.Exception/Text' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
+ 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/MESSAGE_V1' => 'BarnetTypes::char50',
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/PARAMETER' => 'BarnetTypes::char32',
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/MESSAGE' => 'BarnetTypes::char220',
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/TYPE' => 'BarnetTypes::char1',
+ 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/MESSAGE' => 'BarnetTypes::char220',
+ 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_LOC' => 'BarnetTypes::BAPI_TTET_ADDRESS_COM',
+ 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/TYPE' => 'BarnetTypes::char1',
+ 'Z_CRM_SERVICE_ORDER_CREATE/IV_CUST_EMAIL' => 'BarnetTypes::char241',
+ 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/FIELD' => 'BarnetTypes::char30',
+ 'Z_CRM_SERVICE_ORDER_CREATE.Exception/Name' => 'BarnetTypes::Z_CRM_SERVICE_ORDER_CREATE::RfcExceptions',
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse/IT_PROBLEM_DESC/item/TEXT_LINE' => 'BarnetTypes::char132',
+ 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/ID' => 'BarnetTypes::char20',
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse/EV_ORDER_GUID' => 'BarnetTypes::char32',
+ 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/SYSTEM' => 'BarnetTypes::char10',
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN' => 'BarnetTypes::TABLE_OF_BAPIRET2',
+ 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_ID' => 'BarnetTypes::char35',
+ 'Z_CRM_SERVICE_ORDER_CREATE' => 'BarnetElements::Z_CRM_SERVICE_ORDER_CREATE',
+ 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_LOC/REGION' => 'BarnetTypes::char3',
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/LOG_MSG_NO' => 'BarnetTypes::numeric6',
+ 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/MESSAGE_V4' => 'BarnetTypes::char50',
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/FIELD' => 'BarnetTypes::char30',
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/SYSTEM' => 'BarnetTypes::char10',
+ 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_LOC/COUNTY' => 'BarnetTypes::char30',
+ 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item/LOG_MSG_NO' => 'BarnetTypes::numeric6',
+ 'Z_CRM_SERVICE_ORDER_CREATE.Exception/Message' => 'BarnetTypes::RfcException::Message',
+ 'Z_CRM_SERVICE_ORDER_CREATE/IT_PROBLEM_DESC' => 'BarnetTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT',
+ 'Z_CRM_SERVICE_ORDER_CREATE/ET_RETURN/item' => 'BarnetTypes::BAPIRET2',
+ 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_LOC/CITY' => 'BarnetTypes::char30',
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/MESSAGE_V4' => 'BarnetTypes::char50',
+ 'Z_CRM_SERVICE_ORDER_CREATE.Exception' => 'BarnetElements::Z_CRM_SERVICE_ORDER_CREATE::Exception',
+ 'Fault' => 'SOAP::WSDL::SOAP::Typelib::Fault11',
+ 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_LOC/STREETNUMBER' => 'BarnetTypes::char5',
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/ID' => 'BarnetTypes::char20',
+ 'Fault/faultactor' => 'SOAP::WSDL::XSD::Typelib::Builtin::token',
+ 'Z_CRM_SERVICE_ORDER_CREATE/IV_PROBLEM_LOC/STREET' => 'BarnetTypes::char30',
+ 'Z_CRM_SERVICE_ORDER_CREATE.Exception/Message/Number' => 'BarnetTypes::RfcException::Message::Number',
+ 'Z_CRM_SERVICE_ORDER_CREATE/IV_KBID' => 'BarnetTypes::char50',
+ 'Z_CRM_SERVICE_ORDER_CREATEResponse/ET_RETURN/item/MESSAGE_V3' => 'BarnetTypes::char50'
+ };
+;
+
+sub get_class {
+ my $name = join '/', @{ $_[1] };
+ return $typemap_1->{ $name };
+}
+
+sub get_typemap {
+ return $typemap_1;
+}
+
+1;
+
+__END__
+
+__END__
+
+=pod
+
+=head1 NAME
+
+BarnetTypemaps::service - typemap for service
+
+=head1 DESCRIPTION
+
+Typemap created by SOAP::WSDL for map-based SOAP message parsers.
+
+=cut
+
diff --git a/perllib/BarnetTypes/BAPIRET2.pm b/perllib/BarnetTypes/BAPIRET2.pm
new file mode 100644
index 000000000..2ca20894c
--- /dev/null
+++ b/perllib/BarnetTypes/BAPIRET2.pm
@@ -0,0 +1,219 @@
+package BarnetTypes::BAPIRET2;
+use strict;
+use warnings;
+
+
+__PACKAGE__->_set_element_form_qualified(0);
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions' };
+
+our $XML_ATTRIBUTE_CLASS;
+undef $XML_ATTRIBUTE_CLASS;
+
+sub __get_attr_class {
+ return $XML_ATTRIBUTE_CLASS;
+}
+
+use Class::Std::Fast::Storable constructor => 'none';
+use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
+
+Class::Std::initialize();
+
+{ # BLOCK to scope variables
+
+my %TYPE_of :ATTR(:get<TYPE>);
+my %ID_of :ATTR(:get<ID>);
+my %NUMBER_of :ATTR(:get<NUMBER>);
+my %MESSAGE_of :ATTR(:get<MESSAGE>);
+my %LOG_NO_of :ATTR(:get<LOG_NO>);
+my %LOG_MSG_NO_of :ATTR(:get<LOG_MSG_NO>);
+my %MESSAGE_V1_of :ATTR(:get<MESSAGE_V1>);
+my %MESSAGE_V2_of :ATTR(:get<MESSAGE_V2>);
+my %MESSAGE_V3_of :ATTR(:get<MESSAGE_V3>);
+my %MESSAGE_V4_of :ATTR(:get<MESSAGE_V4>);
+my %PARAMETER_of :ATTR(:get<PARAMETER>);
+my %ROW_of :ATTR(:get<ROW>);
+my %FIELD_of :ATTR(:get<FIELD>);
+my %SYSTEM_of :ATTR(:get<SYSTEM>);
+
+__PACKAGE__->_factory(
+ [ qw( TYPE
+ ID
+ NUMBER
+ MESSAGE
+ LOG_NO
+ LOG_MSG_NO
+ MESSAGE_V1
+ MESSAGE_V2
+ MESSAGE_V3
+ MESSAGE_V4
+ PARAMETER
+ ROW
+ FIELD
+ SYSTEM
+
+ ) ],
+ {
+ 'TYPE' => \%TYPE_of,
+ 'ID' => \%ID_of,
+ 'NUMBER' => \%NUMBER_of,
+ 'MESSAGE' => \%MESSAGE_of,
+ 'LOG_NO' => \%LOG_NO_of,
+ 'LOG_MSG_NO' => \%LOG_MSG_NO_of,
+ 'MESSAGE_V1' => \%MESSAGE_V1_of,
+ 'MESSAGE_V2' => \%MESSAGE_V2_of,
+ 'MESSAGE_V3' => \%MESSAGE_V3_of,
+ 'MESSAGE_V4' => \%MESSAGE_V4_of,
+ 'PARAMETER' => \%PARAMETER_of,
+ 'ROW' => \%ROW_of,
+ 'FIELD' => \%FIELD_of,
+ 'SYSTEM' => \%SYSTEM_of,
+ },
+ {
+ 'TYPE' => 'BarnetTypes::char1',
+ 'ID' => 'BarnetTypes::char20',
+ 'NUMBER' => 'BarnetTypes::numeric3',
+ 'MESSAGE' => 'BarnetTypes::char220',
+ 'LOG_NO' => 'BarnetTypes::char20',
+ 'LOG_MSG_NO' => 'BarnetTypes::numeric6',
+ 'MESSAGE_V1' => 'BarnetTypes::char50',
+ 'MESSAGE_V2' => 'BarnetTypes::char50',
+ 'MESSAGE_V3' => 'BarnetTypes::char50',
+ 'MESSAGE_V4' => 'BarnetTypes::char50',
+ 'PARAMETER' => 'BarnetTypes::char32',
+ 'ROW' => 'SOAP::WSDL::XSD::Typelib::Builtin::int',
+ 'FIELD' => 'BarnetTypes::char30',
+ 'SYSTEM' => 'BarnetTypes::char10',
+ },
+ {
+
+ 'TYPE' => 'TYPE',
+ 'ID' => 'ID',
+ 'NUMBER' => 'NUMBER',
+ 'MESSAGE' => 'MESSAGE',
+ 'LOG_NO' => 'LOG_NO',
+ 'LOG_MSG_NO' => 'LOG_MSG_NO',
+ 'MESSAGE_V1' => 'MESSAGE_V1',
+ 'MESSAGE_V2' => 'MESSAGE_V2',
+ 'MESSAGE_V3' => 'MESSAGE_V3',
+ 'MESSAGE_V4' => 'MESSAGE_V4',
+ 'PARAMETER' => 'PARAMETER',
+ 'ROW' => 'ROW',
+ 'FIELD' => 'FIELD',
+ 'SYSTEM' => 'SYSTEM',
+ }
+);
+
+} # end BLOCK
+
+
+
+
+
+
+
+1;
+
+
+=pod
+
+=head1 NAME
+
+BarnetTypes::BAPIRET2
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined complexType
+BAPIRET2 from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+
+=head2 PROPERTIES
+
+The following properties may be accessed using get_PROPERTY / set_PROPERTY
+methods:
+
+=over
+
+=item * TYPE
+
+
+=item * ID
+
+
+=item * NUMBER
+
+
+=item * MESSAGE
+
+
+=item * LOG_NO
+
+
+=item * LOG_MSG_NO
+
+
+=item * MESSAGE_V1
+
+
+=item * MESSAGE_V2
+
+
+=item * MESSAGE_V3
+
+
+=item * MESSAGE_V4
+
+
+=item * PARAMETER
+
+
+=item * ROW
+
+
+=item * FIELD
+
+
+=item * SYSTEM
+
+
+
+
+=back
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor. The following data structure may be passed to new():
+
+ { # BarnetTypes::BAPIRET2
+ TYPE => $some_value, # char1
+ ID => $some_value, # char20
+ NUMBER => $some_value, # numeric3
+ MESSAGE => $some_value, # char220
+ LOG_NO => $some_value, # char20
+ LOG_MSG_NO => $some_value, # numeric6
+ MESSAGE_V1 => $some_value, # char50
+ MESSAGE_V2 => $some_value, # char50
+ MESSAGE_V3 => $some_value, # char50
+ MESSAGE_V4 => $some_value, # char50
+ PARAMETER => $some_value, # char32
+ ROW => $some_value, # int
+ FIELD => $some_value, # char30
+ SYSTEM => $some_value, # char10
+ },
+
+
+
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/BAPI_TTET_ADDRESS_COM.pm b/perllib/BarnetTypes/BAPI_TTET_ADDRESS_COM.pm
new file mode 100644
index 000000000..b4a8b00ca
--- /dev/null
+++ b/perllib/BarnetTypes/BAPI_TTET_ADDRESS_COM.pm
@@ -0,0 +1,165 @@
+package BarnetTypes::BAPI_TTET_ADDRESS_COM;
+use strict;
+use warnings;
+
+
+__PACKAGE__->_set_element_form_qualified(0);
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions' };
+
+our $XML_ATTRIBUTE_CLASS;
+undef $XML_ATTRIBUTE_CLASS;
+
+sub __get_attr_class {
+ return $XML_ATTRIBUTE_CLASS;
+}
+
+use Class::Std::Fast::Storable constructor => 'none';
+use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
+
+Class::Std::initialize();
+
+{ # BLOCK to scope variables
+
+my %COUNTRY2_of :ATTR(:get<COUNTRY2>);
+my %REGION_of :ATTR(:get<REGION>);
+my %COUNTY_of :ATTR(:get<COUNTY>);
+my %CITY_of :ATTR(:get<CITY>);
+my %POSTALCODE_of :ATTR(:get<POSTALCODE>);
+my %STREET_of :ATTR(:get<STREET>);
+my %STREETNUMBER_of :ATTR(:get<STREETNUMBER>);
+my %GEOCODE_of :ATTR(:get<GEOCODE>);
+
+__PACKAGE__->_factory(
+ [ qw( COUNTRY2
+ REGION
+ COUNTY
+ CITY
+ POSTALCODE
+ STREET
+ STREETNUMBER
+ GEOCODE
+
+ ) ],
+ {
+ 'COUNTRY2' => \%COUNTRY2_of,
+ 'REGION' => \%REGION_of,
+ 'COUNTY' => \%COUNTY_of,
+ 'CITY' => \%CITY_of,
+ 'POSTALCODE' => \%POSTALCODE_of,
+ 'STREET' => \%STREET_of,
+ 'STREETNUMBER' => \%STREETNUMBER_of,
+ 'GEOCODE' => \%GEOCODE_of,
+ },
+ {
+ 'COUNTRY2' => 'BarnetTypes::char2',
+ 'REGION' => 'BarnetTypes::char3',
+ 'COUNTY' => 'BarnetTypes::char30',
+ 'CITY' => 'BarnetTypes::char30',
+ 'POSTALCODE' => 'BarnetTypes::char10',
+ 'STREET' => 'BarnetTypes::char30',
+ 'STREETNUMBER' => 'BarnetTypes::char5',
+ 'GEOCODE' => 'BarnetTypes::char32',
+ },
+ {
+
+ 'COUNTRY2' => 'COUNTRY2',
+ 'REGION' => 'REGION',
+ 'COUNTY' => 'COUNTY',
+ 'CITY' => 'CITY',
+ 'POSTALCODE' => 'POSTALCODE',
+ 'STREET' => 'STREET',
+ 'STREETNUMBER' => 'STREETNUMBER',
+ 'GEOCODE' => 'GEOCODE',
+ }
+);
+
+} # end BLOCK
+
+
+
+
+
+
+
+1;
+
+
+=pod
+
+=head1 NAME
+
+BarnetTypes::BAPI_TTET_ADDRESS_COM
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined complexType
+BAPI_TTET_ADDRESS_COM from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+
+=head2 PROPERTIES
+
+The following properties may be accessed using get_PROPERTY / set_PROPERTY
+methods:
+
+=over
+
+=item * COUNTRY2
+
+
+=item * REGION
+
+
+=item * COUNTY
+
+
+=item * CITY
+
+
+=item * POSTALCODE
+
+
+=item * STREET
+
+
+=item * STREETNUMBER
+
+
+=item * GEOCODE
+
+
+
+
+=back
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor. The following data structure may be passed to new():
+
+ { # BarnetTypes::BAPI_TTET_ADDRESS_COM
+ COUNTRY2 => $some_value, # char2
+ REGION => $some_value, # char3
+ COUNTY => $some_value, # char30
+ CITY => $some_value, # char30
+ POSTALCODE => $some_value, # char10
+ STREET => $some_value, # char30
+ STREETNUMBER => $some_value, # char5
+ GEOCODE => $some_value, # char32
+ },
+
+
+
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/CRMT_SERVICE_REQUEST_TEXT.pm b/perllib/BarnetTypes/CRMT_SERVICE_REQUEST_TEXT.pm
new file mode 100644
index 000000000..39e2ad1ce
--- /dev/null
+++ b/perllib/BarnetTypes/CRMT_SERVICE_REQUEST_TEXT.pm
@@ -0,0 +1,102 @@
+package BarnetTypes::CRMT_SERVICE_REQUEST_TEXT;
+use strict;
+use warnings;
+
+
+__PACKAGE__->_set_element_form_qualified(0);
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions' };
+
+our $XML_ATTRIBUTE_CLASS;
+undef $XML_ATTRIBUTE_CLASS;
+
+sub __get_attr_class {
+ return $XML_ATTRIBUTE_CLASS;
+}
+
+use Class::Std::Fast::Storable constructor => 'none';
+use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
+
+Class::Std::initialize();
+
+{ # BLOCK to scope variables
+
+my %TEXT_LINE_of :ATTR(:get<TEXT_LINE>);
+
+__PACKAGE__->_factory(
+ [ qw( TEXT_LINE
+
+ ) ],
+ {
+ 'TEXT_LINE' => \%TEXT_LINE_of,
+ },
+ {
+ 'TEXT_LINE' => 'BarnetTypes::char132',
+ },
+ {
+
+ 'TEXT_LINE' => 'TEXT_LINE',
+ }
+);
+
+} # end BLOCK
+
+
+
+
+
+
+
+1;
+
+
+=pod
+
+=head1 NAME
+
+BarnetTypes::CRMT_SERVICE_REQUEST_TEXT
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined complexType
+CRMT_SERVICE_REQUEST_TEXT from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+
+=head2 PROPERTIES
+
+The following properties may be accessed using get_PROPERTY / set_PROPERTY
+methods:
+
+=over
+
+=item * TEXT_LINE
+
+
+
+
+=back
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor. The following data structure may be passed to new():
+
+ { # BarnetTypes::CRMT_SERVICE_REQUEST_TEXT
+ TEXT_LINE => $some_value, # char132
+ },
+
+
+
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/RfcException/Message.pm b/perllib/BarnetTypes/RfcException/Message.pm
new file mode 100644
index 000000000..71b94bf7c
--- /dev/null
+++ b/perllib/BarnetTypes/RfcException/Message.pm
@@ -0,0 +1,111 @@
+package BarnetTypes::RfcException::Message;
+use strict;
+use warnings;
+
+
+__PACKAGE__->_set_element_form_qualified(0);
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions' };
+
+our $XML_ATTRIBUTE_CLASS;
+undef $XML_ATTRIBUTE_CLASS;
+
+sub __get_attr_class {
+ return $XML_ATTRIBUTE_CLASS;
+}
+
+use Class::Std::Fast::Storable constructor => 'none';
+use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
+
+Class::Std::initialize();
+
+{ # BLOCK to scope variables
+
+my %ID_of :ATTR(:get<ID>);
+my %Number_of :ATTR(:get<Number>);
+
+__PACKAGE__->_factory(
+ [ qw( ID
+ Number
+
+ ) ],
+ {
+ 'ID' => \%ID_of,
+ 'Number' => \%Number_of,
+ },
+ {
+ 'ID' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
+ 'Number' => 'BarnetTypes::RfcException::Message::Number',
+ },
+ {
+
+ 'ID' => 'ID',
+ 'Number' => 'Number',
+ }
+);
+
+} # end BLOCK
+
+
+
+
+
+
+
+1;
+
+
+=pod
+
+=head1 NAME
+
+BarnetTypes::RfcException::Message
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined complexType
+RfcException.Message from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+
+=head2 PROPERTIES
+
+The following properties may be accessed using get_PROPERTY / set_PROPERTY
+methods:
+
+=over
+
+=item * ID
+
+
+=item * Number
+
+
+
+
+=back
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor. The following data structure may be passed to new():
+
+ { # BarnetTypes::RfcException::Message
+ ID => $some_value, # string
+ Number => $some_value, # RfcException.Message.Number
+ },
+
+
+
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/RfcException/Message/Number.pm b/perllib/BarnetTypes/RfcException/Message/Number.pm
new file mode 100644
index 000000000..9353df454
--- /dev/null
+++ b/perllib/BarnetTypes/RfcException/Message/Number.pm
@@ -0,0 +1,65 @@
+package BarnetTypes::RfcException::Message::Number;
+use strict;
+use warnings;
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
+
+# derivation by restriction
+use base qw(
+ SOAP::WSDL::XSD::Typelib::Builtin::string);
+
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined simpleType
+RfcException.Message.Number from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+This clase is derived from
+ SOAP::WSDL::XSD::Typelib::Builtin::string
+. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
+like it's base type.
+
+# Description of restrictions not implemented yet.
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor.
+
+=head2 get_value / set_value
+
+Getter and setter for the simpleType's value.
+
+=head1 OVERLOADING
+
+Depending on the simple type's base type, the following operations are overloaded
+
+ Stringification
+ Numerification
+ Boolification
+
+Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/TABLE_OF_BAPIRET2.pm b/perllib/BarnetTypes/TABLE_OF_BAPIRET2.pm
new file mode 100644
index 000000000..c248bc907
--- /dev/null
+++ b/perllib/BarnetTypes/TABLE_OF_BAPIRET2.pm
@@ -0,0 +1,117 @@
+package BarnetTypes::TABLE_OF_BAPIRET2;
+use strict;
+use warnings;
+
+
+__PACKAGE__->_set_element_form_qualified(0);
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions' };
+
+our $XML_ATTRIBUTE_CLASS;
+undef $XML_ATTRIBUTE_CLASS;
+
+sub __get_attr_class {
+ return $XML_ATTRIBUTE_CLASS;
+}
+
+use Class::Std::Fast::Storable constructor => 'none';
+use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
+
+Class::Std::initialize();
+
+{ # BLOCK to scope variables
+
+my %item_of :ATTR(:get<item>);
+
+__PACKAGE__->_factory(
+ [ qw( item
+
+ ) ],
+ {
+ 'item' => \%item_of,
+ },
+ {
+ 'item' => 'BarnetTypes::BAPIRET2',
+ },
+ {
+
+ 'item' => 'item',
+ }
+);
+
+} # end BLOCK
+
+
+
+
+
+
+
+1;
+
+
+=pod
+
+=head1 NAME
+
+BarnetTypes::TABLE_OF_BAPIRET2
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined complexType
+TABLE_OF_BAPIRET2 from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+
+=head2 PROPERTIES
+
+The following properties may be accessed using get_PROPERTY / set_PROPERTY
+methods:
+
+=over
+
+=item * item
+
+
+
+
+=back
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor. The following data structure may be passed to new():
+
+ { # BarnetTypes::TABLE_OF_BAPIRET2
+ item => { # BarnetTypes::BAPIRET2
+ TYPE => $some_value, # char1
+ ID => $some_value, # char20
+ NUMBER => $some_value, # numeric3
+ MESSAGE => $some_value, # char220
+ LOG_NO => $some_value, # char20
+ LOG_MSG_NO => $some_value, # numeric6
+ MESSAGE_V1 => $some_value, # char50
+ MESSAGE_V2 => $some_value, # char50
+ MESSAGE_V3 => $some_value, # char50
+ MESSAGE_V4 => $some_value, # char50
+ PARAMETER => $some_value, # char32
+ ROW => $some_value, # int
+ FIELD => $some_value, # char30
+ SYSTEM => $some_value, # char10
+ },
+ },
+
+
+
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/TABLE_OF_CRMT_SERVICE_REQUEST_TEXT.pm b/perllib/BarnetTypes/TABLE_OF_CRMT_SERVICE_REQUEST_TEXT.pm
new file mode 100644
index 000000000..62eb7b774
--- /dev/null
+++ b/perllib/BarnetTypes/TABLE_OF_CRMT_SERVICE_REQUEST_TEXT.pm
@@ -0,0 +1,104 @@
+package BarnetTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT;
+use strict;
+use warnings;
+
+
+__PACKAGE__->_set_element_form_qualified(0);
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions' };
+
+our $XML_ATTRIBUTE_CLASS;
+undef $XML_ATTRIBUTE_CLASS;
+
+sub __get_attr_class {
+ return $XML_ATTRIBUTE_CLASS;
+}
+
+use Class::Std::Fast::Storable constructor => 'none';
+use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
+
+Class::Std::initialize();
+
+{ # BLOCK to scope variables
+
+my %item_of :ATTR(:get<item>);
+
+__PACKAGE__->_factory(
+ [ qw( item
+
+ ) ],
+ {
+ 'item' => \%item_of,
+ },
+ {
+ 'item' => 'BarnetTypes::CRMT_SERVICE_REQUEST_TEXT',
+ },
+ {
+
+ 'item' => 'item',
+ }
+);
+
+} # end BLOCK
+
+
+
+
+
+
+
+1;
+
+
+=pod
+
+=head1 NAME
+
+BarnetTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined complexType
+TABLE_OF_CRMT_SERVICE_REQUEST_TEXT from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+
+=head2 PROPERTIES
+
+The following properties may be accessed using get_PROPERTY / set_PROPERTY
+methods:
+
+=over
+
+=item * item
+
+
+
+
+=back
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor. The following data structure may be passed to new():
+
+ { # BarnetTypes::TABLE_OF_CRMT_SERVICE_REQUEST_TEXT
+ item => { # BarnetTypes::CRMT_SERVICE_REQUEST_TEXT
+ TEXT_LINE => $some_value, # char132
+ },
+ },
+
+
+
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/Z_CRM_SERVICE_ORDER_CREATE/RfcException.pm b/perllib/BarnetTypes/Z_CRM_SERVICE_ORDER_CREATE/RfcException.pm
new file mode 100644
index 000000000..8d04adf53
--- /dev/null
+++ b/perllib/BarnetTypes/Z_CRM_SERVICE_ORDER_CREATE/RfcException.pm
@@ -0,0 +1,123 @@
+package BarnetTypes::Z_CRM_SERVICE_ORDER_CREATE::RfcException;
+use strict;
+use warnings;
+
+
+__PACKAGE__->_set_element_form_qualified(0);
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions' };
+
+our $XML_ATTRIBUTE_CLASS;
+undef $XML_ATTRIBUTE_CLASS;
+
+sub __get_attr_class {
+ return $XML_ATTRIBUTE_CLASS;
+}
+
+use Class::Std::Fast::Storable constructor => 'none';
+use base qw(SOAP::WSDL::XSD::Typelib::ComplexType);
+
+Class::Std::initialize();
+
+{ # BLOCK to scope variables
+
+my %Name_of :ATTR(:get<Name>);
+my %Text_of :ATTR(:get<Text>);
+my %Message_of :ATTR(:get<Message>);
+
+__PACKAGE__->_factory(
+ [ qw( Name
+ Text
+ Message
+
+ ) ],
+ {
+ 'Name' => \%Name_of,
+ 'Text' => \%Text_of,
+ 'Message' => \%Message_of,
+ },
+ {
+ 'Name' => 'BarnetTypes::Z_CRM_SERVICE_ORDER_CREATE::RfcExceptions',
+ 'Text' => 'SOAP::WSDL::XSD::Typelib::Builtin::string',
+ 'Message' => 'BarnetTypes::RfcException::Message',
+ },
+ {
+
+ 'Name' => 'Name',
+ 'Text' => 'Text',
+ 'Message' => 'Message',
+ }
+);
+
+} # end BLOCK
+
+
+
+
+
+
+
+1;
+
+
+=pod
+
+=head1 NAME
+
+BarnetTypes::Z_CRM_SERVICE_ORDER_CREATE::RfcException
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined complexType
+Z_CRM_SERVICE_ORDER_CREATE.RfcException from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+
+=head2 PROPERTIES
+
+The following properties may be accessed using get_PROPERTY / set_PROPERTY
+methods:
+
+=over
+
+=item * Name
+
+
+=item * Text
+
+
+=item * Message
+
+
+
+
+=back
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor. The following data structure may be passed to new():
+
+ { # BarnetTypes::Z_CRM_SERVICE_ORDER_CREATE::RfcException
+ Name => $some_value, # Z_CRM_SERVICE_ORDER_CREATE.RfcExceptions
+ Text => $some_value, # string
+ Message => { # BarnetTypes::RfcException::Message
+ ID => $some_value, # string
+ Number => $some_value, # RfcException.Message.Number
+ },
+ },
+
+
+
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/Z_CRM_SERVICE_ORDER_CREATE/RfcExceptions.pm b/perllib/BarnetTypes/Z_CRM_SERVICE_ORDER_CREATE/RfcExceptions.pm
new file mode 100644
index 000000000..ffc2237bc
--- /dev/null
+++ b/perllib/BarnetTypes/Z_CRM_SERVICE_ORDER_CREATE/RfcExceptions.pm
@@ -0,0 +1,65 @@
+package BarnetTypes::Z_CRM_SERVICE_ORDER_CREATE::RfcExceptions;
+use strict;
+use warnings;
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
+
+# derivation by restriction
+use base qw(
+ SOAP::WSDL::XSD::Typelib::Builtin::string);
+
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined simpleType
+Z_CRM_SERVICE_ORDER_CREATE.RfcExceptions from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+This clase is derived from
+ SOAP::WSDL::XSD::Typelib::Builtin::string
+. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
+like it's base type.
+
+# Description of restrictions not implemented yet.
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor.
+
+=head2 get_value / set_value
+
+Getter and setter for the simpleType's value.
+
+=head1 OVERLOADING
+
+Depending on the simple type's base type, the following operations are overloaded
+
+ Stringification
+ Numerification
+ Boolification
+
+Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/char1.pm b/perllib/BarnetTypes/char1.pm
new file mode 100644
index 000000000..d0bab8e5e
--- /dev/null
+++ b/perllib/BarnetTypes/char1.pm
@@ -0,0 +1,65 @@
+package BarnetTypes::char1;
+use strict;
+use warnings;
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
+
+# derivation by restriction
+use base qw(
+ SOAP::WSDL::XSD::Typelib::Builtin::string);
+
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined simpleType
+char1 from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+This clase is derived from
+ SOAP::WSDL::XSD::Typelib::Builtin::string
+. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
+like it's base type.
+
+# Description of restrictions not implemented yet.
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor.
+
+=head2 get_value / set_value
+
+Getter and setter for the simpleType's value.
+
+=head1 OVERLOADING
+
+Depending on the simple type's base type, the following operations are overloaded
+
+ Stringification
+ Numerification
+ Boolification
+
+Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/char10.pm b/perllib/BarnetTypes/char10.pm
new file mode 100644
index 000000000..6ff454e4b
--- /dev/null
+++ b/perllib/BarnetTypes/char10.pm
@@ -0,0 +1,65 @@
+package BarnetTypes::char10;
+use strict;
+use warnings;
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
+
+# derivation by restriction
+use base qw(
+ SOAP::WSDL::XSD::Typelib::Builtin::string);
+
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined simpleType
+char10 from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+This clase is derived from
+ SOAP::WSDL::XSD::Typelib::Builtin::string
+. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
+like it's base type.
+
+# Description of restrictions not implemented yet.
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor.
+
+=head2 get_value / set_value
+
+Getter and setter for the simpleType's value.
+
+=head1 OVERLOADING
+
+Depending on the simple type's base type, the following operations are overloaded
+
+ Stringification
+ Numerification
+ Boolification
+
+Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/char132.pm b/perllib/BarnetTypes/char132.pm
new file mode 100644
index 000000000..46a41077b
--- /dev/null
+++ b/perllib/BarnetTypes/char132.pm
@@ -0,0 +1,65 @@
+package BarnetTypes::char132;
+use strict;
+use warnings;
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
+
+# derivation by restriction
+use base qw(
+ SOAP::WSDL::XSD::Typelib::Builtin::string);
+
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined simpleType
+char132 from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+This clase is derived from
+ SOAP::WSDL::XSD::Typelib::Builtin::string
+. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
+like it's base type.
+
+# Description of restrictions not implemented yet.
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor.
+
+=head2 get_value / set_value
+
+Getter and setter for the simpleType's value.
+
+=head1 OVERLOADING
+
+Depending on the simple type's base type, the following operations are overloaded
+
+ Stringification
+ Numerification
+ Boolification
+
+Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/char2.pm b/perllib/BarnetTypes/char2.pm
new file mode 100644
index 000000000..35c476fbe
--- /dev/null
+++ b/perllib/BarnetTypes/char2.pm
@@ -0,0 +1,65 @@
+package BarnetTypes::char2;
+use strict;
+use warnings;
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
+
+# derivation by restriction
+use base qw(
+ SOAP::WSDL::XSD::Typelib::Builtin::string);
+
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined simpleType
+char2 from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+This clase is derived from
+ SOAP::WSDL::XSD::Typelib::Builtin::string
+. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
+like it's base type.
+
+# Description of restrictions not implemented yet.
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor.
+
+=head2 get_value / set_value
+
+Getter and setter for the simpleType's value.
+
+=head1 OVERLOADING
+
+Depending on the simple type's base type, the following operations are overloaded
+
+ Stringification
+ Numerification
+ Boolification
+
+Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/char20.pm b/perllib/BarnetTypes/char20.pm
new file mode 100644
index 000000000..1c2df092a
--- /dev/null
+++ b/perllib/BarnetTypes/char20.pm
@@ -0,0 +1,65 @@
+package BarnetTypes::char20;
+use strict;
+use warnings;
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
+
+# derivation by restriction
+use base qw(
+ SOAP::WSDL::XSD::Typelib::Builtin::string);
+
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined simpleType
+char20 from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+This clase is derived from
+ SOAP::WSDL::XSD::Typelib::Builtin::string
+. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
+like it's base type.
+
+# Description of restrictions not implemented yet.
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor.
+
+=head2 get_value / set_value
+
+Getter and setter for the simpleType's value.
+
+=head1 OVERLOADING
+
+Depending on the simple type's base type, the following operations are overloaded
+
+ Stringification
+ Numerification
+ Boolification
+
+Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/char220.pm b/perllib/BarnetTypes/char220.pm
new file mode 100644
index 000000000..7ccde81f8
--- /dev/null
+++ b/perllib/BarnetTypes/char220.pm
@@ -0,0 +1,65 @@
+package BarnetTypes::char220;
+use strict;
+use warnings;
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
+
+# derivation by restriction
+use base qw(
+ SOAP::WSDL::XSD::Typelib::Builtin::string);
+
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined simpleType
+char220 from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+This clase is derived from
+ SOAP::WSDL::XSD::Typelib::Builtin::string
+. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
+like it's base type.
+
+# Description of restrictions not implemented yet.
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor.
+
+=head2 get_value / set_value
+
+Getter and setter for the simpleType's value.
+
+=head1 OVERLOADING
+
+Depending on the simple type's base type, the following operations are overloaded
+
+ Stringification
+ Numerification
+ Boolification
+
+Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/char241.pm b/perllib/BarnetTypes/char241.pm
new file mode 100644
index 000000000..e6567554f
--- /dev/null
+++ b/perllib/BarnetTypes/char241.pm
@@ -0,0 +1,65 @@
+package BarnetTypes::char241;
+use strict;
+use warnings;
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
+
+# derivation by restriction
+use base qw(
+ SOAP::WSDL::XSD::Typelib::Builtin::string);
+
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined simpleType
+char241 from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+This clase is derived from
+ SOAP::WSDL::XSD::Typelib::Builtin::string
+. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
+like it's base type.
+
+# Description of restrictions not implemented yet.
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor.
+
+=head2 get_value / set_value
+
+Getter and setter for the simpleType's value.
+
+=head1 OVERLOADING
+
+Depending on the simple type's base type, the following operations are overloaded
+
+ Stringification
+ Numerification
+ Boolification
+
+Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/char3.pm b/perllib/BarnetTypes/char3.pm
new file mode 100644
index 000000000..f9d001cda
--- /dev/null
+++ b/perllib/BarnetTypes/char3.pm
@@ -0,0 +1,65 @@
+package BarnetTypes::char3;
+use strict;
+use warnings;
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
+
+# derivation by restriction
+use base qw(
+ SOAP::WSDL::XSD::Typelib::Builtin::string);
+
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined simpleType
+char3 from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+This clase is derived from
+ SOAP::WSDL::XSD::Typelib::Builtin::string
+. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
+like it's base type.
+
+# Description of restrictions not implemented yet.
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor.
+
+=head2 get_value / set_value
+
+Getter and setter for the simpleType's value.
+
+=head1 OVERLOADING
+
+Depending on the simple type's base type, the following operations are overloaded
+
+ Stringification
+ Numerification
+ Boolification
+
+Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/char30.pm b/perllib/BarnetTypes/char30.pm
new file mode 100644
index 000000000..91d98eb30
--- /dev/null
+++ b/perllib/BarnetTypes/char30.pm
@@ -0,0 +1,65 @@
+package BarnetTypes::char30;
+use strict;
+use warnings;
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
+
+# derivation by restriction
+use base qw(
+ SOAP::WSDL::XSD::Typelib::Builtin::string);
+
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined simpleType
+char30 from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+This clase is derived from
+ SOAP::WSDL::XSD::Typelib::Builtin::string
+. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
+like it's base type.
+
+# Description of restrictions not implemented yet.
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor.
+
+=head2 get_value / set_value
+
+Getter and setter for the simpleType's value.
+
+=head1 OVERLOADING
+
+Depending on the simple type's base type, the following operations are overloaded
+
+ Stringification
+ Numerification
+ Boolification
+
+Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/char32.pm b/perllib/BarnetTypes/char32.pm
new file mode 100644
index 000000000..c5efdaabd
--- /dev/null
+++ b/perllib/BarnetTypes/char32.pm
@@ -0,0 +1,65 @@
+package BarnetTypes::char32;
+use strict;
+use warnings;
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
+
+# derivation by restriction
+use base qw(
+ SOAP::WSDL::XSD::Typelib::Builtin::string);
+
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined simpleType
+char32 from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+This clase is derived from
+ SOAP::WSDL::XSD::Typelib::Builtin::string
+. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
+like it's base type.
+
+# Description of restrictions not implemented yet.
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor.
+
+=head2 get_value / set_value
+
+Getter and setter for the simpleType's value.
+
+=head1 OVERLOADING
+
+Depending on the simple type's base type, the following operations are overloaded
+
+ Stringification
+ Numerification
+ Boolification
+
+Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/char35.pm b/perllib/BarnetTypes/char35.pm
new file mode 100644
index 000000000..40aef3d7a
--- /dev/null
+++ b/perllib/BarnetTypes/char35.pm
@@ -0,0 +1,65 @@
+package BarnetTypes::char35;
+use strict;
+use warnings;
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
+
+# derivation by restriction
+use base qw(
+ SOAP::WSDL::XSD::Typelib::Builtin::string);
+
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined simpleType
+char35 from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+This clase is derived from
+ SOAP::WSDL::XSD::Typelib::Builtin::string
+. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
+like it's base type.
+
+# Description of restrictions not implemented yet.
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor.
+
+=head2 get_value / set_value
+
+Getter and setter for the simpleType's value.
+
+=head1 OVERLOADING
+
+Depending on the simple type's base type, the following operations are overloaded
+
+ Stringification
+ Numerification
+ Boolification
+
+Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/char40.pm b/perllib/BarnetTypes/char40.pm
new file mode 100644
index 000000000..4402875c1
--- /dev/null
+++ b/perllib/BarnetTypes/char40.pm
@@ -0,0 +1,65 @@
+package BarnetTypes::char40;
+use strict;
+use warnings;
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
+
+# derivation by restriction
+use base qw(
+ SOAP::WSDL::XSD::Typelib::Builtin::string);
+
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined simpleType
+char40 from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+This clase is derived from
+ SOAP::WSDL::XSD::Typelib::Builtin::string
+. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
+like it's base type.
+
+# Description of restrictions not implemented yet.
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor.
+
+=head2 get_value / set_value
+
+Getter and setter for the simpleType's value.
+
+=head1 OVERLOADING
+
+Depending on the simple type's base type, the following operations are overloaded
+
+ Stringification
+ Numerification
+ Boolification
+
+Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/char5.pm b/perllib/BarnetTypes/char5.pm
new file mode 100644
index 000000000..fed108437
--- /dev/null
+++ b/perllib/BarnetTypes/char5.pm
@@ -0,0 +1,65 @@
+package BarnetTypes::char5;
+use strict;
+use warnings;
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
+
+# derivation by restriction
+use base qw(
+ SOAP::WSDL::XSD::Typelib::Builtin::string);
+
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined simpleType
+char5 from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+This clase is derived from
+ SOAP::WSDL::XSD::Typelib::Builtin::string
+. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
+like it's base type.
+
+# Description of restrictions not implemented yet.
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor.
+
+=head2 get_value / set_value
+
+Getter and setter for the simpleType's value.
+
+=head1 OVERLOADING
+
+Depending on the simple type's base type, the following operations are overloaded
+
+ Stringification
+ Numerification
+ Boolification
+
+Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/char50.pm b/perllib/BarnetTypes/char50.pm
new file mode 100644
index 000000000..34e5720d1
--- /dev/null
+++ b/perllib/BarnetTypes/char50.pm
@@ -0,0 +1,65 @@
+package BarnetTypes::char50;
+use strict;
+use warnings;
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
+
+# derivation by restriction
+use base qw(
+ SOAP::WSDL::XSD::Typelib::Builtin::string);
+
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined simpleType
+char50 from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+This clase is derived from
+ SOAP::WSDL::XSD::Typelib::Builtin::string
+. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
+like it's base type.
+
+# Description of restrictions not implemented yet.
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor.
+
+=head2 get_value / set_value
+
+Getter and setter for the simpleType's value.
+
+=head1 OVERLOADING
+
+Depending on the simple type's base type, the following operations are overloaded
+
+ Stringification
+ Numerification
+ Boolification
+
+Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/numeric3.pm b/perllib/BarnetTypes/numeric3.pm
new file mode 100644
index 000000000..c473d2866
--- /dev/null
+++ b/perllib/BarnetTypes/numeric3.pm
@@ -0,0 +1,65 @@
+package BarnetTypes::numeric3;
+use strict;
+use warnings;
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
+
+# derivation by restriction
+use base qw(
+ SOAP::WSDL::XSD::Typelib::Builtin::string);
+
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined simpleType
+numeric3 from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+This clase is derived from
+ SOAP::WSDL::XSD::Typelib::Builtin::string
+. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
+like it's base type.
+
+# Description of restrictions not implemented yet.
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor.
+
+=head2 get_value / set_value
+
+Getter and setter for the simpleType's value.
+
+=head1 OVERLOADING
+
+Depending on the simple type's base type, the following operations are overloaded
+
+ Stringification
+ Numerification
+ Boolification
+
+Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/BarnetTypes/numeric6.pm b/perllib/BarnetTypes/numeric6.pm
new file mode 100644
index 000000000..b5438c1aa
--- /dev/null
+++ b/perllib/BarnetTypes/numeric6.pm
@@ -0,0 +1,65 @@
+package BarnetTypes::numeric6;
+use strict;
+use warnings;
+
+sub get_xmlns { 'urn:sap-com:document:sap:rfc:functions'};
+
+# derivation by restriction
+use base qw(
+ SOAP::WSDL::XSD::Typelib::Builtin::string);
+
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+
+
+=head1 DESCRIPTION
+
+Perl data type class for the XML Schema defined simpleType
+numeric6 from the namespace urn:sap-com:document:sap:rfc:functions.
+
+
+
+
+
+This clase is derived from
+ SOAP::WSDL::XSD::Typelib::Builtin::string
+. SOAP::WSDL's schema implementation does not validate data, so you can use it exactly
+like it's base type.
+
+# Description of restrictions not implemented yet.
+
+
+=head1 METHODS
+
+=head2 new
+
+Constructor.
+
+=head2 get_value / set_value
+
+Getter and setter for the simpleType's value.
+
+=head1 OVERLOADING
+
+Depending on the simple type's base type, the following operations are overloaded
+
+ Stringification
+ Numerification
+ Boolification
+
+Check L<SOAP::WSDL::XSD::Typelib::Builtin> for more information.
+
+=head1 AUTHOR
+
+Generated by SOAP::WSDL
+
+=cut
+
diff --git a/perllib/FixMyStreet/App/Controller/Admin.pm b/perllib/FixMyStreet/App/Controller/Admin.pm
index 83f77f401..acdaf7c04 100644
--- a/perllib/FixMyStreet/App/Controller/Admin.pm
+++ b/perllib/FixMyStreet/App/Controller/Admin.pm
@@ -6,6 +6,7 @@ BEGIN { extends 'Catalyst::Controller'; }
use POSIX qw(strftime strcoll);
use Digest::MD5 qw(md5_hex);
+use mySociety::EmailUtil qw(is_valid_email);
=head1 NAME
@@ -473,17 +474,29 @@ sub search_reports : Path('search_reports') {
$c->model('DB')->schema->storage->sql_maker->quote_char( '"' );
$c->model('DB')->schema->storage->sql_maker->name_sep( '.' );
+ my $query;
+ if (is_valid_email($search)) {
+ $query = [
+ 'user.email' => { ilike => $like_search },
+ ];
+ } elsif ($search =~ /^id:(\d+)$/) {
+ $query = [
+ 'me.id' => int($1),
+ ];
+ } else {
+ $query = [
+ 'me.id' => $search_n,
+ 'user.email' => { ilike => $like_search },
+ 'me.name' => { ilike => $like_search },
+ title => { ilike => $like_search },
+ detail => { ilike => $like_search },
+ council => { like => $like_search },
+ cobrand_data => { like => $like_search },
+ ];
+ }
my $problems = $c->cobrand->problems->search(
{
- -or => [
- 'me.id' => $search_n,
- 'user.email' => { ilike => $like_search },
- 'me.name' => { ilike => $like_search },
- title => { ilike => $like_search },
- detail => { ilike => $like_search },
- council => { like => $like_search },
- cobrand_data => { like => $like_search },
- ]
+ -or => $query,
},
{
prefetch => 'user',
@@ -499,17 +512,31 @@ sub search_reports : Path('search_reports') {
$c->stash->{edit_council_contacts} = 1
if ( grep {$_ eq 'councilcontacts'} keys %{$c->stash->{allowed_pages}});
+ if (is_valid_email($search)) {
+ $query = [
+ 'user.email' => { ilike => $like_search },
+ %{ $site_restriction },
+ ];
+ } elsif ($search =~ /^id:(\d+)$/) {
+ $query = [
+ 'me.id' => int($1),
+ 'problem.id' => int($1),
+ %{ $site_restriction },
+ ];
+ } else {
+ $query = [
+ 'me.id' => $search_n,
+ 'problem.id' => $search_n,
+ 'user.email' => { ilike => $like_search },
+ 'me.name' => { ilike => $like_search },
+ text => { ilike => $like_search },
+ 'me.cobrand_data' => { ilike => $like_search },
+ %{ $site_restriction },
+ ];
+ }
my $updates = $c->model('DB::Comment')->search(
{
- -or => [
- 'me.id' => $search_n,
- 'problem.id' => $search_n,
- 'user.email' => { ilike => $like_search },
- 'me.name' => { ilike => $like_search },
- text => { ilike => $like_search },
- 'me.cobrand_data' => { ilike => $like_search },
- %{ $site_restriction },
- ]
+ -or => $query,
},
{
-select => [ 'me.*', qw/problem.council problem.state/ ],
diff --git a/perllib/FixMyStreet/App/Controller/Report/New.pm b/perllib/FixMyStreet/App/Controller/Report/New.pm
index af4cdd5aa..6d22a0556 100644
--- a/perllib/FixMyStreet/App/Controller/Report/New.pm
+++ b/perllib/FixMyStreet/App/Controller/Report/New.pm
@@ -78,6 +78,8 @@ partial
=cut
+use constant COUNCIL_ID_BARNET => 2489;
+
sub report_new : Path : Args(0) {
my ( $self, $c ) = @_;
@@ -545,9 +547,15 @@ sub setup_categories_and_councils : Private {
} elsif ($first_council->{type} eq 'LBO') {
$area_ids_to_list{ $first_council->{id} } = 1;
+ my @local_categories;
+ if ($first_council->{id} == COUNCIL_ID_BARNET) {
+ @local_categories = sort(keys %{ Utils::barnet_categories() }); # removed 'Other' option
+ } else {
+ @local_categories = sort keys %{ Utils::london_categories() }
+ }
@category_options = (
_('-- Pick a category --'),
- sort keys %{ Utils::london_categories() }
+ @local_categories
);
$category_label = _('Category:');
@@ -733,8 +741,15 @@ sub process_report : Private {
$councils = join( ',', @{ $c->stash->{area_ids_to_list} } ) || -1;
$report->council( $councils );
- } elsif ( $first_council->{type} eq 'LBO') {
+ } elsif ( $first_council->{id} == COUNCIL_ID_BARNET ) {
+ unless ( exists Utils::barnet_categories()->{ $report->category } or $report->category eq 'Other') {
+ $c->stash->{field_errors}->{category} = _('Please choose a category');
+ }
+ $report->council( $first_council->{id} );
+
+ } elsif ( $first_council->{type} eq 'LBO') {
+
unless ( Utils::london_categories()->{ $report->category } ) {
$c->stash->{field_errors}->{category} = _('Please choose a category');
}
diff --git a/perllib/FixMyStreet/App/Controller/Static.pm b/perllib/FixMyStreet/App/Controller/Static.pm
index 52b230c27..d4b7a1b83 100755
--- a/perllib/FixMyStreet/App/Controller/Static.pm
+++ b/perllib/FixMyStreet/App/Controller/Static.pm
@@ -29,6 +29,10 @@ sub for_councils_faq : Path('/for-councils/faq') : Args(0) {
my ( $self, $c ) = @_;
}
+sub privacy : Global : Args(0) {
+ my ( $self, $c ) = @_;
+}
+
sub faq : Global : Args(0) {
my ( $self, $c ) = @_;
diff --git a/perllib/FixMyStreet/DB.pm b/perllib/FixMyStreet/DB.pm
index 18c8cc2ca..a1767abe9 100644
--- a/perllib/FixMyStreet/DB.pm
+++ b/perllib/FixMyStreet/DB.pm
@@ -1,3 +1,4 @@
+use utf8;
package FixMyStreet::DB;
# Created by DBIx::Class::Schema::Loader
@@ -10,8 +11,9 @@ use base 'DBIx::Class::Schema';
__PACKAGE__->load_namespaces;
-# Created by DBIx::Class::Schema::Loader v0.07009 @ 2011-03-01 15:43:43
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:tJZ+CpaAfZVPrctDXTZTuQ
+
+# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-03-08 17:19:55
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:CjFpUvon7KggFM7OF7VK/w
# You can replace this text with custom code or comments, and it will be preserved on regeneration
1;
diff --git a/perllib/FixMyStreet/DB/Result/Abuse.pm b/perllib/FixMyStreet/DB/Result/Abuse.pm
index b1cf9c1ed..e8e554afa 100644
--- a/perllib/FixMyStreet/DB/Result/Abuse.pm
+++ b/perllib/FixMyStreet/DB/Result/Abuse.pm
@@ -1,3 +1,4 @@
+use utf8;
package FixMyStreet::DB::Result::Abuse;
# Created by DBIx::Class::Schema::Loader
@@ -7,15 +8,14 @@ use strict;
use warnings;
use base 'DBIx::Class::Core';
-
__PACKAGE__->load_components("FilterColumn", "InflateColumn::DateTime", "EncodedColumn");
__PACKAGE__->table("abuse");
__PACKAGE__->add_columns("email", { data_type => "text", is_nullable => 0 });
__PACKAGE__->set_primary_key("email");
-# Created by DBIx::Class::Schema::Loader v0.07010 @ 2011-06-23 15:49:48
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:IuTLiJSDZGLF/WX8q3iKIQ
+# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-03-08 17:19:55
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:PnQhGMx+ktK++3gWOMJBpQ
# You can replace this text with custom code or comments, and it will be preserved on regeneration
1;
diff --git a/perllib/FixMyStreet/DB/Result/AdminLog.pm b/perllib/FixMyStreet/DB/Result/AdminLog.pm
index da97950a0..ede786871 100644
--- a/perllib/FixMyStreet/DB/Result/AdminLog.pm
+++ b/perllib/FixMyStreet/DB/Result/AdminLog.pm
@@ -1,3 +1,4 @@
+use utf8;
package FixMyStreet::DB::Result::AdminLog;
# Created by DBIx::Class::Schema::Loader
@@ -7,7 +8,6 @@ use strict;
use warnings;
use base 'DBIx::Class::Core';
-
__PACKAGE__->load_components("FilterColumn", "InflateColumn::DateTime", "EncodedColumn");
__PACKAGE__->table("admin_log");
__PACKAGE__->add_columns(
@@ -36,8 +36,8 @@ __PACKAGE__->add_columns(
__PACKAGE__->set_primary_key("id");
-# Created by DBIx::Class::Schema::Loader v0.07010 @ 2011-06-23 15:49:48
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:7427CuN3/6IL2GxiQDoWUA
+# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-03-08 17:19:55
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:+NlSH8U+beRjBZl8CpqK9A
# You can replace this text with custom code or comments, and it will be preserved on regeneration
diff --git a/perllib/FixMyStreet/DB/Result/Alert.pm b/perllib/FixMyStreet/DB/Result/Alert.pm
index eddd98f37..ca9ad45c2 100644
--- a/perllib/FixMyStreet/DB/Result/Alert.pm
+++ b/perllib/FixMyStreet/DB/Result/Alert.pm
@@ -1,3 +1,4 @@
+use utf8;
package FixMyStreet::DB::Result::Alert;
# Created by DBIx::Class::Schema::Loader
@@ -7,7 +8,6 @@ use strict;
use warnings;
use base 'DBIx::Class::Core';
-
__PACKAGE__->load_components("FilterColumn", "InflateColumn::DateTime", "EncodedColumn");
__PACKAGE__->table("alert");
__PACKAGE__->add_columns(
@@ -24,6 +24,8 @@ __PACKAGE__->add_columns(
{ data_type => "text", is_nullable => 1 },
"parameter2",
{ data_type => "text", is_nullable => 1 },
+ "user_id",
+ { data_type => "integer", is_foreign_key => 1, is_nullable => 0 },
"confirmed",
{ data_type => "integer", default_value => 0, is_nullable => 0 },
"lang",
@@ -40,8 +42,6 @@ __PACKAGE__->add_columns(
},
"whendisabled",
{ data_type => "timestamp", is_nullable => 1 },
- "user_id",
- { data_type => "integer", is_foreign_key => 1, is_nullable => 0 },
);
__PACKAGE__->set_primary_key("id");
__PACKAGE__->belongs_to(
@@ -50,22 +50,22 @@ __PACKAGE__->belongs_to(
{ ref => "alert_type" },
{ is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" },
);
+__PACKAGE__->has_many(
+ "alerts_sent",
+ "FixMyStreet::DB::Result::AlertSent",
+ { "foreign.alert_id" => "self.id" },
+ { cascade_copy => 0, cascade_delete => 0 },
+);
__PACKAGE__->belongs_to(
"user",
"FixMyStreet::DB::Result::User",
{ id => "user_id" },
{ is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" },
);
-__PACKAGE__->has_many(
- "alert_sents",
- "FixMyStreet::DB::Result::AlertSent",
- { "foreign.alert_id" => "self.id" },
- { cascade_copy => 0, cascade_delete => 0 },
-);
-# Created by DBIx::Class::Schema::Loader v0.07010 @ 2011-06-23 15:49:48
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:d2TrE9UIZdXu3eXYJH0Zmw
+# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-03-08 17:19:55
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:vump36YxUO4FQi5Do6DwvA
# You can replace this text with custom code or comments, and it will be preserved on regeneration
diff --git a/perllib/FixMyStreet/DB/Result/AlertSent.pm b/perllib/FixMyStreet/DB/Result/AlertSent.pm
index a901c2fde..a537c95cd 100644
--- a/perllib/FixMyStreet/DB/Result/AlertSent.pm
+++ b/perllib/FixMyStreet/DB/Result/AlertSent.pm
@@ -1,3 +1,4 @@
+use utf8;
package FixMyStreet::DB::Result::AlertSent;
# Created by DBIx::Class::Schema::Loader
@@ -7,7 +8,6 @@ use strict;
use warnings;
use base 'DBIx::Class::Core';
-
__PACKAGE__->load_components("FilterColumn", "InflateColumn::DateTime", "EncodedColumn");
__PACKAGE__->table("alert_sent");
__PACKAGE__->add_columns(
@@ -30,8 +30,8 @@ __PACKAGE__->belongs_to(
);
-# Created by DBIx::Class::Schema::Loader v0.07010 @ 2011-06-23 15:49:48
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:fTiWIoriQUvHpWc9PpFLvA
+# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-03-08 17:19:55
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:oN+36hDWJuc0hqkCW9BHOw
# You can replace this text with custom code or comments, and it will be preserved on regeneration
diff --git a/perllib/FixMyStreet/DB/Result/AlertType.pm b/perllib/FixMyStreet/DB/Result/AlertType.pm
index d23a2983d..3aa9677e0 100644
--- a/perllib/FixMyStreet/DB/Result/AlertType.pm
+++ b/perllib/FixMyStreet/DB/Result/AlertType.pm
@@ -1,3 +1,4 @@
+use utf8;
package FixMyStreet::DB::Result::AlertType;
# Created by DBIx::Class::Schema::Loader
@@ -7,7 +8,6 @@ use strict;
use warnings;
use base 'DBIx::Class::Core';
-
__PACKAGE__->load_components("FilterColumn", "InflateColumn::DateTime", "EncodedColumn");
__PACKAGE__->table("alert_type");
__PACKAGE__->add_columns(
@@ -47,8 +47,8 @@ __PACKAGE__->has_many(
);
-# Created by DBIx::Class::Schema::Loader v0.07010 @ 2011-06-23 15:49:48
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:+PKqo7IZ4MlM9ur4V2P9tA
+# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-03-08 17:19:55
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:KDBYzNEAM5lPvZjb9cv22g
# You can replace this text with custom code or comments, and it will be preserved on regeneration
diff --git a/perllib/FixMyStreet/DB/Result/Comment.pm b/perllib/FixMyStreet/DB/Result/Comment.pm
index 195fe4019..5b45c63a8 100644
--- a/perllib/FixMyStreet/DB/Result/Comment.pm
+++ b/perllib/FixMyStreet/DB/Result/Comment.pm
@@ -1,3 +1,4 @@
+use utf8;
package FixMyStreet::DB::Result::Comment;
# Created by DBIx::Class::Schema::Loader
@@ -7,7 +8,6 @@ use strict;
use warnings;
use base 'DBIx::Class::Core';
-
__PACKAGE__->load_components("FilterColumn", "InflateColumn::DateTime", "EncodedColumn");
__PACKAGE__->table("comment");
__PACKAGE__->add_columns(
@@ -20,6 +20,10 @@ __PACKAGE__->add_columns(
},
"problem_id",
{ data_type => "integer", is_foreign_key => 1, is_nullable => 0 },
+ "user_id",
+ { data_type => "integer", is_foreign_key => 1, is_nullable => 0 },
+ "anonymous",
+ { data_type => "boolean", is_nullable => 0 },
"name",
{ data_type => "text", is_nullable => 1 },
"website",
@@ -48,30 +52,26 @@ __PACKAGE__->add_columns(
{ data_type => "boolean", is_nullable => 0 },
"mark_open",
{ data_type => "boolean", default_value => \"false", is_nullable => 0 },
- "user_id",
- { data_type => "integer", is_foreign_key => 1, is_nullable => 0 },
- "anonymous",
- { data_type => "boolean", is_nullable => 0 },
"problem_state",
{ data_type => "text", is_nullable => 1 },
);
__PACKAGE__->set_primary_key("id");
__PACKAGE__->belongs_to(
- "user",
- "FixMyStreet::DB::Result::User",
- { id => "user_id" },
- { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" },
-);
-__PACKAGE__->belongs_to(
"problem",
"FixMyStreet::DB::Result::Problem",
{ id => "problem_id" },
{ is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" },
);
+__PACKAGE__->belongs_to(
+ "user",
+ "FixMyStreet::DB::Result::User",
+ { id => "user_id" },
+ { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" },
+);
-# Created by DBIx::Class::Schema::Loader v0.07010 @ 2011-06-27 10:07:32
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ilLn3dlagg5COdpZDmzrVQ
+# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-03-08 17:19:55
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:E+96vo/AB0zz1jAEPj/OKw
use DateTime::TimeZone;
use Image::Size;
diff --git a/perllib/FixMyStreet/DB/Result/Contact.pm b/perllib/FixMyStreet/DB/Result/Contact.pm
index 941e4e1bb..c32b75d0c 100644
--- a/perllib/FixMyStreet/DB/Result/Contact.pm
+++ b/perllib/FixMyStreet/DB/Result/Contact.pm
@@ -1,3 +1,4 @@
+use utf8;
package FixMyStreet::DB::Result::Contact;
# Created by DBIx::Class::Schema::Loader
@@ -7,7 +8,6 @@ use strict;
use warnings;
use base 'DBIx::Class::Core';
-
__PACKAGE__->load_components("FilterColumn", "InflateColumn::DateTime", "EncodedColumn");
__PACKAGE__->table("contacts");
__PACKAGE__->add_columns(
@@ -40,8 +40,9 @@ __PACKAGE__->add_columns(
__PACKAGE__->set_primary_key("id");
__PACKAGE__->add_unique_constraint("contacts_area_id_category_idx", ["area_id", "category"]);
-# Created by DBIx::Class::Schema::Loader v0.07010 @ 2011-08-01 10:07:59
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:4y6yRz4rMN66pBpkzfJJhg
+
+# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-03-08 17:19:55
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:hyvU0bMWSFxEPAJT7wqM/Q
__PACKAGE__->filter_column(
extra => {
diff --git a/perllib/FixMyStreet/DB/Result/ContactsHistory.pm b/perllib/FixMyStreet/DB/Result/ContactsHistory.pm
index 811a06b44..deb00fb95 100644
--- a/perllib/FixMyStreet/DB/Result/ContactsHistory.pm
+++ b/perllib/FixMyStreet/DB/Result/ContactsHistory.pm
@@ -1,3 +1,4 @@
+use utf8;
package FixMyStreet::DB::Result::ContactsHistory;
# Created by DBIx::Class::Schema::Loader
@@ -7,7 +8,6 @@ use strict;
use warnings;
use base 'DBIx::Class::Core';
-
__PACKAGE__->load_components("FilterColumn", "InflateColumn::DateTime", "EncodedColumn");
__PACKAGE__->table("contacts_history");
__PACKAGE__->add_columns(
@@ -40,8 +40,8 @@ __PACKAGE__->add_columns(
__PACKAGE__->set_primary_key("contacts_history_id");
-# Created by DBIx::Class::Schema::Loader v0.07010 @ 2011-06-23 15:49:48
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:9APvBwAOebG5g4MGxJuVKQ
+# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-03-08 17:19:55
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:dN2ueIDoP3d/+Mg1UDqsMw
# You can replace this text with custom code or comments, and it will be preserved on regeneration
diff --git a/perllib/FixMyStreet/DB/Result/Open311conf.pm b/perllib/FixMyStreet/DB/Result/Open311conf.pm
index 0a5784560..742a12ebd 100644
--- a/perllib/FixMyStreet/DB/Result/Open311conf.pm
+++ b/perllib/FixMyStreet/DB/Result/Open311conf.pm
@@ -1,3 +1,4 @@
+use utf8;
package FixMyStreet::DB::Result::Open311conf;
# Created by DBIx::Class::Schema::Loader
@@ -7,7 +8,6 @@ use strict;
use warnings;
use base 'DBIx::Class::Core';
-
__PACKAGE__->load_components("FilterColumn", "InflateColumn::DateTime", "EncodedColumn");
__PACKAGE__->table("open311conf");
__PACKAGE__->add_columns(
@@ -26,13 +26,15 @@ __PACKAGE__->add_columns(
{ data_type => "text", is_nullable => 1 },
"api_key",
{ data_type => "text", is_nullable => 1 },
+ "send_method",
+ { data_type => "text", is_nullable => 1 },
);
__PACKAGE__->set_primary_key("id");
__PACKAGE__->add_unique_constraint("open311conf_area_id_key", ["area_id"]);
-# Created by DBIx::Class::Schema::Loader v0.07010 @ 2011-07-29 18:09:25
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ryqCpvwjNtQrZm4I3s0hxg
+# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-03-08 17:19:55
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ClYnPB2gsKapnfHuco5d/w
# You can replace this text with custom code or comments, and it will be preserved on regeneration
diff --git a/perllib/FixMyStreet/DB/Result/Problem.pm b/perllib/FixMyStreet/DB/Result/Problem.pm
index ce7488703..4b738b66c 100644
--- a/perllib/FixMyStreet/DB/Result/Problem.pm
+++ b/perllib/FixMyStreet/DB/Result/Problem.pm
@@ -1,3 +1,4 @@
+use utf8;
package FixMyStreet::DB::Result::Problem;
# Created by DBIx::Class::Schema::Loader
@@ -7,7 +8,6 @@ use strict;
use warnings;
use base 'DBIx::Class::Core';
-
__PACKAGE__->load_components("FilterColumn", "InflateColumn::DateTime", "EncodedColumn");
__PACKAGE__->table("problem");
__PACKAGE__->add_columns(
@@ -84,6 +84,12 @@ __PACKAGE__->add_columns(
{ data_type => "boolean", default_value => \"false", is_nullable => 0 },
"geocode",
{ data_type => "bytea", is_nullable => 1 },
+ "send_fail_count",
+ { data_type => "integer", is_nullable => 1 },
+ "send_fail_reason",
+ { data_type => "text", is_nullable => 1 },
+ "send_fail_timestamp",
+ { data_type => "timestamp", is_nullable => 1 },
);
__PACKAGE__->set_primary_key("id");
__PACKAGE__->has_many(
@@ -92,22 +98,22 @@ __PACKAGE__->has_many(
{ "foreign.problem_id" => "self.id" },
{ cascade_copy => 0, cascade_delete => 0 },
);
-__PACKAGE__->belongs_to(
- "user",
- "FixMyStreet::DB::Result::User",
- { id => "user_id" },
- { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" },
-);
__PACKAGE__->has_many(
"questionnaires",
"FixMyStreet::DB::Result::Questionnaire",
{ "foreign.problem_id" => "self.id" },
{ cascade_copy => 0, cascade_delete => 0 },
);
+__PACKAGE__->belongs_to(
+ "user",
+ "FixMyStreet::DB::Result::User",
+ { id => "user_id" },
+ { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" },
+);
-# Created by DBIx::Class::Schema::Loader v0.07010 @ 2011-09-19 14:38:43
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:nq8Ufn/SEoDGSrrGlHIxag
+# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-03-16 10:08:56
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:VODeZlWk8l/+IzBBlRNV0A
# Add fake relationship to stored procedure table
__PACKAGE__->has_one(
@@ -563,6 +569,35 @@ sub body {
}
# TODO Some/much of this could be moved to the template
+
+# either:
+# "sent to council 3 mins later"
+# "council ref: XYZ"
+# or
+# "sent to council 3 mins later, their ref: XYZ"
+#
+# Note: some silliness with pronouns and the adjacent comma mean this is
+# being presented as a single string rather than two
+sub processed_summary_string {
+ my ( $problem, $c ) = @_;
+ my ($duration_clause, $external_ref_clause);
+ if ($problem->whensent) {
+ $duration_clause = $problem->duration_string($c)
+ }
+ if ($problem->external_id) {
+ if ($duration_clause) {
+ $external_ref_clause = sprintf(_('their ref:&nbsp;%s'), $problem->external_id);
+ } else {
+ $external_ref_clause = sprintf(_('%s ref:&nbsp;%s'), $problem->external_body, $problem->external_id);
+ }
+ }
+ if ($duration_clause and $external_ref_clause) {
+ return "$duration_clause, $external_ref_clause"
+ } else {
+ return $duration_clause || $external_ref_clause
+ }
+}
+
sub duration_string {
my ( $problem, $c ) = @_;
my $body = $problem->body( $c );
diff --git a/perllib/FixMyStreet/DB/Result/Questionnaire.pm b/perllib/FixMyStreet/DB/Result/Questionnaire.pm
index cc4ec300b..b6791603a 100644
--- a/perllib/FixMyStreet/DB/Result/Questionnaire.pm
+++ b/perllib/FixMyStreet/DB/Result/Questionnaire.pm
@@ -1,3 +1,4 @@
+use utf8;
package FixMyStreet::DB::Result::Questionnaire;
# Created by DBIx::Class::Schema::Loader
@@ -7,7 +8,6 @@ use strict;
use warnings;
use base 'DBIx::Class::Core';
-
__PACKAGE__->load_components("FilterColumn", "InflateColumn::DateTime", "EncodedColumn");
__PACKAGE__->table("questionnaire");
__PACKAGE__->add_columns(
@@ -40,8 +40,8 @@ __PACKAGE__->belongs_to(
);
-# Created by DBIx::Class::Schema::Loader v0.07010 @ 2011-06-23 15:49:48
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:QNFqqCg6J4SFlg4zwm7TWw
+# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-03-08 17:19:55
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:NGlSRjoBpDoIvK3EueqN6Q
use DateTime::TimeZone;
diff --git a/perllib/FixMyStreet/DB/Result/Secret.pm b/perllib/FixMyStreet/DB/Result/Secret.pm
index 8a1fa671d..449dfec0e 100644
--- a/perllib/FixMyStreet/DB/Result/Secret.pm
+++ b/perllib/FixMyStreet/DB/Result/Secret.pm
@@ -1,3 +1,4 @@
+use utf8;
package FixMyStreet::DB::Result::Secret;
# Created by DBIx::Class::Schema::Loader
@@ -7,14 +8,13 @@ use strict;
use warnings;
use base 'DBIx::Class::Core';
-
__PACKAGE__->load_components("FilterColumn", "InflateColumn::DateTime", "EncodedColumn");
__PACKAGE__->table("secret");
__PACKAGE__->add_columns("secret", { data_type => "text", is_nullable => 0 });
-# Created by DBIx::Class::Schema::Loader v0.07010 @ 2011-06-23 15:49:48
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:MfqW1K0aFtwpa/1c/UwHjg
+# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-03-08 17:19:55
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:9XiWSKJ1PD3LSYjrSA3drw
# You can replace this text with custom code or comments, and it will be preserved on regeneration
diff --git a/perllib/FixMyStreet/DB/Result/Session.pm b/perllib/FixMyStreet/DB/Result/Session.pm
index 9d5d509dc..4713c99eb 100644
--- a/perllib/FixMyStreet/DB/Result/Session.pm
+++ b/perllib/FixMyStreet/DB/Result/Session.pm
@@ -1,3 +1,4 @@
+use utf8;
package FixMyStreet::DB::Result::Session;
# Created by DBIx::Class::Schema::Loader
@@ -7,7 +8,6 @@ use strict;
use warnings;
use base 'DBIx::Class::Core';
-
__PACKAGE__->load_components("FilterColumn", "InflateColumn::DateTime", "EncodedColumn");
__PACKAGE__->table("sessions");
__PACKAGE__->add_columns(
@@ -21,8 +21,8 @@ __PACKAGE__->add_columns(
__PACKAGE__->set_primary_key("id");
-# Created by DBIx::Class::Schema::Loader v0.07010 @ 2011-06-23 15:49:48
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:TagSQOXnDttkwfJ7oDH8Yw
+# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-03-08 17:19:55
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:MVmCn4gLQWXTDIIaDHiVmA
# You can replace this text with custom code or comments, and it will be preserved on regeneration
1;
diff --git a/perllib/FixMyStreet/DB/Result/Token.pm b/perllib/FixMyStreet/DB/Result/Token.pm
index 3a900858d..b223ada3a 100644
--- a/perllib/FixMyStreet/DB/Result/Token.pm
+++ b/perllib/FixMyStreet/DB/Result/Token.pm
@@ -1,3 +1,4 @@
+use utf8;
package FixMyStreet::DB::Result::Token;
# Created by DBIx::Class::Schema::Loader
@@ -7,7 +8,6 @@ use strict;
use warnings;
use base 'DBIx::Class::Core';
-
__PACKAGE__->load_components("FilterColumn", "InflateColumn::DateTime", "EncodedColumn");
__PACKAGE__->table("token");
__PACKAGE__->add_columns(
@@ -27,8 +27,8 @@ __PACKAGE__->add_columns(
__PACKAGE__->set_primary_key("scope", "token");
-# Created by DBIx::Class::Schema::Loader v0.07010 @ 2011-06-23 15:49:48
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:frl+na3HrIzGw9D1t891nA
+# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-03-08 17:19:55
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:+LLZ8P5GXqPetuGyrra2vw
# Trying not to use this
# use mySociety::DBHandle qw(dbh);
diff --git a/perllib/FixMyStreet/DB/Result/User.pm b/perllib/FixMyStreet/DB/Result/User.pm
index 56d726a8d..e13d88b88 100644
--- a/perllib/FixMyStreet/DB/Result/User.pm
+++ b/perllib/FixMyStreet/DB/Result/User.pm
@@ -1,3 +1,4 @@
+use utf8;
package FixMyStreet::DB::Result::User;
# Created by DBIx::Class::Schema::Loader
@@ -7,7 +8,6 @@ use strict;
use warnings;
use base 'DBIx::Class::Core';
-
__PACKAGE__->load_components("FilterColumn", "InflateColumn::DateTime", "EncodedColumn");
__PACKAGE__->table("users");
__PACKAGE__->add_columns(
@@ -53,8 +53,8 @@ __PACKAGE__->has_many(
);
-# Created by DBIx::Class::Schema::Loader v0.07010 @ 2011-06-27 10:25:21
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:9IHuqRTcHZCqJeBAaiQxzw
+# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-03-08 17:19:55
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:tM1LUGrqDeQnF4BDgnYXGQ
__PACKAGE__->add_columns(
"password" => {
diff --git a/perllib/SOAP/WSDL/Serializer/XSD.pm b/perllib/SOAP/WSDL/Serializer/XSD.pm
new file mode 100644
index 000000000..f233f74e7
--- /dev/null
+++ b/perllib/SOAP/WSDL/Serializer/XSD.pm
@@ -0,0 +1,148 @@
+#!/usr/bin/perl -w
+package SOAP::WSDL::Serializer::XSD;
+use strict;
+use warnings;
+use Class::Std::Fast::Storable;
+use Scalar::Util qw(blessed);
+
+use version; our $VERSION = qv('2.00.10');
+
+use SOAP::WSDL::Factory::Serializer;
+
+my $SOAP_NS = 'http://schemas.xmlsoap.org/soap/envelope/';
+my $XML_INSTANCE_NS = 'http://www.w3.org/2001/XMLSchema-instance';
+
+sub serialize {
+ my ($self, $args_of_ref) = @_;
+
+ my $opt = $args_of_ref->{ options };
+
+ if (not $opt->{ namespace }->{ $SOAP_NS })
+ {
+ $opt->{ namespace }->{ $SOAP_NS } = 'SOAP-ENV';
+ }
+
+ if (not $opt->{ namespace }->{ $XML_INSTANCE_NS })
+ {
+ $opt->{ namespace }->{ $XML_INSTANCE_NS } = 'xsi';
+ }
+
+ my $soap_prefix = $opt->{ namespace }->{ $SOAP_NS };
+
+ # envelope start with namespaces
+ my $xml = "<$soap_prefix\:Envelope ";
+
+ while (my ($uri, $prefix) = each %{ $opt->{ namespace } })
+ {
+ $xml .= "xmlns:$prefix=\"$uri\" ";
+ }
+ #
+ # add namespace for user-supplied prefix if needed
+ $xml .= "xmlns:$opt->{prefix}=\"" . $args_of_ref->{ body }->get_xmlns() . "\" "
+ if $opt->{prefix};
+
+ # TODO insert encoding
+ $xml.='>';
+ $xml .= $self->serialize_header($args_of_ref->{ method }, $args_of_ref->{ header }, $opt);
+ $xml .= $self->serialize_body($args_of_ref->{ method }, $args_of_ref->{ body }, $opt);
+ $xml .= '</' . $soap_prefix .':Envelope>';
+ return $xml;
+}
+
+sub serialize_header {
+ my ($self, $method, $data, $opt) = @_;
+
+ # header is optional. Leave out if there's no header data
+ return q{} if not $data;
+ return join ( q{},
+ "<$opt->{ namespace }->{ $SOAP_NS }\:Header>",
+ blessed $data ? $data->serialize_qualified : (),
+ "</$opt->{ namespace }->{ $SOAP_NS }\:Header>",
+ );
+}
+
+sub serialize_body {
+ my ($self, $method, $data, $opt) = @_;
+
+ # TODO This one wipes out the old class' XML name globally
+ # Fix in some more appropriate place...
+ # $data->__set_name("$opt->{prefix}:" . $data->__get_name() ) if $opt->{prefix};
+ # fix: -------v from https://rt.cpan.org/Public/Bug/Display.html?id=38035
+ if ( $opt->{prefix} ) {
+ my $body_name = $data->__get_name();
+ $body_name =~ s/.+://;
+ $data->__set_name($opt->{prefix} . ":" . $body_name );
+ }
+ # fix end ----^
+
+ # Body is NOT optional. Serialize to empty body
+ # if we have no data.
+ return join ( q{},
+ "<$opt->{ namespace }->{ $SOAP_NS }\:Body>",
+ defined $data
+ ? ref $data eq 'ARRAY'
+ ? join q{}, map { blessed $_ ? $_->serialize_qualified() : () } @{ $data }
+ : blessed $data
+ ? $opt->{prefix}
+ ? $data->serialize()
+ : $data->serialize_qualified()
+ : ()
+ : (),
+ "</$opt->{ namespace }->{ $SOAP_NS }\:Body>",
+ );
+}
+
+__END__
+
+=pod
+
+=head1 NAME
+
+SOAP:WSDL::Serializer::XSD - Serializer for SOAP::WSDL::XSD::Typelib:: objects
+
+=head1 DESCRIPTION
+
+This is the default serializer for SOAP::WSDL::Client and Interface classes
+generated by SOAP::WSDL
+
+It may be used as a template for creating custom serializers.
+
+See L<SOAP::WSDL::Factory::Serializer|SOAP::WSDL::Factory::Serializer> for
+details on that.
+
+=head1 METHODS
+
+=head2 serialize
+
+Creates a SOAP envelope based on the body and header arguments passed.
+
+Sets SOAP namespaces.
+
+=head2 serialize_body
+
+Serializes a message body to XML
+
+=head2 serialize_header
+
+Serializes a message header to XML
+
+=head1 LICENSE AND COPYRIGHT
+
+Copyright (c) 2007 Martin Kutter. All rights reserved.
+
+This file is part of SOAP-WSDL. You may distribute/modify it under
+the same terms as perl itself
+
+=head1 AUTHOR
+
+Martin Kutter E<lt>martin.kutter fen-net.deE<gt>
+
+=head1 REPOSITORY INFORMATION
+
+ $Rev: 851 $
+ $LastChangedBy: kutterma $
+ $Id: XSD.pm 851 2009-05-15 22:45:18Z kutterma $
+ $HeadURL: https://soap-wsdl.svn.sourceforge.net/svnroot/soap-wsdl/SOAP-WSDL/trunk/lib/SOAP/WSDL/Serializer/XSD.pm $
+
+=cut
+
diff --git a/perllib/Utils.pm b/perllib/Utils.pm
index 4e64836c6..6a47fd17d 100644
--- a/perllib/Utils.pm
+++ b/perllib/Utils.pm
@@ -140,6 +140,47 @@ sub london_categories {
};
}
+sub barnet_categories {
+ # The values here are KBIDs from Barnet's system: see bin/send-reports for formatting
+ if (mySociety::Config::get('STAGING_SITE')) { # note staging site must use different KBIDs
+ return {
+ 'Blocked drain' => 255, # Gullies-Blocked
+ 'Dead animal' => 286, # Animals-Dead-Removal
+ 'Dog fouling' => 288, # Dog Fouling-Clear
+ 'Fly tipping' => 347, # Fly tipping-Clear
+ 'Graffiti' => 292, # Graffiti-Removal
+ 'Litter, accumulated' => 349, # Accumulated Litter
+ 'Litter, overflowing bins' => 205, # Litter Bins-Overflowing
+ 'Pavements' => 195, # Pavements-Damaged/Cracked
+ 'Pothole' => 204, # Pothole
+ 'Roads Signs' => 432, # Roads Signs - Maintenance
+ 'Street Lighting' => 251, # Street Lighting
+ 'Traffic Lights' => 103, # Traffic Lights
+ }
+ } else {
+ return {
+ 'Abandoned Vehicle' => 468,
+ 'Accumulated Litter' => 349,
+ 'Dog Bin' => 203,
+ 'Dog Fouling' => 288,
+ 'Drain or Gully' => 256,
+ 'Fly Posting' => 465,
+ 'Fly Tipping' => 449,
+ 'Graffiti' => 292,
+ 'Gritting' => 200,
+ 'Highways' => 186,
+ 'Litter Bin Overflowing' => 205,
+ 'Manhole Cover' => 417,
+ 'Overhanging Foliage' => 421,
+ 'Pavement Damaged/Cracked' => 195,
+ 'Pothole' => 204,
+ 'Road Sign' => 80,
+ 'Roadworks' => 246,
+ 'Street Lighting' => 251,
+ };
+ }
+}
+
=head2 trim_text
my $text = trim_text( $text_to_trim );
diff --git a/templates/web/default/admin/search_users.html b/templates/web/default/admin/search_users.html
index b4fa2c2da..98723e6ef 100644
--- a/templates/web/default/admin/search_users.html
+++ b/templates/web/default/admin/search_users.html
@@ -18,7 +18,7 @@
[%- FOREACH user IN users %]
<tr>
<td>[% PROCESS value_or_nbsp value=user.name %]</td>
- <td>[% PROCESS value_or_nbsp value=user.email %]</td>
+ <td><a href="[% c.uri_for( 'search_reports', user.email ) %]">[% PROCESS value_or_nbsp value=user.email %]</a></td>
<td>[% PROCESS value_or_nbsp value=user.from_council %]</td>
<td>[% user.flagged ? loc('Yes') : '&nbsp;' %]</td>
<td><a href="[% c.uri_for( 'user_edit', user.id ) %]">[% loc('Edit') %]</a></td>
diff --git a/templates/web/default/common_header_tags.html b/templates/web/default/common_header_tags.html
index e74ae7b70..c87f93994 100644
--- a/templates/web/default/common_header_tags.html
+++ b/templates/web/default/common_header_tags.html
@@ -3,7 +3,7 @@
<script type="text/javascript" src="/js/validation_strings.[% lang_code %].js?[% Math.int( date.now / 3600 ) %]"></script>
-<script type="text/javascript" src="/jslib/jquery-1.7.0.min.js"></script>
+<script type="text/javascript" src="/jslib/jquery-1.7.2.min.js"></script>
<script src="[% version('/js/jquery.validate.min.js') %]" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" src="[% version('/js/geo.min.js') %]"></script>
diff --git a/templates/web/default/report/_main.html b/templates/web/default/report/_main.html
index 8cc1efec2..552be17e6 100644
--- a/templates/web/default/report/_main.html
+++ b/templates/web/default/report/_main.html
@@ -2,9 +2,12 @@
<p><em>[% problem.meta_line(c) | html %]
[% IF problem.council %]
- [% IF problem.whensent %]
- <small class="council_sent_info"><br>[% problem.duration_string(c) %]</small>
+ [% IF problem.whensent || problem.external_id %]
+ <small class="council_sent_info"><br>
+ [% problem.processed_summary_string(c) %]
+ </small>
[% END %]
+
[% ELSE %]
<br><small>[% loc('Not reported to council') %]</small>
[% END %]
diff --git a/templates/web/fixmystreet/faq/faq-en-gb.html b/templates/web/fixmystreet/faq/faq-en-gb.html
index 462c43564..fe899d3a2 100755
--- a/templates/web/fixmystreet/faq/faq-en-gb.html
+++ b/templates/web/fixmystreet/faq/faq-en-gb.html
@@ -5,8 +5,8 @@
<ul class="plain-list">
<li><a href="#faq">Frequently Asked Questions</a></li>
<li><a href="#practical">Practical Questions</a></li>
- <li><a href="#privacy">Privacy Questions</a></li>
<li><a href="#organisation">Organisation Questions</a></li>
+ <li><a href="/privacy">Privacy and cookies</a></li>
</ul>
</aside>
</div>
@@ -133,22 +133,6 @@ by a user of the site.</dd>
to publicise us on the web or in your local area, and why not write to your
local paper to let them know about us?</dd> </dl>
- <h2><a name="privacy"></a>Privacy Questions</h2>
- <dl>
- <dt>Who gets to see my email address?</dt>
- <dd>If you submit a problem, we pass on your details, and details
-of the problem, to the council contact or contacts responsible for the
-area where you located the problem. Other than the council, who obviously get your
-email address, only people we authorise to view the FixMyStreet administration interface
-will be able to see your email address and they will never use it for anything other than
-to help administer FixMyStreet. Similarly with email addresses from updates. We will never give or sell your email address to anyone else,
-unless we are obliged to by law. Your name will not be published anywhere unless you let us.</dd>
- <dt>Will you send nasty, brutish spam to my email address?</dt>
- <dd>Never. We will email you if someone leaves an update on a
-problem you&rsquo;ve reported, and send you a questionnaire email four weeks
-after you submit a problem, asking for a status update; we&rsquo;ll only ever
-send you emails in relation to your problem.</dd>
- </dl>
<h2><a name="organisation"></a>Organisation Questions</h2>
<dl>
<dt>Who built FixMyStreet?</dt>
diff --git a/templates/web/fixmystreet/footer.html b/templates/web/fixmystreet/footer.html
index c73c9eb2c..ada4b5d7e 100644
--- a/templates/web/fixmystreet/footer.html
+++ b/templates/web/fixmystreet/footer.html
@@ -25,6 +25,7 @@
</ul>
</div>
</div>
+ <p><a href="/privacy">Privacy and cookies</a></p>
</footer>
[% END %]
</div><!-- .content role=main -->
diff --git a/templates/web/fixmystreet/report/new/councils_text_all.html b/templates/web/fixmystreet/report/new/councils_text_all.html
index fb10ec4fd..fe2d5be12 100644
--- a/templates/web/fixmystreet/report/new/councils_text_all.html
+++ b/templates/web/fixmystreet/report/new/councils_text_all.html
@@ -1,5 +1,5 @@
<p>
-[% IF all_councils.${area_ids_to_list.0}.type == 'LBO' %]
+[% IF area_ids_to_list.0 != 2489 && all_councils.${area_ids_to_list.0}.type == 'LBO' %]
[%
tprintf(
loc('All the information you provide here will be sent to <strong>%s</strong> or a relevant local body such as <strong>TfL</strong>, via the London Report-It system.'),
@@ -16,4 +16,4 @@
[% END %]
[% loc('The subject and details of the problem will be public, plus your name if you give us permission.') %]
-</p> \ No newline at end of file
+</p>
diff --git a/templates/web/fixmystreet/static/privacy.html b/templates/web/fixmystreet/static/privacy.html
new file mode 100755
index 000000000..17480f68b
--- /dev/null
+++ b/templates/web/fixmystreet/static/privacy.html
@@ -0,0 +1,80 @@
+[% INCLUDE 'header.html', title => loc('Frequently Asked Questions'), bodyclass => 'twothirdswidthpage' %]
+
+<div class="sticky-sidebar">
+ <aside>
+ <ul class="plain-list">
+ <li><a href="#faq">Frequently Asked Questions</a></li>
+ <li><a href="#practical">Practical Questions</a></li>
+ <li><a href="#organisation">Organisation Questions</a></li>
+ <li><strong>Privacy and cookies</strong></li>
+ </ul>
+ </aside>
+</div>
+
+<h1>Privacy, cookies, and third party services</h1>
+
+<p><strong>Our use of your data, cookies, and external services: what you should know, and how to opt out if you want to.</strong></p>
+
+<p>Summary: We care a lot about our users’ privacy. We provide details below,
+and we try our hardest to look after the private data that we hold. Like many
+other websites, we sometimes use cookies and Google Analytics to help us make
+our websites better. These tools are very common and used by many other sites,
+but they do have privacy implications, and as a charity concerned with socially
+positive uses of the internet, we think it’s important to explain them in full.
+If you don’t want to share your browsing activities on mySociety’s sites with
+other companies, you can adjust your usage or install opt-out browser plugins.
+
+<h2>Privacy</h2>
+
+ <dl>
+ <dt>Who gets to see my email address?</dt>
+ <dd>If you submit a problem, we pass on your details, and details
+of the problem, to the council contact or contacts responsible for the
+area where you located the problem. Other than the council, who obviously get your
+email address, only people we authorise to view the FixMyStreet administration interface
+will be able to see your email address and they will never use it for anything other than
+to help administer FixMyStreet. Similarly with email addresses from updates. We will never give or sell your email address to anyone else,
+unless we are obliged to by law. Your name will not be published anywhere unless you let us.</dd>
+ <dt>Will you send nasty, brutish spam to my email address?</dt>
+ <dd>Never. We will email you if someone leaves an update on a
+problem you&rsquo;ve reported, and send you a questionnaire email four weeks
+after you submit a problem, asking for a status update; we&rsquo;ll only ever
+send you emails in relation to your problem.</dd>
+ </dl>
+
+<h2>Cookies</h2>
+
+<p>To make our service easier or more useful, we sometimes place small data files on your computer or mobile phone, known as cookies; many websites do this. We use this information to, for example, remember you have logged in so you don't need to do that on every page, or to measure how people use the website so we can improve it and make sure it works properly. Below, we list the cookies and services that this site can use.
+
+<table cellpadding=5>
+<tr align="left"><th scope="col">Name</th><th scope="col">Typical Content</th><th scope="col">Expires</th></tr>
+<tr><td>fixmystreet_app_session</td><td nowrap>A random unique identifier</td><td>When browser is closed, or four weeks if &ldquo;Keep me signed in&rdquo; is ticked</td></tr>
+</table>
+
+<h3>Measuring website usage (Google Analytics)</h3>
+
+<p>We use Google Analytics to collect information about how people use this site. We do this to make sure it’s meeting its users’ needs and to understand how we could do it better. Google Analytics stores information such as what pages you visit, how long you are on the site, how you got here, what you click on, and information about your web browser. IP addresses are masked (only a portion is stored) and personal information is only reported in aggregate. We do not allow Google to use or share our analytics data for any purpose besides providing us with analytics information, and we recommend that any user of Google Analytics does the same.
+
+<p>If you’re unhappy with data about your visit to be used in this way, you can install the <a href="http://tools.google.com/dlpage/gaoptout">official browser plugin for blocking Google Analytics</a>.
+
+<p>The cookies set by Google Analytics are as follows:
+
+<table cellpadding=5>
+<tr align="left"><th scope="col">Name</th><th scope="col">Typical Content</th><th scope="col">Expires</th></tr>
+<tr><td>__utma</td><td>Unique anonymous visitor ID</td><td>2&nbsp;years</td></tr>
+<tr><td>__utmb</td><td>Unique anonymous session ID</td><td>30&nbsp;minutes</td></tr>
+<tr><td>__utmz</td><td>Information on how the site was reached (e.g. direct or via a link/search/advertisement)</td><td>6&nbsp;months</td></tr>
+<tr><td>__utmx</td><td>Which variation of a page you are seeing if we are testing different versions to see which is best</td><td>2&nbsp;years</td></tr>
+</table>
+
+<h4>Google’s Official Statement about Analytics Data</h4>
+
+<p>“This website uses Google Analytics, a web analytics service provided by Google, Inc. (“Google”). Google Analytics uses “cookies”, which are text files placed on your computer, to help the website analyze how users use the site. The information generated by the cookie about your use of the website (including your IP address) will be transmitted to and stored by Google on servers in the United States . Google will use this information for the purpose of evaluating your use of the website, compiling reports on website activity for website operators and providing other services relating to website activity and internet usage. Google may also transfer this information to third parties where required to do so by law, or where such third parties process the information on Google’s behalf. Google will not associate your IP address with any other data held by Google. You may refuse the use of cookies by selecting the appropriate settings on your browser, however please note that if you do this you may not be able to use the full functionality of this website. By using this website, you consent to the processing of data about you by Google in the manner and for the purposes set out above.”</p>
+
+<p><a href="http://www.mysociety.org/privacy-online/">More general information on how third party services work</a></p>
+
+<h2>Credits</h2>
+
+<p>Bits of wording taken from the <a href="http://www.gov.uk/help/cookies">gov.uk cookies page</a> (under the Open Government Licence).
+
+[% INCLUDE 'footer.html' pagefooter = 'yes' %]
diff --git a/templates/web/fixmystreet/tracking_code.html b/templates/web/fixmystreet/tracking_code.html
index b506d41c1..52018b312 100644
--- a/templates/web/fixmystreet/tracking_code.html
+++ b/templates/web/fixmystreet/tracking_code.html
@@ -4,6 +4,7 @@
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-660910-4']);
_gaq.push(['_setDomainName', '.fixmystreet.com']);
+ _gaq.push (['_gat._anonymizeIp']);
_gaq.push(['_trackPageview']);
(function() {