mirror of
				https://github.com/fspc/Yellow-Bike-Database.git
				synced 2025-10-31 17:05:36 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			853 lines
		
	
	
		
			35 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			853 lines
		
	
	
		
			35 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| require_once('YBDB.php');
 | |
| 
 | |
| // DO NOT EDIT - USE Connections/local_configurations.php instead with definitions between 
 | |
| // <?php (no space between ? and >) ? > 
 | |
| 
 | |
| /*    
 | |
| 	Choose your timezone from http://php.net/manual/en/timezones.php 
 | |
| 	
 | |
| 	Eastern ........... America/New_York
 | |
| 	Central ........... America/Chicago
 | |
| 	Mountain .......... America/Denver
 | |
| 	Mountain no DST ... America/Phoenix
 | |
| 	Pacific ........... America/Los_Angeles
 | |
| 	Alaska ............ America/Anchorage
 | |
| 	Hawaii ............ America/Adak
 | |
| 	Hawaii no DST ..... Pacific/Honolulu
 | |
| 
 | |
| */
 | |
| define("TIMEZONE", "America/New_York");
 | |
| 
 | |
| 
 | |
| /*********
 | |
| MEMBERSHIP
 | |
| **********/
 | |
| // Define when a volunteer becomes a member based hours and days for the calendar year vs a paid membership
 | |
| // This can also be used as a metric.
 | |
| /*
 | |
| At Positive Spin
 | |
| Actual memberships begin on the day they are purchased
 | |
| Memberships - $60/year
 | |
| Memberships include unlimited access to an available work stand during open shop hours and a 10% discount on new parts.
 | |
| */
 | |
| 
 | |
| // Needs to volunteer at least this amount of defined hours before being considered a member 
 | |
| // Note: used only as a metric for reports
 | |
| define("MEMBERSHIP_HOURS",8);
 | |
| 
 | |
| // Needs to volunteer at least this number of days before being considered a member
 | |
| // Note: used only as a metric for reports
 | |
| define("MEMBERSHIP_DAYS",2);
 | |
| 
 | |
| // Define how long a patron remains a member if they purchase a membership.
 | |
| define("PURCHASED_MEMBERSHIP_DAYS",365);
 | |
| 
 | |
| // Define discount for paid members (applies when volunteer benefits do not)
 | |
| define("MEMBERSHIP_DISCOUNT",10);      // PERCENTAGE
 | |
| 
 | |
| /*********
 | |
| STAND TIME
 | |
| **********/
 | |
| // Determines the behaviour of Stand Time (transaction_type_id)
 | |
| define("STAND_TIME_HOURLY_RATE",10);  // IN DOLLARS
 | |
| 
 | |
| // Define how much time over 1hr is allowed before charging for the next hour.
 | |
| define("STAND_TIME_GRACE_PERIOD",15); // IN MINUTES 1 - 59
 | |
| 
 | |
| // Define hourly cost for stand time
 | |
| define("STAND_TIME_VALUE",10);        // IN DOLLARS
 | |
| 
 | |
| // Define how many free days of stand time are allotted after purchase of a bike
 | |
| define("FREE_STAND_TIME_PERIOD",30);  // IN DAYS
 | |
| 
 | |
| /********************************
 | |
| SWEAT EQUITY / VOLUNTEER BENEFITS
 | |
| *********************************/
 | |
| // For example: 
 | |
| // The settings below are specific to Positive Spin Policies  
 | |
| // Calendar Year = January 1 .. December 31 (366 for leap years)
 | |
| /* 
 | |
| These hours can only be used to purchase used parts, bicycles and stand time. 
 | |
| 
 | |
| Volunteers may only purchase one bike with volunteer hours per calendar year.
 | |
| 
 | |
| If you would like to spend more than $100 in volunteer hours during a calendar year, 
 | |
| 75% of every dollar spent over $100 must be paid for with cash/credit card/check/etc 
 | |
| for volunteers who have volunteered fewer than 100 hours.  For volunteers who have 
 | |
| donated more than 100 hours of their time in the past 365 days, this match can be reduced to 50%.
 | |
| 
 | |
| (Sweat Equity / Volunteer Benefits can't be combined with Membership Benefits.)
 | |
| 
 | |
| */
 | |
| define("SWEAT_EQUITY_LIMIT",100);     // IN DOLLARS
 | |
| define("MAX_BIKE_EARNED",1);          // AMOUNT OF BIKES
 | |
| define("VOLUNTEER_HOUR_VALUE",8);	  // IN DOLLARS
 | |
| define("VOLUNTEER_DISCOUNT",25);      // PERCENTAGE
 | |
| define("SPECIAL_VOLUNTEER_HOURS_QUALIFICATION",100);  // IN HOURS
 | |
| define("SPECIAL_VOLUNTEER_DISCOUNT",50);              // PERCENTAGE
 | |
| 
 | |
| // Determines the behaviour of Bicycles (transaction_type_id) for volunteer to earn-a-bike purchases.
 | |
| // Keeping things equitable, if a patron decides to purchase a bike, rather than earning it, 
 | |
| // that counts to the EAB limit for the year.
 | |
| define("EARN_A_BIKE_LIMIT",1);
 | |
| 
 | |
| // Determine if stand time behaviour will be based on the SWEAT_EQUITY_LIMIT with discounts applied,
 | |
| // or 1 to 1 (1hr of volunteering === 1hr of free stand time) regardless of the SWEAT_EQUITY_LIMIT
 | |
| define("REDEEM_ONE_TO_ONE", true);
 | |
| 
 | |
| // Map transaction_type_id for transaction to benefits; 
 | |
| // Bicycles and Stand Time are special transaction types for volunteers, but they should still be mapped if benefits are desired.
 | |
| $transactions_with_volunteer_benefits = array( 	"Bicycles" => true,
 | |
| 																"Stand Time" => true,
 | |
| 																"Used Parts" => true
 | |
| 															);
 | |
| 
 | |
| // Volunteer benefits take priority over membership benefits if patron qualifies for both															
 | |
