Jump to content
  • Checkout
  • Login
  • Get in touch

osCommerce

The e-commerce.

[CONTRIBUTION] PDF Customer Invoice


chris23

Recommended Posts

Further to the above problem I am also having an issue with the PDF invoice thats being generated.

 

There is a layout issue with the PDF having overlapping text. Here are the annotated screen shots

 

pdfinvoiceerror1ky2.th.png

 

pdfinvoice2gr2.th.png

Link to comment
Share on other sites

I have installed PDF invoice v 1.1 with the invoice admin module. After installing the invoice admin module I get the following error on my site:

 

Fatal error: Call to a member function add_current_page() on a non-object in /home/inkround/public_html/includes/application_top.php on line 324

 

Any solution for this problem?

 

What page are you calling when you get this error?

Please use forum for support rather than PM - PMs unrelated to my contributions will be ignored.

Google Site Search is your friend

My contributions: Tracking Module | PDF Customer Invoice | Subcategory textboxes

Link to comment
Share on other sites

Further to the above problem I am also having an issue with the PDF invoice thats being generated.

 

There is a layout issue with the PDF having overlapping text. Here are the annotated screen shots

 

pdfinvoiceerror1ky2.th.png

 

pdfinvoice2gr2.th.png

 

First issue. If you have a long company name, you'll need to:

 

1. move the cell the company name and address sits in to the left then,

2. expand this cell size by the same amount

3. optionally, reduce the font size.

 

If you search through this thread, there are many references on doing this for the various page elements.

 

Second issue, see post #366 http://www.oscommerce.com/forums/index.php?s=&...t&p=1241755 - this needs fixing in the next upload. Apologies.

Edited by chris23

Please use forum for support rather than PM - PMs unrelated to my contributions will be ignored.

Google Site Search is your friend

My contributions: Tracking Module | PDF Customer Invoice | Subcategory textboxes

Link to comment
Share on other sites

:blink: hi there first of all thx for contrib.

I have installed it and works perfect, but after I have added a PayPal Standard my problems started to grow.

As I have looked on the code supplied by paypal (paypal_standard.php located in modules folder) looks like this file has it uses the standard tep_mail there to send mails:

 

tep_mail($order->customer['firstname'] . ' ' . $order->customer['lastname'], $order->customer['email_address'], EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);

 

so I have tried to change it to tep_mail_string_attachment but looks like the order_id is not passed through $HTTP_GET_VARS and I have a same redirect to account history problem after making payment.

Anyone have a same problem? any help ???

Link to comment
Share on other sites

Christian ?

Anyone?

:'(

 

I haven't used any of the PayPal modules so am not familiar with their flow within the checkout.

 

What happens in checkout_process.php? Do you get redirected to PayPal then redirected back?

 

The PDF email attachment sends the confirmation from within checkout_process.php. Are you saying the PayPal module bypasses this and does the email processing itself instead of checkout_process.php?

 

Sorry I can't be more helpful but without having PayPal experience, I'm a bit stuck

 

If you can give me some idea of the steps involved, I may be able to help

 

Chris

Please use forum for support rather than PM - PMs unrelated to my contributions will be ignored.

Google Site Search is your friend

My contributions: Tracking Module | PDF Customer Invoice | Subcategory textboxes

Link to comment
Share on other sites

Hi Chriss,

this is the code for paypal_standard.php which is supplied by them:

 

<?php

/*

$Id: paypal_standard.php 1803 2008-01-11 18:16:37Z hpdl $

 

osCommerce, Open Source E-Commerce Solutions

http://www.oscommerce.com

 

Copyright © 2008 osCommerce

 

Released under the GNU General Public License

*/

 

class paypal_standard {

var $code, $title, $description, $enabled;

 

// class constructor

function paypal_standard() {

global $order;

 

$this->signature = 'paypal|paypal_standard|1.0|2.2';

 

$this->code = 'paypal_standard';

$this->title = MODULE_PAYMENT_PAYPAL_STANDARD_TEXT_TITLE;

$this->public_title = MODULE_PAYMENT_PAYPAL_STANDARD_TEXT_PUBLIC_TITLE;

$this->description = MODULE_PAYMENT_PAYPAL_STANDARD_TEXT_DESCRIPTION;

$this->sort_order = MODULE_PAYMENT_PAYPAL_STANDARD_SORT_ORDER;

$this->enabled = ((MODULE_PAYMENT_PAYPAL_STANDARD_STATUS == 'True') ? true : false);

 

if ((int)MODULE_PAYMENT_PAYPAL_STANDARD_PREPARE_ORDER_STATUS_ID > 0) {

$this->order_status = MODULE_PAYMENT_PAYPAL_STANDARD_PREPARE_ORDER_STATUS_ID;

}

 

if (is_object($order)) $this->update_status();

 

if (MODULE_PAYMENT_PAYPAL_STANDARD_GATEWAY_SERVER == 'Live') {

$this->form_action_url = 'https://www.paypal.com/cgi-bin/webscr';

} else {

$this->form_action_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';

}

}

 

// class methods

function update_status() {

global $order;

 

if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_PAYPAL_STANDARD_ZONE > 0) ) {

$check_flag = false;

$check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_PAYPAL_STANDARD_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");

while ($check = tep_db_fetch_array($check_query)) {

if ($check['zone_id'] < 1) {

$check_flag = true;

break;

} elseif ($check['zone_id'] == $order->billing['zone_id']) {

$check_flag = true;

break;

}

}

 

if ($check_flag == false) {

$this->enabled = false;

}

}

}

 

