示例#1
0
 /**
  * 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']);
             }
         }
     }
 }
示例#2
0
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