| $transactions_with_membership_benefits = array( "Stand Time" => true,
 | |
| 																"Used Parts" => true,
 | |
| 																"New Parts" => true,
 | |
| 																"Helmets" => true,
 | |
| 																"Cargo Related" => true,
 | |
| 																"Car Racks" => true
 | |
| 															 );
 | |
| 
 | |
| /*********
 | |
| BANNED IDS
 | |
| **********/				
 | |
| 
 | |
| // Ban those pesky individuals who continually refuse to follow policies and safer space agreements by contact_id
 | |
| $banned_individuals = array();
 | |
| 					
 | |
| /*******
 | |
| CONTACTS
 | |
| ********/
 | |
| 
 | |
| // Allow waiver (recommended) in Add/Edit Contacts; 1 = yes, 0 = no
 | |
| // Waiver text may be modified in Connections/waiver.txt
 | |
| define("WAIVER", 1);
 | |
| 
 | |
| define("WAIVER_LABEL","Waiver of Liability and Safer Spaces Agreement:");
 | |
| 
 | |
| // Allow email_list option in Add/Edit Contacts; 1 = yes, 0 = no 
 | |
| define("EMAIL_LIST", 1);
 | |
| 
 | |
| // Define a url for an email connector that will connect to an email list.
 | |
| // The url can be a server:port, program, etc.  
 | |
| // Name (First, Last), email address, subscription choice and connector password will be sent to the connector.
 | |
| //
 | |
| // The purpose of email connectors is to provide autonomy in the choice
 | |
| // of email services and programs.  E.g. mailman, googlegroups
 | |
| // See ./examples for an example mailman connector
 | |
| define("EMAIL_LIST_CONNECTOR","https://wvcompletestreets.org:9987");
 | |
| 
 | |
| // Define the password that is unique to the connector.
 | |
| define("EMAIL_LIST_CONNECTOR_PASSWORD","bikebike");
 | |
| 
 | |
| // If a self-signed ssl certificate that is associated with the email connector is being provided, 
 | |
| // designate an absolute path, if not, change to false.
 | |
| define("SSL_CERTIFICATE", "/var/www/html/examples/cert.pem");
 | |
| 
 | |
| //// "Volunteer Interest" form ////
 | |
| define("VOLUNTEER_INTEREST_FORM", true);
 | |
| 
 | |
| // Form name
 | |
| define("VOLUNTEER_INTEREST_FORM_NAME","Volunteer Interests");
 | |
| 
 | |
| // NOTE: Introductory text can be modified in Connections/volunteer_interest_form_introduction.txt
 | |
| 
 | |
| // Define volunteer interests:
 | |
| //
 | |
| //  You can add new interests to this array.  
 | |
| //  The order is kept as 3 columns, left to right.
 | |
| //
 | |
| //  If you want to delete or change the name of an interest, read instructions below carefully for
 | |
| //  "Delete an interest(s) name and "Change an interest(s) name"
 | |
| $volunteer_interests = array(	
 | |
| 									"Repairing Bikes", "Organizing Volunteers", "Serving as a Board Member",
 | |
| 									"Arranging Events", "Volunteering at Events", "Writing Grants/Fundraising",
 | |
| 									"Answering our Phone", "3D-printing", "Bicycle Valeting",		
 | |
| 									"Publicizing/Outreach", "Graphic Design", "Greeter at the Front Desk",
 | |
| 									"Accounting/Record Keeping", "Ordering parts/supplies", "Picking up Donated Bikes/Parts",
 | |
| 									"Teaching classes", "League Certified Instructor", "Pricing bikes",
 | |
| 									 "Fabricating", "Open Source Programming", "Other/Contact me for general help"
 | |
| 								);
 | |
| 								
 | |
| // Provide a comment box - true of false
 | |
| define("VOLUNTEER_INTEREST_COMMENTS", true);
 | |
| 
 | |
| // NOTE: The 2 variables ($volunteer_interest_changename & $volunteer_interests_deletename) 
 | |
| // below allow you to change or delete an interest.
 | |
| // Only uncomment one variable at a time, and follow the directions.
 | |
| 
 | |
| // Change an interest(s) name:
 | |
| //
 | |
| // 1.  Associate the name you want to change with a different name to the right as show below.
 | |
| //     In this example "League Certified Instructor" will become "LCI".
 | |
| //	2.  Change the interests name in $volunteer_interests above at the same time.  
 | |
| // 3.  Visit your own contact, e.g. contact_add_edit.php?contact_id=1 and click on the Submit button,
 | |
| //		 and the database will be updated.
 | |
| // 4.  Comment out //$volunteer_interests_changename
 | |
| //
 | |
| // $volunteer_interests_changename = array("League Certified Instructor" => "LCI");
 | |
| 
 | |
| // [BUGGY - don't use it] Delete an interest(s) name.  
 | |
| //
 | |
| // 1.  Add the interest(s) you want to delete. Please understand
 | |
| //     that by doing this you will delete the interest and all associated data.
 | |
| // 2.  Remove the interest from $volunteer_interests above at the same time before saving this page, 
 | |
| //     or it will be recreated.
 | |
| // 3.  Visit your own contact, e.g. contact_add_edit.php?contact_id=1 and click on the Submit button,
 | |
| //		 and the database will be updated.
 | |
| //
 | |
| //$volunteer_interests_deletename = array("LCI");
 | |
| 
 | |
| /***********
 | |
| TRANSACTIONS
 | |
| ************/
 | |
| 
 | |
| // User defined constants - read sql/populate.sql for an explanation
 | |
| define("STORAGE_PERIOD", 14);
 | |
| define("ACCOUNTING_GROUP", "Sales");
 | |
| define("DEFAULT_TRANSACTION_TYPE", "Sale - Used Parts");
 | |
| 
 | |
| // shop_user_role
 | |
| define("DEFAULT_SHOP_USER", "Stand Time");
 | |
| 
 | |
| /* Change Fund - A specific amount of money for the purpose of making change. 
 | |
|    The amount on hand should remain the same at all times; 
 | |
|    therefore a change funds does not require replenishment.
 | |
| */
 | |
| define("CHANGE_FUND", 20);
 | |
| 
 | |
