Index: openacs-4/packages/dotlrn-ecommerce/dotlrn-ecommerce.info
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn-ecommerce/dotlrn-ecommerce.info,v
diff -u -r1.52 -r1.53
--- openacs-4/packages/dotlrn-ecommerce/dotlrn-ecommerce.info	2 May 2006 23:53:45 -0000	1.52
+++ openacs-4/packages/dotlrn-ecommerce/dotlrn-ecommerce.info	9 Jun 2006 19:29:22 -0000	1.53
@@ -7,15 +7,15 @@
     <initial-install-p>f</initial-install-p>
     <singleton-p>t</singleton-p>
     
-    <version name="0.1d25" url="http://openacs.org/repository/download/apm/dotlrn-ecommerce-0.1d25.apm">
+    <version name="0.1d26" url="http://openacs.org/repository/download/apm/dotlrn-ecommerce-0.1d26.apm">
         <owner url="mailto:roelmc@solutiongrove.com">Roel Canicula</owner>
         <summary>Package to tie the dotLRN, Ecommerce, Assessments and dotLRN Catalog packages together</summary>
         <release-date>2005-08-10</release-date>
         <vendor url="http://www.solutiongrove.com">Solution Grove</vendor>
         <description format="text/html">Package to tie the dotLRN, Ecommerce, Assessments and dotLRN Catalog packages together.  Initially intended for the MOS and MGH projects, the goal is to create a reusable module for similar projects.</description>
         <maturity>0</maturity>
 
-        <provides url="dotlrn-ecommerce" version="0.1d25"/>        
+        <provides url="dotlrn-ecommerce" version="0.1d26"/>
         <requires url="dotlrn" version="2.1.3"/>
         <requires url="dotlrn-assessment" version="0.2"/>
         <requires url="dotlrn-attendance" version="0.1d"/>
@@ -25,7 +25,7 @@
         <requires url="scholarship-fund" version="0.7d"/>
         <callbacks>
             <callback type="after-install"  proc="dotlrn_ecommerce::install"/>
-	    	<callback type="after-mount"  proc="dotlrn_ecommerce::after_mount"/>
+            <callback type="after-mount"  proc="dotlrn_ecommerce::after_mount"/>
             <callback type="after-upgrade"  proc="dotlrn_ecommerce::after_upgrade"/>
         </callbacks>
         <parameters>
@@ -63,6 +63,7 @@
             <parameter datatype="number"  min_n_values="1"  max_n_values="1"  name="OfferCodesP"  default="0" description="Support asking for offer codes for discount prices."/>
             <parameter datatype="number"  min_n_values="1"  max_n_values="1"  name="PatronRelationshipCategoryTree"  description="Category tree to use when adding participant-patron relationships."/>
             <parameter datatype="string"  min_n_values="1"  max_n_values="1"  name="PaymentMethods"  default="cc" description="A space separeted list of allowed payment methods. Valid payment methods are 'cc' (Credit Card), 'internal_account' (With extra field asking for internal account code) or 'check'."/>
+            <parameter datatype="number"  min_n_values="1"  max_n_values="1"  name="ShowNonSessionCalendarLinks"  default="0" description="Show links to the calendar that are not Session Events."/>
             <parameter datatype="number"  min_n_values="1"  max_n_values="1"  name="ShowSectionCategoryFields"  default="0" description="Display the category field in the section add/edit form."/>
             <parameter datatype="number"  min_n_values="1"  max_n_values="1"  name="ShowTemplateCommunityAdminP"  default="0" description="Show the buttons to administer template community."/>
             <parameter datatype="number"  min_n_values="1"  max_n_values="1"  name="ShowUsedCategoriesOnlyP"  default="0" description="Show only categories used in any course or section."/>
Index: openacs-4/packages/dotlrn-ecommerce/catalog/dotlrn-ecommerce.en_US.ISO-8859-1.xml
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn-ecommerce/catalog/dotlrn-ecommerce.en_US.ISO-8859-1.xml,v
diff -u -r1.67 -r1.68
--- openacs-4/packages/dotlrn-ecommerce/catalog/dotlrn-ecommerce.en_US.ISO-8859-1.xml	12 Apr 2006 19:11:14 -0000	1.67
+++ openacs-4/packages/dotlrn-ecommerce/catalog/dotlrn-ecommerce.en_US.ISO-8859-1.xml	9 Jun 2006 19:29:22 -0000	1.68
@@ -14,6 +14,7 @@
   <msg key="Administrative_Setup">Administrative Setup</msg>
   <msg key="Already_Registered">Approved/Registered</msg>
   <msg key="Amount_to_be_Paid">Amount to be Paid</msg>
