%PDF- %PDF-
Direktori : /home/lightco1/public_html/plugins/vmpayment/sofort/sofort/library/helper/ |
Current File : /home/lightco1/public_html/plugins/vmpayment/sofort/sofort/library/helper/class.invoice.inc.php |
<?php defined('_JEXEC') or die('Restricted access'); /** * Copyright (c) 2012 SOFORT AG * * Released under the GNU General Public License (Version 2) * [http://www.gnu.org/licenses/gpl-2.0.html] * * $Date: 2012-11-23 17:15:47 +0100 (Fri, 23 Nov 2012) $ * @version $Id: class.invoice.inc.php 5773 2012-11-23 16:15:47Z dehn $ * @package sofortLib * @author SOFORT AG http://www.sofort.com (integration@sofort.com) * */ /** * Abstraction of an invoice * Helper class to ease usage of "Rechnung by sofort" * Encapsulates Multipay, TransactionData and ConfirmSr to handle everything there is about "Rechnung by sofort" * @see SofortLib_Multipay * @see SofortLib_TransactionData * @see SofortLib_ConfirmSr */ class PnagInvoice extends PnagAbstractDocument { const PENDING_CONFIRM_INVOICE = 4195329; const LOSS_CANCELED = 4194824; const LOSS_CONFIRMATION_PERIOD_EXPIRED = 4196360; const PENDING_NOT_CREDITED_YET_PENDING = 32785; const PENDING_NOT_CREDITED_YET_REMINDER_1 = 65553; const PENDING_NOT_CREDITED_YET_REMINDER_2 = 131089; const PENDING_NOT_CREDITED_YET_REMINDER_3 = 262161; const PENDING_NOT_CREDITED_YET_DELCREDERE = 524305; const RECEIVED_CREDITED_PENDING = 33026; const RECEIVED_CREDITED_REMINDER_1 = 65794; const RECEIVED_CREDITED_REMINDER_2 = 131330; const RECEIVED_CREDITED_REMINDER_3 = 262402; const RECEIVED_CREDITED_DELCREDERE = 524546; /* im normalfall nicht möglich */ const REFUNDED_REFUNDED_PENDING = 32836; const REFUNDED_REFUNDED_RECEIVED = 2097220; const REFUNDED_REFUNDED_REMINDER_1 = 65604; const REFUNDED_REFUNDED_REMINDER_2 = 131140; const REFUNDED_REFUNDED_REMINDER_3 = 262212; const REFUNDED_REFUNDED_DELCREDERE = 524356; /* im normalfall nicht möglich */ const REFUNDED_REFUNDED_REFUNDED = 1048644; const PENDING_NOT_CREDITED_YET_RECEIVED = 2097169; const RECEIVED_CREDITED_RECEIVED = 2097410; /** * * Multipay-Object to handle API calls * @var object * @private */ public $SofortLib_Multipay = null; /** * Object TransactionData to handle information about transactions * @var object * @private */ public $SofortLib_TransactionData = null; /** * Object Confirm_SR to handle sofortrechnung/rechnung by sofort items * Handling of Sofortrechung * @var object * @private */ public $ConfirmSr = null; public $EditSr = null; public $CancelSr = null; protected $_items = array(); /** * * Some kind of a bitmask to represent every possible state of Rechnung by sofort * Every combination must be unique to represent a unique state * @var array * @private */ private $_statusMask = array( 'status'=> array( 'pending' => 1, 'received' => 2, 'refunded' => 4, 'loss' => 8, ), 'status_reason' => array( 'not_credited_yet' => 16, 'not_credited' => 32, 'refunded' => 64, 'compensation' => 128, 'credited' => 256, 'canceled' => 512, 'confirm_invoice' => 1024, 'confirmation_period_expired' => 2048, 'wait_for_money' => 4096, 'reversed' => 8192, 'rejected' => 16384, ), 'invoice_status' => array( 'pending' => 32768, 'reminder_1' => 65536, 'reminder_2' => 131072, 'reminder_3' => 262144, 'delcredere' => 524288, 'refunded' => 1048576, 'received' => 2097152, 'empty' => 4194304, ) ); /** * * @see $statusMask * @var string * @private */ private $_status = ''; /** * * @see $statusMask * @var string * @private */ private $_status_reason = ''; /** * * @see $statusMask * @var string */ private $_invoice_status = ''; /** * * Invoice's objection (Einrede) * @var string */ private $_invoice_objection = ''; /** * * language code * @var string */ private $_language_code = ''; /** * * transaction id * @var string * @private */ private $_transactionId = ''; /** * api key given in project setup in payment network backend * @var string * @private */ private $_configKey = ''; /** * * api url * @var string * @private */ private $_apiUrl = ''; /** * time * @var string * @private */ private $_time = ''; /** * payment method * @var string * @private */ private $_payment_method = ''; /** * The resulting url to the invoice (PDF) * @var string * @private */ private $_invoiceUrl = ''; /** * Constructor for PnagInvoice * @param string $apiKey * @param string $transactionId * @param string $apiUrl */ public function __construct($configKey, $transactionId = '') { $this->_transactionId = $transactionId; $this->_configKey = $configKey; $this->_apiUrl = (getenv('sofortApiUrl') != '') ? getenv('sofortApiUrl') : 'https://api.sofort.com/api/xml'; $this->SofortLib_Multipay = new SofortLib_Multipay($this->_configKey, $this->_apiUrl); if ($transactionId != '') { $this->SofortLib_TransactionData = $this->_setupTransactionData(); $this->ConfirmSr = $this->_setupConfirmSr(); } return $this; } /** * Getter for a class constant * @param int $id * @return string */ public function getConstantById($id) { $Object = new ReflectionClass(__CLASS__); $constants = array_flip($Object->getConstants()); return (array_key_exists($id, $constants)) ? $constants[$id] : 0; } /** * * Getter for a class constant * @param string $name * @return int */ public function getConstantByName($name) { $Object = new ReflectionClass(__CLASS__); $constants = $Object->getConstants(); return (array_key_exists($name, $constants)) ? $constants[$name] : 0; } /** * * Set the bitmask to a specific state * @param string $status * @param string $status_reason * @param string $invoice_status * @return string pending - confirm_invoice - empty -> 4195329 */ public function setBitmask($status, $statusReason, $invoiceStatus) { $this->_status = $status; $this->_status_reason = $statusReason; $this->_invoice_status = $invoiceStatus; $string = $this->_status.' - '.$this->_status_reason.' - '.$this->_invoice_status; return $string.' -> '.$this->_calcInvoiceStatusCode()."\n"; } /** * * Set the state * An optional callback can be registered * @param int $state * @param function $callback */ public function setState($state, $callback = '') { $this->_state = $state; if ($callback != '') { call_user_func($callback); } return $this; } /** * Getter for the current state * @return int $this->state */ public function getState() { return $this->_state; } /** * Setter for transactionId * @param $transactionId * @public */ public function setTransactionId($transactionId) { $this->_transactionId = $transactionId; $this->SofortLib_TransactionData = $this->_setupTransactionData(); $this->ConfirmSr = $this->_setupConfirmSr(); return $this; } /** * Construct the SofortLib_TransactionData object * Collect every order's item and set it accordingly * TransactionData is used encapsulated in this class to retrieve information about the order's details * @return object SofortLib_TransactionData * @private */ private function _setupTransactionData() { $SofortLib_TransactionData = new SofortLib_TransactionData($this->_configKey, $this->_apiUrl); $SofortLib_TransactionData->setTransaction($this->_transactionId); $SofortLib_TransactionData->sendRequest(); if (!$SofortLib_TransactionData->getCount()) { return false; } $this->setStatus($SofortLib_TransactionData->getStatus()); $this->setStatusReason($SofortLib_TransactionData->getStatusReason()); $this->setStatusOfInvoice($SofortLib_TransactionData->getInvoiceStatus()); $this->setInvoiceObjection($SofortLib_TransactionData->getInvoiceObjection()); $this->setLanguageCode($SofortLib_TransactionData->getLanguageCode()); $this->setTransaction($this->getTransactionId()); $this->setTime($SofortLib_TransactionData->getTime()); $this->setPaymentMethod($SofortLib_TransactionData->getPaymentMethod()); $this->setInvoiceUrl($SofortLib_TransactionData->getInvoiceUrl()); $this->setAmount($SofortLib_TransactionData->getAmount()); $this->setAmountRefunded($SofortLib_TransactionData->getAmountRefunded()); $itemArray = $SofortLib_TransactionData->getItems(); // should there be any items, fetch them accordingly $this->_items = array(); if (is_array($itemArray) && !empty($itemArray)) { foreach ($itemArray as $item) { $this->setItem($item['item_id'], $item['product_number'], $item['product_type'], $item['title'], $item['description'], $item['quantity'], $item['unit_price'], $item['tax']); $this->_amount += ($item['unit_price'] * $item['quantity']); } } /* * set the state according to the state given by transaction information (status, status_reason, invoice_status) * @see $statusMask */ $this->setState($this->_calcInvoiceStatusCode()); return $SofortLib_TransactionData; } /** * * Setter for SofortLib_Multipay * @param object $SofortLib_Multipay */ public function setSofortLibMultipay($SofortLib_Multipay) { $this->SofortLib_Multipay = $SofortLib_Multipay; } /** * * Setter for SofortLib_TransactionData * @param object $SofortLib_TransactionData */ public function setSofortLibTransactionData($SofortLib_TransactionData) { $this->SofortLib_TransactionData = $SofortLib_TransactionData; } /** * * Setter for SofortLib_EditSr * @param object $SofortLib_EditSr */ public function setSofortLibEditSr($SofortLib_EditSr) { $this->EditSr = $SofortLib_EditSr; } /** * * Setter for SofortLib_CancelSr * @param object $SofortLib_CancelSr */ public function setSofortLibCancelSr($SofortLib_CancelSr) { $this->CancelSr = $SofortLib_CancelSr; } /** * Initialize SofortLib_ConfirmSR * @private * @return Object SofortLib_ConfirmSr */ private function _setupConfirmSr() { $SofortLib_ConfirmSr = new SofortLib_ConfirmSr($this->_configKey); $SofortLib_ConfirmSr->setTransaction($this->_transactionId); return $SofortLib_ConfirmSr; } /** * * Setup EditSr object */ private function _setupEditSr() { $SofortLib_EditSr = new SofortLib_EditSr($this->_configKey); $SofortLib_EditSr->setTransaction($this->_transactionId); return $SofortLib_EditSr; } /** * * Setup CancelSr object */ private function _setupCancelSr() { $SofortLib_CancelSr = new SofortLib_CancelSr($this->_configKey); $SofortLib_CancelSr->setTransaction($this->_transactionId); return $SofortLib_CancelSr; } /** * Refreshes the TransactionData with the data directly from the pnag-server * @return boolean */ public function refreshTransactionData() { $this->SofortLib_TransactionData = $this->_setupTransactionData(); return true; } /** * Wrapper function for cancelling this invoice via SofortLib_Multipay (SofortLib) * @return Ambigious boolean/Array * @todo fix returned value array, empty array * @public */ public function cancelInvoice($transactionId = '', $creditNoteNumber = '') { if ($transactionId != '' || $transactionId = $this->getTransactionId()) { $this->_transactionId = $transactionId; $this->CancelSr = $this->_setupCancelSr(); } if ($this->CancelSr != null) { unset($this->_items); $this->CancelSr->cancelInvoice(); $this->CancelSr->setComment('Vollstorno'); $creditNoteNumber && $this->CancelSr->setCreditNoteNumber($creditNoteNumber); $this->CancelSr->sendRequest(); $this->SofortLib_TransactionData = $this->_setupTransactionData(); return $this->getErrors(); } return false; } /** * Wrapper function for confirming this invoice via SofortLib_Multipay (SofortLib) * @param $transactionId - optional parameter for confirming a transaction on the fly * @param $invoiceNumer - optional parameter for own invoice number * @param $customerNumber - optional parameter for own customer number * @param $orderNumber - optional parameter for own order number * @return Ambigious boolean/Array * @todo fix returned value array, empty array * @public */ public function confirmInvoice($transactionId = '', $invoiceNumber = '', $customerNumber = '', $orderNumber = '') { if ($transactionId != '' || $transactionId = $this->getTransactionId()) { $this->_transactionId = $transactionId; $this->ConfirmSr = $this->_setupConfirmSr(); } if ($this->ConfirmSr != null) { $this->ConfirmSr->confirmInvoice(); $invoiceNumber && $this->ConfirmSr->setInvoiceNumber($invoiceNumber); $customerNumber && $this->ConfirmSr->setCustomerNumber($customerNumber); $orderNumber && $this->ConfirmSr->setOrderNumber($orderNumber); $this->ConfirmSr->setApiVersion('2.0'); $this->ConfirmSr->sendRequest(); $this->SofortLib_TransactionData = $this->_setupTransactionData(); return $this->getErrors(); } return false; } /** * Wrapper function for removing an article via SofortLib_Multipay (SofortLib) * @param $transactionId string * @param $PnagArticels array * @param $comment int * @public * return array */ public function updateInvoice($transactionId, $items, $comment, $invoiceNumber = '', $customerNumber = '', $orderNumber = '') { if ($transactionId != '' || $transactionId = $this->getTransactionId()) { $this->_transactionId = $transactionId; $this->EditSr = $this->_setupEditSr(); } if ($this->EditSr != null) { $this->EditSr->setComment($comment); $invoiceNumber && $this->EditSr->setInvoiceNumber($invoiceNumber); $customerNumber && $this->EditSr->setCustomerNumber($customerNumber); $orderNumber && $this->EditSr->setOrderNumber($orderNumber); $this->EditSr->updateCart($items); $this->EditSr->sendRequest(); $this->SofortLib_TransactionData = $this->_setupTransactionData(); return $this->getErrors(); } return false; } /** * Wrapper function for updating order number after order hast been placed * @param string $transactionId * @param string $orderNumber */ public function updateOrderNumber($transactionId, $orderNumber) { if ($transactionId != '' || $transactionId = $this->getTransactionId()) { $this->_transactionId = $transactionId; $this->EditSr = $this->_setupEditSr(); } if ($this->EditSr != null) { $orderNumber && $this->EditSr->setOrderNumber($orderNumber); $this->EditSr->sendRequest(); } } /* ########################## WRAPPER FUNCTIONS MULTIPAY ########################## */ /** * Wrapper for SofortLib_Multipay::addSofortrechnungItem * @see SofortLib_Multipay * @public * @param $itemId * @param $productNumber * @param $title * @param $unit_price - float precision 2 @see SofortLib_Multipay api * @param $productType * @param $description * @param $quantity - int * @param $tax */ public function addItemToInvoice($itemId, $productNumber, $title, $unitPrice, $productType = 0, $description = '', $quantity = 1, $tax = 19) { $unitPrice = round($unitPrice, 2); // round all prices to two decimals $this->SofortLib_Multipay->addSofortrechnungItem($itemId, $productNumber, $title, $unitPrice, $productType, $description, $quantity, $tax); $this->setItem($itemId, $productNumber, $productType, $title, $description, $quantity, $unitPrice, $tax); $this->_amount += ($quantity * $unitPrice); $this->setAmount($this->_amount, $this->_currency); } /** * Remove an item from the invoice * @public * @param $itemId * @return boolean */ public function removeItemfromInvoice($itemId) { $return = false; $i = 0; foreach ($this->_items as $item) { if ($item->itemId == $itemId) { // TODO: remove item //unset($this->_items[$i]); $this->setAmount($this->getAmount() - $this->getItemAmount($itemId)); $return = $this->SofortLib_Multipay->removeSofortrechnungItem($itemId); } $i++; } return $return; } /** * * Update an invoice's item * @param string $itemId * @param int $quantity * @param float $unitPrice */ public function updateInvoiceItem($itemId, $quantity, $unitPrice) { $return = false; foreach ($this->_items as $item) { if ($item->itemId == $itemId) { $oldPrice = $item->unitPrice * $item->quantity; $item->uniPrice = $unitPrice; $item->quantity = $quantity; $newPrice = $unitPrice * $quantity; $this->setAmount($this->getAmount() - $oldPrice + $newPrice); $return = $this->SofortLib_Multipay->updateSofortrechnungItem($itemId, $quantity, $unitPrice); } } return $return; } /** * * Getter for an invoice's amount * @param string $itemId */ public function getItemAmount($itemId) { return $this->SofortLib_Multipay->getSofortrechnungItemAmount($itemId); } /** * Wrapper for SofortLib_Multipay::setSofortrechnungShippingAddress * @see SofortLib_Multipay * @public * @param $firstname * @param $lastname * @param $street * @param $streetNumber * @param $zipcode * @param $city * @param $salutation * @param $country (optional, default: DE) * @param $nameAdditive (optional) * @param $streetAdditive (optional) * @param $companyName (optional) */ public function addShippingAddress($firstname, $lastname, $street, $streetNumber, $zipcode, $city, $salutation, $country = 'DE', $nameAdditive = '', $streetAdditive = '', $companyName = '') { $this->SofortLib_Multipay->setSofortrechnungShippingAddress($firstname, $lastname, $street, $streetNumber, $zipcode, $city, $salutation, $country, $nameAdditive, $streetAdditive, $companyName); } /** * Wrapper for SofortLib_Multipay::setSofortrechnungShippingAddress * @see SofortLib_Multipay * @public * @param $firstname * @param $lastname * @param $street * @param $streetNumber * @param $zipcode * @param $city * @param $salutation * @param $country (optional, default: DE) * @param $nameAdditive (optional) * @param $streetAdditive (optional) * @deprecated */ public function addShippingAddresss($firstname, $lastname, $street, $streetNumber, $zipcode, $city, $salutation, $country = 'DE', $nameAdditive = '', $streetAdditive = '') { $this->SofortLib_Multipay->setSofortrechnungShippingAddress($firstname, $lastname, $street, $streetNumber, $zipcode, $city, $salutation, $country, $nameAdditive, $streetAdditive); } /** * Wrapper for SofortLib_Multipay::setSofortrechnungInvoiceAddress * @see SofortLib_Multipay * @public * @param $firstname * @param $lastname * @param $street * @param $streetNumber * @param $zipcode * @param $city * @param $salutation * @param $country (optional, default: DE) * @param $nameAdditive (optional) * @param $streetAdditive (optional) * @param $companyName (optional) */ public function addInvoiceAddress($firstname, $lastname, $street, $streetNumber, $zipcode, $city, $salutation, $country = 'DE', $nameAdditive = '', $streetAdditive = '', $companyName = '') { $this->SofortLib_Multipay->setSofortrechnungInvoiceAddress($firstname, $lastname, $street, $streetNumber, $zipcode, $city, $salutation, $country, $nameAdditive, $streetAdditive, $companyName); } /** * Wrapper function for SofortLib_Multipay::setSofortrechnungOrderId * @see SofortLib_Multipay * @public * @param $arg */ public function setOrderId($arg) { $this->SofortLib_Multipay->setSofortrechnungOrderId($arg); } /** * Wrapper function for SofortLib_Multipay::setSofortrechnungCustomerId * @public * @param $arg */ public function setCustomerId($arg) { $this->SofortLib_Multipay->setSofortrechnungCustomerId($arg); } /** * Wrapper function for SofortLib_Multipay::setPhoneNumberCustomer * @public * @param $arg */ public function setPhoneNumberCustomer($arg) { $this->SofortLib_Multipay->setPhoneNumberCustomer($arg); } /** * Wrapper function for SofortLib_Multipay::setEmailCustomer * @public * @param $arg */ public function setEmailCustomer($arg) { $this->SofortLib_Multipay->setEmailCustomer($arg); } /** * Wrapper function for SofortLib_Multipay::addUserVariable * @public * @param $arg */ public function addUserVariable($arg) { $this->SofortLib_Multipay->addUserVariable($arg); } /** * Wrapper function for SofortLib_Multipay::setNotificationUrl * @public * @param $arg */ public function setNotificationUrl($arg) { $this->SofortLib_Multipay->setNotificationUrl($arg); } /** * Wrapper function for SofortLib_Multipay::setAbortUrl * @public * @param $arg */ public function setAbortUrl($arg) { $this->SofortLib_Multipay->setAbortUrl($arg); } /** * Wrapper function for SofortLib_Multipay::setSuccessUrl * @public * @param $arg */ public function setSuccessUrl($arg) { $this->SofortLib_Multipay->setSuccessUrl($arg); } /** * Wrapper function for SofortLib_Multipay::setTimeoutUrl * @public * @param $arg */ public function setTimeoutUrl($arg) { $this->SofortLib_Multipay->setTimeoutUrl($arg); } /** * Wrapper function for SofortLib_Multipay::setTimeout * @public * @param $arg */ public function setTimeout($arg) { $this->SofortLib_Multipay->setTimeout($arg); } /** * Wrapper function for SofortLib_Multipay::setReason * @public * @param $reason1 string * @param $reason2 string */ public function setReason($reason1, $reason2 = '') { $this->SofortLib_Multipay->setReason($reason1, $reason2); } /** * Wrapper function for SofortLib_Multipay::setAmount * @public * @param $arg float * @param $currency string */ public function setAmount($arg, $currency = 'EUR') { $this->SofortLib_Multipay->setAmount($arg, $currency); } /** * current total amount of the given order-articles * @return float - sum (price, total) of all articles */ public function getAmount() { if (isset($this->SofortLib_TransactionData) && $this->SofortLib_TransactionData instanceof SofortLib_TransactionData) { $amount = $this->SofortLib_TransactionData->getAmount(); } else { $amount = $this->_amount; } if ($amount != 0.00) { return $amount; } elseif (isset($this->_amount) && $this->_amount != 0.00) { return $this->_amount; // TODO: check } return 0.0; } /** * * Setter for amount refunded * @param amount $arg */ public function setAmountRefunded($arg) { $this->_amountRefunded = $arg; } /** * * Getter for amount refunded */ public function getAmountRefunded() { return $this->_amountRefunded; } /** * Wrapper function for SofortLib_Multipay::setSofortrechnung * @public */ public function setSofortrechnung() { $this->SofortLib_Multipay->setSofortrechnung(); } /** * Wrapper function for SofortLib_Multipay::setDebitorVatNumber * @public */ public function setDebitorVatNumber($vatNumber) { $this->SofortLib_Multipay->setDebitorVatNumber($vatNumber); } /** * Wrapper function for SofortLib_Multipay::getPaymentUrl * @public * @return url string */ public function getPaymentUrl() { return $this->SofortLib_Multipay->getPaymentUrl(); } /** * * Getter for invoice's number */ public function getInvoiceNumber() { return $this->SofortLib_TransactionData->getInvoiceNumber(); } /** * * Getter for customer's number */ public function getCustomerNumber() { return $this->SofortLib_TransactionData->getCustomerNumber(); } /** * * Getter for order's number */ public function getOrderNumber() { if ($this->SofortLib_TransactionData instanceof SofortLib_TransactionData) { return $this->SofortLib_TransactionData->getOrderNumber(); } return false; } /** * Wrapper function for SofortLib_Multipay::geInvoiceType * @public * @return (OR or LS) */ public function getInvoiceTye() { return $this->SofortLib_TransactionData->getInvoiceType(); } /** * Wrapper function for SofortLib_Multipay::getPaymentUrl * @public * @return url string */ public function getTransactionId() { if ($this->SofortLib_Multipay instanceof SofortLib_Multipay && $transactionId = $this->SofortLib_Multipay->getTransactionId()) { return $transactionId; } elseif ($this->SofortLib_TransactionData instanceof SofortLib_TransactionData && $transactionId = $this->SofortLib_TransactionData->getTransaction()) { return $transactionId; } else { return $this->_transactionId; } } /** * Validate your parameters against API * @return array - any validationerrors and -warnings * @public */ /* public function validateRequest() { $errorsAndWarnings = $this->SofortLib_Multipay->validateRequest('sr'); return $errorsAndWarnings; } */ /** * send the order to pnag (-> buy your products) * @return empty array if ok ELSE array with errors and/or warnings * @public */ public function checkout() { $this->SofortLib_Multipay->sendRequest(); $this->_transactionId = $this->SofortLib_Multipay->getTransactionId(); // set the resulting transaction id $this->SofortLib_TransactionData = $this->_setupTransactionData(); $errors = array(); if ($this->isError()) { $errors = $this->getErrors(); } $warnings = array(); if ($this->isWarning()) { $warnings = $this->getWarnings(); } if (!empty($errors) && !empty($warnings)) { return array(); //no errors or warnings found } else { $returnArray = array(); $returnArray['errors'] = $errors; $returnArray['warnings'] = $warnings; return $returnArray; } } /** * * Getter for information about transaction */ public function getTransactionInfo() { if (is_a($this->SofortLib_TransactionData, 'SofortLib')) { $this->SofortLib_TransactionData->setTransaction($this->transactionId); $this->sendRequest(); return $this->SofortLib_TransactionData; } else { $this->SofortLib_TransactionData = $this->_setupTransactionData(); } return array(); } /* ########################## WRAPPER FUNCTIONS MULTIPAY ########################## */ /** * Output the resulting invoice as pdf, if possible * Function uses file_get_contents, if allow_url_fopen is allowed in php.ini (might be disabled on shared hosting) * As a fallback, downloading via cURL, when module cURL is available * If neither file_get_contents nor cURL is available for downloading, a connection via socket is used to download. * @public * @return boolean */ public function getInvoice() { $errorCode = $this->getHttpResponseCode($this->_invoiceUrl); if (!in_array($errorCode, array('200', '301', '302'))) { return false; } header('Content-type: application/pdf'); header('Content-Disposition: attachment; filename="invoice.pdf"'); echo $this->handleDownload($this->getInvoiceDownloadMethod()); } /** * * Handle download of invoice * @param string $method */ public function handleDownload($method = 'socket') { switch ($method) { case 'file_get_contents': return file_get_contents($this->_invoiceUrl); break; case 'curl': return $this->handleCurlDownload(); break; default: return $this->handleSocketDownload(); break; } } /** * * Getter for invoice's download method */ public function getInvoiceDownloadMethod() { if (ini_get('allow_url_fopen')) { $method = 'file_get_contents'; } elseif (function_exists('curl_init')) { $method = 'curl'; } else { $method = 'socket'; } return $method; } /** * * Handle download via cURL */ private function handleCurlDownload() { $curl_handle=curl_init(); curl_setopt($curl_handle, CURLOPT_URL, $this->_invoiceUrl); curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2); curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, false); $buffer = curl_exec($curl_handle); curl_close($curl_handle); return $buffer; } /** * * Handle download via Socket */ private function handleSocketDownload() { $uri = parse_url($this->_invoiceUrl); $host = $uri['host']; $path = $uri['path']; $handle = $this->openSocket($host); $header = $this->makeHeader('GET', $path, $host); fwrite($handle, $header); $buffer = null; while (!feof($handle)) { $buffer .= fgets($handle, 8192); } fclose($handle); return $buffer; } /** * * Getter for HTTP Response code */ public function getHttpResponseCode() { $uri = parse_url($this->_invoiceUrl); $host = $uri['host']; $path = $uri['path']; $handle = $this->openSocket($host); $header = $this->makeHeader('HEAD', $path, $host); fwrite($handle, $header); $buffer = null; while(!feof($handle)) { $buffer .= fgets($handle, 16); } fclose($handle); $httpCode = substr($buffer, 9, 3); return (int)$httpCode; } /** * * Open up a socket * @param string $host */ private function openSocket($host) { if (!$fp = fsockopen('ssl://'.$host, 443, $errno, $errstr, 15)) { return false; } return $fp; } /** * * Make HTTP header for communication * @param string $action * @param string $path * @param string $host */ private function makeHeader($action, $path, $host) { $header = $action." ".$path." HTTP/1.1\r\n"; $header .= 'Host: '.$host."\r\n"; $header .= "User-Agent: SOFORTLib \r\n"; return $header .= "Connection: Close\r\n\r\n"; } /** * Setter for invoiceUrl * @public * @param $invoiceUrl * @return object */ public function setInvoiceUrl($invoiceUrl) { $this->_invoiceUrl = $invoiceUrl; return $this; } /** * Getter for retrieving the invoice's url * @public * @return url string */ public function getInvoiceUrl() { return $this->_invoiceUrl; } /** * Setter for status * @public * @param $status * @return object */ public function setStatus($status) { $this->_status = $status; return $this; } /** * Setter for status_reason * @param $status_reason * @return object */ public function setStatusReason($statusReason) { $this->_status_reason = $statusReason; return $this; } /** * * Setter for invoice_status * @param string $invoice_status | may be emtpy * @return object */ public function setStatusOfInvoice($invoiceStatus = '') { $this->_invoice_status = !empty($invoiceStatus) ? $invoiceStatus : 'empty'; return $this; } /** * * Setter for language_code * @param string $language_code | fallback en * @return object */ public function setLanguageCode($languageCode = '') { $this->_language_code = !empty($languageCode) ? $languageCode : 'en'; return $this; } /** * Setter for transaction * @param $transaction * @return object */ public function setTransaction($transaction) { $this->_transaction = $transaction; return $this; } /** * Setter for variable time * @param $time * @public * return object */ public function setTime($time) { $this->_time = $time; return $this; } /** * Setter for interface version * Wrapper for class Multipay to set version according to shop module and it's interface version * e.g. 'pn_xtc_5.0.0' * @param $arg string */ public function setVersion($arg) { $this->SofortLib_Multipay->setVersion($arg); } /** * Setter for payment_method * @param $paymentMethod * @return object */ public function setPaymentMethod($paymentMethod) { $this->_payment_method = $paymentMethod; return $this; } /** * Sets the reason for objecting this invoice * @param string $invoiceObjection (40-50 chars max.) * @return object */ public function setInvoiceObjection($invoiceObjection) { $this->_invoice_objection = $invoiceObjection; return $this; } /** * Sets the invoice status * @public * @param string $invoiceStatus * @return object */ public function setInvoiceStatus($invoiceStatus) { $this->_invoice_status = $invoiceStatus; return $this; } /** * Returns the reason for objecting this invoice * @public * @return string */ public function getInvoiceObjection() { return $this->_invoice_objection; } /** * Instead of calculated status, this method returns the invoice's staus (string) * @public * @return string */ public function getStatusOfInvoice() { return $this->_invoice_status; } /** * Uses the statusMask to "calculate" the current invoice's payment status * @public * @see Invoice::_calcInvoiceStatusCode * @return int */ public function getInvoiceStatus() { return $this->_calcInvoiceStatusCode(); } /** * * Calculate the current invoice's payment status using bitwise OR * @return int * @private */ private function _calcInvoiceStatusCode() { return $this->_statusMask['status'][$this->_status] | $this->_statusMask['status_reason'][$this->_status_reason] | $this->_statusMask['invoice_status'][$this->_invoice_status]; } /** * Getter for payment_method * @public * @return string */ public function getPaymentMethod() { return $this->_payment_method; } /** * Getter for status_reason * @public * @return string */ public function getStatusReason() { return $this->_status_reason; } /** * Getter for status * @public * @return string */ public function getStatus() { return $this->_status; } /** * Getter for language code * @public * @return string */ public function getLanguageCode() { return $this->_language_code; } /** * Getter for items * @public * @return array */ public function getItems() { return $this->_items; } /** * Setter for invoice items, takes an array of PnagArticle objects * @param array $items */ public function setItems($items) { $this->_items = $items; } /** * return TransactionData, the invoice is working with * NOTICE: if status changed (removeArticle, InvoiceConfirmed etc.) it returns always the FRESH TransactionData from pnag-server * @return object * @see $this->refreshTransactionData(); */ public function getTransactionData() { if ($this->SofortLib_TransactionData) { return $this->SofortLib_TransactionData; } else { return false; } } /** * Check, if errors occured * @public * @return boolean */ public function isError() { if ($this->SofortLib_Multipay) { if ($this->SofortLib_Multipay->isError('sr')) { return true; } } if ($this->ConfirmSr) { if ($this->ConfirmSr->isError('sr')) { return true; } } if ($this->EditSr) { if ($this->EditSr->isError('sr')) { return true; } } if ($this->CancelSr) { if ($this->CancelSr->isError('sr')) { return true; } } if ($this->SofortLib_TransactionData) { if ($this->SofortLib_TransactionData->isError('sr')) { return true; } } return false; } /** * Check, if warnings occured * @public * @return boolean */ public function isWarning() { if ($this->SofortLib_Multipay) { if ($this->SofortLib_Multipay->isWarning('sr')) { return true; } } if ($this->ConfirmSr) { if ($this->ConfirmSr->isWarning('sr')) { return true; } } if ($this->EditSr) { if ($this->EditSr->isWarning('sr')) { return true; } } if ($this->CancelSr) { if ($this->CancelSr->isWarning('sr')) { return true; } } if ($this->SofortLib_TransactionData) { if ($this->SofortLib_TransactionData->isWarning('sr')) { return true; } } return false; } /** * returns one error (as String!) */ public function getError() { if ($this->SofortLib_Multipay) { if ($this->SofortLib_Multipay->isError('sr')) { return $this->SofortLib_Multipay->getError('sr'); } } if ($this->ConfirmSr) { if ($this->ConfirmSr->isError('sr')) { return $this->ConfirmSr->getError('sr'); } } if ($this->EditSr) { if ($this->EditSr->isError('sr')) { return $this->EditSr->getError('sr'); } } if ($this->CancelSr) { if ($this->CancelSr->isError('sr')) { return $this->CancelSr->getError('sr'); } } if ($this->SofortLib_TransactionData) { if ($this->SofortLib_TransactionData->isError('sr')) { return $this->SofortLib_TransactionData->getError('sr'); } } return ''; } /** * collect all errors and returns them * @return array - all errors * @public */ public function getErrors() { $allErrors = array(); if ($this->SofortLib_Multipay) { if ($this->SofortLib_Multipay->isError('sr')) { $allErrors = array_merge($this->SofortLib_Multipay->getErrors('sr'), $allErrors); } } if ($this->ConfirmSr) { if ($this->ConfirmSr->isError('sr')) { $allErrors = array_merge($this->ConfirmSr->getErrors('sr'), $allErrors); } } if ($this->EditSr) { if ($this->EditSr->isError('sr')) { $allErrors = array_merge($this->EditSr->getErrors('sr'), $allErrors); } } if ($this->CancelSr) { if ($this->CancelSr->isError('sr')) { $allErrors = array_merge($this->CancelSr->getErrors('sr'), $allErrors); } } if ($this->SofortLib_TransactionData) { if ($this->SofortLib_TransactionData->isError('sr')) { $allErrors = array_merge($this->SofortLib_TransactionData->getErrors('sr'), $allErrors); } } return $allErrors; } /** * * Ouputs errors in a more convenient array to let users easily iterate * @param int $detailLevel * @public */ public function getErrorCodes($detailLevel = 0) { $errors = $this->getErrors(); if (empty($errors)) return array(); $errorCodes = array(); foreach($errors as $error) { if ($detailLevel === 0) { array_push($errorCodes, $error['code']); } elseif ($detailLevel === 1) { array_push($errorCodes, array( 'code' => $error['code'], 'message' => $error['message'], 'field' => $error['field'], )); } } return $errorCodes; } /** * * collects all warnings and returns them * @return array * @public */ public function getWarnings() { $allWarnings = array(); if ($this->SofortLib_Multipay) { if ($this->SofortLib_Multipay->isWarning('sr')) { $allWarnings = array_merge($this->SofortLib_Multipay->getWarnings('sr'), $allWarnings); } } if ($this->ConfirmSr) { if ($this->ConfirmSr->isWarning('sr')) { $allWarnings = array_merge($this->ConfirmSr->getWarnings('sr'), $allWarnings); } } if ($this->EditSr) { if ($this->EditSr->isWarning('sr')) { $allErrors = array_merge($this->EditSr->getWarnings('sr'), $allErrors); } } if ($this->CancelSr) { if ($this->CancelSr->isWarning('sr')) { $allErrors = array_merge($this->CancelSr->getWarnings('sr'), $allErrors); } } if ($this->SofortLib_TransactionData) { if ($this->SofortLib_TransactionData->isWarning('sr')) { $allWarnings = array_merge($this->SofortLib_TransactionData->getWarnings('sr'), $allWarnings); } } return $allWarnings; } /** * Enabling logging for all encapsed SofortLib components * @public * @return boolean */ public function enableLog() { (is_a($this->SofortLib_Multipay, 'SofortLib')) ? $this->SofortLib_Multipay->setLogEnabled() : ''; (is_a($this->SofortLib_TransactionData, 'SofortLib')) ? $this->SofortLib_TransactionData->setLogEnabled() : ''; (is_a($this->ConfirmSr, 'SofortLib')) ? $this->ConfirmSr->setLogEnabled() : ''; return true; } /** * Disable logging for all encapsed SofortLib components * @public * @return boolean */ public function disableLog() { (is_a($this->SofortLib_Multipay, 'SofortLib')) ? $this->SofortLib_Multipay->setLogDisabled() : ''; (is_a($this->SofortLib_TransactionData, 'SofortLib')) ? $this->SofortLib_TransactionData->setLogDisabled() : ''; (is_a($this->ConfirmSr, 'SofortLib')) ? $this->ConfirmSr->setLogDisabled() : ''; return true; } /** * Log the given String into log.txt * Notice: logging must be enabled -> use enableLog(); * @param string $msg - Message to log * @return bool - true=logged ELSE false=logging failed * @public */ public function log($message){ if (is_a($this->SofortLib_Multipay, 'SofortLib')) { $this->SofortLib_Multipay->log($message); return true; } elseif (is_a($this->SofortLib_TransactionData, 'SofortLib')) { $this->SofortLib_TransactionData->log($message); return true; } elseif (is_a($this->ConfirmSr, 'SofortLib')) { $this->ConfirmSr->log($message); return true; } return false; } /** * Log the given String into error_log.txt * Notice: logging must be enabled -> use enableLog(); * @param string $msg - Message to log * @return bool - true=logged ELSE false=logging failed * @public */ public function logError($message){ if (is_a($this->SofortLib_Multipay, 'SofortLib')) { $this->SofortLib_Multipay->logError($message); return true; } elseif (is_a($this->SofortLib_TransactionData, 'SofortLib')) { $this->SofortLib_TransactionData->logError($message); return true; } elseif (is_a($this->ConfirmSr, 'SofortLib')) { $this->ConfirmSr->logError($message); return true; } return false; } /** * Log the given String into warning_log.txt * @param string $msg - Message to log * @return bool - true=logged ELSE false=logging failed * @public */ public function logWarning($message){ if (is_a($this->SofortLib_Multipay, 'SofortLib')) { $this->SofortLib_Multipay->logWarning($message); return true; } elseif (is_a($this->SofortLib_TransactionData, 'SofortLib')) { $this->SofortLib_TransactionData->logWarning($message); return true; } elseif (is_a($this->ConfirmSr, 'SofortLib')) { $this->ConfirmSr->logWarning($message); return true; } return false; } /** * * Override toString */ public function __toString() { $string = '<pre>'; $string .= print_r($this, 1); $string .= '</pre>'; return $string; } } ?>