/** * Add a record of the purchase to the DB * * @param array $products Product Id(s) of Product(s) purchased * @param array $quantity Quantity of products purchases * @param array $paypal_data IPN POST variables * @todo implemente physical item vs. download, reflected in 'status' */ function handlePurchase($products, $quantity, $paypal_data, $product_name) { global $_TABLES, $_CONF, $_PAY_CONF, $LANG_PAYPAL_EMAIL; // initialize file and names arrays $files = array(); $names = array(); $oldids = $products; $products = PAYPAL_realId($products); // for each item purchased, record purchase in purchase table for ($i = 0; $i < count($products); $i++) { if (DEBUG) { COM_errorLog('PAYPAL-IPN: Product id:' . $products[$i]); } // grab relevant product data from product table to insert into purchase table. $sql = "SELECT * FROM {$_TABLES['paypal_products']} " . "WHERE id = '{$products[$i]}'"; $res = DB_query($sql); $A = DB_fetchArray($res); if (DEBUG) { COM_errorLog('PAYPAL-IPN: Type: ' . $A['type']); } if ($A['download'] > 0) { $files[] = $_PAY_CONF['download_path'] . $A['file']; } //TODO + attribute name // Set quantity to one if empty if ($quantity[$i] == '') { $quantity[$i] = 1; } $names[] = $product_name[$i] . ' x ' . $quantity[$i]; // Do record anonymous users in purchase table //TODO record product name + product_id with attribute if (is_numeric((int) $paypal_data['custom']) && (int) $paypal_data['custom'] > 0) { // Add the purchase to the paypal purchase table $sql = "INSERT INTO {$_TABLES['paypal_purchases']} SET product_id = '{$products[$i]}', " . "quantity = '{$quantity[$i]}', user_id = '{$paypal_data['custom']}', " . "txn_id = '{$paypal_data['txn_id']}', " . 'purchase_date = NOW(), status = \'complete\''; /** * @todo implemente physical item vs. download, reflected in 'status' */ // if physical item (aka, must be shipped) status = 'pending', otherwise 'complete' //if ( $physical == 1 ) { // $sql .= ", status = 'pending'"; //} else { // $sql .= ", status = 'complete'"; //} // add an expiration date if appropriate if (is_numeric($A['expiration']) && $A['type'] == 'product') { $sql .= ", expiration = DATE_ADD(NOW(), INTERVAL {$A['expiration']} DAY)"; } if (DEBUG) { COM_errorLog('PAYPAL-IPN: ' . $sql); } DB_query($sql); if (DEBUG) { COM_errorLog('PAYPAL-IPN: Purchase recorded'); } } // stock movement $stock_id = PAYPAL_getStockId($oldids[$i]); $qty = $quantity[$i]; PAYPAL_stockMovement($stock_id, $oldids[$i], -$qty); } // Update user details if empty user_id, user_name, user_contact, user_proid, user_street1, user_street2, user_postal, user_city, user_country, user_phone1, user_phone2, user_fax, status $fields = array('user_name' => $paypal_data['address_name'], 'user_contact' => $paypal_data['first_name'] . ' ' . $paypal_data['last_name'], 'user_street1' => $paypal_data['address_street'], 'user_postal' => $paypal_data['address_zip'], 'user_city' => $paypal_data['address_city'], 'user_country' => $paypal_data['address_country']); if (is_numeric((int) $paypal_data['custom']) && (int) $paypal_data['custom'] != 1) { PAYPAL_updateUserDetails((int) $paypal_data['custom'], $fields, true); } // Send the purchaser a confirmation email (if set to do so in config) if (is_numeric((int) $paypal_data['custom']) && (int) $paypal_data['custom'] != 1 && $_PAY_CONF['purchase_email_user'] || (!is_numeric($paypal_data['custom']) || (int) $paypal_data['custom'] == 1) && $_PAY_CONF['purchase_email_anon']) { // setup templates $message = new Template($_CONF['path'] . 'plugins/paypal/templates'); $message->set_file(array('subject' => 'purchase_email_subject.txt', 'message' => 'purchase_email_message.txt')); // site variables $message->set_var('site_url', $_CONF['site_url']); $message->set_var('site_name', $_CONF['site_name']); //Email subject $message->set_var('purchase_receipt', $LANG_PAYPAL_EMAIL['purchase_receipt']); // list of product names for ($i = 0; $i < count($products); $i++) { $li_products .= '<li>' . $names[$i]; } $message->set_var('products', $li_products); //Email messages $message->set_var('thank_you', $LANG_PAYPAL_EMAIL['thank_you']); $message->set_var('thanks', $LANG_PAYPAL_EMAIL['thanks']); // paypal details $message->set_var('payment_gross', $paypal_data['payment_gross']); $message->set_var('tax', $paypal_data['tax']); $message->set_var('shipping', $paypal_data['mc_shipping']); $message->set_var('handling', $paypal_data['mc_handling']); $message->set_var('payment_date', $paypal_data['payment_date']); $message->set_var('payer_email', $paypal_data['payer_email']); $message->set_var('first_name', $paypal_data['first_name']); $message->set_var('last_name', $paypal_data['last_name']); $subject = trim($message->parse('output', 'subject')); // if specified to mail attachment, do so, otherwise skip attachment if ((is_numeric((int) $paypal_data['custom']) && (int) $paypal_data['custom'] != 1 && $_PAY_CONF['purchase_email_user_attach'] || (!is_numeric((int) $paypal_data['custom']) || (int) $paypal_data['custom'] == 1) && $_PAY_CONF['purchase_email_anon_attach']) && count($files) > 0) { $message->set_var('attached_files', $LANG_PAYPAL_EMAIL['attached_files']); $text = $message->parse('output', 'message'); paypal_mailAttachment($paypal_data['payer_email'], $subject, $text, $files, $_PAY_CONF['receiverEmailAddr']); } else { if (count($files) > 0) { $message->set_var('attached_files', $LANG_PAYPAL_EMAIL['download_files']); } else { $message->set_var('attached_files', ''); } $text = $message->parse('output', 'message'); COM_mail($paypal_data['payer_email'], $subject, $text, $_PAY_CONF['receiverEmailAddr'], true); } if (DEBUG) { COM_errorLog('PAYPAL-IPN: Email was sent'); } } //Send email to receiver COM_mail($_PAY_CONF['receiverEmailAddr'], $subject, $subject . ' >> ' . $text, $_PAY_CONF['receiverEmailAddr'], true); //Subscription if ($A['type'] == 'subscription') { //add subscription to db PAYPAL_addsubscription($A, $paypal_data); if (DEBUG) { COM_errorLog('PAYPAL-IPN: Subscription recorded'); } //add user to group if ($A['add_to_group'] > 1 && (int) $paypal_data['custom'] > 1) { PAYPAL_addToGroup($A['add_to_group'], $paypal_data['custom']); if (DEBUG) { COM_errorLog('PAYPAL-IPN: User with UID ' . $paypal_data['custom'] . ' added to group ID ' . $A['add_to_group']); } } } }
function paypal_upgrade() { global $_CONF, $_TABLES, $_USER, $_DB_dbms, $LANG_PAYPAL_1, $_PAY_CONF; $currentVersion = DB_getItem($_TABLES['plugins'], 'pi_version', "pi_name = 'paypal'"); $code_version = plugin_chkVersion_paypal(); if ($currentVersion == $code_version) { // nothing to do return true; } require_once $_CONF['path'] . 'plugins/paypal/autoinstall.php'; require_once $_CONF['path'] . 'plugins/paypal/install_defaults.php'; require_once $_CONF['path_system'] . 'classes/config.class.php'; if (!plugin_compatible_with_this_version_paypal('paypal')) { return 3002; } // other update code goes here switch ($currentVersion) { case '0.1rc1': case '0.1': case '0.1.1': case '0.2': DB_query("UPDATE {$_TABLES['plugins']} SET pi_homepage='http://geeklog.fr' WHERE pi_name='paypal", 1); case '1.0': $c = config::get_instance(); //This is main subgroup #0 $c->add('sg_main', NULL, 'subgroup', 0, 0, NULL, 0, true, 'paypal'); //Main settings $c->add('fs_main', NULL, 'fieldset', 0, 0, NULL, 0, true, 'paypal'); $c->add('paypal_folder', $_PAY_DEFAULT['paypal_folder'], 'text', 0, 0, 0, 1, true, 'paypal'); $c->add('menulabel', $_PAY_DEFAULT['menulabel'], 'text', 0, 0, 0, 2, true, 'paypal'); $c->add('paypal_login_required', $_PAY_DEFAULT['paypal_login_required'], 'select', 0, 0, 3, 12, true, 'paypal'); $c->add('hide_paypal_menu', $_PAY_DEFAULT['hide_paypal_menu'], 'select', 0, 0, 3, 13, true, 'paypal'); $c->add('paypalURL', $_PAY_DEFAULT['paypalURL'], 'text', 0, 0, 0, 23, true, 'paypal'); $c->add('receiverEmailAddr', $_PAY_DEFAULT['receiverEmailAddr'], 'text', 0, 0, 0, 24, true, 'paypal'); $c->add('currency', $_PAY_DEFAULT['currency'], 'select', 0, 0, 20, 33, true, 'paypal'); $c->add('anonymous_buy', $_PAY_DEFAULT['anonymous_buy'], 'select', 0, 0, 3, 35, true, 'paypal'); $c->add('purchase_email_user', $_PAY_DEFAULT['purchase_email_user'], 'select', 0, 0, 3, 47, true, 'paypal'); $c->add('purchase_email_user_attach', $_PAY_DEFAULT['purchase_email_user_attach'], 'select', 0, 0, 3, 49, true, 'paypal'); $c->add('purchase_email_anon', $_PAY_DEFAULT['purchase_email_anon'], 'select', 0, 0, 3, 51, true, 'paypal'); $c->add('purchase_email_anon_attach', $_PAY_DEFAULT['purchase_email_anon_attach'], 'select', 0, 0, 3, 53, true, 'paypal'); $c->add('maxPerPage', $_PAY_DEFAULT['maxPerPage'], 'text', 0, 0, 0, 63, true, 'paypal'); $c->add('categoryColumns', $_PAY_DEFAULT['categoryColumns'], 'text', 0, 0, 0, 65, true, 'paypal'); //images $c->add('fs_images', NULL, 'fieldset', 0, 1, NULL, 0, true, 'paypal'); $c->add('max_images_per_products', $_PAY_DEFAULT['max_images_per_products'], 'text', 0, 1, 0, 1, true, 'paypal'); $c->add('max_image_width', $_PAY_DEFAULT['max_image_width'], 'text', 0, 1, 0, 2, true, 'paypal'); $c->add('max_image_height', $_PAY_DEFAULT['max_image_height'], 'text', 0, 1, 0, 3, true, 'paypal'); $c->add('max_image_size', $_PAY_DEFAULT['max_image_size'], 'text', 0, 1, 0, 4, true, 'paypal'); $c->add('max_thumbnail_size', $_PAY_DEFAULT['max_thumbnail_size'], 'text', 0, 1, 0, 5, true, 'paypal'); //This is display subgroup #1 $c->add('sg_display', NULL, 'subgroup', 1, 0, NULL, 0, true, 'paypal'); // Display settings $c->add('fs_display', NULL, 'fieldset', 1, 8, NULL, 0, true, 'paypal'); $c->add('paypal_main_header', NULL, 'text', 1, 8, 0, 2, true, 'paypal'); $c->add('paypal_main_footer', NULL, 'text', 1, 8, 0, 4, true, 'paypal'); DB_query("CREATE TABLE {$_TABLES['paypal_downloads']} (\n id int auto_increment,\n product_id int NOT NULL,\n file varchar(255),\n PRIMARY KEY (id)\n\t ) ENGINE=MyISAM\n\t ", 1); DB_query("CREATE TABLE {$_TABLES['paypal_images']} (\n pi_pid varchar(40) NOT NULL,\n pi_img_num tinyint(2) unsigned NOT NULL,\n pi_filename varchar(128) NOT NULL,\n PRIMARY KEY (pi_pid,pi_img_num)\n\t ) ENGINE=MyISAM\n\t ", 1); DB_query("ALTER TABLE {$_TABLES['paypal_products']}\n DROP small_pic, \n DROP picture, \n\t\t ADD logged tinyint(1) default '0'\n\t\t ", 1); DB_query("INSERT INTO {$_TABLES['blocks']} (is_enabled, name, type, title, tid, blockorder, content, onleft, phpblockfn, owner_id, group_id, perm_owner, perm_group) VALUES (1,'cart_block','phpblock','Cart','all',1,'',0,'phpblock_paypal_cart',{$_USER['uid']},4,3,3)", 1); case '1.1': case '1.1.1': DB_query("ALTER TABLE {$_TABLES['paypal_products']}\n\t\t ADD hits mediumint(8) unsigned NOT NULL default '0', \n\t\t ADD hidden tinyint(1) default '0'\n\t\t ", 1); case '1.1.2': $c = config::get_instance(); $c->add('thumb_width', $_PAY_DEFAULT['thumb_width'], 'text', 0, 1, 0, 10, true, 'paypal'); $c->add('thumb_height', $_PAY_DEFAULT['thumb_height'], 'text', 0, 1, 0, 11, true, 'paypal'); $c->add('products_col', $_PAY_DEFAULT['products_col'], 'select', 1, 8, 21, 10, true, 'paypal'); DB_query("ALTER TABLE {$_TABLES['paypal_products']}\n\t\t ADD active tinyint(1) default '1'\n\t\t ", 1); case '1.1.3': DB_query("ALTER TABLE {$_TABLES['paypal_downloads']}\n\t\t ADD dl_date datetime,\n\t\t ADD user_id int NOT NULL\n\t\t ", 1); case '1.1.4': DB_query("CREATE TABLE {$_TABLES['paypal_subscriptions']} (\n id int(11) auto_increment,\n product_id int NOT NULL,\n user_id int NOT NULL,\n txn_id varchar(255),\n purchase_date datetime,\n expiration datetime,\n price decimal(12,2) unsigned,\n status varchar(12),\n add_to_group int(5) default NULL,\n notification tinyint(1) unsigned NOT NULL default '0',\n PRIMARY KEY (id)\n\t ) ENGINE=MyISAM\n\t "); DB_query("ALTER TABLE {$_TABLES['paypal_products']}\n\t\t ADD type varchar(15) default 'product' AFTER id,\n\t\t\tADD item_id varchar(40) NOT NULL AFTER type,\n\t\t\tADD show_in_blocks tinyint(1) unsigned default '1',\n\t\t\tADD duration int(5) default NULL,\n ADD duration_type varchar(10) NOT NULL default 'month',\n ADD add_to_group int(5) default NULL\n\t\t "); DB_query("INSERT INTO {$_TABLES['blocks']} (is_enabled, name, type, title, tid, blockorder, content, onleft, phpblockfn, owner_id, group_id, perm_owner, perm_group) VALUES (1,'paypal_randomBlock','phpblock','Random product','all',1,'',0,'phpblock_paypal_randomBlock',{$_USER['uid']},#group#,3,3)"); $c->add('sg_myshop', NULL, 'subgroup', 2, 0, NULL, 0, true, 'paypal'); $c->add('fs_shopdetails', NULL, 'fieldset', 2, 20, NULL, 0, true, 'paypal'); $c->add('shop_name', NULL, 'text', 2, 20, 0, 2, true, 'paypal'); $c->add('shop_street1', NULL, 'text', 2, 20, 0, 4, true, 'paypal'); $c->add('shop_street2', NULL, 'text', 2, 20, 0, 5, true, 'paypal'); $c->add('shop_postal', NULL, 'text', 2, 20, 0, 6, true, 'paypal'); $c->add('shop_city', NULL, 'text', 2, 20, 0, 8, true, 'paypal'); $c->add('shop_country', NULL, 'text', 2, 20, 0, 9, true, 'paypal'); $c->add('shop_siret', NULL, 'text', 2, 20, 0, 10, true, 'paypal'); $c->add('shop_phone1', NULL, 'text', 2, 20, 0, 12, true, 'paypal'); $c->add('shop_phone2', NULL, 'text', 2, 20, 0, 14, true, 'paypal'); $c->add('shop_fax', NULL, 'text', 2, 20, 0, 16, true, 'paypal'); DB_query("CREATE TABLE {$_TABLES['paypal_users']} (\n user_id mediumint(8) unsigned NOT NULL,\n user_name VARCHAR(80) default NULL,\n\t user_contact VARCHAR(80) default NULL,\n\t user_proid VARCHAR(20) default NULL,\n\t user_street1 VARCHAR(50) default NULL,\n\t user_street2 VARCHAR(50) default NULL,\n user_postal VARCHAR(20) default NULL,\n user_city VARCHAR(30) default NULL,\n\t user_country VARCHAR(30) default NULL,\n\t user_phone1 varchar(20) default NULL,\n\t user_phone2 varchar(20) default NULL,\n\t user_fax varchar(20) default NULL,\n status tinyint(1) DEFAULT '0',\n PRIMARY KEY (user_id)\n ) ENGINE=MyISAM\n "); $c->add('fs_checkoutpage', NULL, 'fieldset', 1, 10, NULL, 0, true, 'paypal'); $c->add('image_url', NULL, 'text', 1, 10, 0, 2, true, 'paypal'); $c->add('cpp_header_image', NULL, 'text', 1, 10, 0, 4, true, 'paypal'); $c->add('cpp_headerback_color', NULL, 'text', 1, 10, 0, 6, true, 'paypal'); $c->add('cpp_headerborder_color', NULL, 'text', 1, 10, 0, 8, true, 'paypal'); $c->add('cpp_payflow_color', NULL, 'text', 1, 10, 0, 10, true, 'paypal'); $c->add('cs', 0, 'select', 1, 10, 22, 12, true, 'paypal'); DB_query("ALTER TABLE {$_TABLES['paypal_products']}\n ADD owner_id mediumint(8) unsigned NOT NULL default '2',\n ADD group_id mediumint(8) unsigned NOT NULL default '1',\n ADD perm_owner tinyint(1) unsigned NOT NULL default '3',\n ADD perm_group tinyint(1) unsigned NOT NULL default '2',\n ADD perm_members tinyint(1) unsigned NOT NULL default '2',\n ADD perm_anon tinyint(1) unsigned NOT NULL default '2'\n "); $c->add('fs_permissions', NULL, 'fieldset', 0, 2, NULL, 0, true, 'paypal'); $c->add('default_permissions', $_PAY_DEFAULT['default_permissions'], '@select', 0, 2, 12, 10, true, 'paypal'); $c->add('site_name', $_PAY_DEFAULT['site_name'], 'text', 0, 0, 0, 7, true, 'paypal'); $c->add('order', $_PAY_DEFAULT['order'], 'select', 1, 8, 23, 15, true, 'paypal'); $c->add('view_membership', $_PAY_DEFAULT['view_membership'], 'select', 1, 8, 3, 20, true, 'paypal'); $c->add('view_review', $_PAY_DEFAULT['view_review'], 'select', 1, 8, 3, 25, true, 'paypal'); $c->add('display_2nd_buttons', $_PAY_DEFAULT['display_2nd_buttons'], 'select', 1, 8, 3, 35, true, 'paypal'); case '1.2.1': $c = config::get_instance(); $c->add('display_blocks', '3', 'select', 1, 8, 24, 45, true, 'paypal'); $c->add('display_item_id', '0', 'select', 1, 8, 3, 55, true, 'paypal'); $c->add('display_complete_memberships', '0', 'select', 1, 8, 3, 22, true, 'paypal'); $c->add('enable_pay_by_ckeck', 0, 'select', 0, 0, 3, 70, true, 'paypal'); $c->add('enable_buy_now', 1, 'select', 0, 0, 3, 80, true, 'paypal'); $c->del('site_name', 'paypal'); $_PAY_CONF_OLD = $c->get_config('paypal'); //move images settings $c->del('fs_images', 'paypal'); $c->del('max_images_per_products', 'paypal'); $c->del('max_image_width', 'paypal'); $c->del('max_image_height', 'paypal'); $c->del('max_image_size', 'paypal'); $c->del('max_thumbnail_size', 'paypal'); $c->del('thumb_width', 'paypal'); $c->del('thumb_height', 'paypal'); $c->del('maxPerPage', 'paypal'); $c->del('categoryColumns', 'paypal'); $c->add('fs_images', NULL, 'fieldset', 1, 9, NULL, 0, true, 'paypal'); $c->add('max_images_per_products', $_PAY_CONF_OLD['max_images_per_products'], 'text', 1, 9, 0, 1, true, 'paypal'); $c->add('max_image_width', $_PAY_CONF_OLD['max_image_width'], 'text', 1, 9, 0, 2, true, 'paypal'); $c->add('max_image_height', $_PAY_CONF_OLD['max_image_height'], 'text', 1, 9, 0, 3, true, 'paypal'); $c->add('max_image_size', $_PAY_CONF_OLD['max_image_size'], 'text', 1, 9, 0, 4, true, 'paypal'); $c->add('max_thumbnail_size', $_PAY_CONF_OLD['max_thumbnail_size'], 'text', 1, 9, 0, 5, true, 'paypal'); $c->add('thumb_width', $_PAY_CONF_OLD['thumb_width'], 'text', 1, 9, 0, 10, true, 'paypal'); $c->add('thumb_height', $_PAY_CONF_OLD['thumb_height'], 'text', 1, 9, 0, 11, true, 'paypal'); $c->add('maxPerPage', $_PAY_CONF_OLD['maxPerPage'], 'text', 1, 9, 0, 20, true, 'paypal'); $c->add('categoryColumns', $_PAY_CONF_OLD['categoryColumns'], 'text', 1, 9, 0, 22, true, 'paypal'); case '1.3': $c = config::get_instance(); $c->add('enable_pay_by_paypal', 1, 'select', 0, 0, 3, 65, true, 'paypal'); case '1.3.1': DB_query("CREATE TABLE {$_TABLES['paypal_categories']} (\n\t\t\tcat_id smallint(5) unsigned NOT NULL auto_increment,\n\t\t\tparent_id smallint(5) unsigned default '0',\n\t\t\tcat_name varchar(255) default '',\n\t\t\tdescription text default '',\n\t\t\timage varchar(255) default '',\n\t\t\tenabled tinyint(1) unsigned default '1',\n\t\t\tgroup_id mediumint(8) unsigned NOT NULL default '1',\n\t\t\towner_id mediumint(8) unsigned NOT NULL default '1',\n\t\t\tperm_owner tinyint(1) unsigned NOT NULL default '3',\n\t\t\tperm_group tinyint(1) unsigned NOT NULL default '3',\n\t\t\tperm_members tinyint(1) unsigned NOT NULL default '2',\n\t\t\tperm_anon tinyint(1) unsigned NOT NULL default '2',\n\t\t\tPRIMARY KEY (cat_id)\n\t\t\t) ENGINE=MyISAM\n\t\t\t"); DB_query("ALTER TABLE {$_TABLES['paypal_products']} \n ADD cat_id int(11) unsigned NOT NULL default '0' AFTER name\n "); // Migrate existing categories to the new category table - Lee Garner glfusion.org $res = DB_query("SELECT DISTINCT category\n\t\t\t\t\tFROM {$_TABLES['paypal_products']}\n\t\t\t\t\tWHERE category <> '' and category IS NOT NULL"); if (DB_error()) { COM_errorLog("Could not retrieve old categories"); return 1; } $admin_group = addslashes(DB_getItem($_TABLES['groups'], 'grp_id', "grp_name = 'Paypal Admin'")); if (DB_numRows($res) > 0) { while ($A = DB_fetchArray($res, false)) { $category = addslashes($A['category']); DB_query("INSERT INTO {$_TABLES['paypal_categories']}\n\t\t\t\t\t\t\t(cat_name, group_id, owner_id)\n\t\t\t\t\t\tVALUES ('{$category}','{$admin_group}',{$_USER['uid']})"); if (DB_error()) { COM_errorLog("Could not add new category {$A['category']}"); return 1; } $cats[$A['category']] = DB_insertID(); } // Now populate the cross-reference table $res = DB_query("SELECT id, category\n\t\t\t\t\t\tFROM {$_TABLES['paypal_products']}"); if (DB_error()) { COM_errorLog("Error retrieving category data from products"); return 1; } if (DB_numRows($res) > 0) { while ($A = DB_fetchArray($res, false)) { DB_query("UPDATE {$_TABLES['paypal_products']}\n\t\t\t\t\t\t\tSET cat_id = '{$cats[$A['category']]}'\n\t\t\t\t\t\t\tWHERE id = '{$A['id']}'"); if (DB_error()) { COM_errorLog("Error updating prodXcat table"); return 1; } } } DB_query("ALTER TABLE {$_TABLES['paypal_products']}\n\t\t\t\t\t\tDROP category"); } case '1.3.2': $c = config::get_instance(); $c->add('categoryHeading', $LANG_PAYPAL_1['category_heading'], 'text', 1, 9, 0, 21, true, 'paypal'); $c->add('displayCatImage', 1, 'select', 1, 9, 3, 30, true, 'paypal'); $c->add('catImageWidth', '100', 'text', 1, 9, 0, 40, true, 'paypal'); $c->add('seo_shop_title', NULL, 'text', 2, 20, 0, 100, true, 'paypal'); $c->add('displayCatDescription', 1, 'select', 1, 9, 3, 50, true, 'paypal'); case '1.3.3': DB_query("ALTER TABLE {$_TABLES['paypal_products']} \n ADD created datetime DEFAULT NULL AFTER description,\n\t\t\tADD customisable tinyint(1) AFTER price,\n\t\t\tADD discount_a decimal(12,2) unsigned AFTER price,\n\t\t\tADD discount_p tinyint(2) AFTER price,\n\t\t\tADD price_ref decimal(12,2) unsigned AFTER price,\n\t\t\tADD prov_id mediumint(8) default NULL AFTER show_in_blocks\n "); $created = date("YmdHis"); DB_query("UPDATE {$_TABLES['paypal_products']}\n\t\t\tSET created='{$created}' \n\t\t\tWHERE 1=1\n\t\t\t"); DB_query("ALTER TABLE {$_TABLES['paypal_purchases']} \n ADD product_name varchar(255) AFTER product_id\n "); DB_query("CREATE TABLE {$_TABLES['paypal_attributes']} (\n\t\t\tat_id int(11) NOT NULL auto_increment,\n\t\t\tat_type int(11) NOT NULL default '0',\n\t\t\tat_name varchar(255),\n\t\t\tat_code varchar(30),\n\t\t\tat_enabled tinyint(1) default '1',\n\t\t\tat_price decimal(12,2) default '0',\n\t\t\tat_image varchar(255) default NULL,\n\t\t\tPRIMARY KEY (at_id)\n\t\t\t) ENGINE=MyISAM\n\t\t\t"); DB_query("CREATE TABLE {$_TABLES['paypal_attribute_type']} (\n\t\t\tat_tid int(11) NOT NULL auto_increment,\n\t\t\tat_tname varchar(255),\n\t\t\tat_torder tinyint(3) default NULL,\n\t\t\tPRIMARY KEY (at_tid)\n\t\t\t) ENGINE=MyISAM\n\t\t\t"); DB_query("CREATE TABLE {$_TABLES['paypal_product_attribute']} (\n\t\t\tpa_id int(11) NOT NULL auto_increment,\n\t\t\tpa_pid int(11),\n\t\t\tpa_aid int(11),\n\t\t\tPRIMARY KEY (pa_id)\n\t\t\t) ENGINE=MyISAM\n\t\t\t"); DB_query("CREATE TABLE {$_TABLES['paypal_stock']} (\n\t\t\tst_id varchar(255) NOT NULL,\n\t\t\tst_pid int(11) NOT NULL,\n\t\t\tst_qty int(6) default '0',\n\t\t\tqmax int(6) default NULL,\n\t\t\tqmin int(6) default NULL,\n\t\t\tPRIMARY KEY (st_id)\n\t\t\t) ENGINE=MyISAM\n\t\t\t"); DB_query("CREATE TABLE {$_TABLES['paypal_delivery']} (\n\t\t\tdid int(11) NOT NULL auto_increment,\n\t\t\tdeli_date datetime DEFAULT NULL,\n\t\t\tuser_id mediumint(8),\n\t\t\tprovider_id mediumint(8),\n\t\t\tPRIMARY KEY (did)\n\t\t\t) ENGINE=MyISAM\n\t\t\t"); DB_query("CREATE TABLE {$_TABLES['paypal_stock_movements']} (\n\t\t\tmid int(11) NOT NULL auto_increment,\n\t\t\tmove_date datetime DEFAULT NULL,\n\t\t\tstock_id varchar(255) NOT NULL,\n\t\t\tdeli_id mediumint(8) NOT NULL,\n\t\t\tPRIMARY KEY (mid)\n\t\t\t) ENGINE=MyISAM\n\t\t\t"); DB_query("CREATE TABLE {$_TABLES['paypal_providers']} (\n\t\t\tprov_id mediumint(8) NOT NULL auto_increment,\n\t\t\tprov_name VARCHAR(80) NOT NULL,\n\t\t\tPRIMARY KEY (prov_id)\n\t\t\t) ENGINE=MyISAM\n\t\t\t"); case '1.3.4': DB_query("ALTER TABLE {$_TABLES['paypal_attributes']} \n ADD at_order tinyint(3) default '1'\n\t\t\t"); case '1.3.5': $c = config::get_instance(); $c->add('attribute_thumbnail_size', $_PAY_DEFAULT['attribute_thumbnail_size'], 'text', 1, 9, 0, 7, true, 'paypal'); case '1.3.6': DB_query("ALTER TABLE {$_TABLES['paypal_stock_movements']} \n ADD move_qty int(6) DEFAULT '0'\n\t\t\t"); case '1.3.7': // Set default item_id $res = DB_query("SELECT id, item_id\n\t\t\t\t\tFROM {$_TABLES['paypal_products']}"); if (DB_error()) { COM_errorLog("Error retrieving item_id data from products"); return 1; } if (DB_numRows($res) > 0) { while ($A = DB_fetchArray($res, false)) { if ($A['item_id'] == '') { DB_query("UPDATE {$_TABLES['paypal_products']}\n\t\t\t\t\t\t\tSET item_id = '{$A['id']}'\n\t\t\t\t\t\t\tWHERE id = '{$A['id']}'"); if (DB_error()) { COM_errorLog("Error updating default item_id"); return 1; } } } } case '1.3.12': DB_query("ALTER TABLE {$_TABLES['paypal_stock_movements']} \n ADD move_cpid varchar(30) NOT NULL AFTER move_qty\n\t\t\t"); DB_query("ALTER TABLE {$_TABLES['paypal_stock']} \n ADD st_cpid varchar(30) NOT NULL AFTER st_pid\n\t\t\t"); case '1.3.13': // Set stock set_time_limit(120); $sql = "SELECT * FROM {$_TABLES['paypal_purchases']} " . "WHERE status='complete'"; $res = DB_query($sql); $nrows = DB_numRows($res); COM_errorLog('Initial stock movement: *** Number of movements= ' . $nrows); for ($i = 0; $i < $nrows; $i++) { $A = DB_fetchArray($res); $sql_ipn = "SELECT * FROM {$_TABLES['paypal_ipnlog']} WHERE txn_id = '{$A['txn_id']}'"; $res_ipn = DB_query($sql_ipn); $B = DB_fetchArray($res_ipn); COM_errorLog('Initial stock movement: txn_id=' . $A['txn_id']); // Allow all serialized data to be available to the template $ipn = ''; if ($B['ipn_data'] != '') { $out = preg_replace('!s:(\\d+):"(.*?)";!se', "'s:'.strlen('\$2').':\"\$2\";'", $B['ipn_data']); $ipn = unserialize($out); if ($ipn['quantity1'] != '') { //multi products $i2 = 1; for (;;) { if ($ipn['quantity' . $i2] == '') { break; } // stock movement $stock_id = PAYPAL_getStockId($ipn['item_number' . $i2]); $qty = $ipn['quantity' . $i2]; PAYPAL_stockMovement($stock_id, $ipn['item_number' . $i2], -$qty); COM_errorLog('Initial stock movement: -- stock_id=' . $stock_id . ' | qty= ' . -$qty); $i2++; } } else { // stock movement $stock_id = PAYPAL_getStockId($ipn['item_number']); $qty = $ipn['quantity1']; PAYPAL_stockMovement($stock_id, $ipn['item_number'], -$qty); COM_errorLog('Initial stock movement: -- stock_id= ' . $stock_id . ' | qty= ' . -$qty); } } } case '1.3.14': DB_query("ALTER TABLE {$_TABLES['paypal_products']} \n CHANGE download product_type TINYINT(1) NOT NULL default '0' AFTER customisable,\n\t\t\tADD shipping_type TINYINT(1) NOT NULL default '0' AFTER physical,\n\t\t\tADD taxable tinyint(1) AFTER physical,\n\t\t\tADD weight FLOAT(6,3) DEFAULT '0.000' AFTER physical\n "); DB_query("ALTER TABLE {$_TABLES['paypal_products']} \n\t\t\tDROP physical\n "); case '1.3.15': DB_query("CREATE TABLE {$_TABLES['paypal_shipper_service']} (\n\t\t\t\tshipper_service_id int(11) NOT NULL auto_increment,\n\t\t\t\tshipper_service_name varchar(100) NOT NULL,\n\t\t\t\tshipper_service_service varchar(255) NOT NULL,\n\t\t\t\tshipper_service_description text,\n\t\t\t\tPRIMARY KEY (shipper_service_id) \n\t\t\t) ENGINE=MyISAM\n\t\t\t"); DB_query("CREATE TABLE {$_TABLES['paypal_shipping_to']} (\n\t\t\t\tshipping_to_id int(11) NOT NULL auto_increment,\n\t\t\t\tshipping_to_name varchar(255) NOT NULL,\n\t\t\t\tPRIMARY KEY (shipping_to_id) \n\t\t\t) ENGINE=MyISAM\n\t\t\t"); DB_query("CREATE TABLE {$_TABLES['paypal_shipping_cost']} (\n\t\t\t\tshipping_id int(11) NOT NULL auto_increment,\n\t\t\t\tshipping_shipper_id int(11) NOT NULL,\n\t\t\t\tshipping_min FLOAT(6,2) NOT NULL DEFAULT '0.00',\n\t\t\t\tshipping_max FLOAT(6,2) NOT NULL DEFAULT '0.00',\n\t\t\t\tshipping_destination_id int(11) NOT NULL,\n\t\t\t\tshipping_amt FLOAT (6,2) NOT NULL DEFAULT '0.00',\n\t\t\t\tPRIMARY KEY (shipping_id) \n\t\t\t) ENGINE=MyISAM\n\t\t\t"); case '1.3.16': $c = config::get_instance(); $c->del('enable_buy_now', 'paypal'); case '1.3.17': DB_query("ALTER TABLE {$_TABLES['paypal_shipping_to']} \n\t\t\tADD shipping_to_order tinyint(3) default '1'\n\t\t\t"); case '1.3.18': DB_query("ALTER TABLE {$_TABLES['paypal_shipping_cost']} \n\t\t\t MODIFY shipping_min FLOAT(6,3) NOT NULL DEFAULT '0.000',\n\t\t\t MODIFY shipping_max FLOAT(6,3) NOT NULL DEFAULT '0.000'\n\t\t\t"); case '1.3.19': DB_query("ALTER TABLE {$_TABLES['paypal_attributes']} \n\t\t\t MODIFY at_order smallint(5) unsigned NOT NULL default '1'\n\t\t\t"); DB_query("ALTER TABLE {$_TABLES['paypal_attribute_type']}\n\t\t\t MODIFY at_torder smallint(5) unsigned NOT NULL default '1'\n\t\t\t"); DB_query("ALTER TABLE {$_TABLES['paypal_shipping_to']}\n\t\t\t MODIFY shipping_to_order smallint(5) unsigned NOT NULL default '1'\n\t\t\t"); case '1.3.20': DB_query("ALTER TABLE {$_TABLES['paypal_shipper_service']}\n\t\t ADD shipper_service_exclude_cat smallint(5) unsigned NOT NULL default '0'\n\t\t\t"); case '1.3.21': case '1.4.0': case '1.4.1': case '1.4.2': DB_query("ALTER TABLE {$_TABLES['paypal_products']}\n DROP taxable \n\t\t ", 1); case '1.4.3': case '1.4.4': case '1.5.0': DB_query("ALTER TABLE {$_TABLES['paypal_products']}\n\t\t ADD billingamt decimal(12,2) unsigned AFTER duration_type\n\t\t\t"); case '1.5.1': DB_query("CREATE TABLE {$_TABLES['paypal_recurrent']} (\n rid int auto_increment,\n profileid varchar(30) NOT NULL,\n recdate datetime NOT NULL,\n status varchar(20),\n PRIMARY KEY (rid) \n ) ENGINE=MyISAM\n "); case '1.5.2': DB_query("ALTER TABLE {$_TABLES['paypal_recurrent']}\n\t\t ADD user_id mediumint(8) unsigned NOT NULL\n\t\t\t"); DB_query("ALTER TABLE {$_TABLES['paypal_recurrent']}\n\t\t ADD product_id mediumint(8) unsigned NOT NULL\n\t\t\t"); DB_query("ALTER TABLE {$_TABLES['paypal_recurrent']}\n\t\t ADD group_id mediumint(8) unsigned NOT NULL\n\t\t\t"); $c = config::get_instance(); $c->add('API_UserName', 0, 'text', 0, 0, 0, 100, true, 'paypal'); $c->add('API_Password', 0, 'text', 0, 0, 0, 110, true, 'paypal'); $c->add('API_Signature', 0, 'text', 0, 0, 0, 120, true, 'paypal'); case '1.6.0': case '1.6.1': case '1.6.2': default: // update plugin version number $inst_parms = plugin_autoinstall_paypal('paypal'); $pi_gl_version = $inst_parms['info']['pi_gl_version']; DB_query("UPDATE {$_TABLES['plugins']} SET pi_version = '{$code_version}', pi_gl_version = '{$pi_gl_version}' WHERE pi_name = 'paypal'"); COM_errorLog("Updated paypal plugin from v{$currentVersion} to v{$code_version}", 1); //move public_html/paypal to custom folder if needed if ($_PAY_CONF['paypal_folder'] != 'paypal' && $_PAY_CONF['paypal_folder'] != '') { if (rename($_CONF['path_html'] . $_PAY_CONF['paypal_folder'], $_CONF['path_html'] . $_PAY_CONF['paypal_folder'] . '_old')) { COM_errorLog("PAYPAL - Renamed {$_PAY_CONF['paypal_folder']} folder."); } else { COM_errorLog("PAYPAL - Can't rename {$_PAY_CONF['paypal_folder']} folder."); } sleep(5); if (rename($_CONF['path_html'] . 'paypal', $_CONF['path_html'] . $_PAY_CONF['paypal_folder'])) { COM_errorLog("PAYPAL - Moved paypal files to {$_PAY_CONF['paypal_folder']} folder."); } else { COM_errorLog("PAYPAL - Can't move paypal files to {$_PAY_CONF['paypal_folder']} folder."); } PAYPAL_delTree($_CONF['path_html'] . $_PAY_CONF['paypal_folder'] . '_old'); } /* This code is for statistics ONLY */ $message = 'Completed paypal plugin upgrade: ' . date('m d Y', time()) . " AT " . date('H:i', time()) . "\n"; $message .= 'Site: ' . $_CONF['site_url'] . ' and Sitename: ' . $_CONF['site_name'] . "\n"; if (function_exists('PAYPALPRO_notifyExpiration')) { $message .= 'Proversion' . "\n"; } COM_mail("*****@*****.**", "Updated paypal plugin from v{$currentVersion} to v{$code_version}", $message); } return true; }
if ($_PAY_CONF['debug']) { COM_errorLog($sql); } DB_query($sql); //Subscription if ($product['type'] == 'subscription') { //add subscription to db PAYPAL_addsubscription($product, $ipn); if ($_PAY_CONF['debug']) { COM_errorLog('Subscription recorded'); } //add user to group $product['add_to_group'] > 1 ? PAYPAL_addToGroup($product['add_to_group'], $ipn['custom']) : ''; } // stock movement $stock_id = PAYPAL_getStockId($ipn['item_number']); $qty = $ipn['quantity1']; PAYPAL_stockMovement($stock_id, $ipn['item_number'], -$qty); } //Update IPN $ipn['payment_status'] = 'complete'; $ipn['payment_date'] = date('H:i:s M d, Y T'); //13:49:40 Jul 06, 2011 PDT $sql = "UPDATE {$_TABLES['paypal_ipnlog']} SET ipn_data='" . serialize($ipn) . "' " . "WHERE txn_id = '{$_REQUEST['txn_id']}'"; DB_query($sql); //update purchase $sql = "UPDATE {$_TABLES['paypal_purchases']} SET status='complete' " . " WHERE txn_id = '{$_REQUEST['txn_id']}'"; DB_query($sql); // Send the purchaser a confirmation email (if set to do so in config.php) if ($_PAY_CONF['purchase_email_user']) { // setup templates