+  <msg key="Applicant">Applicant</msg>
   <msg key="Application">Application</msg>
   <msg key="Application_1">Application submitted</msg>
   <msg key="Application_2">Approved</msg>
@@ -35,10 +36,12 @@
   <msg key="available">available</msg>
   <msg key="awaiting_approval">(awaiting approval)</msg>
   <msg key="Back_to">Back to</msg>
+  <msg key="Back_to_Applications">Back to Applications</msg>
   <msg key="Balance">Balance</msg>
   <msg key="Balance_due">Balance due:</msg>
   <msg key="Bill_to">Bill to:</msg>
   <msg key="body">body</msg>
+  <msg key="Bulk_Payments">Bulk Payments</msg>
   <msg key="Cancel">Cancel</msg>
   <msg key="Cash">Cash</msg>
   <msg key="change">change</msg>
@@ -98,6 +101,7 @@
   <msg key="Instructor">Instructor</msg>
   <msg key="Instructors">Instructors</msg>
   <msg key="Internal_Account">Internal Account</msg>
+  <msg key="Invalid_price">Invalid price</msg>
   <msg key="Invoice">Invoice</msg>
   <msg key="Item">Item</msg>
   <msg key="Item_Description">Item Description</msg>
@@ -182,6 +186,7 @@
   <msg key="lt_Please_enter_a_search">Please enter a search string</msg>
   <msg key="lt_Please_enter_a_value_">Please enter a value greater than 1</msg>
   <msg key="lt_Please_enter_an_inter">Please enter an internal account code</msg>
+  <msg key="lt_Please_enter_an_inter_1">Please enter an internal account number.</msg>
   <msg key="lt_Please_enter_the_numb">Please enter the number of attendees</msg>
   <msg key="lt_Please_select_a_credi">Please select a credit card type</msg>
   <msg key="lt_Please_select_a_secti">Please select a section from the list</msg>
@@ -212,16 +217,18 @@
   <msg key="lt_Sorry_There_seems_to_">Sorry, There seems to be a problem with completing this transaction.</msg>
   <msg key="lt_Test_email_sent_to_user">Test email sent to %user.email%. Please check your inbox.</msg>
   <msg key="lt_Thank_you_for_your_ap">&lt;p&gt;Thank you for applying, the course administrator(s) will contact you soon regarding your registration.&lt;/p&gt;&lt;p&gt;
-If you have any technical issues please contact the &lt;a href="mailto:%administrator_email%"&gt;web site administrator&lt;/a&gt;&lt;/p&gt;</msg>
+If you have any technical issues please contact the &lt;a href=&quot;mailto:%administrator_email%&quot;&gt;web site administrator&lt;/a&gt;&lt;/p&gt;</msg>
   <msg key="lt_Thank_You_For_Your_Or">Thank You For Your Order</msg>
   <msg key="lt_The_applications_have">The applications have been rejected.</msg>
   <msg key="lt_The_course_only_has_a">The course only has $available_slots slots left</msg>
   <msg key="lt_The_following_applica">The following applications need to be handled separately because a section specific approval email needs to be sent:</msg>
   <msg key="lt_The_following_applica_1">The following applications are already approved:</msg>
   <msg key="lt_The_following_applica_2">The following applications need to be handled separately because a section specific rejection email needs to be sent:</msg>
   <msg key="lt_The_following_has_bee">The following has been sent to the purchaser</msg>
+  <msg key="lt_The_following_users_p">The following users' payment info could not be entered because they are already regsitered for the course.</msg>
   <msg key="lt_The_offer_code_was_ac">The offer code was accepted. You save $savings!</msg>
   <msg key="lt_There_is_no_fee_for_t">There is no fee for this course</msg>
+  <msg key="lt_There_was_a_problem_r">There was a problem registering this user</msg>
   <msg key="lt_This_section_is_curre">This section is currently full, but we are taking names for the waiting list.</msg>
   <msg key="lt_To_complete_your_orde">To complete your order, submit this form, and confirm the information on the following page.</msg>
   <msg key="lt_to_send_us_your_order">to send us your order, or click &quot;back&quot; on your browser to make changes.</msg>
@@ -245,6 +252,7 @@
 
 Instructors:
 %instructor_names%</msg>
+  <msg key="lt_Were_sorry_but_we_can">We're sorry, but we cannot display this page because SSL isn't available from this site.  Please contact &lt;a href=\&quot;mailto:[ad_system_owner]\&quot;&gt;[ad_system_owner]&lt;/a&gt; for assistance</msg>
   <msg key="lt_Who_is_taking_the_cou">Who is taking the course?</msg>
   <msg key="lt_Whos_participating_in">Who's participating in this course?</msg>
   <msg key="lt_You_are_number_course">(You are number @course_list.waiting_list_number@ on the wait list)</msg>