| // How many hours should the shop be open from the time a person logins?  Hours display in pulldown in shop_log.php
 | |
| // No overtime for volunteers.  :)
 | |
| // shop will be current shop for the 24hr day yyyy-mm-dd (currently no check for hrs, only date)
 | |
| define("SHOP_HOURS_LENGTH", 10);  
 | |
| 
 | |
| // What minute interval should be displayed for list_time()? In other words, the time_in and time_out pulldown lists.
 | |
| // choose an interval that is divisible by 60 minutes, 1, 5, 15, 30 etc.
 | |
| define("LIST_MINUTE_INTERVAL", 1);
 | |
| 
 | |
| /* If you elect to keep records for non-shop hours, decide which shop should be used for that purpose.
 | |
|    The first shop created, 1, makes sense.  A link will show in start_shop.php.
 | |
| 	If you do not want this functionality at all, choose 0.   
 | |
| */
 | |
| define("NONSHOP", 0);
 | |
| 
 | |
| // How many transactions do you want shown by default
 | |
| define("NUMBER_OF_TRANSACTIONS", 11);
 | |
| 
 | |
| 
 | |
| // Define csv directory (see directions below for creating it)
 | |
| define("CSV_DIRECTORY","csv"); 
 | |
| 
 | |
| // Make a directory to store csv accounting files.  Currently used for GnuCash format.
 | |
| // Assuming the root of the website, and directory is called csv, and a Debian-based distribution:
 | |
| // mkdir csv
 | |
| // chown www-data:www-data csv 
 | |
| // chmod 0700 csv 
 | |
| 
 | |
| 
 | |
| // Define array mapping for Accounts.  Usually Asset Accounts since Income is generally the main type of transaction.
 | |
| // Currently there are four types of accounts with checking and credit being supported (working):  checking, credit, account_receivable, donation 
 | |
| // 	checking/credit = transaction has been 1) paid and is 2) cash & check [checking] or a credit card [credit] and 3) deposited
 | |
| //				note: checking type may include $0 transactions, e.g. earn-a-bike
 | |
| //	   account_receivable =  there is an 1). account receivable invoice and it has been 2) paid and 3) deposited
 | |
| //		donation = transaction that currently has no assessed monetary amount (NULL), 
 | |
| //					e.g. shop item giveaway or patron non-monetary donation
 | |
| //					note:  this is a hack for record keeping in an accounting program, and not recommended; 
 | |
| //					 bike donations/giveaways should be handled in a better way like using BikeBinder, 
 | |
| //					 an inventory system application,that may be tied into YBDB someday
 | |
| $gnucash_accounts = array(	"Assets:Current Assets:Checking Account" => "checking",
 | |
| 									"Assets:Current Assets:PayPal" => "credit",
 | |
| 									"Assets:Account Receivable" => "account_receivable",
 | |
| 									"Assets:Donations" => "donation"
 | |
| 								);
 | |
| 
 | |
| // Most collectives require only one shop at a time, but YBDB provides a way to handle 2 concurrent
 | |
| // shops at different locations using the same instance of software.  If this option is on, 
 | |
| // the current shop will still be shown, but users have the option of changing a transaction to the id 
 | |
| // of the other shop location whether it is concurrent or whether it a shop from the same location that 
 | |
| // happened at a previous time. 
 | |
| // 
 | |
| // Note: Remote shops function independently via their IP identification.
 | |
| //
 | |
| // Normally, you will want this set at 0.
 | |
| define('SHOW_SHOP_ID',0);
 | |
| 
 | |
| /*************
 | |
|  ETHERPAD LITE
 | |
| **************/
 | |
| // Allow comments/feedback/notes to be added per individual_history_log in reports,
 | |
| // and globally in shop_log.  An etherpad host has to be defined for this to work.  
 | |
| // See wiki for instructions on how to setup an etherpad docker instance.r
 | |
| //
 | |
| // prefix allows you to set a prefix to the name of the autogenerated padID:
 | |
| // etherpad = prefix + "pad_contact_id_" + contact_id;
 | |
| // etherpad_global = prefix_ + "global_pad"
 | |
| // See https://github.com/ether/etherpad-lite-jquery-plugin for information about other configurations.
 | |
| $etherpad = array(
 | |
| 	"host" => "",
 | |
| 	"userName" => "PositiveSpin",
 | |
| 	"noColors" => true,
 | |
| 	"height" => "75%",
 | |
| 	"plugins" => array()
 | |
| );
 | |
| 
 | |
| $etherpad_global = array(
 | |
| 	"host" => "",
 | |
| 	"userName" => "PositiveSpin",
 | |
| 	"noColors" => true,
 | |
| 	"height" => "100%",
 | |
| 	"plugins" => array()
 | |
| );
 | |
| 
 | |
| // END OF USER DEFINED CONFIGURATIONS
 | |
| 
 | |
| 
 | |
| if(file_exists( realpath($_SERVER["DOCUMENT_ROOT"]) . "/Connections/local_configurations.php")) {
 | |
| 	require('local_configurations.php');
 | |
| }
 | |
| 
 | |
| // other constants
 | |
| define("PAGE_START_SHOP", "/start_shop.php");
 | |
| define("PAGE_SHOP_LOG", "/shop_log.php");
 | |
| define("PAGE_EDIT_CONTACT", "/contact_add_edit.php");
 | |
| define("PAGE_SELECT_CONTACT", "/contact_add_edit_select.php");
 | |
| define("PAGE_SHOP_LOG_DELETE_VISIT", "/shop_log_delete_shopvisitid.php");
 | |
| define("INDIVIDUAL_HOURS_LOG", "/individual_hours_log.php");
 | |
| define("INDIVIDUAL_HISTORY_LOG", "/individual_history_log.php");
 | |
| define("PAGE_SALE_LOG", "/transaction_log.php");
 | |
| define("PAGE_EDIT_LOCATION", "/location_add_edit.php");
 | |
| define("PAGE_SELECT_LOCATION", "/location_add_edit_select.php");
 | |
| 
 | |
| //This is a general function to generate the contents of a list box based on a MySQL query.  All necessary parameters for the query are passed 
 | |
