AnattaDesign_AbandonedCarts - Version 1.1.0

Version Notes

v1.1.0

* Totally new design (Uses a tab instead of 3rd column now)
* Accuracy improved even more in data tracking (in case of cart merges)
* Tracking exclusion feature (admin side logins exclude your checkouts to be tracked and doesn't pollute real data of the customers)

Download this release

Release Info

Developer Anatta Design
Extension AnattaDesign_AbandonedCarts
Version 1.1.0
Comparing to
See all releases


Code changes from version 1.0.1 to 1.1.0

Files changed (20) hide show
  1. app/code/local/AnattaDesign/AbandonedCarts/Helper/Data.php +10 -1
  2. app/code/local/AnattaDesign/AbandonedCarts/Model/Checkout/Onepage/Observer.php +11 -0
  3. app/code/local/AnattaDesign/AbandonedCarts/Model/Observer.php +16 -11
  4. app/code/local/AnattaDesign/AbandonedCarts/Model/Statistics.php +37 -12
  5. app/code/local/AnattaDesign/AbandonedCarts/etc/config.xml +10 -1
  6. app/code/local/AnattaDesign/AbandonedCarts/sql/anattadesign_abandonedcarts_setup/mysql4-upgrade-1.0.1-1.1.0.php +3 -0
  7. app/design/adminhtml/default/default/template/anattadesign/abandonedcarts/widget.phtml +95 -86
  8. js/anattadesign/abandonedcarts/adminhack.js +18 -24
  9. package.xml +10 -6
  10. skin/adminhtml/default/default/anattadesign/abandonedcarts/css/images/ar-lt.jpg +0 -0
  11. skin/adminhtml/default/default/anattadesign/abandonedcarts/css/images/ar-rt.jpg +0 -0
  12. skin/adminhtml/default/default/anattadesign/abandonedcarts/css/images/logo.jpg +0 -0
  13. skin/adminhtml/default/default/anattadesign/abandonedcarts/css/images/notifications-btm.gif +0 -0
  14. skin/adminhtml/default/default/anattadesign/abandonedcarts/css/images/notifications.gif +0 -0
  15. skin/adminhtml/default/default/anattadesign/abandonedcarts/css/style.css +136 -46
  16. skin/adminhtml/default/default/anattadesign/abandonedcarts/images/bt-rep.gif +0 -0
  17. skin/adminhtml/default/default/anattadesign/abandonedcarts/images/powerdby.jpg +0 -0
  18. skin/adminhtml/default/default/anattadesign/abandonedcarts/images/table-step-img-arrow.jpg +0 -0
  19. skin/adminhtml/default/default/anattadesign/abandonedcarts/images/table-step-img-last-arrow.jpg +0 -0
  20. skin/adminhtml/default/default/anattadesign/abandonedcarts/images/table-step-img.jpg +0 -0
app/code/local/AnattaDesign/AbandonedCarts/Helper/Data.php CHANGED
@@ -85,7 +85,7 @@ class AnattaDesign_AbandonedCarts_Helper_Data extends Mage_Core_Helper_Abstract
85
  $ping = array(
86
  'version' => $version,
87
  'site_name' => Mage::getStoreConfig( 'general/store_information/name' ),
88
- 'url' => 'http://' . str_replace( array( 'http://', '/index.php/', '/index.php' ), '', Mage::getUrl() ) // making sure the url is in format - http://domain.com/
89
  );
90
 
91
  $ping['url'] = Mage::helper( 'anattadesign_abandonedcarts' )->trailingslashit( $ping['url'] );
@@ -124,4 +124,13 @@ class AnattaDesign_AbandonedCarts_Helper_Data extends Mage_Core_Helper_Abstract
124
  }
125
  }
126
 
 
 
 
 
 
 
 
 
 
127
  }
85
  $ping = array(
86
  'version' => $version,
87
  'site_name' => Mage::getStoreConfig( 'general/store_information/name' ),
88
+ 'url' => 'http://' . str_replace( array( 'http://', 'https://', '/index.php/', '/index.php' ), '', Mage::getUrl() ) // making sure the url is in format - http://domain.com/
89
  );
90
 
91
  $ping['url'] = Mage::helper( 'anattadesign_abandonedcarts' )->trailingslashit( $ping['url'] );
124
  }
125
  }
126
 
127
+ public function getCookieName() {
128
+ return 'anatta_abcart_track';
129
+ }
130
+
131
+ public function canTrackUser() {
132
+ $cookie = Mage::getModel( 'core/cookie' )->get( $this->getCookieName() );
133
+ return !( 'no' === trim( $cookie ) );
134
+ }
135
+
136
  }
app/code/local/AnattaDesign/AbandonedCarts/Model/Checkout/Onepage/Observer.php CHANGED
@@ -34,6 +34,17 @@ class AnattaDesign_AbandonedCarts_Model_Checkout_Onepage_Observer {
34
  }
35
  }
36
 
 
 
 
 
 
 
 
 
 
 
 
37
  public function saveMethod( $observer ) {
38
  $statistics = $this->getModel();
39
  $statistics->saveStepMoved( 'login', $this->getQuoteId() );
34
  }
35
  }
36
 