@@ -264,15 +272,18 @@
   <msg key="lt_Youve_already_purchas">You've already purchased this course. You may purchase for someone else.</msg>
   <msg key="Make_a_donation">Make a donation</msg>
   <msg key="Manage_Course_List">Manage Course List</msg>
+  <msg key="Mark_as_Paid">Mark as Paid</msg>
   <msg key="Medical_Issues">Medical Issues</msg>
   <msg key="Member_Request">Member Request</msg>
   <msg key="more">more</msg>
   <msg key="More_Information">More Information:</msg>
   <msg key="My_Shopping_Cart">My Shopping Cart</msg>
+  <msg key="New_Price">New Price</msg>
   <msg key="No">No</msg>
   <msg key="No_applications">No applications</msg>
   <msg key="No_orders">No orders</msg>
   <msg key="No_related_users">No related users</msg>
+  <msg key="No_SSL_available">No SSL available</msg>
   <msg key="No_waiting_lists">No waiting lists</msg>
   <msg key="Notes">Notes</msg>
   <msg key="Offer_Code">Offer Code:</msg>
@@ -291,12 +302,15 @@
   <msg key="Payment_Information">Payment Information</msg>
   <msg key="Payment_Method">Payment Method</msg>
   <msg key="Payment_method">Payment method</msg>
+  <msg key="Pending_Applications">Pending Applications</msg>
   <msg key="Pending_applications">Pending applications</msg>
+  <msg key="Pending_Applications_1">{Pending Applications}</msg>
   <msg key="Per_User">Per User</msg>
   <msg key="Phone_Number">Phone Number</msg>
   <msg key="Please_select_one">Please select one</msg>
   <msg key="PreReq_Approval_List">PreReq Approval List</msg>
   <msg key="Preview_Application">Preview Application</msg>
+  <msg key="Price_Charged">Price Charged</msg>
   <msg key="PriceItem">Price/Item</msg>
   <msg key="Proceed">Proceed</msg>
   <msg key="Process_Registration">Process Registration</msg>
@@ -315,6 +329,7 @@
   <msg key="Registered_By_Admin">Registered By Admin</msg>
   <msg key="Registration">Registration</msg>
   <msg key="Regsitered_By_Admin">Regsitered By Admin</msg>
+  <msg key="Regular_Price">Regular Price</msg>
   <msg key="Reject">Reject</msg>
   <msg key="Reject_1">waiver of prerequitsites</msg>
   <msg key="Reject_2">application</msg>
