PageRenderTime 47ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/x2engine/protected/migrations/5.0b/1416863327-migrate-reports.php

https://gitlab.com/e0/X2CRM
PHP | 315 lines | 248 code | 26 blank | 41 comment | 41 complexity | 2121e68fdbe4f56c4f36cb0b2ff3f529 MD5 | raw file
  1. <?php
  2. /***********************************************************************************
  3. * X2CRM is a customer relationship management program developed by
  4. * X2Engine, Inc. Copyright (C) 2011-2016 X2Engine Inc.
  5. *
  6. * This program is free software; you can redistribute it and/or modify it under
  7. * the terms of the GNU Affero General Public License version 3 as published by the
  8. * Free Software Foundation with the addition of the following permission added
  9. * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
  10. * IN WHICH THE COPYRIGHT IS OWNED BY X2ENGINE, X2ENGINE DISCLAIMS THE WARRANTY
  11. * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
  12. *
  13. * This program is distributed in the hope that it will be useful, but WITHOUT
  14. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  15. * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
  16. * details.
  17. *
  18. * You should have received a copy of the GNU Affero General Public License along with
  19. * this program; if not, see http://www.gnu.org/licenses or write to the Free
  20. * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  21. * 02110-1301 USA.
  22. *
  23. * You can contact X2Engine, Inc. P.O. Box 66752, Scotts Valley,
  24. * California 95067, USA. on our website at www.x2crm.com, or at our
  25. * email address: contact@x2engine.com.
  26. *
  27. * The interactive user interfaces in modified source and object code versions
  28. * of this program must display Appropriate Legal Notices, as required under
  29. * Section 5 of the GNU Affero General Public License version 3.
  30. *
  31. * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
  32. * these Appropriate Legal Notices must retain the display of the "Powered by
  33. * X2Engine" logo. If the display of the logo is not reasonably feasible for
  34. * technical reasons, the Appropriate Legal Notices must display the words
  35. * "Powered by X2Engine".
  36. **********************************************************************************/
  37. /* @edition:pro */
  38. /**
  39. * Convert pre-5.0 reports in x2_reports to post-5.0 reports in x2_reports_2
  40. */
  41. $migrateReports = function () {
  42. // range parsing function copied from 4.3
  43. $parseDateRange = function ($range) {
  44. $dateRange = array ();
  45. switch ($range) {
  46. case 'thisWeek':
  47. $dateRange['start'] = strtotime('mon this week'); // first of this month
  48. $dateRange['end'] = time(); // now
  49. break;
  50. case 'thisMonth':
  51. $dateRange['start'] = mktime(0, 0, 0, date('n'), 1); // first of this month
  52. $dateRange['end'] = time(); // now
  53. break;
  54. case 'lastWeek':
  55. $dateRange['start'] = strtotime('mon last week'); // first of last month
  56. $dateRange['end'] = strtotime('mon this week') - 1; // first of this month
  57. break;
  58. case 'lastMonth':
  59. $dateRange['start'] = mktime(0, 0, 0, date('n') - 1, 1); // first of last month
  60. $dateRange['end'] = mktime(0, 0, 0, date('n'), 1) - 1; // first of this month
  61. break;
  62. case 'thisYear':
  63. $dateRange['start'] = mktime(0, 0, 0, 1, 1); // first of the year
  64. $dateRange['end'] = time(); // now
  65. break;
  66. case 'lastYear':
  67. $dateRange['start'] = mktime(0, 0, 0, 1, 1, date('Y') - 1); // first of last year
  68. $dateRange['end'] = mktime(0, 0, 0, 1, 1, date('Y')) - 1; // first of this year
  69. break;
  70. case 'all':
  71. $dateRange['start'] = 0; // every record
  72. $dateRange['end'] = time();
  73. break;
  74. default:
  75. return false;
  76. }
  77. return $dateRange;
  78. };
  79. $reports = Yii::app()->db->createCommand ("
  80. select *
  81. from x2_reports
  82. ")->queryAll ();
  83. foreach ($reports as $rep) {
  84. print_r ($rep);
  85. if (!in_array ($rep['type'], array ('grid', 'deal'), 1)) {
  86. print_r ('invalid type');
  87. continue;
  88. }
  89. if ($rep['type'] === 'grid') {
  90. $settings = array ();
  91. $parameters = json_decode ($rep['parameters'], true);
  92. if (!empty ($parameters['module'])) {
  93. $settings['primaryModelType'] = ucfirst ($parameters['module']);
  94. } else {
  95. $settings['primaryModelType'] = 'Contacts';
  96. }
  97. if (!empty ($rep['field1'])) {
  98. $settings['rowField'] = $rep['field1'];
  99. } else {
  100. print_r ('invalid field1'."\n");
  101. continue; // invalid saved report
  102. }
  103. if (!empty ($rep['field2'])) {
  104. $settings['columnField'] = $rep['field2'];
  105. } else {
  106. print_r ('invalid field2'."\n");
  107. continue; // invalid saved report
  108. }
  109. if (!empty ($rep['cellType'])) {
  110. $settings['cellDataType'] = $rep['cellType'];
  111. } else {
  112. $settings['cellDataType'] = 'count';
  113. }
  114. if ($settings['cellDataType'] !== 'count') {
  115. if (!empty ($rep['cellData'])) {
  116. $settings['cellDataField'] = $rep['cellData'];
  117. } else {
  118. print_r ('invalid cellData'."\n");
  119. continue; // invalid saved report
  120. }
  121. }
  122. if (empty ($rep['dateRange'])) {
  123. print_r ('invalid dateRange'."\n");
  124. continue; // invalid saved report
  125. } else if ($rep['dateRange'] === 'custom') {
  126. if (empty ($rep['start']) || empty ($rep['end'])) {
  127. print_r ('invalid start or end'."\n");
  128. continue; // invalid saved report
  129. }
  130. $start = $rep['start'];
  131. $end = $rep['end'];
  132. } else { // $rep['dateRange'] !== 'custom'
  133. $dateRange = $parseDateRange ($rep['dateRange']);
  134. if (!$dateRange) {
  135. print_r ('invalid date range'."\n");
  136. continue; // invalid saved report
  137. }
  138. $start = $dateRange['start'];
  139. $end = $dateRange['end'];
  140. }
  141. $settings['allFilters'] = array (
  142. array (
  143. 'name' => 'createDate',
  144. 'operator' => '>=',
  145. 'value' => $start,
  146. ),
  147. array (
  148. 'name' => 'createDate',
  149. 'operator' => '<=',
  150. 'value' => $end,
  151. ),
  152. );
  153. Yii::app()->db->createCommand ("
  154. INSERT INTO x2_reports_2
  155. (`createDate`, `createdBy`, `name`, `settings`, `version`, `type`)
  156. VALUES (
  157. :createDate, :createdBy, :name, :settings, :version, :type)
  158. ")->execute (array (
  159. ':createDate' => $rep['createDate'],
  160. ':createdBy' => $rep['createdBy'],
  161. ':name' => preg_replace ('/s$/', '', $settings['primaryModelType']).' Grid',
  162. ':settings' => json_encode ($settings),
  163. ':version' => '5.0',
  164. ':type' => 'grid',
  165. ));
  166. } else { // $rep['type'] === 'deal'
  167. $settings = array ();
  168. $parameters = json_decode ($rep['parameters'], true);
  169. if (!empty ($parameters['model'])) {
  170. if (!preg_match ('/opportunity|contacts|accounts/i', $parameters['model'])) {
  171. print_r ('invalid model'."\n");
  172. continue;
  173. }
  174. $settings['primaryModelType'] = ucfirst ($parameters['model']);
  175. } else {
  176. $settings['primaryModelType'] = 'Contacts';
  177. }
  178. if (empty ($rep['dateRange'])) {
  179. print_r ('invalid date range'."\n");
  180. continue; // invalid saved report
  181. } else if ($rep['dateRange'] === 'custom') {
  182. if (empty ($rep['start']) || empty ($rep['end'])) {
  183. print_r ('invalid start or end'."\n");
  184. continue; // invalid saved report
  185. }
  186. $start = $rep['start'];
  187. $end = $rep['end'];
  188. } else { // $rep['dateRange'] !== 'custom'
  189. $dateRange = $parseDateRange ($rep['dateRange']);
  190. if (!$dateRange) {
  191. print_r ('invalid dateRange'."\n");
  192. continue; // invalid saved report
  193. }
  194. $start = $dateRange['start'];
  195. $end = $dateRange['end'];
  196. }
  197. if (in_array ($settings['primaryModelType'], array ('Contacts', 'Accounts'), 1)) {
  198. $settings['allFilters'] = array (
  199. array (
  200. 'name' => 'closedate',
  201. 'operator' => '>=',
  202. 'value' => $start,
  203. ),
  204. array (
  205. 'name' => 'closedate',
  206. 'operator' => '<=',
  207. 'value' => $end,
  208. ),
  209. );
  210. } else { // $settings['primaryModelType'] === 'Opportunity'
  211. $settings['allFilters'] = array (
  212. array (
  213. 'name' => 'expectedCloseDate',
  214. 'operator' => '>=',
  215. 'value' => $start,
  216. ),
  217. array (
  218. 'name' => 'expectedCloseDate',
  219. 'operator' => '<=',
  220. 'value' => $end,
  221. ),
  222. );
  223. }
  224. if (!empty ($parameters['strict']) && $parameters['strict']) {
  225. $settings['allFilters'] = array_merge ($settings['allFilters'], array (
  226. array (
  227. 'name' => 'createDate',
  228. 'operator' => '>=',
  229. 'value' => $start,
  230. ),
  231. array (
  232. 'name' => 'createDate',
  233. 'operator' => '<=',
  234. 'value' => $end,
  235. ),
  236. ));
  237. }
  238. if ($settings['primaryModelType'] === 'Contacts') {
  239. $columns = array (
  240. "name","assignedTo","company","leadscore","closedate","dealvalue","dealstatus",
  241. "rating","lastUpdated");
  242. } elseif ($settings['primaryModelType'] === 'Accounts') {
  243. $columns = array (
  244. "name", "createDate", "assignedTo", "type", "employees", "annualRevenue",
  245. "website", "lastUpdated"
  246. );
  247. } else { // $settings['primaryModelType'] === 'Opportunitiy'
  248. $columns = array (
  249. "name", "assignedTo", "accountName", "quoteAmount", "expectedCloseDate",
  250. "probability", "salesStage", "leadSource", "lastUpdated"
  251. );
  252. }
  253. $settings['columns'] = $columns;
  254. if (isset ($parameters[$settings['primaryModelType']])) {
  255. $attributes = $parameters[$settings['primaryModelType']];
  256. if (is_array ($attributes)) {
  257. foreach ($attributes as $name => $val) {
  258. if (!empty ($val)) {
  259. $settings['allFilters'][] = array (
  260. 'name' => $name,
  261. 'operator' => '=',
  262. 'value' => $val,
  263. );
  264. }
  265. }
  266. }
  267. }
  268. Yii::app()->db->createCommand ("
  269. INSERT INTO x2_reports_2 (
  270. `createDate`, `createdBy`, `name`, `settings`, `version`, `type`)
  271. VALUES (
  272. :createDate, :createdBy, :name, :settings, :version, :type)
  273. ")->execute (array (
  274. ':createDate' => $rep['createDate'],
  275. ':createdBy' => $rep['createdBy'],
  276. ':name' => preg_replace ('/s$/', '', $settings['primaryModelType']).' Deals',
  277. ':settings' => json_encode ($settings),
  278. ':version' => '5.0',
  279. ':type' => 'rowsAndColumns',
  280. ));
  281. }
  282. print ('insert');
  283. }
  284. // insert default reports
  285. Yii::app()->db->createCommand ("
  286. INSERT INTO `x2_reports_2` (`id`, `createdBy`, `lastUpdated`, `name`, `settings`, `version`, `type`) VALUES (1, 'admin',1414093271,'Services Report','{\"columns\":[\"name\",\"impact\",\"status\",\"assignedTo\",\"lastUpdated\",\"updatedBy\"],\"orderBy\":[],\"primaryModelType\":\"Services\",\"allFilters\":[],\"anyFilters\":[],\"export\":false,\"print\":false,\"email\":false}','4.3','rowsAndColumns'),(2, 'admin',1414093762,'Deal Report','{\"columns\":[\"name\",\"assignedTo\",\"company\",\"leadscore\",\"closedate\",\"dealvalue\",\"dealstatus\",\"rating\",\"lastUpdated\"],\"orderBy\":[],\"primaryModelType\":\"Contacts\",\"allFilters\":[],\"anyFilters\":[],\"export\":false,\"print\":false,\"email\":false}','5.0','rowsAndColumns');")->execute ();
  287. };
  288. $migrateReports ();
  289. ?>