[open-ils-commits] r15071 - in trunk/Open-ILS: src/perlmods/OpenILS/Application src/perlmods/OpenILS/Application/Circ src/perlmods/OpenILS/Application/Storage src/perlmods/OpenILS/Application/Storage/CDBI src/perlmods/OpenILS/Application/Storage/Driver/Pg src/perlmods/OpenILS/Application/Storage/Publisher src/perlmods/OpenILS/WWW src/sql/Pg src/sql/Pg/upgrade src/support-scripts/test-scripts web/opac/skin/default/js xul/staff_client/chrome/content/main xul/staff_client/server/patron (miker)

svn at svn.open-ils.org svn at svn.open-ils.org
Thu Dec 3 16:29:10 EST 2009


Author: miker
Date: 2009-12-03 16:29:05 -0500 (Thu, 03 Dec 2009)
New Revision: 15071

Added:
   trunk/Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI/booking.pm
   trunk/Open-ILS/src/sql/Pg/upgrade/0105.schema.booking-integration.sql
Modified:
   trunk/Open-ILS/src/perlmods/OpenILS/Application/Circ.pm
   trunk/Open-ILS/src/perlmods/OpenILS/Application/Circ/Money.pm
   trunk/Open-ILS/src/perlmods/OpenILS/Application/Collections.pm
   trunk/Open-ILS/src/perlmods/OpenILS/Application/CreditCard.pm
   trunk/Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI.pm
   trunk/Open-ILS/src/perlmods/OpenILS/Application/Storage/Driver/Pg/dbi.pm
   trunk/Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/action.pm
   trunk/Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/money.pm
   trunk/Open-ILS/src/perlmods/OpenILS/WWW/BadDebt.pm
   trunk/Open-ILS/src/sql/Pg/002.schema.config.sql
   trunk/Open-ILS/src/sql/Pg/095.schema.booking.sql
   trunk/Open-ILS/src/sql/Pg/100.circ_matrix.sql
   trunk/Open-ILS/src/sql/Pg/500.view.cross-schema.sql
   trunk/Open-ILS/src/support-scripts/test-scripts/collections.pl
   trunk/Open-ILS/web/opac/skin/default/js/myopac.js
   trunk/Open-ILS/xul/staff_client/chrome/content/main/constants.js
   trunk/Open-ILS/xul/staff_client/server/patron/bill_details.js
Log:
integrate the new booking.reservation billable transaction table with all the parts that use grocery transactions, including in the materialized summary view

Modified: trunk/Open-ILS/src/perlmods/OpenILS/Application/Circ/Money.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Application/Circ/Money.pm	2009-12-03 16:23:34 UTC (rev 15070)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Application/Circ/Money.pm	2009-12-03 21:29:05 UTC (rev 15071)
@@ -433,6 +433,20 @@
 
 
 __PACKAGE__->register_method(
+    method => 'fetch_reservation',
+    api_name => 'open-ils.circ.booking.reservation.retrieve'
+);
+sub fetch_grocery {
+    my( $self, $conn, $auth, $id ) = @_;
+    my $e = new_editor(authtoken=>$auth);
+    return $e->event unless $e->checkauth;
+    return $e->event unless $e->allowed('VIEW_TRANSACTION'); # eh.. basically the same permission
+    my $g = $e->retrieve_booking_reservation($id)
+        or return $e->event;
+    return $g;
+}
+
+__PACKAGE__->register_method(
     method => 'fetch_grocery',
     api_name => 'open-ils.circ.money.grocery.retrieve'
 );

Modified: trunk/Open-ILS/src/perlmods/OpenILS/Application/Circ.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Application/Circ.pm	2009-12-03 16:23:34 UTC (rev 15070)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Application/Circ.pm	2009-12-03 21:29:05 UTC (rev 15071)
@@ -1379,7 +1379,8 @@
                     ],
                     mbt => [
                         'circulation', 
-                        'grocery'
+                        'grocery',
+                        'reservation'
                     ]
                 }
             }

Modified: trunk/Open-ILS/src/perlmods/OpenILS/Application/Collections.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Application/Collections.pm	2009-12-03 16:23:34 UTC (rev 15070)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Application/Collections.pm	2009-12-03 21:29:05 UTC (rev 15071)
@@ -621,7 +621,9 @@
 			circulations	=> 
 				fetch_circ_xacts($e, $uid, $org, $start_date, $end_date),
 			grocery			=> 
-				fetch_grocery_xacts($e, $uid, $org, $start_date, $end_date)
+				fetch_grocery_xacts($e, $uid, $org, $start_date, $end_date),
+			reservations	=> 
+				fetch_reservation_xacts($e, $uid, $org, $start_date, $end_date)
 		};
 
 		# for each transaction, flesh the workstatoin on any attached payment
@@ -629,6 +631,7 @@
 		# not just a generic payment object
 		for my $xact ( 
 			@{$blob->{transactions}->{circulations}}, 
+			@{$blob->{transactions}->{reservations}}, 
 			@{$blob->{transactions}->{grocery}} ) {
 
 			my $ps;
@@ -778,8 +781,55 @@
 	return \@data;
 }
 
+sub fetch_reservation_xacts {
+	my $e				= shift;
+	my $uid			= shift;
+	my $org			= shift;
+	my $start_date = shift;
+	my $end_date	= shift;
 
+	my @xacts;
+	$U->walk_org_tree( $org, 
+		sub {
+			my $n = shift;
+			$logger->debug("collect: searching for open grocery xacts at " . $n->shortname);
+			push( @xacts, 
+				@{
+					$e->search_booking_reservation(
+						{
+							usr					=> $uid, 
+							pickup_lib      	=> $n->id,
+						}, 
+						{idlist => 1}
+					)
+				}
+			);
+		}
+	);
 
+	my @data;
+	my $active_ids = fetch_active($e, \@xacts, $start_date, $end_date);
+
+	for my $id (@$active_ids) {
+		push( @data, 
+			$e->retrieve_booking_reservation(
+				[
+					$id,
+					{
+						flesh => 1,
+						flesh_fields => { 
+							bresv => [ "billings", "payments", "pickup_lib" ] }
+					}
+				]
+			)
+		);
+	}
+
+	return \@data;
+}
+
+
+
 # --------------------------------------------------------------
 # Given a list of xact id's, this returns a list of id's that
 # had any activity within the given time span

