/admin/model/report/sale.php

https://github.com/zenner3000/shop · PHP · 441 lines · 345 code · 93 blank · 3 comment · 53 complexity · 8d58cae774c86ac16fab6ae07315ade6 MD5 · raw file

  1. <?php
  2. class ModelReportSale extends Model {
  3. // Sales
  4. public function getTotalSales($data = array()) {
  5. $sql = "SELECT SUM(total) AS total FROM `" . DB_PREFIX . "order` WHERE order_status_id > '0'";
  6. if (!empty($data['filter_date_added'])) {
  7. $sql .= " AND DATE(date_added) = DATE('" . $this->db->escape($data['filter_date_added']) . "')";
  8. }
  9. $query = $this->db->query($sql);
  10. return $query->row['total'];
  11. }
  12. // Map
  13. public function getTotalOrdersByCountry() {
  14. $query = $this->db->query("SELECT COUNT(*) AS total, SUM(o.total) AS amount, c.iso_code_2 FROM `" . DB_PREFIX . "order` o LEFT JOIN `" . DB_PREFIX . "country` c ON (o.payment_country_id = c.country_id) WHERE o.order_status_id > '0' GROUP BY o.payment_country_id");
  15. return $query->rows;
  16. }
  17. // Orders
  18. public function getTotalOrdersByDay() {
  19. $implode = array();
  20. foreach ($this->config->get('config_complete_status') as $order_status_id) {
  21. $implode[] = "'" . (int)$order_status_id . "'";
  22. }
  23. $order_data = array();
  24. for ($i = 0; $i < 24; $i++) {
  25. $order_data[$i] = array(
  26. 'hour' => $i,
  27. 'total' => 0
  28. );
  29. }
  30. $query = $this->db->query("SELECT COUNT(*) AS total, HOUR(date_added) AS hour FROM `" . DB_PREFIX . "order` WHERE order_status_id IN(" . implode(",", $implode) . ") AND DATE(date_added) = DATE(NOW()) GROUP BY HOUR(date_added) ORDER BY date_added ASC");
  31. foreach ($query->rows as $result) {
  32. $order_data[$result['hour']] = array(
  33. 'hour' => $result['hour'],
  34. 'total' => $result['total']
  35. );
  36. }
  37. return $order_data;
  38. }
  39. public function getTotalOrdersByWeek() {
  40. $implode = array();
  41. foreach ($this->config->get('config_complete_status') as $order_status_id) {
  42. $implode[] = "'" . (int)$order_status_id . "'";
  43. }
  44. $order_data = array();
  45. $date_start = strtotime('-' . date('w') . ' days');
  46. for ($i = 0; $i < 7; $i++) {
  47. $date = date('Y-m-d', $date_start + ($i * 86400));
  48. $order_data[date('w', strtotime($date))] = array(
  49. 'day' => date('D', strtotime($date)),
  50. 'total' => 0
  51. );
  52. }
  53. $query = $this->db->query("SELECT COUNT(*) AS total, date_added FROM `" . DB_PREFIX . "order` WHERE order_status_id IN(" . implode(",", $implode) . ") AND DATE(date_added) >= DATE('" . $this->db->escape(date('Y-m-d', $date_start)) . "') GROUP BY DAYNAME(date_added)");
  54. foreach ($query->rows as $result) {
  55. $order_data[date('w', strtotime($result['date_added']))] = array(
  56. 'day' => date('D', strtotime($result['date_added'])),
  57. 'total' => $result['total']
  58. );
  59. }
  60. return $order_data;
  61. }
  62. public function getTotalOrdersByMonth() {
  63. $implode = array();
  64. foreach ($this->config->get('config_complete_status') as $order_status_id) {
  65. $implode[] = "'" . (int)$order_status_id . "'";
  66. }
  67. $order_data = array();
  68. for ($i = 1; $i <= date('t'); $i++) {
  69. $date = date('Y') . '-' . date('m') . '-' . $i;
  70. $order_data[date('j', strtotime($date))] = array(
  71. 'day' => date('d', strtotime($date)),
  72. 'total' => 0
  73. );
  74. }
  75. $query = $this->db->query("SELECT COUNT(*) AS total, date_added FROM `" . DB_PREFIX . "order` WHERE order_status_id IN(" . implode(",", $implode) . ") AND DATE(date_added) >= '" . $this->db->escape(date('Y') . '-' . date('m') . '-1') . "' GROUP BY DATE(date_added)");
  76. foreach ($query->rows as $result) {
  77. $order_data[date('j', strtotime($result['date_added']))] = array(
  78. 'day' => date('d', strtotime($result['date_added'])),
  79. 'total' => $result['total']
  80. );
  81. }
  82. return $order_data;
  83. }
  84. public function getTotalOrdersByYear() {
  85. $implode = array();
  86. foreach ($this->config->get('config_complete_status') as $order_status_id) {
  87. $implode[] = "'" . (int)$order_status_id . "'";
  88. }
  89. $order_data = array();
  90. for ($i = 1; $i <= 12; $i++) {
  91. $order_data[$i] = array(
  92. 'month' => date('M', mktime(0, 0, 0, $i)),
  93. 'total' => 0
  94. );
  95. }
  96. $query = $this->db->query("SELECT COUNT(*) AS total, date_added FROM `" . DB_PREFIX . "order` WHERE order_status_id IN(" . implode(",", $implode) . ") AND YEAR(date_added) = YEAR(NOW()) GROUP BY MONTH(date_added)");
  97. foreach ($query->rows as $result) {
  98. $order_data[date('n', strtotime($result['date_added']))] = array(
  99. 'month' => date('M', strtotime($result['date_added'])),
  100. 'total' => $result['total']
  101. );
  102. }
  103. return $order_data;
  104. }
  105. public function getOrders($data = array()) {
  106. $sql = "SELECT MIN(o.date_added) AS date_start, MAX(o.date_added) AS date_end, COUNT(*) AS `orders`, SUM((SELECT SUM(op.quantity) FROM `" . DB_PREFIX . "order_product` op WHERE op.order_id = o.order_id GROUP BY op.order_id)) AS products, SUM((SELECT SUM(ot.value) FROM `" . DB_PREFIX . "order_total` ot WHERE ot.order_id = o.order_id AND ot.code = 'tax' GROUP BY ot.order_id)) AS tax, SUM(o.total) AS `total` FROM `" . DB_PREFIX . "order` o";
  107. if (!empty($data['filter_order_status_id'])) {
  108. $sql .= " WHERE o.order_status_id = '" . (int)$data['filter_order_status_id'] . "'";
  109. } else {
  110. $sql .= " WHERE o.order_status_id > '0'";
  111. }
  112. if (!empty($data['filter_date_start'])) {
  113. $sql .= " AND DATE(o.date_added) >= '" . $this->db->escape($data['filter_date_start']) . "'";
  114. }
  115. if (!empty($data['filter_date_end'])) {
  116. $sql .= " AND DATE(o.date_added) <= '" . $this->db->escape($data['filter_date_end']) . "'";
  117. }
  118. if (!empty($data['filter_group'])) {
  119. $group = $data['filter_group'];
  120. } else {
  121. $group = 'week';
  122. }
  123. switch($group) {
  124. case 'day';
  125. $sql .= " GROUP BY YEAR(o.date_added), MONTH(o.date_added), DAY(o.date_added)";
  126. break;
  127. default:
  128. case 'week':
  129. $sql .= " GROUP BY YEAR(o.date_added), WEEK(o.date_added)";
  130. break;
  131. case 'month':
  132. $sql .= " GROUP BY YEAR(o.date_added), MONTH(o.date_added)";
  133. break;
  134. case 'year':
  135. $sql .= " GROUP BY YEAR(o.date_added)";
  136. break;
  137. }
  138. $sql .= " ORDER BY o.date_added DESC";
  139. if (isset($data['start']) || isset($data['limit'])) {
  140. if ($data['start'] < 0) {
  141. $data['start'] = 0;
  142. }
  143. if ($data['limit'] < 1) {
  144. $data['limit'] = 20;
  145. }
  146. $sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
  147. }
  148. $query = $this->db->query($sql);
  149. return $query->rows;
  150. }
  151. public function getTotalOrders($data = array()) {
  152. if (!empty($data['filter_group'])) {
  153. $group = $data['filter_group'];
  154. } else {
  155. $group = 'week';
  156. }
  157. switch($group) {
  158. case 'day';
  159. $sql = "SELECT COUNT(DISTINCT YEAR(date_added), MONTH(date_added), DAY(date_added)) AS total FROM `" . DB_PREFIX . "order`";
  160. break;
  161. default:
  162. case 'week':
  163. $sql = "SELECT COUNT(DISTINCT YEAR(date_added), WEEK(date_added)) AS total FROM `" . DB_PREFIX . "order`";
  164. break;
  165. case 'month':
  166. $sql = "SELECT COUNT(DISTINCT YEAR(date_added), MONTH(date_added)) AS total FROM `" . DB_PREFIX . "order`";
  167. break;
  168. case 'year':
  169. $sql = "SELECT COUNT(DISTINCT YEAR(date_added)) AS total FROM `" . DB_PREFIX . "order`";
  170. break;
  171. }
  172. if (!empty($data['filter_order_status_id'])) {
  173. $sql .= " WHERE order_status_id = '" . (int)$data['filter_order_status_id'] . "'";
  174. } else {
  175. $sql .= " WHERE order_status_id > '0'";
  176. }
  177. if (!empty($data['filter_date_start'])) {
  178. $sql .= " AND DATE(date_added) >= '" . $this->db->escape($data['filter_date_start']) . "'";
  179. }
  180. if (!empty($data['filter_date_end'])) {
  181. $sql .= " AND DATE(date_added) <= '" . $this->db->escape($data['filter_date_end']) . "'";
  182. }
  183. $query = $this->db->query($sql);
  184. return $query->row['total'];
  185. }
  186. public function getTaxes($data = array()) {
  187. $sql = "SELECT MIN(o.date_added) AS date_start, MAX(o.date_added) AS date_end, ot.title, SUM(ot.value) AS total, COUNT(o.order_id) AS `orders` FROM `" . DB_PREFIX . "order` o LEFT JOIN `" . DB_PREFIX . "order_total` ot ON (ot.order_id = o.order_id) WHERE ot.code = 'tax'";
  188. if (!empty($data['filter_order_status_id'])) {
  189. $sql .= " AND o.order_status_id = '" . (int)$data['filter_order_status_id'] . "'";
  190. } else {
  191. $sql .= " AND o.order_status_id > '0'";
  192. }
  193. if (!empty($data['filter_date_start'])) {
  194. $sql .= " AND DATE(o.date_added) >= '" . $this->db->escape($data['filter_date_start']) . "'";
  195. }
  196. if (!empty($data['filter_date_end'])) {
  197. $sql .= " AND DATE(o.date_added) <= '" . $this->db->escape($data['filter_date_end']) . "'";
  198. }
  199. if (!empty($data['filter_group'])) {
  200. $group = $data['filter_group'];
  201. } else {
  202. $group = 'week';
  203. }
  204. switch($group) {
  205. case 'day';
  206. $sql .= " GROUP BY YEAR(o.date_added), MONTH(o.date_added), DAY(o.date_added), ot.title";
  207. break;
  208. default:
  209. case 'week':
  210. $sql .= " GROUP BY YEAR(o.date_added), WEEK(o.date_added), ot.title";
  211. break;
  212. case 'month':
  213. $sql .= " GROUP BY YEAR(o.date_added), MONTH(o.date_added), ot.title";
  214. break;
  215. case 'year':
  216. $sql .= " GROUP BY YEAR(o.date_added), ot.title";
  217. break;
  218. }
  219. if (isset($data['start']) || isset($data['limit'])) {
  220. if ($data['start'] < 0) {
  221. $data['start'] = 0;
  222. }
  223. if ($data['limit'] < 1) {
  224. $data['limit'] = 20;
  225. }
  226. $sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
  227. }
  228. $query = $this->db->query($sql);
  229. return $query->rows;
  230. }
  231. public function getTotalTaxes($data = array()) {
  232. if (!empty($data['filter_group'])) {
  233. $group = $data['filter_group'];
  234. } else {
  235. $group = 'week';
  236. }
  237. switch($group) {
  238. case 'day';
  239. $sql = "SELECT COUNT(DISTINCT YEAR(o.date_added), MONTH(o.date_added), DAY(o.date_added), ot.title) AS total FROM `" . DB_PREFIX . "order` o";
  240. break;
  241. default:
  242. case 'week':
  243. $sql = "SELECT COUNT(DISTINCT YEAR(o.date_added), WEEK(o.date_added), ot.title) AS total FROM `" . DB_PREFIX . "order` o";
  244. break;
  245. case 'month':
  246. $sql = "SELECT COUNT(DISTINCT YEAR(o.date_added), MONTH(o.date_added), ot.title) AS total FROM `" . DB_PREFIX . "order` o";
  247. break;
  248. case 'year':
  249. $sql = "SELECT COUNT(DISTINCT YEAR(o.date_added), ot.title) AS total FROM `" . DB_PREFIX . "order` o";
  250. break;
  251. }
  252. $sql .= " LEFT JOIN `" . DB_PREFIX . "order_total` ot ON (o.order_id = ot.order_id) WHERE ot.code = 'tax'";
  253. if (!empty($data['filter_order_status_id'])) {
  254. $sql .= " AND o.order_status_id = '" . (int)$data['filter_order_status_id'] . "'";
  255. } else {
  256. $sql .= " AND o.order_status_id > '0'";
  257. }
  258. if (!empty($data['filter_date_start'])) {
  259. $sql .= " AND DATE(o.date_added) >= '" . $this->db->escape($data['filter_date_start']) . "'";
  260. }
  261. if (!empty($data['filter_date_end'])) {
  262. $sql .= " AND DATE(o.date_added) <= '" . $this->db->escape($data['filter_date_end']) . "'";
  263. }
  264. $query = $this->db->query($sql);
  265. return $query->row['total'];
  266. }
  267. public function getShipping($data = array()) {
  268. $sql = "SELECT MIN(o.date_added) AS date_start, MAX(o.date_added) AS date_end, ot.title, SUM(ot.value) AS total, COUNT(o.order_id) AS `orders` FROM `" . DB_PREFIX . "order` o LEFT JOIN `" . DB_PREFIX . "order_total` ot ON (o.order_id = ot.order_id) WHERE ot.code = 'shipping'";
  269. if (!empty($data['filter_order_status_id'])) {
  270. $sql .= " AND o.order_status_id = '" . (int)$data['filter_order_status_id'] . "'";
  271. } else {
  272. $sql .= " AND o.order_status_id > '0'";
  273. }
  274. if (!empty($data['filter_date_start'])) {
  275. $sql .= " AND DATE(o.date_added) >= '" . $this->db->escape($data['filter_date_start']) . "'";
  276. }
  277. if (!empty($data['filter_date_end'])) {
  278. $sql .= " AND DATE(o.date_added) <= '" . $this->db->escape($data['filter_date_end']) . "'";
  279. }
  280. if (!empty($data['filter_group'])) {
  281. $group = $data['filter_group'];
  282. } else {
  283. $group = 'week';
  284. }
  285. switch($group) {
  286. case 'day';
  287. $sql .= " GROUP BY YEAR(o.date_added), MONTH(o.date_added), DAY(o.date_added), ot.title";
  288. break;
  289. default:
  290. case 'week':
  291. $sql .= " GROUP BY YEAR(o.date_added), WEEK(o.date_added), ot.title";
  292. break;
  293. case 'month':
  294. $sql .= " GROUP BY YEAR(o.date_added), MONTH(o.date_added), ot.title";
  295. break;
  296. case 'year':
  297. $sql .= " GROUP BY YEAR(o.date_added), ot.title";
  298. break;
  299. }
  300. if (isset($data['start']) || isset($data['limit'])) {
  301. if ($data['start'] < 0) {
  302. $data['start'] = 0;
  303. }
  304. if ($data['limit'] < 1) {
  305. $data['limit'] = 20;
  306. }
  307. $sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
  308. }
  309. $query = $this->db->query($sql);
  310. return $query->rows;
  311. }
  312. public function getTotalShipping($data = array()) {
  313. if (!empty($data['filter_group'])) {
  314. $group = $data['filter_group'];
  315. } else {
  316. $group = 'week';
  317. }
  318. switch($group) {
  319. case 'day';
  320. $sql = "SELECT COUNT(DISTINCT YEAR(o.date_added), MONTH(o.date_added), DAY(o.date_added), ot.title) AS total FROM `" . DB_PREFIX . "order` o";
  321. break;
  322. default:
  323. case 'week':
  324. $sql = "SELECT COUNT(DISTINCT YEAR(o.date_added), WEEK(o.date_added), ot.title) AS total FROM `" . DB_PREFIX . "order` o";
  325. break;
  326. case 'month':
  327. $sql = "SELECT COUNT(DISTINCT YEAR(o.date_added), MONTH(o.date_added), ot.title) AS total FROM `" . DB_PREFIX . "order` o";
  328. break;
  329. case 'year':
  330. $sql = "SELECT COUNT(DISTINCT YEAR(o.date_added), ot.title) AS total FROM `" . DB_PREFIX . "order` o";
  331. break;
  332. }
  333. $sql .= " LEFT JOIN `" . DB_PREFIX . "order_total` ot ON (o.order_id = ot.order_id) WHERE ot.code = 'shipping'";
  334. if (!empty($data['filter_order_status_id'])) {
  335. $sql .= " AND order_status_id = '" . (int)$data['filter_order_status_id'] . "'";
  336. } else {
  337. $sql .= " AND order_status_id > '0'";
  338. }
  339. if (!empty($data['filter_date_start'])) {
  340. $sql .= " AND DATE(o.date_added) >= '" . $this->db->escape($data['filter_date_start']) . "'";
  341. }
  342. if (!empty($data['filter_date_end'])) {
  343. $sql .= " AND DATE(o.date_added) <= '" . $this->db->escape($data['filter_date_end']) . "'";
  344. }
  345. $query = $this->db->query($sql);
  346. return $query->row['total'];
  347. }
  348. }