| function generate_list($querySQL,$list_value,$list_text, $form_name, $default_value, $color)
 | |
| {
 | |
| 	global $database_YBDB, $YBDB;
 | |
| 	mysql_select_db($database_YBDB, $YBDB);
 | |
| 	$recordset = mysql_query($querySQL, $YBDB) or die(mysql_error());
 | |
| 	$row_recordset = mysql_fetch_assoc($recordset);
 | |
| 	$totalRows_recordset = mysql_num_rows($recordset);
 | |
| 	$default_delimiter = '';
 | |
| 	
 | |
| 	// if a form name is supplied HTML listbox code is inserted
 | |
| 	if($form_name == "transaction_type" || $form_name == "gnucash_csv_year"){
 | |
| 		echo "<select class=\"yb_standard\" name=\"$form_name\">";
 | |
| 	} elseif($form_name <> "none"){ 
 | |
| 		echo "<select name=\"$form_name\">";	
 | |
| 	}
 | |
| 
 | |
| 	echo "\n";
 | |
| 	do { 
 | |
| 		if( $default_value == $row_recordset[$list_value]){ 
 | |
| 			$default_delimiter = 'selected="selected"';
 | |
| 		} else { $default_delimiter = '';}
 | |
| 		echo '<option style="color:' . $color . ';" value="' . $row_recordset[$list_value] . '" ' . $default_delimiter . '>' .
 | |
| 				$row_recordset[$list_text] . '</option>\n';		
 | |
| 		} while ($row_recordset = mysql_fetch_assoc($recordset));
 | |
|  	$rows = mysql_num_rows($recordset);
 | |
|  	if($rows > 0) {
 | |
|       mysql_data_seek($recordset, 0);
 | |
| 	  $row_recordset = mysql_fetch_assoc($recordset);
 | |
| 		}
 | |
| 	mysql_free_result($recordset);
 | |
| 	
 | |
| 	// if a form name is supplied HTML listbox code is inserted
 | |
| 	if($form_name <> "none"){echo "</select>";}
 | |
| }
 | |
| 
 | |
| 
 | |
| function list_CurrentShopUsers($form_name = "none", $default_value = "", $max_name_length = 20 ){
 | |
| 	$current_shop = current_shop_by_ip();
 | |
| 	$querySQL = "SELECT DISTINCT full_name, shop_hours.contact_id ,hidden FROM shop_hours
 | |
| 					LEFT JOIN (SELECT LEFT(CONCAT(last_name, ', ', first_name, ' ',middle_initial),$max_name_length)
 | |
| 					AS full_name, contact_id, hidden FROM contacts) as contacts ON shop_hours.contact_id=contacts.contact_id
 | |
| 					WHERE shop_hours.shop_id = $current_shop
 | |
| 					ORDER BY full_name;";
 | |
| 	$list_value = "contact_id";
 | |
| 	$list_text = "full_name";
 | |
| 	generate_list($querySQL,$list_value,$list_text,$form_name, $default_value);
 | |
| }
 | |
| 
 | |
| // #####################
 | |
| // Drop down list queries - functions below could be made into one function if query, $list_value and $list_text parameters were passed
 | |
| 
 | |
| // Function provides specific MySQL parameters to the function that generates the list box code
 | |
| function list_contacts($form_name = "none", $default_value = "", $max_name_length = 30 ){
 | |
| 	$querySQL = "SELECT LEFT(CONCAT(last_name, ', ', first_name, ' ',middle_initial),$max_name_length) AS full_name, contact_id, hidden FROM contacts WHERE (first_name <> '' OR last_name <> '') AND hidden <> 1 ORDER BY last_name, first_name, middle_initial";
 | |
| 	$list_value = "contact_id";
 | |
| 	$list_text = "full_name";
 | |
| 	generate_list($querySQL,$list_value,$list_text,$form_name, $default_value);
 | |
| }
 | |
| 
 | |
| 
 | |
| function list_coordinators($form_name = "none", $default_value = "", $max_name_length = 20 ){
 | |
| 	$querySQL = "SELECT LEFT(CONCAT(last_name, ', ', first_name, ' ',middle_initial),40) AS full_name, contacts.contact_id, hidden, shop_user_role FROM contacts
 | |
| LEFT JOIN (SELECT contact_id, shop_user_role, sales FROM shop_hours
 | |
| LEFT JOIN shop_user_roles ON shop_user_roles.shop_user_role_id = shop_hours.shop_user_role
 | |
| WHERE shop_user_roles.sales = 1 GROUP BY contact_id) as shop_hours ON shop_hours.contact_id=contacts.contact_id
 | |
| WHERE (first_name <> '' OR last_name <> '') AND hidden <> 1 AND shop_hours.sales  = 1
 | |
| GROUP BY contacts.contact_id
 | |
| ORDER BY last_name, first_name, middle_initial;";
 | |
| 	$list_value = "contact_id";
 | |
| 	$list_text = "full_name";
 | |
| 	generate_list($querySQL,$list_value,$list_text,$form_name, $default_value);
 | |
| }
 | |
| 
 | |
| function list_current_coordinators($form_name = "none", $default_value = "", $max_name_length = 20 ){
 | |
| 	$current_shop = current_shop_by_ip();
 | |
| 	$querySQL = "SELECT LEFT(CONCAT(last_name, ', ', first_name, ' ',middle_initial),40) AS full_name, contacts.contact_id, hidden, shop_user_role FROM contacts
 | |
| LEFT JOIN (SELECT contact_id, shop_user_role, sales FROM shop_hours LEFT JOIN shop_user_roles ON shop_user_roles.shop_user_role_id = shop_hours.shop_user_role WHERE shop_user_roles.sales = 1 AND shop_id = $current_shop GROUP BY contact_id) as shop_hours ON shop_hours.contact_id=contacts.contact_id
 | |
| WHERE (first_name <> '' OR last_name <> '') AND hidden <> 1 AND shop_hours.sales  = 1
 | |
| GROUP BY contacts.contact_id
 | |
| ORDER BY last_name, first_name, middle_initial;";
 | |
| 	$list_value = "contact_id";
 | |
| 	$list_text = "full_name";
 | |
| 	generate_list($querySQL,$list_value,$list_text,$form_name, $default_value);
 | |
| }
 | |