Modified: trunk/Open-ILS/src/perlmods/OpenILS/Application/CreditCard.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Application/CreditCard.pm	2009-12-03 16:23:34 UTC (rev 15070)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Application/CreditCard.pm	2009-12-03 21:29:05 UTC (rev 15071)
@@ -359,9 +359,12 @@
             my $circ = $e->retrieve_action_circulation($xact->id) or return $e->event;
             next unless grep { $_ == $circ->circ_lib } @credit_orgs;
 
-        } else {
+        } elsif ($xact->xact_type eq 'grocery') {
             my $bill = $e->retrieve_money_grocery($xact->id) or return $e->event;
             next unless grep { $_ == $bill->billing_location } @credit_orgs;
+        } elsif ($xact->xact_type eq 'reservation') {
+            my $bill = $e->retrieve_booking_reservation($xact->id) or return $e->event;
+            next unless grep { $_ == $bill->pickup_lib } @credit_orgs;
         }
         $sum += $xact->balance_owed();
     }

Added: trunk/Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI/booking.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI/booking.pm	                        (rev 0)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI/booking.pm	2009-12-03 21:29:05 UTC (rev 15071)
@@ -0,0 +1,23 @@
+package OpenILS::Application::Storage::CDBI::booking;
+our $VERSION = 1;
+
+#-------------------------------------------------------------------------------
+package booking;
+use base qw/OpenILS::Application::Storage::CDBI/;
+#-------------------------------------------------------------------------------
+
+package booking::reservation;
+use base qw/booking/;
+__PACKAGE__->table('booking_reservation');
+__PACKAGE__->columns(Primary => 'id');
+__PACKAGE__->columns(Essential => qw/xact_start usr current_copy circ_lib
+				     fine_amount max_fine fine_interval xact_finish 
+				     capture_staff pickup_lib request_time start_time end_time
+                     capture_time cancel_time pickup_time return_time
+                     booking_interval target_resource_type target_resource
+                     current_resource request_lib/);
+
+#-------------------------------------------------------------------------------
+
+1;
+

Modified: trunk/Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI.pm	2009-12-03 16:23:34 UTC (rev 15070)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI.pm	2009-12-03 21:29:05 UTC (rev 15071)
@@ -5,6 +5,7 @@
 
 use OpenILS::Application::Storage::CDBI::actor;
 use OpenILS::Application::Storage::CDBI::action;
+use OpenILS::Application::Storage::CDBI::booking;
 use OpenILS::Application::Storage::CDBI::asset;
 use OpenILS::Application::Storage::CDBI::authority;
 use OpenILS::Application::Storage::CDBI::biblio;
@@ -555,6 +556,9 @@
 
 	action::circulation->has_a( usr => 'actor::user' );
 	actor::user->has_many( circulations => 'action::circulation' => 'usr' );
+
+	booking::reservation->has_a( usr => 'actor::user' );
+	actor::user->has_many( reservations => 'booking::reservation' => 'usr' );
 	
 	action::circulation->has_a( circ_staff => 'actor::user' );
 	actor::user->has_many( performed_circulations => 'action::circulation' => 'circ_staff' );
@@ -565,6 +569,8 @@
 	action::circulation->has_a( target_copy => 'asset::copy' );
 	asset::copy->has_many( circulations => 'action::circulation' => 'target_copy' );
 
+	booking::reservation->has_a( pickup_lib => 'actor::org_unit' );
+
 	action::circulation->has_a( circ_lib => 'actor::org_unit' );
 	actor::org_unit->has_many( circulations => 'action::circulation' => 'circ_lib' );
 	
@@ -621,9 +627,11 @@
 	action::circulation->has_many( billings => 'money::billing' => 'xact' );
 	action::circulation->has_many( payments => 'money::payment' => 'xact' );
 	#action::circulation->might_have( billable_transaction => 'money::billable_transaction' );
-
 	#action::open_circulation->might_have( circulation => 'action::circulation' );
 
+	booking::reservation->has_many( billings => 'money::billing' => 'xact' );
+	booking::reservation->has_many( payments => 'money::payment' => 'xact' );
+
 	action::in_house_use->has_a( org_unit => 'actor::org_unit' );
 	action::in_house_use->has_a( staff => 'actor::user' );
 	action::in_house_use->has_a( item => 'asset::copy' );

Modified: trunk/Open-ILS/src/perlmods/OpenILS/Application/Storage/Driver/Pg/dbi.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Application/Storage/Driver/Pg/dbi.pm	2009-12-03 16:23:34 UTC (rev 15070)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Application/Storage/Driver/Pg/dbi.pm	2009-12-03 21:29:05 UTC (rev 15071)
@@ -161,6 +161,12 @@
 	action::circulation->sequence( 'money.billable_xact_id_seq' );
 
 	#---------------------------------------------------------------------
+	package booking::reservation;
+	
+	booking::reservation->table( 'booking.reservation' );
+	booking::reservation->sequence( 'money.billable_xact_id_seq' );
+
+	#---------------------------------------------------------------------
 	package action::non_cat_in_house_use;
 	
 	action::non_cat_in_house_use->table( 'action.non_cat_in_house_use' );

Modified: trunk/Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/action.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/action.pm	2009-12-03 16:23:34 UTC (rev 15070)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/action.pm	2009-12-03 21:29:05 UTC (rev 15071)
@@ -114,8 +114,23 @@
 	my $sth = action::circulation->db_Main->prepare_cached($sql);
 	$sth->execute($upper_interval);
 
-	return ( map { action::circulation->construct($_) } $sth->fetchall_hash );
+	my @circs = map { action::circulation->construct($_) } $sth->fetchall_hash;
 