function javascript_validation() {

return false;

}

 

function selection() {

global $cart_PayPal_Standard_ID;

 

if (tep_session_is_registered('cart_PayPal_Standard_ID')) {

$order_id = substr($cart_PayPal_Standard_ID, strpos($cart_PayPal_Standard_ID, '-')+1);

 

$check_query = tep_db_query('select orders_id from ' . TABLE_ORDERS_STATUS_HISTORY . ' where orders_id = "' . (int)$order_id . '" limit 1');

 

if (tep_db_num_rows($check_query) < 1) {

tep_db_query('delete from ' . TABLE_ORDERS . ' where orders_id = "' . (int)$order_id . '"');

tep_db_query('delete from ' . TABLE_ORDERS_TOTAL . ' where orders_id = "' . (int)$order_id . '"');

tep_db_query('delete from ' . TABLE_ORDERS_STATUS_HISTORY . ' where orders_id = "' . (int)$order_id . '"');

tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS . ' where orders_id = "' . (int)$order_id . '"');

tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . ' where orders_id = "' . (int)$order_id . '"');

tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS_DOWNLOAD . ' where orders_id = "' . (int)$order_id . '"');

 

tep_session_unregister('cart_PayPal_Standard_ID');

}

}

 

return array('id' => $this->code,

'module' => $this->public_title);

}

 

function pre_confirmation_check() {

global $cartID, $cart;

 

if (empty($cart->cartID)) {

$cartID = $cart->cartID = $cart->generate_cart_id();

}

 

if (!tep_session_is_registered('cartID')) {

tep_session_register('cartID');

}

}

 

function confirmation() {

global $cartID, $cart_PayPal_Standard_ID, $customer_id, $languages_id, $order, $order_total_modules;

 

if (tep_session_is_registered('cartID')) {

$insert_order = false;

 

if (tep_session_is_registered('cart_PayPal_Standard_ID')) {

$order_id = substr($cart_PayPal_Standard_ID, strpos($cart_PayPal_Standard_ID, '-')+1);

 

$curr_check = tep_db_query("select currency from " . TABLE_ORDERS . " where orders_id = '" . (int)$order_id . "'");

$curr = tep_db_fetch_array($curr_check);

 

if ( ($curr['currency'] != $order->info['currency']) || ($cartID != substr($cart_PayPal_Standard_ID, 0, strlen($cartID))) ) {

$check_query = tep_db_query('select orders_id from ' . TABLE_ORDERS_STATUS_HISTORY . ' where orders_id = "' . (int)$order_id . '" limit 1');

 

if (tep_db_num_rows($check_query) < 1) {

tep_db_query('delete from ' . TABLE_ORDERS . ' where orders_id = "' . (int)$order_id . '"');

tep_db_query('delete from ' . TABLE_ORDERS_TOTAL . ' where orders_id = "' . (int)$order_id . '"');

tep_db_query('delete from ' . TABLE_ORDERS_STATUS_HISTORY . ' where orders_id = "' . (int)$order_id . '"');

tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS . ' where orders_id = "' . (int)$order_id . '"');

tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . ' where orders_id = "' . (int)$order_id . '"');

tep_db_query('delete from ' . TABLE_ORDERS_PRODUCTS_DOWNLOAD . ' where orders_id = "' . (int)$order_id . '"');

}

 

$insert_order = true;

}

} else {

$insert_order = true;

}

 