| 
 | |
| // Function provides specific MySQL parameters to the function that generates the list box code
 | |
| function list_projects($form_name = "none", $default_value = ""){
 | |
| 	$querySQL = "SELECT project_id FROM projects WHERE active = 1 AND public = 1 ORDER BY project_id";
 | |
| 	$list_value = "project_id";
 | |
| 	$list_text = "project_id";
 | |
| 	generate_list($querySQL,$list_value,$list_text,$form_name, $default_value);
 | |
| }
 | |
| 
 | |
| // Function provides specific MySQL parameters to the function that generates the list box code
 | |
| function list_projects_collective($form_name = "none", $default_value = ""){
 | |
| 	$querySQL = "SELECT project_id FROM projects WHERE active = 1 ORDER BY public DESC, project_id";
 | |
| 	$list_value = "project_id";
 | |
| 	$list_text = "project_id";
 | |
| 	generate_list($querySQL,$list_value,$list_text,$form_name, $default_value);
 | |
| }
 | |
| 
 | |
| // Function provides specific MySQL parameters to the function that generates the list box code
 | |
| function list_shop_types($form_name = "none", $default_value = ""){
 | |
| 	$querySQL = "SELECT shop_type_id FROM shop_types ORDER BY list_order;";
 | |
| 	$list_value = "shop_type_id";
 | |
| 	$list_text = "shop_type_id";
 | |
| 	generate_list($querySQL,$list_value,$list_text,$form_name, $default_value);
 | |
| }
 | |
| 
 | |
| // Function provides specific MySQL parameters to the function that generates the list box code
 | |
| function list_shop_user_roles($form_name = "none", $default_value = ""){
 | |
| 	$querySQL = "SELECT shop_user_role_id FROM shop_user_roles ORDER BY shop_user_role_id;";
 | |
| 	$list_value = "shop_user_role_id";
 | |
| 	$list_text = "shop_user_role_id";
 | |
| 	generate_list($querySQL,$list_value,$list_text,$form_name, $default_value);
 | |
| }
 | |
| 
 | |
| // Function provides specific MySQL parameters to the function that generates the list box code
 | |
| function list_shop_locations($form_name = "none", $default_value = ""){
 | |
| 	$querySQL = "SELECT shop_location_id FROM shop_locations WHERE active = 1 ORDER BY shop_location_id;";
 | |
| 	$list_value = "shop_location_id";
 | |
| 	$list_text = "shop_location_id";
 | |
| 	generate_list($querySQL,$list_value,$list_text,$form_name, $default_value);
 | |
| }
 | |
| 
 | |
| // Function provides specific MySQL parameters to the function that generates the list box code
 | |
| function list_transaction_types($form_name = "none", $default_value = ""){
 | |
| 	$querySQL = "SELECT transaction_type_id FROM transaction_types WHERE active = 1 ORDER BY rank + 0;";
 | |
| 	$list_value = "transaction_type_id";
 | |
| 	$list_text = "transaction_type_id";
 | |
| 	generate_list($querySQL,$list_value,$list_text,$form_name, $default_value);
 | |
| }
 | |
| 
 | |
| function list_donation_types($form_name = "none", $default_value = ""){
 | |
| 	$querySQL = "SELECT transaction_type_id FROM transaction_types WHERE community_bike = 1;";
 | |
| 	$list_value = "transaction_type_id";
 | |
| 	$list_text = "transaction_type_id";
 | |
| 	generate_list($querySQL,$list_value,$list_text,$form_name, $default_value);
 | |
| }
 | |
| 
 | |
| // now combined with list_CurrentShopUsers
 | |
| function list_donation_locations($form_name = "none", $default_value = "", $max_name_length = 20 ){
 | |
| 	$current_shop = current_shop_by_ip();
 | |
| 	$querySQL = "SELECT DISTINCT full_name, shop_hours.contact_id ,hidden FROM shop_hours
 | |
| 					LEFT JOIN (SELECT LEFT(CONCAT(last_name, ', ', first_name, ' ',middle_initial),$max_name_length)
 | |
| 					AS full_name, contact_id, hidden FROM contacts) as contacts ON shop_hours.contact_id=contacts.contact_id
 | |
| 					WHERE shop_hours.shop_id = $current_shop
 | |
| 					ORDER BY full_name;";
 | |
| 	$list_value = "contact_id";
 | |
| 	$list_text = "full_name";
 | |
| 	$color = "blue";
 | |
| 	generate_list($querySQL,$list_value,$list_text,$form_name, $default_value, $color);
 | |
| 
 | |
| 	$querySQL = "SELECT LEFT(CONCAT(last_name, ', ', first_name, ' ',middle_initial),$max_name_length) AS full_name, 
 | |
| 					location_name, contact_id FROM contacts WHERE location_type IS NULL ORDER BY location_name";
 | |
| 	$list_value = "contact_id";
 | |
| 	$list_text = "full_name";
 | |
| 	generate_list($querySQL,$list_value,$list_text,$form_name, $default_value);
 | |
| }
 | |
| 
 | |
| // Function provides specific MySQL parameters to the function that generates the list box code
 | |
| function list_distinct_shop_years($form_name = "none", $default_value = ""){
 | |
| 	$querySQL = "SELECT DISTINCT YEAR(date) AS date FROM shops WHERE date!='NULL' ORDER BY date DESC;";
 | |
| 	$list_value = "date";
 | |
| 	$list_text = "date";
 | |
| 	generate_list($querySQL,$list_value,$list_text,$form_name, $default_value);
 | |
| }
 | |
| 
 | |
| 
 | |
| function list_history($object) {
 | |
| /*	require_once('../php-console/src/PhpConsole/__autoload.php');
 | |
| 	$handler = PhpConsole\Handler::getInstance();
 | |
| 	$handler->start();
 | |
| 	$handler->debug($object);*/
 | |
| 	
 | |
| }
 | |
