--- a/busui/owa/modules/base/handlers/commerceTransactionHandlers.php +++ b/busui/owa/modules/base/handlers/commerceTransactionHandlers.php @@ -1,1 +1,175 @@ - + + * @copyright Copyright © 2006-2011 Peter Adams + * @license http://www.gnu.org/copyleft/gpl.html GPL v2.0 + * @category owa + * @package owa + * @version $Revision$ + * @since owa 1.4.0 + */ + +class owa_commerceTransactionHandlers extends owa_observer { + + /** + * Notify handler method + * + * @param object $event + * @access public + */ + function notify($event) { + + $dispatch = owa_coreAPI::getEventDispatch(); + $ct = owa_coreAPI::entityFactory('base.commerce_transaction_fact'); + $pk = $ct->generateId( $event->get( 'ct_order_id' ) ); + $ct->getByPk( 'id', $pk ); + $id = $ct->get('id'); + + if (!$id) { + + // set missing properties from associated session + // this is needed becuase the ecommerce transaction PHP API allows for + // events to be fired into OWA from a non-web request by passing + // the session_id. + $original_session_id = $event->get( 'original_session_id' ); + if ( $original_session_id ) { + $s = owa_coreAPI::entityFactory( 'base.session' ); + $s->load( $original_session_id ); + + // override the session id with original session id + // this is needed for downstream events + $event->set('session_id', $original_session_id); + + if ( $s->get( 'id' ) ) { + $ct->setProperties( $s->_getProperties() ); + $ct->set( 'session_id', $original_session_id ); + } else { + owa_coreAPI::debug('Cannot find original session with id: '.$original_session_id); + return OWA_EHS_EVENT_FAILED; + } + + } + + $ct->setProperties($event->getProperties()); + + $ct->set( 'id', $pk ); + + // Generate Location Id. Location data is comming from user input NOT ip address + if ( $event->get( 'country' ) ) { + $s = owa_coreAPI::serviceSingleton(); + $location_id = $s->geolocation->generateId($event->get( 'country' ), $event->get( 'state' ), $event->get( 'city' ) ); + $ct->set( 'location_id', $location_id ); + } + // set entity properties + $ct->set( 'order_id', trim( $event->get( 'ct_order_id' ) ) ); + $ct->set( 'order_source', trim( strtolower( $event->get( 'ct_order_source' ) ) ) ); + $ct->set( 'gateway', trim( strtolower( $event->get( 'ct_gateway' ) ) ) ); + $ct->set( 'total_revenue', owa_lib::prepareCurrencyValue( round( $event->get( 'ct_total' ), 2 ) ) ); + $ct->set( 'tax_revenue', owa_lib::prepareCurrencyValue( round( $event->get( 'ct_tax' ), 2 ) ) ); + $ct->set( 'shipping_revenue', owa_lib::prepareCurrencyValue( round( $event->get( 'ct_shipping' ), 2 ) ) ); + $ct->set( 'days_since_first_session', $event->get('days_since_first_session') ); + $ct->set( 'num_prior_sessions', $event->get('num_prior_sessions') ); + + $ret = $ct->create(); + + // persist line items + if ($ret) { + $items = $event->get('ct_line_items'); + if ( $items ) { + + foreach ($items as $item) { + $ret = $this->persistLineItem($item, $event); + } + } + } + + if ($ret) { + + $sce = $dispatch->makeEvent( 'ecommerce.transaction_persisted' ); + $sce->setProperties( $event->getProperties() ); + $dispatch->asyncNotify( $sce ); + } + + if ( $ret ) { + return OWA_EHS_EVENT_HANDLED; + } else { + return OWA_EHS_EVENT_FAILED; + } + + } else { + + // dispatch event just incase downstream handlers need to be triggered. + $sce = $dispatch->makeEvent( 'ecommerce.transaction_persisted' ); + $sce->setProperties( $event->getProperties() ); + $dispatch->asyncNotify( $sce ); + owa_coreAPI::debug('Not Persisting. Transaction already exists'); + return OWA_EHS_EVENT_HANDLED; + } + } + + + + function persistLineItem($item, $parent) { + + $ct = owa_coreAPI::entityFactory('base.commerce_line_item_fact'); + $guid = $item['li_order_id'] . $item['li_sku']; + $pk = $ct->generateId( $guid ); + $ct->getByPk( 'id', $pk ); + $id = $ct->get( 'id' ); + + if ( ! $id ) { + + $ct->setProperties( $parent->getProperties() ); + + $ct->set( 'id', $pk ); + + // Generate Location Id. Location data is comming from user input + $ct->set( 'order_id', trim( $item['li_order_id'] ) ); + $ct->set( 'sku', trim( $item['li_sku'] ) ); + $ct->set( 'product_name', trim( strtolower( $item['li_product_name'] ) ) ); + $ct->set( 'category', $item['li_category'] ); + $ct->set( 'unit_price', owa_lib::prepareCurrencyValue( round($item['li_unit_price'], 2 ) ) ); + $ct->set( 'quantity', round( $item['li_quantity'] ) ); + $revenue = round( $item['li_quantity'] * $item['li_unit_price'] , 2 ); + $ct->set( 'item_revenue', owa_lib::prepareCurrencyValue( $revenue ) ); + $ret = $ct->create(); + + if ($ret) { + return true; + } else { + return false; + } + + } else { + + owa_coreAPI::debug('Not Persisting. line item already exists'); + return false; + } + } +} + +?>