if ($insert_order == true) {

$order_totals = array();

if (is_array($order_total_modules->modules)) {

reset($order_total_modules->modules);

while (list(, $value) = each($order_total_modules->modules)) {

$class = substr($value, 0, strrpos($value, '.'));

if ($GLOBALS[$class]->enabled) {

for ($i=0, $n=sizeof($GLOBALS[$class]->output); $i<$n; $i++) {

if (tep_not_null($GLOBALS[$class]->output[$i]['title']) && tep_not_null($GLOBALS[$class]->output[$i]['text'])) {

$order_totals[] = array('code' => $GLOBALS[$class]->code,

'title' => $GLOBALS[$class]->output[$i]['title'],

'text' => $GLOBALS[$class]->output[$i]['text'],

'value' => $GLOBALS[$class]->output[$i]['value'],

'sort_order' => $GLOBALS[$class]->sort_order);

}

}

}

}

}

 

$sql_data_array = array('customers_id' => $customer_id,

'customers_name' => $order->customer['firstname'] . ' ' . $order->customer['lastname'],

'customers_company' => $order->customer['company'],

'customers_street_address' => $order->customer['street_address'],

'customers_suburb' => $order->customer['suburb'],

'customers_city' => $order->customer['city'],

'customers_postcode' => $order->customer['postcode'],

'customers_state' => $order->customer['state'],

'customers_country' => $order->customer['country']['title'],

'customers_telephone' => $order->customer['telephone'],

'customers_email_address' => $order->customer['email_address'],

'customers_address_format_id' => $order->customer['format_id'],

'delivery_name' => $order->delivery['firstname'] . ' ' . $order->delivery['lastname'],

'delivery_company' => $order->delivery['company'],

'delivery_street_address' => $order->delivery['street_address'],

'delivery_suburb' => $order->delivery['suburb'],

'delivery_city' => $order->delivery['city'],

'delivery_postcode' => $order->delivery['postcode'],

'delivery_state' => $order->delivery['state'],

'delivery_country' => $order->delivery['country']['title'],

'delivery_address_format_id' => $order->delivery['format_id'],

'billing_name' => $order->billing['firstname'] . ' ' . $order->billing['lastname'],

'billing_company' => $order->billing['company'],

'billing_street_address' => $order->billing['street_address'],

'billing_suburb' => $order->billing['suburb'],

'billing_city' => $order->billing['city'],

'billing_postcode' => $order->billing['postcode'],

'billing_state' => $order->billing['state'],

'billing_country' => $order->billing['country']['title'],

'billing_address_format_id' => $order->billing['format_id'],

'payment_method' => $order->info['payment_method'],

'cc_type' => $order->info['cc_type'],

'cc_owner' => $order->info['cc_owner'],

'cc_number' => $order->info['cc_number'],

'cc_expires' => $order->info['cc_expires'],

'date_purchased' => 'now()',

'orders_status' => $order->info['order_status'],

'currency' => $order->info['currency'],

'currency_value' => $order->info['currency_value']);

 

tep_db_perform(TABLE_ORDERS, $sql_data_array);

 

$insert_id = tep_db_insert_id();

 

for ($i=0, $n=sizeof($order_totals); $i<$n; $i++) {

$sql_data_array = array('orders_id' => $insert_id,

'title' => $order_totals[$i]['title'],

'text' => $order_totals[$i]['text'],

'value' => $order_totals[$i]['value'],

'class' => $order_totals[$i]['code'],

'sort_order' => $order_totals[$i]['sort_order']);

 

tep_db_perform(TABLE_ORDERS_TOTAL, $sql_data_array);

}

 

for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {

$sql_data_array = array('orders_id' => $insert_id,

'products_id' => tep_get_prid($order->products[$i]['id']),

'products_model' => $order->products[$i]['model'],

'products_name' => $order->products[$i]['name'],

'products_price' => $order->products[$i]['price'],

'final_price' => $order->products[$i]['final_price'],

'products_tax' => $order->products[$i]['tax'],

'products_quantity' => $order->products[$i]['qty']);

 

tep_db_perform(TABLE_ORDERS_PRODUCTS, $sql_data_array);

 

$order_products_id = tep_db_insert_id();

 

$attributes_exist = '0';

if (isset($order->products[$i]['attributes'])) {

$attributes_exist = '1';

for ($j=0, $n2=sizeof($order->products[$i]['attributes']); $j<$n2; $j++) {

if (DOWNLOAD_ENABLED == 'true') {

$attributes_query = "select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix, pad.products_attributes_maxdays, pad.products_attributes_maxcount , pad.products_attributes_filename

from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa

left join " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad

on pa.products_attributes_id=pad.products_attributes_id

where pa.products_id = '" . $order->products[$i]['id'] . "'

and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "'

and pa.options_id = popt.products_options_id

and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "'

and pa.options_values_id = poval.products_options_values_id

and popt.language_id = '" . $languages_id . "'

and poval.language_id = '" . $languages_id . "'";

$attributes = tep_db_query($attributes_query);

} else {

$attributes = tep_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa where pa.products_id = '" . $order->products[$i]['id'] . "' and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "' and pa.options_id = popt.products_options_id and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '" . $languages_id . "' and poval.language_id = '" . $languages_id . "'");

}

$attributes_values = tep_db_fetch_array($attributes);

 

$sql_data_array = array('orders_id' => $insert_id,

'orders_products_id' => $order_products_id,

'products_options' => $attributes_values['products_options_name'],

'products_options_values' => $attributes_values['products_options_values_name'],

'options_values_price' => $attributes_values['options_values_price'],

'price_prefix' => $attributes_values['price_prefix']);

 

tep_db_perform(TABLE_ORDERS_PRODUCTS_ATTRIBUTES, $sql_data_array);

 

if ((DOWNLOAD_ENABLED == 'true') && isset($attributes_values['products_attributes_filename']) && tep_not_null($attributes_values['products_attributes_filename'])) {

$sql_data_array = array('orders_id' => $insert_id,

'orders_products_id' => $order_products_id,

'orders_products_filename' => $attributes_values['products_attributes_filename'],

'download_maxdays' => $attributes_values['products_attributes_maxdays'],

'download_count' => $attributes_values['products_attributes_maxcount']);

 

tep_db_perform(TABLE_ORDERS_PRODUCTS_DOWNLOAD, $sql_data_array);

}

}

}

}

 

$cart_PayPal_Standard_ID = $cartID . '-' . $insert_id;

tep_session_register('cart_PayPal_Standard_ID');

}

}

 

return false;

}

 