+	$c_t = booking::reservation->table;
+	$sql = <<"	SQL";
+		SELECT	*
+		  FROM	$c_t
+		  WHERE	return_time IS NULL
+		  	AND end_time < ( CURRENT_TIMESTAMP $grace)
+            AND fine_interval IS NOT NULL
+            AND cancel_time IS NULL
+	SQL
+
+	my $sth = action::circulation->db_Main->prepare_cached($sql);
+	$sth->execute($upper_interval);
+
+	my @circs = map { booking::reservation->construct($_) } $sth->fetchall_hash;
+
 }
 
 sub complete_reshelving {
@@ -638,7 +653,9 @@
 
 	my @circs;
 	if ($circ) {
-		push @circs, action::circulation->search_where( { id => $circ, stop_fines => undef } );
+		push @circs,
+            action::circulation->search_where( { id => $circ, stop_fines => undef } ),
+            booking::reservation->search_where( { id => $circ, return_time => undef, cancel_time => undef } );
 	} else {
 		push @circs, overdue_circs($grace);
 	}
@@ -647,7 +664,22 @@
 
 	my $penalty = OpenSRF::AppSession->create('open-ils.penalty');
 	for my $c (@circs) {
+
+        my $ctype = ref($c);
+        $ctype =~ s/^.*([^:]+)$/$1/o;
 	
+        my $due_date_method = 'due_date';
+        my $target_copy_method = 'target_copy';
+        my $circ_lib_method = 'circ_lib';
+        my $recurring_fine_method = 'recurring_fine';
+        if ($ctype eq 'reservation') {
+            $due_date_method = 'end_time';
+            $target_copy_method = 'current_resource';
+            $circ_lib_method = 'pickup_lib';
+            $recurring_fine_method = 'fine_amount';
+            next unless ($c->fine_interval);
+        }
+
 		try {
 			if ($self->method_lookup('open-ils.storage.transaction.current')->run) {
 				$log->debug("Cleaning up after previous transaction\n");
@@ -657,7 +689,7 @@
 			$log->info("Processing circ ".$c->id."...\n");
 
 
-			my $due_dt = $parser->parse_datetime( clense_ISO8601( $c->due_date ) );
+			my $due_dt = $parser->parse_datetime( clense_ISO8601( $c->$due_date_method ) );
 	
 			my $due = $due_dt->epoch;
 			my $now = time;
@@ -677,15 +709,15 @@
 			}
 	
 			$client->respond(
-				"ARG! Overdue circulation ".$c->id.
-				" for item ".$c->target_copy.
+				"ARG! Overdue $ctype ".$c->id.
+				" for item ".$c->$target_copy_method.
 				" (user ".$c->usr.").\n".
 				"\tItem was due on or before: ".localtime($due)."\n");
 	
 			my @fines = money::billing->search_where(
 				{ xact => $c->id,
 				  btype => 1,
-				  billing_ts => { '>' => $c->due_date } },
+				  billing_ts => { '>' => $c->$due_date_method } },
 				{ order_by => 'billing_ts DESC'}
 			);
 
@@ -707,7 +739,7 @@
 				$last_fine = $due;
 
 				if (0) {
-					if (my $h = $hoo{$c->circ_lib}) { 
+					if (my $h = $hoo{$c->$circ_lib_method}) { 
 
 						$log->info( "Circ lib has an hours-of-operation entry" );
 						# find the day after the due date...
@@ -755,17 +787,17 @@
 	
 			$client->respond( "\t$pending_fine_count pending fine(s)\n" );
 
-			my $recurring_fine = int($c->recurring_fine * 100);
+			my $recurring_fine = int($c->$recurring_fine_method * 100);
 			my $max_fine = int($c->max_fine * 100);
 
 			my ($latest_billing_ts, $latest_amount) = ('',0);
 			for (my $bill = 1; $bill <= $pending_fine_count; $bill++) {
 	
 				if ($current_fine_total >= $max_fine) {
-					$c->update({stop_fines => 'MAXFINES', stop_fines_time => 'now'});
+					$c->update({stop_fines => 'MAXFINES', stop_fines_time => 'now'}) if ($ctype eq 'circulation');
 					$client->respond(
 						"\tMaximum fine level of ".$c->max_fine.
-						" reached for this circulation.\n".
+						" reached for this $ctype.\n".
 						"\tNo more fines will be generated.\n" );
 					last;
 				}
@@ -776,7 +808,7 @@
 				my $dow_open = "dow_${dow}_open";
 				my $dow_close = "dow_${dow}_close";
 
-				if (my $h = $hoo{$c->circ_lib}) {
+				if (my $h = $hoo{$c->$circ_lib_method}) {
 					next if ( $h->$dow_open eq '00:00:00' and $h->$dow_close eq '00:00:00');
 				}
 
@@ -784,7 +816,7 @@
 				my @cl = actor::org_unit::closed_date->search_where(
 						{ close_start	=> { '<=' => $timestamptz },
 						  close_end	=> { '>=' => $timestamptz },
-						  org_unit	=> $c->circ_lib }
+						  org_unit	=> $c->$circ_lib_method }
 				);
 				next if (@cl);
 	
@@ -813,7 +845,7 @@
 
                 # Caluclate penalties inline
 				OpenILS::Utils::Penalty->calculate_penalties(
-					undef, $c->usr->to_fieldmapper->id.'', $c->circ_lib->to_fieldmapper->id.'');
+					undef, $c->usr->to_fieldmapper->id.'', $c->$circ_lib_method->to_fieldmapper->id.'');
 
 			} else {
 
@@ -824,7 +856,7 @@
 				$penalty->request(
 				    'open-ils.penalty.patron_penalty.calculate',
 				    { patronid	=> ''.$c->usr,
-				    context_org	=> ''.$c->circ_lib,
+				    context_org	=> ''.$c->$circ_lib_method,
 				    update	=> 1,
 				    background	=> 1,
 				    }
@@ -833,8 +865,8 @@
 
 		} catch Error with {
 			my $e = shift;
-			$client->respond( "Error processing overdue circulation [".$c->id."]:\n\n$e\n" );
-			$log->error("Error processing overdue circulation [".$c->id."]:\n$e\n");
+			$client->respond( "Error processing overdue $ctype [".$c->id."]:\n\n$e\n" );
+			$log->error("Error processing overdue $ctype [".$c->id."]:\n$e\n");
 			$self->method_lookup('open-ils.storage.transaction.rollback')->run;
 			throw $e if ($e =~ /IS NOT CONNECTED TO THE NETWORK/o);
 		};

Modified: trunk/Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/money.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/money.pm	2009-12-03 16:23:34 UTC (rev 15070)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Application/Storage/Publisher/money.pm	2009-12-03 21:29:05 UTC (rev 15071)
@@ -51,8 +51,13 @@
                 $s->balance_owed( sprintf('%0.2f', (($to) - ($tp)) / 100) );
 		#$log->debug( "balance of ".$x->id." == ".$s->balance_owed, DEBUG );
 
-                $s->xact_type( 'grocery' ) if (money::grocery->retrieve($x->id));
-                $s->xact_type( 'circulation' ) if (action::circulation->retrieve($x->id));
+                if (action::circulation->retrieve($x->id)) {
+                    $s->xact_type( 'circulation' );
+                } elsif (money::grocery->retrieve($x->id)) {
+                    $s->xact_type( 'grocery' );
+                } elsif (booking::reservation->retrieve($x->id)) {
+                    $s->xact_type( 'reservation' );
+                }
 
                 push @mbts, $s;
         }
@@ -117,6 +122,7 @@
 	my $mb = money::billing->table;
 	my $circ = action::circulation->table;
 	my $mg = money::grocery->table;
+	my $res = booking::reservation->table;
 	my $descendants = "actor.org_unit_descendants((select id from actor.org_unit where shortname = ?))";
 
 	my $SQL = <<"	SQL";
@@ -156,6 +162,23 @@
                 and b.billing_ts < current_timestamp - ? * '1 day'::interval
                 and not b.voided
           group by 1,2
+
+                  union all
+
+         select
+                x.id,
+                x.usr,
+                MAX(b.billing_ts) as last_billing,
+                SUM(b.amount) AS total_billing
+          from  booking.reservation x
+                left join money.collections_tracker c ON (c.usr = x.usr AND c.location = ?)
+                join money.billing b on (b.xact = x.id)
+          where x.xact_finish is null
+                and c.id is null
+                and x.pickup_lib in (XX)
+                and b.billing_ts < current_timestamp - ? * '1 day'::interval
+                and not b.voided
+          group by 1,2
         ) full_list
         left join money.payment p on (full_list.id = p.xact)
   group by 1
@@ -236,6 +259,20 @@
                 and b.billing_ts between ? and ?
                 and not b.voided
           group by 1,2
+
+                  union all
+
+         select
+                x.id,
+                x.usr,
+                SUM(b.amount) AS total_billing
+          from  booking.reservation x
+                join money.billing b on (b.xact = x.id)
+          where x.xact_finish is null
+                and x.pickup_lib in (XX)
+                and b.billing_ts between ? and ?
+                and not b.voided
+          group by 1,2
         ) full_list
         left join money.payment p on (full_list.id = p.xact)
   group by 1
@@ -292,6 +329,42 @@
                 SELECT  lt.usr,
                         NULL::TIMESTAMPTZ AS last_pertinent_billing,
                         NULL::TIMESTAMPTZ AS last_pertinent_payment
+                  FROM  booking.reservation lt
+                        JOIN money.collections_tracker cl ON (lt.usr = cl.usr)
+                        JOIN money.billing bl ON (lt.id = bl.xact)
+                  WHERE cl.location = ?
+                        AND lt.pickup_lib IN (XX)
+                        AND bl.void_time BETWEEN ? AND ?
+                  GROUP BY 1
+
+                                UNION ALL
+                SELECT  lt.usr,
+                        MAX(bl.billing_ts) AS last_pertinent_billing,
+                        NULL::TIMESTAMPTZ AS last_pertinent_payment
+                  FROM  booking.reservation lt
+                        JOIN money.collections_tracker cl ON (lt.usr = cl.usr)
+                        JOIN money.billing bl ON (lt.id = bl.xact)
+                  WHERE cl.location = ?
+                        AND lt.pickup_lib IN (XX)
+                        AND bl.billing_ts BETWEEN ? AND ?
+                  GROUP BY 1
+
+                                UNION ALL
+                SELECT  lt.usr,
+                        NULL::TIMESTAMPTZ AS last_pertinent_billing,
+                        MAX(pm.payment_ts) AS last_pertinent_payment
+                  FROM  booking.reservation lt
+                        JOIN money.collections_tracker cl ON (lt.usr = cl.usr)
+                        JOIN money.payment pm ON (lt.id = pm.xact)
+                  WHERE cl.location = ?
+                        AND lt.pickup_lib IN (XX)
+                        AND pm.payment_ts BETWEEN ? AND ?
+                  GROUP BY 1
+
+                                UNION ALL
+                 SELECT  lt.usr,
+                        NULL::TIMESTAMPTZ AS last_pertinent_billing,
+                        NULL::TIMESTAMPTZ AS last_pertinent_payment
                   FROM  money.grocery lt
                         JOIN money.collections_tracker cl ON (lt.usr = cl.usr)
                         JOIN money.billing bl ON (lt.id = bl.xact)
@@ -389,12 +462,20 @@
 
 		my $sth = money::collections_tracker->db_Main->prepare($real_sql);
 		$sth->execute(
+            # reservation queries
 			$org->id, $startdate, $enddate,
 			$org->id, $startdate, $enddate,
 			$org->id, $startdate, $enddate,
+
+            # grocery queries
 			$org->id, $startdate, $enddate,
 			$org->id, $startdate, $enddate,
 			$org->id, $startdate, $enddate,
+
+            # circ queries
+			$org->id, $startdate, $enddate,
+			$org->id, $startdate, $enddate,
+			$org->id, $startdate, $enddate,
 			$org->id, $startdate, $enddate
 		);
 

Modified: trunk/Open-ILS/src/perlmods/OpenILS/WWW/BadDebt.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/WWW/BadDebt.pm	2009-12-03 16:23:34 UTC (rev 15070)
+++ trunk/Open-ILS/src/perlmods/OpenILS/WWW/BadDebt.pm	2009-12-03 21:29:05 UTC (rev 15071)
@@ -97,9 +97,17 @@
             my $s = $cstore->request('open-ils.cstore.direct.money.billable_xact_summary.retrieve' => $xact)->gather(1);
             my $u = $cstore->request('open-ils.cstore.direct.actor.usr.retrieve' => $s->usr)->gather(1);
             my $c = $cstore->request('open-ils.cstore.direct.actor.card.retrieve' => $u->card)->gather(1);
-            my $w = $s->xact_type eq 'circulation' ? 
-                $cstore->request('open-ils.cstore.direct.action.circulation.retrieve' => $xact)->gather(1)->circ_lib :
-                $cstore->request('open-ils.cstore.direct.money.grocery.retrieve' => $xact)->gather(1)->billing_location;
+            my $w;
+
+            if ($s->xact_type eq 'circulation') {
+                $w = $cstore->request('open-ils.cstore.direct.action.circulation.retrieve' => $xact)->gather(1)->circ_lib :
+            } elsif ($s->xact_type eq 'grocery') {
+                $w = $cstore->request('open-ils.cstore.direct.money.grocery.retrieve' => $xact)->gather(1)->billing_location;
+            } elsif ($s->xact_type eq 'reservation') {
+                $w = $cstore->request('open-ils.cstore.direct.booking.reservation.retrieve' => $xact)->gather(1)->pickup_lib;
+            } else {
+                die;
+            }
     
             my $failures = $actor->request('open-ils.actor.user.perm.check', $auth_ses, $user->id, $w, ['MARK_BAD_DEBT'])->gather(1);
     

Modified: trunk/Open-ILS/src/sql/Pg/002.schema.config.sql
===================================================================
--- trunk/Open-ILS/src/sql/Pg/002.schema.config.sql	2009-12-03 16:23:34 UTC (rev 15070)
+++ trunk/Open-ILS/src/sql/Pg/002.schema.config.sql	2009-12-03 21:29:05 UTC (rev 15071)
@@ -51,7 +51,7 @@
     install_date    TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
 );
 
-INSERT INTO config.upgrade_log (version) VALUES ('0104'); -- Scott McKellar
+INSERT INTO config.upgrade_log (version) VALUES ('0105'); -- miker
 
 CREATE TABLE config.bib_source (
 	id		SERIAL	PRIMARY KEY,

Modified: trunk/Open-ILS/src/sql/Pg/095.schema.booking.sql
===================================================================
--- trunk/Open-ILS/src/sql/Pg/095.schema.booking.sql	2009-12-03 16:23:34 UTC (rev 15070)
+++ trunk/Open-ILS/src/sql/Pg/095.schema.booking.sql	2009-12-03 21:29:05 UTC (rev 15071)
@@ -137,6 +137,11 @@
 	FOREIGN KEY (usr) REFERENCES actor.usr (id)
 	DEFERRABLE INITIALLY DEFERRED;
 
+CREATE TRIGGER mat_summary_create_tgr AFTER INSERT ON booking.reservation FOR EACH ROW EXECUTE PROCEDURE booking.mat_summary_create ('reservation');
+CREATE TRIGGER mat_summary_change_tgr AFTER UPDATE ON booking.reservation FOR EACH ROW EXECUTE PROCEDURE booking.mat_summary_update ();
+CREATE TRIGGER mat_summary_remove_tgr AFTER DELETE ON booking.reservation FOR EACH ROW EXECUTE PROCEDURE booking.mat_summary_delete ();
+
+
 CREATE TABLE booking.reservation_attr_value_map (
 	id               SERIAL         PRIMARY KEY,
 	reservation      INT            NOT NULL

Modified: trunk/Open-ILS/src/sql/Pg/100.circ_matrix.sql
===================================================================
--- trunk/Open-ILS/src/sql/Pg/100.circ_matrix.sql	2009-12-03 16:23:34 UTC (rev 15070)
+++ trunk/Open-ILS/src/sql/Pg/100.circ_matrix.sql	2009-12-03 21:29:05 UTC (rev 15071)
@@ -508,6 +508,12 @@
         SELECT  SUM(f.balance_owed) INTO current_fines
           FROM  money.materialized_billable_xact_summary f
                 JOIN (
+                    SELECT  r.id
+                      FROM  booking.reservation r
+                            JOIN  actor.org_unit_full_path( max_fines.org_unit ) fp ON (r.pickup_lib = fp.id)
+                      WHERE usr = match_user
+                            AND xact_finish IS NULL
+                                UNION ALL
                     SELECT  g.id
                       FROM  money.grocery g
                             JOIN  actor.org_unit_full_path( max_fines.org_unit ) fp ON (g.billing_location = fp.id)
@@ -688,6 +694,12 @@
         SELECT  SUM(f.balance_owed) INTO current_fines
           FROM  money.materialized_billable_xact_summary f
                 JOIN (
+                    SELECT  r.id
+                      FROM  booking.reservation r
+                            JOIN  actor.org_unit_full_path( max_fines.org_unit ) fp ON (r.pickup_lib = fp.id)
+                      WHERE usr = match_user
+                            AND xact_finish IS NULL
+                                UNION ALL
                     SELECT  g.id
                       FROM  money.grocery g
                             JOIN  actor.org_unit_full_path( max_fines.org_unit ) fp ON (g.billing_location = fp.id)

Modified: trunk/Open-ILS/src/sql/Pg/500.view.cross-schema.sql
===================================================================
--- trunk/Open-ILS/src/sql/Pg/500.view.cross-schema.sql	2009-12-03 16:23:34 UTC (rev 15070)
+++ trunk/Open-ILS/src/sql/Pg/500.view.cross-schema.sql	2009-12-03 21:29:05 UTC (rev 15071)
@@ -20,7 +20,7 @@
 CREATE OR REPLACE VIEW money.open_billable_xact_summary AS
 	SELECT	xact.id AS id,
 		xact.usr AS usr,
-		COALESCE(circ.circ_lib,groc.billing_location) AS billing_location,
+		COALESCE(circ.circ_lib,groc.billing_location,res.pickup_lib) AS billing_location,
 		xact.xact_start AS xact_start,
 		xact.xact_finish AS xact_finish,
 		SUM(credit.amount) AS total_paid,
@@ -37,6 +37,7 @@
 	  	JOIN pg_class p ON (xact.tableoid = p.oid)
 		LEFT JOIN "action".circulation circ ON (circ.id = xact.id)
 		LEFT JOIN money.grocery groc ON (groc.id = xact.id)
+		LEFT JOIN booking.reservation res ON (groc.id = xact.id)
 	  	LEFT JOIN (
 			SELECT	billing.xact,
 				billing.voided,

Added: trunk/Open-ILS/src/sql/Pg/upgrade/0105.schema.booking-integration.sql
===================================================================
--- trunk/Open-ILS/src/sql/Pg/upgrade/0105.schema.booking-integration.sql	                        (rev 0)
+++ trunk/Open-ILS/src/sql/Pg/upgrade/0105.schema.booking-integration.sql	2009-12-03 21:29:05 UTC (rev 15071)
@@ -0,0 +1,339 @@
+BEGIN;
+
+INSERT INTO config.upgrade_log (version) VALUES ('0105'); -- miker
+
+CREATE TRIGGER mat_summary_create_tgr AFTER INSERT ON booking.reservation FOR EACH ROW EXECUTE PROCEDURE booking.mat_summary_create ('reservation');
+CREATE TRIGGER mat_summary_change_tgr AFTER UPDATE ON booking.reservation FOR EACH ROW EXECUTE PROCEDURE booking.mat_summary_update ();
+CREATE TRIGGER mat_summary_remove_tgr AFTER DELETE ON booking.reservation FOR EACH ROW EXECUTE PROCEDURE booking.mat_summary_delete ();
+
+CREATE OR REPLACE VIEW money.open_billable_xact_summary AS
+    SELECT  xact.id AS id,
+        xact.usr AS usr,
+        COALESCE(circ.circ_lib,groc.billing_location,res.pickup_lib) AS billing_location,
+        xact.xact_start AS xact_start,
+        xact.xact_finish AS xact_finish,
+        SUM(credit.amount) AS total_paid,
+        MAX(credit.payment_ts) AS last_payment_ts,
+        LAST(credit.note) AS last_payment_note,
+        LAST(credit.payment_type) AS last_payment_type,
+        SUM(debit.amount) AS total_owed,
+        MAX(debit.billing_ts) AS last_billing_ts,
+        LAST(debit.note) AS last_billing_note,
+        LAST(debit.billing_type) AS last_billing_type,
+        COALESCE(SUM(debit.amount),0) - COALESCE(SUM(credit.amount),0) AS balance_owed,
+        p.relname AS xact_type
+      FROM  money.billable_xact xact
+        JOIN pg_class p ON (xact.tableoid = p.oid)
+        LEFT JOIN "action".circulation circ ON (circ.id = xact.id)
+        LEFT JOIN money.grocery groc ON (groc.id = xact.id)
+        LEFT JOIN booking.reservation res ON (groc.id = xact.id)
+        LEFT JOIN (
+            SELECT  billing.xact,
+                billing.voided,
+                sum(billing.amount) AS amount,
+                max(billing.billing_ts) AS billing_ts,
+                last(billing.note) AS note,
+                last(billing.billing_type) AS billing_type
+              FROM  money.billing
+              WHERE billing.voided IS FALSE
+              GROUP BY billing.xact, billing.voided
+        ) debit ON (xact.id = debit.xact AND debit.voided IS FALSE)
+        LEFT JOIN (
+            SELECT  payment_view.xact,
+                payment_view.voided,
+                sum(payment_view.amount) AS amount,
+                max(payment_view.payment_ts) AS payment_ts,
+                last(payment_view.note) AS note,
+                last(payment_view.payment_type) AS payment_type
+              FROM  money.payment_view
+              WHERE payment_view.voided IS FALSE
+              GROUP BY payment_view.xact, payment_view.voided
+        ) credit ON (xact.id = credit.xact AND credit.voided IS FALSE)
+      WHERE xact.xact_finish IS NULL
+      GROUP BY 1,2,3,4,5,15
+      ORDER BY MAX(debit.billing_ts), MAX(credit.payment_ts);
+
+CREATE OR REPLACE FUNCTION actor.calculate_system_penalties( match_user INT, context_org INT ) RETURNS SETOF actor.usr_standing_penalty AS $func$
+DECLARE
+    user_object         actor.usr%ROWTYPE;
+    new_sp_row          actor.usr_standing_penalty%ROWTYPE;
+    existing_sp_row     actor.usr_standing_penalty%ROWTYPE;
+    collections_fines   permission.grp_penalty_threshold%ROWTYPE;
+    max_fines           permission.grp_penalty_threshold%ROWTYPE;
+    max_overdue         permission.grp_penalty_threshold%ROWTYPE;
+    max_items_out       permission.grp_penalty_threshold%ROWTYPE;
+    tmp_grp             INT;
+    items_overdue       INT;
+    items_out           INT;
+    context_org_list    INT[];
+    current_fines        NUMERIC(8,2) := 0.0;
+    tmp_fines            NUMERIC(8,2);
+    tmp_groc            RECORD;
+    tmp_circ            RECORD;
+    tmp_org             actor.org_unit%ROWTYPE;
+BEGIN
+    SELECT INTO user_object * FROM actor.usr WHERE id = match_user;
+
+    -- Max fines
+    SELECT INTO tmp_org * FROM actor.org_unit WHERE id = context_org;
+
+    -- Fail if the user has a high fine balance
+    LOOP
+        tmp_grp := user_object.profile;
+        LOOP
+            SELECT * INTO max_fines FROM permission.grp_penalty_threshold WHERE grp = tmp_grp AND penalty = 1 AND org_unit = tmp_org.id;
+
+            IF max_fines.threshold IS NULL THEN
+                SELECT parent INTO tmp_grp FROM permission.grp_tree WHERE id = tmp_grp;
+            ELSE
+                EXIT;
+            END IF;
+
+            IF tmp_grp IS NULL THEN
+                EXIT;
+            END IF;
+        END LOOP;
+
+        IF max_fines.threshold IS NOT NULL OR tmp_org.parent_ou IS NULL THEN
+            EXIT;
+        END IF;
+
+        SELECT * INTO tmp_org FROM actor.org_unit WHERE id = tmp_org.parent_ou;
+
+    END LOOP;
+
+    IF max_fines.threshold IS NOT NULL THEN
+
+        FOR existing_sp_row IN
+                SELECT  *
+                  FROM  actor.usr_standing_penalty
+                  WHERE usr = match_user
+                        AND org_unit = max_fines.org_unit
+                        AND (stop_date IS NULL or stop_date > NOW())
+                        AND standing_penalty = 1
+                LOOP
+            RETURN NEXT existing_sp_row;
+        END LOOP;
+
+        SELECT  SUM(f.balance_owed) INTO current_fines
+          FROM  money.materialized_billable_xact_summary f
+                JOIN (
+                    SELECT  r.id
+                      FROM  booking.reservation r
+                            JOIN  actor.org_unit_full_path( max_fines.org_unit ) fp ON (r.pickup_lib = fp.id)
+                      WHERE usr = match_user
+                            AND xact_finish IS NULL
+                                UNION ALL
+                    SELECT  g.id
+                      FROM  money.grocery g
+                            JOIN  actor.org_unit_full_path( max_fines.org_unit ) fp ON (g.billing_location = fp.id)
+                      WHERE usr = match_user
+                            AND xact_finish IS NULL
+                                UNION ALL
+                    SELECT  circ.id
+                      FROM  action.circulation circ
+                            JOIN  actor.org_unit_full_path( max_fines.org_unit ) fp ON (circ.circ_lib = fp.id)
+                      WHERE usr = match_user
+                            AND xact_finish IS NULL ) l USING (id);
+
+        IF current_fines >= max_fines.threshold THEN
+            new_sp_row.usr := match_user;
+            new_sp_row.org_unit := max_fines.org_unit;
+            new_sp_row.standing_penalty := 1;
+            RETURN NEXT new_sp_row;
+        END IF;
+    END IF;
+
+    -- Start over for max overdue
+    SELECT INTO tmp_org * FROM actor.org_unit WHERE id = context_org;
+
+    -- Fail if the user has too many overdue items
+    LOOP
+        tmp_grp := user_object.profile;
+        LOOP
+
+            SELECT * INTO max_overdue FROM permission.grp_penalty_threshold WHERE grp = tmp_grp AND penalty = 2 AND org_unit = tmp_org.id;
+
+            IF max_overdue.threshold IS NULL THEN
+                SELECT parent INTO tmp_grp FROM permission.grp_tree WHERE id = tmp_grp;
+            ELSE
+                EXIT;
+            END IF;
+
+            IF tmp_grp IS NULL THEN
+                EXIT;
+            END IF;
+        END LOOP;
+
+        IF max_overdue.threshold IS NOT NULL OR tmp_org.parent_ou IS NULL THEN
+            EXIT;
+        END IF;
+
+        SELECT INTO tmp_org * FROM actor.org_unit WHERE id = tmp_org.parent_ou;
+
+    END LOOP;
+
+    IF max_overdue.threshold IS NOT NULL THEN
+
+        FOR existing_sp_row IN
+                SELECT  *
+                  FROM  actor.usr_standing_penalty
+                  WHERE usr = match_user
+                        AND org_unit = max_overdue.org_unit
+                        AND (stop_date IS NULL or stop_date > NOW())
+                        AND standing_penalty = 2
+                LOOP
+            RETURN NEXT existing_sp_row;
+        END LOOP;
+
+        SELECT  INTO items_overdue COUNT(*)
+          FROM  action.circulation circ
+                JOIN  actor.org_unit_full_path( max_overdue.org_unit ) fp ON (circ.circ_lib = fp.id)
+          WHERE circ.usr = match_user
+            AND circ.checkin_time IS NULL
+            AND circ.due_date < NOW()
+            AND (circ.stop_fines = 'MAXFINES' OR circ.stop_fines IS NULL);
+
+        IF items_overdue >= max_overdue.threshold::INT THEN
+            new_sp_row.usr := match_user;
+            new_sp_row.org_unit := max_overdue.org_unit;
+            new_sp_row.standing_penalty := 2;
+            RETURN NEXT new_sp_row;
+        END IF;
+    END IF;
+
+    -- Start over for max out
+    SELECT INTO tmp_org * FROM actor.org_unit WHERE id = context_org;
+
+    -- Fail if the user has too many checked out items
+    LOOP
+        tmp_grp := user_object.profile;
+        LOOP
+            SELECT * INTO max_items_out FROM permission.grp_penalty_threshold WHERE grp = tmp_grp AND penalty = 3 AND org_unit = tmp_org.id;
+
+            IF max_items_out.threshold IS NULL THEN
+                SELECT parent INTO tmp_grp FROM permission.grp_tree WHERE id = tmp_grp;
+            ELSE
+                EXIT;
+            END IF;
+
+            IF tmp_grp IS NULL THEN
+                EXIT;
+            END IF;
+        END LOOP;
+
+        IF max_items_out.threshold IS NOT NULL OR tmp_org.parent_ou IS NULL THEN
+            EXIT;
+        END IF;
+
+        SELECT INTO tmp_org * FROM actor.org_unit WHERE id = tmp_org.parent_ou;
+
+    END LOOP;
+
+
+    -- Fail if the user has too many items checked out
+    IF max_items_out.threshold IS NOT NULL THEN
+
+        FOR existing_sp_row IN
+                SELECT  *
+                  FROM  actor.usr_standing_penalty
+                  WHERE usr = match_user
+                        AND org_unit = max_items_out.org_unit
+                        AND (stop_date IS NULL or stop_date > NOW())
+                        AND standing_penalty = 3
+                LOOP
+            RETURN NEXT existing_sp_row;
+        END LOOP;
+
+        SELECT  INTO items_out COUNT(*)
+          FROM  action.circulation circ
+                JOIN  actor.org_unit_full_path( max_items_out.org_unit ) fp ON (circ.circ_lib = fp.id)
+          WHERE circ.usr = match_user
+                AND circ.checkin_time IS NULL
+                AND (circ.stop_fines IN ('MAXFINES','LONGOVERDUE') OR circ.stop_fines IS NULL);
+
+           IF items_out >= max_items_out.threshold::INT THEN
+            new_sp_row.usr := match_user;
+            new_sp_row.org_unit := max_items_out.org_unit;
+            new_sp_row.standing_penalty := 3;
+            RETURN NEXT new_sp_row;
+           END IF;
+    END IF;
+
+    -- Start over for collections warning
+    SELECT INTO tmp_org * FROM actor.org_unit WHERE id = context_org;
+
+    -- Fail if the user has a collections-level fine balance
+    LOOP
+        tmp_grp := user_object.profile;
+        LOOP
+            SELECT * INTO max_fines FROM permission.grp_penalty_threshold WHERE grp = tmp_grp AND penalty = 4 AND org_unit = tmp_org.id;
+
+            IF max_fines.threshold IS NULL THEN
+                SELECT parent INTO tmp_grp FROM permission.grp_tree WHERE id = tmp_grp;
+            ELSE
+                EXIT;
+            END IF;
+
+            IF tmp_grp IS NULL THEN
+                EXIT;
+            END IF;
+        END LOOP;
+
+        IF max_fines.threshold IS NOT NULL OR tmp_org.parent_ou IS NULL THEN
+            EXIT;
+        END IF;
+
+        SELECT * INTO tmp_org FROM actor.org_unit WHERE id = tmp_org.parent_ou;
+
+    END LOOP;
+
+    IF max_fines.threshold IS NOT NULL THEN
+
+        FOR existing_sp_row IN
+                SELECT  *
+                  FROM  actor.usr_standing_penalty
+                  WHERE usr = match_user
+                        AND org_unit = max_fines.org_unit
+                        AND (stop_date IS NULL or stop_date > NOW())
+                        AND standing_penalty = 4
+                LOOP
+            RETURN NEXT existing_sp_row;
+        END LOOP;
+
+        SELECT  SUM(f.balance_owed) INTO current_fines
+          FROM  money.materialized_billable_xact_summary f
+                JOIN (
+                    SELECT  r.id
+                      FROM  booking.reservation r
+                            JOIN  actor.org_unit_full_path( max_fines.org_unit ) fp ON (r.pickup_lib = fp.id)
+                      WHERE usr = match_user
+                            AND xact_finish IS NULL
+                                UNION ALL
+                    SELECT  g.id
+                      FROM  money.grocery g
+                            JOIN  actor.org_unit_full_path( max_fines.org_unit ) fp ON (g.billing_location = fp.id)
+                      WHERE usr = match_user
+                            AND xact_finish IS NULL
+                                UNION ALL
+                    SELECT  circ.id
+                      FROM  action.circulation circ
+                            JOIN  actor.org_unit_full_path( max_fines.org_unit ) fp ON (circ.circ_lib = fp.id)
+                      WHERE usr = match_user
+                            AND xact_finish IS NULL ) l USING (id);
+
+        IF current_fines >= max_fines.threshold THEN
+            new_sp_row.usr := match_user;
+            new_sp_row.org_unit := max_fines.org_unit;
+            new_sp_row.standing_penalty := 4;
+            RETURN NEXT new_sp_row;
+        END IF;
+    END IF;
+
+
+    RETURN;
+END;
+$func$ LANGUAGE plpgsql;
+
+COMMIT;
+

Modified: trunk/Open-ILS/src/support-scripts/test-scripts/collections.pl
===================================================================
--- trunk/Open-ILS/src/support-scripts/test-scripts/collections.pl	2009-12-03 16:23:34 UTC (rev 15070)
+++ trunk/Open-ILS/src/support-scripts/test-scripts/collections.pl	2009-12-03 21:29:05 UTC (rev 15071)
@@ -80,6 +80,7 @@
 	my $user		= $xact_data->{usr}->{__data__};
 	my $circs	= $xact_data->{transactions}->{circulations};
 	my $grocery = $xact_data->{transactions}->{grocery};
+	my $reservations = $xact_data->{transactions}->{reservations};
 
 
 	# --------------------------------------------------------------------
@@ -96,7 +97,7 @@
 			$a->{post_code}) . "\n";
 	}
 
-	print_xact_details($_->{__data__}) for (@$circs, @$grocery);
+	print_xact_details($_->{__data__}) for (@$circs, @$grocery, @$reservations);
 
 	print "\n" . '-'x60 . "\n";
 }

Modified: trunk/Open-ILS/web/opac/skin/default/js/myopac.js
===================================================================
--- trunk/Open-ILS/web/opac/skin/default/js/myopac.js	2009-12-03 16:23:34 UTC (rev 15070)
+++ trunk/Open-ILS/web/opac/skin/default/js/myopac.js	2009-12-03 21:29:05 UTC (rev 15071)
@@ -616,6 +616,12 @@
 
 		else if(trans.xact_type() == 'grocery' ) 
 			myopacShowGenericTransaction( trans );
+
+/*      XXX need to copy circulation output function here
+		else if(trans.xact_type() == 'reservation' ) 
+			myopacShowReservationTransaction( trans );
+*/
+
 	}
 }
 

Modified: trunk/Open-ILS/xul/staff_client/chrome/content/main/constants.js
===================================================================
--- trunk/Open-ILS/xul/staff_client/chrome/content/main/constants.js	2009-12-03 16:23:34 UTC (rev 15070)
+++ trunk/Open-ILS/xul/staff_client/chrome/content/main/constants.js	2009-12-03 21:29:05 UTC (rev 15071)
@@ -230,6 +230,7 @@
     'FM_MP_NOTE_EDIT' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.money.payment.note.edit' },
     'FM_MG_CREATE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.money.grocery.create' },
     'FM_MG_RETRIEVE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.money.grocery.retrieve' },