37
+ public function merge( $observer ) {
38
+ try {
39
+ $this->getModel()->deleteByQuoteId( $observer->getSource()->getID() );
40
+ } catch ( Exception $e ) {
41
+ if ( Mage::getIsDeveloperMode() ) {
42
+ echo $e->getMessage();
43
+ }
44
+ Mage::logException( $e );
45
+ }
46
+ }
47
+
48
  public function saveMethod( $observer ) {
49
  $statistics = $this->getModel();
50
  $statistics->saveStepMoved( 'login', $this->getQuoteId() );
app/code/local/AnattaDesign/AbandonedCarts/Model/Observer.php CHANGED
@@ -5,6 +5,7 @@ class AnattaDesign_AbandonedCarts_Model_Observer {
5
  public function uponAdminLogin() {
6
  $this->ping();
7
  $this->checkLatestVersion();
 
8
  }
9
 
10
  public function ping() {
@@ -34,17 +35,23 @@ class AnattaDesign_AbandonedCarts_Model_Observer {
34
 
35
  if ( $latest->latestVersion != $version ) {
36
  Mage::getModel( 'adminnotification/inbox' )
37
- ->setSeverity( Mage_AdminNotification_Model_Inbox::SEVERITY_NOTICE )
38
- ->setTitle( "My Abandoned Cart {$latest->latestVersion} is now available" )
39
- ->setDateAdded( gmdate( 'Y-m-d H:i:s' ) )
40
- ->setUrl( 'http://www.myabandonedcarts.com/' )
41
- ->setDescription( 'Your version of My Abandoned Cart is currently not up-to-date. Please <a href="http://www.myabandonedcarts.com/">click here</a> to get the latest version.' )
42
- ->save();
43
- Mage::getModel( 'core/config' )->saveConfig( 'anattadesign_abandonedcart_latest_checked_version', $latest->latestVersion );
44
  }
45
  }
46
  }
47
 
 
 
 
 
 
 
48
  public function addJavascriptBlock( $observer ) {
49
 
50
  $controller = $observer->getAction();
@@ -54,13 +61,11 @@ class AnattaDesign_AbandonedCarts_Model_Observer {
54
 
55
  $layout = $controller->getLayout();
56
  $block = $layout->createBlock( 'core/text' );
57
- $block->setText(
58
- '<script type="text/javascript">
59
  var anattadesign_abandonedcarts = {
60
  url: "' . Mage::helper( 'adminhtml' )->getUrl( 'abandonedcarts/widget/render/' ) . '"
61
  };
62
- </script>'
63
- );
64
 
65
  $layout->getBlock( 'js' )->append( $block );
66
  }
5
  public function uponAdminLogin() {
6
  $this->ping();
7
  $this->checkLatestVersion();
8
+ $this->stopTrackingUser();
9
  }
10
 
11
  public function ping() {
35
 
36
  if ( $latest->latestVersion != $version ) {
37
  Mage::getModel( 'adminnotification/inbox' )
38
+ ->setSeverity( Mage_AdminNotification_Model_Inbox::SEVERITY_NOTICE )
39
+ ->setTitle( "My Abandoned Cart {$latest->latestVersion} is now available" )
40
+ ->setDateAdded( gmdate( 'Y-m-d H:i:s' ) )->setUrl( 'http://www.myabandonedcarts.com/' )
41
+ ->setDescription( 'Your version of My Abandoned Cart is currently not up-to-date. Please <a href="http://www.myabandonedcarts.com/">click here</a> to get the latest version.' )
42
+ ->save();
43
+ Mage::getModel( 'core/config' )
44
+ ->saveConfig( 'anattadesign_abandonedcart_latest_checked_version', $latest->latestVersion );
45
  }
46
  }
47
  }
48
 
49
+ public function stopTrackingUser() {
50
+ $time = 60 * 60 * 24 * 7; // set a cookie for one week
51
+ $name = Mage::helper( 'anattadesign_abandonedcarts' )->getCookieName();
52
+ Mage::getModel( 'core/cookie' )->set( $name, 'no', $time, '/', null, null, true );
53
+ }
54
+
55
  public function addJavascriptBlock( $observer ) {
56
 
57
  $controller = $observer->getAction();
61
 
62
  $layout = $controller->getLayout();
63
  $block = $layout->createBlock( 'core/text' );
64
+ $block->setText( '<script type="text/javascript">
 
65
  var anattadesign_abandonedcarts = {
66
  url: "' . Mage::helper( 'adminhtml' )->getUrl( 'abandonedcarts/widget/render/' ) . '"
67
  };
68
+ </script>' );
 
69
 
70
  $layout->getBlock( 'js' )->append( $block );
71
  }
app/code/local/AnattaDesign/AbandonedCarts/Model/Statistics.php CHANGED
@@ -11,6 +11,7 @@ class AnattaDesign_AbandonedCarts_Model_Statistics extends Mage_Core_Model_Abstr
11
  *
12
  * @param string $step
13
  * @param int $quoteId
 
14
  * @return AnattaDesign_AbandonedCarts_Model_Statistics
15
  */
16
  public function saveStepMoved( $step, $quoteId ) {
@@ -22,38 +23,62 @@ class AnattaDesign_AbandonedCarts_Model_Statistics extends Mage_Core_Model_Abstr
22
  *
23
  * @param string $step
24
  * @param int $quoteId
 
25
  * @return AnattaDesign_AbandonedCarts_Model_Statistics
26
  */
27
  public function saveStepReached( $step, $quoteId ) {
28
- $data = array(
29
- 'step' => $step,
30
- 'quoteId' => $quoteId,
31
- 'reached' => 1,
32
- 'year' => date( 'Y' ),
33
- 'month' => date( 'n' ),
34
- 'date' => date( 'Y-m-d h:i:s' )
35
- );
36
  return $this->_saveStepData( $data );
37
  }
38
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
  /**
40
  * Save step data.
41
  * Step and quote id are required.
42
  *
43
  * @param array $data
 
44
  * @throws Exception
45
  * @return AnattaDesign_AbandonedCarts_Model_Statistics
46
  */
47
  protected function _saveStepData( array $data ) {
 
 
 
 
48
  if ( !array_key_exists( 'step', $data ) ) {
49
  throw new Exception( 'Step key is required' );
50
  }
51
 
52
  // Prepare data
53
- $data = array_merge( $data, array(
54
- 'sales_flat_quote_id' => $data['quoteId']
55
- )
56
- );
57
 
58
  // Get existing statistics for this quote and step
59
  $collection = $this->getCollection();
11
  *
12
  * @param string $step
13
  * @param int $quoteId
14
+ *
15
  * @return AnattaDesign_AbandonedCarts_Model_Statistics
16
  */
17
  public function saveStepMoved( $step, $quoteId ) {
23
  *
24
  * @param string $step
25
  * @param int $quoteId
26
+ *
27
  * @return AnattaDesign_AbandonedCarts_Model_Statistics
28
  */
29
  public function saveStepReached( $step, $quoteId ) {
30
+ $data = array( 'step' => $step, 'quoteId' => $quoteId, 'reached' => 1, 'year' => date( 'Y' ), 'month' => date( 'n' ), 'date' => date( 'Y-m-d h:i:s' ) );
 
 
 
 
 
 
 
31
  return $this->_saveStepData( $data );
32
  }
33
 
34
+ /**
35
+ * delete all records of a particular quote ID
36
+ *
37
+ * @param int $quoteId
38
+ *
39
+ * @throws Exception
40
+ * @return AnattaDesign_AbandonedCarts_Model_Statistics
41
+ */
42
+ public function deleteByQuoteId( $quoteId ) {
43
+ $quoteId = abs( intval( $quoteId ) );
44
+ if ( !$quoteId )
45
+ throw new Exception( 'Quote ID is required & should be greater than 0' );
46
+
47
+ $collection = $this->getCollection();
48
+ $collection->addFieldToFilter( 'sales_flat_quote_id', $quoteId );
49
+ $collection->load();
50
+
51
+ if ( count( $collection ) ) {
52
+ foreach ( $collection as $model ) {
53
+ $model->delete();
54
+ }
55
+ } else {
56
+ return $this->delete();
57
+ }
58
+
59
+ return $this;
60
+ }
61
+
62
  /**
63
  * Save step data.
64
  * Step and quote id are required.
65
  *
66
  * @param array $data
67
+ *
68
  * @throws Exception
69
  * @return AnattaDesign_AbandonedCarts_Model_Statistics
70
  */
71
  protected function _saveStepData( array $data ) {
72
+ if ( !Mage::helper( 'anattadesign_abandonedcarts' )->canTrackUser() ) {
73
+ return false;
74
+ }
75
+
76
  if ( !array_key_exists( 'step', $data ) ) {
77
  throw new Exception( 'Step key is required' );
78
  }
79
 
80
  // Prepare data
81
+ $data = array_merge( $data, array( 'sales_flat_quote_id' => $data['quoteId'] ) );
 
 
 
82
 
83
  // Get existing statistics for this quote and step
84
  $collection = $this->getCollection();
app/code/local/AnattaDesign/AbandonedCarts/etc/config.xml CHANGED
@@ -2,7 +2,7 @@
2
  <config>
3
  <modules>
4
  <AnattaDesign_AbandonedCarts>
5
- <version>1.0.1</version>
6
  </AnattaDesign_AbandonedCarts>
7
  </modules>
8
  <global>
@@ -80,6 +80,15 @@
80
  </anattadesign_abandonedcarts_checkout_observer>
81
  </observers>
82
  </controller_action_postdispatch_checkout_onepage_index>
 
 
 
 
 
 
 
 
 
83
  <controller_action_postdispatch_checkout_onepage_saveMethod>
84
  <observers>
85
  <anattadesign_abandonedcarts_checkout_observer>
2
  <config>
3
  <modules>
4
  <AnattaDesign_AbandonedCarts>
5
+ <version>1.1.0</version>
6
  </AnattaDesign_AbandonedCarts>
7
  </modules>
8
  <global>
80
  </anattadesign_abandonedcarts_checkout_observer>
81
  </observers>
82
  </controller_action_postdispatch_checkout_onepage_index>
83
+ <sales_quote_merge_before>
84
+ <observers>
85
+ <anattadesign_abandonedcarts_checkout_observer>
86
+ <type>singleton</type>
87
+ <class>AnattaDesign_AbandonedCarts_Model_Checkout_Onepage_Observer</class>
88
+ <method>merge</method>
89
+ </anattadesign_abandonedcarts_checkout_observer>
90
+ </observers>
91
+ </sales_quote_merge_before>
92
  <controller_action_postdispatch_checkout_onepage_saveMethod>
93
  <observers>
94
  <anattadesign_abandonedcarts_checkout_observer>
app/code/local/AnattaDesign/AbandonedCarts/sql/anattadesign_abandonedcarts_setup/mysql4-upgrade-1.0.1-1.1.0.php ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ <?php
2
+
3
+ Mage::helper( 'anattadesign_abandonedcarts' )->ping();
app/design/adminhtml/default/default/template/anattadesign/abandonedcarts/widget.phtml CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- if ( !Mage::helper( 'core' )->isModuleEnabled( 'AnattaDesign_AbandonedCarts' ) ) {
3
  die();
4
  }
5
  ?>
@@ -25,22 +25,33 @@ $display_month = array(
25
  12 => 'December'
26
  );
27
 
28
- $current_year = date( 'Y' );
29
-
30
- if ( isset( $_GET['month'] ) && intval( abs( $_GET['month'] ) ) != 0 ) {
31
- $queried_month = intval( abs( $_GET['month'] ) );
32
- } else {
33
- $queried_month = date( 'n' );
34
- }
35
-
36
- if ( isset( $_GET['year'] ) && intval( abs( $_GET['year'] ) ) != 0 ) {
37
- $queried_year = intval( abs( $_GET['year'] ) );
38
- } else {
39
- $queried_year = $current_year;
 
 
 
 
 
 
 
 
 
 
 
40
  }
41
 
42
  // Select table name where data is stored
43
- if ( Mage::helper( 'anattadesign_abandonedcarts' )->isAwesomeCheckoutActive() ) {
44
 
45
  $steps = array(
46
  0 => array(
@@ -56,6 +67,7 @@ if ( Mage::helper( 'anattadesign_abandonedcarts' )->isAwesomeCheckoutActive() )
56
  'step' => 'review'
57
  )
58
  );
 
59
  $table = 'anattadesign_abandonedcarts_statistics';
60
  } else {
61
 
@@ -84,16 +96,16 @@ if ( Mage::helper( 'anattadesign_abandonedcarts' )->isAwesomeCheckoutActive() )
84
  }
85
 
86
  // Add reached & moved values in array
87
- $connection = Mage::getSingleton( 'core/resource' )->getConnection( 'core_read' );
88
- foreach ( $steps as &$step ) {
89
- $query = "SELECT sum(reached) as reached, sum(moved) as moved FROM $table WHERE month = $queried_month AND year = $queried_year AND step = '" . $step['step'] . "';";
90
- $resource = $connection->query( $query );
91
  $fetched_data = $resource->fetch();
92
- $step['reached'] = intval( $fetched_data['reached'] );
93
- $step['moved'] = intval( $fetched_data['moved'] );
94
- $step['loss'] = $step['reached'] == $step['moved'] ? 0 : ( $step['reached'] - $step['moved'] ) * 100 / $step['reached'];
95
- unset( $step );
96
  }
 
97
 
98
  $step_no = 1;
99
  $step_names = array(
@@ -106,83 +118,80 @@ $step_names = array(
106
  );
107
 
108
  // adjustments to data
109
- if ( Mage::helper( 'anattadesign_abandonedcarts' )->isAwesomeCheckoutActive() ) {
110
 
111
  } else {
112
- // make sure login[reached] is not smaller than billing[reached] (for the sake of funnel)
113
- $steps[0]['reached'] = max( $steps[0]['reached'], $steps[1]['reached'] );
 
 
 
114
  // make sure shipping step which is optional only depicts the loss, so add padding here (for the sake of funnel)
115
  $diff = $steps[1]['moved'] - $steps[2]['reached'];
116
- $steps[2]['reached']+= $diff;
117
- $steps[2]['moved']+= $diff;
 
 
 
 
 
 
 
 
 
 
 
118
  }
119
 
120
  // calculate abandonment rate & loss for the queried month-year
121
- $abandonedment_rate = $steps[0]['reached'] == $steps[count( $steps ) - 1]['moved'] ? 0 : round( ( $steps[0]['reached'] - $steps[count( $steps ) - 1]['moved'] ) * 100 / $steps[0]['reached'], 2 );
122
- $approx_loss = ( Mage::helper( 'anattadesign_abandonedcarts' )->getSalesVolume( $queried_year, $queried_month ) * ( $abandonedment_rate / 100 ) ) / ( 1 - ( $abandonedment_rate / 100 ) );
123
- $approx_loss = Mage::helper( 'core' )->currency( $approx_loss, true, false );
124
 
125
  // Get message to display user
126
- $message = Mage::helper( 'anattadesign_abandonedcarts' )->getMessage();
 
127
  ?>
128
 
129
  <div id="ac-wrapper">
130
- <!--header-->
131
- <header id="ac-header">
132
- <img class="left" src="<?php echo $this->getSkinUrl( 'anattadesign/abandonedcarts/css/images/logo.jpg' ); ?>" alt="Abandoned Cart"><!--logo-->
133
- <!--calender-->
134
- <div id="cal-widget" data-month="<?php echo $queried_month; ?>" data-year="<?php echo $queried_year; ?>" class="right">
135
- <a class="previous-month" href="#"></a>
136
- <span><?php echo $display_month[$queried_month] . ' ' . $queried_year; ?></span>
137
- <a class="next-month" href="#"></a>
138
- </div>
139
- <!--/calender-->
140
- </header>
141
- <!--/header-->
142
- <div id="ac-content">
143
- <?php if ( $steps[0]['reached'] == 0 ) { ?>
144
- <ul>
145
- <li><p class="out-of-data">You will see some data here as soon as we have it.</p></li>
146
- </ul>
147
- <?php } else { ?>
148
- <!--stats list-->
149
- <ul>
150
- <?php foreach ( $steps as $key => $step ) { ?>
151
- <li>
152
- <div class="ac-steps left"><span><?php echo $key + 1; ?>&nbsp;</span><?php echo $step_names[$step['step']]; ?></div>
153
- <div class="ac-graph left">
154
- <center><?php echo $step['reached']; ?></center>
155
- <div class="ac-usr-in" style="width:<?php echo $steps[0]['reached'] == 0 ? 0 : round( $step['reached'] * 100 / $steps[0]['reached'], 0 ); ?>px;">
156
- <div class="ac-usr-out" style="height:<?php echo round( $step['loss'], 0 ); ?>%"></div>
157
- </div>
158
- <?php
159
- // if on last step, show last 'moved' value i.e. tail of funnel
160
- if ( $key == count( $steps ) - 1 )
161
- echo '<center>' . $step['moved'] . '<center>';
162
- ?>
163
- </div>
164
- <div class="ac-stats left"><div>&nbsp;<?php echo round( $step['loss'], 2 ); ?>&nbsp;%</div></div>
165
- </li>
166
- <?php } ?>
167
- </ul>
168
- <!--stats list-->
169
- <?php } ?>
170
- <!--sidebar-->
171
- <div id="ac-sidebar">
172
- <div class="ac-notif">
173
- <div>
174
- <big>NOTIFICATION!</big>
175
- <?php echo $message; ?>
176
- </div>
177
- </div>
178
- <div class="ac-side-content">
179
- <span>>APPX. LOSS</span>
180
- <p>*based on total monthly sales</p>
181
- <big><?php echo $approx_loss; ?></big>
182
- <p class="btm">TOTAL PERCENTAGE <br/>OF ABANDONMENT</p>
183
- <big class="btm"><?php echo $abandonedment_rate; ?>%</big>
184
  </div>
185
  </div>
186
- <!--sidebar-->
187
  </div>
188
  </div>
1
  <?php
2
+ if (!Mage::helper('core')->isModuleEnabled('AnattaDesign_AbandonedCarts')) {
3
  die();
4
  }
5
  ?>
25
  12 => 'December'
26
  );
27
 
28
+ $period = isset($_GET['period']) ? $_GET['period'] : '';
29
+
30
+ switch ($period) {
31
+ case '12h':
32
+ $queried_date = date('Y-m-d', strtotime('-12 hours'));
33
+ break;
34
+ case '24h':
35
+ $queried_date = date('Y-m-d', strtotime('-24 hours'));
36
+ break;
37
+ case '7d':
38
+ $queried_date = date('Y-m-d', strtotime('-7 days'));
39
+ break;
40
+ case '1m':
41
+ $queried_date = date('Y-m-d', strtotime('-1 month'));
42
+ break;
43
+ case '1y':
44
+ $queried_date = date('Y-m-d', strtotime('-1 year'));
45
+ break;
46
+ case '2y':
47
+ $queried_date = date('Y-m-d', strtotime('-2 years'));
48
+ break;
49
+ default:
50
+ $queried_date = date('Y-m-d', strtotime('-24 hours'));
51
  }
52
 
53
  // Select table name where data is stored
54
+ if (Mage::helper('anattadesign_abandonedcarts')->isAwesomeCheckoutActive()) {
55
 
56
  $steps = array(
57
  0 => array(
67
  'step' => 'review'
68
  )
69
  );
70
+
71
  $table = 'anattadesign_abandonedcarts_statistics';
72
  } else {
73
 
96
  }
97
 
98
  // Add reached & moved values in array
99
+ $connection = Mage::getSingleton('core/resource')->getConnection('core_read');
100
+ foreach ($steps as &$step) {
101
+ $query = "SELECT SUM(reached) as `reached`, SUM(moved) as `moved` FROM `$table` WHERE DATE(date) > '$queried_date' AND `step` = '{$step['step']}';";
102
+ $resource = $connection->query($query);
103
  $fetched_data = $resource->fetch();
104
+ $step['reached'] = intval($fetched_data['reached']);
105
+ $step['moved'] = intval($fetched_data['moved']);
106
+ $step['loss'] = $step['reached'] == $step['moved'] ? 0 : ($step['reached'] - $step['moved']) * 100 / $step['reached'];
 
107
  }
108
+ unset($step);
109
 
110
  $step_no = 1;
111
  $step_names = array(
118
  );
119
 
120
  // adjustments to data
121
+ if (Mage::helper('anattadesign_abandonedcarts')->isAwesomeCheckoutActive()) {
122
 
123
  } else {
124
+ // This is needed as a user already logged in will never reach the login step
125
+ // Here we add the appropriate padding (for the sake of the funnel)
126
+ $diff = $steps[1]['reached'] - $steps[0]['moved'];
127
+ $steps[0]['reached'] += $diff;
128
+ $steps[0]['moved'] += $diff;
129
  // make sure shipping step which is optional only depicts the loss, so add padding here (for the sake of funnel)
130
  $diff = $steps[1]['moved'] - $steps[2]['reached'];
131
+ $steps[2]['reached'] += $diff;
132
+ $steps[2]['moved'] += $diff;
133
+ }
134
+
135
+ // let's match the moved of each step to the reached of next step, this will show decent output even in case of
136
+ // manual data changes via phpmyadmin. This won't affect anything if this module doesn't have any conflicts
137
+ for($i = count($steps) - 1; $i >= 0; $i--) {
138
+ // making sure that moved is never higher than reached
139
+ if($steps[$i]['moved'] > $steps[$i]['reached'])
140
+ $steps[$i]['reached'] = $steps[$i]['moved'];
141
+
142
+ if($i)
143
+ $steps[$i-1]['moved'] = $steps[$i]['reached'] = max($steps[$i-1]['moved'], $steps[$i]['reached']);
144
  }
145
 
146
  // calculate abandonment rate & loss for the queried month-year
147
+ $abandonedment_rate = $steps[0]['reached'] == $steps[count($steps) - 1]['moved'] ? 0 : round(($steps[0]['reached'] - $steps[count($steps) - 1]['moved']) * 100 / $steps[0]['reached'], 2);
 
 
148
 
149
  // Get message to display user
150
+ $message = Mage::helper('anattadesign_abandonedcarts')->getMessage();
151
+ $message = is_string($message) ? $message : '';
152
  ?>
153
 
154
  <div id="ac-wrapper">
155
+ <div class="abwidget">
156
+ <h2 class="widget-title">
157
+ <strong>TIPS!:</strong> <?php echo $message; ?>
158
+ <a href="http://myabandonedcarts.com/?kme=Clicked%20Link&km_Referrer=Widget" class="myab"></a>
159
+ </h2>
160
+
161
+ <div class="widget-content">
162
+ <span class="checkout-info item-1">ENTERED CHECKOUT<small><?php echo $steps[0]['reached'] ?></small></span>
163
+ <span class="checkout-info item-2">COMPLETED CHECKOUT<small><?php echo $steps[count($steps) - 1]['moved'] ?></small></span>
164
+ <span class="checkout-info item-3">ABANDONMENT RATE<big><?php echo $abandonedment_rate; ?>%</big></span>
165
+
166
+ <div class="graph-table">
167
+ <table width="100%" border="0" cellspacing="0" cellpadding="0">
168
+ <tr>
169
+ <?php foreach ($steps as $step) : ?>
170
+ <td><span class="number"><?php echo $step['reached']; ?></span></td>
171
+ <?php $total_height = $steps[0]['reached'] ? (($step['reached'] * 100)) / $steps[0]['reached'] : 0; ?>
172
+ <?php $lost_height = $step['reached'] ? (($step['reached'] - $step['moved']) * 100) / $step['reached'] : 0; ?>
173
+ <td>
174
+ <div class="graph" style="height:<?php echo $total_height; ?>%;">
175
+ <span class="color" style="height: <?php echo $lost_height; ?>%;">
176
+ <span class="value"><?php echo round($lost_height, 2); ?>%</span>
177
+ </span>
178
+ </div>
179
+ </td>
180
+ <?php endforeach; ?>
181
+ <?php $last_step = end($steps); ?>
182
+ <td><span class="number"><?php echo $last_step['moved']; ?></span></td>
183
+ </tr>
184
+ <tr class="steps">
185
+ <?php $count = 0; ?>
186
+ <?php foreach ($steps as $index => $step) : ?>
187
+ <td<?php if ($count) echo ' class="arrow"'; ?>>&nbsp;</td>
188
+ <?php $count++; ?>
189
+ <td><span><?php echo $count . '. ' . $step_names[$step['step']]; ?></span></td>
190
+ <?php endforeach; ?>
191
+ <td class="last-child">&nbsp;</td>
192
+ </tr>
193
+ </table>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
194
  </div>
195
  </div>
 
196
  </div>
197
  </div>
js/anattadesign/abandonedcarts/adminhack.js CHANGED
@@ -1,40 +1,34 @@
1
  Zepto(function($){
2
  // load widget initially
3
  $.get(anattadesign_abandonedcarts.url, function(data){
4
- if ( $.trim(data) != '' )
5
- $('.dashboard-container tr').first().append('<td>'+data+'</td>');
 
 
 
 
 
 
 
 
 
 
 
6
  });
7
 
8
  // bind click for browsing previous/next months
9
- $(document).on('click','#cal-widget a', function(e){
10
-
11
- var month = $(this).parent().attr('data-month');
12
- var year = $(this).parent().attr('data-year');
13
-
14
- if ($(this).hasClass('previous-month')) {
15
- month--;
16
- if (month == 0) {
17
- month = 12;
18
- year--;
19
- }
20
- } else {
21
- month++;
22
- if (month == 13) {
23
- month = 1;
24
- year++;
25
- }
26
- }
27
 
28
  // fill up widget with the requested month-year stats
29
- $.get(anattadesign_abandonedcarts.url+'?month='+month+'&year='+year, function(data){
30
  if ( $.trim(data) != '' ) {
31
- $('#ac-wrapper').parent().remove();
32
- $('.dashboard-container tr').first().append('<td>'+data+'</td>');
33
  }
34
  });
35
 
36
  return false;
37
-
38
  });
39
 
40
  });
1
  Zepto(function($){
2
  // load widget initially
3
  $.get(anattadesign_abandonedcarts.url, function(data){
4
+ if ( $.trim(data) != '' ) {
5
+ $('#diagram_tab').append('<li><a class="tab-item-link" title="Abandoned Carts" id="diagram_tab_abandoned_carts" href="#"><span><span title="The information in this tab has been changed." class="changed"></span><span title="This tab contains invalid data. Please solve the problem before saving." class="error"></span>Abandoned Carts</span></a></li>');
6
+ $('#diagram_tab_content').append('<div style="display: none;" id="diagram_tab_abandoned_carts_content"><div style="margin:20px;"><p style="padding:5px 10px;" class="switcher a-right">Select Range:<select id="order_abandoned_carts_period" name="period"><option value="24h">Last 24 Hours</option><option value="7d">Last 7 Days</option><option value="1m">Current Month</option><option value="1y">YTD</option><option value="2y">2YTD</option></select></p></div>'+data+'</div>');
7
+
8
+ // activate the abandoned carts widget tab
9
+ $('#diagram_tab > li > a').on('click', function(e){
10
+ e.preventDefault();
11
+ $('#diagram_tab > li > a.active').removeClass('active');
12
+ $(this).addClass('active');
13
+ $('#diagram_tab_content').children().hide();
14
+ $('#' + this.id + '_content').show();
15
+ });
16
+ }
17
  });
18
 
19
  // bind click for browsing previous/next months
20
+ $('#diagram_tab_content').on('change','#order_abandoned_carts_period', function(){
21
+ var value = $(this).val();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
 
23
  // fill up widget with the requested month-year stats
24
+ $.get(anattadesign_abandonedcarts.url+'?period='+value, function(data){
25
  if ( $.trim(data) != '' ) {
26
+ $('#ac-wrapper').parent().children().slice(1).remove();
27
+ $('#diagram_tab_abandoned_carts_content').append(data);
28
  }
29
  });
30
 
31
  return false;
 
32
  });
33
 
34
  });
package.xml CHANGED
@@ -1,18 +1,22 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>AnattaDesign_AbandonedCarts</name>
4
- <version>1.0.1</version>
5
  <stability>stable</stability>
6
  <license>GPL</license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>Track abandoned carts &amp; show a funnel report to show statistics</summary>
10
  <description>Track abandoned carts &amp; show a funnel report to show statistics</description>
11
- <notes>v1.0.1 containing a bug fix</notes>
 
 
 
 
12
  <authors><author><name>Anatta Design</name><user>anattadesign</user><email>nirav@anattadesign.com</email></author></authors>
13
- <date>2013-01-11</date>
14
- <time>22:12:28</time>
15
- <contents><target name="magelocal"><dir name="AnattaDesign"><dir name="AbandonedCarts"><dir><dir name="Block"><file name="Widget.php" hash="c6baf4dc8dc25ed7c62e3b89cc78c413"/></dir><dir name="Helper"><file name="Data.php" hash="093342a0866fc724b4b0e6c545ef177b"/></dir><dir name="Model"><dir name="Checkout"><dir name="Onepage"><file name="Observer.php" hash="e7fdbe25fa84f25b5d1d49913489c147"/></dir></dir><dir name="Mysql4"><dir name="Opstatistics"><file name="Collection.php" hash="66b29da439c196f325c9faec4b171f30"/></dir><file name="Opstatistics.php" hash="9ccaa740ddbfa607204bde0222fceafc"/><dir name="Statistics"><file name="Collection.php" hash="c92997470a39016001c196fa4bf17861"/></dir><file name="Statistics.php" hash="88d17295de3fc05637ac55e71c52a3a3"/></dir><file name="Observer.php" hash="ab8d6551678e9169e80dd947e53d4329"/><file name="Opstatistics.php" hash="f3bfe7b7e44ef33e15877332a767b25a"/><file name="Statistics.php" hash="50a8c9c194a30613cb98471f4a66e7a9"/></dir><dir name="controllers"><file name="WidgetController.php" hash="ca23d690e09435f5f4df54c539dea74b"/></dir><dir name="etc"><file name="config.xml" hash="48c4ca5767125d265b7573f0218f7c82"/></dir><dir name="sql"><dir name="anattadesign_abandonedcarts_setup"><file name="mysql4-install-1.0.0.php" hash="b235486189e6609d4f9abc82ffae76c7"/><file name="mysql4-upgrade-1.0.0-1.0.1.php" hash="f9f7cbb6845f014f74c294692189c369"/></dir></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="anattadesign_abandonedcarts.xml" hash="c14481626a0c367d974a5660ed930482"/></dir><dir name="template"><dir name="anattadesign"><dir name="abandonedcarts"><file name="widget.phtml" hash="28e5ca93ba338ebf2794dcd63a822e15"/></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="AnattaDesign_AbandonedCarts.xml" hash="fba54c1c1c7b2abd323a56bcdd56be20"/></dir></target><target name="mage"><dir name="js"><dir name="anattadesign"><dir name="abandonedcarts"><file name="adminhack.js" hash="927b792d68ea4f2c4b5ddf211ff10892"/><file name="zepto.js" hash="61e66962daedd0943adc35a97b0eaa27"/></dir></dir></dir></target><target name="mageskin"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="anattadesign"><dir name="abandonedcarts"><dir><dir name="css"><dir name="images"><file name="ar-lt.jpg" hash="2e4a2506cc63419a0e0c9a41669a8bda"/><file name="ar-rt.jpg" hash="8ef650d1c452ea7a4cc846f0999fddc0"/><file name="logo.jpg" hash="df05a2e01e46a38652d3514046ae30cd"/><file name="notifications-btm.gif" hash="716074a30178e9aca3b1fe0698cfcfb7"/><file name="notifications.gif" hash="343c52ea083df65f1a02c6d7334281c2"/></dir><file name="style.css" hash="9f88676ad1011b2569a1f1c3e08d9297"/></dir></dir></dir></dir></dir></dir></dir></target></contents>
16
  <compatible/>
17
- <dependencies><required><php><min>5.2.0</min><max>5.4.6</max></php></required></dependencies>
18
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>AnattaDesign_AbandonedCarts</name>
4
+ <version>1.1.0</version>
5
  <stability>stable</stability>
6
  <license>GPL</license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>Track abandoned carts &amp; show a funnel report to show statistics</summary>
10
  <description>Track abandoned carts &amp; show a funnel report to show statistics</description>
11
+ <notes>v1.1.0&#xD;
12
+ &#xD;
13
+ * Totally new design (Uses a tab instead of 3rd column now)&#xD;
14
+ * Accuracy improved even more in data tracking (in case of cart merges)&#xD;
15
+ * Tracking exclusion feature (admin side logins exclude your checkouts to be tracked and doesn't pollute real data of the customers)</notes>
16
  <authors><author><name>Anatta Design</name><user>anattadesign</user><email>nirav@anattadesign.com</email></author></authors>
17
+ <date>2013-04-15</date>
18
+ <time>06:00:46</time>
19
+ <contents><target name="magelocal"><dir name="AnattaDesign"><dir name="AbandonedCarts"><dir><dir name="Block"><file name="Widget.php" hash="c6baf4dc8dc25ed7c62e3b89cc78c413"/></dir><dir name="Helper"><file name="Data.php" hash="f7006d4e1b800435e8a2e78df3f3786c"/></dir><dir name="Model"><dir name="Checkout"><dir name="Onepage"><file name="Observer.php" hash="6745ab11e82cf6370e04d251d1010637"/></dir></dir><dir name="Mysql4"><dir name="Opstatistics"><file name="Collection.php" hash="66b29da439c196f325c9faec4b171f30"/></dir><file name="Opstatistics.php" hash="9ccaa740ddbfa607204bde0222fceafc"/><dir name="Statistics"><file name="Collection.php" hash="c92997470a39016001c196fa4bf17861"/></dir><file name="Statistics.php" hash="88d17295de3fc05637ac55e71c52a3a3"/></dir><file name="Observer.php" hash="65c9278ea5b84f14ff30b82a9d5780ca"/><file name="Opstatistics.php" hash="f3bfe7b7e44ef33e15877332a767b25a"/><file name="Statistics.php" hash="85f8bf8090484826dc0e43bb39324557"/></dir><dir name="controllers"><file name="WidgetController.php" hash="ca23d690e09435f5f4df54c539dea74b"/></dir><dir name="etc"><file name="config.xml" hash="47b67abbe18e357dfd7f1f3c78937f8b"/></dir><dir name="sql"><dir name="anattadesign_abandonedcarts_setup"><file name="mysql4-install-1.0.0.php" hash="b235486189e6609d4f9abc82ffae76c7"/><file name="mysql4-upgrade-1.0.0-1.0.1.php" hash="f9f7cbb6845f014f74c294692189c369"/><file name="mysql4-upgrade-1.0.1-1.1.0.php" hash="f9f7cbb6845f014f74c294692189c369"/></dir></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="anattadesign_abandonedcarts.xml" hash="c14481626a0c367d974a5660ed930482"/></dir><dir name="template"><dir name="anattadesign"><dir name="abandonedcarts"><file name="widget.phtml" hash="ce297c658f6c8edeb8b7f1ff609d28f9"/></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="AnattaDesign_AbandonedCarts.xml" hash="fba54c1c1c7b2abd323a56bcdd56be20"/></dir></target><target name="mage"><dir name="js"><dir name="anattadesign"><dir name="abandonedcarts"><file name="adminhack.js" hash="d8d1b081040d1dbbe87296e4ed064a91"/><file name="zepto.js" hash="61e66962daedd0943adc35a97b0eaa27"/></dir></dir></dir></target><target name="mageskin"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="anattadesign"><dir name="abandonedcarts"><dir><dir name="css"><file name="style.css" hash="91b410a9fc1a5ff1e20e7c321fd64e23"/></dir><dir name="images"><file name="bt-rep.gif" hash="f2054c34f7d04f81082ef2d686464c5f"/><file name="powerdby.jpg" hash="82777ae659f9316a27dbf7e14e23a5e2"/><file name="table-step-img-arrow.jpg" hash="ea678306e6a71818565e09c771bec7a5"/><file name="table-step-img-last-arrow.jpg" hash="88b14ae05fd2105ba317025925a39880"/><file name="table-step-img.jpg" hash="4bcb56e9e828981d0c1654925848791e"/></dir></dir></dir></dir></dir></dir></dir></target></contents>
20
  <compatible/>
21
+ <dependencies><required><php><min>5.2.0</min><max>6.0.0</max></php></required></dependencies>
22
  </package>
skin/adminhtml/default/default/anattadesign/abandonedcarts/css/images/ar-lt.jpg DELETED
Binary file
skin/adminhtml/default/default/anattadesign/abandonedcarts/css/images/ar-rt.jpg DELETED
Binary file
skin/adminhtml/default/default/anattadesign/abandonedcarts/css/images/logo.jpg DELETED
Binary file
skin/adminhtml/default/default/anattadesign/abandonedcarts/css/images/notifications-btm.gif DELETED
Binary file
skin/adminhtml/default/default/anattadesign/abandonedcarts/css/images/notifications.gif DELETED
Binary file
skin/adminhtml/default/default/anattadesign/abandonedcarts/css/style.css CHANGED
@@ -1,46 +1,136 @@
1
- /* Abandoned Cart - styles */
2
- #ac-wrapper{ width: 372px; overflow: hidden; position: relative; left: -7px; }
3
- #ac-wrapper .left{ float: left;}
4
- #ac-wrapper .right{ float: right;}
5
-
6
- /* header */
7
- #ac-header{ height: 35px; border-bottom: 1px solid #cccccc; overflow:hidden; font-family:"Exo"; font-size: 16px; font-weight: 600; padding: 10px 0 0 0; }
8
-
9
- #cal-widget { width: auto;}
10
- #cal-widget a{ width: 11px; height: 17px; display: block; margin: 2px 2px 0px 2px; }
11
- #cal-widget span{ display: block; float: left;}
12
- #cal-widget a.previous-month {background: url(images/ar-lt.jpg) no-repeat; float: left}
13
- #cal-widget a.next-month{ background: url(images/ar-rt.jpg) no-repeat; float: right;}
14
-
15
- /* content */
16
- #ac-content { overflow:hidden;}
17
- #ac-content ul{ list-style: none; padding: 5px 0 0 0; margin: 0; font-family: "Ubuntu"; width: 217px; float: left;}
18
- #ac-content ul li{ clear: both; padding-top: 5px;}
19
-
20
- .ac-steps{ font-size: 12px; color: #4d4d4d; width:70px; line-height: 16px; padding-top: 10px;}
21
- .ac-steps span{ color: #b3b3b3;}
22
-
23
- .ac-graph{ width: 100px; font-size: 10px;}
24
- .ac-graph .ac-usr-in{ margin: 0px auto; background: #ff9200; height: 48px; border-radius: 3px;-moz-border-radius: 3px;-webkit-border-radius: 3px; position: relative;}
25
- .ac-graph .ac-usr-out {background: #000; position: absolute; bottom: 0px; width: 100%; }
26
- .ac-stats { color: #0071bc; font-size: 12px; padding: 45px 0 0 0; position: relative; }
27
- .ac-stats div { position: absolute; left: 0; bottom: 0; }
28
-
29
- /* sidebar */
30
- #ac-sidebar { float: right; width: 154px; }
31
- #ac-sidebar .ac-notif { background: url(images/notifications.gif) no-repeat; margin :15px 0 20px 0;}
32
- #ac-sidebar .ac-notif div{background: url(images/notifications-btm.gif) left bottom no-repeat; width: 118px; min-height: 110px; padding: 21px 25px 20px 15px; }
33
-
34
- .ac-side-content,.ac-notif { font-family: "Ubuntu"; color: #000000; font-size: 10px;}
35
- .ac-notif a{ color: #0071bc;}
36
- .ac-notif a:hover{ text-decoration: none;}
37
- .ac-notif big{ text-transform: uppercase;}
38
- .ac-notif p{ padding: 15px 0; margin: 0;}
39
-
40
- .ac-side-content {}
41
- .ac-side-content p{ padding: 3px 0 10px 0; margin: 0;}
42
- .ac-side-content big{ font-size: 20px;font-family: "Ubuntu"; font-weight: 500;}
43
- .ac-side-content p.btm{ font-size: 11px; text-transform: uppercase; padding: 37px 0 15px 0 ;}
44
- .ac-side-content big.btm{ font-size: 36px;}
45
-
46
- .out-of-data { width: 90%; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @charset "utf-8";
2
+ /* CSS Document */
3
+
4
+ @font-face {
5
+ font-family: 'Conv_Helvetica';
6
+ src: url('../fonts/Helvetica.eot');
7
+ src: local('☺'), url('../fonts/Helvetica.woff') format('woff'), url('../fonts/Helvetica.ttf') format('truetype'), url('../fonts/Helvetica.svg') format('svg');
8
+ font-weight: normal;
9
+ font-style: normal;
10
+ }
11
+ .abwidget {
12
+ width:98%;
13
+ margin:20px auto;
14
+ font-family: 'Helvetica', arial;
15
+ }
16
+ .abwidget .widget-title {
17
+ background:#cf7e3e;
18
+ border:2px solid #c36449;
19
+ padding:8px 10px;
20
+ font-size:12px;
21
+ font-weight:normal;
22
+ color:#fff;
23
+ margin:0px;
24
+ position:relative;
25
+ }
26
+ .abwidget .widget-title a {
27
+ color:#fff;
28
+ text-decoration:underline;
29
+ display:inline-block !important;
30
+ }
31
+ .abwidget .widget-title a:hover {
32
+ text-decoration:none;
33
+ }
34
+ .abwidget .widget-title a.myab {
35
+ background:url(../images/powerdby.jpg) no-repeat 0 0;
36
+ position:absolute;
37
+ width:151px;
38
+ height:15px;
39
+ right:2px;
40
+ top:9px;
41
+ }
42
+ .abwidget .widget-content {
43
+ position:relative;
44
+ border:1px solid #343434;
45
+ border-top:none;
46
+ padding-top:75px;
47
+ }
48
+ .widget-content .checkout-info {
49
+ position:absolute;
50
+ width:70px;
51
+ text-transform:uppercase;
52
+ font-size:11px;
53
+ font-weight:bold;
54
+ color:#000;
55
+ text-align:center;
56
+ top:16px;
57
+ }
58
+ .widget-content .checkout-info small {
59
+ color:#cf7e3e;
60
+ display:block;
61
+ font-size:11px;
62
+ font-weight:bold;
63
+ }
64
+ .widget-content .item-1 {
65
+ right:290px;
66
+ }
67
+ .widget-content .item-2 {
68
+ right:190px;
69
+ }
70
+ .widget-content .item-3 {
71
+ right:30px;
72
+ width:130px;
73
+ text-align:left;
74
+ }
75
+ .widget-content .item-3 big {
76
+ font-size:36px;
77
+ font-weight:bold;
78
+ display:block;
79
+ line-height:30px;
80
+ }
81
+ .widget-content .graph-table {
82
+ vertical-align:bottom;
83
+ margin-top:20px;
84
+ }
85
+ .widget-content .graph-table table {
86
+ vertical-align:baseline;
87
+ }
88
+ .graph-table table td {
89
+ height:150px;
90
+ text-align:center;
91
+ vertical-align:bottom;
92
+ padding:0 5px;
93
+ width:1%;
94
+ }
95
+ .graph-table .number {
96
+ font-size:13px;
97
+ color:#cf7e3e;
98
+ }
99
+ .graph-table .graph {
100
+ background:#ebd5b7;
101
+ border:2px solid #c36449;
102
+ border-bottom:none;
103
+ margin:-2px 0 0 0
104
+ }
105
+ .graph-table .graph span.color {
106
+ background:#333;
107
+ display:block;
108
+ color:#fff;
109
+ text-align:center;
110
+ font-size:12px;
111
+ position:relative;
112
+ }
113
+ .graph-table .graph .value{ position:relative; display:block; color:#000; margin:0; text-align:center; top:-20px; font-size:12px;}
114
+
115
+ .graph-table .steps {
116
+ padding-right:4%;
117
+ border-right:1px solid #343434;
118
+ }
119
+ .graph-table .steps td {
120
+ background:#eaefef;
121
+ vertical-align:middle;
122
+ height:48px;
123
+ border-top:1px solid #343434;
124
+ text-align:center;
125
+ }
126
+ .graph-table .steps td.arrow {
127
+ background:url(../images/table-step-img-arrow.jpg) no-repeat center 0 #eaefef;
128
+ padding: 0;
129
+ }
130
+ .graph-table .steps span {
131
+ padding:0px 0 0 2px;
132
+ font-size:10px;
133
+ }
134
+ .graph-table .steps td.last-child {
135
+ background:url(../images/table-step-img-last-arrow.jpg) no-repeat left 0 #fff;
136
+ }
skin/adminhtml/default/default/anattadesign/abandonedcarts/images/bt-rep.gif ADDED
Binary file
skin/adminhtml/default/default/anattadesign/abandonedcarts/images/powerdby.jpg ADDED
Binary file
skin/adminhtml/default/default/anattadesign/abandonedcarts/images/table-step-img-arrow.jpg ADDED
Binary file
skin/adminhtml/default/default/anattadesign/abandonedcarts/images/table-step-img-last-arrow.jpg ADDED
Binary file
skin/adminhtml/default/default/anattadesign/abandonedcarts/images/table-step-img.jpg ADDED
Binary file