function process_button() {

global $customer_id, $order, $sendto, $currency, $cart_PayPal_Standard_ID, $shipping;

 

$process_button_string = '';

$parameters = array('cmd' => '_xclick',

'item_name' => STORE_NAME,

'shipping' => $this->format_raw($order->info['shipping_cost']),

'tax' => $this->format_raw($order->info['tax']),

'business' => MODULE_PAYMENT_PAYPAL_STANDARD_ID,

'amount' => $this->format_raw($order->info['total'] - $order->info['shipping_cost'] - $order->info['tax']),

'currency_code' => $currency,

'invoice' => substr($cart_PayPal_Standard_ID, strpos($cart_PayPal_Standard_ID, '-')+1),

'custom' => $customer_id,

'no_note' => '1',

'notify_url' => tep_href_link('ext/modules/payment/paypal/standard_ipn.php', '', 'SSL', false, false),

'return' => tep_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL'),

'cancel_return' => tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL'),

'bn' => 'osCommerce22_Default_ST',

'paymentaction' => ((MODULE_PAYMENT_PAYPAL_STANDARD_TRANSACTION_METHOD == 'Sale') ? 'sale' : 'authorization'));

 

if (is_numeric($sendto) && ($sendto > 0)) {

$parameters['address_override'] = '1';

$parameters['first_name'] = $order->delivery['firstname'];

$parameters['last_name'] = $order->delivery['lastname'];

$parameters['address1'] = $order->delivery['street_address'];

$parameters['city'] = $order->delivery['city'];

$parameters['state'] = tep_get_zone_code($order->delivery['country']['id'], $order->delivery['zone_id'], $order->delivery['state']);

$parameters['zip'] = $order->delivery['postcode'];

$parameters['country'] = $order->delivery['country']['iso_code_2'];

} else {

$parameters['no_shipping'] = '1';

$parameters['first_name'] = $order->billing['firstname'];

$parameters['last_name'] = $order->billing['lastname'];

$parameters['address1'] = $order->billing['street_address'];

$parameters['city'] = $order->billing['city'];

$parameters['state'] = tep_get_zone_code($order->billing['country']['id'], $order->billing['zone_id'], $order->billing['state']);

$parameters['zip'] = $order->billing['postcode'];

$parameters['country'] = $order->billing['country']['iso_code_2'];

}

 

if (tep_not_null(MODULE_PAYMENT_PAYPAL_STANDARD_PAGE_STYLE)) {

$parameters['page_style'] = MODULE_PAYMENT_PAYPAL_STANDARD_PAGE_STYLE;

}

 

if (MODULE_PAYMENT_PAYPAL_STANDARD_EWP_STATUS == 'True') {

$parameters['cert_id'] = MODULE_PAYMENT_PAYPAL_STANDARD_EWP_CERT_ID;

 

$random_string = rand(100000, 999999) . '-' . $customer_id . '-';

 

$data = '';

reset($parameters);

while (list($key, $value) = each($parameters)) {

$data .= $key . '=' . $value . "\n";

}

 

$fp = fopen(MODULE_PAYMENT_PAYPAL_STANDARD_EWP_WORKING_DIRECTORY . '/' . $random_string . 'data.txt', 'w');

fwrite($fp, $data);

fclose($fp);

 

unset($data);

 

if (function_exists('openssl_pkcs7_sign') && function_exists('openssl_pkcs7_encrypt')) {

openssl_pkcs7_sign(MODULE_PAYMENT_PAYPAL_STANDARD_EWP_WORKING_DIRECTORY . '/' . $random_string . 'data.txt', MODULE_PAYMENT_PAYPAL_STANDARD_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt', file_get_contents(MODULE_PAYMENT_PAYPAL_STANDARD_EWP_PUBLIC_KEY), file_get_contents(MODULE_PAYMENT_PAYPAL_STANDARD_EWP_PRIVATE_KEY), array('From' => MODULE_PAYMENT_PAYPAL_STANDARD_ID), PKCS7_BINARY);

 

unlink(MODULE_PAYMENT_PAYPAL_STANDARD_EWP_WORKING_DIRECTORY . '/' . $random_string . 'data.txt');

 

// remove headers from the signature

$signed = file_get_contents(MODULE_PAYMENT_PAYPAL_STANDARD_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt');

$signed = explode("\n\n", $signed);

$signed = base64_decode($signed[1]);

 

$fp = fopen(MODULE_PAYMENT_PAYPAL_STANDARD_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt', 'w');

fwrite($fp, $signed);

fclose($fp);

 

unset($signed);

 

openssl_pkcs7_encrypt(MODULE_PAYMENT_PAYPAL_STANDARD_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt', MODULE_PAYMENT_PAYPAL_STANDARD_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt', file_get_contents(MODULE_PAYMENT_PAYPAL_STANDARD_EWP_PAYPAL_KEY), array('From' => MODULE_PAYMENT_PAYPAL_STANDARD_ID), PKCS7_BINARY);

 

unlink(MODULE_PAYMENT_PAYPAL_STANDARD_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt');

 

// remove headers from the encrypted result

$data = file_get_contents(MODULE_PAYMENT_PAYPAL_STANDARD_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt');

$data = explode("\n\n", $data);

$data = '-----BEGIN PKCS7-----' . "\n" . $data[1] . "\n" . '-----END PKCS7-----';

 

unlink(MODULE_PAYMENT_PAYPAL_STANDARD_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt');

} else {

exec(MODULE_PAYMENT_PAYPAL_STANDARD_EWP_OPENSSL . ' smime -sign -in ' . MODULE_PAYMENT_PAYPAL_STANDARD_EWP_WORKING_DIRECTORY . '/' . $random_string . 'data.txt -signer ' . MODULE_PAYMENT_PAYPAL_STANDARD_EWP_PUBLIC_KEY . ' -inkey ' . MODULE_PAYMENT_PAYPAL_STANDARD_EWP_PRIVATE_KEY . ' -outform der -nodetach -binary > ' . MODULE_PAYMENT_PAYPAL_STANDARD_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt');

unlink(MODULE_PAYMENT_PAYPAL_STANDARD_EWP_WORKING_DIRECTORY . '/' . $random_string . 'data.txt');

 

exec(MODULE_PAYMENT_PAYPAL_STANDARD_EWP_OPENSSL . ' smime -encrypt -des3 -binary -outform pem ' . MODULE_PAYMENT_PAYPAL_STANDARD_EWP_PAYPAL_KEY . ' < ' . MODULE_PAYMENT_PAYPAL_STANDARD_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt > ' . MODULE_PAYMENT_PAYPAL_STANDARD_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt');

unlink(MODULE_PAYMENT_PAYPAL_STANDARD_EWP_WORKING_DIRECTORY . '/' . $random_string . 'signed.txt');

 

$fh = fopen(MODULE_PAYMENT_PAYPAL_STANDARD_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt', 'rb');

$data = fread($fh, filesize(MODULE_PAYMENT_PAYPAL_STANDARD_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt'));

fclose($fh);

 

unlink(MODULE_PAYMENT_PAYPAL_STANDARD_EWP_WORKING_DIRECTORY . '/' . $random_string . 'encrypted.txt');

}

 

$process_button_string = tep_draw_hidden_field('cmd', '_s-xclick') .

tep_draw_hidden_field('encrypted', $data);

 

unset($data);

} else {

reset($parameters);

while (list($key, $value) = each($parameters)) {

$process_button_string .= tep_draw_hidden_field($key, $value);

}

}

 

return $process_button_string;

}

 

function before_process() {

global $customer_id, $order, $order_totals, $sendto, $billto, $languages_id, $payment, $currencies, $cart, $cart_PayPal_Standard_ID;

global $$payment;

 

$order_id = substr($cart_PayPal_Standard_ID, strpos($cart_PayPal_Standard_ID, '-')+1);

 

$check_query = tep_db_query("select orders_status from " . TABLE_ORDERS . " where orders_id = '" . (int)$order_id . "'");

if (tep_db_num_rows($check_query)) {

$check = tep_db_fetch_array($check_query);

 

if ($check['orders_status'] == MODULE_PAYMENT_PAYPAL_STANDARD_PREPARE_ORDER_STATUS_ID) {

$sql_data_array = array('orders_id' => $order_id,

'orders_status_id' => MODULE_PAYMENT_PAYPAL_STANDARD_PREPARE_ORDER_STATUS_ID,

'date_added' => 'now()',

'customer_notified' => '0',

'comments' => '');

 

tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);

}

}

 

tep_db_query("update " . TABLE_ORDERS . " set orders_status = '" . (MODULE_PAYMENT_PAYPAL_STANDARD_ORDER_STATUS_ID > 0 ? (int)MODULE_PAYMENT_PAYPAL_STANDARD_ORDER_STATUS_ID : (int)DEFAULT_ORDERS_STATUS_ID) . "', last_modified = now() where orders_id = '" . (int)$order_id . "'");

 

$sql_data_array = array('orders_id' => $order_id,

'orders_status_id' => (MODULE_PAYMENT_PAYPAL_STANDARD_ORDER_STATUS_ID > 0 ? (int)MODULE_PAYMENT_PAYPAL_STANDARD_ORDER_STATUS_ID : (int)DEFAULT_ORDERS_STATUS_ID),

'date_added' => 'now()',

'customer_notified' => (SEND_EMAILS == 'true') ? '1' : '0',

'comments' => $order->info['comments']);

 

tep_db_perform(TABLE_ORDERS_STATUS_HISTORY, $sql_data_array);

 

// initialized for the email confirmation

$products_ordered = '';

$subtotal = 0;

$total_tax = 0;

 

for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {

// Stock Update - Joao Correia

if (STOCK_LIMITED == 'true') {

if (DOWNLOAD_ENABLED == 'true') {

$stock_query_raw = "SELECT products_quantity, pad.products_attributes_filename

FROM " . TABLE_PRODUCTS . " p

LEFT JOIN " . TABLE_PRODUCTS_ATTRIBUTES . " pa

ON p.products_id=pa.products_id

LEFT JOIN " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad

ON pa.products_attributes_id=pad.products_attributes_id

WHERE p.products_id = '" . tep_get_prid($order->products[$i]['id']) . "'";

// Will work with only one option for downloadable products

// otherwise, we have to build the query dynamically with a loop

$products_attributes = $order->products[$i]['attributes'];

if (is_array($products_attributes)) {

$stock_query_raw .= " AND pa.options_id = '" . $products_attributes[0]['option_id'] . "' AND pa.options_values_id = '" . $products_attributes[0]['value_id'] . "'";

}

$stock_query = tep_db_query($stock_query_raw);

} else {

$stock_query = tep_db_query("select products_quantity from " . TABLE_PRODUCTS . " where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");

}

if (tep_db_num_rows($stock_query) > 0) {

$stock_values = tep_db_fetch_array($stock_query);

// do not decrement quantities if products_attributes_filename exists

if ((DOWNLOAD_ENABLED != 'true') || (!$stock_values['products_attributes_filename'])) {

$stock_left = $stock_values['products_quantity'] - $order->products[$i]['qty'];

} else {

$stock_left = $stock_values['products_quantity'];

}

tep_db_query("update " . TABLE_PRODUCTS . " set products_quantity = '" . $stock_left . "' where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");

if ( ($stock_left < 1) && (STOCK_ALLOW_CHECKOUT == 'false') ) {

tep_db_query("update " . TABLE_PRODUCTS . " set products_status = '0' where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");

}

}

}

 

// Update products_ordered (for bestsellers list)

tep_db_query("update " . TABLE_PRODUCTS . " set products_ordered = products_ordered + " . sprintf('%d', $order->products[$i]['qty']) . " where products_id = '" . tep_get_prid($order->products[$i]['id']) . "'");

 

//------insert customer choosen option to order--------

$attributes_exist = '0';

$products_ordered_attributes = '';

if (isset($order->products[$i]['attributes'])) {

$attributes_exist = '1';

for ($j=0, $n2=sizeof($order->products[$i]['attributes']); $j<$n2; $j++) {

if (DOWNLOAD_ENABLED == 'true') {

$attributes_query = "select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix, pad.products_attributes_maxdays, pad.products_attributes_maxcount , pad.products_attributes_filename

from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa

left join " . TABLE_PRODUCTS_ATTRIBUTES_DOWNLOAD . " pad

on pa.products_attributes_id=pad.products_attributes_id

where pa.products_id = '" . $order->products[$i]['id'] . "'

and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "'

and pa.options_id = popt.products_options_id

and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "'

and pa.options_values_id = poval.products_options_values_id

and popt.language_id = '" . $languages_id . "'

and poval.language_id = '" . $languages_id . "'";

$attributes = tep_db_query($attributes_query);

} else {

$attributes = tep_db_query("select popt.products_options_name, poval.products_options_values_name, pa.options_values_price, pa.price_prefix from " . TABLE_PRODUCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_OPTIONS_VALUES . " poval, " . TABLE_PRODUCTS_ATTRIBUTES . " pa where pa.products_id = '" . $order->products[$i]['id'] . "' and pa.options_id = '" . $order->products[$i]['attributes'][$j]['option_id'] . "' and pa.options_id = popt.products_options_id and pa.options_values_id = '" . $order->products[$i]['attributes'][$j]['value_id'] . "' and pa.options_values_id = poval.products_options_values_id and popt.language_id = '" . $languages_id . "' and poval.language_id = '" . $languages_id . "'");

}

$attributes_values = tep_db_fetch_array($attributes);

 

$products_ordered_attributes .= "\n\t" . $attributes_values['products_options_name'] . ' ' . $attributes_values['products_options_values_name'];

}

}

//------insert customer choosen option eof ----

$total_weight += ($order->products[$i]['qty'] * $order->products[$i]['weight']);

$total_tax += tep_calculate_tax($total_products_price, $products_tax) * $order->products[$i]['qty'];

$total_cost += $total_products_price;

 

$products_ordered .= $order->products[$i]['qty'] . ' x ' . $order->products[$i]['name'] . ' (' . $order->products[$i]['model'] . ') = ' . $currencies->display_price($order->products[$i]['final_price'], $order->products[$i]['tax'], $order->products[$i]['qty']) . $products_ordered_attributes . "\n";

}

 

// lets start with the email confirmation

$email_order = STORE_NAME . "\n" .

EMAIL_SEPARATOR . "\n" .

EMAIL_TEXT_ORDER_NUMBER . ' ' . $order_id . "\n" .

EMAIL_TEXT_INVOICE_URL . ' ' . tep_href_link(FILENAME_ACCOUNT_HISTORY_INFO, 'order_id=' . $order_id, 'SSL', false) . "\n" .

EMAIL_TEXT_DATE_ORDERED . ' ' . strftime(DATE_FORMAT_LONG) . "\n\n";

if ($order->info['comments']) {

$email_order .= tep_db_output($order->info['comments']) . "\n\n";

}

$email_order .= EMAIL_TEXT_PRODUCTS . "\n" .

EMAIL_SEPARATOR . "\n" .

$products_ordered .

EMAIL_SEPARATOR . "\n";

 

for ($i=0, $n=sizeof($order_totals); $i<$n; $i++) {

$email_order .= strip_tags($order_totals[$i]['title']) . ' ' . strip_tags($order_totals[$i]['text']) . "\n";

}

 

if ($order->content_type != 'virtual') {

$email_order .= "\n" . EMAIL_TEXT_DELIVERY_ADDRESS . "\n" .

EMAIL_SEPARATOR . "\n" .

tep_address_label($customer_id, $sendto, 0, '', "\n") . "\n";

}

 

$email_order .= "\n" . EMAIL_TEXT_BILLING_ADDRESS . "\n" .

EMAIL_SEPARATOR . "\n" .

tep_address_label($customer_id, $billto, 0, '', "\n") . "\n\n";

 

if (is_object($$payment)) {

$email_order .= EMAIL_TEXT_PAYMENT_METHOD . "\n" .

EMAIL_SEPARATOR . "\n";

$payment_class = $$payment;

$email_order .= $payment_class->title . "\n\n";

if ($payment_class->email_footer) {

$email_order .= $payment_class->email_footer . "\n\n";

}

}

 

tep_mail($order->customer['firstname'] . ' ' . $order->customer['lastname'], $order->customer['email_address'], EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);

 

// send emails to other people

if (SEND_EXTRA_ORDER_EMAILS_TO != '') {

tep_mail('', SEND_EXTRA_ORDER_EMAILS_TO, EMAIL_TEXT_SUBJECT, $email_order, STORE_OWNER, STORE_OWNER_EMAIL_ADDRESS);

}

 

// load the after_process function from the payment modules

$this->after_process();

 

$cart->reset(true);

 

// unregister session variables used during checkout

tep_session_unregister('sendto');

tep_session_unregister('billto');

tep_session_unregister('shipping');

tep_session_unregister('payment');

tep_session_unregister('comments');

 

tep_session_unregister('cart_PayPal_Standard_ID');

 

tep_redirect(tep_href_link(FILENAME_CHECKOUT_SUCCESS, '', 'SSL'));

}

 

function after_process() {

return false;

}

 

function output_error() {

return false;

}

 

function check() {

if (!isset($this->_check)) {

$check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_PAYPAL_STANDARD_STATUS'");

$this->_check = tep_db_num_rows($check_query);

}

return $this->_check;

}

 

function install() {

$check_query = tep_db_query("select orders_status_id from " . TABLE_ORDERS_STATUS . " where orders_status_name = 'Preparing [PayPal Standard]' limit 1");

 

if (tep_db_num_rows($check_query) < 1) {

$status_query = tep_db_query("select max(orders_status_id) as status_id from " . TABLE_ORDERS_STATUS);

$status = tep_db_fetch_array($status_query);

 

$status_id = $status['status_id']+1;

 

$languages = tep_get_languages();

 

From line 501 we have a same method of sending confirm email as default function "tep_mail" so I have tried to change it to use yours "tep_mail_string_attachment" , but when I have added just before tep_mail call the following code:

 

echo $HTTP_GET_VARS['order_id'];

die();

 

it returns nothing, so I understand it this way that order_id is been not passed by $HTTP_GET_VARS.

The PayPal standard works this way:

1. customer confirms his order on checkout_confirmation.php and its been diverted to paypal secured page where he can finish payment transaction (paying by card or paypal account)

2. customer finish and confirm payment on paypal pages and on the final page he can see a button called "Return to the shop" and now:

when you hover over the button you can see that it should be diverted to checkout_proccess.php but in fact is been diverted to paypal_standard.php

3. when all the functions from paypal_standard are done customer should be diverted to checkout_success.php (and on this step I can see a bug which is diverting him to account_history_info.php)

Hope that someone will be able to help because I'm trying now for 2 days with no luck :(

Link to comment
Share on other sites

Hi Chris

 

I'm trying to put the order number in the email subject for email pdf invoice.

 

Ive modified the code in general.php as below, but the order number does not apear in the email subject line?

 

// Send message

$message->build_message();

$new_mail_subject = EMAIL_TEXT_ORDER_NUMBER . ' ' . $insert_id . ' - ' . STORE_NAME . "\n" ;

$message->send($to_name, $to_email_address, $from_email_name, $from_email_address, $new_mail_subject);

}

Edited by Windows
Link to comment
Share on other sites

2. customer finish and confirm payment on paypal pages and on the final page he can see a button called "Return to the shop" and now:

when you hover over the button you can see that it should be diverted to checkout_proccess.php but in fact is been diverted to paypal_standard.php

3. when all the functions from paypal_standard are done customer should be diverted to checkout_success.php (and on this step I can see a bug which is diverting him to account_history_info.php)

 

Were you getting this issue (highlighted above) before installing the PDF email attachment modification?

 

If you were, I suggest removing /commenting out the PDF code until you get the PayPal module working. Once you get the bounce back to checkout_process.php, we can look at what's happening to $HTTP_GET_VARS

 

Chris

Please use forum for support rather than PM - PMs unrelated to my contributions will be ignored.

Google Site Search is your friend

My contributions: Tracking Module | PDF Customer Invoice | Subcategory textboxes

Link to comment
Share on other sites

Hi Chris

 

I'm trying to put the order number in the email subject for email pdf invoice.

 

Ive modified the code in general.php as below, but the order number does not apear in the email subject line?

 

// Send message

$message->build_message();

$new_mail_subject = EMAIL_TEXT_ORDER_NUMBER . ' ' . $insert_id . ' - ' . STORE_NAME . "\n" ;

$message->send($to_name, $to_email_address, $from_email_name, $from_email_address, $new_mail_subject);

}

 

Hi Scott,

 

You need to pass $insert_id as a function parameter:

 

tep_mail_string_attachment(yada, yada, $filename);

 

becomes:

 

tep_mail_string_attachment(yada, yada, $filename, $insert_id);

 

HTH

 

Chris

Please use forum for support rather than PM - PMs unrelated to my contributions will be ignored.

Google Site Search is your friend

My contributions: Tracking Module | PDF Customer Invoice | Subcategory textboxes

Link to comment
Share on other sites

HI Chris Ive added the code like below but the order number still doesn not appear in the email subject?

 

// Added chris23. New wrapper around email class to handle string attachments. Allows emailing of pdf customer invoices
 // Additional parameters:
 // $string = string data (ascii or binary)
 // $filename = target filename for attached data

 function tep_mail_string_attachment($to_name, $to_email_address, $email_subject, $email_text, $from_email_name, $from_email_address, $string, $filename, $insert_id) {
   if (SEND_EMAILS != 'true') return false;

   // Instantiate a new mail object
   $message = new email(array('X-Mailer: osCommerce'));

   // Build the text version
   $text = strip_tags($email_text);
   if (EMAIL_USE_HTML == 'true') {
     $message->add_html($email_text, $text);
   } else {
     $message->add_text($text);
   }

   // Now add string attachment - new method of email.php
   $message->add_string_attachment($string, $filename, 'application/pdf');


   // Send message
   $message->build_message();
$new_mail_subject = EMAIL_TEXT_ORDER_NUMBER . ' ' . $insert_id . ' - ' . STORE_NAME . "\n" ;
   $message->send($to_name, $to_email_address, $from_email_name, $from_email_address, $new_mail_subject);
 }

Link to comment
Share on other sites

HI Chris Ive added the code like below but the order number still doesn not appear in the email subject?

 

Scott,

I should have been clearer - you need to make this change both in the function definition in general.php and also when you call the function, in this case in checkout_process.php

Cheers

Chris

Please use forum for support rather than PM - PMs unrelated to my contributions will be ignored.

Google Site Search is your friend

My contributions: Tracking Module | PDF Customer Invoice | Subcategory textboxes

Link to comment
Share on other sites

Hi Chris thx for reply,

The issue is on paypal secured paged and it was always like that (Paypal works as it should be and it was working before I have added an email attachment module.)

that's why I don't really know where can I find a solution for it ...

Link to comment
Share on other sites

  • 2 weeks later...

Only one thing to say:

 

- This contribution rockszz!!!!!

 

Thanks.

 

 

I have two questions. Is there any way to only generate PDF Invoices only in admin page?

I will send an ivoice pdf by e-mail only on "shipping" day.

 

Can I put different information on header and footer of PDF?

 

 

Thanks again.

Link to comment
Share on other sites

..Is there any way to only generate PDF Invoices only in admin page...

Good question!

an invoive is normally produced only when the goods is delivered, not during the process of placing an order, as orders could be cancelled. at the end of the ordering process, an order confirmation email is good enough and what is needed.

i haven't tried it myself and may be missing something but given that someone who does asks such a question then i think there is an issue there.

 

Ken

commercial support - unProtected channel, not to be confused with the forum with same name - open to everyone who need some professional help: either PM/email me, or go to my website (URL can be found in my profile).

over 20 years of computer programming experience.

Link to comment
Share on other sites

Good question!

an invoive is normally produced only when the goods is delivered, not during the process of placing an order, as orders could be cancelled. at the end of the ordering process, an order confirmation email is good enough and what is needed.

i haven't tried it myself and may be missing something but given that someone who does asks such a question then i think there is an issue there.

 

Ken

 

Hi,

 

This should all be handled by the contribution. The configuration option:

 

- Only display invoice for delivered orders? [ Default = true ] By default, customers will only be offered a link to generate a PDF invoice if the latest order status is "Delivered". Setting this config to "false" will display the PDF link in order history regardless of order status.

 

means the customer will only see a download link once the goods have been flagged as delivered.

 

The "email as attachment" add-on currently emails the invoice during the order process so this could be an issue for cancelled orders. This has been discussed in this thread, with differing opinions on whether "Copy Invoice" or some disclaimer text is sufficient (you'd need to seek an accountant's advice for a definitive answer!)

 

HTH

 

Chris

Please use forum for support rather than PM - PMs unrelated to my contributions will be ignored.

Google Site Search is your friend

My contributions: Tracking Module | PDF Customer Invoice | Subcategory textboxes

Link to comment
Share on other sites

Can I put different information on header and footer of PDF?

 

Hi,

 

Footer text can be set within admin. Can you explain what you mean by "header" information?

 

Rgds,

 

Chris

Please use forum for support rather than PM - PMs unrelated to my contributions will be ignored.

Google Site Search is your friend

My contributions: Tracking Module | PDF Customer Invoice | Subcategory textboxes

Link to comment
Share on other sites

Great contribution . Love it.

 

One problem . It was all working fine until I removed the watermark. When I now click the invoice in admin I get a page 500 error on every invoice. I think its still OK for the customers. I've tried it on my pretend accounts and it still seams to work.

 

Any ideas ??

 

Any help would be very much appreciated

Link to comment
Share on other sites

This looks like a great contribution and I want to go and install it. I've downloaded and read the installation instructions and have:

 

1. Run pdf_customer_invoice.sql ** this is not optional! **

 

Sorry if I'm being a dunce :blink: , but can anybody advise how to do this?

t o n e u s

Link to comment
Share on other sites

This looks like a great contribution and I want to go and install it. I've downloaded and read the installation instructions and have:

 

1. Run pdf_customer_invoice.sql ** this is not optional! **

 

Sorry if I'm being a dunce :blink: , but can anybody advise how to do this?

 

Ignore this, I figured it out. (If anybody else is stuck with this, then phpMyAdmin is the tool to use and run an SQL query from a file.) :rolleyes:

t o n e u s

Link to comment
Share on other sites

Managed to install this contribution and it works great, with one exception. The inc Tax field is not showing any tax added. For example, here is the invoice generated from OSAdmin:

 

os_invoice.jpg

 

where the tax is correctly shown. Now for the pdf invoice:

 

pdf_invoice.jpg

 

Although the VAT is correct, the line items are wrong.

 

Any ideas?

t o n e u s

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...