| 
 | |
| // #####################
 | |
| 
 | |
| // Date/Time functions
 | |
| function currency_format($value, $places = 2){
 | |
| 	echo "$ "; 
 | |
| 	if(is_null($value)) echo number_format(0,$places); 
 | |
| 	else echo number_format($value,$places);
 | |
| }
 | |
| 
 | |
| // function to set time zone in mysql.  
 | |
| // Time zones must be setup in mysql for this to work:  mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
 | |
| set_time_zone();
 | |
| function set_time_zone() {
 | |
| 	global $database_YBDB, $YBDB;	
 | |
| 	
 | |
| 	mysql_select_db($database_YBDB, $YBDB);
 | |
| 	$query = "SET time_zone='" . TIMEZONE . "';";
 | |
| 	$Recordset1 = mysql_query($query, $YBDB);
 | |
| 
 | |
| 	$error =	"<p>YBDB relies heavily on accurate time calculations.</p>" . 
 | |
| 		"<p>Make sure you have installed time zone support for mysql or mariadb as explained " .
 | |
| 		'<a href="https://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html">here</a>.<br> ' .
 | |
| 		"In GNU/Linux you run the mysql_tzinfo_to_sql program from the commandline:</p>" .
 | |
| 		"<code>mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql.</code>";	
 | |
| 		
 | |
| 	if(!$Recordset1) {
 | |
| 		 echo mysql_error() . "\n" . $error;	
 | |
| 	}	
 | |
| 	
 | |
| }
 | |
| 
 | |
| //function to convert server time to local time.  To be used by all other current date / time requests. 
 | |
| function local_datetime(){
 | |
| 	date_default_timezone_set(TIMEZONE); 
 | |
| 	return time();
 | |
| }
 | |
| 
 | |
| //function converts the current date/time into h:m am format 
 | |
| function current_datetime(){
 | |
| 	return date("Y-m-d H:i:s",local_datetime());
 | |
| }
 | |
| 
 | |
| //function converts the current date/time into YYYY-MM-DD am format 
 | |
| function current_date(){
 | |
| 	return date("Y-m-d",local_datetime());
 | |
| }
 | |
| 
 | |
| //function converts the current date/time into h:m am format 
 | |
| function date_to_time($date_in){
 | |
| 	list($date, $time) = split('[ ]', $date_in);
 | |
| 	list($H, $i, $s) = split('[:]', $time);
 | |
| 	$time_out = date("g:i a", mktime($H, $i, $s, 1,1,2000));
 | |
| 	return $time_out;
 | |
| }
 | |
| 
 | |
| //takes a date in and adds current time if date has changed
 | |
| function date_update_wo_timestamp($date_in, $database_date){
 | |
| 	list($date, $time) = split('[ ]', $database_date);
 | |
| 	$timestamp_out = (($date == $date_in) ? $database_date : $date_in);
 | |
| 	return $timestamp_out;
 | |
| }
 | |
| 
 | |
| function date_to_timestamp($date_in){
 | |
| 	list($date, $time) = split('[ ]', $start_time);
 | |
| 	list($Y, $m, $d) = split('[-]', $date);
 | |
| 	list($H, $i, $s) = split('[:]', $time);
 | |
| 	$time_out = mktime($H, $i, $s, $m, $d, $Y);
 | |
| 	return $time_out;
 | |
| }
 | |
| 
 | |
| //
 | |
| function datetime_to_time($date_in){
 | |
| 	list($date, $time) = split('[ ]', $date_in);
 | |
| 	list($H, $i, $s) = split('[:]', $time);
 | |
| 	$time_out = date("H:i:s", mktime($H, $i, $s, 1,1,2000));
 | |
| 	return $time_out;
 | |
| }
 | |
| 
 | |
| //
 | |
| function datetime_to_date($date_in){
 | |
| 	list($date, $time) = split('[ ]', $date_in);
 | |
| 	list($Y, $m, $d) = split('[-]', $date);
 | |
| 	$date_out = date("Y-m-d", mktime($H, $i, $s, $m,$d,$Y));
 | |
| 	return $date_out;
 | |
| }
 | |
| 
 | |
| // END Date/Time functions
 | |
| 
 | |
| //Function creates list box with times every 15 minutes for the specified number of hours
 | |
| function list_15min($start_time, $start_offset_min, $form_name, $hours, $display_elapsed_hours, $default_value){
 | |
| 	list($date, $time) = split('[ ]', $start_time);
 | |
| 	list($Y, $m, $d) = split('[-]', $date);
 | |
| 	list($H, $i, $s) = split('[:]', $time);
 | |
| 	//$min_inc is used to round round to nearest 15min
 | |
| 	$min_inc = 15 - intval($i) % 15;
 | |
| 	$start_tim15 = mktime($H, $i, 0, $m,$d,$Y) + $min_inc * 60 + $start_offset_min*60 ;
 | |
| 	//$start_time_am = date("H:i a", mktime($H, $i, $s, 1,1,2000));
 | |
| 	
 | |
| 	echo "<select name=\"$form_name\">";
 | |
| 	if($default_value <> "none"  && $default_value <> "0000-00-00 00:00:00"){
 | |
| 		//if a default value is requested it is displayed at the top of the list
 | |
| 		echo '<option value="' . $default_value . '">' . date_to_time($default_value) . '</option>';
 | |
| 	} 
 | |
| 	if (current_date() == $date) {
 | |
| 		// if current date does not match shop date current date will no be an option
 | |
| 		echo '<option value="current_time">Current Time</option>';
 | |
| 		echo '<option value="current_time">--------------------</option>';
 | |
| 	} 
 | |
| 	for ($j = 0; $j <= $hours*4; $j++) {
 | |
| 		$list_time_15 = $start_tim15 + $j*15*60;
 | |
| 		if ($display_elapsed_hours == 1) {
 | |
| 			$elapsed_hours = "   [" . date("G:i",mktime(0, 0, 0, 1,1,2000) + ($j+1)*15*60). " hrs]";
 | |
| 		} else { 
 | |
| 			$elapsed_hours = "";
 | |
| 		}
 | |
| 			
 | |
| 		$list_time_15_return = date("Y-m-d H:i:s", $list_time_15); 
 | |
| 		$list_time_15_display = date("g:i a", $list_time_15). $elapsed_hours;
 | |
|    		echo "<option value=\"". $list_time_15_return ."\">" . $list_time_15_display . "</option>";
 | |
| 	}
 | |
| 	echo "</select>";
 | |
| 	
 | |
| }
 | |