Index: openacs-4/packages/dotlrn-ecommerce/www/application-bulk-payments.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn-ecommerce/www/application-bulk-payments.adp,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/dotlrn-ecommerce/www/application-bulk-payments.adp	9 Jun 2006 19:29:22 -0000	1.1
@@ -0,0 +1,91 @@
+<master>
+  <property name="title">#dotlrn-ecommerce.Bulk_Payments#</property>
+
+  <if @applications_registered:rowcount@ not defined>
+
+    <formtemplate id="applications">
+      <formwidget id="return_url" />
+
+      <table border=0 cellpadding=2 cellspacing=2>
+	<tr class="form-section"><th colspan="2">#dotlrn-ecommerce.Payment_Information#</th></tr>
+	
+	<tr class="form-element">
+
+	  <td class="form-label">
+	    
+	    #dotlrn-ecommerce.lt_Select_a_payment_meth#
+	    <span class="form-required-mark">*</span>
+	    
+	  </td>
+	  
+	  <td class="form-widget">
+	    
+	    <table class="formgroup">
+	      <formgroup id="method">
+		<tr>
+		  <td>
+		    @formgroup.widget;noquote@
+		  </td>
+		  <td class="form-widget">
+		    <label for="applications:elements:method:@formgroup.option@">
+		      @formgroup.label;noquote@
+		    </label>
+		  </td>
+		</tr>
+	      </formgroup>
+	    </table>	    
+
+	    <formerror id="method">
+	      <div class="form-error">
+		@formerror.method;noquote@
+	      </div>
+	    </formerror>
+
+	  </td>
+	</tr>
+
+	<if @internal_account_p@>
+	  <tr class="form-element">
+	    
+	    <td class="form-label">
+	      
+	      #dotlrn-ecommerce.Internal_Account#
+	      
+	    </td>
+	    
+	    <td class="form-widget">
+	      <formwidget id="internal_account" />
+	      <formerror id="internal_account">
+		<div class="form-error">
+		  @formerror.internal_account;noquote@
+		</div>
+	      </formerror>	      
+	    </td>
+	  </tr>
+	</if>
+
+      </table>
+
+      <p />
+
+      <listtemplate name="applications"></listtemplate>
+      
+      <multiple name="applications">
+	<input type="hidden" name="rel_id" value="@applications.rel_id@" />
+      </multiple>
+      
+      <formwidget id="back" />
+      <formwidget id="submit" />
+    </formtemplate>
+
+  </if>
+  <else>
+    <listtemplate name="applications_registered"></listtemplate>
+  </else>
+
+  <if @registered_exists_p@ eq 1>
+    <p />
+    <h3>#dotlrn-ecommerce.lt_The_following_users_p#</h3>
+    <p />
+    <listtemplate name="already_registered"></listtemplate>
+  </if>
Index: openacs-4/packages/dotlrn-ecommerce/www/application-bulk-payments.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn-ecommerce/www/application-bulk-payments.tcl,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/dotlrn-ecommerce/www/application-bulk-payments.tcl	9 Jun 2006 19:29:22 -0000	1.1
@@ -0,0 +1,524 @@
+# packages/dotlrn-ecommerce/www/application-bulk-payments.tcl
+
+ad_page_contract {
+    
+    Bulk payments
+    
+    @author Roel Canicula (roel@solutiongrove.com)
+    @creation-date 2006-03-15
+    @arch-tag: 7e28fd03-d828-4adb-b86b-4cf01769a9ee
+    @cvs-id $Id: application-bulk-payments.tcl,v 1.1 2006/06/09 19:29:22 roelc Exp $
+} {
+    {rel_id:multiple {}}
+    return_url
+
+    {method cc}
+    {internal_account ""}
+} -properties {
+} -validate {
+} -errors {
+}
+
+db_multirow already_registered already_registered [subst {
+    select person__name(r.user_id) as person_name, t.course_name||': '||s.section_name as section_name
+
+    from dotlrn_member_rels_full r, 
+    dotlrn_ecommerce_section s,
+    dotlrn_catalogi t,
+    cr_items i
+
+    where rel_id in ([join $rel_id ,])
+    and r.community_id = s.community_id
+    and s.course_id = t.item_id
+    and t.course_id = i.live_revision
+    and r.member_state = 'approved'
+}]
+
+if { [template::multirow size already_registered] > 0 } {
+    set registered_exists_p 1
+
+    template::list::create \
+	-name already_registered \
+	-multirow already_registered \
+	-elements {
+	    person_name {
+		label "[_ dotlrn-ecommerce.Applicant]"
+	    }
+	    section_name {
+		label "[_ dotlrn-ecommerce.Section]"
+	    }
+	}
+} else {
+    set registered_exists_p 0
+}
+
+set user_id [auth::require_login]
+set user_session_id [ec_get_user_session_id]
+
+if {![ad_secure_conn_p]} {
+    if { ![ec_ssl_available_p] } {
+	ad_return_error "[_ dotlrn-ecommerce.No_SSL_available]" "[_ dotlrn-ecommerce.lt_Were_sorry_but_we_can].
+		    "
+	ad_script_abort
+    } else {
+	set secure_url "[ec_secure_location][ns_conn url]"
+	set vars_to_export [ec_export_entire_form_as_url_vars_maybe]
+	if { ![empty_string_p $vars_to_export] } {
+	    set secure_url "$secure_url?$vars_to_export"
+	}
+
+	ad_returnredirect $secure_url
+	ad_script_abort
+    }
+}
+
+ec_create_new_session_if_necessary [export_url_vars rel_id:multiple return_url]
+ec_log_user_as_user_id_for_this_session
+
+# Build bulk payment list
+ad_form -name applications -export { return_url } -form {
+    {back:text(button) {label Back} {html {onclick "window.location = 'applications'"}}}
+    {submit:text(submit) {label Submit}}
+}
+
+# Determine supported payment methods
+if { [empty_string_p [set payment_methods [parameter::get -parameter PaymentMethods]]] } {
+    lappend payment_methods cc
+}
+
+set method_count 0
+set new_payment_methods [list]
+set validate [list]
+foreach payment_method [split $payment_methods] {
+    set _payment_method [split $payment_method :]
+    if { [llength $_payment_method] == 2 } {
+	lappend new_payment_methods [set payment_method [lindex $_payment_method 0]]
+
+	switch [lindex $_payment_method 1] {
+	    admin {
+		if { $admin_p } {
+		    set ${payment_method}_p 1
+		} else {
+		    continue
+		}
+	    }
+	}
+    } else {
+	set ${payment_method}_p 1
+	lappend new_payment_methods $payment_method
+    }
+
+    switch $payment_method {
+	internal_account {
+	    lappend method_options [list "[_ dotlrn-ecommerce.lt_Internal_account_numb]" internal_account]
+	    lappend validate {internal_account
+		{ [exists_and_not_null internal_account] || [template::element::get_value applications method] != "internal_account" }
+		"[_ dotlrn-ecommerce.lt_Please_enter_an_inter]"
+	    }
+	}
+	check {
+	    lappend method_options [list "[_ dotlrn-ecommerce.Check]" check]
+	}
+	cc {
+	    lappend method_options [list "[_ dotlrn-ecommerce.Credit_Card]" cc]
+	    lappend validate {creditcard_number
+		{ [template::element::get_value applications method] != "cc" || [exists_and_not_null creditcard_number] }
+		"[_ dotlrn-ecommerce.lt_Please_enter_a_credit]"
+	    }
+	    lappend validate {creditcard_type
+		{ [template::element::get_value applications method] != "cc" || [exists_and_not_null creditcard_type] }
+		"[_ dotlrn-ecommerce.lt_Please_select_a_credi]"
+	    }
+	    lappend validate {creditcard_expires
+		{ [template::element::get_value applications method] != "cc" || ([exists_and_not_null creditcard_expire_1] && [exists_and_not_null creditcard_expire_2]) }
+		"[_ dotlrn-ecommerce.lt_A_full_credit_card_ex]"
+	    }
+	}
+	cash {
+	    lappend method_options [list "[_ dotlrn-ecommerce.Cash]" cash]
+	}
+	invoice {
+	    lappend method_options [list "[_ dotlrn-ecommerce.Invoice]" invoice]
+	}
+	scholarship {
+	    # Purchasing via scholarships should only be available to
+	    # admins by logic, but this can be set in the param
+	    lappend method_options [list "[_ dotlrn-ecommerce.Scholarship]" scholarship]
+	}
+	lockbox {
+	    lappend method_options [list "[_ dotlrn-ecommerce.Lock_Box]" lockbox]
+	}
+    }
+    incr method_count
+}
+set payment_methods $new_payment_methods
+
+if { $method_count > 1 } {
+    ad_form -extend -name applications -form {
+	{-section "[_ dotlrn-ecommerce.Payment_Information]"}
+	{method:text(radio) {label "[_ dotlrn-ecommerce.Select]"} {options {$method_options}}}
+    }
+
+    if { [exists_and_equal internal_account_p 1] } {
+	ad_form -extend -name applications -form {
+	    {internal_account:text,optional {label "[_ dotlrn-ecommerce.Internal_Account]"}}
+	}
+    }
+} elseif { $method_count == 1 } {
+    ad_form -extend -name applications -export { {method "[lindex [split $payment_methods] 0]"} } -form {}
+} else {
+    ad_form -extend -name applications -export { {method cc} } -form {}
+}
+
+if { [info exists cc_p] } {
+    if { $method_count == 1 } {
+	# The creditcard_expires field is a hack, improve it
+	ad_form -extend -name applications -form {
+	    {creditcard_number:text {label "[_ dotlrn-ecommerce.Credit_card_number]"}}
+	    {creditcard_type:text(select) {label "[_ dotlrn-ecommerce.Type]"} {options {{"[_ dotlrn-ecommerce.Please_select_one]" ""} {VISA v} {MasterCard m} {"American Express" a}}}}
+	    {creditcard_expires:text(inform) {label "[_ dotlrn-ecommerce.Expires] <span class=\"form-required-mark\">*</span>"} {value $ec_expires_widget}}
+	}
+    } else {
+	ad_form -extend -name applications -form {
+	    {-section "[_ dotlrn-ecommerce.lt_Credit_card_informati]"}
+	    {creditcard_number:text,optional {label "[_ dotlrn-ecommerce.Credit_card_number]"}}
+	    {creditcard_type:text(select),optional {label Type} {options {{"[_ dotlrn-ecommerce.Please_select_one]" ""} {VISA v} {MasterCard m} {"American Express" a}}}}
+	    {creditcard_expires:text(inform),optional {label "[_ dotlrn-ecommerce.Expires]"} {value $ec_expires_widget}}
+	}
+    }
+}
+
+template::list::create \
+    -name applications \
+    -multirow applications \
+    -elements {
+	person_name {
+	    label "[_ dotlrn-ecommerce.Applicant]"
+	}
+	section_name {
+	    label "[_ dotlrn-ecommerce.Section]"
+	}
+	regular_price {
+	    label "[_ dotlrn-ecommerce.Regular_Price]"
+	    html { align center }
+	    display_template {
+		<if @applications.free_p@>
+		Free
+		</if>
+		<else>
+		@applications.pretty_price;noquote@
+		</else>
+	    }
+	}
+	new_price {
+	    label "[_ dotlrn-ecommerce.New_Price]"
+	    display_template {		    
+		<input type="text" name="bulk_payment_@applications.rel_id@" value="@applications.regular_price@" />
+	    }
+	}
+    } \
+    -filters {
+	rel_id {}
+	return_url {}
+    }
+
+db_multirow -extend { regular_price free_p pretty_price } applications applications [subst {
+    select r.rel_id, r.user_id, person__name(r.user_id) as person_name, t.course_name||': '||s.section_name as section_name, s.product_id
+
+    from dotlrn_member_rels_full r, dotlrn_ecommerce_section s
+    left join ec_products p
+    on (s.product_id = p.product_id),
+    dotlrn_catalogi t,
+    cr_items i
+
+    where rel_id in ([join $rel_id ,])
+    and r.community_id = s.community_id
+    and s.course_id = t.item_id
+    and t.course_id = i.live_revision
+    and r.member_state != 'approved'
+}] {
+    set regular_price [format "%.2f" [lindex [ec_lowest_price_and_price_name_for_an_item $product_id $user_id] 0]]
+    set free_p [expr {$regular_price == 0}]
+    set pretty_price [ec_pretty_price $regular_price]
+}
+
+ad_form -extend -name applications -validate $validate -form {} -on_submit {
+
+    # Actually register and record payments
+    set _form [rp_getform]
+    array set form [util_ns_set_to_list -set $_form]
+
+    template::multirow create applications_registered rel_id price valid_p order_id person_name section_name
+
+    foreach name [array names form] {
+	if { [regexp {^bulk_payment_(\d+)$} $name match one_rel_id] } {
+	    # Check if price is valid
+	    set new_price $form($match)
+	    if { [string is double $new_price] && $new_price >= 0 } {
+		# Register the user
+		if { [db_0or1row get_rel_info {
+		    select r.user_id as participant_id, r.community_id, s.product_id, o.creation_user as patron_id, person__name(r.user_id) as person_name, t.course_name||': '||s.section_name as section_name
+		    from dotlrn_member_rels_full r, dotlrn_ecommerce_section s, acs_objects o, dotlrn_catalogi t, cr_items i
+		    
+		    where r.community_id = s.community_id
+		    and r.rel_id = o.object_id
+	    	    and s.course_id = t.item_id
+		    and t.course_id = i.live_revision
+		    and r.rel_id = :one_rel_id
+		}] } {
+			# Check if this is a free course
+			if { $new_price > 0 } {
+
+			    # Use user_id to the patron to be used in the
+			    # ecommerce SQL calls since the patron is paying
+			    set user_id $patron_id
+
+			    # Check for an existing order in this session
+			    if { ! [db_0or1row existing_order {
+				select order_id
+				from ec_orders
+				where user_session_id = :user_session_id
+				and order_state = 'in_basket'
+			    }] } {
+				ns_log notice "application-bulk-payments: no existing order in session $user_session_id"
+
+				# Create an order entry		    			
+				set order_id [db_nextval ec_order_id_sequence]
+
+				# Create the order (if an in_basket order *still* doesn't exist)
+				db_dml insert_new_ec_order {
+				    insert into ec_orders
+				    (order_id, user_session_id, order_state, in_basket_date)
+				    select :order_id, :user_session_id, 'in_basket', current_timestamp 
+				    where not exists (select 1 from ec_orders where user_session_id=:user_session_id and order_state='in_basket')
+				}
+			    } else {
+				ns_log notice "application-bulk-payments: existing order_id $order_id in session $user_session_id"
+			    }
+
+			    # Check for an existing item in this order,
+			    # there can be more than one
+			    set existing_item_p 0
+			    db_foreach existin_items {
+				select product_id as existing_product_id, item_id as existing_item_id
+				from ec_items
+				where order_id = :order_id
+			    } {
+				if { $product_id == $existing_product_id } {
+				    ns_log notice "application-bulk-payments: existing product $product_id with item_id $existing_item_id in order $order_id"
+
+				    set existing_item_p 1
+				} else {
+				    ns_log notice "application-bulk-payments: unrecognized product $product_id in order $order_id"
+
+				    # Delete the item that doesn't match,
+				    # this should not happen and we need to
+				    # delete it or the order will be inaccurate
+				    db_dml delete_unmatched_item {
+					delete from ec_items
+					where item_id = :existing_item_id
+				    }
+				}
+			    }
+
+			    if { ! $existing_item_p } {
+				ns_log notice "application-bulk-payments: product $product_id doesn't exist in order $order_id, creating"
+
+				set item_id [db_nextval ec_item_id_sequence]
+
+				set color_choice [set size_choice [set style_choice ""]]
+				db_dml insert_new_item_in_order {
+				    insert into ec_items
+				    (item_id, product_id, color_choice, size_choice, style_choice, order_id, in_cart_date, price_charged)
+				    select :item_id, :product_id, :color_choice,
+				    :size_choice, :style_choice, :order_id, current_timestamp, :new_price
+				    from dual
+				}
+
+				db_dml insert_new_item_order_dotlrn_ecommerce {
+				    insert into dotlrn_ecommerce_orders (item_id, patron_id, participant_id)
+				    values (:item_id, :user_id, :participant_id)
+				}
+
+
+				if { $method == "cc" } {
+				    if { [db_0or1row check_transaction {
+					select 1
+					from dotlrn_ecommerce_transactions
+					where order_id = :order_id
+				    }] } {
+					db_dml update_transaction_check {
+					    update dotlrn_ecommerce_transactions
+					    set method = 'cc',
+					    internal_account = null
+					    where order_id = :order_id
+					}
+				    } else {
+					db_dml save_transaction_check {
+					    insert into dotlrn_ecommerce_transactions
+					    (order_id, method)
+					    values
+					    (:order_id, 'cc')
+					}
+				    }
+				} else {
+				    # Other payment methods
+				    # Just store it
+				    if { $method == "internal_account" } {
+					# Check if internal account was entered
+					if { [empty_string_p $internal_account] } {
+					    ad_return_complaint 1 "<li> [_ dotlrn-ecommerce.lt_Please_enter_an_inter_1]</li>"
+					    ad_script_abort		
+					}
+
+					if { [db_0or1row check_transaction {
+					    select 1
+					    from dotlrn_ecommerce_transactions
+					    where order_id = :order_id
+					}] } {
+					    db_dml update_transaction_internal_account {
+						update dotlrn_ecommerce_transactions
+						set method = 'internal_account',
+						internal_account = :internal_account
+						where order_id = :order_id
+					    }
+					} else {
+					    db_dml save_transaction_internal_account {
+						insert into dotlrn_ecommerce_transactions
+						(order_id, method, internal_account)
+						values
+						(:order_id, 'internal_account', :internal_account)
+					    }
+					}
+				    } elseif { $method == "check" ||
+					       $method == "cash" ||
+					       $method == "invoice" ||
+					       $method == "scholarship" ||
+					       $method == "lockbox"
+					   } {
+					if { [db_0or1row check_transaction {
+					    select 1
+					    from dotlrn_ecommerce_transactions
+					    where order_id = :order_id
+					}] } {
+					    db_dml update_transaction_check {
+						update dotlrn_ecommerce_transactions
+						set method = :method,
+						internal_account = null
+						where order_id = :order_id
+					    }
+					} else {
+					    db_dml save_transaction_check {
+						insert into dotlrn_ecommerce_transactions
+						(order_id, method)
+						values
+						(:order_id, :method)
+					    }
+					}
+				    }
+				}
+			    }
+
+			    set use_member_price_p 0
+			    if {[parameter::get -parameter MemberPriceP -default 0]} {
+				set ec_category_id [parameter::get -parameter "MembershipECCategoryId" -default ""]
+				set group_id [parameter::get -parameter MemberGroupId -default 0]
+				if {$group_id} {
+				    set use_member_price_p [group::member_p -group_id $group_id -user_id $user_id]
+				}
+
+				if {$use_member_price_p} {
+				    set offer_code [db_string get_offer_code {
+					select offer_code
+					from ec_sale_prices
+					where product_id = :product_id
+					and offer_code = 'dotlrn-ecommerce'
+				    } -default ""]
+				    if {![empty_string_p $offer_code]} {
+					# DEDS: at this point we need to insert or update an offer
+					set offer_code_exists_p [db_string get_offer_code_p {
+					    select count(*) 
+					    from ec_user_session_offer_codes 
+					    where user_session_id=:user_session_id
+					    and product_id=:product_id
+					}]
+					if {$offer_code_exists_p} {
+					    db_dml update_ec_us_offers {
+						update ec_user_session_offer_codes 
+						set offer_code = :offer_code
+						where user_session_id = :user_session_id
+						and product_id = :product_id
+					    }
+					} else {
+					    db_dml inert_uc_offer_code {
+						insert into ec_user_session_offer_codes
+						(user_session_id, product_id, offer_code) 
+						values 
+						(:user_session_id, :product_id, :offer_code)
+					    }
+					}
+				    }
+				}
+				# DEDS
+				# at this point if user is purchasing
+				# a member product then we probably need to adjust
+				# any other products in basket
+				if {[parameter::get -parameter MemberPriceP -default 0]} {
+				    if {![empty_string_p $ec_category_id]} {
+					if {[db_string membership_product_p {
+					    select count(*)
+					    from ec_category_product_map
+					    where category_id = :ec_category_id
+					    and product_id = :product_id
+					}]} {
+					    dotlrn_ecommerce::ec::toggle_offer_codes -order_id $order_id -insert
+					}
+				    }
+				}
+			    }
+
+			    # Register the user
+
+			    ec_update_state_to_confirmed $order_id 
+			    ec_update_state_to_authorized $order_id 
+			    callback -- ecommerce::after-checkout -user_id $user_id -patron_id $user_id -order_id $order_id
+			} else {
+			    dotlrn_ecommerce::registration::new -user_id $participant_id \
+				-patron_id $user_id \
+				-community_id $community_id
+
+			    set order_id ""
+			}
+
+			template::multirow append applications_registered $one_rel_id [ec_pretty_price $form($match)] 1 $order_id $person_name $section_name
+		} else {
+		    template::multirow append applications_registered $one_rel_id "[_ dotlrn-ecommerce.lt_There_was_a_problem_r]" 0 "" $person_name $section_name
+		}
+
+	    } else {
+		template::multirow append applications_registered $one_rel_id "[_ dotlrn-ecommerce.Invalid_price]: $form($match)" 0 "" $person_name $section_name
+	    }
+	}
+    }
+    
+    template::list::create \
+	-name applications_registered \
+	-multirow applications_registered \
+	-actions [list "[_ dotlrn-ecommerce.Back_to_Applications]" $return_url "[_ dotlrn-ecommerce.Back_to_Applications]"] \
+	-elements {
+	    order_id {
+		label "[_ dotlrn-ecommerce.Order_ID]"
+		html { align center }
+	    }
+	    person_name {
+		label "[_ dotlrn-ecommerce.Applicant]"
+	    }
+	    section_name {
+		label "[_ dotlrn-ecommerce.Section]"
+	    }
+	    price {
+		label "[_ dotlrn-ecommerce.Price_Charged]"
+		html { align center }
+	    }
+	}
+}
\ No newline at end of file
Index: openacs-4/packages/dotlrn-ecommerce/www/applications.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn-ecommerce/www/applications.tcl,v
diff -u -r1.45 -r1.46
--- openacs-4/packages/dotlrn-ecommerce/www/applications.tcl	21 Apr 2006 02:14:34 -0000	1.45
+++ openacs-4/packages/dotlrn-ecommerce/www/applications.tcl	9 Jun 2006 19:29:22 -0000	1.46
@@ -51,8 +51,12 @@
 
 if { $enable_applications_p } {
     lappend filters \
-	{"[_ dotlrn-ecommerce.Applications]" "application sent"} \
-	{"[_ dotlrn-ecommerce.lt_Approved_Applications]" "application approved"}
+	{"[_ dotlrn-ecommerce.Applications]" "application sent"}
+    
+    if { ![exists_and_not_null section_id] || [dotlrn_ecommerce::section::price $section_id] > 0.01 } {
+	lappend filters \
+	    {"[_ dotlrn-ecommerce.lt_Approved_Applications]" "application approved"}
+    }
 }
 
 lappend filters {"[_ dotlrn-ecommerce.Already_Registered]" "approved"}
@@ -65,7 +69,9 @@
     lappend bulk_actions "[_ dotlrn-ecommerce.Email_applicants]" "email-applicants" "[_ dotlrn-ecommerce.Email_applicants]"
 }
 
-lappend bulk_actions "Mark as Paid" application-bulk-payments "Mark as Paid"
+if { ![exists_and_not_null section_id] || [dotlrn_ecommerce::section::price $section_id] > 0.01 } {
+    lappend bulk_actions "[_ dotlrn-ecommerce.Mark_as_Paid]" application-bulk-payments "[_ dotlrn-ecommerce.Mark_as_Paid]"
+}
 
 set elements {section_name {
 	    label "[_ dotlrn-ecommerce.Section]"