+    'FM_BRESV_RETRIEVE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.booking.reservation.retrieve' },
     'FM_MOBTS_HAVING_BALANCE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.transactions.have_balance' },
     'FM_MOBTS_HAVING_BALANCE.authoritative' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.transactions.have_balance.authoritative' },
     'FM_MOBTS_TOTAL_HAVING_BALANCE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.transactions.have_balance.total' },

Modified: trunk/Open-ILS/xul/staff_client/server/patron/bill_details.js
===================================================================
--- trunk/Open-ILS/xul/staff_client/server/patron/bill_details.js	2009-12-03 16:23:34 UTC (rev 15070)
+++ trunk/Open-ILS/xul/staff_client/server/patron/bill_details.js	2009-12-03 21:29:05 UTC (rev 15071)
@@ -30,6 +30,7 @@
                 switch(g.mbts.xact_type()) {
                     case 'circulation' : retrieve_circ(); break;
                     case 'grocery' : retrieve_grocery(); $('copy_summary_vbox').hidden = true; $('copy_summary_splitter').hidden = true; break;
+                    case 'reservation' : retrieve_reservation(); $('copy_summary_vbox').hidden = true; $('copy_summary_splitter').hidden = true; break;
                     default: $('copy_summary_vbox').hidden = true; $('copy_summary_splitter').hidden = true; break;
                 }
 
@@ -52,6 +53,18 @@
     );
 }
 
+function retrieve_reservation() {
+    JSAN.use('util.widgets');
+    g.network.simple_request('FM_BRESV_RETRIEVE', [ ses(), g.mbts_id ],
+        function (req) {
+            var r_bresv = req.getResultObject();
+            if (instanceOf(r_bresv,bresv)) {
+                $('billing_location').value = g.data.hash.aou[ r_bresv.pickup_lib() ].shortname() + ' : ' + g.data.hash.aou[ r_bresv.pickup_lib() ].name();
+            }
+        }
+    );
+}
+
 function retrieve_circ() {
     JSAN.use('util.widgets');
     g.network.simple_request('FM_CIRC_RETRIEVE_VIA_ID', [ ses(), g.mbts_id ],



More information about the open-ils-commits mailing list