| 
 | |
| // replacement for the hardwired list_min15()
 | |
| // $start_time = time_in
 | |
| // $start_offset_min = 0
 | |
| // $form_name = time_out
 | |
| // $hours = 0
 | |
| // $display_elapsed_hours = 1
 | |
| // $default_value = $row_Recordset1['time_out']
 | |
| function list_min($start_time, $start_offset_min, $form_name, $hours, $display_elapsed_hours, $default_value, $min=15){
 | |
| 	list($date, $time) = split('[ ]', $start_time);
 | |
| 	list($Y, $m, $d) = split('[-]', $date);
 | |
| 	list($H, $i, $s) = split('[:]', $time);
 | |
| 	//$min_inc is used to round round to nearest 15min
 | |
| 	$min_inc = $min - intval($i) % $min;
 | |
| 	$start_time = mktime($H, $i, 0, $m,$d,$Y) + $min_inc * 60 + $start_offset_min*60 ;
 | |
| 	//$start_time_am = date("H:i a", mktime($H, $i, $s, 1,1,2000));
 | |
| 	
 | |
| 	echo "<select name=\"$form_name\">";
 | |
| 	if($default_value <> "none"  && $default_value <> "0000-00-00 00:00:00"){
 | |
| 		//if a default value is requested it is displayed at the top of the list
 | |
| 		echo '<option value="' . $default_value . '">' . date_to_time($default_value) . '</option>';
 | |
| 	} 
 | |
| 	if (current_date() == $date) {
 | |
| 		// if current date does not match shop date current date will no be an option
 | |
| 		echo '<option value="current_time">Current Time</option>';
 | |
| 		echo '<option value="current_time">--------------------</option>';
 | |
| 	} 
 | |
| 	for ($j = 0; $j <= $hours* (60 / $min); $j++) {
 | |
| 		$list_time = $start_time + $j*$min*60;
 | |
| 		if ($display_elapsed_hours == 1) {
 | |
| 			$elapsed_hours = "   [" . date("G:i",mktime(0, 0, 0, 1,1,2000) + ($j+1)*$min*60). " hrs]";
 | |
| 		} else { 
 | |
| 			$elapsed_hours = "";
 | |
| 		}
 | |
| 			
 | |
| 		$list_time_return = date("Y-m-d H:i:s", $list_time); 
 | |
| 		$list_time_display = date("g:i a", $list_time). $elapsed_hours;
 | |
|    		echo "<option value=\"". $list_time_return ."\">" . $list_time_display . "</option>";
 | |
| 	}
 | |
| 	echo "</select>";
 | |
| 	
 | |
| }
 | |
| 
 | |
| function list_time($time_list_start, $time, $form_name = "none", $start_offset_min = 0 , $display_elapsed_hours = 0, $default_value = "none", $hours_listed = 8, $et = ""){
 | |
| 	if($time == "0000-00-00 00:00:00" || $default_value <> "none"){
 | |
| 		//create drop down
 | |
| 		//echo list_15min("0000-00-00 01:20:00", 4, "frm_time_out" );
 | |
| 		echo list_min($time_list_start,$start_offset_min, $form_name, $hours_listed, $display_elapsed_hours, $default_value, LIST_MINUTE_INTERVAL);
 | |
| 	} else {
 | |
| 		//list time out
 | |
| 		echo date_to_time($time) . "  [{$et} hrs]";
 | |
| 	}
 | |
| 
 | |
| }
 | |
| 
 | |
| function sign_out($time_out, $first_name){
 | |
| 	if($time_out == "0000-00-00 00:00:00"){
 | |
| 		echo '<input type="submit" name="submit" class="sign_out" value="Sign Out: ' . $first_name . '" />';
 | |
| 	}
 | |
| }
 | |
| 
 | |
| //This function corrects the datatype for form submitted variables 
 | |
| function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
 | |
| {
 | |
|   $theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;
 | |
| 
 | |
|   switch ($theType) {
 | |
|     case "text":
 | |
|       $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
 | |
|       break;    
 | |
|     case "long":
 | |
|     case "int":
 | |
|       $theValue = ($theValue != "") ? intval($theValue) : "NULL";
 | |
|       break;
 | |
|     case "double":
 | |
|       $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
 | |
|       break;
 | |
|     case "date":
 | |
|       if(($theValue == 'current_time') || ($theValue == 'Current Date')){
 | |
| 	  	$theValue = current_datetime();
 | |
| 	  }
 | |
| 	  
 | |
| 	  $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
 | |
|       break;
 | |
|     case "defined":
 | |
|       $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
 | |
|       break;
 | |
|   }
 | |
|   return $theValue;
 | |
| }
 | |
| 
 | |
| function dateandtimein($date, $time){ 
 | |
|   if ($time <> 'current_time'){
 | |
|   	$time = $date . ' ' . datetime_to_time($time); 
 | |
|   }
 | |
|   return $time;
 | |
| }
 | |
| 
 | |
| 
 | |
| // Drop-Down lists
 | |
| 
 | |
| function list_contacts_edit_add($form_name = "contact_id", $default_value = "")
 | |
| {
 | |
| 	echo "<select name={$form_name} class='yb_standard'>\n";
 | |
| 	echo "<option value='new_contact'>Add New Contact</option>\n";
 | |
| 	echo "<option value='new_contact'>--------------</option>";
 | |
| 	list_contacts("none",$default_value);	
 | |
| 	echo "</select>\n";
 | |
| }
 | |
| 
 | |
| function list_contacts_select_user($form_name = "contact_id", $default_value = "")
 | |
| {
 | |
| 	echo "<select name={$form_name} class='yb_standard'>\n";
 | |
| 	echo "<option value='no_selection'>Select Yourself<section></section></option>\n";
 | |
| 	echo "<option value='no_selection'>--------------</option>";
 | |
| 	list_contacts("none",$default_value);	
 | |
| 	echo "</select>\n";
 | |
| }
 | |
| 
 | |
| function list_CurrentShopUsers_select($form_name = "contact_id", $default_value = "")
 | |
| {
 | |
| 	echo "<select name={$form_name} class='yb_standard'>\n";
 | |
| 	echo "<option value='no_selection'>Select Patron</option>\n";
 | |
| 	echo "<option value='no_selection'>--------------</option>";
 | |
| 	list_CurrentShopUsers("none",$default_value);	
 | |
| 	echo "</select>\n";
 | |
| }
 | |
| 
 | |
| function list_contacts_YBP_project($form_name = "contact_id", $default_value = "")
 | |
| {
 | |
| 	echo "<select name={$form_name} class='yb_standard'>\n";
 | |
| 	echo "<option value='1269'>Yellow Bike Project</option>\n";
 | |
| 	echo "<option value='no_selection'>--------------</option>";
 | |
| 	list_contacts("none",$default_value);	
 | |
| 	echo "</select>\n";
 | |
| }
 | |
| 
 | |
| 	function list_contacts_coordinators($form_name = "coordinator_id", $default_value = "")
 | |
| {
 | |
| 	echo "<select name={$form_name} class='yb_standard'>\n";
 | |
| 	echo "<option value='no_selection'>Select Coordinator</option>\n";
 | |
| 	echo "<option value='no_selection'>--------------</option>";
 | |
| 	list_coordinators("none",$default_value);	
 | |
| 	echo "</select>\n";
 | |
| }
 | |
| 
 | |
| 	function list_current_coordinators_select($form_name = "coordinator_id", $default_value = "")
 | |
| {
 | |
| 	echo "<select name={$form_name} class='yb_standard'>\n";
 | |
| 	echo "<option value='no_selection'>Select Coordinator</option>\n";
 | |
| 	echo "<option value='no_selection'>--------------</option>";
 | |
| 	list_current_coordinators("none",$default_value);	
 | |
| 	echo "</select>\n";
 | |
| }
 | |
| 
 | |
| 	function list_donation_locations_withheader($form_name = "coordinator_id", $default_value = "")
 | |
| {
 | |
| 	echo "<select name={$form_name} class='yb_standard'>\n";
 | |
| 	echo "<option value='no_selection'>Select Patron</option>\n";
 | |
| 	echo "<option value='no_selection'>--------------</option>";
 | |
| 	list_donation_locations("none",$default_value);	
 | |
| 	echo "</select>\n";
 | |
| }
 | |
| 
 | |
| function list_donation_locations_edit_add($form_name = "contact_id", $default_value = "")
 | |
| {
 | |
| 	echo "<select name={$form_name} class='yb_standard'>\n";
 | |
| 	echo "<option value='new_contact'>Add New Location</option>\n";
 | |
| 	echo "<option value='new_contact'>--------------</option>";
 | |
| 	list_donation_locations("none",$default_value);	
 | |
| 	echo "</select>\n";
 | |
| }
 | |
| 
 | |
| 	function list_transaction_types_withheader($form_name = "transaction_types", $default_value = "")
 | |
| {
 | |
| 	echo "<select name={$form_name} class='yb_standard'>\n";
 | |
| 	echo "<option value='all_types'>All Types</option>\n";
 | |
| 	echo "<option value='all_types'>--------------</option>";
 | |
| 	list_transaction_types("none",$default_value);	
 | |
| 	echo "</select>\n";
 | |
| }
 | |
| 
 | |
| function list_yes_no($form_name = "list_yes_no", $default_value = 0)
 | |
| {
 | |
| 	if ($default_value == 1){
 | |
| 		$select_yes = 'selected="selected"';
 | |
| 		$select_no = '';
 | |
| 	} else {
 | |
| 		$select_yes = '';
 | |
| 		$select_no = 'selected="selected"';
 | |
| 	}
 | |
| 	
 | |
| 	echo "<select name={$form_name} class='yb_standard'>\n";
 | |
| 	echo "<option value='1'". $select_yes .">Yes</option>\n";
 | |
| 	echo "<option value='0'". $select_no .">No</option>";	
 | |
| 	echo "</select>\n";
 | |
| }
 | |
| 
 | |
| // END Drop-Down lists
 | |
| 
 | |
| function max_shop_id(){
 | |
| 	global $database_YBDB, $YBDB;	
 | |
|     
 | |
| 	mysql_select_db($database_YBDB, $YBDB);
 | |
| 	$query_Recordset1 = "SELECT max(shop_id) as shop_id FROM shops;";
 | |
| 	$Recordset1 = mysql_query($query_Recordset1, $YBDB) or die(mysql_error());
 | |
| 	$row_Recordset1 = mysql_fetch_assoc($Recordset1);
 | |
| 	$totalRows_Recordset1 = mysql_num_rows($Recordset1);
 | |
| 	return $row_Recordset1['shop_id'];
 | |
| }
 | |
| 
 | |
| // Is there currently a shop?
 | |
| function current_shop_by_ip(){
 | |
| 	global $database_YBDB, $YBDB;
 | |
| 	$IP = $_SERVER['REMOTE_ADDR'];
 | |
| 	$current_date = current_date();
 | |
| 	
 | |
| 	mysql_select_db($database_YBDB, $YBDB);
 | |
| 	$query_Recordset1 = "SELECT shop_id FROM shops WHERE ip_address = '{$IP}' AND date REGEXP '^{$current_date} ' ORDER BY shop_id DESC;";
 | |
| 	$Recordset1 = mysql_query($query_Recordset1, $YBDB) or die(mysql_error());
 | |
| 	$row_Recordset1 = mysql_fetch_assoc($Recordset1);   
 | |
| 	$totalRows_Recordset1 = mysql_num_rows($Recordset1);
 | |
| 	return $row_Recordset1['shop_id'];
 | |
| }
 | |
| 
 | |
| 
 | |
| ?>
 |